前言¶
在 DSH 裏讓 agent 改代碼,常見流程是:發一條指令,等它改完文件、跑完工具,發現方向不對,再發「撤銷剛纔的改動」或手動 git checkout。對話側則要新開會話,或自己在歷史裏找分叉點。文件狀態和聊天記錄是兩條線,很難精確回到「發那條消息之前」的整體狀態。
dsh-recall-plugin 在每條用戶消息旁提供「↶ 撤回」按鈕:確認後,工作區文件與對話歷史一起回退到該消息發出之前。快照走獨立影子 git 倉庫,不碰項目自身的 git 分支與暫存區。
這是什麼¶
- 插件名稱:
dsh-recall-plugin(npm 包名同名) - 維護者:limbo947
- 分類:客戶端(DSH web profile)
- 當前版本:1.7.1(MIT 許可證)
- GitHub:limbo947/dsh-recall-plugin(約 25 stars)
- 目錄頁:SkillHub 插件頁
一句話定位:在用戶消息氣泡旁加撤回入口,把項目文件(影子 git 快照)與對話歷史(DSH 官方 sessions.fork)一併回退到該消息發送之前。
核心功能¶
文件 + 對話整段回退¶
每條用戶消息發送時(agent 動文件之前),工作區被快照進獨立影子 git 倉庫。點「↶ 撤回」後,先彈出確認面板,列出將變更的文件(修改 / 恢復 / 刪除),確認後才執行。文件恢復到該消息發送前的狀態;視圖切到新會話(該消息及之後的對話移除),原會話歸檔、可隨時找回。
撤回後默認會把消息文本回填到輸入框,方便修改後重發;可在設置卡片關閉。
不碰項目自身的 git¶
快照存在 $DSH_HOME 下的影子倉庫裏,默認路徑爲 dsh-recall-snapshots/<SHA256(項目絕對路徑)>/。.git、node_modules 自動排除;項目的分支、暫存區、未提交改動不受影響。快照走 git delta 壓縮,是增量而非整目錄拷貝;超過 100MB 的大文件自動跳過,閾值可在設置卡片修改。
當 home 不可寫(如指到只讀盤)時,會降級到項目內 .dsh-recall-snapshots,頁面會提示;home 恢復後可自動遷走並清理。
可以反覆後悔¶
只要會話還在(含歸檔),快照全量保留、不修剪。撤回一次後還能再撤到更早;撤回時被覆蓋的文件也可找回。會話被徹底刪除後,其快照會在下一次維護時自動清理;歸檔不算刪除。
故障提示與自愈(1.7.0+)¶
快照失敗、跳過路徑、連續失敗熔斷會在頁面頂部 toast 提示(同類故障 10 分鐘只提示一次);失敗原因可在設置卡片「最近錯誤」查看。快照失敗後會自動清理殘骸對象;連續 3 次失敗起指數退避熔斷,冷卻後自動重試。嵌入式 git 倉庫、無讀權限等無法索引的路徑會跳過,不再導致整條快照失敗;撤回時既不恢復也不刪除這些路徑。
快照維護¶
- 定期 gc:每 50 條快照或距上次 gc 24 小時(先到先觸發),後臺執行
git gc。閾值可在設置卡片修改,或用環境變量DSH_RECALL_GC_SNAPS、DSH_RECALL_GC_HOURS覆蓋。 - 排除表:設置 → 插件配置 → 撤回插件,或直接編輯
$DSH_HOME/dsh-recall-snapshots/exclude.txt(未設置$DSH_HOME時爲~/.dsh/dsh-recall-snapshots/exclude.txt),一行一條 gitignore 風格 pattern。 - 樹形快照管理:設置頁按工作區 → 會話 → 快照三級展示,支持展開/摺疊與分級刪除。
安裝與啓用¶
前置:git CLI(未安裝時撤回按鈕不出現,頁面頂部會提示);Windows 需 PowerShell 5.1 / 7,Linux/macOS 需 bash + git;DSH 0.1.0-rc.x(peer 依賴見包內 peerDependencies,含 @deepseek-ai/dsh-session 等 ^0.1.1-rc.2)。Node.js >= 20。
下面用 DSH 官方插件命令安裝並掛載到 web profile:
dsh plugin --profile web add dsh-recall-plugin
也可從 GitHub 直接安裝(純 JS,無構建步驟):
dsh plugin --profile web add github:limbo947/dsh-recall-plugin
安裝後重啓 DSH 進程:
dsh web # 前臺直接啓動
pm2 restart <你的dsh進程名> # 若用 pm2 託管
驗證:重啓後硬刷新頁面(Ctrl+Shift+R),懸停插件啓用後發送的任意用戶消息——複製按鈕旁出現「↶」即生效。沒有按鈕時,常見原因是未重啓 DSH 進程,或 git CLI 不在 PATH 裏。
卸載:
dsh plugin --profile web remove dsh-recall-plugin
快照數據保留在 home 下 dsh-recall-snapshots/;想徹底清除可手動刪除該目錄。
典型用法¶
- 鼠標懸停任意插件啓用後發送的用戶消息,複製按鈕左側出現「↶ 撤回」。
- 點擊後,確認面板展示將變更的文件清單。
- 點「確認回退」→ 文件恢復、對話切到新會話,原會話歸檔保留。
想直接查看影子倉庫中的快照標籤:
git --git-dir="<store>\git\.git" tag -l
git --git-dir="<store>\git\.git" ls-tree -r --name-only snap-<消息ID>
其中 <store> 爲對應項目的快照存儲目錄。
適用場景與注意¶
適合誰:經常在 DSH 裏讓 agent 改代碼、需要精確回到某條指令之前整體狀態(文件 + 對話)的開發者。
已知限制(來自 README):
- 快照在消息發送時創建;插件啓用前的歷史消息沒有快照,不顯示撤回按鈕。
- 會話第一條用戶消息無法回退對話(僅文件回退),因爲 fork 需要更早的 turn 邊界。
- 工作區內嵌套的其他 git 倉庫(子目錄自帶
.git)無法索引,其餘部分照常快照,但嵌套倉庫內容不參與回退。 - Windows 真機驗證充分;Linux 已在 WSL2(Ubuntu 26.04)實測;macOS 腳本按 bash 3.2 兼容編寫,尚未真機實測。
安全提示:插件以當前 DSH 進程權限運行,會讀寫工作區文件並在 home 下維護影子倉庫。安裝前建議查看 GitHub 源碼 與 MIT 許可證;SkillHub 爲社區目錄站點,與 DeepSeek / 幻方無官方從屬關係。
結尾¶
dsh-recall-plugin 把「撤回一條消息」做成可確認、可反覆操作的整體回退:文件走影子 git,對話走官方 fork,兩者對齊到同一時間點。若你在 DSH 生態裏找客戶端側的撤回能力,可從目錄頁或 GitHub 安裝試用。
- 目錄頁:https://www.skillhub.cn/plugins/limbo947/dsh-recall-plugin
- GitHub:https://github.com/limbo947/dsh-recall-plugin