manageSendSuccess method

void manageSendSuccess(
  1. bool isExternalSearch
)

Implementation

void manageSendSuccess(bool isExternalSearch) {
  isStreaming.value = assistantsReplying.value > 0;

  // Calculate time to complete when streaming finishes
  if (!isStreaming.value && _currentMessageStartTime != null) {
    final timeToComplete = DateTime.now()
        .difference(_currentMessageStartTime!)
        .inMilliseconds;
    PupauEventService.instance.emitPupauEvent(
      PupauEvent(
        type: UpdateConversationType.timeToComplete,
        payload: {
          "assistantId": assistantId,
          "assistantType": assistant.value?.type ?? AssistantType.assistant,
          "timeToComplete": timeToComplete,
        },
      ),
    );

    // Track first message complete - check if this is the first user message in the conversation
    // (messages.length == 1 means only the initial assistant message exists)
    if (_isFirstMessage && messages.length <= 2) {
      _isFirstMessage = false;
      PupauEventService.instance.emitPupauEvent(
        PupauEvent(
          type: UpdateConversationType.firstMessageComplete,
          payload: {
            "assistantId": assistantId,
            "assistantType": assistant.value?.type ?? AssistantType.assistant,
            "conversationId": conversation.value?.id ?? "",
          },
        ),
      );
    }

    _currentMessageStartTime = null;
    _hasReceivedFirstToken = false;
  }

  for (PupauMessage sseMessage in incomingMessages) {
    PupauMessage? assistantMessage = messages.firstWhereOrNull(
      (PupauMessage message) =>
          message.id == sseMessage.id && message.status != MessageStatus.sent,
    );
    if (assistantMessage != null) {
      assistantMessage.status = MessageStatus.received;
      assistantMessage.createdAt = DateTime.now();
      assistantMessage.isExternalSearch = isExternalSearch;
      assistantMessage.answer = sseMessage.answer;
      PupauEventService.instance.emitPupauEvent(
        PupauEvent(
          type: UpdateConversationType.messageReceived,
          payload: {
            "assistantId": assistantId,
            "assistantType": assistant.value?.type ?? AssistantType.assistant,
            "conversationId": conversation.value?.id ?? "",
            "messageId": assistantMessage.id,
          },
        ),
      );
    }
  }
  if (!isStreaming.value) {
    clearEmptyMessages();
    resetLoadingMessage();
    updateConversationTitle();
    manageChatAutoScroll(bypassHeightCheck: true);
  }
  messages.refresh();
  update();
}