Run SSE 重连与事件续播

wesgine 的 Run 事件通过 SSE(Server-Sent Events)推送到客户端。当 SSE 连接断开时,客户端可以通过 from_seq 参数从断点续播事件。


核心设计

Run 与 SSE 解耦(INV-RUN-DETACH)

Run 生命周期始终与传输层(SSE/HTTP 连接)解耦:

事件序列号

每个 Run 事件携带递增序列号 seq:

{
  "type": "stream_delta",
  "seq": 42,
  "data": { "text": "..." }
}

重连流程

1. 初始连接

POST /cells/{id}/run
→ SSE 流开始
← event: stream_delta (seq=1)
← event: tool_start (seq=2)
← event: tool_end (seq=3)
← ...

2. 连接断开

网络中断 / 客户端刷新
SSE 连接关闭
Run 继续执行(服务端)

3. 重连续播

GET /cells/{id}/runs/{runID}/events?from_seq=3
→ SSE 流从 seq=4 开始
← event: stream_delta (seq=4)
← event: done (seq=5)

RunEventBuffer

服务端为每个活跃 Run 维护事件缓冲区:

属性说明
容量按 Run 配置
生命周期Run 存活期间
所有者Run 的 Actor
访问控制observe.RunVisible 判定

Actor 边界(INV-OBS-10)

事件缓冲区记录 Run 的 owner:


Run 终止的唯一途径

SSE 断开不是终止途径。Run 终止只能通过:

途径触发方式
用户主动中断POST /sessions/{sid}/interrupt
CycleDetector HITL 超时自愈失败后 HITL 超时
ErrorStreak HITL 超时伪进展检测 HITL 超时
BudgetCheckFn外部预算检查返回 Exhausted
Cell StopCell 生命周期管理

事件类型

SSE 流中可能出现的事件类型:

事件说明
stream_deltaLLM 文本增量
tool_start工具调用开始
tool_end工具调用结束
thinking_delta推理过程增量
budget_warning预算警告
hitl_request人工审批请求
plan_created计划创建
plan_updated计划更新
plan_completed计划完成
plan_interrupted计划中断
doneRun 正常完成
errorRun 错误终止
interruptedRun 被中断

消费方行为

桌面产品(wesclaw / wescode / wescraft)

SaaS / teleclaw


孤儿 Run 处理

SSE 断开后的 Run 可能成为"孤儿":


相关不变量


相关文档