fix: 修复会话归组和文件预览编码
This commit is contained in:
@@ -1 +1 @@
|
||||
subagent-plan-visibility-fix
|
||||
file-preview-encoding
|
||||
|
||||
7
.planning/file-preview-encoding/findings.md
Normal file
7
.planning/file-preview-encoding/findings.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# 调研结论
|
||||
|
||||
- 前端 `openFileBrowserFile` 请求 `/api/fs/read` 后,将 `data.content` 原样写入 `textContent`,渲染层不会制造乱码。
|
||||
- 服务端 `handleFileSystemReadApi` 当前使用 `previewBuffer.toString('utf8')`,无效 UTF-8 字节会变成 U+FFFD。
|
||||
- 截图中的 `<60><><EFBFBD><EFBFBD>` 是典型替换字符,且相邻 ASCII 正常,符合 GBK/GB18030 被当成 UTF-8 解码的特征。
|
||||
- 项目当前只依赖 `echarts` 与 `ws`。Node 的 WHATWG `TextDecoder` 原生支持 `gb18030`,可避免新增包依赖。
|
||||
- `server.js` 与 `scripts/regression.js` 存在其他会话的未提交修改,编码修复必须以小范围追加方式完成。
|
||||
8
.planning/file-preview-encoding/progress.md
Normal file
8
.planning/file-preview-encoding/progress.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# 进度日志
|
||||
|
||||
- 2026-08-07:读取项目规范、Trellis 工作流和计划技能。
|
||||
- 2026-08-07:确认 codebase-memory 索引可用并定位文件预览链路。
|
||||
- 2026-08-07:确认根因是 `/api/fs/read` 固定按 UTF-8 解码。
|
||||
- 2026-08-07:实现代理完成多编码解码和回归测试。
|
||||
- 2026-08-07:实现代理与检查代理均通过专用回归、语法检查和 diff 检查。
|
||||
- 2026-08-07:主代理复跑 `file-preview-encoding` 与 `session-preview-metadata`,均通过。
|
||||
38
.planning/file-preview-encoding/task_plan.md
Normal file
38
.planning/file-preview-encoding/task_plan.md
Normal file
@@ -0,0 +1,38 @@
|
||||
# 任务计划:中文文件预览编码兼容
|
||||
|
||||
## 目标
|
||||
|
||||
修复文件浏览器预览 GBK/GB2312/GB18030 等中文文本时出现替换字符的问题,并保持 UTF-8 与二进制拒绝行为稳定。
|
||||
|
||||
## 当前阶段
|
||||
|
||||
阶段 5:交付
|
||||
|
||||
## 阶段
|
||||
|
||||
- [x] 定位文件预览读取与渲染链路
|
||||
- [x] 补充非 UTF-8 中文文件回归测试
|
||||
- [x] 实现安全的多编码检测与解码
|
||||
- [x] 运行相关测试与静态检查
|
||||
- [x] 执行浏览器回归并复核变更
|
||||
|
||||
## 交付结果
|
||||
|
||||
- 服务端支持 UTF-8、UTF-8/UTF-16 BOM、GB18030(兼容 GBK/GB2312)。
|
||||
- `/api/fs/read` 返回 `encoding`,前端预览元信息展示识别结果。
|
||||
- 二进制 415、路径安全、预览大小限制保持不变。
|
||||
- Trellis 实现与检查代理均未发现明确缺陷。
|
||||
|
||||
## 关键决策
|
||||
|
||||
- 在服务端解码,API 继续返回合法 JSON/Unicode,前端无需猜测原始字节编码。
|
||||
- BOM 优先;无 BOM 时严格验证 UTF-8;无效 UTF-8 回退 GB18030。
|
||||
- 仅对已判定为文本的内容解码,不能放宽二进制文件预览限制。
|
||||
- API 返回实际识别编码,便于诊断,但前端不依赖该字段。
|
||||
|
||||
## 错误记录
|
||||
|
||||
| 错误 | 尝试 | 处理 |
|
||||
|---|---:|---|
|
||||
| codebase-memory `search_code` 返回 `pattern is required` | 1 | 查阅工具 schema 后改用 `pattern` |
|
||||
| 计划补丁未命中模板标题 | 1 | 读取真实模板后精确替换 |
|
||||
29
.planning/fix-session-preview-cwd/findings.md
Normal file
29
.planning/fix-session-preview-cwd/findings.md
Normal 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`。
|
||||
- 现有预览读取用于避免大文件完整解析,修复不应退化成无上限读取整个文件。
|
||||
57
.planning/fix-session-preview-cwd/progress.md
Normal file
57
.planning/fix-session-preview-cwd/progress.md
Normal file
@@ -0,0 +1,57 @@
|
||||
# 进度日志
|
||||
|
||||
## 2026-08-06
|
||||
|
||||
### 建立修复基线并确认大文件元数据解析边界
|
||||
|
||||
- 状态:完成
|
||||
- 工作树基线:干净,`main`,提交 `3ddf21a`。
|
||||
- 已确认用户现场的完整根因链路。
|
||||
- 已确认修改范围为 `server.js` 与回归测试,不修改前端。
|
||||
- 已建立 Trellis 任务 `.trellis/tasks/08-06-fix-session-preview-cwd`。
|
||||
- 计划文档经过独立审查;补齐头尾截断与拼接边界后获批。
|
||||
|
||||
### 编写失败回归覆盖嵌套 cwd 误判
|
||||
|
||||
- 状态:完成
|
||||
- 专项回归目标:`session-preview-metadata`。
|
||||
- 旧实现失败:返回嵌套 `/home/fineui-web-mcp`,未返回尾部顶层 `cwd`。
|
||||
|
||||
### 实现仅解析顶层会话元数据
|
||||
|
||||
- 状态:完成
|
||||
- `readSessionPreview()` 改为独立返回头、尾片段,避免拼接边界伪命中。
|
||||
- 新解析器从头部解析完整顶层前缀,并从尾部验证可独立组成根对象后缀的顶层字段。
|
||||
|
||||
### 运行专项测试并修正边界问题
|
||||
|
||||
- 状态:完成
|
||||
- 主线程复核 `session-preview-metadata` 专项回归通过。
|
||||
- `node --check server.js`、`node --check scripts/regression.js`、`git diff --check` 通过。
|
||||
|
||||
### 运行语法检查与完整回归
|
||||
|
||||
- 状态:完成
|
||||
- 完整回归在 60 秒上限内通过,输出 `Regression checks passed.`。
|
||||
|
||||
### 审查差异及兼容性风险
|
||||
|
||||
- 状态:完成
|
||||
- 独立 Trellis check 未发现阻塞级正确性、性能或兼容性问题。
|
||||
- 非阻塞风险:未来若大幅提高预览字节配置,尾部多候选解析成本会增加。
|
||||
|
||||
### 清理临时跟踪文件并完成交付
|
||||
|
||||
- 状态:完成
|
||||
- 最终专项回归、语法检查、Trellis 上下文校验和差异检查通过。
|
||||
- 临时 TODO CSV 已完成并自动清理。
|
||||
|
||||
## 测试结果
|
||||
|
||||
| 测试 | 预期 | 实际 | 状态 |
|
||||
|---|---|---|---|
|
||||
| 大会话预览专项 | 顶层 cwd 稳定、嵌套 cwd 不污染 | 通过 | ✓ |
|
||||
| server.js 语法 | 无语法错误 | 通过 | ✓ |
|
||||
| regression.js 语法 | 无语法错误 | 通过 | ✓ |
|
||||
| git diff --check | 无空白错误 | 通过 | ✓ |
|
||||
| 完整回归 | 全部回归通过 | `Regression checks passed.` | ✓ |
|
||||
45
.planning/fix-session-preview-cwd/task_plan.md
Normal file
45
.planning/fix-session-preview-cwd/task_plan.md
Normal file
@@ -0,0 +1,45 @@
|
||||
# 任务计划:修复会话归组漂移
|
||||
|
||||
## 目标
|
||||
|
||||
修复大会话文件的预览元数据解析,确保侧栏列表只使用 JSON 顶层 `cwd`,不再被消息或工具调用中的嵌套 `cwd` 污染。
|
||||
|
||||
## 当前阶段
|
||||
|
||||
完成
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [DONE] 建立修复基线并确认大文件元数据解析边界
|
||||
2. [DONE] 编写失败回归覆盖嵌套 cwd 误判
|
||||
3. [DONE] 实现仅解析顶层会话元数据
|
||||
4. [DONE] 运行专项测试并修正边界问题
|
||||
5. [DONE] 运行语法检查与完整回归
|
||||
6. [DONE] 审查差异及兼容性风险
|
||||
7. [DONE] 清理临时跟踪文件并完成交付
|
||||
|
||||
## 完成标准
|
||||
|
||||
- 大于 `CC_WEB_SESSION_META_FULL_PARSE_MAX_BYTES` 的会话文件,列表元数据仍读取顶层 `cwd`。
|
||||
- 消息、工具输入、工具结果中的嵌套 `cwd/projectName` 不影响会话归组。
|
||||
- 顶层 `cwd` 位于尾部预览、嵌套 `cwd` 位于头部预览时仍返回顶层值。
|
||||
- 顶层字段跨预览截断边界或头尾片段不构成完整 JSON 时安全降级,不把两个片段拼成伪字段。
|
||||
- 小文件完整解析路径保持原行为。
|
||||
- 回归测试先能复现旧实现失败,再验证修复通过。
|
||||
- `node scripts/regression.js --target session-preview-metadata`、`server.js` 语法检查、完整回归和 `git diff --check` 通过。
|
||||
|
||||
## 决策
|
||||
|
||||
- 只修服务端元数据读取根因,不在前端增加掩盖性缓存或版本逻辑。
|
||||
- 不依赖 JSON 属性顺序调整作为修复,因为后续对象构造可能再次改变顺序。
|
||||
- 解析异常沿用现有保守降级行为,不让单个坏会话中断整个列表。
|
||||
|
||||
## 错误记录
|
||||
|
||||
| 错误 | 尝试 | 处理 |
|
||||
|---|---:|---|
|
||||
| 暂无 | 1 | — |
|
||||
|
||||
## 已知非阻塞风险
|
||||
|
||||
- 尾部候选字段解析在默认 128KB 预览范围内风险可控;若未来大幅提高 `CC_WEB_SESSION_META_PREVIEW_BYTES`,应同步增加上限或候选尝试限制。
|
||||
Reference in New Issue
Block a user