Files
lhl 80daadcd31 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% 达标
2026-08-29 14:36:12 +08:00

2.4 KiB
Raw Permalink Blame History

Task 4 报告:前端 chat_ws.js 实时渲染进度/错误

  • 状态:完成
  • commit 短哈希14a7dc3
  • 分支feat/websocket-progress

改动清单

  1. 新增 src/genesis/server/static/chat_ws.jsUMD,带异常保护,照抄任务规格)。
  2. src/genesis/server/app.pychat_state_js 路由之后新增 GET /chat_ws.js 路由(仿 /chat_state.js,使用已有的 FileResponse_errorstatic_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.jsNode 单测,照抄任务规格)。

疑虑与确认

  • 植入点准确性
    • 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 .bubble223 行,红条)样式已存在;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.jstests 2 ... pass 2 ... fail 02 passed)。
  • 后端冒烟:python -m pytest tests/test_server_chat_api.py -q -o addopts=""6 passed, 1 warning(既有测试未改动,仍全绿)。