#ifndef OLLIE_DBUS_CLIENT_H #define OLLIE_DBUS_CLIENT_H #include #include #include #include #include #include #include #if QT_VERSION_MAJOR >= 6 #include #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()); 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); 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