Commit Graph

361 Commits

Author SHA1 Message Date
Levi Neely d183b489d5 gui: add Ctrl+Q shortcut to quit 2026-07-27 09:42:13 +02:00
Levi Neely 81bd93f1f4 gui: sloppy focus targets filter input when filter bar is visible 2026-07-27 09:41:42 +02:00
Levi Neely a7dc265f5f gui: don't steal focus from filter input 2026-07-27 09:39:47 +02:00
Levi Neely dc18436bae gui: Ctrl+F filter bar to search chat messages
Adds a filterText property to ChatBlockModel that filters all
parsed blocks by case-insensitive substring match on content
or tool/call name. Toggle the filter bar with Ctrl+F; Escape
or the close button clears the filter and hides the bar.
Shows match count while filtering.
2026-07-27 09:37:26 +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 c62ae85b2c gui: style scrollbar handle for visibility
Use palette.mid at 60% opacity when active (scrolling), fully
transparent when idle, palette.mid on hover, palette.highlight
when pressed. 150ms color animation for smooth transitions.
2026-07-27 09:20:39 +02:00
Levi Neely 2b17e861be gui: add native scrollbar + lazy-load on scroll-up
- Add ScrollBar.vertical to the chat Flickable (both KF5/KF6)
- Remove interactive:false so native flick gestures work
- Trigger paneModel.loadEarlier() when scrolled near top
- Preserve scroll position when prepending older blocks
- Reduce column width by 12px for scrollbar clearance
2026-07-27 09:17:28 +02:00
Levi Neely 756e4086b3 gui: Ctrl+N new window shortcut + KF5 draft persistence
- Expose GuiActivator as "activator" context property
- Add Ctrl+N shortcut to open a new window (both KF5 and KF6)
- Add per-session draft text persistence to main-kf5.qml
  (KF6 ChatPane.qml already had this from previous commit)
2026-07-27 09:14:13 +02:00
Levi Neely 1d2fffdcab gui: persist prompt draft text per session
When switching between sessions, the draft text in the prompt
is saved and restored. Each pane maintains a _drafts map keyed
by session ID, so switching away and back preserves whatever
was typed.
2026-07-27 09:09:24 +02:00
Levi Neely 325870e38c gui: support multiple windows in single instance
Running ollie-gui a second time now opens a new window in the
existing process (via NewWindow D-Bus method) instead of just
raising the existing window. The single-instance guard remains.

Each window gets its own ChatBlockModel via QML instantiation
(ChatPane.qml), so windows can display independent sessions.
2026-07-27 09:05:14 +02:00
Levi Neely fad8baaa1b kate: windowed chat rendering for long conversations
Only render the last 40 blocks eagerly. Earlier messages are
lazy-loaded in chunks of 20 as the user scrolls up. This fixes
the progressive slowdown that occurred during long sessions where
the full HTML re-render on every ChatUpdated signal became O(n)
on the entire conversation history.
2026-07-24 14:45:19 +02:00
Levi Neely 5b005c4126 gui/kf5: remove palette.placeholderText (Qt6-only property) 2026-07-24 12:07:26 +02:00
Levi Neely 325ff53a54 gui: sync kf5 with kf6 features
- New session dialog with backend/model picker (replaces folder-only)
- Error dialog connected to dbus.onErrorOccurred
- Video sub-delegate (thumbnail card, opens in browser)
- Session graph: stateColor helper, zoom-toward-mouse
- placeholderText in palette block
2026-07-24 12:05:35 +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 d223911191 kate: add "Review Diff" context menu via gitplusplus extension
Register an action with the gitplusplus plugin (kate-worktree) that
appears in the Git++ tree view context menu. When triggered, it reads
the computed diff from the gitplusplus lastDiff property and submits
it to the active ollie session for review.

Also adds a "Review Diff" entry to the standard KTextEditor context
menu when the document has Diff highlighting mode (fallback path).
2026-07-23 14:52:51 +02:00
Levi Neely 5ab7a46f4d Move Ask File and Explain to editor context menu 2026-07-23 14:30:15 +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 90fe8e3478 kf5 corrections 2026-07-20 10:25:27 +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 cf637b2674 fix plugin install paths for user-local KDE install
- Kate plugin: ktexteditor -> kf6/ktexteditor (KF6), kf5/ktexteditor (KF5)
- Add 99-ollie.sh plasma env script for QT_PLUGIN_PATH and QML_IMPORT_PATH
- Plugins now found without sudo or system-wide install
2026-07-19 13:22:31 +02:00
Levi Neely d0caaa1f63 remove Makefile (consolidated into root justfile) 2026-07-19 13:02:47 +02:00
Levi Neely 51af575e48 remove tools/ — now at repo root 2026-07-19 12:37:15 +02:00
Levi Neely 65154790bd remove redundant SYSTEM_PROMPT.md — now at repo root as SYSTEM_PROMPT-dbus.md 2026-07-19 12:16:08 +02:00
Levi Neely 0418dd9fad move prompts and skills to parent repo
Keep only SYSTEM_PROMPT.md (KDE world-view prompt) in kde/prompts/.
Shared prompts and skills now live at the repo root.
2026-07-19 12:07:29 +02:00
Levi Neely b5c713443e krunner: launch ollie-gui when selecting a session from list
If the GUI is not already running, start it via QProcess and poll
for D-Bus registration before sending SelectSession.
2026-07-18 23:56:24 +02:00
Levi Neely 412d17dda3 krunner: open selected session in ollie-gui via SelectSession D-Bus call 2026-07-18 23:47:25 +02:00
Levi Neely 5b374847f8 krunner, dolphin: use Generate one-shot instead of session lifecycle 2026-07-18 23:09:51 +02:00
Levi Neely 89e86824f6 readme: krunner uses Generate one-shot, not a session 2026-07-18 23:07:04 +02:00
Levi Neely f7555f0cce readme: add olliesrv to architecture diagram, fix URLs 2026-07-18 23:01:03 +02:00
Levi Neely 046665c684 gui: add copy button to detached process window
Copies stdout+stderr output of the selected process to clipboard.
2026-07-18 20:15:07 +02:00
Levi Neely b868fd5b9d gui: fix video embed - proper thumbnail, min height, correct property refs
- YouTube videos show hqdefault.jpg thumbnail
- All cards have minimum 200px height
- Play button opens in browser (fixed parent chain)
- Use id-based refs instead of fragile parent.parent chains
2026-07-18 18:52:02 +02:00
Levi Neely b9e02a972a gui: inline video embeds in chat
Detect video URLs (YouTube, Vimeo, Dailymotion, Twitch, direct media)
in chat responses. Direct .mp4/.webm/.ogv files play inline via
QtMultimedia Video. Other video sites show a card with play button
that opens in the system browser.

Adds Qt6::Multimedia dependency.
2026-07-18 18:46:35 +02:00
Levi Neely 513029005e gui: fix buttons not responding on first click
Replace full-pane MouseArea sloppy focus with HoverHandler which
does not interfere with click event delivery. Also increase timer
to 300ms and guard against redundant forceActiveFocus() calls.
2026-07-18 18:32:13 +02:00
Levi Neely 7703d06430 gui: revert incremental parsing, use full reparse always
Incremental parsing caused phantom blocks and disappearing content.
The 150ms coalescing on the daemon side is sufficient for perf.
updateVisibleWindow() extraction kept for clean separation.
2026-07-18 18:12:10 +02:00
Levi Neely c46f38fc93 gui: fix incremental parser producing phantom tool_call blocks
When the tail contains only one header (common case during streaming),
just update the last block content directly. Fall back to full reparse
only when a genuinely new block boundary appears.
2026-07-18 18:04:42 +02:00
Levi Neely 7ccce95445 gui: incremental chat parsing during streaming
reparseIncremental() only re-parses from the last block boundary
instead of the entire chat text. Fixes UI lag and typing blockage
during long streaming responses.

Also extracted updateVisibleWindow() for reuse.
2026-07-18 17:36:36 +02:00
Levi Neely e021724c52 remove tier routing: drop route/cascade/escalate tools and prompts 2026-07-18 16:55:33 +02:00
Levi Neely be2f3b3487 tools: explicit UTF-8 encoding for file_read, file_write, file_edit 2026-07-18 16:15:10 +02:00
Levi Neely caf547c4af ChatPane: remove read-only implicitWidth assignments on TextEdit
Qt 6 TextEdit.implicitWidth is computed from content and cannot be
assigned. Remove the three occurrences that caused the QML load error.
2026-07-17 23:28:21 +02:00
Levi Neely 3aa751d8de gui: fix Process Manager scroll — use Flickable with contentHeight tracking
ScrollView + TextArea approach did not auto-scroll. Replaced with
Flickable that tracks contentHeight changes and scrolls to bottom
when pinned.
2026-07-17 22:22:49 +02:00
Levi Neely 6ea77c56c2 gui: auto-scroll output in Process Manager (pin to bottom) 2026-07-17 22:20:08 +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 89dba79dc1 prompts: elevation requires proven failure first 2026-07-17 16:04:07 +02:00
Levi Neely 72185c5752 gui: text selection, copy z-index, scroll fix 2026-07-17 15:03:45 +02:00
Levi Neely d707dd3a56 kf5: fix build error and sync features with KF6
- kate: use KTextEditor::MovingInterface for newMovingRange() on KF5
- gui: rewrite main-kf5.qml with tiling panes, session graph, per-pane
  chat model, drag-to-swap, sloppy focus (matching KF6 ChatPane.qml)
2026-07-17 09:41:33 +02:00
Levi Neely e1e7422166 gui: BSP tiling split panes, sloppy focus, emoji selector, drag-swap headers
Full split-pane implementation:
- Ctrl+\ splits focused pane (BSP tree layout, alternating h/v)
- Ctrl+W closes focused pane (collapses parent split)
- Sloppy focus: pane focuses when mouse stops moving (100ms)
- Drag header to another pane to swap sessions
- Multi-line TextArea prompt with emoji shortcode completion
- Each pane has own ChatBlockModel and D-Bus signal filtering
- Auto-relayout on window resize
2026-07-16 23:28:39 +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