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,生产请求函数与渲染器保持原样,避免把登录前静态资源超时当作切换失败。
|
||||
|
||||
@@ -57,3 +57,13 @@ Questions to answer:
|
||||
<!-- Component-related mistakes your team has made -->
|
||||
|
||||
(To be filled by the team)
|
||||
|
||||
### MCP 结果组件
|
||||
|
||||
- 渲染 MCP 工具结果前,先区分直接业务对象和 `CallToolResult` 包装;包装结果优先
|
||||
读取 `structuredContent`,缺失或无效时再解析 `content` 中的文本业务 JSON。
|
||||
不应直接用包装对象的 `ok` 判断业务失败。
|
||||
- `isError: true` 表示工具调用失败,不能被内部 `ok: true` 覆盖;保留明确错误消息、
|
||||
未完成时的等待状态和畸形结果的兜底提示。解包限定标准层级,避免循环或递归嵌套。
|
||||
- 行为回归必须使用真实 MCP 包装形状,同时覆盖对象与 JSON 字符串、成功附件与
|
||||
直链图片、业务失败与 MCP 错误;历史回放和实时更新应共用相同的解析及渲染入口。
|
||||
|
||||
@@ -47,7 +47,8 @@ Questions to answer:
|
||||
- 历史游标表示服务端当前记录中尚未展示的消息数量。正数游标可以分页,与外部原始记录是否可确认恢复分开判断。
|
||||
- `historyAvailable=false` 只用于旧历史来源的核实说明,不能阻断已保存消息的正文或用户提问目录请求,也不能据此宣称消息已丢失或无法恢复。
|
||||
- 读取完已保存消息后,游标归零应停止请求;确有旧来源待核实时保留准确说明,正常完整历史不显示该说明。
|
||||
- `resume_generating`是完整运行态快照,以正文及全部工具权威替换当前流式状态,并复用同一逻辑助手气泡;不盲目拼接不同用户任务。
|
||||
- `resume_generating`以完整正文及全部工具概要权威替换当前流式状态,并复用同一逻辑助手气泡;不盲目拼接不同用户任务。普通工具的 `detailRef` 必须跟随运行状态保存,不能在重建工具时丢失。
|
||||
- 折叠工具只构建摘要,首次展开才读取完整详情并构建详情DOM。详情请求单独鉴权、超时、重试,不阻塞会话首屏;切换会话取消详情请求,迟到结果不得修改新视图。工具概要只供显示,禁止回写为完整历史。
|
||||
- 长气泡折叠只改变显示。完整正文保留在原始消息和DOM中;多次原生回复默认收起较早段,末段可见;单次超长回复可展开完整内容。
|
||||
- 折叠状态按会话与稳定消息身份记录;完成、切换和重新渲染不得把被折叠的内容当作已删除内容保存。
|
||||
- 复制按钮与定位、分支同排,仅从完整原始正文中复制最后一个原生回复段。按围栏外的 `agent-message-divider`切分,不以最后自然段或DOM的最后一个p元素判断;代码块、列表保留,时间分隔、工具和按钮不进入剪贴板。没有原生分界时复制整条回复。
|
||||
|
||||
Reference in New Issue
Block a user