#pragma once #include #include #include #include #include #include #include #include #include #include "backend.h" class KateAiPlugin : public KTextEditor::Plugin { Q_OBJECT private: QPointer m_ai; QUrl m_serverUrl; private: int configPages() const override { return 1; } KTextEditor::ConfigPage *configPage(int number = 0, QWidget *parent = nullptr) override; public: explicit KateAiPlugin(QObject *parent = nullptr, const QList & = QList()); ~KateAiPlugin() override; QObject *createView(KTextEditor::MainWindow *mainWindow) override; void readConfig(); void reconnect(); Q_SIGNAL void instructChanged(); }; class KateAiPluginView : public QObject, public KXMLGUIClient { Q_OBJECT private: struct Request { KTextEditor::Cursor cursor; QPointer document; }; KTextEditor::MainWindow *m_mainWindow; inline static QPointer m_ai; inline static bool m_useInstruct = false; inline static QString m_systemPrompt; inline static int m_maxContext; inline static QString m_lastInstruct; private: void generate(); void gotResponse(AiBackend::Response respons); static QStringList getIncludePaths(const QString& text); QString assembleContext(QPointer document, const KTextEditor::Cursor& cursor, const QString& instruction = QString()); QPointer activeDocument() const; KTextEditor::Cursor getCurrentCursor() const; QHash m_requests; public: KateAiPluginView(KateAiPlugin *plugin, KTextEditor::MainWindow *mainwindow); ~KateAiPluginView() override; static void setInstruct(bool instruct); static void setSystemPrompt(const QString& in); static void setMaxContext(int maxContext); static void setAi(QPointer ai); Q_SIGNAL void reconnect(); };