事件系统
wesgine 事件体系:SSE 流式推送、事件类型、Run 事件缓冲与断线续播。
SSE 流式 Run
入口
POST /cells/{id}/run → SSE 流
返回 Server-Sent Events 流,实时推送 Run 期间的所有事件。
Run 与 SSE 解耦(INV-RUN-DETACH)
Run 生命周期始终与传输层解耦。
SSE 断开 ≠ 取消 Run。
取消 Run 的唯一途径:
POST /sessions/{sid}/interrupt(用户主动)- CycleDetector 自愈失败后 HITL 超时
- ErrorStreakDetector HITL 超时
- 外部
BudgetCheckFn返回 Exhausted - Cell Stop(生命周期)
事件类型
流式事件
| 事件 | 说明 |
|---|---|
stream_delta | 模型输出增量文本 |
stream_thinking | 模型推理内容 |
tool_start | 工具调用开始 |
tool_progress | 工具执行进度 |
tool_complete | 工具调用完成 |
生命周期事件
| 事件 | 说明 |
|---|---|
run_start | Run 开始 |
turn_start | 轮次开始 |
turn_end | 轮次结束 |
done | Run 正常结束 |
error | Run 出错 |
interrupted | Run 被中断 |
Plan 事件
| 事件 | 说明 |
|---|---|
plan_created | Plan 创建 |
plan_updated | Plan 步骤更新 |
plan_completed | Plan 完成 |
plan_interrupted | Plan 被中断 |
plan_nudge | Plan 提醒(pending 步骤) |
HITL 事件
| 事件 | 说明 |
|---|---|
hitl_request | 等待用户输入 |
hitl_response | 用户已响应 |
Terminal Guard(INV-TERM-04)
runLoop 的每个 return 路径必须发出终端事件。
| 终端事件 | 含义 |
|---|---|
EventDone | 正常完成 |
EventError | 错误终止 |
EventInterrupted | 中断终止 |
缺少终端事件 → terminal guard 合成虚假 EventError(missing_terminal_event)。
context_cancelled
callLLM/execute 返回 phaseReturn 时若 ctx.Err() != nil:
→ 发出 EventDone("context_cancelled") + 设 reason="context_cancelled"
不依赖 for 循环顶部的 ctx.Err() 检查。
事件缓冲(RunEventBuffer)
每个活跃 Run 有内存事件环,支持断线续播。
续播入口
GET /runs/{runID}/events?from_seq=N → SSE
从序号 N 开始续播事件。
缓冲机制
事件产生 → 写入内存环 → 推送 SSE → 落库 wes_run_traces
- 内存环供 SSE 断线续播
- 落库供历史查询
EventBus
Cell 级全局事件总线。
入口
GET /cells/{id}/events → SSE
推送 Cell 内所有事件(不限特定 Run)。
用途
- 后台通知(Cron 完成、IMAP 收信)
- 跨 Run 事件监听
Actor 边界(INV-OBS-10)
事件流的 Actor 边界:
- 落库之前的内存环也要守门
RunEventBuffer记 ownerSnapshot判observe.RunVisible- 不属于你与不存在返回同一个空流
消费方处理
done 事件
- 同步处理,不 debounce
- 释放 chatInFlight 锁
- 重置 UI 状态
error 事件
- severity 分类决定重试按钮显示
context_cancelled压制不渲染- 不可重试错误用
info级别
相关文档
- Run 生命周期 →
run-lifecycle.md - HITL 交互 →
hitl-interaction.md - 可观测性 →
observability.md