dsh-session-rewind
(已合并进 dsh-wonder-tools)重新生成(从这里重来):把某轮及之后从模型视野作废、原提示词回填输入框,支持分支找回。
- Stars
- 0
- Language
- JavaScript
- Created
- Oct 4, 2026
- Updated
- Oct 4, 2026
Introduction
⚠️ 已被
dsh-wonder-tools取代(本包已合并进那个工具箱)。 请改用dsh plugin add dsh-wonder-tools—— 一个插件装好五个功能:删除对话 / 重新生成 / 队友命令 / 跨会话提醒 / 首轮结束自动命名。 本包现在只作为该工具箱的依赖存在。
dsh-session-rewind
会话「重新生成(从这里重来)」的 DSH 插件:把某一轮连同它之后的全部对话从模型视野里作废,
并把那一轮的原始提示词重新填回输入框,让你改一下再问一次。不改 app.asar(host 半边走 profile insert,客户端半边走 dsh.client)。
状态:本地在用中(
cordis.patch.yml的insert已启用)。2026-10-04 对 DSH 0.2.0-rc.2 做过兼容核对, 见下文「0.2.0 兼容性」。
它做什么
- 入口:助手动作行里的「重新生成(从这里重来)」按钮 + 轮次页脚槽位(含「已作废 · 模型不再看到」标记与「分支找回」入口)。
- 预览先行:先调
op: "preview",弹窗列出将被作废的轮次、区间、原提示词(只读)、被遮蔽的 surface 节点数; 再带previewToken调op: "apply"。会话在预览之后发生变化 ⇒STALE_PREVIEW,要求重新预览。 - 语义边界(弹窗里明写):
- 只作废模型视野(surface)里的内容,文件与外部副作用不回滚;
- 该轮含附件时只能带回文字;
- 原会话内不可撤销,要找回请用该轮下方的「分支找回」(在作废点之前 fork 出新会话,原文原样回来)。
- 拒绝条件:会话不在内存里(
NOT_ATTACHED)、日志里有未闭合轮次或 agent 收件箱还有排队/steering 输入(SESSION_ACTIVE)、 轮次不存在(TURN_NOT_FOUND)、区间非法(RANGE_INVALID)。 - 写入方式:
session.append一条user/message替换体 +surfaceOp: { op: "replace", startSeq, endSeq },sourceEventSeqs列全被遮蔽的 surface 节点。不发明自定义事件类型。
0.2.0 兼容性(2026-10-04 核对)
| 检查项 | 结论 |
|---|---|
session.snapshotEvents() | DSH 0.2.0-rc.1 起被标记弃用;官方政策「存量调用可暂不迁移,禁止新增调用」⇒ 本插件是存量调用方,合规。0.2.0-rc.2 的 asar 里该方法仍有 110 处 / 76 个文件(官方自己在用) |
session.surface.nodes / session.append(type, data, { surfaceOp, sourceEventSeqs }) | 均存在(asar 里 surfaceOp 315 处、sourceEventSeqs 328 处) |
ctx.connection.fetch.register 注册 POST /api/session.rewind | 存在(asar 里 fetch.register 8 处) |
| 离线测试 | node smoke-test.mjs → 44/44 通过 |
| 页面级实测 | ⏳ 未做(改/装插件都要整机重启 DSH;打包版没有「刷新页面」) |
替代方向(将来真要迁移时):官方方向是"显式异步分页 / 显式存储读取",用来替换同步读取任意历史;
但 0.2.0 还没有与"一次拿全量事件 + surface 节点"等价的异步接口,届时 core.mjs 的纯函数入参形状需要一起改。
文件结构
| 文件 | 角色 |
|---|---|
index.mjs | host 半边:live 会话探测、忙碌判定、调 core、映射 HTTP 状态码 |
core.mjs | 纯函数:校验 / 定位 / 区间计算 / 替换体构造 / 恢复记录折叠(离线全测) |
client.js | 客户端半边:动作行按钮、轮次页脚标记、确认弹窗、提示条、分支找回(三处槽位注册各自 try/catch,外层兜底) |
smoke-test.mjs | 离线测试台(44 条) |
package.json | 含 dsh.client(exports["./client"]),客户端半边由平台供应,无需改 asar |
跑测试
node D:\DSH\Day1\plugins\dsh-session-rewind\smoke-test.mjs
安装 / 停用
安装:在 ~\.dsh\profiles\desktop\cordis.patch.yml 追加
- insert:
- id: session-rewind
name: "D:/DSH/Day1/plugins/dsh-session-rewind/index.mjs"
停用:注释掉这段 insert + 整机重启。备份见 Day1\work\session-rewind-20260927\cordis.patch.yml.bak-before-rewind。
三条改代码前必读的铁律
- 不写自定义会话事件类型 —— 只用官方
user/message+surfaceOp(session-repair的毒化教训)。 - 不
import "@deepseek-ai/*"—— 会解到 CLI 版本线(与桌面壳不同版本线)。 - 不把
"sessions"放进插件级硬门禁inject—— 名字不被满足时apply会静默永不执行; 一律用ctx.get(name)+ try/catch 做"有则用、无则降级"。(connection是路由必需的硬依赖,保留在inject里。)