fix(websocket): 修复 app.py 不可导入并新增真实链路验证

- 将 /api/sessions/{sid}/ws 端点移入 create_app(此前置于模块级导致整模块 import NameError,回归被验证拦截)
- register_loop + subscribe 调整至 accept 之前,缩小连接已开但未订阅期间的进度丢失窗口
- 新增 tests/test_verify_ws_real_flow.py:驱动真实 HTTP 聊天流程断言 WS 收到 agent 实际发射的 parse/impact 进度
- 同步 WebSocket 计划文档 Task 3 代码片段(标注端点必须位于 create_app 内)
- 全量 pytest 实测 583 passed / 99.03% 达标
This commit is contained in:
lhl
2026-08-29 14:36:12 +08:00
parent 9f5342e2be
commit 80daadcd31
11 changed files with 383 additions and 39 deletions
@@ -0,0 +1,29 @@
# Task 4 报告:前端 chat_ws.js 实时渲染进度/错误
- **状态**:完成
- **commit 短哈希**`14a7dc3`
- **分支**`feat/websocket-progress`
## 改动清单
1. 新增 `src/genesis/server/static/chat_ws.js`(UMD,带异常保护,照抄任务规格)。
2. `src/genesis/server/app.py``chat_state_js` 路由之后新增 `GET /chat_ws.js` 路由(仿 `/chat_state.js`,使用已有的 `FileResponse``_error``static_dir`)。
3. `src/genesis/server/static/chat.html` 集成:
-`<script src="/chat_state.js">` 之后紧邻加 `<script src="/chat_ws.js"></script>`
- 会话状态变量处声明 `let progressWs = null;`
- `send()` 中:首条消息建会话成功后、以及已有 `sid` 的重发路径,均在确认 `sid` 非 null 后打开 WS(先关闭旧连接)。
- `loadSession(id)` 成功取得会话(`sid = id` 之后)打开对应 sid 的 WS(先关闭旧连接)。
- `newSession()` 开头关闭并置空旧连接。
- `connectProgressWs` 返回 `null` 时由 `if (progressWs)` 守卫,不抛错;持久化 + 重载兜底仍可见进度。
4. 新增 `tests/test_chat_ws.js`Node 单测,照抄任务规格)。
## 疑虑与确认
- **植入点准确性**
- `send()`WS 打开放在 `if (!sid) { ...新建会话... }` 块结束之后、`inputEl.value=''` 之前,确保首条与续发都覆盖。✅
- `loadSession()`:放在 `sid = id; ...; badge.textContent=...` 之后、`const msgs = await ...` 之前,即会话已落到 `sid` 后。✅
- `newSession()`:放在函数最开头 `sid = null` 之前,确保切换/新建时关闭旧连接。✅
- **addMsg 是否支持 progress/error 样式**:已支持。chat.html 中 `.msg.progress .bubble`(220-222 行,蓝色虚线灰条)与 `.msg.error .bubble`223 行,红条)样式已存在;`loadSession` 历史渲染也已用 `addMsg(role, ...)` 复用同样类名(790-792 行)。新增 WS 实时消息直接复用 `addMsg(role, text)`,样式一致,**未新增任何样式**。✅
- 后端 `/api/sessions/{sid}/ws` WebSocket 端点已由本分支既有代码实现(app.py 约 309 行),本任务未改动其 Python 逻辑。
## 测试输出
- Node 单测:`node --test tests/test_chat_ws.js``tests 2 ... pass 2 ... fail 0`2 passed)。
- 后端冒烟:`python -m pytest tests/test_server_chat_api.py -q -o addopts=""``6 passed, 1 warning`(既有测试未改动,仍全绿)。