// Copyright (C) 2024-2026 Petr Mironychev // SPDX-License-Identifier: GPL-3.0-or-later // Additional attribution terms under GPLv3 §7(b) apply — see LICENSE #include "ConversationHistory.hpp" namespace QodeAssist { ConversationHistory::ConversationHistory(QObject *parent) : QObject(parent) {} ConversationHistory::~ConversationHistory() = default; void ConversationHistory::append(Message message) { m_messages.push_back(std::move(message)); emit messageAdded(static_cast(m_messages.size()) - 1); } void ConversationHistory::appendBlockToLast(std::unique_ptr block) { if (m_messages.empty() || !block) return; m_messages.back().appendBlock(std::move(block)); emit messageUpdated(static_cast(m_messages.size()) - 1); } void ConversationHistory::appendTextDeltaToLast(const QString &delta) { if (m_messages.empty() || delta.isEmpty()) return; auto &last = m_messages.back(); if (auto *text = dynamic_cast(last.lastBlock())) { text->appendText(delta); } else { last.appendBlock(std::make_unique(delta)); } emit messageUpdated(static_cast(m_messages.size()) - 1); } void ConversationHistory::appendThinkingBlockToLast(const QString &thinking, const QString &signature) { if (m_messages.empty() || (thinking.isEmpty() && signature.isEmpty())) return; auto &last = m_messages.back(); if (thinking.isEmpty()) last.appendBlock(std::make_unique(signature)); else last.appendBlock(std::make_unique(thinking, signature)); emit messageUpdated(static_cast(m_messages.size()) - 1); } void ConversationHistory::clear() { if (m_messages.empty()) return; m_messages.clear(); emit cleared(); } void ConversationHistory::resetTo(int index) { if (index < 0) index = 0; if (static_cast(index) >= m_messages.size()) return; m_messages.resize(static_cast(index)); emit reset(); } } // namespace QodeAssist