dsh-message-recall:在 DSH 裏按條撤回與刪除消息

前言

用 DeepSeek Harness(DSH)做智能體開發時,會話往往很長:某條提示詞發錯了、某輪 AI 回覆不滿意、工具調用結果拖累後續上下文,卻不想 fork 會話或整段重來。DSH 的會話日誌是 append-only,官方 compaction 可以摺疊歷史,但缺少「對着某一條消息就地改」的入口。下面介紹社區插件 dsh-message-recall(維護者 kyle123740,客戶端類),它在每條消息上提供撤回、刪除、刪除此處及之後,並通過與官方 compaction 同源的 surface 替換機制,讓模型上下文與界面同步移除被刪內容。

這是什麼

dsh-message-recall 是面向 DeepSeek Harness 的客戶端插件,npm 包名爲 @kyle123740/dsh-message-recall(當前資料版本 0.2.1,MIT 許可)。鼠標懸停到任意一條消息,右上角會出現一組小按鈕;操作在當前會話內完成,不新建窗口、不 fork 會話。

與 npm 上裸名 dsh-message-recall(Jipcon 的另一套 Web 撤回插件)無關,安裝與卸載時務必使用作用域全名 @kyle123740/dsh-message-recall。

核心功能

三個動作

動作 適用範圍 行爲
撤回 僅你自己發出的消息(含運行中插話 steering) 從模型上下文與界面移除;原文自動回填輸入框,改好後可直接重發,對話裏不留痕跡。
刪除 任意一條(AI 回覆、工具行等) 刪 AI 回覆時會連帶該 step 的工具結果(一次模型調用 + 其工具執行);點工具行會反查所屬回覆一併刪除。需點兩下確認。
刪除此處及之後 任意一條 從該條起截斷到會話末尾,後半段就地清空。

界面示意(來自 README):

你的提問      [ 撤回 ]  [ 刪除 ]  [ 刪除此處及之後 ]
AI 的回覆                [ 刪除 ]  [ 刪除此處及之後 ]
工具調用行               [ 刪除 ]  [ 刪除此處及之後 ]

生效方式

  • 就地生效:不 fork、不新建會話、不換窗口。
  • 真刪:被刪內容同時從模型上下文和界面消失;刷新、重啓後仍不在(依賴墓碑事件重放 surface)。
  • 不破壞日誌:原文仍在 append-only 會話日誌中;插件寫墓碑,與官方 compaction 使用同一套 surfaceOp: replace 機制。
  • 界面上不留佔位:被刪行直接從轉錄本消失,不插入「已刪除」提示行(與更早插件版本不同)。

適配版本

聲明下限爲 dsh >= 0.1.7-alpha.1(寫在 package.json 的 dsh.engines.dsh)。README 記載實測通過 DSH 2.0 桌面版(0.2.0-rc.1)以及 0.1.7 線(core 0.1.7-rc.2),Node 22.23;0.1.6 及更早未驗證。

查本機版本:

dsh --version

安裝與啓用

在 DSH 內置終端或任意能執行 dsh 的終端中,npm 與 GitHub 兩種來源任選;桌面版與網頁版僅 profile 不同。

# 從 npm 裝(作用域包,桌面版)
dsh plugin --profile desktop add @kyle123740/dsh-message-recall

# 從 GitHub 裝(桌面版)
dsh plugin --profile desktop add github:kyle123740/dsh-message-recall

# 網頁版:把 profile 換成 web
dsh plugin --profile web add @kyle123740/dsh-message-recall

固定版本示例:

dsh plugin --profile desktop add @kyle123740/dsh-message-recall@0.2.1
dsh plugin --profile desktop add github:kyle123740/dsh-message-recall#v0.2.1

dsh plugin 將參數轉發給 pnpm,沒有 enable/disable 子命令;開關在 「設置 → 插件」。裝完後重啓該 profile 一次(Host 重新 import),並刷新界面(Client 重新取 bundle)。覈對已裝版本:

dsh plugin --profile desktop why @kyle123740/dsh-message-recall

卸載(認包名,非插件 id):

dsh plugin --profile desktop remove @kyle123740/dsh-message-recall

卸載後不殘留插件狀態;墓碑不再生效時,被刪內容會重新出現在界面,會話日誌仍可讀。

插件以當前 DSH 進程的權限運行,安裝時可能執行代碼。裝之前請先看源碼與許可。

典型用法

  1. 安裝並在設置中啓用插件,按上文重啓 profile、刷新界面。
  2. 打開目標會話,將鼠標懸停到要處理的消息行,點擊 撤回、刪除 或 刪除此處及之後。
  3. 撤回 後改輸入框中的回填文本,直接重發即可。
  4. 刪除 AI 回覆或工具相關行時,按界面二次確認;Agent 正在執行 step 時按鈕不出現,Host 忙時會返回 423 AGENT_BUSY,不會悄悄排隊。

若需從磁盤日誌排查墓碑(開發/排錯用,腳本不在 npm 安裝包內),README 提供:

node scripts/explain-session.mjs <日誌路徑>
node scripts/scan-replace.mjs <會話根目錄>

會話日誌路徑形如 $DSH_HOME/sessions/<項目>/<會話id>/session.v4.jsonl.zstd。

工作原理(簡述)

Host 側定位消息在 surface 中的區間,追加一條帶 surfaceOp: { op: 'replace', startSeq, endSeq } 的 user/message 墓碑(佔位文本 [已撤回],非空以避免部分上游 400)。Session.deriveMessages 只從 surface 派生模型歷史,故下一次請求不會再帶上被遮蔽內容;原始事件仍在日誌中,重開會話通過 foldSurface 保持一致。Client 側掛在 conversation.input.overlay,按 data-chat-flow 等 DOM 標記裝飾行並調用本插件註冊的本地路由 POST /dsh-message-recall(同源 fetch,無外部網絡)。

適用場景與注意

適合:需要刪掉錯誤提示詞、不滿意回覆或截斷後半段對話,且希望模型上下文與界面一致、刷新後仍生效的 DSH 用戶(桌面版或網頁版 profile)。

邊界與限制(均來自 README):

  • 系統提示(surface node 0)不可撤回或刪除。
  • 已被 compaction 摺疊的舊輪次無法單獨刪某一步;插件會提示與其它內容交錯(可能已壓縮)。
  • 撤回/刪除不可在界面撤銷;原文仍在日誌,必要時可讀日誌手工找回。
  • Agent 運行中不能改 surface。
  • 能力與網絡:Client 僅訪問本實例本地路由;Host 持久化經 DSH 會話 API,不直接讀寫磁盤;運行時無子進程、無憑據訪問。

結尾

dsh-message-recall 把「按條改會話」做成 DSH 客戶端上的懸停按鈕,用 append-only 墓碑同步模型視圖與界面,適合日常調試提示詞與清理錯誤輪次。更多說明與 issue 見 GitHub;社區目錄頁便於檢索同生態插件(目錄站與 DeepSeek / 幻方無官方從屬關係)。

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

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

小夜