- Home
- Plugin
- Sessioni e messaggi
- dsh-message-revert
I
dsh-message-revert
imcaibaicai/dsh-message-revert
A revert button on every sent message: on confirm it returns that message's text and attachments to the composer, rolls the session back to before that step and restores workspace files to their captured before-content.
Installazione
dsh plugin --profile web add github:imcaibaicai/dsh-message-revertREADME
dsh-message-revert
English | 简体中文
DSH 消息撤回/回滚插件:每条已发送消息悬停时出现撤回按钮;确认后把该消息的文本与图片/文件原样填回输入框,会话回滚到该步骤之前(fork 到最近一个已完成回合,或对首条消息回到新会话首屏),并把工作区文件还原到该消息之前的内容。宿主引擎 + 浏览器 UI,纯插件实现,不改核心、不动官方任何文件。
功能
| 功能 | 说明 |
|---|---|
| 撤回按钮 | 每条用户消息行的操作条上悬停出现(首条消息运行时也有兜底悬停条) |
| 多模式确认对话框 | 支持单步回退(仅撤回最后 1 步)、安全分叉(Fork 分叉保留原会话)、彻底重置(清空首屏),并动态列出将还原的文件 |
| 通用设置面板 | 在「设置 → 通用」中齐平注册配置卡片,支持自定义默认回滚模式、原会话保护开关与智能弹窗选择器 |
| 原会话安全保护 | 默认禁用自动归档(autoArchive: false),原会话永久完好保留在侧边栏,避免对话记录意外丢失 |
| 侧边栏状态保持 | 会话回滚/分叉/重置后自动迁移并保持左侧会话列表与右侧工具栏(文件树/终端)展开状态 |
| 文本回填 | 消息原文回到输入框(优先走官方 conversation.input.shell 的 setDraft,失败回退 Lexical DOM 注入) |
| 附件回填 | 图片/文件附件重新创建草稿并挂回输入框(官方 createDrafts + addAttachments + rebindDraftFiles) |
| 会话回滚 | 支持 Step 级切点回退或回合边界安全 fork;即使首轮已执行多个 Step 也绝不静默清空 |
| 文件还原 | 宿主在每次 write/edit 工具调用执行前捕获文件全文,撤回时按切点精准还原(新建的删除、修改的复原) |
| 工作区继承 | 新会话绑定原工作区,composer 可编辑、模型/模式/权限不丢 |
| 诊断通道 | 失败时把观察到的快照形状写进 ~/.dsh/dsh-revert/diag.log 并在弹窗显示,可事后定位 |
安全设计(为什么可以放心用)
- 只有能证明是该会话第一次往返才允许清空:seq 必须是数字、是最早一条用户消息、之前没有已完成回合、之前的
turn/start≤ 1 个——其余一律 fork;任何歧义直接报错,绝不猜。 - fork 后归档前二次校验:重新读子会话日志,早于目标消息的用户消息数必须 ≥ 预期值,否则不归档原会话并 toast 告知。
- RPC 同源校验:
/dsh-revert/rpc的每个 POST 都校验Origin与请求Host一致(无 Origin 的 curl/服务端请求放行),恶意网页无法借浏览器触发文件还原。 - 只还原被捕获过的文件:没捕获到 before 状态的文件不会被碰。
安装
dsh plugin --profile web add -w dsh-message-revert
手动等价方式:包放到 <DSH_HOME>/profiles/node_modules/dsh-message-revert/,在 cordis.patch.yml 加一条:
- insert:
- id: dsh-revert
name: 'dsh-message-revert'
宿主插件在 DSH 启动时加载,装完必须完全退出并重启 DeepSeek Harness,会话页强刷。
卸载
删 cordis.patch.yml 里的插入行 + 删包目录,重启即可。已捕获的 before 快照保留在 ~/.dsh/dsh-revert/,不随卸载删除。
实现要点
- 宿主半包(
lib/index.js):tool/call时捕获write/edit目标文件全文(sha256 去重存 blob,按 session 落<DSH_HOME>/dsh-revert/<session>.json);复刻官方scanZstdFrames()逐帧解压多帧 zstd 会话日志(Node 原生 API 只解第一帧),按source.kind === "user"取真人消息与 seq;读工作区注册表解析workspaceId;web RPC 五个动作(status / preview / execute / diag / user-messages / workspace-for-session)。 - 浏览器半包(
lib/client.js):MutationObserver 在用户消息行动作条挂按钮;宿主日志为主源、客户端快照为兜底(多形状按 seq 去重);decideReset三态决策(reset / fork / error);草稿回填带 45×150ms 重试与完成标志分离。 - 数据兼容:HTTP 路由
/dsh-revert与数据目录~/.dsh/dsh-revert/沿用旧名,升级不改路径、不丢已捕获的快照。
已知边界
- 只对插件安装后发生的
write/edit调用有 before 快照;更早的改动撤不回(确认框会显示"未检测到该步骤之前的文件更改")。 - 依赖官方内部 DOM 标记(
[data-chat-flow-kind=user]、[data-chat-flow-key]、[data-composer-input])与服务面(sessions.fork/conversation.input.shell/workspaces.archiveSession);DSH 升级后若失效,先核对这些契约。 - 实测于 DeepSeek Harness
0.1.5-rc.1(web profile);sessions.create({ workspaceId })是 0.1.5 建空白会话的正解,新版动词(connectWorkspace/startSession)存在时也会优先使用。
License
MIT
Plugin correlati
R
billion-context
ranxianglei/billion-context
7.4k6 ore faSessioni e messaggi
Z
dsh-web-ui (dsh-chat-recovery)
zhu1090093659/dsh-web-ui
6.2k3 mesi faSessioni e messaggiApache-2.0
L
dsh-synapse
liangmianya/dsh-synapse
71411 giorni faSessioni e messaggiMIT
M
dsh-archive-manager
michengai/dsh-archive-manager
35619 ore faSessioni e messaggiApache-2.0