fix: 消除会话列表解析阻塞并按需加载工具详情
This commit is contained in:
BIN
.planning/display-image-render-failure/browser-after.png
Normal file
BIN
.planning/display-image-render-failure/browser-after.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 355 KiB |
14
.planning/display-image-render-failure/findings.md
Normal file
14
.planning/display-image-render-failure/findings.md
Normal file
@@ -0,0 +1,14 @@
|
||||
# 排查发现
|
||||
|
||||
- 截图会话 ID 前缀为 0bb322b1,项目 kongjun,连续八条“图片渲染失败”。
|
||||
- 当前代码索引 home-cc-web 状态 ready。
|
||||
- 已有 public/app.js、public/index.html、public/style.css、scripts/regression.js 未提交改动,属于文件浏览器画廊任务。
|
||||
- 前端只读子代理并行定位;主代理检查服务端与实际图片来源。
|
||||
- 实际历史中恰好八次图片调用均返回 ready;结果外层是 MCP CallToolResult,含 content 文本与 structuredContent。
|
||||
- parseCcwebDisplayImageResult 仅解析一层 JSON;createCcwebDisplayImageToolContent 直接读 payload.ok,因而误报失败。
|
||||
- 八个附件及元数据均存在,PNG 尺寸全部为 936×1664;大小与历史记录一致。
|
||||
- 运行服务 /app.js 返回 200 且 Cache-Control 为 no-store,服务每次从磁盘读取静态资源,不需要重启后端。
|
||||
- 后续 codebase-memory 查询出现 Transport closed;此前已取得必要符号与源码,补充验证降级为本地 rg。
|
||||
- 已在同一真实会话使用旧代码/新代码做浏览器对照:旧代码 8/8 失败且无 img;新代码 8/8 图片自然尺寸均 936×1664、failures=0、pageErrors=[]。
|
||||
- 运行服务提供的 app.js 与磁盘修复代码 cmp 一致;不需要重启服务。
|
||||
- 其他任务原始新增行保留检查 328/328。
|
||||
16
.planning/display-image-render-failure/progress.md
Normal file
16
.planning/display-image-render-failure/progress.md
Normal file
@@ -0,0 +1,16 @@
|
||||
# 进度
|
||||
|
||||
- 已阅读 planning-with-files 与 Trellis 工作流,开发者身份 shiyue 已存在。
|
||||
- 已建立三阶段计划与 CSV 跟踪。
|
||||
- 已派发前端只读排查子任务。
|
||||
- 已确认八个真实结果都是成功返回,前端缺少 MCP CallToolResult 解包。
|
||||
- 已创建 Trellis PRD 与开发/检查上下文;准备由实现代理做局部修复与行为验证。
|
||||
- 实现完成,独立解析/DOM 行为单测及语法检查通过;八个真实历史结果均进入附件预览分支。
|
||||
- Playwright 真实运行会话用修复前代码复现 total=8、failures=8、无图片元素。
|
||||
- 浏览器初次被远程 CDN 阻塞;改用既有本地缓存路由对应 CDN 脚本后正常,未改产品代码。
|
||||
- 已派发独立审查;开始修复后真实浏览器验收。
|
||||
- 修复后浏览器验收通过:原会话八张附件均完成实际鉴权请求并解码,8/8 loaded,页面脚本错误 0。
|
||||
- 证据截图保存为 browser-after.png;运行服务响应内容与磁盘修复 app.js 一致。
|
||||
- 独立审查通过,独立单测已接入原图片目标回归;规范已补 MCP 结果解包约定。
|
||||
- 独立单测、目标回归、三个 JavaScript 文件语法检查及 git diff --check 均通过。
|
||||
- 所有阶段完成,清理本任务 CSV,保留计划与浏览器证据。未重启服务,未改写会话数据。
|
||||
22
.planning/display-image-render-failure/task_plan.md
Normal file
22
.planning/display-image-render-failure/task_plan.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# 图片展示失败排查
|
||||
|
||||
目标:定位截图中 ccweb_display_image 连续图片渲染失败的原因,修复并验证。
|
||||
|
||||
## 阶段
|
||||
1. 定位图片展示失败的实际链路与原因:completed
|
||||
2. 修复问题并补充必要回归验证:completed
|
||||
3. 验证实际图片请求并整理结果:completed
|
||||
|
||||
## 验收结果
|
||||
- 真实浏览器旧代码 8/8 失败,新代码 8/8 正常加载,页面异常 0。
|
||||
- 独立行为单测、图片目标回归、语法检查与差异检查通过。
|
||||
- 静态资源已由运行服务提供;用户刷新页面即可恢复,不需重启或重新生成图片。
|
||||
|
||||
## 约束
|
||||
- 保留已有文件浏览器画廊改动,不回滚、不覆盖。
|
||||
- 不对其他运行会话造成中断;重启前检查运行列表。
|
||||
- 使用 codebase-memory 索引定位代码,不使用 graphify。
|
||||
|
||||
## 错误
|
||||
- todo-list-csv / trellis 专用技能在本地未发现,采用原始规则和通用子代理。
|
||||
- codebase-memory 后续查询连接关闭(Transport closed),已掌握精确入口,降级本地校验,不重复请求。
|
||||
10
.planning/file-browser-image-gallery/findings.md
Normal file
10
.planning/file-browser-image-gallery/findings.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# 发现
|
||||
|
||||
- 初始工作区干净;当前 main 提交 fb2c336。
|
||||
- codebase-memory-mcp 索引 home-cc-web 状态 ready。
|
||||
- 图片预览入口为 public/app.js 的 openFileBrowserFile / showFileBrowser。
|
||||
- 已有鉴权图片接口,沿用当前图片格式白名单与资源释放策略。
|
||||
- 已找到 openAttachmentPreviewModal 现成弹层,消息附件与 createAssistantImageElement 均调用它;当前没有图库切换或缩放平移。
|
||||
- 将扩展已有弹层的文件图库模式,保留消息图片原有行为。首尾禁用对应箭头,支持按钮、方向键与移动端触控按钮。
|
||||
- 已完成图库模式:复用 openAttachmentPreviewModal,文件图鉴权来源按需加载,SVG data URL,Blob 在切换/关闭时释放。
|
||||
- 已验证首尾禁用、目录仅筛选图片、单图状态、手机 44px 按钮和全视口适配,Escape 捕获避免关闭底层浏览器。
|
||||
13
.planning/file-browser-image-gallery/progress.md
Normal file
13
.planning/file-browser-image-gallery/progress.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# 进展
|
||||
|
||||
- 2026-10-17:启动文件图片全屏查看和目录切图任务;完成索引与初始状态检查。
|
||||
- 已将 app.js / style.css / regression.js 的实现委派给 gallery_implement;主线程准备独立服务上的真实浏览器验证。
|
||||
- 已确认本机 Chromium 149 可直接运行,无需安装浏览器或依赖。Firefox 包装命令超时,改用现有 Chromium。
|
||||
- FastCtx 文件输出预算过小且目录遍历耗时;定位优先使用代码索引,具体测试准备按需用终端补充。
|
||||
- 实现完成:复用附件弹层的全视口模式,添加同目录图片按钮、方向键、页码、首尾禁用、焦点恢复与请求清理。
|
||||
- 实现代理已通过 file-browser-image、file-preview-encoding、frontend-asset-version 三项专项回归及语法检查。
|
||||
- 隔离浏览器已成功登录并打开真实图片预览,正在继续图库交互验收。
|
||||
- Chromium 真实浏览器验收完成:点击打开、按钮和方向键切换、SVG、首尾与单图状态、手机尺寸、Escape 分层关闭、焦点恢复、快速翻页及 Blob 清理共 20 项断言通过。
|
||||
- 浏览器测试屏蔽了无关外部 CDN/字体并为 Markdown 渲染提供空会话所需替身,图片请求、DOM、样式与鉴权均使用真实项目实现。
|
||||
- 初次浏览器模拟点击不聚焦、Enter 模拟不产生原生激活,已改为真实鼠标事件后验证焦点恢复通过,未因此修改产品代码。
|
||||
- 测试结果 /tmp/ccweb-gallery-e2e.265atk/result.json,桌面与移动端截图已人工查看;本轮没有重启、打包、提交或推送。
|
||||
21
.planning/file-browser-image-gallery/task_plan.md
Normal file
21
.planning/file-browser-image-gallery/task_plan.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# 文件预览全屏与目录切图
|
||||
|
||||
## 目标
|
||||
点击文件浏览器里的图片,复用现有图片查看器全屏查看,支持当前文件夹内前后切图。
|
||||
|
||||
## 阶段
|
||||
1. 确认现有查看器与文件列表数据接口:完成。
|
||||
2. 接入全屏预览与同目录切换:完成。
|
||||
3. 验证桌面、移动端与资源释放:完成。
|
||||
|
||||
## 验证结果
|
||||
- 三项专项回归、两项语法检查和 git diff --check 均通过。
|
||||
- Chromium 149:1440×1000 桌面与 390×844 手机视口共 20 项交互断言通过,页面无未捕获异常。
|
||||
- 截图与临时浏览器脚本保存在 /tmp/ccweb-gallery-e2e.265atk/;独立服务和浏览器已退出。
|
||||
- 复用既有组件与资源加载惯例,没有新增需要单独扩展规范的模式。
|
||||
|
||||
## 约束
|
||||
- 保持现有鉴权图片接口和目录权限边界。
|
||||
- 复用现有组件,无新增依赖;按需加载,避免整目录提前下载。
|
||||
- 沿用用户要求,不做额外审计。
|
||||
- 本轮只实现与验证,不重新打包、提交、推送或重启服务。
|
||||
18
.planning/session-switch-live-failure/findings.md
Normal file
18
.planning/session-switch-live-failure/findings.md
Normal file
@@ -0,0 +1,18 @@
|
||||
# 排查发现
|
||||
|
||||
- 线上已使用 GET /api/sessions/:id,HTTP读取不等待WebSocket。
|
||||
- 缓存分为完整新鲜、完整过期和未命中;运行中的会话不能使用完整新鲜缓存直出。
|
||||
- 首屏读取12条、后续24条;首屏附带完整运行正文和工具调用快照。
|
||||
- 完成快照后,浏览器才订阅实时更新;订阅修订变化会触发后台HTTP对账。
|
||||
- 2026-10-18最近业务查询记录200、服务端执行为毫秒级;该计时不覆盖进入处理函数前等待、传输、浏览器解析与显示。
|
||||
- 工作区已有图片显示及文件浏览器等未提交修改,必须保留。
|
||||
- 真实归档隔离副本首屏实测:常用会话约805KB/122个工具,另一会话1.21MB/143个工具,最大副本6.31MB/311个工具;普通本机Firefox切换约0.4~1.5秒,未复现45秒超时。
|
||||
- 实际工具结果占主要体积,最大单条工具输出约1MB;闭合的工具details仍立即构造完整输出DOM,最大副本出现约1秒主线程停顿。
|
||||
- 正在受控传输夹具下复现完整工具输出绑在首屏导致的45秒请求超时;不据此断言现场网络有故障。
|
||||
- 2026-10-19线上请求02:27:06发出,02:28:25才进入HTTP处理函数,处理本身39ms;8秒CPU采样的大部分样本落在parseJsonTopLevelSuffixFields,调用源为WebSocket的sendSessionList。
|
||||
- 原算法对每个嵌套id/title候选复制并JSON.parse整个剩余后缀,近二次方成本与GC阻塞了所有HTTP请求。已改为从根结束符反向单次扫描,只解析完整顶层元数据。
|
||||
- 列表改读归档loadMetadata,不读正文块、不因快照过期而同步重建;按归档修订及快照stat缓存列表字段,标题/未读变化立即失效。
|
||||
- 128KB密集工具伪键只需14次JSON解析、约12ms;8份大旧快照刷新列表与HTTP读取并发回归通过。290份实际会话只读元数据探针无正文块读取和写盘。
|
||||
- 线上重启后真实Firefox点击三个现有会话,分别352/430/184ms显示,当前运行正文恢复且工具详情完整。
|
||||
- 追加并发刷新列表的连续9次真实点击,120~462ms全部显示,无浏览器错误;生产历史和未读未被测试修改(测试浏览器阻断实时订阅,另用鉴权WS只发list_sessions)。
|
||||
- 290份实际会话元数据冷读1978ms;相同进程后续两次列表47/19ms,修订缓存避免每次重新解析清单。
|
||||
15
.planning/session-switch-live-failure/progress.md
Normal file
15
.planning/session-switch-live-failure/progress.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# 工作进度
|
||||
|
||||
- 2026-10-18:用户反馈HTTP改造发布后仍失败;重新打开问题,不再沿用此前完成结论。
|
||||
- 已检查线上脚本与源码一致、新GET路由存在;这些只作为版本证据。
|
||||
- 开始准备生产历史隔离副本和真实浏览器复现场景。
|
||||
|
||||
- 已实现 HTTP 历史/运行快照及订阅工具概要,新增鉴权详情读取,浏览器折叠详情懒建。进入隔离回归;尚未上线。
|
||||
|
||||
- API/真实Firefox回归通过;100个大工具首屏39KB,32KB/s传输下2.3秒显示,工具详情完整且归档后原引用可读。实际最大会话副本由6305982字符降至251096字符,显示416ms。尚未重启/发布。
|
||||
|
||||
- 2026-10-19线上已激活概要化版本,但真实页面仍未通过:请求session-load-1792376826855在02:27:06发出,服务端02:28:25才进入处理并记39ms。存在服务端处理前长等待,恢复实现阶段;不得报完成。
|
||||
- 已修复CPU采样定位的列表解析阻塞,并通过元数据单测、session-preview-metadata并发回归和Firefox完整切换回归(/tmp/cc-web-session-http-xd0sGW)。完整历史大套件60秒到期未跑完,不计全通过。
|
||||
- 运行状态已确认仅当前对话,进入重启与线上实际点击验证。
|
||||
- 线上已重启,真实点击与连续9次并发列表刷新验证通过,分别见/tmp/ccweb-switch-live-AdoSFT/evidence.json及/tmp/ccweb-switch-live-3DL94a/evidence.json。最大会话、当前运行会话及完整工具详情均正常。
|
||||
- 已重新打包Bun baseline单可执行包,MCP初始化冒烟通过。发布包SHA256:ef5801d70fd04737c7c149335967a59b36f2039ab89b1e1bc5612ef997a15d6f。
|
||||
21
.planning/session-switch-live-failure/task_plan.md
Normal file
21
.planning/session-switch-live-failure/task_plan.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# 继续修复会话切换失败
|
||||
|
||||
## 目标
|
||||
定位用户在 HTTP 改造发布后仍然切换失败的实际原因,验证完整的点击、请求、接收、显示和实时订阅链路。
|
||||
|
||||
## 阶段
|
||||
1. [completed] 复现现场会话切换失败并定位阻塞阶段。
|
||||
2. [completed] 修复已复现的根因并覆盖对应回归。
|
||||
3. [completed] 验证实际点击切换与运行态恢复并记录上线条件。
|
||||
|
||||
## 约束
|
||||
- 禁止子代理,不修改其他任务尚未提交的改动。
|
||||
- 不修改生产会话历史;复现使用隔离副本。
|
||||
- 不把 HTTP 200、代码生效或打包通过视作用户问题解决。
|
||||
- 重启前确认除当前对话外无其他运行会话。
|
||||
- 单次测试最多60秒;沿用用户此前打包、提交全部修改并推送的授权,在修复与验证后交付。
|
||||
|
||||
## 已定位
|
||||
- 线上请求在进入HTTP处理函数前排队约79秒,CPU采样指向WebSocket会话列表的快照尾部重复解析。
|
||||
- 修复:归档列表只读元数据,旧快照尾部单次扫描;按磁盘修订缓存列表字段,不重建历史快照。
|
||||
- 已通过高密度嵌套字段、截断边界、并发列表与HTTP切换、真实Firefox回归;线上真实点击3次及并发列表刷新连续切换9次均通过。
|
||||
Reference in New Issue
Block a user