Commit Graph

368 Commits

Author SHA1 Message Date
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 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