Run 事件重放
wesgine 的 Run 事件缓冲与 SSE 断线续播机制。
设计目标
SSE 连接断开后,客户端重连时能从断点续播事件,不丢失任何 Run 过程信息。
RunEventBuffer
每个活跃 Run 维护一个内存事件环(RunEventBuffer)。
事件先进入 per-Run 内存环,再写入 wes_run_traces 表。
事件序号
每个事件携带 seq 序号,从 1 开始递增。
SSE 重连
GET /cells/{id}/runs/{runID}/events?from_seq=N
from_seq=N 表示从第 N 个事件开始续播。
Run 生命周期与连接解耦(INV-RUN-DETACH)
Run 生命周期始终与传输层(SSE/HTTP 连接)解耦。
SSE 断开 ≠ 取消 Run。
取消 Run 的合法途径
POST /sessions/{sid}/interrupt(用户主动)- CycleDetector 自愈失败后 HITL 超时(真循环)
- ErrorStreakDetector HITL 超时(伪进展)
- 外部
BudgetCheckFn返回 Exhausted(商业限制) - Cell Stop(生命周期)
引擎不因计数器终止
引擎不因 counter 阈值(轮次/token/时间)主动终止正在运行的任务(INV-TERM-01)。
事件类型
Run 期间产出的事件包括:
EventStreamDelta— LLM 流式文本片段EventToolStart/EventToolEnd— 工具调用EventDone— Run 正常结束EventError— Run 出错EventInterrupted— Run 被中断EventPlanCreated/EventPlanUpdated/EventPlanCompleted— Plan 相关EventHITLRequest— HITL 审批请求
RunEnd 摘要
RunEnd 时引擎写入 role=system 摘要消息到 wes_messages。
孤儿 Run 可标记 status=resumable,通过 GET /observe/runs?status=resumable 查询。
Actor 边界(INV-OBS-10)
事件重放流遵循 Actor 边界。
RunEventBuffer 记录 owner。Snapshot 判 observe.RunVisible。
无主 Run 的事件对非 admin 隐藏。