// Copyright (C) 2024-2026 Petr Mironychev // SPDX-License-Identifier: GPL-3.0-or-later // Additional attribution terms under GPLv3 §7(b) apply — see LICENSE #pragma once #include #include #include #include "ChatModel.hpp" #include #include #include #include namespace QodeAssist { class SessionManager; class Session; class ConversationHistory; } namespace QodeAssist::Skills { class SkillsManager; } namespace QodeAssist::Chat { class ClientInterface : public QObject { Q_OBJECT public: explicit ClientInterface(ChatModel *chatModel, QObject *parent = nullptr); ~ClientInterface(); void setSkillsManager(Skills::SkillsManager *skillsManager); void setSessionManager(SessionManager *sessionManager); void setHistory(ConversationHistory *history); void setActiveAgent(const QString &agentName); void setActiveRole(const QString &roleId); void sendMessage( const QString &message, const QList &attachments = {}, const QList &linkedFiles = {}); void clearMessages(); void cancelRequest(); Context::ContextManager *contextManager() const; void setChatFilePath(const QString &filePath); QString chatFilePath() const; signals: void errorOccurred(const QString &error); void messageReceivedCompletely(); void requestStarted(const QString &requestId); void messageUsageReceived( int promptTokens, int completionTokens, int cachedPromptTokens, int reasoningTokens); private: void onSessionEvent(Session *session, const QodeAssist::ResponseEvent &ev); void onSessionFinished(const QString &requestId); void onSessionFailed(const QString &requestId, const QodeAssist::ErrorInfo &error); QString getCurrentFileContext() const; QString buildChatContextLayer( const QString &message, const QList &linkedFiles) const; QString requestIdForSession(Session *session) const; bool isImageFile(const QString &filePath) const; QString getMediaTypeForImage(const QString &filePath) const; QString encodeImageToBase64(const QString &filePath) const; struct RequestContext { QJsonObject originalRequest; QPointer session; }; ChatModel *m_chatModel; Context::ContextManager *m_contextManager; QPointer m_history; Skills::SkillsManager *m_skillsManager = nullptr; QPointer m_sessionManager; QString m_activeAgent; QString m_activeRoleId; QString m_chatFilePath; QHash m_activeRequests; }; } // namespace QodeAssist::Chat