修复会话切换兼容并重新打包发布
This commit is contained in:
10
.planning/full-outline-history/findings.md
Normal file
10
.planning/full-outline-history/findings.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# 发现记录
|
||||
|
||||
## 2026-09-13
|
||||
|
||||
- “定位”按钮对应 `user-outline-panel`;`buildUserOutlineItems()` 当前只扫描 `messagesDiv.querySelectorAll('.msg.user[data-message-id]')`,因此只包含已渲染的最近消息。
|
||||
- `session_info` 已携带 `historyCursor` / `historyTotal`,服务端 `load_history_page` 可按 `before` 返回旧消息页;现有前端收到该响应后会无条件 `prependHistoryMessages()`,所以不能直接用现有手动分页状态填充定位列表。
|
||||
- 旧消息点击定位需要同时处理两类目标:已渲染消息直接滚动;未渲染消息先通过消息索引加载对应页,再将聊天区滚动到目标。完整索引缓存不能依赖 DOM 元素 ID。
|
||||
- 定位面板本身已有独立 `max-height` 和 `overflow-y: auto`,不会因为完整索引而扩大聊天区;需要保留该隔离边界。
|
||||
- 旧消息点击定位使用独立的 `load_history_page` 目标页请求:按消息索引只取包含目标的一页,进入聊天区后再滚动到目标;完整定位索引请求只保存用户消息摘要,不渲染旧消息。
|
||||
- `session_history_chunk` 当前按 `activeHistoryPageRequest` 分支后统一调用 `prependHistoryMessages()`;独立定位请求必须用独立 request 状态在该分支前截获,否则会破坏“隐藏历史不占聊天空间”的要求。
|
||||
19
.planning/full-outline-history/progress.md
Normal file
19
.planning/full-outline-history/progress.md
Normal file
@@ -0,0 +1,19 @@
|
||||
# 进度日志
|
||||
|
||||
## 2026-09-13
|
||||
|
||||
- 已定位问题:定位列表只读当前聊天 DOM,45 条窗口之外的旧用户消息被完全遗漏。
|
||||
- 已确认修复边界:完整历史只进入独立索引;聊天 DOM 和消息滚动空间保持最近窗口策略。
|
||||
- 已确认旧条目点击应走独立目标页请求;完整定位请求必须在 `session_history_chunk` 中提前截获,避免调用 `prependHistoryMessages`。
|
||||
- 新增失败回归:要求独立定位索引状态、分页请求函数、旧页拦截分支和按 `data-message-index` 定位入口;修改前按预期失败。
|
||||
- 已实现摘要索引、定位专用分页请求、旧页不渲染分支、面板加载/重试状态,以及隐藏条目按消息索引重新加载。
|
||||
- 全量 `npm run regression` 首次因历史处理器回归夹具缺少新状态桩失败,已补齐夹具;第二次完整回归通过。
|
||||
- 旧条目点击使用独立 `load_history_page` 目标页请求,只在用户明确点击时把目标所在页加载进聊天区;定位列表后台索引不会改变聊天 DOM 高度。
|
||||
- 最终验证通过:`npm run regression`、`node --check public/app.js`、`node --check scripts/regression.js`、`git diff --check`。
|
||||
- 目标页响应与完整定位分页均按独立 requestId 分支处理;断线和错误会清理悬挂请求,避免后续历史响应误消费。
|
||||
- 补齐无近期用户消息的边界:只要仍有可用旧历史,定位按钮保持可打开,以便触发完整索引分页。
|
||||
- 根据实际截图修正历史入口布局:`history-load-more` 移入 `#messages` 的首位,初始停在底部时不悬浮;滚到消息顶部才显示,继续滚动时随内容离开。
|
||||
- 为消息重绘和历史前插补充控件保留/插入锚点,避免重绘时丢失历史入口或把消息插到控件上方。
|
||||
- 用户进一步明确交互:不是“跟历史内容一起在当前视口显示”,而是“仅作为消息内容首行,滚到最顶才露出”;当前 DOM/CSS 已按此语义实现。
|
||||
- 运行中服务静态核验通过:`/app.js` 含定位目标页逻辑,`/index.html` 使用 `20260913-history-control-position` 样式版本,刷新即可生效。
|
||||
- 临时 `补齐定位列表完整历史 TO DO list.csv` 已清理;计划文件保留用于追踪本次设计决策。
|
||||
49
.planning/full-outline-history/task_plan.md
Normal file
49
.planning/full-outline-history/task_plan.md
Normal file
@@ -0,0 +1,49 @@
|
||||
# 补齐定位列表的完整历史索引
|
||||
|
||||
## 目标
|
||||
|
||||
让“定位”列表展示当前会话的全部用户消息,即使聊天区只保留最近 45 条用于显示;旧消息只进入定位索引,不重新插入聊天 DOM,也不额外占用聊天滚动空间。
|
||||
|
||||
## 阶段
|
||||
|
||||
| 阶段 | 状态 | 验收标准 |
|
||||
|---|---|---|
|
||||
| 1. 核对定位列表与历史分页的数据链路 | complete | 明确当前定位数据仅来自 DOM,并确认可复用的历史分页响应 |
|
||||
| 2. 补充完整定位索引的失败回归 | complete | 回归能证明隐藏旧消息时定位列表仍应获得完整用户消息 |
|
||||
| 3. 增加独立的定位历史索引缓存 | complete | 打开定位列表时可按页读取完整历史,且不改变聊天消息 DOM |
|
||||
| 4. 支持旧消息定位加载与滚动 | complete | 点击未渲染旧消息会按消息索引加载所需页并滚动到目标 |
|
||||
| 5. 运行定向回归、语法和差异检查 | complete | 定向回归、JS 语法检查、git diff --check 全部通过 |
|
||||
| 6. 清理临时记录并交付修改结果 | complete | TODO CSV 删除,明确完整列表与聊天空间隔离的实现和验证结果 |
|
||||
|
||||
## 机器可读阶段状态
|
||||
|
||||
### Phase 1:核对定位列表与历史分页的数据链路
|
||||
**Status:** complete
|
||||
|
||||
### Phase 2:补充完整定位索引的失败回归
|
||||
**Status:** complete
|
||||
|
||||
### Phase 3:增加独立的定位历史索引缓存
|
||||
**Status:** complete
|
||||
|
||||
### Phase 4:支持旧消息定位加载与滚动
|
||||
**Status:** complete
|
||||
|
||||
### Phase 5:运行定向回归、语法和差异检查
|
||||
**Status:** complete
|
||||
|
||||
### Phase 6:清理临时记录并交付修改结果
|
||||
**Status:** complete
|
||||
|
||||
## 关键决策
|
||||
|
||||
- 不改变聊天区“最近 45 条 + 手动回看”的显示策略。
|
||||
- 不把定位列表的完整历史通过隐藏 DOM 塞进消息滚动区;旧消息只保存在轻量索引对象中。
|
||||
- 复用 `load_history_page` 的现有分页协议,新增请求标识分支,避免与用户点击“查看更早消息”的聊天分页互相抢状态。
|
||||
|
||||
## 错误记录
|
||||
|
||||
| 错误 | 尝试 | 处理 |
|
||||
|---|---|---|
|
||||
| 定向历史回归按预期失败:缺少 `currentOutlineHistoryState` | 1 | 证明旧实现没有独立定位索引;已补充失败契约后进入实现 |
|
||||
| 全量回归提取历史处理器时报 `activeOutlineHistoryRequest is not defined` | 1 | 为现有历史处理器回归夹具补充独立定位状态和合并函数桩;随后全量回归通过 |
|
||||
Reference in New Issue
Block a user