前言¶
用 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 进程的权限运行,安装时可能执行代码。装之前请先看源码与许可。
典型用法¶
- 安装并在设置中启用插件,按上文重启 profile、刷新界面。
- 打开目标会话,将鼠标悬停到要处理的消息行,点击 撤回、删除 或 删除此处及之后。
- 撤回 后改输入框中的回填文本,直接重发即可。
- 删除 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 / 幻方无官方从属关系)。