Commit Graph

39 Commits

Author SHA1 Message Date
Levi Neely 5dfdd2bd31 gui: add remote field to new session dialog
Allow specifying a remote target (e.g. user@host) when creating a
session from the GUI. Empty means local execution. The value is passed
through to the D-Bus CreateSession method's remote parameter.
2026-07-31 10:54:40 +02:00
Levi Neely 5bdab3c616 remove emoji reaction feature (KDE GUI) 2026-07-31 09:09:30 +02:00
Levi Neely b591640b65 gui: refresh session list on ConfigChanged D-Bus signal
Connect the new ConfigChanged signal from the session manager to trigger
refreshSessions() and fetchConfig(), so the sidebar updates immediately
when the user runs /agent to switch agents.
2026-07-29 11:04:06 +02:00
Levi Neely c5a5c0c9b9 add agent selector to new session dialog 2026-07-27 20:43:05 +02:00
Levi Neely d5f0770b0a structured reactions via getReactions/setReactions, remove broken chat-text parsing 2026-07-27 19:47:21 +02:00
Levi Neely e2592d821f propagate response IDs through chat models to reactTo 2026-07-27 19:12:12 +02:00
Levi Neely 7b59e11f6d kf5: add emoji reaction buttons on assistant messages
Reaction buttons (👍👎🚀💩🤔) appear on hover over assistant chat
bubbles. Clicking one calls the React D-Bus method which records
the feedback in session history without triggering a model turn.

Also adds react() to OllieDBusClient.
2026-07-27 15:33:33 +02:00
Levi Neely 4392c7ec7b gui: add session name field to New Session dialog
Optional name field in the dialog. If provided, the session is
renamed immediately after creation via RenameSession D-Bus call.
Left blank, the auto-generated ID is used as before.
2026-07-27 09:25:00 +02:00
Levi Neely 62663aff4e add 6th arg (remote) to all CreateSession D-Bus calls 2026-07-24 11:58:09 +02:00
Levi Neely abd46c052e gui: model ComboBox populated by ListModelsByBackend on backend change 2026-07-21 15:32:54 +02:00
Levi Neely 726b3f29d7 gui: new session dialog with backend/model/cwd configuration
Replace simple folder picker with a full dialog. Adds listBackends()
and listModels() to OllieDBusClient. createSession() now accepts
backend and model parameters.
2026-07-21 15:27:59 +02:00
Levi Neely 10e39abc8e gui/plasmoid: show error dialog on CreateSession failure
Adds errorOccurred signal to OllieDBusClient, emitted when
CreateSession (or other async calls) fail. GUI shows a modal
dialog; plasmoid shows a passive notification.
2026-07-21 15:20:55 +02:00
Levi Neely 1afedfca7d dbus: pass systemPrompt arg to CreateSession calls 2026-07-21 14:28:20 +02:00
Levi Neely cd612d2812 gui: recreate QDBusInterface on service restart
QDBusInterface caches introspection data and can become stale after
the backing service restarts. This caused ListSessions calls to
silently fail, leaving the GUI empty after an olliesrv restart.

Recreate m_iface in the serviceRegistered handler to ensure a fresh
connection to the new service instance.
2026-07-19 14:16:17 +02:00
Levi Neely 131e875820 gui: add process detach support + Process Manager window
- OllieDBusClient: detachProcess, listDetached, signalDetached,
  getDetachedOutput, dismissDetached methods + D-Bus signal handlers
- ChatPane.qml: Detach button (visible during calling: state) +
  badge showing detached process count (click opens Process Manager)
- main.qml + main-kf5.qml: Process Manager window with process list,
  live output tail, Term/Kill/Dismiss buttons per process
2026-07-17 17:01:16 +02:00
Levi Neely 2699044b3b gui: split-pane sessions (Ctrl+* to split, Ctrl+W to close)
Major refactor: extracted chat UI into ChatPane.qml (self-contained
with own ChatBlockModel, D-Bus signal filtering, prompt input).
Main content area is now a SplitView with dynamic pane creation.
Auto-layout: splits horizontal if window wider than tall.
Sidebar click updates the focused pane session.

New OllieDBusClient methods: getChat, getConfig, getState (per-session).
New signal: chatAppended (emitted for all sessions, not just active).
2026-07-16 22:35:35 +02:00
Levi Neely 6362e399bd gui: session topology graph
Circular node layout showing all sessions with peer relationship edges.
Nodes are color-coded by state (green=idle, blue=thinking, orange=calling),
pulse when active. Click a node to select that session.
Toggle between list and graph view in sidebar toolbar.
Adds peerList() to OllieDBusClient.
2026-07-16 22:06:08 +02:00
Levi Neely f45cb8199d gui: close-to-tray option + fix session list disrupting rename
- Add configurable close-to-tray (Settings > System Tray)
  - QSystemTrayIcon with show/hide toggle and quit action
  - closeToTray property persisted in theme.conf
  - Window hides instead of quitting when enabled

- Fix session rename being interrupted by state changes
  - onStateChanged no longer calls refreshSessions()
  - State updates in-place via sessionStateUpdated signal
  - Delegates track state locally, preserving rename TextField
2026-07-16 14:34:14 +02:00
Levi Neely 2929bb6b04 kde: visual enhancements, emoji completion, scroll/layout fixes
ollie-gui:
- Structured chat blocks (user/assistant bubbles, tool/call with left borders)
- Tool/call blocks always visible (not collapsible), whitespace preserved
- User interrupt blocks (amber warning style)
- Copy buttons on bubbles (32x32, hover-visible)
- Emoji completion with popup selector + quick emoticons
- Backend/model display in header bar
- Session state updates on switch
- Scroll flicker fix (debounced, guarded)
- Null guards on delegate block properties
- Binding loop fixes

Kate plugin:
- Diff viewer integration via Kate DiffWidget (libkateprivate)
- Diff mode config (unified/side-by-side/raw)
- Emoji processing in prompt input (quick emoticons + :shortcode:)
- Increased chat font size
- Scroll position preservation

Dbus client:
- activeModel/activeBackend properties from GetConfig
2026-07-16 11:19:22 +02:00
Levi Neely 6642ab014b multi-line prompt input across all front-ends
Replace single-line TextField/QLineEdit with multi-line TextArea/QPlainTextEdit.
Enter sends, Shift+Enter and Ctrl+J insert newlines. Max height capped so the
input area does not take over the panel.
2026-07-16 06:19:14 +02:00
Levi Neely fcc3cd2313 kate stop button, sorted sessions, scroll pinning, install fix
- Kate: add always-visible stop button next to prompt input
- All front-ends: sort sessions alphabetically by ID
- All front-ends: only auto-scroll chat if at bottom, show
  floating go-to-bottom button when scrolled away
- CMakeLists: set KDE_INSTALL_PLUGINDIR to QT6_INSTALL_PLUGINS
  so plugins install to lib64/qt6/plugins/ (where Kate looks)
2026-07-16 06:03:15 +02:00
Levi Neely e87038ca04 plasmoid: fix highlighted session text unreadable on light themes
Replace KirigamiDelegates.RoundedItemDelegate (not available in all
Kirigami versions) with PlasmaComponents.ItemDelegate. Add explicit
highlightedTextColor bindings to labels and icon in the session list
delegate for both KF5 and KF6 builds.
2026-07-14 15:58:46 +02:00
Levi Neely a86d7391b2 plasmoid: use Kirigami components for session list delegates
Replace plain ItemDelegate/Label with Kirigami.BasicListItem and
proper icon sources for state indicators.
2026-07-11 16:09:07 +02:00
Levi Neely d1d113b5fd fix kf5 plasmoid install and portal dialog race
- Makefile: directly install plasmoid to /usr/share instead of using
  kpackagetool5 (which doesn't overwrite existing files, causing the
  KF6 main.qml to persist over the KF5 version)
- olliedbusclient: fix portal FileChooser race condition by connecting
  to Response signal before making the OpenFile call using a
  predictable handle_token
2026-07-10 12:04:12 +02:00
Levi Neely a988930dbc fix: use xdg-desktop-portal for folder dialog in plasmoid
plasmashell is QGuiApplication so QFileDialog (QtWidgets) cannot work.
Use org.freedesktop.portal.FileChooser.OpenFile via D-Bus instead.
Also fix StandardPaths ReferenceError in main.qml.
2026-07-08 19:33:48 +02:00
Levi Neely d97d2fb1af feat: use native QFileDialog for new session folder selection
QML FolderDialog does not work inside the plasmoid sandbox.
Move folder selection to C++ via QFileDialog::getExistingDirectory
and expose as createSessionWithDialog(). Applies to both kf5 and kf6.
2026-07-08 19:31:22 +02:00
Levi Neely 31e45452d9 fix(kf5): open folder dialog before creating session 2026-07-08 19:28:59 +02:00
Levi Neely 5ad224dfae fix: refresh session list on rename via reply callback and signal 2026-07-08 19:27:31 +02:00
Levi Neely 3b42c9ee25 plasmoid: folder picker for new sessions, fix chat offset encoding
- New session button opens a FolderDialog to choose the working directory before creating the session.

- Fix chat truncation: use toUtf8().size() for offset tracking to match the server byte-based offsets. QString::size() (UTF-16 code units) caused drift on non-ASCII characters, leading to stalled output.
2026-07-07 15:02:55 +02:00
Levi Neely 327030293b plasmoid: async D-Bus calls to prevent panel freezes
All synchronous QDBusInterface::call() replaced with asyncCall() +
QDBusPendingCallWatcher. Adds coalescing flags to prevent piling up
refreshSessions/fetchChat requests during rapid signal bursts.

Also removes build dependency from install targets to prevent cmake
re-running over read-only installed artifacts.
2026-07-07 13:32:07 +02:00
Levi Neely e53ed3b918 plasmoid: auto-focus prompt input when expanded 2026-07-07 12:27:52 +02:00
Levi Neely 03321cf8a6 plasmoid: clear sessions when ollie-kde service disappears
Watch for NameOwnerChanged via QDBusServiceWatcher. When the
service unregisters, reset all state. When it re-registers,
refresh the session list.
2026-07-07 12:26:46 +02:00
Levi Neely e79cb33adb update kde plasmoid and build config 2026-07-06 18:22:38 +02:00
Levi Neely c3155f53d8 use system font sizes instead of hardcoded pixel values
Plasmoid uses Kirigami.Theme.defaultFont/smallFont. Kate and KRunner
use QApplication::font(). All components now respect KDE font settings.
2026-07-06 13:40:40 +02:00
Levi Neely 0a3a49c920 plasmoid: show full representation on desktop instead of compact
Use switchWidth/switchHeight instead of hardcoded preferredRepresentation
so the full view is shown directly when placed on the desktop (Planar
form factor) while panels still get the compact icon.
2026-07-06 13:27:23 +02:00
Levi Neely 9701d8f67c plasmoid: inline session rename, cwd folder dialog, fix rename signal bug
- Double-click session name in list to rename inline (RET to confirm, ESC to cancel)
- Double-click cwd heading to open folder picker and change working directory
- Add setConfig() to QML D-Bus client
- Fix capi.go: chat/state callbacks used stale sessID after rename
- Makefile: kf5 target uses trap to always restore CMakeLists.txt
2026-07-06 12:33:14 +02:00
Levi Neely a1f2c22cbf plasmoid: add cwd label and status indicator, show full session IDs
- Add activeCwd property to OllieDBusClient (fetched via GetConfig)
- Add colored status dot to compact and full representations
- Show session cwd path in the header label
- Remove .substring(0,14) / .left(12) / .left(14) truncations
  from plasmoid, kate plugin, tray, and daemon notifications
2026-07-06 10:02:08 +02:00
Levi Neely 2795747d02 Add KF5/Qt5 support for Plasma 5.27
- CMakeLists-kf5.txt: side-by-side build config for KF5/Qt5
- #if QT_VERSION_MAJOR guards in krunner, kate, plasmoid sources
- Namespace alias (Plasma:: for KF5, KRunner:: for KF6)
- Manual QQmlExtensionPlugin for Qt5 (qmlplugin.cpp + qmldir)
- Plasma 5 compatible metadata-kf5.json and main-kf5.qml
- Makefile: kf5, kf5-install, kf5-uninstall targets

Build with 'make kf5', install with 'make kf5-install'.
2026-07-06 09:18:04 +02:00
Levi Neely f4b5ce3ea0 phase 4: plasma widget (plasmoid)
- QML plasmoid with session list, live chat view, inline prompt input
- C++ QML plugin (OllieDBusClient) for D-Bus interaction
- Real-time updates via D-Bus signals (ChatUpdated, StateChanged)
- State indicators: ○ idle, ● thinking, ⚡ calling tool
- Auto-scroll chat, interrupt button, new session button
- Makefile: plasmoid-install/uninstall targets for local dev
2026-07-05 23:17:09 +02:00