- 将 /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% 达标
2.4 KiB
2.4 KiB
Task 4 报告:前端 chat_ws.js 实时渲染进度/错误
- 状态:完成
- commit 短哈希:
14a7dc3 - 分支:
feat/websocket-progress
改动清单
- 新增
src/genesis/server/static/chat_ws.js(UMD,带异常保护,照抄任务规格)。 src/genesis/server/app.py在chat_state_js路由之后新增GET /chat_ws.js路由(仿/chat_state.js,使用已有的FileResponse、_error、static_dir)。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)守卫,不抛错;持久化 + 重载兜底仍可见进度。
- 在
- 新增
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}/wsWebSocket 端点已由本分支既有代码实现(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(既有测试未改动,仍全绿)。