Skip to content

chore: sync upstream/master into fork master - #57

Merged
geril07 merged 68 commits into
masterfrom
sync/upstream-master
Oct 16, 2026
Merged

geril07 merged 68 commits into
masterfrom
sync/upstream-master

Conversation

@geril07

@geril07 geril07 commented Oct 16, 2026 •

Copy link
Copy Markdown
Owner

Sync upstream/master (143bf5f, 67 commits since 5da0a01) into fork master.

Upstream highlights: libghostty key encoding (herdrdev#5017), non-latin ctrl chords (herdrdev#4961), workspace last-pane confirm (herdrdev#5173), shared cli/api contracts (herdrdev#5212), handshake hardening (herdrdev#5242/herdrdev#5241/herdrdev#5247), agent detection updates, session/terminal fixes, releases 0.9.4/0.9.5.

Conflict resolutions:

  1. encode.rs delete/modify: accepted upstream deletion, retired fork encoder + Russian fallback onto the libghostty path.
  2. Non-latin ctrl: took upstream; dropped fork normalized_for_shortcut machinery (model/keybinds/input/parse/tests).
  3. Close-confirm: kept fork UX (confirm_pane_close confirms every pane); unified keybind/menu arms onto upstream request_pane_close; last-pane case uses upstream workspace dialog with pane_id.
  4. Handshake: kept fork terminal_size on top of upstream rework.
  5. agents.rs: kept elapsed-time token/field on upstream cli_params macro.

Also: mapped upstream Ctrl+[ hatch onto fork section-aware blocking (active_section_blocked) with Esc-parity preview clearing; fixed fork tests for the new last-pane dialog; bumped fork release seeds to 0.9.5 (protocol 22 / endpoint gen 1 unchanged).

Intentionally kept fork divergences: no custom commands against navigate previews (pre-existing fork stance, upstream resolve_custom_command not wired into navigate tail); per-pane confirm wins over workspace confirm when both enabled (pinned by test).

Known tradeoffs of taking upstream input path (by decision): terminals that omit the Kitty base-layout field get no non-Latin Ctrl rewrite; Ctrl+х no longer acts as Esc (fixterms parity).

Verification: cargo fmt, clippy -D warnings, cargo check --all-targets clean. nextest: 4230 passed, 1 failed (machine_api stale-path SSH test, fails identically on fork/master — environmental). maintenance/arch/assets/docs-contract tests pass. Fork identity files (distribution/fork-*, fork-release.yml, update.rs) intact. Two reviewer rounds (second xhigh) findings addressed; e2e behavioral run in progress.

kataokatsuki and others added 30 commits October 4, 2026 15:49
* test: isolate integration subprocesses from pane env

refs herdrdev#4928

* test: cover pane env isolation for spawned servers

refs herdrdev#4928

---------

Co-authored-by: kataokatsuki <kataokatsuki@users.noreply.github.com>
)

refs herdrdev#4910

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
…4734)

* fix: keep sidebar collapse clickable with agent scrollbars

refs herdrdev#4692

* docs: document sidebar mouse handling and regression coverage

refs herdrdev#4692
* fix: retain remote sidebar preferences across attaches

refs herdrdev#4364

* test: cover remote preference identity handoff

---------

Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
)

Bumps the github-actions group with 3 updates: [taiki-e/install-action](https://github.com/taiki-e/install-action), [cachix/install-nix-action](https://github.com/cachix/install-nix-action) and [softprops/action-gh-release](https://github.com/softprops/action-gh-release).


Updates `taiki-e/install-action` from 2.81.9 to 2.87.22
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](taiki-e/install-action@fd2f5e3...83ac0ad)

Updates `cachix/install-nix-action` from 31.10.6 to 31.11.1
- [Release notes](https://github.com/cachix/install-nix-action/releases)
- [Changelog](https://github.com/cachix/install-nix-action/blob/master/RELEASE.md)
- [Commits](cachix/install-nix-action@8aa0397...13d8dd5)

Updates `softprops/action-gh-release` from 3.0.0 to 3.0.3
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](softprops/action-gh-release@b430933...efb3536)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-version: 2.87.22
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: cachix/install-nix-action
  dependency-version: 31.11.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: softprops/action-gh-release
  dependency-version: 3.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…herdrdev#4964)

* fix: keep agent sessions while the agent is suspended or backgrounded

refs herdrdev#1647
refs herdrdev#1033

* fix: drop a suspended agent's session when a new one of its kind takes over

refs herdrdev#1647
…h 3 updates (herdrdev#4955)

Bumps the cargo-dependencies group with 3 updates in the / directory: [regex](https://github.com/rust-lang/regex), [serde](https://github.com/serde-rs/serde) and [futures-util](https://github.com/rust-lang/futures-rs).


Updates `regex` from 1.12.3 to 1.13.1
- [Release notes](https://github.com/rust-lang/regex/releases)
- [Changelog](https://github.com/rust-lang/regex/blob/master/CHANGELOG.md)
- [Commits](rust-lang/regex@1.12.3...1.13.1)

Updates `serde` from 1.0.228 to 1.0.229
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](serde-rs/serde@v1.0.228...v1.0.229)

Updates `futures-util` from 0.3.33 to 0.3.34
- [Release notes](https://github.com/rust-lang/futures-rs/releases)
- [Changelog](https://github.com/rust-lang/futures-rs/blob/main/CHANGELOG.md)
- [Commits](rust-lang/futures-rs@0.3.33...0.3.34)

---
updated-dependencies:
- dependency-name: futures-util
  dependency-version: 0.3.34
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-dependencies
- dependency-name: regex
  dependency-version: 1.13.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo-dependencies
- dependency-name: serde
  dependency-version: 1.0.229
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [Swatinem/rust-cache](https://github.com/swatinem/rust-cache) from e18b497796c12c097a38f9edb9d0641fb99eee32 to f0d9c3887740aee45f6153b24b3a6b815192ec16.
- [Release notes](https://github.com/swatinem/rust-cache/releases)
- [Changelog](https://github.com/Swatinem/rust-cache/blob/master/CHANGELOG.md)
- [Commits](Swatinem/rust-cache@e18b497...f0d9c38)

---
updated-dependencies:
- dependency-name: Swatinem/rust-cache
  dependency-version: f0d9c3887740aee45f6153b24b3a6b815192ec16
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* fix: keep the server alive when thread spawns fail

refs herdrdev#3324

* fix: keep thread spawn fallbacks from dropping work

refs herdrdev#3324

* fix: validate agent prompts before starting the waiter

refs herdrdev#3324

* fix: retry failed startup git refresh without clients

refs herdrdev#3324

* fix: time plugin commands from their exit

refs herdrdev#3324

* fix: make plugin finish time test independent of load

refs herdrdev#3324
* test: add input transparency conformance harness

* test: cover split host replies in input conformance harness

* fix: let libghostty encode every key sent to panes

* refactor: read live keyboard modes only from libghostty

* fix: wait for split input sequences instead of typing their fragments

* refactor: drop unused keyboard protocol argument from pane key encoding

* test: fix windows-only keyboard mode tests after libghostty mode refactor

* test: measure windows key record transparency against the keyboard layout

* fix: forward windows punctuation and altgr chords that produce no character

* test: expect libghostty kitty encoding in the windows conpty probe and cover release, alternate, text and modifyOtherKeys passthrough

* ci: lint windows-only test code in the cross-platform windows check

* refactor: delete herdr's own key encoder

* test: expect xterm modifyOtherKeys 2 encoding for shifted letters in the windows gauntlet

* refactor: read windows input through one native console reader

* refactor: parse sgr mouse reports once and map pixel reports without rewriting them

* refactor: decode framed input once instead of re-framing it in the client

* fix: keep macos alt, non-us kitty keys, text releases and reply-tail recovery correct after the libghostty switch

* fix: stop waiting for host replies the terminal never sends

* fix: deliver shifted punctuation releases after shift is let go

* fix: never type super, hyper or meta chords into panes that cannot read them

refs herdrdev#4356

* test: replay reporter captures for fixed split-read and key-release issues

refs herdrdev#4856
refs herdrdev#4025
refs herdrdev#4184

* fix: forward f1, f2 and f4 from kitty keyboard hosts

refs herdrdev#4403

* fix: send pixel mouse reports to unfocused panes and only when the host supports them

refs herdrdev#4750

* fix: treat 0x08 as backspace when the terminal's erase key is ctrl+h

refs herdrdev#3244

* test: fix macos lint and keep the pixel mouse server test unix-only

* fix: deliver legacy alt+escape on macos instead of dropping it

* fix: address review findings on super+enter, held key releases and the pixel mouse probe

* test: expect super+enter to stay out of plain windows panes

* test: wait for the host pixel mouse mode instead of reading the channel once

* fix: send ctrl+shift+letter to plain shells as its control byte

* fix: encode each key under one keyboard mode snapshot

* fix: keep ime text intact and stop inventing key releases for committed text

* fix: release held key reports on focus loss and never drop held-key leases

* fix: send ctrl chords on non-latin layouts as their physical key

* fix: match non-latin ctrl chord releases after ctrl is let go

* fix: drop super chords before the windows conpty fallback in plain panes
* fix: tell fish that herdr reflows its prompt on resize

refs herdrdev#3672

* fix: match fish_handle_reflow casing exactly on windows

refs herdrdev#3672

* test: keep temp path out of fish env spawn test command

refs herdrdev#3672
* perf: reuse unchanged shell detection text

refs herdrdev#5083

* perf: reuse unchanged shell detection text

refs herdrdev#5083

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
* fix: deliver quick esc taps on macos with kitty keyboard

refs herdrdev#1266

* test: cover esc splitting edge cases under the macos input policy

refs herdrdev#1266
…dev#5087)

* fix: stop waiting forever for an unfinished host color reply

refs herdrdev#5052

* fix: keep input that follows an unfinished host color reply

refs herdrdev#5052

* fix: drop an unfinished host color reply after an idle timeout

refs herdrdev#5052
ogulcancelik and others added 26 commits October 12, 2026 01:50
* refactor: share cli and api command contracts

* fix: address cli contract review findings
…#5232)

* fix: retry a reconnecting machine immediately when selected

Assisted-by: Claude <noreply@anthropic.com>

* fix: retry the active SSH machine when selected

refs herdrdev#4721

---------

Co-authored-by: Bart Louwers <bart@emeel.net>
* fix: cancel and clean up endpoint connection attempts

refs herdrdev#4721

* fix: keep probe teardown scoped to its bridge

refs herdrdev#4721

* fix: preserve nonblocking bridge output and simplify cleanup

refs herdrdev#4721
* fix: recover endpoint connections promptly after wake

refs herdrdev#4721

* test: wait for asynchronous endpoint pipe closure

refs herdrdev#4721
* fix: recover blocked shared ssh connections

refs herdrdev#4721

* test: support shared ssh checks in client fixtures

refs herdrdev#4721

* test: separate ssh cancellation from timeout scheduling

refs herdrdev#4721
…ev#5269)

portable-pty's Windows search_path accepted any existing candidate, so a directory on PATH whose name matched the program shadowed the real executable and CreateProcessW failed with os error 5. Require a regular file for both the exact name and the PATHEXT candidates.

refs herdrdev#5267
Every bundled Windows PowerShell hook read its hook JSON with
`[Console]::In.ReadToEnd()`, which decodes stdin using the process console
input code page instead of UTF-8. On Korean Windows (CP949) that corrupts
the payload, `ConvertFrom-Json` throws, and the hook silently exits without
reporting the session. Read the raw stdin stream as UTF-8 (BOM-aware) in
every PowerShell hook and bump the affected integration versions.

refs herdrdev#5253
The client_mode::federated_client_starts_without_local_and_survives_its_restart
integration test fails intermittently on the ubuntu (and macos) runners at two
polling budgets:

- "remote must be usable before Local exists"
- "remote reconnect N must restore visible input and preserve the shell"

Both budgets are shorter than the client's own connection and activation
deadlines. Saved-SSH discovery probes are bounded by a 15s SSH command timeout,
the remote handshake read timeout is 60s, and each endpoint activation phase has
a 5s deadline that can retry. Under a loaded runner the client can still be
legitimately connecting, or holding pane input closed through an activation
retry, when the test gives up.

Give the remote-readiness and remote-input waits budgets that exceed those
deadlines. The waits still return as soon as the observed condition holds, so
only the failure path gets slower. The intentionally tight waits that prove
Local does not wait for a stalled remote stay at 3s.
…5282)

PowerShell serializes progress records such as module auto-loading's
"Preparing modules for first use." to the stderr CLIXML stream when stderr is
redirected under `-EncodedCommand`, and Herdr forwards that stderr during
interactive remote setup. Set `$ProgressPreference = 'SilentlyContinue'` in the
shared Windows PowerShell preamble so `machine add` and `--remote` no longer
print raw CLIXML records.

refs herdrdev#4639
The macOS CI job intermittently fails
server::client_transport::tests::observer_write_timeout_resets_when_sending_makes_progress
with "assertion failed: write_framed_bytes(...)" followed by "observer
disconnected while making progress".

The test proves that every partial write resets the writer's deadline by
draining a 1 MiB frame through an observer that sleeps 5 ms per 16 KiB read
while the writer's send timeout is 100 ms. On a loaded runner, one scheduler
stall longer than 100 ms makes write_client_stream time out and shut the
socket down, so the write assertion fails and the observer then reads EOF.

Give the writer a 1 s timeout and slow the observer to 25 ms per read. The
transfer still takes about 1.6 s, longer than the timeout, so the deadline
reset is still required, while the stall budget grows 10x and the drain
cadence stays 40x below it.

Also bound both kernel socket buffers well below the frame size. The reset
path is only exercised while the writer is blocked, so the test should not
depend on the platform default buffers happening to be smaller than 1 MiB.
* fix: probe windows remote hosts before /bin/sh

Interactive remote setup forwards SSH stderr, so a Windows OpenSSH host with a
PowerShell default shell printed the raw `/bin/sh` CommandNotFoundException and
Windows was only identified by the fallback probe. Probe for Windows first for
interactive connections so those hosts never receive a `/bin/sh` command;
background bridges capture stderr and keep the POSIX-first probe.

refs herdrdev#5187

* fix: distinguish wsl from native windows ssh shells

refs herdrdev#5187
…dev#5308)

OpenSSH for Windows hands the SSH command argument to the login shell
wrapped in double quotes, which expanded the `$`/`$(...)` in Herdr's POSIX
discovery and API bridge scripts before `/bin/sh` ran them. A saved machine
whose default shell is WSL bash is detected as POSIX, so `herdr --machine`
then failed with `remote binary discovery failed`.

Deliver the discovery script on stdin (`/bin/sh -s`) and base64-encode the
cached POSIX API bridge command so the whole script, including any executable
path, stays out of the command argument. The decoded bridge reads the API
payload from fd 3 so decoding the script cannot consume it.

refs herdrdev#5132
…page (herdrdev#5303)

* fix: stop server crash when a cursor move carries a link onto a full page

refs herdrdev#5296

* fix: keep cursor link when a style page split moves the cursor

refs herdrdev#5296
…5236)

* fix: keep the macos server running when its terminal quits

refs herdrdev#4920

* test: cover the macos server leaving its launchd job

refs herdrdev#4920

* test: wait for the launcher to exit before checking the detached server

refs herdrdev#4920
)

A window drag can momentarily make the terminal report a zero-sized grid.
`terminal_grid_size()` turns that into an error, and the resize watcher
treated any error as a dead terminal: it detached and exited the client,
which ends the session on a remote host.

Keep the last known geometry and the pending resize signal, then resample.
Real terminal failures still detach, and startup still rejects a
zero-sized grid.

This prevents a zero-sized-grid-induced detach. Whether it fully explains
the reported Git Bash over SSH session loss is unconfirmed: the pasted ssh
log shows a normal session teardown, and the report's leftover mouse
reporting is not reproduced here.

refs herdrdev#4105
@geril07
geril07 force-pushed the sync/upstream-master branch from e2921b4 to 98af931 Compare October 16, 2026 08:40
Upstream 143bf5f, 67 commits since 5da0a01: libghostty key encoding, non-latin ctrl chords, workspace last-pane confirm, cli/api contracts, handshake hardening, agent detection, session/terminal fixes, releases 0.9.4 and 0.9.5.

Resolve 7 content conflicts plus encode.rs delete/modify by combining both sides: retire fork encoder and russian fallback onto upstream libghostty path, keep fork confirm_pane_close and terminal_size on upstream request_pane_close and handshake, keep agents elapsed-time token on upstream cli_params macro, map ctrl+[ hatch onto renamed workspace_preview_blocked. Bump fork seeds to 0.9.5.

Verified: cargo fmt, clippy, cargo check, nextest 4230 passed with 1 pre-existing machine_api stale-path failure also present on fork/master, maintenance/arch/assets/docs-contract ok.
@geril07
geril07 force-pushed the sync/upstream-master branch from 98af931 to 26d63a2 Compare October 16, 2026 09:04
@geril07
geril07 merged commit a8ae550 into master Oct 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants