修复历史边界与流式消息去重并更新发布包

This commit is contained in:
shiyue
2026-09-21 00:38:51 +08:00
parent db04e088bc
commit f8f5ef3a0b
14 changed files with 1733 additions and 423 deletions

View File

@@ -6,3 +6,12 @@
- codebase-memory 项目 `home-cc-web` 索引状态为 ready(8208 nodes / 19300 edges)。
- 工作区存在用户已有未提交改动:`lib/ccweb-mcp-server.js`、`scripts/ccweb-message-reply-unit.js`,本任务不触碰。
- 2026-09-21:db04e08 已删除全量 native 替换,但 merge 的数值 baseIndex 回退仍不可靠;messagesEquivalent 不支持 codexAppTurnId 与 native turnId 跨来源对齐。
- 前端 prepend/reconcile 仍以相同下标跳过不同 ID,缓存也会按下标覆盖不同消息。
- sessions/35394008-4f0c-43c0-a481-b622d9e6b884.json 本机暂未找到,不能假装完成迁移。
- 自动回传使用 buildCrossConversationReplyAutoRunText 的“子对话回传已返回……”包装,需与“来自……”投递包装分别精确识别;两者均不能作为普通用户消息。
- response_item 中存在 AGENTS/environment 等用户角色上下文;有 event_msg.user_message 时以事件为权威,仅从匹配 response 补充 ID。
- done 原来不携带持久化助手身份,结束后的本地 stream 与刷新消息无法去重;现已将最终消息及合并后下标通过 done 传递。
- 新迁移能力通过已认证 WebSocket 在服务端同步检查/备份/写入;单文件提供 --migrate-session-history 入口,默认预览,--apply 写入。

View File

@@ -5,3 +5,18 @@
- 2026-09-20:rollout 解析按 `task_started` / `turn_context` / 完成事件聚合同一 turn,保留 function/custom tool,过滤跨对话内部 user 输入。
- 2026-09-20:前端缓存、DOM、重连和实时消息按稳定键去重,普通用户消息把本地 ID 作为 `clientMessageId` 发给服务端。
- 2026-09-20:通过 `node --check`、完整 `npm run regression`、`history-recall`、`session-switch-race`、既有单测和 `git diff --check`。
- 2026-09-21:收紧 native 合并,仅首条稳定标识/完整时间戳和内容摘要边界可信;废止数值基线切 native,跨线程和分段 turn 保守回退。
- 2026-09-21:新增结构化截断元数据、修正消息名额及基线覆盖;服务端新增 idle 状态的预览/备份/原子迁移入口,脚本默认预览。
- 2026-09-21:用户确认目标旧会话在其他机器,本轮不操作远端会话数据。
- 2026-09-21:历史服务端 9 项、rollout 10 项、前端专项行为回归已通过;历史召回和切会话专项通过。额外补齐流式转持久化的身份绑定,准备全量和浏览器验证。
- 2026-09-21:全量 npm run regression 通过;关联 ccweb-message-reply、failed-insert-card、ccweb-list-user-inputs、javascript-session-runtime 单测和语法检查通过。最终 auto-run 过滤后的 history-recall、session-switch-race 复跑通过。
- 2026-09-21:使用 /tmp/ccweb-bun.7eHd2F/node_modules/@oven/bun-linux-x64-baseline/bin/bun(1.4.2)开始构建发布包;Firefox 隔离浏览器验证执行中。
- 2026-09-21:CentOS 7 baseline 发布包构建完成,MCP initialize、单文件 --migrate-session-history 入口、tar 结构均通过烟测;SHA-256 为 7c8fe9bcb1be8c860e10578a1fac925c51785f83dd6449cbfa57f09dcc370c9e。
- 2026-09-21:无本机目标数据迁移;本机列表仍有其他 running 对话,按 AGENTS.md 不重启本机服务。用户本轮要求异机使用的验证、打包与推送。
- 2026-09-21:最终全量回归再次通过。Firefox 156.0 / geckodriver 0.37.1 真浏览器验证通过:68 条快照、483 条 native;加载、运行、刷新、真实 WebSocket 重连、done、done 后刷新六阶段保持顺序且无重复,historySource=merged。
- 浏览器证据:/tmp/cc-web-history-browser-KnMvZ7/evidence.json;运行中截图 /tmp/cc-web-history-browser-KnMvZ7/refreshed.png 已目视核对。隔离进程已清理。
- 本轮目标在异机,未迁移或重启生产会话;发布包提供 idle 安全迁移工具。准备提交全部源码、测试、计划及发布包并推送 main。

View File

@@ -7,14 +7,14 @@
## 合并契约
- 持久化快照中去掉 `ccwebPersistenceNotice` 后的消息保持原有顺序,是当前会话的权威尾部;native 只能补充快照之前的消息。
- 快照压缩时保存 `historySnapshotBaseIndex`(native 逻辑消息索引)与 `historySnapshotCount`,旧快照缺字段时按稳定 ID/最长公共后缀推断,无法确认边界时保留快照。
- 快照压缩时保存 `historySnapshotBaseIndex`(cc-web 逻辑消息索引)与 `historySnapshotCount`;只按首条稳定 ID 别名或完整时间戳和内容摘要确认 native 边界,禁止用数值基线直接切 native。
- 合并顺序固定为:native 更早消息 → cc-web 持久化消息 → 当前运行中的消息;相同稳定 ID 只保留 cc-web 消息,ID 冲突且内容不一致时以持久化消息为准并记录告警。
- native 缺失、解析异常、边界无法确认或合并结果不能证明快照尾部完整时,返回 cc-web 快照,不把未经确认的 native 消息插入当前视图。
- `session_info`、`resume_session_result`、`session_history_chunk` 均调用同一解析结果;分页只对该结果切片。
## 稳定标识契约
- 用户消息:优先 `clientMessageId`,兼容旧字段 `id`;缺失时生成并持久化 `client:<uuid>`。
- 消息已有 `id` 始终保留;新增用户消息保留 `clientMessageId`,缺失时生成并持久化 UUID。
- Codex App 助手消息:使用 `codexAppTurnKey`,其输入为 session/thread/turn 的稳定字段;旧消息缺失时从对应运行状态或时间戳生成一次并保存。
- native rollout 助手消息:使用 `nativeTurnKey`,由 threadId + turnId/turn_context 组成;同一 turn 跨刷新保持一致。
- 跨对话回传:保留 `replyToRequestId`(兼容 `crossConversation.replyRequestId`),同时生成 `reply:<requestId>` 作为稳定消息 ID;来源元数据始终保留。
@@ -23,7 +23,7 @@
## Turn 聚合契约
- 以 `turn_id`、`turn_context.turn_id`、`turn_context.id` 或 session/thread 上下文组成 turn key;缺失时使用相邻事件窗口的稳定 fallback key。
- 同一 turn 内按 rollout 文件顺序合并文本片段、工具调用与工具结果;只有遇到下一条用户消息、turn 完成/失败事件或文件结束才 flush。
- 同一 turn 内按 rollout 文件顺序合并文本片段、工具调用与工具结果;只有遇到新 turn、下一条真实用户消息、turn 完成/失败事件或文件结束才 flush。
- tool call/result 绑定同一调用 ID;空 turn 不产出气泡;跨对话内部 user 回传不作为普通 user 消息插入。
## 前端契约
@@ -60,3 +60,15 @@
| 错误 | 尝试 | 处理 |
|---|---|---|
## 2026-09-21 反馈修订
- [complete] 收紧历史边界并补齐解析、前端稳定标识
- [complete] 补齐结构化快照元数据及安全迁移入口
- [complete] 运行历史、重连回归与必要浏览器验证
- [complete] 检查旧会话迁移条件及服务重启条件
- [complete] 重建 CentOS 7 发布包并烟测
- [in_progress] 提交全部修改并推送
修订约束:不以 historySnapshotBaseIndex 直接切 native;只确认快照首条的可靠边界,不要求尚未进入 rollout 的最近消息也匹配。ID 别名优先,完整时间戳与内容摘要次之;未确认则只保留快照。目标旧会话只在 idle 且原文件未变化时备份和原子迁移。用户要求不再审计,本轮仅做实现与必要回归。update_plan 工具当前未提供,以本计划和 CSV 同步跟踪。