前言¶
DSH(DeepSeek Harness)的理念是「一切皆插件」。做智能體開發時常見這樣一個需求:會話聊了幾輪發現走偏了,希望回到之前某一輪重來,而不是整個會話作廢。QinLuza/dsh-rollback-visual 就是衝着這個需求做的 /rollback 插件倉庫:後端用 fork 子會話實現回滾,前端嘗試把回滾錨點可視化到軌跡視圖裏。
先說結論:這個倉庫已經廢棄,不要再用了。原因有兩個:一是對話回退方向,官方 DSH 已自帶 fork/分支功能,這裏屬於重複造輪子;二是前端可視化採用的 DOM 注入方案有根本問題,已放棄。倉庫現在僅作踩坑存檔保留,不再維護,替代項目是 QinLuza/dsh-file-undo。
下面按倉庫現狀介紹:後端三件套做了什麼、命令怎麼用、前端方案爲什麼被放棄,以及現在還能從裏面拿到什麼。
倉庫現狀¶
- 已廢棄,不再維護。package.json 中版本爲
0.0.1,private: true,許可證 MIT。 - 後端三件套實現的 fork 子會話回滾當時已可用,但方向被官方自帶功能覆蓋。
- 前端可視化(DOM 注入)已放棄。
- 保留內容:
docs/踩過的雷.md記錄了 10 個雷,供後續 DSH 插件開發避坑。
回滾是怎麼設計的¶
先交代模型:回滾 = 在會話事件日誌裏選一個邊界 seq,fork 出一個子會話。源會話歷史不變,子會話從邊界處開始新時間線;成功後在會話列表切到新子會話繼續,源會話保留原樣,可隨時切回。
具體分三塊。
checkpoint 錨點¶
每輪(turn)結束自動追加一條 rollback/checkpoint 事件,記錄 turn 號和邊界 seq。有了錨點,回退時按「第幾輪」選即可,不用記 seq。不想要錨點,配置 checkpoints: false 可以關掉。
fork 回滾與事務標記¶
回滾在邊界處派生子會話,源會話留下成對的 rollback/start → rollback/end 事務標記。標記成功、失敗都閉合,沒有懸空括號;全部落盤,可重放。
邊界驗證¶
非法邊界一律拒絕,包括五種情況:越界、落在 open turn 內、落在 compaction 區間內、agent 忙碌(busy)、信號中止(cancelled)。失敗時返回人類可讀原因:busy、boundary、cancelled、persistence。
安裝與加載¶
倉庫分兩部分,裝法不同。先說後端三件套:timeline-rollback / rollback-basic / command-rollback,源碼與構建配置不在本倉庫,在 QinLuza/deepseek-harness-research 的 feat/timeline-rollback 分支。加載方式:
1、在 profile 的 cordis.patch.yml 中 insert rollback-basic 與 command-rollback 兩條;
2、timeline-rollback 是 Service Definition,作爲依賴自動引入,不要單獨加載。
經過上面的步驟,後端三件套會隨 profile 加載。前端插件就是本倉庫,兩步:
pnpm build
dsh plugin --profile web add .
先用 pnpm build 構建,再用 dsh plugin 把當前目錄加進 web profile。
提醒:插件以當前 dsh 進程權限運行,安裝前應檢查源碼與許可證(本倉庫爲 MIT)。本倉庫已不再維護,以上僅作存檔記錄。
命令用法¶
在 GUI 輸入框輸入,或 CLI 環境執行:
| 命令 | 作用 |
|---|---|
/rollback |
顯示用法 + 當前會話所有 checkpoint 錨點列表 |
/rollback checkpoint |
回退到最近一個錨點 |
/rollback checkpoint:<turn> |
回退到指定 turn 的錨點 |
/rollback <seq> |
精確回退到指定事件 seq(高級用法,易錯) |
一個實際例子:
/rollback
→ turn 3 -> seq 47
→ turn 7 -> seq 120
/rollback checkpoint:3
→ Rolled back to seq 47 — new child session rollback-xxxx.
/rollback 先列出所有錨點;/rollback checkpoint:3 回到第 3 輪對應的邊界 seq 47,生成新的子會話 rollback-xxxx。
兩條約束要記住:
- 回滾只 fork 會話歷史,工作區 / 沙箱文件不會回退;
- 回滾必須在輪次之間進行:agent 空閒、邊界落在 turn 結束處。
前端可視化:爲什麼放棄¶
渲染層採用 MutationObserver 做 DOM 注入,這個方案有根本問題,已放棄,不再重構,完整踩坑記錄見 docs/踩過的雷.md。
數據層是寫對了的:src/client/anchors.ts 裏的 conversationEvents / conversationViews 定義可複用。路線圖中原計劃把渲染層重構爲軌跡原生節點,未完成。
適用場景與注意¶
- 實際需要回退對話:直接用官方 DSH 自帶的 fork/分支功能,不要裝這個倉庫;
- 需要撤銷 agent 的文件操作:用替代項目
QinLuza/dsh-file-undo,操作級回退,/undo恢復到操作前; - 想給 DSH 寫插件、尤其是要在前端注入 UI:先讀
docs/踩過的雷.md,10 個雷是現成的避坑材料; - 想研究 fork 回滾、事務標記、邊界驗證的實現:後端源碼在
QinLuza/deepseek-harness-research的feat/timeline-rollback分支。
注意本倉庫不再維護,不要在生產環境依賴它。
結尾¶
dsh-rollback-visual 的後端三件套驗證了 fork 子會話回滾可行,前端 DOM 注入則留下了一份反面教材。倉庫的使命已經結束,剩下的價值在踩坑記錄、可複用的數據層和替代項目。
- GitHub:https://github.com/QinLuza/dsh-rollback-visual
- 社區目錄頁:https://www.skillhub.cn/plugins/QinLuza/dsh-rollback-visual
社區目錄爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。