dsh-message-edit

35Star8Fork13Issue0Watching

为 DSH 会话补充可重放的消息编辑、重生成、重试与版本分支导航,历史保持不可变可回滚。

语言
TypeScript
分支
main
dshdsh-plugin

安装

$ dsh plugin --profile web add github:Moeblack/dsh-message-edit

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

一句话定位

为 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.viewconversation.session.header.actions 两个槽位。事件溯源:每个分支追加 message-edit/version 事件,effect/inverse 配对存储,逆链由父版本自动组合
  • 入口文件: Host 入口 src/index.tsapply(ctx) 注册 HTTP 路由),Client 入口 src/client/index.ts(注册两个 UI 槽位)

适用场景

当你用 DSH 与模型长时间协作、对某条旧回复不满意、或想换个 prompt 试试同一处分支的不同走向时,这个插件让你不必从头开新会话,就能从历史任意回合分出新分支继续走。原会话始终保留,随时切回。适合需要反复打磨同一段对话结构、又不想丢失之前成果的重度用户。

前置依赖与兼容性

依赖最低版本说明
DeepSeek Harness0.1.0-rc.6+插件基于 @deepseek-ai/*@0.1.0-rc.6 类型构建,宿主需满足该版本契约
Node.js未声明仓库未在 engines 中声明 Node 版本要求
运行平台跨平台仓库未声明 os/cpu 限制;DSH web 平台本身跨 macOS/Windows/Linux
原生模块不依赖 node-ptynode: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