handleEvent method
Handles one agent event (AgentListener shape). The turn-lifecycle
arms live here; the streaming arms (message/tool deltas) are split
into _handleStreamEvent — one switch each keeps the CRAP gate.
Implementation
Future<void> handleEvent(AgentEvent event, CancelToken cancelToken) async {
switch (event) {
case AgentStartEvent():
if (!_agentStartEmitted) {
_agentStartEmitted = true;
final turnId = _openTurnId ??= _nextTurnId++;
_emit(hepAgentStartFrame(turnId: turnId));
}
case TurnStartEvent():
_openTurnId ??= _nextTurnId++;
case MessageStartEvent(:final message):
if (message is AssistantMessage) {
_emit(hepMessageStartFrame(turnId: _turnId(), role: 'assistant'));
}
case MessageUpdateEvent(:final assistantMessageEvent):
if (assistantMessageEvent is TextDeltaEvent) {
_emit(
hepMessageDeltaFrame(
turnId: _turnId(),
delta: assistantMessageEvent.delta,
),
);
}
case TurnEndEvent(:final message, :final toolResults):
_emitTerminal(message, toolResults);
default:
_handleStreamEvent(event);
}
}