fix: 修复会话归组和文件预览编码

This commit is contained in:
shiyue
2026-08-07 10:54:08 +08:00
parent 3ddf21af85
commit 5ad2839b2c
21 changed files with 765 additions and 42 deletions

View File

@@ -0,0 +1,29 @@
# 调研结论
## 用户可见现象
- 同一会话 `bf88c202-711a-4f2f-b6e3-b29062f37b20` 刷新后归入 `fineui-web-mcp`。
- 点击后同一会话回到正确的 `上下游协同平台`。
- 后续 `session_list` 推送会再次把它归入错误分组。
## 已证实根因
- 目标会话文件为 909402 bytes,超过默认 512KB 完整元数据解析阈值。
- 大文件路径通过 `readSessionPreview()` 读取头尾片段。
- `jsonStringFieldFromPreview()` 用正则匹配第一个同名键,不识别 JSON 层级。
- 文件中首次出现的 `cwd` 位于消息工具调用 `fastctx.run` 的参数内,值为 `/mnt/e/我的项目/MCP/fineui-web-mcp`。
- 真正的顶层 `cwd` 是 `/mnt/e/华电众信/2026/上下游协同平台`。
- 刷新使用错误的预览元数据;点击使用完整 JSON,因此出现往返漂移。
## 代码边界
- 根因位置:`server.js` 的预览字段读取与 `loadSessionMetaFromFile()` 大文件分支。
- 消费链路:`sendSessionList()` → 前端 `session_list` 整批替换 → `groupSessionsByProject()`。
- 点击恢复链路:`handleLoadSession()` 完整解析 → `session_info` → `mergeSessionListSnapshot()`。
- 前端按收到的数据正确渲染,不属于本次修改范围。
## 风险点
- 不能仅把顶层 `cwd` 移到 `messages` 前面,这依赖属性顺序且不能解决其他顶层字段误读。
- 必须覆盖字符串转义、嵌套对象/数组、头尾拼接边界、缺失字段和 `null`。
- 现有预览读取用于避免大文件完整解析,修复不应退化成无上限读取整个文件。