前言¶
在使用 DeepSeek Harness(DSH)进行对话调试或智能体开发时,回退对话步骤是常见需求。大多数现有的回退插件通过 sessions.fork 将历史前缀复制到新会话中,这会导致侧边栏出现冗余会话,且原会话与 fork 会话的上下文管理变得复杂。
dsh-plugin-undo 提供了另一种方案:它直接在当前会话表面进行撤销操作。这种方式不需要分叉会话,也不会修改项目文件,保持了会话 ID 的唯一性。
插件简介¶
名称:dsh-plugin-undo
作者:wang-xudong
类型:客户端插件
协议:MIT
该插件的核心价值在于“原地撤销”。它通过修改会话表面(surface),将最后 \(n\) 轮对话从模型可见的历史中移除,同时在 Web UI 中将这部分内容折叠为紧凑的页眉。原始会话日志保持追加写入(append-only)状态,未被重写。
核心功能¶
- 撤销最后 \(n\) 轮:支持撤销最近 1 轮、多轮或全部可见轮次。
- 无分叉会话:操作在当前会话进行,Session ID 保持不变,侧边栏不会出现重复会话。
- 日志追加写入:底层的原始会话日志仅追加新内容,不进行重写。
- UI 折叠展示:Web 界面将已撤销的轮次折叠为
↩ 第 N 轮已撤销 · 点击展开的紧凑头部,点击即可展开或折叠。 - 模型上下文隔离:仅重置模型可见的对话历史,项目文件不受影响。
安装与启用¶
插件通过本地文件路径安装。请将下载好的插件文件放置在目标路径。
dsh plugin --profile <profile> add file:/path/to/dsh-plugin-undo
安装完成后,重启 profile 即可生效:
dsh --profile <profile>
典型用法¶
在会话处于空闲状态时,在输入框输入以下命令:
/undo:撤销最后 1 轮对话。/undo 1:同上。/undo 3:撤销最后 3 轮对话。/undo all:撤销当前模型可见的所有对话轮次。
注意:命令执行时,会话必须处于空闲状态。如果 UI 显示当前有正在运行的轮次,需先停止该轮次再执行撤销。
实现细节¶
插件通过以下机制工作:
- 表面操作:主机根据
turn/start和turn/end推导当前模型可见的轮次,对尾部轮次应用surfaceOp: { op: 'replace', start, end }。 - 检查点机制:在轮次边界外创建一个空的助手消息作为检查点。由于消息推导会跳过空内容,模型将只看到保留的历史。
- UI 折叠:客户端读取
/undo命令节点,利用 DOM 和 CSS 将已撤销的轮次折叠,隐藏命令卡片本身,仅保留折叠后的页眉供用户交互。
适用场景与注意¶
该插件适合需要在单一会话流中快速修正对话走向的场景。使用时需注意:
- 仅支持撤销连续的尾部轮次,不支持任意中间轮次的撤销。
- 仅影响模型可见的对话历史,不会修改或删除项目文件。
- 必须在会话空闲时执行命令。
生态背景¶
DeepSeek Harness 采用插件化架构,允许开发者通过社区目录或本地文件扩展功能。该插件收录于社区目录,与 DeepSeek 或幻方无官方从属关系。