修复历史合并跳过快照专有气泡并按 ID 合并片段

- mergeNativeHistoryWithSnapshot 的边界定位改为 locateNativeBoundaryIndex,
  允许跳过快照头部只在 cc-web 存在的气泡(ccwebDisplayOnly 回传显示、
  无 native 身份的本地用户回显),遇到无法对齐的普通消息仍然放弃确认。
- native 前缀不再按 turn 别名折叠,改为 mergeNativePrefixWithSnapshot 按自身 ID
  去重,同 ID 片段用 combineNativeFragments 合并正文与工具调用,避免前端按稳定
  ID 去重丢正文。
- session-history-unit 新增 3 条断言,历史服务端回归 12 项通过。
- 重新构建 dist-exe/cc-web-bun-linux-x64-baseline.tar.gz(bun 1.4.2 baseline)。
This commit is contained in:
shiyue
2026-09-21 10:58:59 +08:00
parent ac00f4e67d
commit 5e9bda7984
5 changed files with 135 additions and 16 deletions

View File

@@ -15,3 +15,10 @@
- response_item 中存在 AGENTS/environment 等用户角色上下文;有 event_msg.user_message 时以事件为权威,仅从匹配 response 补充 ID。
- done 原来不携带持久化助手身份,结束后的本地 stream 与刷新消息无法去重;现已将最终消息及合并后下标通过 done 传递。
- 新迁移能力通过已认证 WebSocket 在服务端同步检查/备份/写入;单文件提供 --migrate-session-history 入口,默认预览,--apply 写入。
## 2026-09-21 旧会话迁移复盘
- `sessions/35394008-…json` 的截断提示结构化字段完整,但仍报 `history_boundary_unconfirmed`:快照首条是 cc-web 专有的跨对话回传显示气泡(`ccwebDisplayOnly`),rollout 里不存在对应记录,旧规则只认首条锚点就直接放弃确认。
- mergeHistorySegments 的 turn 别名键会把 native 前缀里同一 turn 的多条气泡折叠成一条,实测丢掉 9 条助手正文(2537 字);native 前缀必须按自身 ID 去重,不能按 turn 去重。
- rollout 解析器会把同一条气泡拆成多条空文本工具片段且共用同一 `history-assistant:<hash>` ID,前端按稳定 ID 去重时只保留最后一条;前缀侧需要先按 ID 合并片段(正文拼接、工具调用并集)再交给前端。
- 迁移后文件不再带截断提示,未升级的旧服务进程也会走 snapshot 分支把 739 条全部展示,historyAvailable 为 true,因此迁移不必等待服务重启。

View File

@@ -22,3 +22,11 @@
- 本轮目标在异机,未迁移或重启生产会话;发布包提供 idle 安全迁移工具。准备提交全部源码、测试、计划及发布包并推送 main。
- 2026-09-21:修复、测试和发布包已提交 f8f5ef3 并推送 origin/main;全部步骤完成,已清理本轮临时 CSV。
## 2026-09-21 旧会话实际迁移
- 渲染侧确认问题:目标会话默认视图只剩最后 12 条气泡,顶部提示「还有 68 条更早消息,但原始记录不可用,无法恢复」,用户输入气泡全部落在无法加载的历史里。
- 边界规则改为允许跳过快照头部的 cc-web 专有气泡(跨对话回传显示、本地用户回显),遇到无法对齐的普通消息仍然放弃确认;native 前缀改用按 ID 合并片段的 mergeNativePrefixWithSnapshot。
- 单测新增 2 项(头部专有气泡跳过、前缀同 ID 片段合并),历史服务端回归 12 项通过;全量 npm run regression 结果见本轮日志。
- 官方迁移入口走运行中的旧进程仍会拒绝,改用等价离线流程(同 resolver、同 idle 前置、同备份目录、同原子写入与回读校验)迁移目标会话:80 条快照 + 1111 条 native 前缀 = 739 条,备份写入 sessions/_history-backups。
- 迁移后校验:739 条消息、0 重复 ID、时间单调、91 条用户气泡、用户原问题与对应助手回复邻接;浏览器实测加载更多可用,用户气泡可见;其他会话文件未被改写。