dsh-conversation-rewind
为 DeepSeek Harness Web UI 增加原 Session、append-only(只追加)的消息分支浏览与安全历史消息编辑。
功能
- 在每条可编辑用户消息下方、复制按钮旁直接增加“编辑历史消息”;编辑器原位出现在该消息行中,不再弹出 Modal。
- 原历史切换视图改名为“消息分支”,展示可视化消息树;每个语义分支只有最后一条消息可以点击,中间消息只是树节点。
- 点击分支末端只是客户端只读浏览已有路径:不会发送消息、调用 Provider、唤醒 Agent、写入 inbox、追加 replacement,也不会截断 Session。
- 分支浏览仍在原 Session 内:Session ID 与浏览器 URL 全程不变,不创建子 Session。
- 使用 DSH Surface replacement 元数据,把目标消息、旧回复及后续旧路径从当前对话和后续模型上下文中隐藏。
- 持久事件日志仍然只追加。历史事件保留用于审计与恢复,插件追加 replacement marker,不改写或删除旧事件。
- 修改后的文本作为一条真实的新用户消息发送,助手回复会重新生成。
- 确认编辑后始终从这条消息在原 Session 内新开一个兄弟分支;编辑器不提供任何“后续消息”选项。
- 常驻保护编辑流程的内部 trigger,确保它在 Provider 请求前被取消;Host 重启后的 orphan 恢复同样 fail-closed。
原 Session 语义
1. 插件只在确认编辑时验证已经完成、可安全重放的用户轮次,并在提交前重新检查 live Session。 2. 一个受保护的内部轮次追加 DSH SurfaceOp replacement,覆盖从目标消息到当前活动尾部的旧路径。 3. 内部 trigger 与被遮蔽的旧路径不会进入 Provider 请求。 4. 内部轮次完全回到 idle 后,修改后的消息才作为普通用户轮次排入同一个 Session。 5. 新消息与新回复都是 append-origin 事件,因此修改后的消息之后仍可再次编辑。
确认编辑会从目标消息替换当前活动路径,只把修改后的文本作为一条新的普通用户消息排入同一个 Session。旧消息仍保留在 append-only 历史中,成为新消息的兄弟分支;编辑操作不会重放后续消息。消息分支浏览不会执行 replacement 或重放流程。
安全边界
只有“已完成轮次中唯一一条、由用户直接发送的普通纯文本消息”可编辑。目标之前仍在当前 Surface 上的注入上下文会原样保留;目标之后的上下文则必须是 Host 可重新生成的系统快照或技能目录。包含附件、非文本块、多条直接用户消息、尚未结束或正在运行的轮次、入队历史有歧义,或后续轮次无法安全重放时,目标会被隐藏或请求会被拒绝。
当前编辑要求 Session 在本 DSH 进程中处于 live 状态。Surface 或 inbox 并发变化时操作会 fail-closed。若 Surface replacement 已提交、但后续 checkpoint 失败,错误会返回原 Session 与 replacement event;行内编辑器会立即作废旧消息快照,并在重新加载 Session 后才重新开放编辑入口。
包含附件、歧义用户上下文或其他无法安全重放轮次的分支仍会显示在树中;只要有明确末端仍可只读浏览,但其中消息不会提供编辑入口。
编辑才会改变会话历史;分支浏览不会改变会话。两者都不会恢复工作区文件,也不会逆转工具调用、命令、网络请求或其他外部副作用。
环境要求
- DeepSeek Harness
>=0.1.0-rc.6 - Node.js
^22.19或>=24 - DSH Web profile
安装
dsh plugin --profile web add \
https://github.com/DTSFO/dsh-conversation-rewind/archive/refs/tags/v0.1.7.tar.gz
dsh web卸载:
dsh plugin --profile web remove dsh-conversation-rewind使用
1. 在 DSH Web 中打开一个已经完成的 Session。 2. 点击目标用户消息下方、复制按钮旁的“编辑历史消息”。编辑器会原位展开;修改文本后点击“确认”或“取消”。确认会在同一个 Session 内从该消息新开兄弟分支。 3. 打开“消息分支”视图查看消息树,只点击分支末端即可在 Chat 中只读浏览该已有路径。 4. 浏览期间发送会被暂时禁用;回到当前活动末端后才可发送或编辑。 5. 旧路径仍保留在 append-only 日志中,只有确认编辑才会在原 Session 内追加 replacement 并重新生成回复。
本地开发与测试
pnpm install
pnpm run check
dsh plugin --profile web add /absolute/path/to/dsh-conversation-rewind
dsh webpnpm run check 会依次执行 TypeScript 检查、ESLint、单元测试与生产构建。
已知限制
- 编辑范围刻意限制为可安全重放的单条普通纯文本用户消息。
- 编辑不会重放后续用户输入;如需切换已有历史路径,请在消息树中点击对应节点。
- 分支浏览是客户端只读投影;Host 当前窗口未提供的 Chat 行无法由插件伪造恢复。
- 非末端消息显示为静态树节点;Host 直接收到非末端选择时会返回
BRANCH_NOT_ENDPOINT。 - Session 必须在当前 Host 进程中打开并处于 live 状态。
- 不恢复工作区,也不逆转外部副作用。
- 当前版本面向 DSH Web UI 与 DSH
0.1.0-rc.6API。
MIT