为 DSH 会话补充可重放的消息编辑、重生成、重试与版本分支导航,历史保持不可变可回滚。
- Language
- TypeScript
- Branch
- main
Install
$ dsh plugin --profile web add github:Moeblack/dsh-message-editRun the command above in your terminal to install this plugin via the dsh CLI. You can switch Profile in the top-right corner. New to dsh? Read the beginner tutorial
一句话定位
为 DeepSeek Harness 会话补一套可撤销的消息编辑、重生成、重试与分支版本导航能力。它把每次修改落成一个独立的会话版本,原会话不动不删,随时可以切回旧版。
核心能力
- 编辑已落定的用户正文、助手思考块、助手回复正文三类文本块
- 一键重生成最近一条已落定的助手回复,沿用原用户输入
- 在 Timeline 里选择任意历史回合重新执行(Retry)
- 支持两种级联策略:
truncate(默认,丢弃旧后续)和preserve(把后续用户输入依次带入新分支) - 会话标题栏提供撤销(←)与重做(→)按钮,按原子效果单位切换当前版本
- 新增 Timeline 标签页,展示完整分支树、操作时间、编辑前后内容、当前版本与可重试回合
技术实现
- 语言: TypeScript(ESM),构建产物为
index.mjs(Host)和client.js(Browser) - 关键依赖:
@deepseek-ai/dsh-agent、@deepseek-ai/dsh-session、@deepseek-ai/dsh-session-query、@deepseek-ai/dsh-workspace - 架构模式: Cordis 插件双端结构。Host 端注册 HTTP 路由
/message-edit提供时间线读取与编辑执行;Client 端通过slots注册conversation.view与conversation.session.header.actions两个槽位。事件溯源:每个分支追加message-edit/version事件,effect/inverse 配对存储,逆链由父版本自动组合 - 入口文件: Host 入口
src/index.ts(apply(ctx)注册 HTTP 路由),Client 入口src/client/index.ts(注册两个 UI 槽位)
适用场景
当你用 DSH 与模型长时间协作、对某条旧回复不满意、或想换个 prompt 试试同一处分支的不同走向时,这个插件让你不必从头开新会话,就能从历史任意回合分出新分支继续走。原会话始终保留,随时切回。适合需要反复打磨同一段对话结构、又不想丢失之前成果的重度用户。
前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DeepSeek Harness | 0.1.0-rc.6+ | 插件基于 @deepseek-ai/*@0.1.0-rc.6 类型构建,宿主需满足该版本契约 |
| Node.js | 未声明 | 仓库未在 engines 中声明 Node 版本要求 |
| 运行平台 | 跨平台 | 仓库未声明 os/cpu 限制;DSH web 平台本身跨 macOS/Windows/Linux |
| 原生模块 | 无 | 不依赖 node-pty、node:sqlite 等原生模块 |
安装方式
dsh plugin --profile web add github:Moeblack/dsh-message-edit
配置项
本插件无需额外配置。模型路由(provider、model、maxTokens)由插件从当前会话的请求头中自动读取,无需手动指定。
常见问题
Q: 编辑、重生成、重试三种操作分别会改写原会话吗?
A: 不会。插件从不原地改写 Session 事件,原会话作为 append-only 的不可变日志完整保留,每次操作都会从目标回合之前分支出一个新的会话版本。
Q: truncate 和 preserve 两种级联策略有什么差别?
A: truncate 只在分支后的新版本里重新执行目标输入,并丢弃旧的后续内容;preserve 会把目标之后尚未执行的用户输入也依次带入新分支,按顺序重新跑完后续回合的工具链。
Q: 撤销和重做会真的删除事件吗?
A: 不会。每次操作都会追加一个 effect/inverse 配对的事件,撤销只是沿着逆链切换到仍然存在的旧版本,被切走的分支依然保留在版本树里,可以再次切回。
Q: 支持编辑哪些内容?
A: 只支持已落定的文本块——用户消息正文、助手思考块、助手回复正文;图片、工具调用、附件等其它内容块不在可编辑范围内。
Q: 编辑一条消息会影响工作区文件或产物吗?
A: 不会。插件明确只动会话事件和派生 Agent,不联动恢复或修改工作区文件、命令的外部效果与既有产物。
Q: Timeline 标签页的位置在哪?
A: 注册在会话视图的 conversation.view 槽位,order 为 15,位于 Trajectory(10)与 Prompt Studio(20)之间。
上手难度
入门 — 编辑、重生成、撤销按钮都是可视化控件,会话期间无需写配置;理解 truncate/preserve 与版本分支需要花几分钟,但不影响日常使用。
已知问题与限制
- 不支持编辑图片、工具调用、附件等非文本块;只有用户正文、助手思考、助手回复三类文本块可改
- 不恢复或修改工作区文件、命令外部效果与既有产物,分支切换不会回滚这些副作用
- 不修改 DSH 引擎、apiproxy 或官方 UI 包;插件只通过 Host 公开服务与 Browser 槽位协作
- 当历史中找不到可定位的请求头配置(provider、model)时,分支操作会因无法解析模型路由而失败
- 旧版扁平版本事件(schemaVersion 缺失)仍可读取并在投影时规范化,但内部 schema 版本已升级到 2