Run 终端事件
wesgine 的 Run 终端事件保证——每条 return 路径必须发出终端事件。
INV-TERM-04
runLoop 的每个 return 路径必须在返回前发出终端事件。
终端事件类型:
EventDone— 正常完成EventError— 错误终止EventInterrupted— 用户中断
为什么必须保证
缺少终端事件的后果:
- terminal guard 合成虚假
EventError(missing_terminal_event) - 消费方显示误导性"引擎内部错误"
- 无效的重试按钮出现在 UI 上
context 取消的特殊处理
callLLM 和 execute 返回 phaseReturn 时:
- 若
ctx.Err() != nil(用户中断) - 必须发出
EventDone("context_cancelled") - 不得依赖 for 循环顶部的
ctx.Err()检查
原因:phaseReturn 直接 return,永远到不了循环顶部。
终端事件与消费方
| 终端事件 | 消费方行为 |
|---|---|
EventDone("end_turn") | 正常结束,显示回复 |
EventDone("context_cancelled") | 压制,不显示错误块 |
EventError(kind) | 按 severity 决定是否显示重试 |
EventInterrupted | 压制,不显示错误块 |
terminal guard
如果 runLoop 返回时没有发出任何终端事件:
terminal guard 自动合成 EventError(missing_terminal_event)。
这是最后防线,不是正常流程。
与 SSE 的关系
终端事件通过 SSE 推送到前端。
但 Run 生命周期与 SSE 连接解耦(INV-RUN-DETACH):
- SSE 断开不取消 Run
- Run 完成后事件可通过 Replay 补发