Ver código fonte

docs: 归档未完成事项(群聊落 Matrix / 移动端群聊 / 附件上传 / 本地线上一致性)

Co-Authored-By: Claude Code <noreply@anthropic.com>
Huccct 1 dia atrás
pai
commit
a85ae7155d

+ 11 - 0
docs/00-tracking/操作追踪.md

@@ -6390,3 +6390,14 @@ emoji 工具行豁免「孤立单步内联」规则(始终成组折叠,否
 1. **群聊历史不跨设备**:群聊消息存在浏览器 localStorage,换设备或清缓存后进群是空的(本次实测即如此)。这是已有设计,不在本次改动范围。
 2. **跨域限制**:从 `127.0.0.1` 直连时,`server.fmode.cn` 对 `X-Parse-Application-Id` 有 CORS 限制,部分云函数在本地静态服务下不可用;正式域名部署不受影响。
 3. 未测试:多容器同时回复时的并发渲染、附件上传全链路、移动端。
+
+## 2026-11-06 · 提交本轮改动 + 未完成事项归档
+
+- **提交**:`14c6028 feat(chat): 群聊桌面端 + 会话右栏统一 + 会话恢复修复`(256 文件,+30298/−6908,未 push)
+- **忽略**:临时调试产物目录(`.tmp-*/`,含截图与抓取快照)加入 `.gitignore`
+- **待办归档**:`docs/02-design/plans/2026-11-06-群聊落库与移动端待办.md`
+- **待办摘要**:群聊消息落 Matrix(三方案待裁决)· 移动端消息页缺群聊分组 · 群聊附件上传未接 ·
+  本地测试与线上一致性(CORS / 登录)· 多容器并发回复等补测项
+- **核实修正**:上一轮记的「移动端不列群聊」表述不准 —— `mobile-chat-view` 已有 `groupSessions()`,
+  是「消息」页模板没渲染该分组
+- **安全事项**:两份 `docs/03-interface/` 文档含明文 FMODE_SESSION_TOKEN(已在历史中),已列入待排期

+ 104 - 0
docs/02-design/plans/2026-11-06-群聊落库与移动端待办.md

@@ -0,0 +1,104 @@
+# 未完成事项与后续计划(2026-11-06)
+
+> 来源:2026-11-06 真实账号测试(用户9836)后的复盘 + 用户提出的四项要求。
+> 对应提交:`14c6028 feat(chat): 群聊桌面端 + 会话右栏统一 + 会话恢复修复`
+> 追踪记录:`docs/00-tracking/操作追踪.md` 中 2026-11-06 的三条条目。
+
+---
+
+## 一、▶ 下一步优先事项(用户明确要求)
+
+### P0-1 群聊数据落 Matrix,前台加载渲染
+
+**诉求**:参考单聊的做法,让群聊消息存进 Matrix,换设备/清缓存后仍能加载出来。
+
+**现状(核实到行)**
+
+| 项 | 现在 | 位置 |
+|---|---|---|
+| 单聊消息 | Matrix 房间 timeline,按 `threadId` 过滤渲染 | `chat.service.ts#openReal` → `mapTimeline` |
+| 单聊历史 | 服务端 timeline 分页(`paginate`) | `chat.service.ts` |
+| 群聊消息 | **只存 localStorage**,按会话 id 分组 | `core/group-store.service.ts` |
+| 群聊历史 | 无(本地没有就是空) | — |
+| 群会话元信息 | 已在云端 `FmodeChatThread`(`kind` / `memberIds` 字段) | `chat-session.service.ts#hydrateOnce` |
+
+**关键难点:伪群聊没有自己的房间**
+
+群聊是把一条用户消息拆成 N 条私聊,分别发进**各容器自己的 DM 房间**(ADR-007)。
+所以群聊的「消息」天然散落在 N 个房间的 timeline 里,owner 各自不同 ——
+没有一个天然的「群时间线」。
+
+**可选方案(需用户裁决走哪条)**
+
+| 方案 | 做法 | 代价 | 风险 |
+|---|---|---|---|
+| **A. 各房间按 turnId 回捞**(推荐) | 进入群聊时,按成员逐个打开房间 timeline,用 `dispatch` 元数据里的 `groupId` / `turnId` 过滤出属于本群的事件,按时间合并 | 无需后端改动;与单聊同一套 Matrix 数据源 | 进入群聊要拉 N 个房间;消息量随时间增长;`m.dispatch` 元数据必须一直写在事件里(现在已写) |
+| B. 建一个真实群房间 | 为每个伪群聊建一个 Matrix 房间,用户消息也往群里发一份(只作记录) | 前台渲染统一;历史天然按房间分页 | 容器可能对群房间消息也做出响应 → 需要确认容器侧行为,否则会「抢答」 |
+| C. 保留本地 + 云端快照 | 群消息继续本地存,另外定期把整段消息 upsert 到云端表 | 改动最小 | 又回到「两份数据」的老问题;长消息存不下 |
+
+**不做**的:把群聊改成真 Matrix 群(涉及容器侧行为与 ADR-007 裁决变更,需另开决策记录)。
+
+---
+
+### P0-2 移动端「消息」页不显示群聊
+
+**现状(已核实)**:`core/mobile-chat-view.service.ts` **已经产出** `groupSessions()` 分组,
+但 `mobile/pages/messages/messages.ts` 的模板只渲染了「工作区」与「全部会话」两种视图,
+**没有渲染群聊分组**。抽屉里能看到群聊,主列表看不到。
+
+**要做的**
+
+1. 「消息」页增加「群聊」分组(与桌面左栏同构:图标 + 计数 + 新建入口)
+2. 移动端群聊页 `mobile/pages/group-chat` 与桌面页对齐:右栏能力(移动端用抽屉/底部面板)、
+   回合渲染、@ 候选、贴底滚动
+3. 移动端群聊页同样切换群即时刷新(桌面已修,移动端仍读 `route.snapshot`)
+
+---
+
+### P0-3 群聊附件上传
+
+**现状**:桌面群聊页与移动群聊页的 `app-composer` **都没有接 `attach` 事件**,
+`sendToAgent()` 只发文本(`chat.service.ts:839`)。单聊的附件链路是
+`stageFiles → sendText → 上传 → mx.sendFile()`,群聊完全没有。
+
+**要做的**
+
+1. `ChatService` 增加群聊发附件的入口:对每个目标容器调用
+   `mx.sendFile(rid, blob, card, threadRoot, lastEventId)`(同一份 blob,N 次上传)
+2. 群聊页接上 `(attach)`、待发附件条、上传进度
+3. 群消息里的附件要能被群渲染层识别(`m.image` / `m.file` 已在 `mapTimeline` 处理,
+   群聊回捞时复用同一映射)
+
+---
+
+### P0-4 本地测试与线上一致
+
+**本轮回测暴露的差异(逐条处置)**
+
+| 差异 | 影响 | 处置 |
+|---|---|---|
+| 本地静态服务直连 `server.fmode.cn`,部分接口被 CORS 挡(`X-Parse-Application-Id` 预检失败) | 本地跑不出与线上一致的目录/成果数据 | 用 Angular `proxy.conf.js` 代理 `/api` 与 `/parse`,本地同源;或用正式域名部署后测试 |
+| 本地登录要走「Token 直登」手工粘贴 | 无法自动化 | 增加仅开发环境可用的「CI 登录」入口(从环境变量读 token),生产构建裁剪掉 |
+| 演示态(`useMockData`)与真实态行为有分叉 | Mock 测过的能力不代表线上 | 关键路径(会话恢复、贴底、附件)必须真实账号复测;Mock 只做 UI 结构回归 |
+
+---
+
+## 二、本轮测试未覆盖、需要补测的项
+
+| 项 | 说明 | 建议验证方式 |
+|---|---|---|
+| 多容器同时回复 | 群里 @ 两个容器,两个同时流式输出时的渲染与排序 | 真实账号,群里 `@A @B 各说一句` |
+| 回复过程中上翻历史 | 容器持续输出时用户上翻,不能被强行拽回底部 | 真实账号,长回复期间滚动 |
+| 附件全链路 | 上传进度 → 发出 → 对方收到 → 群/单聊两侧渲染 → 右栏「文件」汇总 | 真实账号,传图片/PDF/表格各一 |
+| 移动端 | 消息页、群聊页、单聊页在 iPhone 视口下的三态与遮挡 | Playwright iPhone 视口 + 真机抽查 |
+| 深链刷新 | 直接打开 `/desktop/group/:id` 刷新 | 已在桌面群聊验证,移动端待验 |
+
+---
+
+## 三、已知问题(不在本轮范围,但需排期)
+
+1. **明文令牌**:`docs/03-interface/reporter部署方案-20261020.md:82` 与
+   `docs/03-interface/容器初始化流程优化建议-20261020.md:379` 含明文 `FMODE_SESSION_TOKEN`,
+   且已在 git 历史中。需要:轮换该 token + 从文档中移除 + 历史处理(filter-repo 或接受历史)。
+2. 群聊右栏宽度:桌面已可拖,移动端没有对应能力。
+3. `docs/` 中部分云函数契约文档未经核对(见 CLAUDE.md「待确认项」)。