117 lines
4.9 KiB
C++
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
|