14a00774d9
- 新增 web 能力并挂载 platform/web(web_search/fetch_url) - 实时查询强制 web skill,router fallback 与 await session Finish - Session Broker 覆盖率/指标、stream replay 与相关单测/E2E 脚本 Co-authored-by: Cursor <cursoragent@cursor.com>
60 lines
1.9 KiB
Markdown
60 lines
1.9 KiB
Markdown
# 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)
|