fix: 消除会话列表解析阻塞并按需加载工具详情
This commit is contained in:
@@ -12,6 +12,7 @@
|
||||
```text
|
||||
GET /api/sessions/:id?requestId=<id>
|
||||
GET /api/sessions/:id/history?before=<非负整数>&requestId=<id>
|
||||
GET /api/sessions/:id?toolDetail=<JSON详情引用>&requestId=<id>
|
||||
Authorization: Bearer <已有登录令牌>
|
||||
|
||||
handleSessionQueryApi(req, res, url, encodedId, historyPage = false)
|
||||
@@ -29,11 +30,20 @@ WS ← { type: 'session_subscribed', sessionId, requestId, historyRevision, hist
|
||||
- 两者都提供 `sessionId/requestId/messages/historyTotal/historyBaseIndex/historyCursor/`
|
||||
`historyAvailable/historySource/historyRevision`;`requestId` 最多160字符,浏览器生成
|
||||
有界且唯一的代次标识,成功响应必须同时匹配会话和请求。
|
||||
- 首屏的 `runtime` 是完整 `resume_generating` 快照或 `null`,即使没有 WebSocket
|
||||
也能显示已产生输出。停止运行但尚未归档的保留态显示后须收束生成状态。
|
||||
- 首屏的 `runtime` 是 `resume_generating` 快照或 `null`,即使没有 WebSocket
|
||||
也能显示已产生正文和全部工具概要。停止运行但尚未归档的保留态显示后须收束生成状态。
|
||||
- 首屏、分页及订阅恢复中,普通工具只传概要和 `detailRef`,不携带完整输入输出。
|
||||
工具详情独立通过已鉴权 HTTP 读取,响应为 `session_tool_detail` 和完整 `tool`。
|
||||
引用绑定会话、消息身份、工具位置/ID和内容摘要;运行引用另绑定回合对象的唯一作用域。
|
||||
历史内容变更返回409,不能用错误位置冒充原工具;运行结束后可按助手消息身份读取归档。
|
||||
计划、协作状态、提问和图片等直接显示的工具保留完整载荷。存储内容不受概要传输影响。
|
||||
- HTTP 只读取 cc-web 自身已保存记录;首屏不扫描原生日志、不协调跨会话、不清未读。
|
||||
归档按块有界读取;旧快照保留来源待核实状态。磁盘和 JSON 处理仍在同一服务进程,
|
||||
传输拆分不代表所有同步 IO 已异步化。
|
||||
- 会话列表优先读取归档元数据,禁止为刷新列表读取正文块或重建快照。
|
||||
列表字段按归档修订及快照文件状态缓存,标题、未读和目标更新后立即失效。
|
||||
大旧快照只扫描有界头尾;尾部从根对象结束符反向单次扫描完整顶层字段,
|
||||
禁止对每个嵌套id/title候选重复解析整个后缀,否则会阻塞同进程的HTTP请求。
|
||||
- 订阅校验元数据、绑定实时输出、清未读并冲刷已有跨会话回复,不发送历史消息。
|
||||
比较清未读前的归档修订;有差异时由浏览器再通过 HTTP 对账。确认后返回清未读
|
||||
产生的新修订,避免元数据保存导致重复对账。
|
||||
@@ -56,6 +66,8 @@ WS ← { type: 'session_subscribed', sessionId, requestId, historyRevision, hist
|
||||
| URI 解码失败或 ID 含字母数字、连字符之外字符 | 400 `history_invalid_id`;不得清洗后别名到另一会话 |
|
||||
| 游标为负数、小数或非安全整数 | 400 `history_invalid_cursor` |
|
||||
| 会话确实缺失 | 404 `session_not_found` |
|
||||
| 工具详情引用格式错误或跨会话 | 400 `tool_detail_invalid` |
|
||||
| 引用对应工具已变更或不再存在 | 409 `tool_detail_changed` |
|
||||
| 元数据、清单或历史块读取失败 | 500 `history_read_failed`,禁止吞成404 |
|
||||
| 实时绑定失败 | WS `session_subscribe_failed`,历史继续可读 |
|
||||
| 新选择取消、迟到响应或不匹配订阅 | 不修改新视图及其加载状态 |
|
||||
@@ -79,6 +91,13 @@ WS ← { type: 'session_subscribed', sessionId, requestId, historyRevision, hist
|
||||
- `node scripts/session-http-load-regression.js --browser`:真实 Firefox 经转发层测试
|
||||
假 OPEN、读取途中断 WS、完全断连后切换、分页、迟到 A 响应、完成间隙及历史500。
|
||||
断言浏览器不发送 `load_session/load_history_page/resume_session` 查询历史。
|
||||
- 同一浏览器回归还覆盖32KB/s传输下100个大工具的首屏、折叠工具不构建详情DOM、
|
||||
展开完整详情,以及运行工具完成归档后继续使用原引用读取详情。接口回归比较原始输入输出,
|
||||
检查概要字节数、跨会话/过期引用、鉴权,以及订阅不能再重发大工具结果。
|
||||
- `node scripts/session-metadata-unit.js`:高密度嵌套伪字段的解析次数有界、转义与截断边界、
|
||||
缺失/损坏快照仍从归档列举、不读正文不写快照、归档修订更新使缓存失效。
|
||||
- `node scripts/regression.js --target session-preview-metadata`:大旧快照的顶层元数据正确,
|
||||
WebSocket刷新列表与HTTP首屏并发时,HTTP读取不能因列表解析排队数秒。
|
||||
- 外部 CDN 不稳定时可设置 `CC_WEB_BROWSER_CDN_DIR`,使用与页面相同版本的原始
|
||||
`marked.min.js/highlight.min.js/mermaid.min.js/atom-one-dark.min.css` 本地夹具;仅转发层
|
||||
改写这些静态 URL,生产请求函数与渲染器保持原样,避免把登录前静态资源超时当作切换失败。
|
||||
|
||||
Reference in New Issue
Block a user