修复历史消息回看并重新打包

This commit is contained in:
shiyue
2026-09-11 09:29:53 +08:00
parent 6fff9023b2
commit b8fcc12229
18 changed files with 494 additions and 73 deletions

View File

@@ -0,0 +1,14 @@
# 历史消息回看发现
## 初始状态
- 用户看到提示“历史消息过多cc-web 已只保留最近 45 条用于本地展示,省略 50 条旧消息。”
- 用户明确要求:旧消息可以默认隐藏,但必须有办法查看前面的内容。
## 代码证据
- `server.js:sanitizeMessagesForPersist` 生成用户看到的中文裁剪提示;它只影响持久化快照的展示内容。
- `server.js:handleLoadSession` 已将历史拆成最近窗口和 `olderChunks`,并发送 `historyTotal/historyCursor/historyTruncated/historyPending` 元数据。
- `server.js:handleLoadHistoryPage` 已存在按 `before``HISTORY_CHUNK_SIZE` 读取历史页的 WebSocket 入口,但当前固定返回 `remaining: 0`,需要确认前端是否能继续请求及服务端是否正确维护游标。
- `public/app.js` 已存在 `prependHistoryMessages`,说明“前置插入旧消息”的渲染能力已有;还需要核对 `session_history_chunk` 处理、入口文案和重复/边界状态。
- 计划审查指出验收必须明确:默认仍只渲染最近窗口、入口可操作、可连续查看旧消息、顺序和角色正确,并覆盖失败/重复点击/并发新消息等边界。

View File

@@ -0,0 +1,10 @@
# 历史消息回看进度
## 日志
- 2026-09-11建立隔离计划目录准备定位历史消息裁剪和回看链路。
- 2026-09-11计划审查未通过已补充验收标准、数量边界、分页/并发/权限风险;审查意见要求保留必要计划记录,只清理临时 TODO 文件。
- 2026-09-11代码图谱确认服务端已有 `handleLoadHistoryPage``handleLoadSession`/`splitHistoryMessages`,前端已有 `prependHistoryMessages`,问题更可能是入口或游标链路未闭合,而非完全没有历史能力。
- 2026-09-11实现服务端原始历史恢复、普通会话按需分页、历史游标回传和前端顶部回看控件历史页按稳定消息索引去重并合并缓存。
- 2026-09-11新增 `history-recall` 回归断言,覆盖 45 条近期 + 50 条旧消息的切分、Codex rollout 解析、入口/分页协议和重复消息保护;该目标与完整 `npm run regression` 均通过。
- 2026-09-11按发布技能用本地 Bun baseline 重建 `dist-exe/cc-web-bun-linux-x64-baseline.tar.gz`语法检查、MCP initialize smoke 和归档清单均通过;临时 TODO 清单已清理。

View File

@@ -0,0 +1,44 @@
# 修复历史消息回看入口
## 目标
让被本地展示裁剪的旧消息仍然可通过明确入口回看,保留当前渲染性能与会话加载稳定性。
## 步骤
- [x] 定位消息裁剪逻辑、历史数据来源和现有接口
- [x] 明确按需加载旧消息的交互与数据边界
- [x] 实现历史消息回看入口及服务端/客户端衔接
- [x] 补充裁剪与历史回看回归测试
- [x] 运行测试并核验兼容性,完成后按约定清理临时 TODO 文件
## 验收标准
- 默认加载仍只渲染最近 45 条(或当前代码实际配置的同等窗口),不会因增加入口而自动拉取全部旧消息。
- 出现“省略 50 条旧消息”时,界面有清晰可操作的回看入口,而不是只有数量提示。
- 用户点击入口后能看到被省略消息的真实内容,并可继续按页查看更早消息。
- 回看后的顺序、时间线、角色、内容和现有消息渲染保持正确;滚动位置不会跳乱。
- 覆盖空历史、旧消息不足一页、连续多页、重复点击、加载失败和新消息并发到达等边界。
## 错误记录
| 错误 | 尝试 | 处理 |
|---|---:|---|
## 当前决策
- 不删除旧消息数据,只调整本地展示和按需加载路径。
- 先复用现有会话消息接口;只有确认接口无法分页时才扩展接口。
## 风险与约束
- 优先使用分页/游标加载,避免一次性把全部历史复制到浏览器内存。
- 历史加载与实时新消息并发时,必须按稳定消息索引或 ID 去重并保持排序。
- 历史接口沿用会话归属校验;失败时给出可理解的错误反馈并允许重试。
- 不能破坏现有裁剪提示、缓存、滚动位置和消息渲染批处理。
## 已确认实现边界
- 旧消息优先从 Claude JSONL / Codex rollout 原始记录恢复cc-web 快照只作为无原始记录时的降级来源。
- 正常打开会话只渲染最近窗口;历史按钮使用现有 `load_history_page` WebSocket 按游标加载。
- 搜索命中跳转仍允许目标预取,不受普通会话的按需加载策略影响。