// Copyright (C) 2026 Petr Mironychev // SPDX-License-Identifier: GPL-3.0-or-later // Additional attribution terms under GPLv3 §7(b) apply — see LICENSE #include "AgentSpawn.hpp" #include #include #include #include #include #include #include #include "acp/AgentLaunch.hpp" #include "settings/AgentsSettings.hpp" namespace QodeAssist::Acp { namespace { LLMQore::Acp::Implementation clientIdentity() { QString version; for (const ExtensionSystem::PluginSpec *spec : ExtensionSystem::PluginManager::plugins()) { if (spec->name() == QLatin1String("QodeAssist")) { version = spec->version(); break; } } return {QStringLiteral("QodeAssist"), version, QStringLiteral("QodeAssist")}; } } // namespace QString agentWorkingDirectory() { if (const ProjectExplorer::Project *project = ProjectExplorer::ProjectManager::startupProject()) return project->projectDirectory().path(); return QDir::homePath(); } AgentProcess spawnAgent(const AgentDefinition &agent, const QString &cwd, QObject *parent) { auto config = agentLaunchConfig(agent, cwd); if (!config) return {}; auto &settings = Settings::agentsSettings(); applyExtraSearchPaths(*config, splitSearchPaths(settings.agentExtraPaths.volatileValue())); applyForwardedEnvironment( *config, splitVariableNames(settings.agentForwardedVariables.volatileValue())); auto *transport = config->createTransport(nullptr); auto *client = new LLMQore::Acp::AcpClient(transport, clientIdentity(), parent); transport->setParent(client); return {client, config->command}; } QString runnerHint(const QString &command) { if (command.endsWith(QLatin1String("npx"))) { return QCoreApplication::translate( "QtC::QodeAssist", "Make sure Node.js is installed and 'npx' is on PATH."); } if (command.endsWith(QLatin1String("uvx"))) { return QCoreApplication::translate( "QtC::QodeAssist", "Make sure uv is installed and 'uvx' is on PATH."); } return {}; } } // namespace QodeAssist::Acp