mirror of
https://github.com/Palm1r/QodeAssist.git
synced 2026-05-30 02:49:12 -04:00
feat: Add session layout
This commit is contained in:
105
sources/Session/SessionManager.cpp
Normal file
105
sources/Session/SessionManager.cpp
Normal file
@@ -0,0 +1,105 @@
|
||||
// Copyright (C) 2024-2026 Petr Mironychev
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#include "SessionManager.hpp"
|
||||
|
||||
#include "Agent.hpp"
|
||||
#include "AgentFactory.hpp"
|
||||
#include "Session.hpp"
|
||||
|
||||
namespace QodeAssist {
|
||||
|
||||
SessionManager::SessionManager(QObject *parent)
|
||||
: QObject(parent)
|
||||
{}
|
||||
|
||||
SessionManager::SessionManager(AgentFactory *agentFactory, QObject *parent)
|
||||
: QObject(parent)
|
||||
, m_agentFactory(agentFactory)
|
||||
{}
|
||||
|
||||
SessionManager::~SessionManager() = default;
|
||||
|
||||
Session *SessionManager::createSession()
|
||||
{
|
||||
auto *session = new Session(this);
|
||||
m_sessions.append(session);
|
||||
emit sessionCreated(session);
|
||||
return session;
|
||||
}
|
||||
|
||||
Session *SessionManager::createSession(const QString &agentName, QString *errorOut)
|
||||
{
|
||||
return createSession(agentName, /*externalHistory=*/nullptr, errorOut);
|
||||
}
|
||||
|
||||
Session *SessionManager::createSession(
|
||||
const QString &agentName, ConversationHistory *externalHistory, QString *errorOut)
|
||||
{
|
||||
if (!m_agentFactory) {
|
||||
if (errorOut)
|
||||
*errorOut = QStringLiteral("SessionManager: no AgentFactory bound");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
QString agentErr;
|
||||
Agent *agent = m_agentFactory->create(agentName, /*parent=*/nullptr, &agentErr);
|
||||
if (!agent) {
|
||||
if (errorOut)
|
||||
*errorOut = agentErr.isEmpty()
|
||||
? QStringLiteral("SessionManager: agent '%1' not found").arg(agentName)
|
||||
: agentErr;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto *session = new Session(agent, externalHistory, this);
|
||||
if (!session->isValid()) {
|
||||
if (errorOut)
|
||||
*errorOut = session->invalidReason();
|
||||
delete session; // also deletes the reparented agent
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
m_sessions.append(session);
|
||||
emit sessionCreated(session);
|
||||
return session;
|
||||
}
|
||||
|
||||
void SessionManager::removeSession(Session *session)
|
||||
{
|
||||
if (!session)
|
||||
return;
|
||||
|
||||
const int idx = m_sessions.indexOf(session);
|
||||
if (idx < 0)
|
||||
return;
|
||||
|
||||
if (session->isInFlight())
|
||||
session->cancel();
|
||||
|
||||
m_sessions.removeAt(idx);
|
||||
emit sessionRemoved(session);
|
||||
session->deleteLater();
|
||||
}
|
||||
|
||||
QList<Session *> SessionManager::sessions() const
|
||||
{
|
||||
QList<Session *> out;
|
||||
out.reserve(m_sessions.size());
|
||||
for (const auto &p : m_sessions) {
|
||||
if (p)
|
||||
out.append(p.data());
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
void SessionManager::cancelAll()
|
||||
{
|
||||
const auto snapshot = m_sessions;
|
||||
for (const auto &p : snapshot) {
|
||||
if (p && p->isInFlight())
|
||||
p->cancel();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace QodeAssist
|
||||
Reference in New Issue
Block a user