Commit Graph
94 Commits
Author SHA1 Message Date
JJ Liebig da49cb8a9d fix: preserve mouse selection during pane output (#3538) 2026-09-02 16:20:01 +02:00
Can Celik d08e44686d fix(client): detach when terminal geometry is unavailable (#3531)
refs #3519
2026-09-02 16:09:19 +03:00
Can Celik 6c0bb273d5 feat: support independent multi-client tab views (#3526) 2026-09-02 14:24:33 +03:00
Can Celik cc88b3b8e5 feat: add stable client endpoint compatibility (#3509)
* feat: add stable client endpoint compatibility

* fix: keep portable-pty patch checks composable

* ci: run maintenance checks in pull requests

* fix: reject endpoint errors from terminal clients

* feat: keep compatible servers running across updates
2026-09-02 02:45:20 +03:00
JJ Liebig 18e69891dc fix(windows): keep openssh mouse input draining (#3512)
refs #3459
2026-09-02 00:57:08 +02:00
akbashandakbash-bot 0032c3b427 fix(windows): preserve remote multiline paste (#3282)
refs #3209

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-09-02 00:02:25 +02:00
JJ Liebig facf0aafca fix(windows): parse openssh mouse reports with physical escape (#3502)
* fix(windows): parse openssh mouse reports with physical escape

* fix(windows): require sgr mouse prefix

* fix(windows): preserve escape ordering and modifiers
2026-09-01 17:39:23 +02: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
JJ Liebig ef2674bab8 fix(windows): enable mouse reporting over openssh (#3461)
refs #2810
2026-08-31 21:22:56 +02:00
Can Celik 1d604329b0 fix(windows): preserve non-us shifted text (#3055)
* fix(windows): preserve non-us shifted text

refs #3045

* fix(windows): retain shifted key repeat lifecycle

refs #3045
2026-08-23 00:01:57 +03:00
akbashandakbash-bot 8fe09d5ddf fix: preserve multiline paste in terminal attach (#3056)
refs #3054

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-08-21 15:16:43 +03:00
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
Can Celik 94093acb0a fix: match Windows Ctrl+digit keybindings (#2913)
refs #2910
2026-08-17 23:26:18 +03:00
Can Celik 2b4b3849ca fix(theme): skip host palette queries under wsl (#2852)
refs #2440
2026-08-16 00:05:24 +03:00
Can Celik b660cad804 fix(client): handle remote terminal hangup (#2827)
refs #2424
2026-08-15 15:03:59 +03:00
Can Celik b7dca4bb2a fix(graphics): support high-dpi direct file frames (#2680) 2026-08-13 17:21:26 +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
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
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
3825c0c300 fix(theme): refresh host appearance on focus (#2417)
* fix(theme): refresh host appearance on focus

refs #2416

* fix(input): preserve split appearance replies

refs #2416

* fix(input): retain fragmented appearance reports

refs #2416

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-08-06 17:38:20 +03:00
Can Celik 2863b71513 feat(windows): support remote attach to unix hosts (#2329)
* feat(windows): support remote attach to unix hosts

* fix(remote): preserve unix bridge behavior
2026-08-05 19:34:24 +03:00
ee8429fb79 fix(input): parse default mouse reports (#2312)
* fix(input): parse default mouse reports

refs #2309

* fix(input): preserve split default mouse reports

refs #2309

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-08-04 22:35:33 +03:00
WakaTaira 8901139439 fix(client): query host cell size when the ioctl reports no pixels (#2160) 2026-08-02 16:53:08 +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
Ogulcan Celik 61f6400675 fix: repaint after transient terminal resizes 2026-07-26 15:05:28 +03:00
joonhwanandOgulcan Celik 6cfaa079a9 feat: switch IME to ASCII in prefix mode on Windows (Korean IME) (#1823)
* feat: switch IME to ASCII in prefix mode on Windows

Extend switch_ascii_input_source_in_prefix to Windows: detect IME state
via WM_IME_CONTROL and toggle to ASCII with SendInput for the Korean IME.
Other IME languages are detected and left unchanged.

refs #1802

* docs: clarify Windows (Korean IME) support for prefix ASCII switching

Follow-up to the Windows prefix ASCII switch, which extended
switch_ascii_input_source_in_prefix to Windows but left the surrounding
text describing macOS only.

- Settings row label: "(macOS)" -> "(macOS/Windows)", plus its test.
- Generalize the Windows behavior wording to "switches the IME to
  English (ASCII) input" in the config-reference.json entry and the
  model.rs doc comment, and state that Windows support is currently
  limited to the Korean IME.
- Add a :::caution aside noting the Korean-IME-only limitation to the
  en/ja/zh preview docs, keeping the three translations in sync.

refs #1802

* fix: warn when prefix IME toggle injection is incomplete

SendInput can queue fewer events than requested (for example when blocked
by UIPI), which would otherwise leave the IME silently stuck in ASCII or
native mode. Log a warning with the sent and expected counts so the failure
is diagnosable.

refs #1802

* fix: guard prefix IME restore and correct open-status naming

Address maintainer review on the Windows prefix ASCII switch:

- Restore only when safe: store the foreground window at switch time and,
  before toggling back, require that the same window is still focused and
  the IME is still in English. This stops restore from toggling another
  application or overriding a manual return to Hangul during prefix mode.
- Report injection success from send_vk_tap and only arm restoration when
  the initial toggle landed; on a partial injection retry the dropped
  key-up so a key is not left logically held down. The injection policy is
  split into send_vk_tap_with(inject) so the success, partial, and failure
  branches are unit-tested without the real SendInput.
- Correct the WM_IME_CONTROL sub-command naming: 0x0005 is IMC_GETOPENSTATUS
  (IME open state), not IMC_GETCONVERSIONMODE. Behavior is unchanged; the
  constant, comments, and tests now describe the open-status read.

refs #1802

* fix: bound IME open-status read with a timeout

The prefix IME switch reads IMC_GETOPENSTATUS via WM_IME_CONTROL, which
crosses into the terminal-emulator process. A plain SendMessageW would block
herdr's client thread until that process responds, indefinitely if it hangs.
Read through SendMessageTimeoutW with SMTO_ABORTIFHUNG and a short timeout
instead; on timeout the switch is skipped and restore does nothing, so a hung
host process can no longer freeze prefix-mode entry or exit.

refs #1802

* fix: preserve windows ime restoration after partial injection

refs #1802

---------

Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-07-25 20:52:45 +03:00
Ogulcan Celik 36de78dd4f fix: preserve kitty graphics during host repaints
refs #1628
2026-07-24 01:31:06 +03:00
akbashandOgulcan Celik 503613c8ec fix: inherit host palette in pane queries (#1759)
refs #1752

Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-07-24 01:28:35 +03:00
Ogulcan Celik e7fc85bfdb fix: preserve kitty printable key releases
refs #1746
2026-07-23 03:47:44 +03:00
Ogulcan Celik 2a20e90a02 fix: preserve physical escape on windows
refs #1736
2026-07-23 01:49:54 +03:00
Ogulcan Celik 02a6e874f6 perf: batch contiguous terminal diff writes
refs #283
2026-07-18 03:56:51 +03:00
Ogulcan Celik c1f7b6f331 fix: preserve lone escape input boundaries
refs #541
2026-07-18 02:51:29 +03:00
Ogulcan Celik 464c658fdd fix: reassemble split sgr mouse input
refs #1382
2026-07-14 23:26:02 +03:00
Ogulcan Celik 36b2e2f546 fix: use drawn cursor by default in wsl
refs #930
2026-07-09 03:35:35 +03:00
akbashandakbash-bot ed31632ebf fix: bridge remote image file drops (#1085)
refs #828

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-07-06 19:51:28 +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 6f148588dd fix: scope empty image paste bridge to remote
refs #986
2026-07-03 22:19:47 +03:00
Ogulcan Celik aa0768b734 fix: stop sgr mouse sequences leaking into panes
refs #939
2026-07-03 02:49:27 +03:00
Ogulcan Celik d1471e6483 fix: draw host cursor on windows
refs #930
2026-07-02 21:59:06 +03:00
Ogulcan Celik f4d216b63d fix: preserve windows backspace input
refs #907

refs #920
2026-07-02 16:22:11 +03:00
Ogulcan Celik 26db26e416 fix: keep remote sessions alive across disconnects 2026-06-30 19:49:55 +03:00
Ogulcan Celik 0fa6440d41 feat: add terminal session control stream 2026-06-30 02:48:02 +03:00
Ogulcan Celik f3da280ccc fix: preserve windows win32 bracketed paste
refs #670
2026-06-30 02:17:20 +03:00
Ogulcan Celik bffc4a82c8 feat: add terminal session observe stream 2026-06-30 01:10:28 +03:00
Ogulcan Celik 7811d84f15 fix: ignore modifier-only windows input
refs #795
2026-06-25 17:23:01 +03:00
Ogulcan Celik c792f2fd53 fix: preserve alacritty input on windows
refs #792
2026-06-25 16:32:00 +03:00
Ogulcan Celik a720367889 fix: extend remote client handshake timeout for high-latency links
refs #753
2026-06-24 15:39:29 +03:00
Ogulcan Celik 052f20214b fix: preserve windows terminal multiline paste
refs #670
2026-06-19 22:24:20 +03:00