fix: 修复会话归组和文件预览编码
This commit is contained in:
@@ -32,7 +32,11 @@ Questions to answer:
|
||||
|
||||
<!-- Patterns that must always be used -->
|
||||
|
||||
(To be filled by the team)
|
||||
### 部分 JSON 预览
|
||||
|
||||
- 从大会话文件的头部/尾部预览提取元数据时,必须识别 JSON 顶层结构;禁止用“第一个同名键”的正则结果代表顶层字段。
|
||||
- 头部和尾部片段必须独立解析,禁止直接拼接后匹配,避免截断边界组合出文件中不存在的键值。
|
||||
- 预览读取必须保持明确的字节上限;解析失败时按字段缺失安全降级,不能让单个损坏会话中断整个列表。
|
||||
|
||||
---
|
||||
|
||||
@@ -40,7 +44,8 @@ Questions to answer:
|
||||
|
||||
<!-- What level of testing is expected -->
|
||||
|
||||
(To be filled by the team)
|
||||
- 部分 JSON 解析改动必须使用超过完整解析阈值的真实文件夹具,证明测试确实进入预览分支。
|
||||
- 回归至少覆盖:嵌套同名键早于顶层键、顶层键位于尾部、字符串伪键与转义、`null`、字段跨截断边界、头尾拼接伪命中。
|
||||
|
||||
---
|
||||
|
||||
|
||||
3
.trellis/tasks/08-06-fix-session-preview-cwd/check.jsonl
Normal file
3
.trellis/tasks/08-06-fix-session-preview-cwd/check.jsonl
Normal file
@@ -0,0 +1,3 @@
|
||||
{"file":".trellis/spec/backend/index.md","reason":"按后端规范检查改动边界"}
|
||||
{"file":".trellis/spec/backend/quality-guidelines.md","reason":"检查代码质量、测试与兼容性"}
|
||||
{"file":".trellis/tasks/08-06-fix-session-preview-cwd/research/root-cause.md","reason":"核对修复是否覆盖真实故障链路"}
|
||||
@@ -0,0 +1,3 @@
|
||||
{"file":".trellis/spec/backend/index.md","reason":"遵循后端修改入口与项目约束"}
|
||||
{"file":".trellis/spec/backend/quality-guidelines.md","reason":"遵循后端质量与测试要求"}
|
||||
{"file":".trellis/tasks/08-06-fix-session-preview-cwd/research/root-cause.md","reason":"使用已闭环的现场根因和实现边界"}
|
||||
38
.trellis/tasks/08-06-fix-session-preview-cwd/prd.md
Normal file
38
.trellis/tasks/08-06-fix-session-preview-cwd/prd.md
Normal file
@@ -0,0 +1,38 @@
|
||||
# 修复大会话预览 cwd 误读
|
||||
|
||||
## 背景
|
||||
|
||||
大会话文件超过 `CC_WEB_SESSION_META_FULL_PARSE_MAX_BYTES` 后,侧栏列表使用头尾预览和正则提取元数据。当前正则会命中消息或工具调用中的第一个嵌套 `cwd`,导致会话在刷新后归入错误项目;点击会话完整解析后又恢复,形成归组漂移。
|
||||
|
||||
## 目标
|
||||
|
||||
让大会话的列表元数据只读取 JSON 顶层字段,保证刷新、点击和后续状态推送的项目归属一致。
|
||||
|
||||
## 范围
|
||||
|
||||
- 修改 `server.js` 中大会话预览元数据读取逻辑。
|
||||
- 为嵌套 `cwd` 位于顶层 `cwd` 之前的场景增加自动化回归。
|
||||
- 保持小文件完整解析路径、会话加载路径和前端归组逻辑不变。
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不修改项目分组 UI 或 CSS。
|
||||
- 不新增前端缓存、列表版本号或乱序抑制逻辑。
|
||||
- 不迁移、改写或清理现有会话文件。
|
||||
- 不通过调整 JSON 属性顺序掩盖问题。
|
||||
|
||||
## 验收标准
|
||||
|
||||
1. 大文件预览中即使消息工具参数先出现 `cwd=/home/fineui-web-mcp`,列表仍返回顶层 `cwd=/home/上下游协同平台`。
|
||||
2. 嵌套 `projectName`、字符串内容中的伪键和转义字符不污染顶层元数据。
|
||||
3. 顶层字段缺失或为 `null` 时维持现有安全降级语义。
|
||||
4. 顶层 `cwd` 位于尾部预览、嵌套 `cwd` 位于头部预览时仍返回顶层值。
|
||||
5. 顶层字段跨预览截断边界时安全降级;头尾片段不能被错误拼接为伪 JSON 字段。
|
||||
6. 不无上限读取完整大会话文件。
|
||||
7. `node scripts/regression.js --target session-preview-metadata`、完整回归、语法检查和差异检查通过。
|
||||
|
||||
## 约束
|
||||
|
||||
- 保持实现小而可审计,避免引入新的 JSON 解析依赖。
|
||||
- 异常处理不能让一个损坏会话阻断整个 `session_list`。
|
||||
- 代码注释使用简体中文,只解释必要的边界与原因。
|
||||
@@ -0,0 +1,29 @@
|
||||
# 根因证据:大会话预览误读嵌套 cwd
|
||||
|
||||
## 现场
|
||||
|
||||
- 会话 ID:`bf88c202-711a-4f2f-b6e3-b29062f37b20`
|
||||
- 文件大小:909402 bytes
|
||||
- 顶层 `cwd`:`/mnt/e/华电众信/2026/上下游协同平台`
|
||||
- 预览误读 `cwd`:`/mnt/e/我的项目/MCP/fineui-web-mcp`
|
||||
- 第一个错误键来自 `$.messages[28].toolCalls[39].input.arguments.cwd`。
|
||||
|
||||
## 时序
|
||||
|
||||
1. 刷新触发 `sendSessionList()`。
|
||||
2. `loadSessionMetaFromFile()` 因文件超过 512KB 进入预览分支。
|
||||
3. `jsonStringFieldFromPreview()` 以正则命中任意层级第一个 `cwd`。
|
||||
4. 前端 `session_list` 整批替换列表,显示错误项目。
|
||||
5. 点击后 `handleLoadSession()` 完整解析 JSON,发送正确顶层 `cwd`。
|
||||
6. 后续列表推送重复第 1—4 步,产生往返漂移。
|
||||
|
||||
## 推荐修复边界
|
||||
|
||||
只修服务端预览解析,让字段提取具备 JSON 顶层感知能力;不在前端掩盖错误数据。
|
||||
|
||||
## 必测预览边界
|
||||
|
||||
- 头部包含嵌套 `cwd`,尾部包含顶层正确 `cwd`。
|
||||
- 顶层字段跨头部或尾部预览截断边界时安全降级。
|
||||
- 头尾片段拼接处不能组合出不存在的顶层键值。
|
||||
- 专项回归目标:`session-preview-metadata`。
|
||||
30
.trellis/tasks/08-06-fix-session-preview-cwd/task.json
Normal file
30
.trellis/tasks/08-06-fix-session-preview-cwd/task.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"id": "fix-session-preview-cwd",
|
||||
"name": "fix-session-preview-cwd",
|
||||
"title": "修复大会话预览 cwd 误读",
|
||||
"description": "",
|
||||
"status": "completed",
|
||||
"dev_type": null,
|
||||
"scope": "server.js,scripts/regression.js",
|
||||
"package": null,
|
||||
"priority": "P2",
|
||||
"creator": "shiyue",
|
||||
"assignee": "shiyue",
|
||||
"createdAt": "2026-08-06",
|
||||
"completedAt": "2026-08-06T19:46:53+08:00",
|
||||
"branch": null,
|
||||
"base_branch": "main",
|
||||
"worktree_path": null,
|
||||
"commit": null,
|
||||
"pr_url": null,
|
||||
"subtasks": [],
|
||||
"children": [],
|
||||
"parent": null,
|
||||
"relatedFiles": [
|
||||
"server.js",
|
||||
"scripts/regression.js",
|
||||
".trellis/spec/backend/quality-guidelines.md"
|
||||
],
|
||||
"notes": "",
|
||||
"meta": {}
|
||||
}
|
||||
4
.trellis/tasks/08-07-file-preview-encoding/check.jsonl
Normal file
4
.trellis/tasks/08-07-file-preview-encoding/check.jsonl
Normal file
@@ -0,0 +1,4 @@
|
||||
{"file":".trellis/spec/backend/index.md","reason":"后端检查入口规范"}
|
||||
{"file":".trellis/spec/backend/quality-guidelines.md","reason":"验证测试覆盖与质量"}
|
||||
{"file":".trellis/spec/backend/error-handling.md","reason":"验证 API 错误行为"}
|
||||
{"file":".trellis/tasks/08-07-file-preview-encoding/prd.md","reason":"逐条核验验收标准"}
|
||||
@@ -0,0 +1,4 @@
|
||||
{"file":".trellis/spec/backend/index.md","reason":"后端开发入口规范"}
|
||||
{"file":".trellis/spec/backend/quality-guidelines.md","reason":"回归测试和代码质量要求"}
|
||||
{"file":".trellis/spec/backend/error-handling.md","reason":"API 错误行为要求"}
|
||||
{"file":".trellis/tasks/08-07-file-preview-encoding/prd.md","reason":"本任务需求与验收标准"}
|
||||
21
.trellis/tasks/08-07-file-preview-encoding/prd.md
Normal file
21
.trellis/tasks/08-07-file-preview-encoding/prd.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# 中文文件预览编码兼容
|
||||
|
||||
## 背景
|
||||
|
||||
文件浏览器预览部分历史 C# 源文件时,ASCII 内容正常但中文注释显示为 `<60>`。这些文件通常使用 GBK、GB2312 或 GB18030,而当前服务端固定按 UTF-8 解码。
|
||||
|
||||
## 验收标准
|
||||
|
||||
1. UTF-8(含中文)保持正确显示。
|
||||
2. UTF-8 BOM、UTF-16LE BOM、UTF-16BE BOM 能正确预览,且正文不显示 BOM。
|
||||
3. GBK/GB2312/GB18030 中文文本能正确预览。
|
||||
4. API 返回实际识别编码,便于定位异常文件。
|
||||
5. 二进制文件仍返回 415,不因编码回退被误判为文本。
|
||||
6. 预览大小限制和路径安全逻辑不变。
|
||||
7. 增加端到端回归测试,覆盖 UTF-8、GB18030 与二进制拒绝。
|
||||
|
||||
## 非目标
|
||||
|
||||
- 不修改源文件编码。
|
||||
- 不在前端增加手动编码选择器。
|
||||
- 不引入新的生产依赖。
|
||||
26
.trellis/tasks/08-07-file-preview-encoding/task.json
Normal file
26
.trellis/tasks/08-07-file-preview-encoding/task.json
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"id": "file-preview-encoding",
|
||||
"name": "file-preview-encoding",
|
||||
"title": "兼容中文文件预览编码",
|
||||
"description": "",
|
||||
"status": "in_progress",
|
||||
"dev_type": null,
|
||||
"scope": null,
|
||||
"package": null,
|
||||
"priority": "P2",
|
||||
"creator": "shiyue",
|
||||
"assignee": "shiyue",
|
||||
"createdAt": "2026-08-07",
|
||||
"completedAt": null,
|
||||
"branch": null,
|
||||
"base_branch": "main",
|
||||
"worktree_path": null,
|
||||
"commit": null,
|
||||
"pr_url": null,
|
||||
"subtasks": [],
|
||||
"children": [],
|
||||
"parent": null,
|
||||
"relatedFiles": [],
|
||||
"notes": "",
|
||||
"meta": {}
|
||||
}
|
||||
Reference in New Issue
Block a user