handleEvent method

Future<void> handleEvent(
  1. AgentEvent event,
  2. CancelToken cancelToken
)

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);
  }
}