Commit Graph

89 Commits

Author SHA1 Message Date
Levi Neely 9cf63f67b4 gui: fix ghost process, null block.reaction crash, window counter 2026-07-27 21:32:31 +02:00
Levi Neely c5a5c0c9b9 add agent selector to new session dialog 2026-07-27 20:43:05 +02:00
Levi Neely 1cce42f2d6 fix: setReactions updates blocks in-place with dataChanged signal 2026-07-27 19:50:53 +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 6e02ea4ca3 fix: update assistant block reaction badge on incremental parse 2026-07-27 19:33:15 +02:00
Levi Neely 042acf347e fix: parse reaction markers from [user] block content 2026-07-27 19:30:10 +02:00
Levi Neely cf1f0f75d9 pin reaction badge on assistant blocks, hide reaction buttons after reacting 2026-07-27 19:27:20 +02:00
Levi Neely e2592d821f propagate response IDs through chat models to reactTo 2026-07-27 19:12:12 +02:00
Levi Neely 16364e52b0 kf6: add reaction buttons + remove sloppy focus
Same fixes as kf5:
- Remove hover-based sloppy focus that stole focus from buttons
- Add Ctrl+L to focus prompt
- Add emoji reaction buttons on assistant message hover
2026-07-27 15:48:43 +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 582ea51126 kf5: replace sloppy focus with click-to-focus
The hover-based sloppy focus timer was stealing focus from buttons
via paneRoot.focus=true every 100ms of mouse movement, making
buttons very hard to click.

Replace with a click-to-focus MouseArea that only updates the
focusedPaneIndex on actual clicks, with mouse.accepted=false
so clicks propagate to the target widget normally.
2026-07-27 15:28:40 +02:00
Levi Neely d6c3e82dc8 kf5: fix buttons not responding to first click
The sloppy focus timer was calling panePrompt.forceActiveFocus()
on mouse movement, stealing focus from button clicks. Remove the
auto-focus; add Ctrl+L shortcut to focus the prompt input instead.
2026-07-27 15:21:48 +02:00
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 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 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 412d17dda3 krunner: open selected session in ollie-gui via SelectSession D-Bus call 2026-07-18 23:47:25 +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 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 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
Levi Neely 16c195b1a8 gui: session graph in separate window, pannable + zoomable 2026-07-16 22:14:32 +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 5eb8f49d15 Activate the existing Ollie GUI instance 2026-07-16 19:58:15 +02:00
Levi Neely 9e0e5cb0f4 Improve KDE GUI file and command handling 2026-07-16 19:42:21 +02:00
Levi Neely 167e70531a gui: add copy button to call and tool blocks 2026-07-16 16:23:56 +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 1d646f7fab gui: fix flickering, add code exec button, fix bubble width, improve scroll
- Replace Qt.callLater scroll debounce with Timer (16ms) to coalesce
  rapid contentHeight changes and eliminate scroll flickering
- Add execute button (play icon) on code blocks for scripted languages
  (bash, python, perl, ruby, etc.) — launches in terminal
- Fix assistant bubble width: always use 95% of available width
- Add minimum width (280px) to code fence blocks
- Move emoji popup into prompt RowLayout so it appears near input
- Disable wheel scroll inertia (direct contentY) while keeping flick
  inertia intact
- Apply all fixes to both KF5 and KF6 QML files
2026-07-16 13:20:08 +02:00