From e55e96714bfb74a3e3f75cd346129cfb652a9f02 Mon Sep 17 00:00:00 2001 From: Petr Mironychev <9195189+Palm1r@users.noreply.github.com> Date: Mon, 30 Mar 2026 06:53:29 +0200 Subject: [PATCH] refactor: Replace plugin tools manager to client api tools manager --- CMakeLists.txt | 7 ++-- ChatView/CMakeLists.txt | 1 + ChatView/ClientInterface.cpp | 21 +++++++++--- pluginllmcore/Provider.hpp | 6 +++- providers/ClaudeProvider.cpp | 31 ++++++++++------- providers/ClaudeProvider.hpp | 6 ++-- providers/GoogleAIProvider.cpp | 27 ++++++++++----- providers/GoogleAIProvider.hpp | 6 ++-- providers/LMStudioProvider.cpp | 27 ++++++++++----- providers/LMStudioProvider.hpp | 6 ++-- providers/LlamaCppProvider.cpp | 26 +++++++++----- providers/LlamaCppProvider.hpp | 6 ++-- providers/MistralAIProvider.cpp | 26 +++++++++----- providers/MistralAIProvider.hpp | 6 ++-- providers/OllamaProvider.cpp | 27 ++++++++++----- providers/OllamaProvider.hpp | 6 ++-- providers/OpenAICompatProvider.cpp | 26 +++++++++----- providers/OpenAICompatProvider.hpp | 6 ++-- providers/OpenAIProvider.cpp | 26 +++++++++----- providers/OpenAIProvider.hpp | 6 ++-- providers/OpenAIResponsesProvider.cpp | 25 +++++++++----- providers/OpenAIResponsesProvider.hpp | 6 ++-- tools/BuildProjectTool.cpp | 23 ++----------- tools/BuildProjectTool.hpp | 11 +++--- tools/CreateNewFileTool.cpp | 22 ++---------- tools/CreateNewFileTool.hpp | 11 +++--- tools/EditFileTool.cpp | 22 ++---------- tools/EditFileTool.hpp | 11 +++--- tools/ExecuteTerminalCommandTool.cpp | 26 +++----------- tools/ExecuteTerminalCommandTool.hpp | 11 +++--- tools/FindAndReadFileTool.cpp | 21 ++---------- tools/FindAndReadFileTool.hpp | 11 +++--- tools/GetIssuesListTool.cpp | 22 ++---------- tools/GetIssuesListTool.hpp | 11 +++--- tools/ListProjectFilesTool.cpp | 22 ++---------- tools/ListProjectFilesTool.hpp | 11 +++--- tools/ProjectSearchTool.cpp | 21 ++---------- tools/ProjectSearchTool.hpp | 11 +++--- tools/TodoTool.cpp | 35 +++++++------------ tools/TodoTool.hpp | 13 +++---- tools/ToolsRegistration.cpp | 49 +++++++++++++++++++++++++++ tools/ToolsRegistration.hpp | 30 ++++++++++++++++ 42 files changed, 381 insertions(+), 343 deletions(-) create mode 100644 tools/ToolsRegistration.cpp create mode 100644 tools/ToolsRegistration.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 6d05683..f4bfde9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,7 +35,7 @@ add_definitions( ) add_subdirectory(pluginllmcore) -# add_subdirectory(sources/external/llmcore) +add_subdirectory(sources/external/llmcore) add_subdirectory(settings) add_subdirectory(logger) add_subdirectory(UIControls) @@ -63,6 +63,7 @@ add_qtc_plugin(QodeAssist QtCreator::Utils QtCreator::CPlusPlus QodeAssistChatViewplugin + LLMCore SOURCES .github/workflows/build_cmake.yml .github/workflows/README.md @@ -142,10 +143,8 @@ add_qtc_plugin(QodeAssist widgets/DiffStatistics.hpp QuickRefactorHandler.hpp QuickRefactorHandler.cpp - tools/ToolsFactory.hpp tools/ToolsFactory.cpp - tools/ToolHandler.hpp tools/ToolHandler.cpp + tools/ToolsRegistration.hpp tools/ToolsRegistration.cpp tools/ListProjectFilesTool.hpp tools/ListProjectFilesTool.cpp - tools/ToolsManager.hpp tools/ToolsManager.cpp tools/GetIssuesListTool.hpp tools/GetIssuesListTool.cpp tools/CreateNewFileTool.hpp tools/CreateNewFileTool.cpp tools/EditFileTool.hpp tools/EditFileTool.cpp diff --git a/ChatView/CMakeLists.txt b/ChatView/CMakeLists.txt index c0e7412..59b2687 100644 --- a/ChatView/CMakeLists.txt +++ b/ChatView/CMakeLists.txt @@ -85,6 +85,7 @@ target_link_libraries(QodeAssistChatView Context QodeAssistUIControlsplugin QodeAssistLogger + LLMCore ) target_include_directories(QodeAssistChatView diff --git a/ChatView/ClientInterface.cpp b/ChatView/ClientInterface.cpp index b0037fb..0acfa32 100644 --- a/ChatView/ClientInterface.cpp +++ b/ChatView/ClientInterface.cpp @@ -40,6 +40,10 @@ #include #include +#include + +#include "tools/TodoTool.hpp" + #include "ChatAssistantSettings.hpp" #include "ChatSerializer.hpp" #include "GeneralSettings.hpp" @@ -177,7 +181,7 @@ void ClientInterface::sendMessage( if (auto target = project->activeTarget()) { if (auto buildConfig = target->activeBuildConfiguration()) { systemPrompt += QString("\n# Active Build directory: %1") - .arg(buildConfig->buildDirectory().toUrlishString()); + .arg(buildConfig->buildDirectory().toUrlishString()); } } @@ -327,7 +331,10 @@ void ClientInterface::sendMessage( provider->sendRequest(requestId, config.url, config.providerRequest); if (provider->supportsTools() && provider->toolsManager()) { - provider->toolsManager()->setCurrentSessionId(m_chatFilePath); + if (auto *todoTool = qobject_cast( + provider->toolsManager()->tool("todo_tool"))) { + todoTool->setCurrentSessionId(m_chatFilePath); + } } } @@ -338,7 +345,10 @@ void ClientInterface::clearMessages() if (provider && !m_chatFilePath.isEmpty() && provider->supportsTools() && provider->toolsManager()) { - provider->toolsManager()->clearTodoSession(m_chatFilePath); + if (auto *todoTool = qobject_cast( + provider->toolsManager()->tool("todo_tool"))) { + todoTool->clearSession(m_chatFilePath); + } } m_chatModel->clear(); @@ -619,7 +629,10 @@ void ClientInterface::setChatFilePath(const QString &filePath) auto *provider = PluginLLMCore::ProvidersManager::instance().getProviderByName(providerName); if (provider && provider->supportsTools() && provider->toolsManager()) { - provider->toolsManager()->clearTodoSession(m_chatFilePath); + if (auto *todoTool = qobject_cast( + provider->toolsManager()->tool("todo_tool"))) { + todoTool->clearSession(m_chatFilePath); + } } } diff --git a/pluginllmcore/Provider.hpp b/pluginllmcore/Provider.hpp index fd654a8..7154563 100644 --- a/pluginllmcore/Provider.hpp +++ b/pluginllmcore/Provider.hpp @@ -34,6 +34,10 @@ #include "PromptTemplate.hpp" #include "RequestType.hpp" +namespace LLMCore { +class ToolsManager; +} + class QNetworkReply; class QJsonObject; @@ -75,7 +79,7 @@ public: virtual void cancelRequest(const RequestID &requestId); - virtual IToolsManager *toolsManager() const { return nullptr; } + virtual ::LLMCore::ToolsManager *toolsManager() const { return nullptr; } HttpClient *httpClient() const; diff --git a/providers/ClaudeProvider.cpp b/providers/ClaudeProvider.cpp index 1aea058..67069da 100644 --- a/providers/ClaudeProvider.cpp +++ b/providers/ClaudeProvider.cpp @@ -24,6 +24,8 @@ #include #include +#include + #include "pluginllmcore/ValidationUtils.hpp" #include "logger/Logger.hpp" #include "settings/ChatAssistantSettings.hpp" @@ -31,16 +33,19 @@ #include "settings/QuickRefactorSettings.hpp" #include "settings/GeneralSettings.hpp" #include "settings/ProviderSettings.hpp" +#include "tools/ToolsRegistration.hpp" namespace QodeAssist::Providers { ClaudeProvider::ClaudeProvider(QObject *parent) : PluginLLMCore::Provider(parent) - , m_toolsManager(new Tools::ToolsManager(this)) + , m_client(new ::LLMCore::ClaudeClient(url(), apiKey(), QString(), this)) { + Tools::registerQodeAssistTools(m_client->tools()); + connect( - m_toolsManager, - &Tools::ToolsManager::toolExecutionComplete, + m_client->tools(), + &::LLMCore::ToolsManager::toolExecutionComplete, this, &ClaudeProvider::onToolExecutionComplete); } @@ -131,8 +136,8 @@ void ClaudeProvider::prepareRequest( filter = PluginLLMCore::RunToolsFilter::OnlyRead; } - auto toolsDefinitions = m_toolsManager->getToolsDefinitions( - PluginLLMCore::ToolSchemaFormat::Claude, filter); + auto toolsDefinitions = m_client->tools()->getToolsDefinitions(); + if (!toolsDefinitions.isEmpty()) { request["tools"] = toolsDefinitions; LOG_MESSAGE(QString("Added %1 tools to Claude request").arg(toolsDefinitions.size())); @@ -252,9 +257,9 @@ void ClaudeProvider::cancelRequest(const PluginLLMCore::RequestID &requestId) cleanupRequest(requestId); } -PluginLLMCore::IToolsManager *ClaudeProvider::toolsManager() const +::LLMCore::ToolsManager *ClaudeProvider::toolsManager() const { - return m_toolsManager; + return m_client->tools(); } void ClaudeProvider::onDataReceived( @@ -318,7 +323,7 @@ void ClaudeProvider::onToolExecutionComplete( auto toolContent = message->getCurrentToolUseContent(); for (auto tool : toolContent) { if (tool->id() == it.key()) { - auto toolStringName = m_toolsManager->toolsFactory()->getStringName(tool->name()); + auto toolStringName = m_client->tools()->displayName(tool->name()); emit toolExecutionCompleted( requestId, tool->id(), toolStringName, toolResults[tool->id()]); break; @@ -434,7 +439,7 @@ void ClaudeProvider::processStreamEvent(const QString &requestId, const QJsonObj if (!signature.isEmpty()) { auto allBlocks = message->getCurrentBlocks(); if (index < allBlocks.size()) { - if (auto thinkingContent = qobject_cast(allBlocks[index])) { + if (auto thinkingContent = dynamic_cast<::LLMCore::ThinkingContent *>(allBlocks[index])) { thinkingContent->setSignature(signature); LOG_MESSAGE( QString("Updated thinking block signature from content_block_stop, " @@ -448,7 +453,7 @@ void ClaudeProvider::processStreamEvent(const QString &requestId, const QJsonObj if (!signature.isEmpty()) { auto allBlocks = message->getCurrentBlocks(); if (index < allBlocks.size()) { - if (auto redactedContent = qobject_cast(allBlocks[index])) { + if (auto redactedContent = dynamic_cast<::LLMCore::RedactedThinkingContent *>(allBlocks[index])) { redactedContent->setSignature(signature); LOG_MESSAGE( QString("Updated redacted_thinking block signature from content_block_stop, " @@ -518,10 +523,10 @@ void ClaudeProvider::handleMessageComplete(const QString &requestId) } for (auto toolContent : toolUseContent) { - auto toolStringName = m_toolsManager->toolsFactory()->getStringName(toolContent->name()); + auto toolStringName = m_client->tools()->displayName(toolContent->name()); emit toolExecutionStarted(requestId, toolContent->id(), toolStringName); - m_toolsManager->executeToolCall( + m_client->tools()->executeToolCall( requestId, toolContent->id(), toolContent->name(), toolContent->input()); } @@ -542,7 +547,7 @@ void ClaudeProvider::cleanupRequest(const PluginLLMCore::RequestID &requestId) m_dataBuffers.remove(requestId); m_requestUrls.remove(requestId); m_originalRequests.remove(requestId); - m_toolsManager->cleanupRequest(requestId); + m_client->tools()->cleanupRequest(requestId); } } // namespace QodeAssist::Providers diff --git a/providers/ClaudeProvider.hpp b/providers/ClaudeProvider.hpp index c5d5c55..e233aec 100644 --- a/providers/ClaudeProvider.hpp +++ b/providers/ClaudeProvider.hpp @@ -22,7 +22,7 @@ #include #include "ClaudeMessage.hpp" -#include "tools/ToolsManager.hpp" +#include namespace QodeAssist::Providers { @@ -58,7 +58,7 @@ public: bool supportImage() const override; void cancelRequest(const PluginLLMCore::RequestID &requestId) override; - PluginLLMCore::IToolsManager *toolsManager() const override; + ::LLMCore::ToolsManager *toolsManager() const override; public slots: void onDataReceived( @@ -79,7 +79,7 @@ private: QHash m_messages; QHash m_requestUrls; QHash m_originalRequests; - Tools::ToolsManager *m_toolsManager; + ::LLMCore::ClaudeClient *m_client; }; } // namespace QodeAssist::Providers diff --git a/providers/GoogleAIProvider.cpp b/providers/GoogleAIProvider.cpp index fe49ace..1a1f12a 100644 --- a/providers/GoogleAIProvider.cpp +++ b/providers/GoogleAIProvider.cpp @@ -19,7 +19,10 @@ #include "GoogleAIProvider.hpp" +#include + #include +#include "tools/ToolsRegistration.hpp" #include #include #include @@ -36,11 +39,13 @@ namespace QodeAssist::Providers { GoogleAIProvider::GoogleAIProvider(QObject *parent) : PluginLLMCore::Provider(parent) - , m_toolsManager(new Tools::ToolsManager(this)) + , m_client(new ::LLMCore::GoogleAIClient(url(), apiKey(), QString(), this)) { + Tools::registerQodeAssistTools(m_client->tools()); + connect( - m_toolsManager, - &Tools::ToolsManager::toolExecutionComplete, + m_client->tools(), + &::LLMCore::ToolsManager::toolExecutionComplete, this, &GoogleAIProvider::onToolExecutionComplete); } @@ -145,8 +150,7 @@ void GoogleAIProvider::prepareRequest( filter = PluginLLMCore::RunToolsFilter::OnlyRead; } - auto toolsDefinitions = m_toolsManager->getToolsDefinitions( - PluginLLMCore::ToolSchemaFormat::Google, filter); + auto toolsDefinitions = m_client->tools()->getToolsDefinitions(); if (!toolsDefinitions.isEmpty()) { request["tools"] = toolsDefinitions; LOG_MESSAGE(QString("Added %1 tools to Google AI request").arg(toolsDefinitions.size())); @@ -365,7 +369,7 @@ void GoogleAIProvider::onToolExecutionComplete( auto toolContent = message->getCurrentToolUseContent(); for (auto tool : toolContent) { if (tool->id() == it.key()) { - auto toolStringName = m_toolsManager->toolsFactory()->getStringName(tool->name()); + auto toolStringName = m_client->tools()->displayName(tool->name()); emit toolExecutionCompleted( requestId, tool->id(), toolStringName, toolResults[tool->id()]); break; @@ -544,9 +548,9 @@ void GoogleAIProvider::handleMessageComplete(const QString &requestId) } for (auto toolContent : toolUseContent) { - auto toolStringName = m_toolsManager->toolsFactory()->getStringName(toolContent->name()); + auto toolStringName = m_client->tools()->displayName(toolContent->name()); emit toolExecutionStarted(requestId, toolContent->id(), toolStringName); - m_toolsManager->executeToolCall( + m_client->tools()->executeToolCall( requestId, toolContent->id(), toolContent->name(), toolContent->input()); } @@ -569,7 +573,12 @@ void GoogleAIProvider::cleanupRequest(const PluginLLMCore::RequestID &requestId) m_originalRequests.remove(requestId); m_emittedThinkingBlocksCount.remove(requestId); m_failedRequests.remove(requestId); - m_toolsManager->cleanupRequest(requestId); + m_client->tools()->cleanupRequest(requestId); +} + +::LLMCore::ToolsManager *GoogleAIProvider::toolsManager() const +{ + return m_client->tools(); } } // namespace QodeAssist::Providers diff --git a/providers/GoogleAIProvider.hpp b/providers/GoogleAIProvider.hpp index 26ffc7e..d3cdf2b 100644 --- a/providers/GoogleAIProvider.hpp +++ b/providers/GoogleAIProvider.hpp @@ -21,7 +21,7 @@ #include "GoogleMessage.hpp" #include "pluginllmcore/Provider.hpp" -#include "tools/ToolsManager.hpp" +#include namespace QodeAssist::Providers { @@ -57,6 +57,8 @@ public: bool supportImage() const override; void cancelRequest(const PluginLLMCore::RequestID &requestId) override; + ::LLMCore::ToolsManager *toolsManager() const override; + public slots: void onDataReceived( const QodeAssist::PluginLLMCore::RequestID &requestId, const QByteArray &data) override; @@ -79,7 +81,7 @@ private: QHash m_originalRequests; QHash m_emittedThinkingBlocksCount; QSet m_failedRequests; - Tools::ToolsManager *m_toolsManager; + ::LLMCore::GoogleAIClient *m_client; }; } // namespace QodeAssist::Providers diff --git a/providers/LMStudioProvider.cpp b/providers/LMStudioProvider.cpp index e3a13cf..f72ae25 100644 --- a/providers/LMStudioProvider.cpp +++ b/providers/LMStudioProvider.cpp @@ -19,7 +19,10 @@ #include "LMStudioProvider.hpp" +#include + #include "pluginllmcore/ValidationUtils.hpp" +#include "tools/ToolsRegistration.hpp" #include "logger/Logger.hpp" #include "settings/ChatAssistantSettings.hpp" #include "settings/CodeCompletionSettings.hpp" @@ -35,11 +38,13 @@ namespace QodeAssist::Providers { LMStudioProvider::LMStudioProvider(QObject *parent) : PluginLLMCore::Provider(parent) - , m_toolsManager(new Tools::ToolsManager(this)) + , m_client(new ::LLMCore::OpenAIClient(url(), apiKey(), QString(), this)) { + Tools::registerQodeAssistTools(m_client->tools()); + connect( - m_toolsManager, - &Tools::ToolsManager::toolExecutionComplete, + m_client->tools(), + &::LLMCore::ToolsManager::toolExecutionComplete, this, &LMStudioProvider::onToolExecutionComplete); } @@ -250,8 +255,7 @@ void LMStudioProvider::prepareRequest( filter = PluginLLMCore::RunToolsFilter::OnlyRead; } - auto toolsDefinitions = m_toolsManager->getToolsDefinitions( - PluginLLMCore::ToolSchemaFormat::OpenAI, filter); + auto toolsDefinitions = m_client->tools()->getToolsDefinitions(); if (!toolsDefinitions.isEmpty()) { request["tools"] = toolsDefinitions; LOG_MESSAGE(QString("Added %1 tools to LMStudio request").arg(toolsDefinitions.size())); @@ -275,7 +279,7 @@ void LMStudioProvider::onToolExecutionComplete( auto toolContent = message->getCurrentToolUseContent(); for (auto tool : toolContent) { if (tool->id() == it.key()) { - auto toolStringName = m_toolsManager->toolsFactory()->getStringName(tool->name()); + auto toolStringName = m_client->tools()->displayName(tool->name()); emit toolExecutionCompleted( requestId, tool->id(), toolStringName, toolResults[tool->id()]); break; @@ -392,9 +396,9 @@ void LMStudioProvider::handleMessageComplete(const QString &requestId) } for (auto toolContent : toolUseContent) { - auto toolStringName = m_toolsManager->toolsFactory()->getStringName(toolContent->name()); + auto toolStringName = m_client->tools()->displayName(toolContent->name()); emit toolExecutionStarted(requestId, toolContent->id(), toolStringName); - m_toolsManager->executeToolCall( + m_client->tools()->executeToolCall( requestId, toolContent->id(), toolContent->name(), toolContent->input()); } @@ -415,7 +419,12 @@ void LMStudioProvider::cleanupRequest(const PluginLLMCore::RequestID &requestId) m_dataBuffers.remove(requestId); m_requestUrls.remove(requestId); m_originalRequests.remove(requestId); - m_toolsManager->cleanupRequest(requestId); + m_client->tools()->cleanupRequest(requestId); +} + +::LLMCore::ToolsManager *LMStudioProvider::toolsManager() const +{ + return m_client->tools(); } } // namespace QodeAssist::Providers diff --git a/providers/LMStudioProvider.hpp b/providers/LMStudioProvider.hpp index 28cd0ba..b32f43c 100644 --- a/providers/LMStudioProvider.hpp +++ b/providers/LMStudioProvider.hpp @@ -20,7 +20,7 @@ #pragma once #include "OpenAIMessage.hpp" -#include "tools/ToolsManager.hpp" +#include #include namespace QodeAssist::Providers { @@ -56,6 +56,8 @@ public: bool supportImage() const override; void cancelRequest(const PluginLLMCore::RequestID &requestId) override; + ::LLMCore::ToolsManager *toolsManager() const override; + public slots: void onDataReceived( const QodeAssist::PluginLLMCore::RequestID &requestId, const QByteArray &data) override; @@ -75,7 +77,7 @@ private: QHash m_messages; QHash m_requestUrls; QHash m_originalRequests; - Tools::ToolsManager *m_toolsManager; + ::LLMCore::OpenAIClient *m_client; }; } // namespace QodeAssist::Providers diff --git a/providers/LlamaCppProvider.cpp b/providers/LlamaCppProvider.cpp index b032ffc..418876b 100644 --- a/providers/LlamaCppProvider.cpp +++ b/providers/LlamaCppProvider.cpp @@ -19,12 +19,14 @@ #include "LlamaCppProvider.hpp" +#include #include "pluginllmcore/ValidationUtils.hpp" #include "logger/Logger.hpp" #include "settings/ChatAssistantSettings.hpp" #include "settings/CodeCompletionSettings.hpp" #include "settings/QuickRefactorSettings.hpp" #include "settings/GeneralSettings.hpp" +#include "tools/ToolsRegistration.hpp" #include #include @@ -34,11 +36,13 @@ namespace QodeAssist::Providers { LlamaCppProvider::LlamaCppProvider(QObject *parent) : PluginLLMCore::Provider(parent) - , m_toolsManager(new Tools::ToolsManager(this)) + , m_client(new ::LLMCore::LlamaCppClient(url(), apiKey(), QString(), this)) { + Tools::registerQodeAssistTools(m_client->tools()); + connect( - m_toolsManager, - &Tools::ToolsManager::toolExecutionComplete, + m_client->tools(), + &::LLMCore::ToolsManager::toolExecutionComplete, this, &LlamaCppProvider::onToolExecutionComplete); } @@ -110,8 +114,7 @@ void LlamaCppProvider::prepareRequest( filter = PluginLLMCore::RunToolsFilter::OnlyRead; } - auto toolsDefinitions = m_toolsManager->getToolsDefinitions( - PluginLLMCore::ToolSchemaFormat::OpenAI, filter); + auto toolsDefinitions = m_client->tools()->getToolsDefinitions(); if (!toolsDefinitions.isEmpty()) { request["tools"] = toolsDefinitions; LOG_MESSAGE(QString("Added %1 tools to llama.cpp request").arg(toolsDefinitions.size())); @@ -290,7 +293,7 @@ void LlamaCppProvider::onToolExecutionComplete( auto toolContent = message->getCurrentToolUseContent(); for (auto tool : toolContent) { if (tool->id() == it.key()) { - auto toolStringName = m_toolsManager->toolsFactory()->getStringName(tool->name()); + auto toolStringName = m_client->tools()->displayName(tool->name()); emit toolExecutionCompleted( requestId, tool->id(), toolStringName, toolResults[tool->id()]); break; @@ -407,9 +410,9 @@ void LlamaCppProvider::handleMessageComplete(const QString &requestId) } for (auto toolContent : toolUseContent) { - auto toolStringName = m_toolsManager->toolsFactory()->getStringName(toolContent->name()); + auto toolStringName = m_client->tools()->displayName(toolContent->name()); emit toolExecutionStarted(requestId, toolContent->id(), toolStringName); - m_toolsManager->executeToolCall( + m_client->tools()->executeToolCall( requestId, toolContent->id(), toolContent->name(), toolContent->input()); } @@ -430,7 +433,12 @@ void LlamaCppProvider::cleanupRequest(const PluginLLMCore::RequestID &requestId) m_dataBuffers.remove(requestId); m_requestUrls.remove(requestId); m_originalRequests.remove(requestId); - m_toolsManager->cleanupRequest(requestId); + m_client->tools()->cleanupRequest(requestId); +} + +::LLMCore::ToolsManager *LlamaCppProvider::toolsManager() const +{ + return m_client->tools(); } } // namespace QodeAssist::Providers diff --git a/providers/LlamaCppProvider.hpp b/providers/LlamaCppProvider.hpp index b1d0a07..2ae9b4f 100644 --- a/providers/LlamaCppProvider.hpp +++ b/providers/LlamaCppProvider.hpp @@ -20,7 +20,7 @@ #pragma once #include "OpenAIMessage.hpp" -#include "tools/ToolsManager.hpp" +#include #include namespace QodeAssist::Providers { @@ -56,6 +56,8 @@ public: bool supportImage() const override; void cancelRequest(const PluginLLMCore::RequestID &requestId) override; + ::LLMCore::ToolsManager *toolsManager() const override; + public slots: void onDataReceived( const QodeAssist::PluginLLMCore::RequestID &requestId, const QByteArray &data) override; @@ -75,7 +77,7 @@ private: QHash m_messages; QHash m_requestUrls; QHash m_originalRequests; - Tools::ToolsManager *m_toolsManager; + ::LLMCore::LlamaCppClient *m_client; }; } // namespace QodeAssist::Providers diff --git a/providers/MistralAIProvider.cpp b/providers/MistralAIProvider.cpp index 0852b07..c3b333e 100644 --- a/providers/MistralAIProvider.cpp +++ b/providers/MistralAIProvider.cpp @@ -19,6 +19,7 @@ #include "MistralAIProvider.hpp" +#include #include "pluginllmcore/ValidationUtils.hpp" #include "logger/Logger.hpp" #include "settings/ChatAssistantSettings.hpp" @@ -26,6 +27,7 @@ #include "settings/QuickRefactorSettings.hpp" #include "settings/GeneralSettings.hpp" #include "settings/ProviderSettings.hpp" +#include "tools/ToolsRegistration.hpp" #include #include @@ -35,11 +37,13 @@ namespace QodeAssist::Providers { MistralAIProvider::MistralAIProvider(QObject *parent) : PluginLLMCore::Provider(parent) - , m_toolsManager(new Tools::ToolsManager(this)) + , m_client(new ::LLMCore::OpenAIClient(url(), apiKey(), QString(), this)) { + Tools::registerQodeAssistTools(m_client->tools()); + connect( - m_toolsManager, - &Tools::ToolsManager::toolExecutionComplete, + m_client->tools(), + &::LLMCore::ToolsManager::toolExecutionComplete, this, &MistralAIProvider::onToolExecutionComplete); } @@ -271,8 +275,7 @@ void MistralAIProvider::prepareRequest( filter = PluginLLMCore::RunToolsFilter::OnlyRead; } - auto toolsDefinitions = m_toolsManager->getToolsDefinitions( - PluginLLMCore::ToolSchemaFormat::OpenAI, filter); + auto toolsDefinitions = m_client->tools()->getToolsDefinitions(); if (!toolsDefinitions.isEmpty()) { request["tools"] = toolsDefinitions; LOG_MESSAGE(QString("Added %1 tools to Mistral request").arg(toolsDefinitions.size())); @@ -296,7 +299,7 @@ void MistralAIProvider::onToolExecutionComplete( auto toolContent = message->getCurrentToolUseContent(); for (auto tool : toolContent) { if (tool->id() == it.key()) { - auto toolStringName = m_toolsManager->toolsFactory()->getStringName(tool->name()); + auto toolStringName = m_client->tools()->displayName(tool->name()); emit toolExecutionCompleted( requestId, tool->id(), toolStringName, toolResults[tool->id()]); break; @@ -413,9 +416,9 @@ void MistralAIProvider::handleMessageComplete(const QString &requestId) } for (auto toolContent : toolUseContent) { - auto toolStringName = m_toolsManager->toolsFactory()->getStringName(toolContent->name()); + auto toolStringName = m_client->tools()->displayName(toolContent->name()); emit toolExecutionStarted(requestId, toolContent->id(), toolStringName); - m_toolsManager->executeToolCall( + m_client->tools()->executeToolCall( requestId, toolContent->id(), toolContent->name(), toolContent->input()); } @@ -436,7 +439,12 @@ void MistralAIProvider::cleanupRequest(const PluginLLMCore::RequestID &requestId m_dataBuffers.remove(requestId); m_requestUrls.remove(requestId); m_originalRequests.remove(requestId); - m_toolsManager->cleanupRequest(requestId); + m_client->tools()->cleanupRequest(requestId); +} + +::LLMCore::ToolsManager *MistralAIProvider::toolsManager() const +{ + return m_client->tools(); } } // namespace QodeAssist::Providers diff --git a/providers/MistralAIProvider.hpp b/providers/MistralAIProvider.hpp index ac6bf63..7d4b1c7 100644 --- a/providers/MistralAIProvider.hpp +++ b/providers/MistralAIProvider.hpp @@ -20,7 +20,7 @@ #pragma once #include "OpenAIMessage.hpp" -#include "tools/ToolsManager.hpp" +#include #include namespace QodeAssist::Providers { @@ -56,6 +56,8 @@ public: bool supportImage() const override; void cancelRequest(const PluginLLMCore::RequestID &requestId) override; + ::LLMCore::ToolsManager *toolsManager() const override; + public slots: void onDataReceived( const QodeAssist::PluginLLMCore::RequestID &requestId, const QByteArray &data) override; @@ -75,7 +77,7 @@ private: QHash m_messages; QHash m_requestUrls; QHash m_originalRequests; - Tools::ToolsManager *m_toolsManager; + ::LLMCore::OpenAIClient *m_client; }; } // namespace QodeAssist::Providers diff --git a/providers/OllamaProvider.cpp b/providers/OllamaProvider.cpp index 27bb87c..2b48792 100644 --- a/providers/OllamaProvider.cpp +++ b/providers/OllamaProvider.cpp @@ -19,7 +19,10 @@ #include "OllamaProvider.hpp" +#include + #include +#include "tools/ToolsRegistration.hpp" #include #include @@ -35,11 +38,13 @@ namespace QodeAssist::Providers { OllamaProvider::OllamaProvider(QObject *parent) : PluginLLMCore::Provider(parent) - , m_toolsManager(new Tools::ToolsManager(this)) + , m_client(new ::LLMCore::OllamaClient(url(), apiKey(), QString(), this)) { + Tools::registerQodeAssistTools(m_client->tools()); + connect( - m_toolsManager, - &Tools::ToolsManager::toolExecutionComplete, + m_client->tools(), + &::LLMCore::ToolsManager::toolExecutionComplete, this, &OllamaProvider::onToolExecutionComplete); } @@ -135,8 +140,7 @@ void OllamaProvider::prepareRequest( filter = PluginLLMCore::RunToolsFilter::OnlyRead; } - auto toolsDefinitions = m_toolsManager->toolsFactory()->getToolsDefinitions( - PluginLLMCore::ToolSchemaFormat::Ollama, filter); + auto toolsDefinitions = m_client->tools()->getToolsDefinitions(); if (!toolsDefinitions.isEmpty()) { request["tools"] = toolsDefinitions; LOG_MESSAGE( @@ -358,7 +362,7 @@ void OllamaProvider::onToolExecutionComplete( auto toolContent = message->getCurrentToolUseContent(); for (auto tool : toolContent) { if (tool->id() == it.key()) { - auto toolStringName = m_toolsManager->toolsFactory()->getStringName(tool->name()); + auto toolStringName = m_client->tools()->displayName(tool->name()); emit toolExecutionCompleted(requestId, tool->id(), toolStringName, it.value()); break; } @@ -534,7 +538,7 @@ void OllamaProvider::handleMessageComplete(const QString &requestId) } for (auto toolContent : toolUseContent) { - auto toolStringName = m_toolsManager->toolsFactory()->getStringName(toolContent->name()); + auto toolStringName = m_client->tools()->displayName(toolContent->name()); emit toolExecutionStarted(requestId, toolContent->id(), toolStringName); LOG_MESSAGE( @@ -545,7 +549,7 @@ void OllamaProvider::handleMessageComplete(const QString &requestId) QString::fromUtf8( QJsonDocument(toolContent->input()).toJson(QJsonDocument::Compact)))); - m_toolsManager->executeToolCall( + m_client->tools()->executeToolCall( requestId, toolContent->id(), toolContent->name(), toolContent->input()); } @@ -568,7 +572,7 @@ void OllamaProvider::cleanupRequest(const PluginLLMCore::RequestID &requestId) m_originalRequests.remove(requestId); m_thinkingEmitted.remove(requestId); m_thinkingStarted.remove(requestId); - m_toolsManager->cleanupRequest(requestId); + m_client->tools()->cleanupRequest(requestId); } void OllamaProvider::emitThinkingBlocks(const QString &requestId, OllamaMessage *message) @@ -594,4 +598,9 @@ void OllamaProvider::emitThinkingBlocks(const QString &requestId, OllamaMessage m_thinkingEmitted.insert(requestId); } +::LLMCore::ToolsManager *OllamaProvider::toolsManager() const +{ + return m_client->tools(); +} + } // namespace QodeAssist::Providers diff --git a/providers/OllamaProvider.hpp b/providers/OllamaProvider.hpp index 9e97e20..3459553 100644 --- a/providers/OllamaProvider.hpp +++ b/providers/OllamaProvider.hpp @@ -22,7 +22,7 @@ #include #include "OllamaMessage.hpp" -#include "tools/ToolsManager.hpp" +#include namespace QodeAssist::Providers { @@ -58,6 +58,8 @@ public: bool supportThinking() const override; void cancelRequest(const PluginLLMCore::RequestID &requestId) override; + ::LLMCore::ToolsManager *toolsManager() const override; + public slots: void onDataReceived( const QodeAssist::PluginLLMCore::RequestID &requestId, const QByteArray &data) override; @@ -80,7 +82,7 @@ private: QHash m_originalRequests; QSet m_thinkingEmitted; QSet m_thinkingStarted; - Tools::ToolsManager *m_toolsManager; + ::LLMCore::OllamaClient *m_client; }; } // namespace QodeAssist::Providers diff --git a/providers/OpenAICompatProvider.cpp b/providers/OpenAICompatProvider.cpp index 5cab3ef..e74835e 100644 --- a/providers/OpenAICompatProvider.cpp +++ b/providers/OpenAICompatProvider.cpp @@ -18,8 +18,10 @@ */ #include "OpenAICompatProvider.hpp" +#include #include "pluginllmcore/ValidationUtils.hpp" +#include "tools/ToolsRegistration.hpp" #include "logger/Logger.hpp" #include "settings/ChatAssistantSettings.hpp" #include "settings/CodeCompletionSettings.hpp" @@ -36,11 +38,13 @@ namespace QodeAssist::Providers { OpenAICompatProvider::OpenAICompatProvider(QObject *parent) : PluginLLMCore::Provider(parent) - , m_toolsManager(new Tools::ToolsManager(this)) + , m_client(new ::LLMCore::OpenAIClient(url(), apiKey(), QString(), this)) { + Tools::registerQodeAssistTools(m_client->tools()); + connect( - m_toolsManager, - &Tools::ToolsManager::toolExecutionComplete, + m_client->tools(), + &::LLMCore::ToolsManager::toolExecutionComplete, this, &OpenAICompatProvider::onToolExecutionComplete); } @@ -112,8 +116,7 @@ void OpenAICompatProvider::prepareRequest( filter = PluginLLMCore::RunToolsFilter::OnlyRead; } - auto toolsDefinitions = m_toolsManager->getToolsDefinitions( - PluginLLMCore::ToolSchemaFormat::OpenAI, filter); + auto toolsDefinitions = m_client->tools()->getToolsDefinitions(); if (!toolsDefinitions.isEmpty()) { request["tools"] = toolsDefinitions; LOG_MESSAGE( @@ -266,7 +269,7 @@ void OpenAICompatProvider::onToolExecutionComplete( auto toolContent = message->getCurrentToolUseContent(); for (auto tool : toolContent) { if (tool->id() == it.key()) { - auto toolStringName = m_toolsManager->toolsFactory()->getStringName(tool->name()); + auto toolStringName = m_client->tools()->displayName(tool->name()); emit toolExecutionCompleted( requestId, tool->id(), toolStringName, toolResults[tool->id()]); break; @@ -383,9 +386,9 @@ void OpenAICompatProvider::handleMessageComplete(const QString &requestId) } for (auto toolContent : toolUseContent) { - auto toolStringName = m_toolsManager->toolsFactory()->getStringName(toolContent->name()); + auto toolStringName = m_client->tools()->displayName(toolContent->name()); emit toolExecutionStarted(requestId, toolContent->id(), toolStringName); - m_toolsManager->executeToolCall( + m_client->tools()->executeToolCall( requestId, toolContent->id(), toolContent->name(), toolContent->input()); } @@ -406,7 +409,12 @@ void OpenAICompatProvider::cleanupRequest(const PluginLLMCore::RequestID &reques m_dataBuffers.remove(requestId); m_requestUrls.remove(requestId); m_originalRequests.remove(requestId); - m_toolsManager->cleanupRequest(requestId); + m_client->tools()->cleanupRequest(requestId); +} + +::LLMCore::ToolsManager *OpenAICompatProvider::toolsManager() const +{ + return m_client->tools(); } } // namespace QodeAssist::Providers diff --git a/providers/OpenAICompatProvider.hpp b/providers/OpenAICompatProvider.hpp index ebca2db..b779f00 100644 --- a/providers/OpenAICompatProvider.hpp +++ b/providers/OpenAICompatProvider.hpp @@ -20,7 +20,7 @@ #pragma once #include "OpenAIMessage.hpp" -#include "tools/ToolsManager.hpp" +#include #include namespace QodeAssist::Providers { @@ -56,6 +56,8 @@ public: bool supportImage() const override; void cancelRequest(const PluginLLMCore::RequestID &requestId) override; + ::LLMCore::ToolsManager *toolsManager() const override; + public slots: void onDataReceived( const QodeAssist::PluginLLMCore::RequestID &requestId, const QByteArray &data) override; @@ -75,7 +77,7 @@ private: QHash m_messages; QHash m_requestUrls; QHash m_originalRequests; - Tools::ToolsManager *m_toolsManager; + ::LLMCore::OpenAIClient *m_client; }; } // namespace QodeAssist::Providers diff --git a/providers/OpenAIProvider.cpp b/providers/OpenAIProvider.cpp index daf2afc..955817f 100644 --- a/providers/OpenAIProvider.cpp +++ b/providers/OpenAIProvider.cpp @@ -19,6 +19,8 @@ #include "OpenAIProvider.hpp" +#include +#include "tools/ToolsRegistration.hpp" #include "pluginllmcore/ValidationUtils.hpp" #include "logger/Logger.hpp" #include "settings/ChatAssistantSettings.hpp" @@ -35,11 +37,13 @@ namespace QodeAssist::Providers { OpenAIProvider::OpenAIProvider(QObject *parent) : PluginLLMCore::Provider(parent) - , m_toolsManager(new Tools::ToolsManager(this)) + , m_client(new ::LLMCore::OpenAIClient(url(), apiKey(), QString(), this)) { + Tools::registerQodeAssistTools(m_client->tools()); + connect( - m_toolsManager, - &Tools::ToolsManager::toolExecutionComplete, + m_client->tools(), + &::LLMCore::ToolsManager::toolExecutionComplete, this, &OpenAIProvider::onToolExecutionComplete); } @@ -130,8 +134,7 @@ void OpenAIProvider::prepareRequest( filter = PluginLLMCore::RunToolsFilter::OnlyRead; } - auto toolsDefinitions = m_toolsManager->getToolsDefinitions( - PluginLLMCore::ToolSchemaFormat::OpenAI, filter); + auto toolsDefinitions = m_client->tools()->getToolsDefinitions(); if (!toolsDefinitions.isEmpty()) { request["tools"] = toolsDefinitions; LOG_MESSAGE(QString("Added %1 tools to OpenAI request").arg(toolsDefinitions.size())); @@ -310,7 +313,7 @@ void OpenAIProvider::onToolExecutionComplete( auto toolContent = message->getCurrentToolUseContent(); for (auto tool : toolContent) { if (tool->id() == it.key()) { - auto toolStringName = m_toolsManager->toolsFactory()->getStringName(tool->name()); + auto toolStringName = m_client->tools()->displayName(tool->name()); emit toolExecutionCompleted( requestId, tool->id(), toolStringName, toolResults[tool->id()]); break; @@ -427,9 +430,9 @@ void OpenAIProvider::handleMessageComplete(const QString &requestId) } for (auto toolContent : toolUseContent) { - auto toolStringName = m_toolsManager->toolsFactory()->getStringName(toolContent->name()); + auto toolStringName = m_client->tools()->displayName(toolContent->name()); emit toolExecutionStarted(requestId, toolContent->id(), toolStringName); - m_toolsManager->executeToolCall( + m_client->tools()->executeToolCall( requestId, toolContent->id(), toolContent->name(), toolContent->input()); } @@ -450,7 +453,12 @@ void OpenAIProvider::cleanupRequest(const PluginLLMCore::RequestID &requestId) m_dataBuffers.remove(requestId); m_requestUrls.remove(requestId); m_originalRequests.remove(requestId); - m_toolsManager->cleanupRequest(requestId); + m_client->tools()->cleanupRequest(requestId); +} + +::LLMCore::ToolsManager *OpenAIProvider::toolsManager() const +{ + return m_client->tools(); } } // namespace QodeAssist::Providers diff --git a/providers/OpenAIProvider.hpp b/providers/OpenAIProvider.hpp index efe8c1c..91c34d7 100644 --- a/providers/OpenAIProvider.hpp +++ b/providers/OpenAIProvider.hpp @@ -20,7 +20,7 @@ #pragma once #include "OpenAIMessage.hpp" -#include "tools/ToolsManager.hpp" +#include #include namespace QodeAssist::Providers { @@ -56,6 +56,8 @@ public: bool supportImage() const override; void cancelRequest(const PluginLLMCore::RequestID &requestId) override; + ::LLMCore::ToolsManager *toolsManager() const override; + public slots: void onDataReceived( const QodeAssist::PluginLLMCore::RequestID &requestId, const QByteArray &data) override; @@ -75,7 +77,7 @@ private: QHash m_messages; QHash m_requestUrls; QHash m_originalRequests; - Tools::ToolsManager *m_toolsManager; + ::LLMCore::OpenAIClient *m_client; }; } // namespace QodeAssist::Providers diff --git a/providers/OpenAIResponsesProvider.cpp b/providers/OpenAIResponsesProvider.cpp index 46be259..03dfbb6 100644 --- a/providers/OpenAIResponsesProvider.cpp +++ b/providers/OpenAIResponsesProvider.cpp @@ -18,7 +18,9 @@ */ #include "OpenAIResponsesProvider.hpp" +#include #include "OpenAIResponses/ResponseObject.hpp" +#include "tools/ToolsRegistration.hpp" #include "pluginllmcore/ValidationUtils.hpp" #include "logger/Logger.hpp" @@ -36,11 +38,13 @@ namespace QodeAssist::Providers { OpenAIResponsesProvider::OpenAIResponsesProvider(QObject *parent) : PluginLLMCore::Provider(parent) - , m_toolsManager(new Tools::ToolsManager(this)) + , m_client(new ::LLMCore::OpenAIResponsesClient(url(), apiKey(), QString(), this)) { + Tools::registerQodeAssistTools(m_client->tools()); + connect( - m_toolsManager, - &Tools::ToolsManager::toolExecutionComplete, + m_client->tools(), + &::LLMCore::ToolsManager::toolExecutionComplete, this, &OpenAIResponsesProvider::onToolExecutionComplete); } @@ -133,7 +137,7 @@ void OpenAIResponsesProvider::prepareRequest( : PluginLLMCore::RunToolsFilter::ALL; const auto toolsDefinitions - = m_toolsManager->getToolsDefinitions(PluginLLMCore::ToolSchemaFormat::OpenAI, filter); + = m_client->tools()->getToolsDefinitions(); if (!toolsDefinitions.isEmpty()) { QJsonArray responsesTools; @@ -579,10 +583,10 @@ void OpenAIResponsesProvider::handleMessageComplete(const QString &requestId) } for (const auto *toolContent : toolUseContent) { - const auto toolStringName = m_toolsManager->toolsFactory()->getStringName( + const auto toolStringName = m_client->tools()->displayName( toolContent->name()); emit toolExecutionStarted(requestId, toolContent->id(), toolStringName); - m_toolsManager->executeToolCall( + m_client->tools()->executeToolCall( requestId, toolContent->id(), toolContent->name(), toolContent->input()); } } @@ -604,7 +608,7 @@ void OpenAIResponsesProvider::onToolExecutionComplete( for (auto it = toolResults.constBegin(); it != toolResults.constEnd(); ++it) { for (const auto *tool : toolContent) { if (tool->id() == it.key()) { - const auto toolStringName = m_toolsManager->toolsFactory()->getStringName( + const auto toolStringName = m_client->tools()->displayName( tool->name()); emit toolExecutionCompleted( requestId, tool->id(), toolStringName, toolResults[tool->id()]); @@ -645,7 +649,12 @@ void OpenAIResponsesProvider::cleanupRequest(const PluginLLMCore::RequestID &req m_originalRequests.remove(requestId); m_itemIdToCallId.remove(requestId); m_emittedThinkingBlocksCount.remove(requestId); - m_toolsManager->cleanupRequest(requestId); + m_client->tools()->cleanupRequest(requestId); +} + +::LLMCore::ToolsManager *OpenAIResponsesProvider::toolsManager() const +{ + return m_client->tools(); } } // namespace QodeAssist::Providers diff --git a/providers/OpenAIResponsesProvider.hpp b/providers/OpenAIResponsesProvider.hpp index 18313d3..1f63e77 100644 --- a/providers/OpenAIResponsesProvider.hpp +++ b/providers/OpenAIResponsesProvider.hpp @@ -20,7 +20,7 @@ #pragma once #include "OpenAIResponsesMessage.hpp" -#include "tools/ToolsManager.hpp" +#include #include namespace QodeAssist::Providers { @@ -57,6 +57,8 @@ public: bool supportThinking() const override; void cancelRequest(const PluginLLMCore::RequestID &requestId) override; + ::LLMCore::ToolsManager *toolsManager() const override; + public slots: void onDataReceived( const QodeAssist::PluginLLMCore::RequestID &requestId, const QByteArray &data) override; @@ -79,7 +81,7 @@ private: QHash m_originalRequests; QHash> m_itemIdToCallId; QHash m_emittedThinkingBlocksCount; - Tools::ToolsManager *m_toolsManager; + ::LLMCore::OpenAIResponsesClient *m_client; }; } // namespace QodeAssist::Providers diff --git a/tools/BuildProjectTool.cpp b/tools/BuildProjectTool.cpp index 3148711..93fdb76 100644 --- a/tools/BuildProjectTool.cpp +++ b/tools/BuildProjectTool.cpp @@ -59,12 +59,12 @@ BuildProjectTool::~BuildProjectTool() m_activeBuilds.clear(); } -QString BuildProjectTool::name() const +QString BuildProjectTool::id() const { return "build_project"; } -QString BuildProjectTool::stringName() const +QString BuildProjectTool::displayName() const { return "Building and running project"; } @@ -80,7 +80,7 @@ QString BuildProjectTool::description() const "Note: This operation may take some time depending on project size."; } -QJsonObject BuildProjectTool::getDefinition(PluginLLMCore::ToolSchemaFormat format) const +QJsonObject BuildProjectTool::parametersSchema() const { QJsonObject definition; definition["type"] = "object"; @@ -96,26 +96,9 @@ QJsonObject BuildProjectTool::getDefinition(PluginLLMCore::ToolSchemaFormat form definition["properties"] = properties; definition["required"] = QJsonArray(); - switch (format) { - case PluginLLMCore::ToolSchemaFormat::OpenAI: - return customizeForOpenAI(definition); - case PluginLLMCore::ToolSchemaFormat::Claude: - return customizeForClaude(definition); - case PluginLLMCore::ToolSchemaFormat::Ollama: - return customizeForOllama(definition); - case PluginLLMCore::ToolSchemaFormat::Google: - return customizeForGoogle(definition); - } - return definition; } -PluginLLMCore::ToolPermissions BuildProjectTool::requiredPermissions() const -{ - return PluginLLMCore::ToolPermission::FileSystemRead - | PluginLLMCore::ToolPermission::FileSystemWrite; -} - QFuture BuildProjectTool::executeAsync(const QJsonObject &input) { auto *project = ProjectExplorer::ProjectManager::startupProject(); diff --git a/tools/BuildProjectTool.hpp b/tools/BuildProjectTool.hpp index f27d797..72a6bb7 100644 --- a/tools/BuildProjectTool.hpp +++ b/tools/BuildProjectTool.hpp @@ -19,7 +19,7 @@ #pragma once -#include +#include #include #include #include @@ -42,18 +42,17 @@ struct BuildInfo QMetaObject::Connection buildFinishedConnection; }; -class BuildProjectTool : public PluginLLMCore::BaseTool +class BuildProjectTool : public ::LLMCore::BaseTool { Q_OBJECT public: explicit BuildProjectTool(QObject *parent = nullptr); ~BuildProjectTool() override; - QString name() const override; - QString stringName() const override; + QString id() const override; + QString displayName() const override; QString description() const override; - QJsonObject getDefinition(PluginLLMCore::ToolSchemaFormat format) const override; - PluginLLMCore::ToolPermissions requiredPermissions() const override; + QJsonObject parametersSchema() const override; QFuture executeAsync(const QJsonObject &input = QJsonObject()) override; diff --git a/tools/CreateNewFileTool.cpp b/tools/CreateNewFileTool.cpp index abc42bd..1777521 100644 --- a/tools/CreateNewFileTool.cpp +++ b/tools/CreateNewFileTool.cpp @@ -36,12 +36,12 @@ CreateNewFileTool::CreateNewFileTool(QObject *parent) : BaseTool(parent) {} -QString CreateNewFileTool::name() const +QString CreateNewFileTool::id() const { return "create_new_file"; } -QString CreateNewFileTool::stringName() const +QString CreateNewFileTool::displayName() const { return {"Creating new file"}; } @@ -54,7 +54,7 @@ QString CreateNewFileTool::description() const "to the project file"; } -QJsonObject CreateNewFileTool::getDefinition(PluginLLMCore::ToolSchemaFormat format) const +QJsonObject CreateNewFileTool::parametersSchema() const { QJsonObject properties; @@ -70,25 +70,9 @@ QJsonObject CreateNewFileTool::getDefinition(PluginLLMCore::ToolSchemaFormat for required.append("filepath"); definition["required"] = required; - switch (format) { - case PluginLLMCore::ToolSchemaFormat::OpenAI: - return customizeForOpenAI(definition); - case PluginLLMCore::ToolSchemaFormat::Claude: - return customizeForClaude(definition); - case PluginLLMCore::ToolSchemaFormat::Ollama: - return customizeForOllama(definition); - case PluginLLMCore::ToolSchemaFormat::Google: - return customizeForGoogle(definition); - } - return definition; } -PluginLLMCore::ToolPermissions CreateNewFileTool::requiredPermissions() const -{ - return PluginLLMCore::ToolPermission::FileSystemWrite; -} - QFuture CreateNewFileTool::executeAsync(const QJsonObject &input) { return QtConcurrent::run([this, input]() -> QString { diff --git a/tools/CreateNewFileTool.hpp b/tools/CreateNewFileTool.hpp index 5d848db..71b2c3e 100644 --- a/tools/CreateNewFileTool.hpp +++ b/tools/CreateNewFileTool.hpp @@ -19,21 +19,20 @@ #pragma once -#include +#include namespace QodeAssist::Tools { -class CreateNewFileTool : public PluginLLMCore::BaseTool +class CreateNewFileTool : public ::LLMCore::BaseTool { Q_OBJECT public: explicit CreateNewFileTool(QObject *parent = nullptr); - QString name() const override; - QString stringName() const override; + QString id() const override; + QString displayName() const override; QString description() const override; - QJsonObject getDefinition(PluginLLMCore::ToolSchemaFormat format) const override; - PluginLLMCore::ToolPermissions requiredPermissions() const override; + QJsonObject parametersSchema() const override; QFuture executeAsync(const QJsonObject &input = QJsonObject()) override; }; diff --git a/tools/EditFileTool.cpp b/tools/EditFileTool.cpp index 3f096c5..f3a656b 100644 --- a/tools/EditFileTool.cpp +++ b/tools/EditFileTool.cpp @@ -39,12 +39,12 @@ EditFileTool::EditFileTool(QObject *parent) : BaseTool(parent) {} -QString EditFileTool::name() const +QString EditFileTool::id() const { return "edit_file"; } -QString EditFileTool::stringName() const +QString EditFileTool::displayName() const { return {"Editing file"}; } @@ -71,7 +71,7 @@ QString EditFileTool::description() const "disabled auto-apply. DO NOT retry the same edit - wait for user action."; } -QJsonObject EditFileTool::getDefinition(PluginLLMCore::ToolSchemaFormat format) const +QJsonObject EditFileTool::parametersSchema() const { QJsonObject properties; @@ -104,25 +104,9 @@ QJsonObject EditFileTool::getDefinition(PluginLLMCore::ToolSchemaFormat format) required.append("new_content"); definition["required"] = required; - switch (format) { - case PluginLLMCore::ToolSchemaFormat::OpenAI: - return customizeForOpenAI(definition); - case PluginLLMCore::ToolSchemaFormat::Claude: - return customizeForClaude(definition); - case PluginLLMCore::ToolSchemaFormat::Ollama: - return customizeForOllama(definition); - case PluginLLMCore::ToolSchemaFormat::Google: - return customizeForGoogle(definition); - } - return definition; } -PluginLLMCore::ToolPermissions EditFileTool::requiredPermissions() const -{ - return PluginLLMCore::ToolPermission::FileSystemWrite; -} - QFuture EditFileTool::executeAsync(const QJsonObject &input) { return QtConcurrent::run([this, input]() -> QString { diff --git a/tools/EditFileTool.hpp b/tools/EditFileTool.hpp index 4389b64..f3957a1 100644 --- a/tools/EditFileTool.hpp +++ b/tools/EditFileTool.hpp @@ -19,21 +19,20 @@ #pragma once -#include +#include namespace QodeAssist::Tools { -class EditFileTool : public PluginLLMCore::BaseTool +class EditFileTool : public ::LLMCore::BaseTool { Q_OBJECT public: explicit EditFileTool(QObject *parent = nullptr); - QString name() const override; - QString stringName() const override; + QString id() const override; + QString displayName() const override; QString description() const override; - QJsonObject getDefinition(PluginLLMCore::ToolSchemaFormat format) const override; - PluginLLMCore::ToolPermissions requiredPermissions() const override; + QJsonObject parametersSchema() const override; QFuture executeAsync(const QJsonObject &input = QJsonObject()) override; }; diff --git a/tools/ExecuteTerminalCommandTool.cpp b/tools/ExecuteTerminalCommandTool.cpp index fd61b40..f0d8a2a 100644 --- a/tools/ExecuteTerminalCommandTool.cpp +++ b/tools/ExecuteTerminalCommandTool.cpp @@ -41,12 +41,12 @@ ExecuteTerminalCommandTool::ExecuteTerminalCommandTool(QObject *parent) { } -QString ExecuteTerminalCommandTool::name() const +QString ExecuteTerminalCommandTool::id() const { return "execute_terminal_command"; } -QString ExecuteTerminalCommandTool::stringName() const +QString ExecuteTerminalCommandTool::displayName() const { return "Executing terminal command"; } @@ -56,7 +56,7 @@ QString ExecuteTerminalCommandTool::description() const return getCommandDescription(); } -QJsonObject ExecuteTerminalCommandTool::getDefinition(PluginLLMCore::ToolSchemaFormat format) const +QJsonObject ExecuteTerminalCommandTool::parametersSchema() const { QJsonObject definition; definition["type"] = "object"; @@ -70,34 +70,16 @@ QJsonObject ExecuteTerminalCommandTool::getDefinition(PluginLLMCore::ToolSchemaF properties["args"] = QJsonObject{ {"type", "string"}, - {"description", + {"description", "Optional arguments for the command. Arguments with spaces should be properly quoted. " "Example: '--file \"path with spaces.txt\" --verbose'"}}; definition["properties"] = properties; definition["required"] = QJsonArray{"command"}; - switch (format) { - case PluginLLMCore::ToolSchemaFormat::OpenAI: - return customizeForOpenAI(definition); - case PluginLLMCore::ToolSchemaFormat::Claude: - return customizeForClaude(definition); - case PluginLLMCore::ToolSchemaFormat::Ollama: - return customizeForOllama(definition); - case PluginLLMCore::ToolSchemaFormat::Google: - return customizeForGoogle(definition); - } - return definition; } -PluginLLMCore::ToolPermissions ExecuteTerminalCommandTool::requiredPermissions() const -{ - return PluginLLMCore::ToolPermission::FileSystemRead - | PluginLLMCore::ToolPermission::FileSystemWrite - | PluginLLMCore::ToolPermission::NetworkAccess; -} - QFuture ExecuteTerminalCommandTool::executeAsync(const QJsonObject &input) { const QString command = input.value("command").toString().trimmed(); diff --git a/tools/ExecuteTerminalCommandTool.hpp b/tools/ExecuteTerminalCommandTool.hpp index 5a1f041..e497b23 100644 --- a/tools/ExecuteTerminalCommandTool.hpp +++ b/tools/ExecuteTerminalCommandTool.hpp @@ -19,22 +19,21 @@ #pragma once -#include +#include #include namespace QodeAssist::Tools { -class ExecuteTerminalCommandTool : public PluginLLMCore::BaseTool +class ExecuteTerminalCommandTool : public ::LLMCore::BaseTool { Q_OBJECT public: explicit ExecuteTerminalCommandTool(QObject *parent = nullptr); - QString name() const override; - QString stringName() const override; + QString id() const override; + QString displayName() const override; QString description() const override; - QJsonObject getDefinition(PluginLLMCore::ToolSchemaFormat format) const override; - PluginLLMCore::ToolPermissions requiredPermissions() const override; + QJsonObject parametersSchema() const override; QFuture executeAsync(const QJsonObject &input = QJsonObject()) override; diff --git a/tools/FindAndReadFileTool.cpp b/tools/FindAndReadFileTool.cpp index 17bd237..1493ac0 100644 --- a/tools/FindAndReadFileTool.cpp +++ b/tools/FindAndReadFileTool.cpp @@ -32,12 +32,12 @@ FindAndReadFileTool::FindAndReadFileTool(QObject *parent) , m_ignoreManager(new Context::IgnoreManager(this)) {} -QString FindAndReadFileTool::name() const +QString FindAndReadFileTool::id() const { return "find_and_read_file"; } -QString FindAndReadFileTool::stringName() const +QString FindAndReadFileTool::displayName() const { return "Finding and reading file"; } @@ -48,7 +48,7 @@ QString FindAndReadFileTool::description() const "Returns the best matching file and its content."; } -QJsonObject FindAndReadFileTool::getDefinition(PluginLLMCore::ToolSchemaFormat format) const +QJsonObject FindAndReadFileTool::parametersSchema() const { QJsonObject properties; @@ -68,24 +68,9 @@ QJsonObject FindAndReadFileTool::getDefinition(PluginLLMCore::ToolSchemaFormat f definition["properties"] = properties; definition["required"] = QJsonArray{"query"}; - switch (format) { - case PluginLLMCore::ToolSchemaFormat::OpenAI: - return customizeForOpenAI(definition); - case PluginLLMCore::ToolSchemaFormat::Claude: - return customizeForClaude(definition); - case PluginLLMCore::ToolSchemaFormat::Ollama: - return customizeForOllama(definition); - case PluginLLMCore::ToolSchemaFormat::Google: - return customizeForGoogle(definition); - } return definition; } -PluginLLMCore::ToolPermissions FindAndReadFileTool::requiredPermissions() const -{ - return PluginLLMCore::ToolPermission::FileSystemRead; -} - QFuture FindAndReadFileTool::executeAsync(const QJsonObject &input) { return QtConcurrent::run([this, input]() -> QString { diff --git a/tools/FindAndReadFileTool.hpp b/tools/FindAndReadFileTool.hpp index cac99e6..dc22cc5 100644 --- a/tools/FindAndReadFileTool.hpp +++ b/tools/FindAndReadFileTool.hpp @@ -22,25 +22,24 @@ #include "FileSearchUtils.hpp" #include -#include +#include #include #include #include namespace QodeAssist::Tools { -class FindAndReadFileTool : public PluginLLMCore::BaseTool +class FindAndReadFileTool : public ::LLMCore::BaseTool { Q_OBJECT public: explicit FindAndReadFileTool(QObject *parent = nullptr); - QString name() const override; - QString stringName() const override; + QString id() const override; + QString displayName() const override; QString description() const override; - QJsonObject getDefinition(PluginLLMCore::ToolSchemaFormat format) const override; - PluginLLMCore::ToolPermissions requiredPermissions() const override; + QJsonObject parametersSchema() const override; QFuture executeAsync(const QJsonObject &input) override; private: diff --git a/tools/GetIssuesListTool.cpp b/tools/GetIssuesListTool.cpp index 0188345..70f2700 100644 --- a/tools/GetIssuesListTool.cpp +++ b/tools/GetIssuesListTool.cpp @@ -121,12 +121,12 @@ GetIssuesListTool::GetIssuesListTool(QObject *parent) IssuesTracker::instance(); } -QString GetIssuesListTool::name() const +QString GetIssuesListTool::id() const { return "get_issues_list"; } -QString GetIssuesListTool::stringName() const +QString GetIssuesListTool::displayName() const { return "Getting issues list from Qt Creator"; } @@ -138,7 +138,7 @@ QString GetIssuesListTool::description() const "Optional severity filter: 'error', 'warning', or 'all' (default)."; } -QJsonObject GetIssuesListTool::getDefinition(PluginLLMCore::ToolSchemaFormat format) const +QJsonObject GetIssuesListTool::parametersSchema() const { QJsonObject definition; definition["type"] = "object"; @@ -152,25 +152,9 @@ QJsonObject GetIssuesListTool::getDefinition(PluginLLMCore::ToolSchemaFormat for definition["properties"] = properties; definition["required"] = QJsonArray(); - switch (format) { - case PluginLLMCore::ToolSchemaFormat::OpenAI: - return customizeForOpenAI(definition); - case PluginLLMCore::ToolSchemaFormat::Claude: - return customizeForClaude(definition); - case PluginLLMCore::ToolSchemaFormat::Ollama: - return customizeForOllama(definition); - case PluginLLMCore::ToolSchemaFormat::Google: - return customizeForGoogle(definition); - } - return definition; } -PluginLLMCore::ToolPermissions GetIssuesListTool::requiredPermissions() const -{ - return PluginLLMCore::ToolPermission::FileSystemRead; -} - QFuture GetIssuesListTool::executeAsync(const QJsonObject &input) { return QtConcurrent::run([input]() -> QString { diff --git a/tools/GetIssuesListTool.hpp b/tools/GetIssuesListTool.hpp index 496125c..a56941b 100644 --- a/tools/GetIssuesListTool.hpp +++ b/tools/GetIssuesListTool.hpp @@ -19,7 +19,7 @@ #pragma once -#include +#include #include #include #include @@ -46,17 +46,16 @@ private: mutable QMutex m_mutex; }; -class GetIssuesListTool : public PluginLLMCore::BaseTool +class GetIssuesListTool : public ::LLMCore::BaseTool { Q_OBJECT public: explicit GetIssuesListTool(QObject *parent = nullptr); - QString name() const override; - QString stringName() const override; + QString id() const override; + QString displayName() const override; QString description() const override; - QJsonObject getDefinition(PluginLLMCore::ToolSchemaFormat format) const override; - PluginLLMCore::ToolPermissions requiredPermissions() const override; + QJsonObject parametersSchema() const override; QFuture executeAsync(const QJsonObject &input = QJsonObject()) override; }; diff --git a/tools/ListProjectFilesTool.cpp b/tools/ListProjectFilesTool.cpp index 8ae8329..c91f9e0 100644 --- a/tools/ListProjectFilesTool.cpp +++ b/tools/ListProjectFilesTool.cpp @@ -37,12 +37,12 @@ ListProjectFilesTool::ListProjectFilesTool(QObject *parent) {} -QString ListProjectFilesTool::name() const +QString ListProjectFilesTool::id() const { return "list_project_files"; } -QString ListProjectFilesTool::stringName() const +QString ListProjectFilesTool::displayName() const { return {"Reading project files list"}; } @@ -53,32 +53,16 @@ QString ListProjectFilesTool::description() const "Useful for understanding project structure. No parameters required."; } -QJsonObject ListProjectFilesTool::getDefinition(PluginLLMCore::ToolSchemaFormat format) const +QJsonObject ListProjectFilesTool::parametersSchema() const { QJsonObject definition; definition["type"] = "object"; definition["properties"] = QJsonObject(); definition["required"] = QJsonArray(); - switch (format) { - case PluginLLMCore::ToolSchemaFormat::OpenAI: - return customizeForOpenAI(definition); - case PluginLLMCore::ToolSchemaFormat::Claude: - return customizeForClaude(definition); - case PluginLLMCore::ToolSchemaFormat::Ollama: - return customizeForOllama(definition); - case PluginLLMCore::ToolSchemaFormat::Google: - return customizeForGoogle(definition); - } - return definition; } -PluginLLMCore::ToolPermissions ListProjectFilesTool::requiredPermissions() const -{ - return PluginLLMCore::ToolPermission::FileSystemRead; -} - QFuture ListProjectFilesTool::executeAsync(const QJsonObject &input) { Q_UNUSED(input) diff --git a/tools/ListProjectFilesTool.hpp b/tools/ListProjectFilesTool.hpp index 0314200..58a219f 100644 --- a/tools/ListProjectFilesTool.hpp +++ b/tools/ListProjectFilesTool.hpp @@ -19,23 +19,22 @@ #pragma once -#include +#include #include namespace QodeAssist::Tools { -class ListProjectFilesTool : public PluginLLMCore::BaseTool +class ListProjectFilesTool : public ::LLMCore::BaseTool { Q_OBJECT public: explicit ListProjectFilesTool(QObject *parent = nullptr); - QString name() const override; - QString stringName() const override; + QString id() const override; + QString displayName() const override; QString description() const override; - QJsonObject getDefinition(PluginLLMCore::ToolSchemaFormat format) const override; - PluginLLMCore::ToolPermissions requiredPermissions() const override; + QJsonObject parametersSchema() const override; QFuture executeAsync(const QJsonObject &input = QJsonObject()) override; diff --git a/tools/ProjectSearchTool.cpp b/tools/ProjectSearchTool.cpp index 368e73f..49420a9 100644 --- a/tools/ProjectSearchTool.cpp +++ b/tools/ProjectSearchTool.cpp @@ -43,12 +43,12 @@ ProjectSearchTool::ProjectSearchTool(QObject *parent) , m_ignoreManager(new Context::IgnoreManager(this)) {} -QString ProjectSearchTool::name() const +QString ProjectSearchTool::id() const { return "search_project"; } -QString ProjectSearchTool::stringName() const +QString ProjectSearchTool::displayName() const { return "Searching in project"; } @@ -60,7 +60,7 @@ QString ProjectSearchTool::description() const "Symbol mode: finds C++ definitions (classes, functions, etc)."; } -QJsonObject ProjectSearchTool::getDefinition(PluginLLMCore::ToolSchemaFormat format) const +QJsonObject ProjectSearchTool::parametersSchema() const { QJsonObject properties; @@ -94,24 +94,9 @@ QJsonObject ProjectSearchTool::getDefinition(PluginLLMCore::ToolSchemaFormat for definition["properties"] = properties; definition["required"] = QJsonArray{"query", "search_type"}; - switch (format) { - case PluginLLMCore::ToolSchemaFormat::OpenAI: - return customizeForOpenAI(definition); - case PluginLLMCore::ToolSchemaFormat::Claude: - return customizeForClaude(definition); - case PluginLLMCore::ToolSchemaFormat::Ollama: - return customizeForOllama(definition); - case PluginLLMCore::ToolSchemaFormat::Google: - return customizeForGoogle(definition); - } return definition; } -PluginLLMCore::ToolPermissions ProjectSearchTool::requiredPermissions() const -{ - return PluginLLMCore::ToolPermission::FileSystemRead; -} - QFuture ProjectSearchTool::executeAsync(const QJsonObject &input) { return QtConcurrent::run([this, input]() -> QString { diff --git a/tools/ProjectSearchTool.hpp b/tools/ProjectSearchTool.hpp index 8eb121e..a4b09fd 100644 --- a/tools/ProjectSearchTool.hpp +++ b/tools/ProjectSearchTool.hpp @@ -20,25 +20,24 @@ #pragma once #include -#include +#include #include #include #include namespace QodeAssist::Tools { -class ProjectSearchTool : public PluginLLMCore::BaseTool +class ProjectSearchTool : public ::LLMCore::BaseTool { Q_OBJECT public: explicit ProjectSearchTool(QObject *parent = nullptr); - QString name() const override; - QString stringName() const override; + QString id() const override; + QString displayName() const override; QString description() const override; - QJsonObject getDefinition(PluginLLMCore::ToolSchemaFormat format) const override; - PluginLLMCore::ToolPermissions requiredPermissions() const override; + QJsonObject parametersSchema() const override; QFuture executeAsync(const QJsonObject &input) override; private: diff --git a/tools/TodoTool.cpp b/tools/TodoTool.cpp index 70d5c7f..cbea19b 100644 --- a/tools/TodoTool.cpp +++ b/tools/TodoTool.cpp @@ -31,12 +31,12 @@ TodoTool::TodoTool(QObject *parent) : BaseTool(parent) {} -QString TodoTool::name() const +QString TodoTool::id() const { return "todo_tool"; } -QString TodoTool::stringName() const +QString TodoTool::displayName() const { return "Managing TODO list for task tracking"; } @@ -53,7 +53,7 @@ QString TodoTool::description() const "The list persists throughout the conversation."; } -QJsonObject TodoTool::getDefinition(PluginLLMCore::ToolSchemaFormat format) const +QJsonObject TodoTool::parametersSchema() const { QJsonObject definition; definition["type"] = "object"; @@ -97,32 +97,15 @@ QJsonObject TodoTool::getDefinition(PluginLLMCore::ToolSchemaFormat format) cons required.append("operation"); definition["required"] = required; - switch (format) { - case PluginLLMCore::ToolSchemaFormat::OpenAI: - return customizeForOpenAI(definition); - case PluginLLMCore::ToolSchemaFormat::Claude: - return customizeForClaude(definition); - case PluginLLMCore::ToolSchemaFormat::Ollama: - return customizeForOllama(definition); - case PluginLLMCore::ToolSchemaFormat::Google: - return customizeForGoogle(definition); - } - return definition; } -PluginLLMCore::ToolPermissions TodoTool::requiredPermissions() const -{ - return PluginLLMCore::ToolPermission::None; -} - QFuture TodoTool::executeAsync(const QJsonObject &input) { return QtConcurrent::run([this, input]() -> QString { - QString sessionId = input.value("session_id").toString(); - if (sessionId.isEmpty()) { - sessionId = "current"; - } + QMutexLocker sessionLocker(&m_mutex); + QString sessionId = m_currentSessionId.isEmpty() ? "current" : m_currentSessionId; + sessionLocker.unlock(); const QString operation = input.value("operation").toString(); @@ -194,6 +177,12 @@ QFuture TodoTool::executeAsync(const QJsonObject &input) }); } +void TodoTool::setCurrentSessionId(const QString &sessionId) +{ + QMutexLocker locker(&m_mutex); + m_currentSessionId = sessionId; +} + void TodoTool::clearSession(const QString &sessionId) { QMutexLocker locker(&m_mutex); diff --git a/tools/TodoTool.hpp b/tools/TodoTool.hpp index 7b60aed..8c0ef34 100644 --- a/tools/TodoTool.hpp +++ b/tools/TodoTool.hpp @@ -19,7 +19,7 @@ #pragma once -#include +#include #include #include @@ -34,21 +34,21 @@ struct TodoItem bool completed; }; -class TodoTool : public PluginLLMCore::BaseTool +class TodoTool : public ::LLMCore::BaseTool { Q_OBJECT public: explicit TodoTool(QObject *parent = nullptr); - QString name() const override; - QString stringName() const override; + QString id() const override; + QString displayName() const override; QString description() const override; - QJsonObject getDefinition(PluginLLMCore::ToolSchemaFormat format) const override; - PluginLLMCore::ToolPermissions requiredPermissions() const override; + QJsonObject parametersSchema() const override; QFuture executeAsync(const QJsonObject &input = QJsonObject()) override; + void setCurrentSessionId(const QString &sessionId); void clearSession(const QString &sessionId); private: @@ -59,6 +59,7 @@ private: QString listRemainingTodosLocked(const QString &sessionId) const; mutable QMutex m_mutex; + QString m_currentSessionId; QHash> m_sessionTodos; QHash m_sessionNextId; }; diff --git a/tools/ToolsRegistration.cpp b/tools/ToolsRegistration.cpp new file mode 100644 index 0000000..62c4267 --- /dev/null +++ b/tools/ToolsRegistration.cpp @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2026 Petr Mironychev + * + * This file is part of QodeAssist. + * + * QodeAssist is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * QodeAssist is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with QodeAssist. If not, see . + */ + +#include "ToolsRegistration.hpp" + +#include + +#include "BuildProjectTool.hpp" +#include "CreateNewFileTool.hpp" +#include "EditFileTool.hpp" +#include "ExecuteTerminalCommandTool.hpp" +#include "FindAndReadFileTool.hpp" +#include "GetIssuesListTool.hpp" +#include "ListProjectFilesTool.hpp" +#include "ProjectSearchTool.hpp" +#include "TodoTool.hpp" + +namespace QodeAssist::Tools { + +void registerQodeAssistTools(::LLMCore::ToolsManager *manager) +{ + manager->addTool(new ListProjectFilesTool(manager)); + manager->addTool(new GetIssuesListTool(manager)); + manager->addTool(new CreateNewFileTool(manager)); + manager->addTool(new EditFileTool(manager)); + manager->addTool(new BuildProjectTool(manager)); + manager->addTool(new ExecuteTerminalCommandTool(manager)); + manager->addTool(new ProjectSearchTool(manager)); + manager->addTool(new FindAndReadFileTool(manager)); + manager->addTool(new TodoTool(manager)); +} + +} // namespace QodeAssist::Tools diff --git a/tools/ToolsRegistration.hpp b/tools/ToolsRegistration.hpp new file mode 100644 index 0000000..617768f --- /dev/null +++ b/tools/ToolsRegistration.hpp @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2025 Petr Mironychev + * + * This file is part of QodeAssist. + * + * QodeAssist is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * QodeAssist is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with QodeAssist. If not, see . + */ + +#pragma once + +namespace LLMCore { +class ToolsManager; +} + +namespace QodeAssist::Tools { + +void registerQodeAssistTools(::LLMCore::ToolsManager *manager); + +} // namespace QodeAssist::Tools