Repository navigation
Releases: kinggod899/dsh-reply-forge-v3
Release list
dsh-reply-forge v3.4.2
DSH 桌面端「回复锻造」插件 v3.4.2:刷新不再把伪造变回原文,新消息也不会套上一条的伪造了。
安装(选一条)
- npm:DSH「插件管理器」里输入
dsh-reply-forge-v3点安装;或关掉 DSH 后dsh plugin --profile desktop add dsh-reply-forge-v3 - zip:下载
dsh-reply-forge-3.4.2.zip解压即用(或.tgz走 tarball 安装);升级后若启动异常,运行包内「关闭插件.bat」一键回滚
已安装的用户直接升级即可,不用重装。本版修的都是显示层,模型侧采信一直是好的——你改过的东西,模型早就读到了。
先说清楚:伪造从来没失效过
有人看到「刷新就变回原文」,第一反应是白改了。核查下来不是这样,三条实证:
- 401 个会话文件里
reply-forge/patch共 91 条,全部落盘完好、类型没被迁移改名; - 把真实会话喂给宿主自己的恢复逻辑再组装请求,5/5 个目标块读到的都是伪造内容;
- 同一块连续改 3 次全部通过陈旧校验——投影要是没生效,第二次就会被拒。
失效的只是界面:刷新后页面退回原文。下面两个 bug 都是这一层。
一、刷新就恢复原文
根因两条,都得断:
- 宿主刷新走的是另一条路。页面内是活会话,插件注册的投影生效;刷新/重开是「冷读」,宿主折叠历史时用的是一份写死的投影列表,只含它自己的图片卸载投影,插件投影进不去。这是宿主设计,插件改不了。
- 兜底表的键锚错了对象。刷新后「仍显示伪造」本来靠本机覆盖表撑着,但键取的是「接管那一刻页面上的文本」——而页面上的文本就是伪造本身。刷新后拿原文算的键在表里根本不存在,兜底自然落空。
现在读路由会额外回传未投影的磁盘原文,覆盖键改锚它(内容寻址,跨刷新稳定);旧表里锚在页面文本上的键继续兜底命中,历史覆盖不丢;记录异步后到时自动纠键;点「还原」时连旧键一起清掉。
二、新消息套上了上一条的伪造内容
真机症状很怪:改掉倒数第二条回复后,AI 新生成的那条也显示着上次的伪造内容,还挂着「还原」按钮。
成因是一条链:页面上的被伪造块显示的是原文(宿主不渲染投影),而定位只拿投影后的文本建索引 → 它永远精确匹配不上 → 落到「末尾对齐」的推断;新消息一进来,页面块数与记录块数对不上,新消息的块就被兜底配到那条旧块上 → 拿它的原文算出覆盖键 → 命中上一条的覆盖。
三处一起改:matchBlocks 把原文也入索引(被伪造块凭原文对回自己,兜底不再被误用);覆盖键只认精确匹配(推断出来的原文属于另一条消息,不许当键);纠键时补渲染一次(否则慢记录场景下「改了不生效」)。
已经中招的不用清数据:污染只在渲染层,patch 事件与消息正文都完好,刷新一次就恢复。
顺带加固:换 provider 才会踩的雷
伪造思维链时,除了块上的签名,现在连 source.replayState.blocks[i].signature 一起剥。provider 序列化历史时会把后者原样回填到 thinking 块上,只剥前者的话,伪造的思维链会带着「对原文的签名」发出去——签名校验型 provider(Anthropic 系)会拒掉整条请求,症状是「伪造写进去了,下位模型却不采信」。
升级护栏
npm run verify-host 新增一项检查:静态核验宿主的活会话折叠仍用注册表投影。冷读用硬编码列表只影响界面(宿主设计,无解);但活会话一旦也被换掉,模型侧就再也不采信伪造、且不报错——这条检查会在宿主升级时直接 FAIL 报警。
校验:发行包 = 仓库 tag v3.4.2 快照(scripts/build-release.mjs 用 git archive 导出,只含受版本控制的文件)。门禁:client.js 与源码一致 / 423 项 17 套全绿 / verify-host PASS 27 · WARN 0 · FAIL 0。
两条如实说明:① 这次修复只对新写入生效——之前已经伪造过的块,磁盘里没有可用的原文锚点,重新写一次就落到新锚点上,不是没修好;② 换设备、清缓存、无痕窗口仍会看到原文,那一层要宿主把插件投影纳入冷读路径,目前没有公开入口——但模型照样采信,因为它读的是会话文件,跟你用哪台机器、哪个窗口无关。
dsh-reply-forge v3.4.1
DSH 桌面端「回复锻造」插件 v3.4.1:长回复终于能完整改了。
安装(选一条)
- npm:DSH「插件管理器」里输入
dsh-reply-forge-v3点安装;或关掉 DSH 后dsh plugin --profile desktop add dsh-reply-forge-v3 - zip:下载
dsh-reply-forge-3.4.1.zip解压即用(或.tgz走 tarball 安装);升级后若启动异常,运行包内「关闭插件.bat」一键回滚
已安装的用户直接升级即可,不用重装。本版包含 v3.4.0 的全部内容(v3.4.0 未单独发行,版本号预提后并入本版)。
长回复「只剩几个词」修好了
一条一千多字的回复点「伪造回复」,编辑器里只剩「不会」「线索」这类句中词——
加粗片段和标题还在,正文全没了。根因是取正文时只遍历元素的元素子节点,
而 markdown 渲染出来的段落是混合内容:<p>正文<strong>加粗</strong>正文</p>,
两侧的文字是直属文本节点,被整段跳过。
现在改为按文档顺序遍历,直属文本照收;只在段落/标题/列表项这些块级边界补空格,
行内元素两侧不补,避免「这是 重点 内容」这种人为断开。
「改了不生效」也一并修了
在编辑器上方的目标下拉里切回这条消息,内容完整了,但写入后页面一个字都不变。
原因是记录里存的是 markdown 源码(**不会**、## 标题),页面里是渲染结果,
直接比字符串只要回复带任何格式就永远不相等——精确定位形同虚设,全部退化成
「按顺序推断」;页面与记录条数一错位,写入就打到别的块上。
现在定位改成同口径比较:把记录里的 markdown 用插件自己的渲染器渲染一遍再和页面比。
源码形态同时保留入索引,思维链这类纯文本块不会被规范化误伤。另外两点:
- 编辑器初值在精确对上记录时直接取记录原文。拿页面渲染结果当初值,一保存就把
加粗/标题/代码块全拍平成纯文本; - 从目标下拉里选回自己这条不再被当成「改别的消息」,本机渲染照常跟着变。
本版同时包含 v3.4.0 的内容
- 历史版本:每条改过的回复旁边多了「历史版本」入口,能看到原稿→第一次改→第二次改
的完整版本链,标「当前」的那版就是模型此刻读到的内容;选中旧版点「还原到此版」,
内容填进编辑器,再点「写入伪造」即可让模型重新读到那一版。思维链同样有链。 - 升级过 DSH 不再静默丢伪造:宿主 0.2.1 会把旧会话里「未知类型」的事件改名成
plugin:<原类型>,导致投影与版本血统静默失配(伪造退回原文、不报错)。现在两种类型
都注册、读侧都接受,新事件仍写旧类型。 - 升级自检:
npm run verify-host四层探针(版本基线 / 契约面 / boot 冒烟 / 活体 CDP),
DSH 升级后跑一次就知道插件还兼不兼容。
两个如实说明:「仅落盘」写入的块没有版本链(那条路直接改写会话文件,原稿在
.bak-forge-* 备份里);版本链读自会话记录文件,刚完成的在线写入落盘有数百毫秒滞后。
校验:发行包 = 仓库 tag v3.4.1 快照(scripts/build-release.mjs 用 git archive 导出,
可复现、不含任何本机私有文件);测试门禁 404 项 / 17 套全绿(其中 29 项需本机装有宿主包,
找不到自动 SKIP 不计失败)。
dsh-reply-forge v3.3.0
DSH 桌面端「回复锻造」插件 v3 第三个正式版:上 npm 了,现在一条命令就能装。
安装(选一条)
- npm:DSH「插件管理器」里输入
dsh-reply-forge-v3点安装;或关掉 DSH 后dsh plugin --profile desktop add dsh-reply-forge-v3 - zip:下载
dsh-reply-forge-3.3.0.zip解压即用(或.tgz走 tarball 安装);升级后若启动异常,运行包内「关闭插件.bat」一键回滚
包名从
@local/dsh-reply-forge-v3改成dsh-reply-forge-v3(上 npm 必须去占位 scope)。已本地安装的重跑一次安装插件.bat会自动迁移,旧链接与配置条目一并清掉,不会出现两条操作条。
现在可以一行命令装了
以前装这个插件得:下载 zip → 解压 → 双击 安装插件.bat → 重启 DSH。
现在多了一条更省事的路:
- 在 DSH 的「插件管理器」里输入
dsh-reply-forge-v3,点安装; - 或者关掉 DSH,在终端里执行
dsh plugin --profile desktop add dsh-reply-forge-v3。
zip 那条路仍然有效,两种装法内容完全一样。
包名变了,但不用你操心
为了能上 npm,插件包名从 @local/dsh-reply-forge-v3 改成了
dsh-reply-forge-v3。已经是本地安装的话,重新运行一次 安装插件.bat
就会自动迁移——旧的链接、依赖条目、lockfile 记录一并清干净,不会出现
两条消息操作条。
校验:发行包 = 仓库 tag v3.3.0 快照(scripts/build-release.mjs 用 git archive 导出,可复现、不含任何本机私有文件);npm 包走 files 白名单,16 个文件 / 86.3 KB,只含运行时必需(.dsh-plugin/ + src/ + cordis.patch.yml)。测试门禁 321 项 / 14 套全绿(其中 21 项需本机装有宿主包 @deepseek-ai/dsh-session,找不到自动 SKIP 不计失败)。
dsh-reply-forge v3.2.0
DSH 桌面端「回复锻造」插件 v3 第二个正式版:排队中的消息现在能改了,另修三处「按钮不见了」(均经用户真机复验通过)。
安装:下载 dsh-reply-forge-3.2.0.zip 解压即用(或 dsh-reply-forge-3.2.0.tgz 走 tarball 安装);升级后若启动异常,运行包内「关闭插件.bat」一键回滚。
修好了两处「按钮不见了」
1. 插件有时会整体失灵,按钮全没,重启 DSH 才好。
现在会自己好:插件每秒自查一次界面锚点,宿主内部换装后自动重新挂上,
不需要重启。切窗口出去再回来也会补一次。
2. 带代码块的回复没有「伪造」按钮。
新版的代码块自带一个「复制」小按钮,我们误把它当成了「这条消息不能改」
的信号,于是整条回复都不给入口——但你能在别的消息的编辑器里找到它,
就是页面上点不着。现在区分开了:代码块自带的按钮不算,消息里真正的
交互控件(如待批准的确认按钮)仍然不会给入口。只回一段代码的回复
现在也有按钮了。
现在能改「排队中」的消息了
AI 正在生成回复的时候,你也可以发消息——它会先排个队,等 AI 说到一个段落
边界再送进去。这是「打断 AI、给它补一句」的主要方式。
排队的消息会以气泡形式挂在会话里,但输入框已经空了。以前这种消息发错了
只能撤掉重打,或者干脆等它错着送进模型、事后再用「伪造」补救。现在把鼠标
移到这条气泡上,点「改待发送」,改完照常发——不用撤、不用暂停 AI、
不用重新打字。AI 那边什么都没发生,它照原计划讲,只是内容换成你改的。
没在 AI 回复中途发过消息的话,这个功能你基本用不到——它只服务这一个场景。
而从没用到过它,恰恰说明前面两条主功能(改已说的话、改思维链)才是常态。
已知并已修的问题:「改待发送」在真机上点不开(提示「读不到待发送队列):
排队气泡看得见,插件却读不到队列内容。前两次修复都没修到点子上:先是
数据来源找错了(问了一条滞后的路径,而气泡真正来自另一份数据);来源
改对之后,新的读取代码又有一个蔫坏的 bug——它在测试环境能跑,在真实
宿主上却直接报错、还被兜底逻辑吞掉(调用宿主的方法时少做了一个动作:
方法被从对象上摘下来再调用)。诊断信息里「队列里有 1 条」和「读不到
队列」同时出现,才锁定这个自相矛盾。现已改成正确调用形式,并补了一个
按宿主真实形状写的回归测试——这类问题以后在测试阶段就会暴露,不会再
到真机上才崩。
这期间加的双保险保留:气泡出现就记下它对应队列里的哪一条,点的时候先
核对——还在,直接开编辑器;不在了,明说「它已经发送出去了」,并去对话
里确认,真的发出去了会指你去编辑那条已发送的消息。消息从输入框发出到
真正进入队列之间有一下下时间差:看到回显就等消息落库(通常一秒内),
落库后照常弹编辑器;等不到也会明说,不再误报「读不到」。
同版本还修了一处「按钮不见了」:整条回复被一对自定义标签包住的长文本
(某些预设会这样输出)没有「伪造」按钮。现在不管内容被什么样的 HTML 外壳
包着,只要里面是自然语言,就有按钮。
还有一处「按钮不见了」:一条 3600 多字的技术分析回复没有「伪造」按钮,
只因为内容里提到了「工具调用」这几个字,被误判成「这是系统给的操作提示,
不是聊天内容」。其实宿主从来不在回复正文里渲染工具调用——凡是出现在正文
里的,都是模型自己写的话。现在只有用量/费用页脚那几种真正的宿主提示才会
被排除,技术讨论里提到工具有按钮了。
一条限制
这条消息如果带了附件(图片、文件),编辑器会拒绝修改并告诉你原因。
因为底层只接受纯文本,硬改会把附件悄悄弄丢。宁可改不了,也不让你以为改成功了。
其他改动
都在幕后:发布安装包前会自动做几项检查(产物与源码是否一致、插件停用时
注入的按钮是否拆得干净)。插件本身的行为没有任何变化,这次更新你可以
只用上面那一个新功能。
校验:发行包 = 仓库 tag v3.2.0 快照(scripts/build-release.mjs 用 git archive 导出,可复现、不含任何本机私有文件);测试门禁 321 项 / 14 套全绿(其中 21 项需本机装有宿主包 @deepseek-ai/dsh-session,找不到自动 SKIP 不计失败)。
dsh-reply-forge v3.1.0
DSH 桌面端「回复锻造」插件第三代首个正式版。
在线写入:直接往活会话写 message projection,改完立即被大模型采信,不用重启;思维链同样可改。也可显式只落盘(重启后生效)。
安全封口:ignorable 持久化标记覆盖在线 / 落盘两条写路径,并经真宿主持久化闭环验证;每会话写句柄核验(WRITER_NOT_ROUTED / APPEND_UNSAFE 一律拒绝);修复会话.bat 诊断优先、先备份、原子写、自读复验。
焦点修复四轮 + STALE 拒绝第五轮(用户真机复验通过):保存后先把焦点交还宿主输入框再抹块;宿主输入框 inert 态如实报告;禁用前快照焦点、写后恢复;页面内两步确认替代 OS 级模态;读取过投影 + PATCHED_TARGET 拒绝 + 陈旧自动重试兜底。
工程:233 项测试 / 13 套门禁全绿(其中 21 项需本机宿主包,缺则 SKIP);要求 Node.js >= 18;发行包由 git archive 从本 tag 导出,可复现、不含任何本机私有文件。
dsh-reply-forge-3.1.0.zip:解压即用(与仓库布局一致)dsh-reply-forge-3.1.0.tgz:npm pack 式布局,供 dsh plugin add 等工具链
完整变更记录见仓库 CHANGELOG.md。