Files
QodeAssist/sources/session/TurnContextBuilder.cpp
Petr Mironychev af85efb554 refactor: Decoupling chat architecture (#367)
* refactor: Migrate tests to Qt Creator plugin framework and update llmqore transports

* refactor: Move conversation history into IDE-free session library

* refactor: Extract turn context assembly behind injected ports

* build: Add RunQodeAssistTests target for the plugin test suite

* refactor: Route the chat through a Session and ChatBackend seam
2026-07-19 22:45:04 +02:00

59 lines
1.9 KiB
C++

// Copyright (C) 2026 Petr Mironychev
// SPDX-License-Identifier: GPL-3.0-or-later
// Additional attribution terms under GPLv3 §7(b) apply — see LICENSE
#include "session/TurnContextBuilder.hpp"
#include <QRegularExpression>
#include <QStringList>
namespace QodeAssist::Session {
TurnContextBuilder::TurnContextBuilder(
const IProjectContextPort &project,
const ISkillsContextPort *skills,
const ILinkedFilesPort &linkedFiles)
: m_project(project)
, m_skills(skills)
, m_linkedFiles(linkedFiles)
{}
TurnContext TurnContextBuilder::build(const TurnContextRequest &request) const
{
TurnContext context;
context.basePrompt = request.basePrompt;
context.rolePrompt = request.rolePrompt;
context.project = m_project.projectInfo();
if (context.project.available)
context.projectRules = m_project.projectRules();
if (m_skills) {
context.alwaysOnSkills = m_skills->alwaysOnBodies();
context.skillsCatalog = m_skills->catalogText();
static const QRegularExpression skillCommand(
QStringLiteral("(?:^|\\s)/([a-z0-9][a-z0-9-]*)"));
QStringList invokedSkillNames;
auto skillMatch = skillCommand.globalMatch(request.message);
while (skillMatch.hasNext()) {
const QString skillName = skillMatch.next().captured(1);
if (invokedSkillNames.contains(skillName))
continue;
const auto invokedSkill = m_skills->findSkill(skillName);
if (invokedSkill && !invokedSkill->body.isEmpty()) {
invokedSkillNames << skillName;
context.invokedSkills.append(*invokedSkill);
}
}
}
context.linkedFilePaths = request.linkedFilePaths;
if (!request.linkedFilePaths.isEmpty())
context.linkedFiles = m_linkedFiles.readFiles(request.linkedFilePaths);
return context;
}
} // namespace QodeAssist::Session