|
|
@@ -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「待确认项」)。
|