# Patch 4c:Session SSE Replay(进行中,禁止 merge main / 上 103) > **状态:代码 + 单测已完成(2026-07-06);全量 soak 待开发完成后执行。** ## 目标 解决 H5 session SSE 重连丢状态问题(§8.3): - Portal 持久化经 sanitizer 后的 session 事件到 `h5_session_stream_events` - SSE 帧带 Portal `id:` cursor(与 run replay 4b 对齐) - 客户端带 `Last-Event-ID` 重连时,先从 DB 补发 missed events - 若补发以 `Finish`/`Error` 终态结束,则不再挂 upstream(避免重复 Finish) ## 开关 ```bash MEMIND_SESSION_STREAM_REPLAY=1 ``` 与 4b 独立:可只开 run replay、只开 session replay、或两者同开。 ## 改动文件 | 文件 | 说明 | |------|------| | `session-stream.mjs` | replay 纯函数、flag | | `session-stream-store.mjs` | MySQL 读写 | | `session-stream*.test.mjs` | 单测 | | `db.mjs` / `schema.sql` | `h5_session_stream_events` 表 | | `tkmind-proxy.mjs` | 重连补发 + live persist + SSE `id:` | | `server.mjs` | store 注入、启动 flag 日志 | | `.env.example` / `docs/local-dev.md` | 文档 | ## 行为说明 | 场景 | 行为 | |------|------| | 首次订阅(无 Last-Event-ID) | 纯透传 goosed,live 持久化(开关开启时) | | 重连(有 Last-Event-ID) | DB 补发 → 若未到 terminal 再挂 upstream | | cursor miss | 全量补发(同 4b) | | direct chat session | 仍走 `sendDirectChatSessionEvents`,不经本路径 | ## 验证(全量开发完成后) ```bash npm run verify:h5-session-patches ``` 手工: 1. `.env` 加 `MEMIND_SESSION_STREAM_REPLAY=1`,重启 `pnpm dev` 2. agent 路径发消息,DevTools 看 `/sessions/:id/events` 含 `id:` 行 3. 流式过程中断网/刷新,确认重连后 token/Finish 不丢 ## 与 4b 关系 - **4b**:`GET /agent/runs/:id/events` + `h5_agent_run_events` - **4c**:`GET /sessions/:id/events` + `h5_session_stream_events` - 双通道职责仍分离(§1.3)