#pragma once #include "tool.hpp" #include #include #include class QProcess; class QTimer; namespace ZShell::llm { class ShellTool : public LlmTool { Q_OBJECT public: explicit ShellTool(ToolRegistry* registry, QObject* parent = nullptr); ~ShellTool() override; QString name() const override; QString description() const override; QJsonObject parameters() const override; bool available(const ToolContext& context) const override; void execute( const ToolContext& context, const QJsonObject& args, ToolDone done) override; void cancel() override; static constexpr int DefaultTimeoutSeconds = 60; static constexpr int MaxTimeoutSeconds = 300; private: struct Job { QPointer process; QPointer timer; int timeoutSeconds = DefaultTimeoutSeconds; int outputBudgetChars = 0; ToolDone done; QString startError; bool timedOut = false; bool cancelled = false; bool finished = false; }; static QStringList sandboxArguments(const QString& workspace); void finishJob(Job* job); QList m_jobs; }; } // namespace ZShell::llm