Commit Graph
168 Commits
Author SHA1 Message Date
Ogulcan Celik 0ef94cdbc1 fix: improve claude subagent hook lifecycle
fixes #58
2026-04-27 21:13:14 +03:00
Ogulcan Celik fb4e5a73ff fix: ignore claude subagent hook reports
fixes #58
2026-04-27 17:48:08 +03:00
Ogulcan Celik e9547a8e0d feat: refine live config lifecycle 2026-04-26 17:06:00 +03:00
Ogulcan Celik 3aa7903d28 fix: keep pane background transparent when host color is unknown 2026-04-26 02:15:41 +00:00
Ogulcan Celik 3d1ef155bf feat: add live config reload 2026-04-26 02:07:33 +03:00
Ogulcan Celik 88cc44c789 fix: keep herdr toast delivery in-app 2026-04-25 23:21:42 +03:00
Ogulcan Celik 692327f38b fix: reserve pane scrollbar column 2026-04-25 23:08:01 +03:00
Ogulcan Celik d15fa7aae4 fix: deliver server-approved terminal toasts 2026-04-25 21:40:48 +03:00
Ogulcan Celik 0d5cab85f7 fix: reduce default support log noise 2026-04-25 21:39:19 +03:00
Ogulcan Celik ddb3e04f92 test: add libghostty upgrade contract coverage 2026-04-25 04:16:44 +03:00
Ogulcan Celik fba05502cd fix(opencode): detect question prompt heuristics 2026-04-25 03:45:47 +03:00
mspiegel31 f3c1c4f386 feat(opencode): report blocked state when question tool fires (#51)
* feat(opencode): report blocked state on question.asked event

* docs: add question.asked/replied/rejected to opencode plugin mapping
2026-04-25 03:25:10 +03:00
Ogulcan Celik 4075041804 feat(logging): add robust rotating support logs 2026-04-23 00:48:22 +03:00
Ogulcan Celik e9a3e3784c fix: set a stable terminal identity for panes 2026-04-22 20:58:34 +03:00
Ogulcan Celik 4b482f37a1 feat: add terminal-delivered client notifications 2026-04-22 17:01:25 +03:00
Ogulcan Celik 5063cdf6d1 chore: remove unused test imports 2026-04-22 01:24:34 +03:00
Yifeng HeandCan Celik d2d1cc79ea fix: resolve transparent bg before inverse swap to prevent invisible text (#45)
Shells like zsh highlight pasted text using reverse video (SGR 7). The
render pipeline makes the default background transparent (None) when it
matches the host terminal background. When inverse swaps fg and bg, the
transparent bg becomes fg=None (Color::Reset), which the host terminal
renders as its default foreground — the same hue as the new bg, making
the text invisible.

Resolve None to the actual terminal background color before swapping so
inverse produces correct contrasting colors.

Fixes ogulcancelik/herdr#44

Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-04-22 00:49:24 +03:00
Ogulcan Celik baf5208f8e fix: make startup preview-release test version-independent 2026-04-21 20:39:18 +03:00
Ogulcan Celik 4e45051da0 fix: restore terminal cursor state on client detach 2026-04-21 20:27:36 +03:00
Ogulcan Celik c9fca9fbf7 fix: force repaint after headless runtime size changes 2026-04-21 19:57:29 +03:00
Ogulcan Celik 34138bbc38 fix: restore headless test reliability on macos 2026-04-21 19:11:22 +03:00
Ogulcan Celik d45dd05f75 test: refresh git branch cache in sidebar test 2026-04-21 18:15:12 +03:00
Ogulcan Celik bc410c4261 perf: reduce headless server render overhead 2026-04-21 18:00:59 +03:00
Ogulcan Celik b1c9833b82 fix: stop headless idle spin and skip unnecessary macos probes 2026-04-21 17:37:41 +03:00
Ogulcan Celik f99d51e42e fix: close global menu before detach 2026-04-21 16:56:43 +03:00
Can Celik 3397e1ce29 feat: add persistent server-client sessions
Make herdr persistent by default.

   Launching herdr now starts or reattaches to a background session
   server. Clients can detach and reattach while panes and agent
   processes keep running. Session mode now supports multi-client attach,
   auto-detect startup, and a thin-client/headless-server split.

   This also refactors the large app, ui, input, pane, config,
   workspace, and persistence modules into smaller focused submodules,
   while preserving behavior and colocating tests with the code they
   exercise.

   Upgrade notes:
   - persistence mode is now the default
   - in-app quit detaches the current client instead of stopping the server
   - use `herdr server stop` to stop the background session
   - use `--no-session` for the old single-process behavior
   - default socket paths now live under the config directory
2026-04-21 16:30:04 +03:00
Ogulcan Celik 0b831c8627 feat: allow hook-reported custom agent labels 2026-04-16 22:17:09 +03:00
Ogulcan Celik 318e6a3033 chore: clean up local repo guidance 2026-04-16 21:58:42 +03:00
Ogulcan Celik fc99070a22 fix: only preview newer saved release notes 2026-04-16 21:47:09 +03:00
Ogulcan Celik ef1c6b1497 fix: switch updates to manual preview flow 2026-04-16 01:09:25 +03:00
Ogulcan Celik 6c8e521bd3 fix treat droid mission control as idle 2026-04-14 18:13:08 +03:00
Ogulcan Celik 8cac2c0df4 feat support double prefix passthrough 2026-04-14 02:17:56 +03:00
Ogulcan Celik edaa3a1a09 fix unify app key normalization for enhanced keyboard reporting 2026-04-14 01:04:51 +03:00
Ogulcan Celik 37d5272910 fix highlight active workspace in collapsed sidebar 2026-04-13 23:50:33 +03:00
Ogulcan Celik b24abba471 refactor extract app api and runtime command modules 2026-04-13 23:45:46 +03:00
Ogulcan Celik 1535a7117a feat add custom shell and pane keybind commands 2026-04-13 18:49:37 +03:00
Ogulcan Celik 305d957704 fix input encoding for ctrl+letter in kitty mode 2026-04-13 17:34:13 +03:00
Ogulcan Celik dab18d4b17 fix: tighten tab bar scrolling behavior 2026-04-13 03:38:04 +03:00
Ogulcan Celik 27f4b7482b fix: reserve q for navigate quit only 2026-04-13 02:54:22 +03:00
Ogulcan Celik 3f21ba077b fix: preserve scrollback for droid primary-screen redraws 2026-04-12 01:01:22 +03:00
Ogulcan Celik 90e51f704b feat: support transparent panel chrome 2026-04-11 23:53:21 +03:00
Ogulcan Celik 6598c88d35 fix: prefer native clipboard tools over osc52 fallback 2026-04-11 03:16:28 +03:00
Ogulcan Celik 31cf4c4201 fix: harden amp blocked detection 2026-04-10 15:14:45 +03:00
Ogulcan Celik 08eccb89d2 fix: preserve workspace when closing the last pane in a tab 2026-04-10 15:00:34 +03:00
Ogulcan Celik 4a3b8f2fcf fix: forward pane osc 52 clipboard writes 2026-04-10 14:32:07 +03:00
Othavio Quiliao 6c62dba44e fix: forward OSC 52 clipboard writes from pane children
herdr embeds `libghostty-vt` as a headless terminal emulator per pane,
and its readonly stream handler silently drops `.clipboard_contents`
actions. As a result, any child process that writes OSC 52 to copy to
the system clipboard (for example Amp, which enables mouse reporting
and handles selection internally) has its sequence swallowed before it
can reach the host terminal — the user sees the child's "copied" toast
but the system clipboard is never updated.

This change adds an `Osc52Forwarder` that observes raw PTY bytes in
`process_pty_bytes`, reconstructs completed `ESC ] 52 ; (c|) ; <base64>
(BEL|ST)` sequences (write/clear only — queries are dropped since herdr
has no path to reply to the child), and returns them through the
existing `ProcessBytesResult`. The reader task forwards the bytes to
the main loop via a new `AppEvent::ClipboardWrite`, which is written
to stdout from `handle_internal_event`. Routing through the main loop
keeps stdout writes serialized with `terminal.draw` and the other
existing host-terminal emitters, so the new forwarder does not race
with rendering.

Existing herdr-native selection (mouse drag in panes without mouse
reporting) is unchanged and still writes through `selection::write_osc52`.
2026-04-10 14:32:07 +03:00
Ogulcan Celik 831bb66c0c feat(tabs): add overflow scrolling and drag reorder 2026-04-10 14:16:25 +03:00
Can Celik b024c273e3 Merge pull request #25 from othavioquiliao/fix/pane-click-focus-mouse-reporting
fix: click focus on panes running TUIs with mouse reporting
2026-04-09 22:41:15 +03:00
Othavio Quiliao 42fa2648ee fix: always open pane context menu on right-click
The Down(Right) handler forwarded the click to the inner pane runtime
when mouse reporting was active, then early-returned before creating the
context menu state. For panes running a TUI that enables mouse reporting
(e.g. Claude Code), right-clicking focused the pane but never opened the
herdr context menu, even though right-click on plain shells or Codex
still worked.

Stop forwarding Down(Right) to the pane runtime altogether. Right-click
on a pane now always focuses it and opens the herdr context menu,
matching how terminal emulators like Ghostty, Alacritty, Kitty and iTerm2
treat right-click. This means the previous context menu actions
(close pane, split, fullscreen, etc.) now also reach the intended pane
via focus_pane before the menu is displayed.

Remove Up(Right) and Drag(Right) from the middle/right forward branch so
the inner TUI never sees an Up or Drag without a matching Down. Middle
button forwarding is preserved because it is still used for paste in
many terminal protocols.

Tighten the existing right-click regression test with assertions that
Mode::ContextMenu is entered and context_menu is populated. Without
these extra checks the earlier version of the test only verified focus
and failed to catch this exact bug.
2026-04-09 16:06:27 -03:00
Othavio Quiliao 5e711fb7d3 fix: focus pane on left-click even when mouse reporting is active
The Down(Left) handler called forward_pane_mouse_button before focus_pane
and early-returned when the forward succeeded, which happens for any pane
running a TUI that has enabled mouse reporting (e.g. Claude Code). As a
result, clicking such a pane forwarded the click to the inner TUI but
never updated herdr's focus state, leaving the previous pane highlighted.

Reorder the handler to focus first and forward after, matching the
pattern already used by handle_terminal_wheel. Shells and TUIs without
mouse reporting (e.g. Codex) were unaffected because their forward
returned false and the focus update happened in the fallthrough branch.

Add a regression test that installs a pane runtime with mouse reporting
enabled via the '\x1b[?1002h' DECSET sequence and asserts that a
Down(Left) event retargets focus.
2026-04-09 16:04:06 -03:00