Skip to content

fix: 兼容新版 DSH diff 数据契约,修复卡片静默失效(issue #3 根因) - #4

Open
Fishsb wants to merge 1 commit into
better-er:mainfrom
Fishsb:fix/new-dsh-diff-contract
Open

fix: 兼容新版 DSH diff 数据契约,修复卡片静默失效(issue #3 根因)#4
Fishsb wants to merge 1 commit into
better-er:mainfrom
Fishsb:fix/new-dsh-diff-contract

Conversation

@Fishsb

@Fishsb Fishsb commented Sep 5, 2026

Copy link
Copy Markdown

问题

issue #3 报告的症状(安装后红绿 diff 消失、只剩折叠摘要卡)根因已定位:DSH 0.1.2-rc.1 重构了 edit/write 工具卡的数据流,插件耦合的内部结构已被整体删除

根因链

  1. extractDiffs() 读取 block.callView.card === 'diff' / block.resultView.card === 'diff' —— 这是旧版 DSH 的实现细节。当前版本该字段全运行时零匹配(已被删除)。
  2. 新版数据流:diff 由组件内 diffCardModel(block) 现算 —— settled 取 block.meta.diffsappliedDiffs,与 {path, oldText, newText} 同构、含多 hunk),running/子调用从 args 构建;PTC 子调用标记从 callId ':code:' 改为 parentCallId
  3. 槽位 shadowing 机制本身工作正常(SlotCore 按 priority 升序、最低者渲染,-1 成功遮蔽内置 0),于是出现最危险的静默失效形态:卡片接管成功 + 数据提取恒 null —— 无报错、无警告,用户只能靠"效果消失"感知。

修复(新旧 DSH 双兼容)

extractDiffs 改为三层取数,按优先级回落:

优先级 场景 数据源
1 settled 且非错误 block.meta.diffs(真实应用 diff,多 hunk)
2 PTC 子调用 / running / meta 缺失 args 意图构建(parentCallId 新标记,兼容旧 ':code:';argsRaw/name 防御性双取)
3 旧版 DSH 回归 保留 callView/resultView.card === 'diff' 读取

行为测试 13 项全过(新版形状 5 + 旧版形状 3 + 边界 5:多 hunk 多文件 / write 全新增 / settled 失败不显意图 diff / 非法 JSON 不抛 / meta 异常回落)。

行级去重与字符级下划线高亮算法未动。

附注

  • 本机实测:修复经 client-hmr(500ms 轮询 → SSE → fiber 热替换)免重启生效,历史会话卡片点开即显红绿 diff。
  • 顺带恢复了一项内置已丢弃的能力:新版内置 diffCardModel 对 PTC 子调用直接返回 null(不渲染 diff),本插件现在可以渲染它们。
  • 长期建议(超出本 PR 范围):diff 数据访问若能收敛为公开契约(如种子模块导出类型化取数函数),可让整类"静默失效"失去滋生土壤。

Closes #3 的根因部分(该 issue 实为同一失效)。

DSH 0.1.2-rc.1 重构了 edit/write 工具卡的数据流:旧插件读取的
block.callView/resultView.card === 'diff' 结构已被整体移除,改为组件内
diffCardModel(block) 现算(settled 取 block.meta.diffs,PTC 子调用标记
从 callId ':code:' 改为 parentCallId)。由于槽位 shadowing 优先级选举
正常工作(priority -1 遮蔽内置 0),卡片被本插件接管但提取不到任何
diff 数据,静默降级为无内容摘要卡——表现为接管后红绿 diff 消失
(issue better-er#3)。

extractDiffs 改为三层取数,新旧 DSH 双兼容:
1. settled 且非错误:优先 block.meta.diffs(与内置 appliedDiffs 同构,
   含多 hunk 真实应用 diff)
2. PTC 子调用 / running / meta 缺失兜底:从 args 意图构建
   (parentCallId 新标记,兼容旧 ':code:';argsRaw/name 防御性双取)
3. 旧版 DSH:保留 callView/resultView.card === 'diff' 回归读取

行级去重与字符级高亮算法不变。新版形状 5 例 + 旧版形状 3 例 +
边界 5 例共 13 项行为测试全过。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

安装后已有session无法显示diff吗

1 participant