Commit Graph
84 Commits
Author SHA1 Message Date
Can Celik cc7c696cd0 feat: add configurable pane screen and scrollback clearing (#4383) 2026-09-19 14:47:18 +03:00
Can Celik f8e59221cb feat: add ctrl-hover highlighting and fix wrapped links (#4074)
refs #1282
2026-09-13 23:05:30 +03:00
caner-akcaandJJ Liebig f0cb0e0683 fix: keep an agent name through a process-exit observation (#3574)
A process-exit observation is not proof the agent is gone: the same
observation can be wrong while the agent keeps running, and the name is
the only handle its owner has on the pane. Detection uncertainty already
preserves the name, so releasing it on the observation alone contradicts
that contract and leaves a live agent unreachable by name with a rename
as the only recovery.

Free the name at the point the agent actually leaves the pane - a
recorded exit with no agent detected any more - so a wrong observation
costs nothing and a real exit still releases the name for reuse.

refs #3225

Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
2026-09-13 19:00:57 +02:00
Can Celik 1682cab326 fix: restore plugin focus events for client navigation (#3850)
refs #3824
2026-09-09 22:04:47 +03:00
Can CelikandJonathan Liebig e7d8220788 fix: preserve sessions after interrupted pane exits (#3418)
* fix: preserve sessions when pane shells are signaled

refs #3415

* fix: preserve shutdown checkpoints across platforms

refs #3415

---------

Co-authored-by: Jonathan Liebig <jonathan.liebig@gmail.com>
2026-09-07 15:14:46 +02:00
JJ Liebig 50ce4ec2dd fix: run the full applicable test suite on windows (#3660)
* fix: run the full applicable test suite on windows

* test: remove redundant test shell assignment

* test: make endpoint and metadata fixtures deterministic

* test: tolerate exited servers during windows probe cleanup
2026-09-05 21:39:32 +03:00
JJ Liebig 5a2dee700e fix(windows): remove worktrees with active agent panes (#3532)
* fix(windows): remove worktrees with active agent panes

* fix(windows): defer pane restore until shutdown exits
2026-09-02 18:08:10 +02:00
JJ Liebig 8633a398e6 fix: reliably submit delayed agent prompts (#3506) 2026-09-02 13:34:03 +02:00
Can Celik 6c0bb273d5 feat: support independent multi-client tab views (#3526) 2026-09-02 14:24:33 +03:00
Can Celik 207be3c771 refactor: render the shell in the client (#3487)
* feat: add opt-in client-rendered shell

* feat: add client-owned shell mouse controls

* feat: complete client-owned shell chrome

* feat: add client-owned shell settings and notifications

* feat: run client shell custom commands

* feat: render popup terminals in client shell

* feat: add client-owned scrollback and copy mode

* fix: preserve client worktree trust defaults

* feat: render startup diagnostics in client shell

* feat: render onboarding in client shell

* feat: render product announcements in client shell

* feat: render release notes in client shell

* feat: render mobile switcher in client shell

* feat: render kitty graphics in client shell

* fix: preserve client shell lifecycle coherence

* refactor: route client shell commands through endpoint connections

* refactor: make the client-rendered shell the default

* refactor: remove monolithic launch mode

* refactor: complete client-rendered shell cutover

* perf: retain client pane surface updates

* perf: scale retained pane surface updates

* perf: remove remote pane input latency

* test: make client shell checks platform-independent

* fix: prevent client timer starvation

* test: fix client shell platform gates

* test: accept retained surfaces in cross-area checks

* test: make client mode assertions platform-neutral

* fix: badge only outdated integrations
2026-09-01 15:48:22 +03:00
akbashandakbash-bot cafd9e5dd0 fix: refresh shared agent manifest caches (#3204)
refs #2711

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-08-25 01:08:36 +03:00
JJ LiebigandCan Celik 7ae4b056a0 fix: wait for agent prompt readiness (#2537)
* fix: wait for agent prompt readiness

refs #2410

* fix: return pane updates after tab bar command

refs #2410

---------

Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-08-11 03:24:02 +03:00
David Heinemeier HanssonandOgulcan Celik 350f001320 feat: keep the outer terminal window title in sync with the session (#2627)
* feat: keep the outer terminal window title in sync with the session

Herdr emulates the terminals in its panes, so an OSC 0/OSC 2 title
written inside a pane stops at Herdr and never reaches the terminal
Herdr itself runs in. That outer title is what window managers read for
title bars, tab bars, and group bars, so it kept showing whatever the
shell or ssh happened to leave behind.

Add `ui.window_title`, rendered from {hostname}, {workspace}, {tab},
{pane}, and {terminal_title}, and push it to the foreground client
whenever it changes. It renders on the server, so {hostname} names the
machine the panes actually run on rather than the machine a thin remote
client runs on, and it is gated on a pending render so an idle loop
never pays for it.

A title is only remembered as delivered once a foreground client takes
it, so the first client to attach is written to rather than skipped.
`client.window_title.set` still wins over the configured title, and
clearing it now hands the title back to `ui.window_title` instead of
only "herdr".

* fix: deliver the outer window title to a newly attached client

ClientConnected assigns the foreground client directly rather than going
through promote_client_to_foreground, so clearing the sent-title cache
there missed the case that matters most: attaching a second terminal to a
running session. The title was usually unchanged, so the sync returned
early and the new terminal kept whatever its shell or ssh had left.

Key the cache on the client that received the title instead of relying on
every foreground assignment to invalidate it.

* perf: keep hidden pane output off the window title path

Output from a hidden or background pane sets needs_render without setting
needs_full_render, and the retained render plan then skips presentation
for it entirely. Syncing the title on needs_render meant every coalesced
hidden-output tick still formatted, sanitized, and allocated a title that
could not have changed, against the hidden-source early exit AGENTS.md
requires.

Every input to the title is app state, which always requests a full
render, so gate on that instead. The one exception is the focused pane's
own terminal title, which arrives through PTY parsing, so ask for a full
render when that changes and the configured title uses it.

* fix: only cache a window title a client writer received

* fix: carry an api set window title across a live handoff

* fix: make outer window title updates event-driven

---------

Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-08-11 03:04:12 +03:00
Can CelikandDavid Heinemeier Hansson e48d83067a feat: add configurable tab bar status (#2586)
* feat: show a zoom indicator in the desktop tab bar

Reserve the right edge of the tab row for a ZOOM pill while the
focused pane is zoomed, matching the accent style of the mode bars.
The per-tab Z suffix stays; the pill makes the zoomed state visible
at a glance like tmux's status-right flag.

* feat: optionally show the hostname in the desktop tab bar

Add ui.tab_bar_hostname to display the machine's hostname at the right
edge of the tab row, like tmux's #h in status-right. The value resolves
where the server renders, so remote sessions show the remote host. Off
by default.

* fix: strip control characters from the tab bar hostname

* fix: hide the hostname when it would squeeze out the tab strip

* feat: add configurable tab bar status

* fix: harden tab bar status updates

* fix: terminate tab bar status process trees

* fix: disable status commands on unsupported platforms

* fix: skip unchanged status command renders

* fix: keep tab bar status opt-in by default

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>
2026-08-10 01:20:09 +03:00
Can Celik 1777e9bba3 feat(graphics): add direct pane frame streaming (#2523)
* feat(graphics): add direct pane frame streaming

* feat(graphics): expose pane visibility

* test(graphics): preserve legacy terminal image output

* fix(graphics): harden streaming lifecycle

* fix(input): preserve mouse releases outside panes
2026-08-09 02:04:39 +03:00
Can Celik 10974c822d feat(input): add per-pane right-click routing (#2504) 2026-08-08 16:26:47 +03:00
akbashandakbash-bot 6f311498ae fix: forward pane terminal bells (#2498)
refs #2453

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-08-08 02:15:56 +03:00
Can Celik 10eb0bc744 fix: propagate host color scheme to pane apps (#2214)
refs #714
2026-08-03 02:05:27 +03:00
Ogulcan Celik e27a4ea427 perf: skip rendering hidden pty updates 2026-07-28 23:29:11 +03:00
Can Celik 8843bbb0c4 fix: improve sidebar worktree hierarchy and reordering (#1873)
* fix: clarify sidebar worktree hierarchy

refs #1694

* feat: reorder worktree groups as a unit

refs #1694
2026-07-26 02:45:44 +03:00
Can Celik d4e0dd3d90 perf: eliminate repeated workspace git discovery (#1842)
* perf: eliminate repeated workspace git discovery

refs #1838

* fix: keep workspace labels current without extra redraws

refs #1838

* fix: retain discovered workspace git metadata

refs #1838
2026-07-25 04:26:55 +03:00
Ogulcan Celik e608a75159 fix: make known-agent exit process-owned
refs #1792
refs #1648
2026-07-24 02:50:58 +03:00
Ogulcan Celik d30ab1b54f feat: add plugin-driven agent views and startup hooks 2026-07-20 00:55:36 +03:00
Ogulcan Celik 3f80947678 feat: make agent automation a first-class cli primitive 2026-07-19 23:56:07 +03:00
Ogulcan Celik e0758c3211 feat: harden named agent cli workflows
refs #1525
2026-07-17 23:59:56 +03:00
Ogulcan Celik 2c7c8beb07 feat: add floating popup panes
refs #1125
2026-07-15 04:02:14 +03:00
Ogulcan Celik 88370e1516 feat: add isolated pane graphics streaming 2026-07-15 02:32:52 +03:00
2e5da968ea fix: forward outer focus events to panes (#1388)
* fix: forward outer focus events to panes

refs #1337

* fix: preserve ordered focus forwarding

refs #1337

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-07-14 01:06:11 +03:00
Ogulcan Celik 5cfe5e5e73 feat: add configurable sidebar metadata tokens 2026-07-13 03:30:13 +03:00
ppggffandOgulcan Celik 2bc1724c2d fix: switch prefix ASCII input source on the foreground client (#1016)
* fix: switch prefix ASCII input source on the foreground client

The macOS prefix ASCII-switch ran in the headless server, whose
TISCopyCurrentKeyboardInputSource read is a stale per-process cache
(refreshed only via a main-run-loop notification the server never pumps),
so prefix could leave the terminal on the wrong input source.

Forward it to the foreground client, like clipboard: sync_prefix_input_source
emits AppEvent::PrefixInputSource as an intent; the server forwards it to the
foreground client and the monolithic app applies it in-process via
RealPrefixInputSource, which pumps its main run loop before the stale TIS read.
Key it on Mode::wants_ascii_input so multi-level prefix commands keep ASCII
until returning to the terminal, and restore the IME for rename text entry.

Adds ServerMessage::PrefixInputSource to the already-unreleased protocol 15.

refs #774

* fix: keep prefix input-source switch out of the headless server process

An App-internal drain (the exhaustive drain at the top of
handle_api_request, reachable from prefix-key runtime mutations) can
consume a queued PrefixInputSource intent before the server's
forwarding drain sees it, applying the TIS switch in the headless
server process and stranding the restore state. Gate the in-process
switch on App.local_input_source_switch, disabled by the headless
server alongside the other local side effects, so a swallowed intent
degrades to a skipped switch. Widen the forwarding-bypass maintenance
test to the handle_internal_event_with_prefix_sync wrapper.

refs #774

* docs: clarify prefix input-source comments and flag docs

refs #774

* fix: bump protocol for prefix input source

refs #774

---------

Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-07-05 03:25:47 +03:00
Ogulcan Celik 15cab964f3 feat: emit layout update events for runtime layout changes 2026-07-04 16:51:10 +03:00
Ogulcan Celik cf3769feb9 feat: follow focused pane cwd for new workspaces
refs #919
2026-07-02 13:58:26 +03:00
Ogulcan Celik 2c422e60f1 feat: inject powershell prompt shell integration for cwd reporting on windows
refs #919
2026-07-02 13:58:25 +03:00
Ogulcan Celik 0bab01573a refactor: route headless workspace tab mutations through runtime dispatch 2026-06-30 20:29:57 +03:00
Ogulcan Celik 8b1d77acf6 fix: keep powershell panes alive after agent ctrl-c
refs #860
2026-06-30 00:19:36 +03:00
Ogulcan Celik 9150ed6268 feat: add session snapshot api 2026-06-29 21:36:48 +03:00
Ogulcan Celik 1a4e94e57e refactor: route tui mutations through runtime authority 2026-06-29 18:09:25 +03:00
Ogulcan Celik 73b137a4ae fix: preserve focus after temporary pane commands
refs #658
2026-06-20 15:37:43 +03:00
Ogulcan Celik 46a2b259a7 fix: defer api worktree operations
refs #686

refs #657

refs #662

refs https://github.com/ogulcancelik/herdr/discussions/687
2026-06-19 18:59:43 +03:00
Ogulcan Celik fbd20ad6e4 feat: add plugin v1 system
Add manifest-driven plugin actions, event hooks, pane entrypoints, link handlers, and host APIs.

Support plugin link, GitHub install, build commands, installed plugin registry, pane movement, runtime context, and plugin docs.
2026-06-14 03:47:07 +03:00
Ogulcan Celik d35c642ef3 feat: add pane move api and cli
refs #299
2026-06-13 01:59:24 +03:00
Ogulcan Celik f7a7da03fc fix: stabilize public pane and tab ids
refs #569
2026-06-12 19:10:09 +03:00
Ogulcan Celik 36a1b7f864 feat: distribute agent detection manifests 2026-06-10 15:33:45 +03:00
Ogulcan Celik ee51c5e5fb feat: use pty-first agent detection 2026-06-09 04:26:19 +03:00
Ogulcan Celik 3c2b46d24a feat: add native windows beta support 2026-06-07 16:29:44 +03:00
Ogulcan Celik 4001fd2ec8 feat: improve toast ergonomics
refs #486
2026-06-06 17:42:38 +03:00
Ogulcan Celik b7619db085 feat: expose pane zoom api 2026-06-06 00:41:19 +03:00
Ogulcan Celik 556b16b2df feat: add pane navigation controls
refs #421

refs #330

related discussions:

https://github.com/ogulcancelik/herdr/discussions/422

https://github.com/ogulcancelik/herdr/discussions/438

https://github.com/ogulcancelik/herdr/discussions/442
2026-06-05 22:06:02 +03:00
Ogulcan Celik 295b09ca25 feat: make claude codex opencode hooks session-only 2026-06-02 21:25:32 +03:00
Ogulcan Celik 7781979738 fix: clarify update restart guidance 2026-05-31 03:04:20 +03:00