Files
QodeAssist/sources/Session/ConversationHistory.cpp
2026-07-02 22:26:32 +02:00

78 lines
2.1 KiB
C++

// 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<int>(m_messages.size()) - 1);
}
void ConversationHistory::appendBlockToLast(std::unique_ptr<LLMQore::ContentBlock> block)
{
if (m_messages.empty() || !block)
return;
m_messages.back().appendBlock(std::move(block));
emit messageUpdated(static_cast<int>(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<LLMQore::TextContent *>(last.lastBlock())) {
text->appendText(delta);
} else {
last.appendBlock(std::make_unique<LLMQore::TextContent>(delta));
}
emit messageUpdated(static_cast<int>(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<LLMQore::RedactedThinkingContent>(signature));
else
last.appendBlock(std::make_unique<LLMQore::ThinkingContent>(thinking, signature));
emit messageUpdated(static_cast<int>(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<size_t>(index) >= m_messages.size())
return;
m_messages.resize(static_cast<size_t>(index));
emit reset();
}
} // namespace QodeAssist