- 将 /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% 达标
30 lines
2.4 KiB
Markdown
30 lines
2.4 KiB
Markdown
# 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`(既有测试未改动,仍全绿)。
|