dsh-fork-edit:DeepSeek Harness 回合級對話編輯插件

前言

DeepSeek Harness (DSH) web 客戶端支持通過插件擴展功能。在開發或調試過程中,常常需要修改歷史對話中的用戶輸入。常見的做法是給消息編輯寫一套自定義事件(版本樹 + undo/redo),但自定義事件寫入 session log 後,歷史會話可能因事件白名單拒讀而無法冷加載。

dsh-fork-edit 採用了不同的策略:不寫入任何自定義事件。它通過在目標回合之前的閉合邊界處 fork 出新會話,將編輯後的文本作爲新會話裏的普通用戶回合執行。譜系關係只靠 parentSession header meta 記錄。這種方法保證了歷史會話永遠可讀,且編輯語義天然簡單。

核心功能

編輯

在任意一條已落定的歷史用戶消息上懸停,官方操作按鈕旁會出現 ✎ 圖標(對話進行中按鈕也會在數秒內自動出現,無需刷新或切換會話)。
點擊圖標後彈窗預填原輸入。輸入框內可直接粘貼圖片(持久化後作爲 image block 併入新消息),支持純圖片編輯。按 Enter 直接提交,Shift+Enter 換行。彈窗內帶會話 timeline,縱排列出所有已閉合的用戶回合(序號 + 單行預覽),點擊即可跳轉切換編輯目標。新分支自動以首條用戶輸入命名,各分支一眼可辨。

側邊欄分支分組

官方側邊欄是平鋪展示的,fork 出的後代擠在頂部難以辨認。本插件以 sessions.list 譜系爲權威,把根會話的全部後代分組渲染在根行下方。
視覺上採用單層級,配合視覺縮進和樹狀連接線(└ 形)。行識別基於 React fiber 的會話 id,標題只作降級兜底。根行(或根不可見時的組頭行)帶摺疊開關,摺疊狀態存 localStorage,隨會話切換智能展開。官方只渲染最近 N 個會話時,後代自動錨定到最近可見的祖先。

級聯歸檔

官方的「歸檔會話」只歸檔單個會話。本插件在 client 側對服務方法做級聯包裝:歸檔任一會話時,自動收集並歸檔其整棵後代子樹(部分失敗不靜默)。
注意:歸檔目前沒有官方 unarchive 入口,不可逆。

技術實現

編輯 = fork 出一個新會話,該會話將編輯後的文本作爲普通用戶回合執行。核心事務在源 Agent 的 runMaintenance() 縫隙內執行,失敗時逐項回滾,不產生半成品會話。
代碼邏輯如下:

inverses = []
child = agents.create({ seed: 目標回合之前的閉合邊界前綴, meta: { parentSession, seedLength, cwd, agentPreset } })
inverses.push(() => child.dispose())
workspace? → attachSession(childId)
await sessions.flush(child.session)     # 耐久性屏障
child.agent.followup(編輯後文本 || 原回合用戶輸入)   # 新會話自動執行
失敗 → recoverOperation(inverses.reverse())        # 無半成品殘留

安裝與啓用

插件需安裝在 ~/.dsh/profiles/web/package.json 中:

{
    "dependencies": {
        "dsh-fork-edit": "link:/path/to/dsh-fork-edit"
    }
    // 並在 bundles 數組加入 "dsh-fork-edit"
}

若同時裝有同類消息編輯插件(如 dsh-message-edit),請移除 —— 相同注入點會出雙按鈕。

HTTP API

Host 側通過 ctx.webServer.register 暴露路由,Client 以同源 fetch 調用。

請求 作用
GET /fork-edit?sessionId=… 已落定回合列表
POST /fork-edit { kind: "prefill", sessionId, turn? } 目標回合原文本
POST /fork-edit { sessionId, turn?, mode, text? } 執行分叉

mode 取值:edit-user(編輯用戶輸入)/ retry-turn(重試回合;0.9.0 起 UI 不再暴露,保留給純圖片回合等不便走編輯彈窗的調用方)。

版本 0.9.0 變更

0.9.0 起獨立的 ↻ 重試入口已裁掉:官方 turn 尾部的 branch 按鈕覆蓋「另開分支」場景,「重跑本回合」用編輯彈窗原樣保存即可(純圖片回合除外,見 HTTP API 的 retry-turn)。

短結尾

dsh-fork-edit 通過簡單的 fork 語義解決了消息編輯的歷史兼容性問題,適合需要在對話流中修正錯誤或探索不同路徑的場景。更多細節可參考 GitHub。

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

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

小夜