Files
cc-web/.trellis/tasks/10-10-snapshot-history-pagination/research/frontend-result.md
shiyue 69b6db0f5b 修复完整会话历史与长气泡交互并更新 CentOS 7 发布包
提交当前工作区全部源码、回归脚本、任务记录及重新构建的 Bun baseline 发布包。发布单文件 MCP 初始化及前端资源一致性验证通过。
2026-10-10 23:40:16 +08:00

5.6 KiB
Raw Blame History

前端历史分页实现结果

记录时间:2026-10-10 16:09(Asia/Shanghai)。

变更

  • public/app.js:正文与用户提问目录按正数游标请求已有历史,available=false 只用于更早记录待核实的说明。
  • 正文显示可读取的已保存消息数量,保留 loading、重试及来源提示。游标归零后移除加载按钮;来源状态为 false 时仍显示「更早的记录尚待核实,已保存的消息可正常查看。」
  • 用户目录首屏没有提问、但仍有历史游标时保持入口可用;读取失败可重试,索引自动逐页完成。
  • 来源尚未返回时,初始和重置状态不展示待核实提示;服务端明确返回的 historyAvailable=false 仍保留。普通完整历史没有限制提示。
  • scripts/history-frontend-unit.js:新增行为回归,直接执行生产请求、响应处理、正文合并及目录索引函数;只模拟浏览器节点与网络发送。

失败与通过证据

先修改专项测试,尚未修改 app.js 时执行:

timeout 60s node scripts/history-frontend-unit.js

退出码为 1,失败断言为「原始来源不可用时仍须请求已保存的45条正文」,实际请求数 0、期望 1。这是旧分页门禁导致的行为失败。

完成最小修复后,以下命令全部退出 0:

timeout 60s node scripts/history-frontend-unit.js
node --check public/app.js
node --check scripts/history-frontend-unit.js
git diff --check -- public/app.js scripts/history-frontend-unit.js

已覆盖:

  • 57 条已保存消息、首屏 12 条、游标 45、来源不可用:正文按 45→33→21→9→0 分页读全,顺序正确,无重复。
  • 首屏全部为助手消息:目录入口仍可点击,并自动索引全部旧用户提问,顺序正确,无重复。
  • 正文和目录分别验证未认证、连接未打开、连接不存在及当前会话不匹配时不发送请求。
  • 正文和目录分别过滤错误会话、过期响应;重复请求去重,重复响应不污染结果。
  • 两类请求失败后释放在途状态、保留游标、显示重试并发送新请求,loading 正常。
  • 游标为零时两类请求均停止;更早记录待核实的提示仍保留且无正文加载按钮,完整历史不显示限制。
  • 原有稳定消息 ID、缓存合并、重连和流式完成去重回归继续通过。

余下边界

  • 前端只读取服务端已提供的历史;完整历史持久化及原始日志合并仍由后端实现负责。
  • available=false 也可能只是合并边界尚未确认,不能断言原始文件不完整或消息未保存。旧版如果已经裁掉消息且没有可确证来源,前端无法补出;本次保留核实提示,不将旧存量历史宣称为完全恢复。
  • 尚未在用户所指的其他客户端实际验证。本次只执行隔离的专项测试和语法检查,没有操作真实会话、远端或服务。

隔离浏览器归档验收

已将归档重启流程合入 scripts/history-browser-check.js。测试只创建临时目录、临时密码和隔离 server.js 子进程;运行中把夹具 rollout 重命名为 .isolated-hidden,停止并重新启动隔离 服务,重新登录并打开夹具会话,未读取或改写真实会话、生产服务或真实 rollout。

执行命令:

node --check scripts/history-browser-check.js
git diff --check -- scripts/history-browser-check.js
timeout --signal=TERM --kill-after=5s 60s node scripts/history-browser-check.js

结果全部通过,证据目录为: /tmp/cc-web-history-browser-60Uwf0

浏览器阶段包含 loaded、archivedAfterRestart、archivedPaged、running、 refreshed、reconnected、completed、completedRefreshed。归档阶段的证据为:

  • 重启后 session_info.historySource 全部为 archive,historyTotal=148, historyAvailable=true。
  • 归档分页共 6 个 session_history_chunk,每块来源均为 archive、总数均为 148, 协议下标连续覆盖 0..147,协议稳定 ID 数为 148。
  • 重启后首屏为 12 条,下标为 136..147;点击分页直到最早的「早期问题 0」出现后, 浏览器实际读回 148 条,稳定 ID 唯一数为 148,顺序与夹具完整 ID 序列一致。
  • 读完完整归档后提示为空,没有「无法恢复」或「待核实」。
  • /tmp/cc-web-history-browser-60Uwf0/archived-after-restart.png 记录重启后首屏; /tmp/cc-web-history-browser-60Uwf0/archived-paged.png 记录分页读到最早消息。
  • 重启后仍继续完成原有运行中发送、刷新、WebSocket 重连、完成事件和完成后刷新检查。

本轮只修改 scripts/history-browser-check.js 和本报告;隔离测试进程、Firefox、 relay 及隐藏的 rollout 均在 finally 中清理或恢复。

工具调用简报

  • codebase-memory-mcp:list_projects / index_status(project="home-cc-web") 确认索引 ready;用 search_code / search_graph 定位,再用 get_code_snippet 读取正文分页、目录分页及渲染函数。
  • 随后查询历史控件 CSS 时索引工具返回 Transport closed;降级为 FastCtx 精确本地读取和搜索,没有重启服务。
  • FastCtx:读取任务文档、规范、技能目录及专项测试;执行范围限定的测试、语法和差异检查。所有单次测试命令最大 60 秒,无重试或退避。
  • 浏览器验收:使用本地 Firefox/geckodriver、临时隔离服务和夹具;测试完成后读取 /tmp/cc-web-history-browser-60Uwf0/evidence.json 及截图核对协议总数、稳定 ID 和阶段结果。