Repository navigation
Releases: ZhaoZeW/dsh-rollback
Release list
v0.4.3
0.4.3 — 文档与兼容矩阵(无行为变更)
支持 DSH 0.2.0-rc.2 —— 官方桌面版当前捆绑的构建,已实测。
本版没有逻辑改动(lib/*.js 与 0.4.2 的差异仅限版本字符串)。为什么还是发一版:npm 页面上的介绍是发布时烘进 tarball 的 README,只有重新发布才能刷新;这次把「它解决什么问题 / 功能 / 修了什么」重写了一遍。
顺带把 0.4.2 的修复一并带到最新版 —— 如果你此前在 DSH 0.2.0 上用过回退,务必升级。
0.4.2 修的是什么(重要)
症状:用过一次回退之后,该会话每一轮都失败,报错原文是
format v4 message requires a producer-owned source kind
而且跟你选哪个模型无关:切到别的模型、再切回来,都是一样的错。这个会话从此写不进任何东西。
根因:回退标记是一条 user/message,0.4.1 及更早版本给它盖的来源是 source = { kind: 'plugin', plugin: 'rollback' }。DSH 0.2.0 启用了会话格式 v4,v4 要求每条消息的来源 kind 必须由产生者持有(plugin:<名字> 这种拼写),于是编码时被 assertV4MessageSources 拒绝。真正致命的不是「被拒绝」,而是拒绝发生的位置:它在持久化 drain 里,不在 append 的调用栈上 —— append 已经返回成功,失败的批次却被留在写队列头部,此后该会话每一次写入都要重新编码同一批次、抛同一个错。
修法:标记改写成 source = { kind: 'plugin:rollback' },与 DSH 自己 v3→v4 迁移时给未登记插件分配的拼写一致。读取端同时接受三种拼写({plugin:'rollback'}、{kind:'plugin',plugin:'rollback'}、{kind:'plugin:rollback'})—— 日志是 append-only 的,升级前写下的标记必须继续被识别,否则那些轮次会作为幽灵重新出现。
安装
dsh plugin --profile desktop add @nianchu/dsh-rollback或者直接用本页的 dsh-rollback.tgz:
dsh plugin --profile desktop add file:C:\path\to\dsh-rollback.tgz装完重启 DSH。
不能与上游
@domitor-syh/dsh-rollback同时安装 —— 两者注册同一个插件 id(rollback)与同一个/rollback命令。请二选一。
验证
- 280 项单元测试全绿,27 项产物断言全过,构建可复现(重建后产物逐字节一致)
- 用真实的 v4 编码器验证(从官方桌面版 app.asar 抽出
@deepseek-ai/dsh-session-format-v3-to-v4@0.2.0-rc.2):新拼写在assertV4RowAdmission与releasedV4SessionFormatCodec.encodeEvent两个入口都被准入;旧拼写两处都被拒绝 - 在本机官方桌面版 DSH 0.2.0-rc.2 上实测:回退、回退后继续对话、重启前后预览一致
v0.4.2
0.4.2 — 修正 v4 会话格式下的标记来源(旧写法会卡死整个会话)
⚠️ 如果你在用 0.4.1,请升级。 0.4.1 写的回退标记会让被回退过的那个会话彻底无法继续——每一轮都报「本轮运行失败」,且与所选模型无关(切模型、切回deepseek-v4-flash都无效)。
根因
回退标记是一条 user/message,source 盖的是 { kind: 'plugin', plugin: 'rollback' }。DSH 0.2.0(会话格式 v4)在编码该事件时拒绝 kind === 'plugin':
format v4 message requires a producer-owned source kind
关键在于这次拒绝发生在持久化 drain 里,不在 append 的调用栈上:append 已经返回成功,失败批次却被留在写队列头部,此后该会话每一次写入都重新编码同一批次并抛同一个错。
改动
- 写入端改为 v4 要求的产生者所属 kind:
{ kind: 'plugin:rollback' }。这正是 DSH 自身 v3→v4 迁移给未登记插件分配的拼写(producerKind()→plugin:<name>,并丢掉plugin字段)。 - 新增
src/core/marker-source.ts:标记来源的唯一出处——写入常量、kind 常量与读取判定isRollbackMarkerSource()。 - 读取端同时接受三种拼写:
{ plugin: 'rollback' }、{ kind: 'plugin', plugin: 'rollback' }、{ kind: 'plugin:rollback' }。日志是 append-only 的,而 v4 迁移是把旧标记重写而非丢弃,所以同一个文件里两种拼写并存;只认新拼写会让升级过会话的已回退区段重新可见(幻影轮次,以及「曾创建的文件」误删你后来重建的文件)。 - 不会误判别的插件:
{ kind: 'plugin', plugin: 'compaction' }这类来源不匹配。 - 兼容范围未改:
dsh.engines.dsh仍为>=0.1.5-rc.2。v3 的来源 kind 白名单只作用于 v2→v3 迁移路径,v3 原生准入从不约束user/message的source.kind。
验证
- 单元测试 280 通过 / 0 失败;产物自检 27/27;
lib/*.js重建后哈希逐字节一致(构建可复现)。 - 用宿主自己的 v4 编解码代码(从运行中的 app.asar 原样抽出的
@deepseek-ai/dsh-session-format-v3-to-v4)跑真实计划产物:新拼写在assertV4RowAdmission与encodeEvent两个入口都通过;0.4.1 的旧拼写在两处都被拒,且报文正是上面那条 —— 完整复现了那次故障。
安装
dsh plugin --profile web add -w @nianchu/dsh-rollback装完必须重启 DSH:profile 的 bundle 列表只在启动时组装。
npm 那条路:@nianchu/dsh-rollback@0.4.2(若用国内镜像装不上,.npmrc加@nianchu:registry=https://registry.npmjs.org/)。
v0.4.1
0.4.1 鈥?淇 bundle patch 鐨勮繃鏈熸敞閲?
- **
cordis.patch.yml涓嶅啀澹扮О瀛樺湪闈㈠悜妯″瀷鐨勫伐鍏?*锛氬師鏂囨部鐢ㄤ笂娓哥殑銆宔xposed as a modelrollbacktool銆嶏紝浣嗘湰 fork 鍙敞鍐?/rollback鍛戒护涓庝袱涓?Web 鎻掓Ы锛宍inject鍒楄〃閲屼篃娌℃湁tools鏈嶅姟銆傛敞閲婄幇濡傚疄鎻忚堪鏆撮湶闈紝骞舵槑纭爣娉?*鍙兘鐢变汉鍙戣捣**銆?- **PLUGIN_VERSION鍚屾鍒?0.4.1**锛氭祴璇曟柇瑷€瀹冨繀椤荤瓑浜?package.json鐨?version锛屾紡鏀逛細璁╂祴璇曠孩銆?- **琛屼负鏃犲彉鏇?*锛歚lib/涓?0.4.0 鐨勫樊寮傚彧鏈?PLUGIN_VERSION閭d竴琛屻€?
瀹夎锛堥鏋勫缓锛屽厤鏋勫缓锛涜祫浜у悕涓嶅甫鐗堟湰鍙凤紝latest/download涓嶄細鐑傦級锛?
dsh plugin --profile web add -w https://github.com/ZhaoZeW/dsh-rollback/releases/latest/download/dsh-rollback.tgz
涔熷彲浠ヤ粠 npm 瑁咃細npm i @nianchu/dsh-rollback
v0.4.0
首个 nianchu 版本:基于上游 @domitor-syh/dsh-rollback(MIT)重建,适配并实证 DSH 0.1.7-rc.2。
修复(每条都先复现后修)
- 预览 diff 方向对 restore/recover 是反的
- 「事后状态未知」用空串冒充,导致重启后所有预览都画出伪造的单边 diff
- 预览基线会过期:现改为每次预览实时读盘
- 空文本被算作 1 行;diff 预算可越界
- 跳过原因被当成文件内容画进 diff
- 追加表层标记时忽略了 surfaceOp 参数,旧拼写回退是空转
- 契约探针遇到会抛错的 getter 会丢掉整份报告
新增
- /rollback doctor:22 项框架契约逐条探测
- 实时盘面的受影响文件 diff 预览(宿主与浏览器共用同一格式)
- /rollback undo-last、preview last、Ctrl+Shift+Z 快捷键
- 设置里可关闭「回退后隐藏已回退的消息」
- 英文文案补齐、弹窗键盘导航与无障碍
- 自包含构建脚本、产物断言、零依赖测试运行器(273 项测试通过)
安装
dsh plugin --profile web add https://github.com/ZhaoZeW/dsh-rollback/releases/latest/download/dsh-rollback.tgz