apherchin/dsh-session-rewind ↗★ 0

@apherchin/dsh-session-rewind

DSH session row "Rewind from here": voids a turn and everything after it from the model's view, refills the original prompt, and offers a fork-based recovery. (host + client plugin) 已合并至dsh-wonder-tools。适合需要回滚对话并重新编辑提示词的用户。

Package
@apherchin/dsh-session-rewind
Compatibility
Unverified
Version
0.1.1
License
MIT
Last updated
Oct 4, 2026

Install

This plugin has no verified bundle, or compatibility checks failed. Read the repository notes first. Read the full README ↗

⚠️ 已被 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 里。)