dsh-rollback-visual:DeepSeek Harness 的 /rollback 會話回滾插件(已廢棄)

前言

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 / 幻方無官方從屬關係。

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

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

小夜