08feae8bef
落地 H5 Session 架构 Patch 1–5(Broker 收口、Router decision、SSE taxonomy、goosed 边界检查), 并新增可选 MEMIND_RUN_STREAM_REPLAY run 事件回放与 H5 假交付 guard;修复 Finish 先于 agent-run gate 导致 UI 永久 loading 的竞态,接入 verify:h5-session-patches 回归脚本。 Co-authored-by: Cursor <cursoragent@cursor.com>
2.0 KiB
2.0 KiB
Patch 4b:Run SSE Replay(进行中,禁止合并 main / 上 103)
状态:代码 + 单测已完成(2026-07-06);Finish 竞态见 h5-finish-before-run-gate-20260706.md。禁止 merge main / 上 103。
目标
解决 H5 run SSE 重连丢状态问题:
- 使用已有
h5_agent_run_events.id作为 SSEid:cursor - 客户端
Last-Event-ID重连后从 DB 补发 missed events - 状态变更时写入
run_snapshot事件,保证 sessionId 回填可回放
开关
# 服务端(默认 0 = 旧 poll-only 行为)
MEMIND_RUN_STREAM_REPLAY=1
# 本地验证
MEMIND_RUN_STREAM_REPLAY=1 pnpm dev
客户端 subscribeAgentRunEvents 已支持 Last-Event-ID + 断线重连(与 session stream 一致)。
改动文件
| 文件 | 说明 |
|---|---|
agent-run-stream.mjs |
replay 纯函数、flag |
agent-run-gateway.mjs |
listRunEventsForUser、appendRunSnapshot |
agent-run-routes.mjs |
replay 模式 SSE handler |
src/api/client.ts |
run SSE Last-Event-ID + 重连 |
agent-run-stream.test.mjs |
单测 |
agent-run-routes.test.mjs |
replay SSE handler 用例 |
agent-run-gateway.test.mjs |
replay cursor / cursorMiss / run_snapshot 用例 |
2026-07-06 补充
- 修复
listRunEventsForUser误返回cursorMiss: false( staleLast-Event-ID无法触发全量补发) - gateway 新增 3 项 replay 单测(51 pass 合计)
本地测试清单(合并/发布前必跑)
npm run verify:h5-session-patches
# 或分项:
node --test agent-run-stream.test.mjs agent-run-routes.test.mjs agent-run-gateway.test.mjs
npm run verify:goosed-proxy-boundary
手工:
MEMIND_RUN_STREAM_REPLAY=1 pnpm dev- 发起 agent run,DevTools 观察
/agent/runs/:id/events含id:行 - 模拟断网/刷新,确认重连后仍能收到
sessionId与 terminalsucceeded
与 Patch 4a 关系
- Patch 4a:taxonomy shadow(已完成)
- Patch 4b:run replay(本文件)
- Session stream replay 仍为后续项,不在 4b 范围