Commit Graph
161 Commits
Author SHA1 Message Date
akbashandakbash-bot 1b56601630 fix: honor mouse capture config in terminal attach (#2995)
refs #2992

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-08-20 02:07:16 +03:00
akbashandakbash-bot e3c3d44358 fix(cli): exit quietly when output pipes close (#2996)
refs #2994

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-08-19 20:39:24 +03:00
Can Celik 15539d3dec feat: make headless terminal size configurable (#2829)
refs #2828
2026-08-15 15:09:53 +03:00
Can Celik b660cad804 fix(client): handle remote terminal hangup (#2827)
refs #2424
2026-08-15 15:03:59 +03:00
Ogulcan Celik 1af1a5b86f feat(cli): guide agents to Herdr resources 2026-08-14 04:22:48 +03:00
akbashandakbash-bot 9351b058f3 fix: reject prompts to blocked agents (#2790)
* fix: reject prompts to blocked agents

refs #2788

* docs: clarify agent prompt timing

refs #2788

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-08-14 01:22:46 +03:00
37644cabe0 fix: wait for new pane shell readiness (#2774)
* fix: wait for new pane shell readiness

refs #2773

* refactor: share agent startup bounds

refs #2773

* fix: reconcile agent names after startup timeout

refs #2773

* fix: cover agent cleanup scheduling skew

refs #2773

* fix: bound pane shell readiness retries

refs #2773

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-08-14 00:18:35 +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
ca1af383a8 fix(client): avoid abort on terminal hangup (#2427)
* fix(client): avoid abort on terminal hangup

refs #2424

* test(client): gate PTY integration on unix

refs #2424

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-08-09 17:45:40 +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 bdb5222eec fix(config): report unknown theme names (#2488)
refs #2452
2026-08-07 20:59:32 +03:00
Can Celik b0723b7906 fix(input): preserve shift in kitty alternate reports (#2479)
refs #2435
2026-08-07 19:07:36 +03:00
Kyle CorbeilleandCan Celik ecddecec62 fix(cli): accept --flag=value and reordered options in pane read/wait-output (#2183)
* fix(cli): accept --flag=value and reordered options in pane read/wait-output

* test(cli): trim redundant pane parser coverage

---------

Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-08-06 03:15:17 +03:00
akbashandakbash-bot e6fa5289f2 fix(ui): preserve sidebar scroll across clients (#2280)
refs #2255

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-08-04 15:37:33 +03:00
RhysandCan Celik 5eab32da81 fix(pi): restrict state reporting to tui sessions (#2159)
Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-08-03 03:44:44 +03:00
Season Saw f99647b2c2 fix: report a clear cli error when no herdr server is running (#1963)
* fix: report a clear cli error when no herdr server is running

socket cli commands surfaced a raw io::Error debug string
(`Error: Os { code: 2, ... }`) when nothing was listening on the
api socket, which read like a bad --cwd path. map dead-socket
connect failures to a `server_not_running` json error carrying the
resolved socket path, printed once at the edge that surfaces the
error; recovering callers (plugin offline registry fallback, agent
start polling) recognize the marker and keep their existing
behavior.

refs #1941

* fix: map dead-socket errors on the unchecked cli request path

refs #1941

* fix: make server-not-running guidance session-aware

refs #1941
2026-08-01 16:17:23 +03:00
Can CelikandJonathan Liebig b76adc155d fix(input): preserve native key lifecycle across routing (#2142)
refs #2077

Co-authored-by: Jonathan Liebig <jonathan.liebig@gmail.com>
2026-08-01 04:27:50 +03:00
Matt ColesandMatt Coles b4112743cf fix(client): restore terminal on sighup and sigterm
Enable termination-signal handling so SIGHUP and SIGTERM follow the graceful
quit path and restore terminal state. Log handler registration failures and
add PTY coverage for direct SIGHUP and server EOF restoration

Co-authored-by: Matt Coles <macols@amazon.com>
2026-07-31 00:46:01 +03:00
Andrew Krasnoff a0a6e13f11 fix: count ptmx master fds under devpts layouts (#1984)
live_server_holds_one_pty_master_fd_per_pane counted only /proc/<pid>/fd links
resolving to exactly /dev/ptmx. On devpts setups such as WSL2 and many
containers, a PTY master fd resolves to /dev/pts/ptmx instead, so the test found
zero masters and failed with "had 0 ptmx master fds; expected 1" even though the
server held the pane's master fd. Match both ptmx node paths; pty slaves still
resolve to /dev/pts/<N> and stay uncounted, so the one-master-per-pane invariant
is unchanged.
2026-07-29 01:20:58 +03:00
Ogulcan Celik 81f355fada perf: replace agent spinners with static status marks 2026-07-28 14:56:53 +03:00
JJ LiebigandCan Celik 1491b7dd9c fix: ignore nested codex session reports (#1927)
* fix: ignore nested codex session reports

refs #1789

* test: cover matching codex thread id

---------

Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-07-28 04:13:35 +03:00
Ogulcan Celik bb29eedb72 fix: delay agent prompt submission
refs #1878
2026-07-27 00:12:25 +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 e7fc85bfdb fix: preserve kitty printable key releases
refs #1746
2026-07-23 03:47:44 +03:00
Ogulcan Celik a02c3a69bb refactor: centralize new terminal cwd selection
replaces contributions from Pitchfork-and-Torch
2026-07-22 22:41:01 +03:00
Ogulcan Celik 1955406eaf fix: link plugins without a running server
refs #1670
2026-07-21 17:37:43 +03:00
Ogulcan Celik 69d07dba84 fix: make plugin state global across sessions
refs #1174
2026-07-20 23:04:15 +03:00
Ogulcan Celik 6f7ef04e7d fix: bound stalled agent prompt waits 2026-07-20 15:22:26 +03:00
Ogulcan Celik 3f80947678 feat: make agent automation a first-class cli primitive 2026-07-19 23:56:07 +03:00
Ogulcan Celik a51a15914a fix: support javascript integrations on windows
refs #1531
2026-07-18 23:56:20 +03:00
akbashandakbash-bot f11be93e04 fix: report unknown config keys (#1575)
* fix: report unknown config keys

refs #1573

* fix: preserve mixed config warning context

refs #1573

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-07-18 21:27:48 +03:00
Ogulcan Celik e0758c3211 feat: harden named agent cli workflows
refs #1525
2026-07-17 23:59:56 +03:00
Ogulcan Celik 550e9f8cc0 fix: follow foreground process group leader cwd
refs #1472
2026-07-16 23:13:41 +03:00
Ogulcan Celik a22454f27c fix: preserve plugins during live handoff
refs #893
2026-07-16 00:32:22 +03:00
600753b47b fix: guard cli requests against protocol mismatches (#1453)
refs #1435

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-07-15 23:43:21 +03:00
Ogulcan Celik 7767f3ed64 test: wait for multi-client resize propagation 2026-07-15 23:33:23 +03:00
Ogulcan Celik 80d2958aba fix(linux): scope foreground process discovery to panes
refs #1399
2026-07-14 23:40:35 +03:00
Ogulcan Celik 5cfe5e5e73 feat: add configurable sidebar metadata tokens 2026-07-13 03:30:13 +03:00
Ogulcan Celik a6905364b6 fix: clarify config fallback diagnostics 2026-07-12 03:58:27 +03:00
Ogulcan Celik 3e8f9df14e fix: improve config diagnostic delivery 2026-07-10 17:28:31 +03:00
Pitchfork-and-Torch 4f7fcc48d1 fix: follow foreground cwd for new terminals
refs #1245
2026-07-10 15:06:54 +03:00
Ogulcan Celik 9c45342766 fix: preserve explicit session sockets during live handoff
refs #1180

reported-by: dvic

based-on: https://github.com/dvic/herdr/pull/3
2026-07-09 16:32:26 +03:00
Dillon Mulroy adbaae68da fix: reanchor pi status after session replacement (#1189)
* fix: reanchor pi status after session replacement

refs #943

* fix: guard active pi sessions from nested startup

refs #943

* fix: serialize pi session replacement reports

refs #943
2026-07-09 01:55:14 +03:00
Ogulcan Celik faee06764e test: synchronize multi-client resize assertion 2026-07-06 19:25:42 +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 e713949ca5 test: wait for client frame before crash assertion 2026-07-05 03:00:45 +03:00
Ogulcan Celik c78349f422 fix: wait for server stop socket cleanup 2026-07-05 02:17:45 +03:00
Ogulcan Celik 5d9212a55a feat: expose session snapshot through cli 2026-07-04 16:51:10 +03:00
Ogulcan Celik 045f506ec8 fix: keep windows wait connections open
refs #963
2026-07-03 20:38:05 +03:00