← Back to home@apherchin

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.mjshost 半边: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。

三条改代码前必读的铁律

  1. 不写自定义会话事件类型 —— 只用官方 user/message + surfaceOp(session-repair 的毒化教训)。
  2. 不 import "@deepseek-ai/*" —— 会解到 CLI 版本线(与桌面壳不同版本线)。
  3. 不把 "sessions" 放进插件级硬门禁 inject —— 名字不被满足时 apply 会静默永不执行; 一律用 ctx.get(name) + try/catch 做"有则用、无则降级"。(connection 是路由必需的硬依赖,保留在 inject 里。)