# dsh-message-edit

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

## Metadata

- Author: [@Moeblack](https://github.com/Moeblack)
- Repo: <https://github.com/Moeblack/dsh-message-edit.git>
- GitHub: [Moeblack/dsh-message-edit](https://github.com/Moeblack/dsh-message-edit)
- Stars: 35
- Language: TypeScript
- Topics: `dsh`, `dsh-plugin`
- Forks: 8
- Open Issues: 13
- Last push: 2026-08-16T11:33:37.000Z
- Added: 2026-08-13T00:00:00.000Z

## Install

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

## Wiki

## 一句话定位
为 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` 等原生模块 |

## 安装方式
```bash
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

---

This document is auto-generated by [deepseek-plugin.org](https://deepseek-plugin.org). HTML page: [dsh-message-edit](https://deepseek-plugin.org/plugins/Moeblack/dsh-message-edit)
Wiki generated by AI (model: `MiniMax-M3`)
