This repository has been archived on 2026-08-16. You can view files and clone it, but cannot push or open issues or pull requests.
ollie-kde/plasmoid/plugin/olliedbusclient.h

117 lines
4.9 KiB
C++

#ifndef OLLIE_DBUS_CLIENT_H
#define OLLIE_DBUS_CLIENT_H
#include <QObject>
#include <QDBusInterface>
#include <QDBusConnection>
#include <QDBusPendingCallWatcher>
#include <QStringList>
#include <QVariantList>
#include <QTimer>
#if QT_VERSION_MAJOR >= 6
#include <QQmlEngine>
#endif
class OllieDBusClient : public QObject
{
Q_OBJECT
#if QT_VERSION_MAJOR >= 6
QML_ELEMENT
QML_SINGLETON
#endif
Q_PROPERTY(QVariantList sessions READ sessions NOTIFY sessionsChanged)
Q_PROPERTY(QString activeSessionId READ activeSessionId WRITE setActiveSessionId NOTIFY activeSessionIdChanged)
Q_PROPERTY(QString chatText READ chatText NOTIFY chatTextChanged)
Q_PROPERTY(QString activeState READ activeState NOTIFY activeStateChanged)
Q_PROPERTY(QString activeCwd READ activeCwd NOTIFY activeCwdChanged)
Q_PROPERTY(QString activeModel READ activeModel NOTIFY activeModelChanged)
Q_PROPERTY(QString activeBackend READ activeBackend NOTIFY activeBackendChanged)
public:
explicit OllieDBusClient(QObject *parent = nullptr);
QVariantList sessions() const { return m_sessions; }
Q_INVOKABLE QStringList peerList(const QString &sessionId);
Q_INVOKABLE QVariantMap getChat(const QString &sessionId, int offset);
Q_INVOKABLE QVariantMap getConfig(const QString &sessionId);
Q_INVOKABLE QString getState(const QString &sessionId);
QString activeSessionId() const { return m_activeSessionId; }
void setActiveSessionId(const QString &id);
QString chatText() const { return m_chatText; }
QString activeState() const { return m_activeState; }
QString activeCwd() const { return m_activeCwd; }
QString activeModel() const { return m_activeModel; }
QString activeBackend() const { return m_activeBackend; }
Q_INVOKABLE void refreshSessions();
Q_INVOKABLE void fetchChat();
Q_INVOKABLE QString createSession(const QString &cwd, const QString &backend = QString(), const QString &model = QString(), const QString &name = QString(), const QString &agent = QString(), const QString &remote = QString());
Q_INVOKABLE QStringList listAgents();
Q_INVOKABLE void createSessionWithDialog();
Q_INVOKABLE bool killSession(const QString &sessionId);
Q_INVOKABLE bool renameSession(const QString &sessionId, const QString &newName);
Q_INVOKABLE bool setConfig(const QString &sessionId, const QString &key, const QString &value);
Q_INVOKABLE bool submit(const QString &sessionId, const QString &prompt);
Q_INVOKABLE bool interrupt(const QString &sessionId);
Q_INVOKABLE QStringList listBackends();
Q_INVOKABLE QStringList listModels(const QString &sessionId);
Q_INVOKABLE QStringList listModelsByBackend(const QString &backend);
// Detached process management
Q_INVOKABLE bool detachProcess(const QString &sessionId);
Q_INVOKABLE QVariantList listDetached(const QString &sessionId);
Q_INVOKABLE bool signalDetached(const QString &sessionId, int pid, const QString &signal);
Q_INVOKABLE QString getDetachedOutput(const QString &sessionId, int pid);
Q_INVOKABLE bool dismissDetached(const QString &sessionId, int pid);
signals:
void sessionsChanged();
void activeSessionIdChanged();
void chatTextChanged();
void activeStateChanged();
void activeCwdChanged();
void activeModelChanged();
void activeBackendChanged();
void sessionStateUpdated(const QString &sessionId, const QString &newState);
void chatAppended(const QString &sessionId, int offset, const QString &text);
void processDetached(const QString &sessionId);
void processExited(const QString &sessionId, int pid, int exitCode);
void errorOccurred(const QString &message);
private slots:
void onSessionCreated(const QString &session_id);
void onSessionKilled(const QString &session_id);
void onSessionRenamed(const QString &old_id, const QString &new_id);
void onStateChanged(const QString &session_id, const QString &new_state);
void onChatUpdated(const QString &session_id, qlonglong offset, const QString &new_text);
void onRefreshSessionsFinished(QDBusPendingCallWatcher *watcher);
void onFetchChatFinished(QDBusPendingCallWatcher *watcher);
void onFetchConfigFinished(QDBusPendingCallWatcher *watcher);
void onPortalFolderResponse(uint response, const QVariantMap &results);
void onProcessDetached(const QString &session_id);
void onProcessExited(const QString &session_id, int pid, int exitCode);
void onConfigChanged(const QString &session_id, const QString &key, const QString &value);
private:
QDBusInterface *m_iface;
QVariantList m_sessions;
QString m_activeSessionId;
QString m_chatText;
qlonglong m_chatOffset = 0;
QString m_activeState = "idle";
QString m_activeCwd;
QString m_activeModel;
QString m_activeBackend;
bool m_refreshPending = false;
bool m_fetchChatPending = false;
void fetchConfig();
void processSessionList(const QStringList &entries);
};
#endif // OLLIE_DBUS_CLIENT_H