Skip to content

merge: upstream herdrdev/herdr v0.9.3 (3d9d2b18) into patt/perf-graphics - #2

Closed
pattobrien wants to merge 517 commits into
patt/perf-graphicsfrom
patt/perf-graphics-upstream-2026-10-05
Closed

pattobrien wants to merge 517 commits into
patt/perf-graphicsfrom
patt/perf-graphics-upstream-2026-10-05

Conversation

@pattobrien

Copy link
Copy Markdown
Owner

Summary

Merges upstream herdrdev/herdr master at 3d9d2b18 (tags v0.8.2, v0.9.0, v0.9.1, v0.9.2, v0.9.3; 513 commits since the fork point 346411fa = v0.8.0) into patt/perf-graphics, then re-expresses the fork features that upstream's refactors broke.

patt/perf-graphics (134c42fb, v0.8.0-graphics.4)
└── cf614e08  merge upstream/master 3d9d2b18        # 15 conflicted paths resolved
    ├── cab7a8a1  perf: input lag while kitty graphics panes stream   # re-expressed on #4561/#4657 code
    ├── ebdf55fd  feat: client.sidebar.toggle api + herdr terminal sidebar toggle   # rewritten on the client.window_title pattern
    └── cca140a3  feat: mirror pane OSC 22 pointer shapes on the host cursor   # host half re-homed in the client shell

Upstream highlights in the range: the Herdr-specific pane.graphics.* API is gone in favour of native Kitty rendering (herdrdev#4561); shell/sidebar rendering and hit-testing moved into the client (herdrdev#3487); multi-client tab views (herdrdev#3526); SGR-pixels mouse reporting fixed (herdrdev#3295, v0.9.1); preview release channel; libghostty-vt extracted into crates/ghostty-vt (herdrdev#4661) and the vendored source now needs Zig 0.16.0.

Audit of fork-only commits

Fork commit Topic Class Upstream citation Action
e3aa7611 perf: fix second-long input lag while kitty graphics panes stream graphics/perf (c) still fork-only No o=z upload compression upstream (flate2 only transitive); the one attempt, herdrdev#3934, was closed by the contributor gate. herdrdev#4561 added temp-file delivery but gates it to TERM_PROGRAM=ghostty; Kitty hosts still get inline base64. Unix client still shares one 256-slot channel for stdin and server frames (src/client/mod.rs:514); upstream fixed the same backpressure only on Windows. Related open issues herdrdev#3877, herdrdev#3783. Re-expressed as cab7a8a1: write_kitty_upload in src/kitty_graphics.rs used by the inline branch of src/client/frame_output.rs; dedicated 2-slot server-frame channel consumed by the last arm of the biased select in src/client/events.rs::next_loop_event.
dd536e00 bench: add input-latency harness and v0.8.0 vs fork results graphics/perf (c) keep No bench/ upstream; harness drives standard kitty escapes through the PTY (path herdrdev#4561 kept); experimental.kitty_graphics, experimental.allow_nested and the render.prof log line still exist. Kept as-is. results-*.json and the README table are stale vs 0.9.3.
e930c6a1 fix: tolerate pre-release suffix when parsing versions releases (c) keep, drop candidate Version::parse in src/update.rs is byte-identical upstream; Version::current() still panics on X.Y.Z-suffix. Upstream's supported path is HERDR_BUILD_CHANNEL/HERDR_BUILD_ID at build time (build_info::version(), .github/workflows/preview.yml:163). Kept (clean auto-merge). Drop it if fork builds switch to HERDR_BUILD_CHANNEL=graphics HERDR_BUILD_ID=N with a plain Cargo.toml version.
fa653722 40a856ec 0f0aa005 134c42fb release: v0.8.0-graphics.1..4 releases (d) superseded Upstream Cargo.toml is 0.9.3. Merge carries 0.9.3; the next fork release picks its own string.
21511f34 fix: report real pixel coordinates to SGR-pixels mouse panes mouse coords (a) resolved upstream Issue herdrdev#3295 closed 2026-09-14, released v0.9.1: 1777e9b herdrdev#2523 (Position on the encoder), 3a822e8 herdrdev#3637 (MOUSE_FORMAT_SGR_PIXELS), 9631f8e herdrdev#4045, b0c05e6 herdrdev#4140. src/ghostty/mod.rs became crates/ghostty-vt/src/lib.rs (fff6c82 herdrdev#4661). Upstream test ghostty_mouse_sgr_pixels_preserves_exact_and_downgrades_cell_input asserts the cell-input downgrade the fork had replaced. Dropped: upstream taken for src/pane/input.rs, the mouse hunks of src/pane/terminal.rs, and crates/ghostty-vt/src/lib.rs (git had carried cell_size_px across the rename).
ae7575eb feat: mirror pane OSC 22 pointer shapes on the host cursor pointer shapes (c) still fork-only No OSC 22 / pointer-shape handling upstream (grep, log, gh search empty; herdrdev#116/herdrdev#117 are DECSCUSR text-cursor). Host half broken by 207be3c herdrdev#3487 (hit-testing and Mode moved to the client shell; src/app/input/mouse.rs deleted) and the frozen ServerMessage variant order. Pane-side tracker kept in the merge; host half re-homed as cca140a3 via an endpoint.pane-pointer-shape.v1 EndpointControl message and a client-shell hover resolver (src/client/shell/pointer_shape.rs). PROTOCOL_VERSION untouched.
aef49f7d feat: add ui.sidebar.toggle api method and herdr sidebar toggle cli sidebar toggle (d) obsolete as written sidebar_collapsed lives only in src/client/shell/* since 207be3c herdrdev#3487, so the fork's server-side flip no longer compiles. No ui.* namespace upstream; command.invoke only resolves custom commands. herdrdev#1623 closed NOT_PLANNED, discussion herdrdev#1624 open. docs/next/api/herdr-api.schema.json is generated (generated_protocol_schema_artifact_is_current). Dropped from the merge; rewritten as ebdf55fd on the client.window_title.* intercept pattern: method client.sidebar.toggle, CLI herdr terminal sidebar toggle (what scripts/herdr-worktree-menu already calls), pushed to the foreground client as endpoint.sidebar-toggle.v1.
opentui_256_palette_query_burst_uses_host_snapshot (src/pane/terminal.rs) palette queries not a fork change Upstream 503613c herdrdev#1759, already in the fork base; byte-identical at 346411fa and upstream/master. The only palette-adjacent upstream change, f83980d herdrdev#2162 (OSC 4 overrides), does not touch the query-burst path. Upstream version intact.

Conflicts resolved

15 conflicted paths in cf614e08:

  • Cargo.toml, Cargo.lock: upstream (0.9.3, workspace with crates/ghostty-vt).
  • src/pane/input.rs, src/kitty_graphics.rs, src/client/mod.rs, src/server/headless.rs, src/protocol/wire.rs, src/api/schema.rs, src/api/schema/response.rs, src/api/server.rs, docs/next/api/herdr-api.schema.json: upstream; the fork hunks were either superseded or re-expressed in the three follow-up commits.
  • src/app/input/mouse.rs: deleted (upstream removed it).
  • src/events.rs, src/app/actions.rs: kept PanePointerShape, dropped PrefixInputSource (removed upstream).
  • src/pane/terminal.rs: upstream for the mouse-encoder region and the renamed tests; kept process_pty_bytes_surfaces_pointer_shape_changes; removed the fork's two SGR-pixel tests.
  • Auto-merged hunks reverted to upstream because their commits were dropped: src/app/api.rs, src/cli.rs, src/app/state.rs, src/app/mod.rs, crates/ghostty-vt/src/lib.rs.
  • Cherry-picking cca140a3 after ebdf55fd conflicted additively in src/client/endpoint/control.rs, src/protocol/endpoint.rs, src/client/mod.rs (both added an endpoint-control kind, decoder arm and client handler); both sides kept.

Evidence

  • Before: patt/perf-graphics at 134c42fb builds against v0.8.0; git merge upstream/master stops with 15 conflicted paths, and the fork's SGR-pixels and ui.sidebar.toggle hunks no longer compile against the client-rendered shell.
    After: cca140a3 on this branch:
    • cargo fmt --check: clean.
    • cargo clippy --all-targets --locked -- -D warnings on the repo-pinned toolchain (1.96.1 via rust-toolchain.toml; RUSTUP_TOOLCHAIN unset): clean.
    • Unit tests, run per top-level module in isolated processes (cargo-nextest is not installed and under plain cargo test upstream's platform::unix_common test resets SIGPIPE in-process, after which server::client_transport::...write_failure kills the whole binary; nextest's per-test processes hide this): 3,593/3,593 bin tests pass, 72/72 lib tests pass. Touched modules re-run on the final tree: client 668, server 309, protocol 156, kitty_graphics 46, api 314, cli 107, pane 381, terminal 286, update 78, app 480, events 3, terminal_effects 3; 0 failures.
    • Integration tests (cargo test --test '*' -- --test-threads=1): 17 binaries, 140 tests, 0 failures (api_ping 13, client_mode 27, cross_area 10, detach_reattach 13, live_handoff 23, machine_setup 11, multi_client 9, remote_attach 1, server_headless 18, session_delete 6, session_restore 6, broken_pipe 3).
    • cargo build --release --locked: ok.
    • Smoke test in a throwaway herdr --session merge-smoke (isolated XDG_CONFIG_HOME/XDG_STATE_HOME, HERDR_* scrubbed, kitty-replying pty host) against the release binary:
server_started: true
workspace_list: {"code":0,"workspaces":1}
plugin_link: ok (tests/fixtures/plugin-smoke, id example.smoke)
plugin_pane_open --placement split --no-focus: ok, pane.focused=false
focused pane before/after: w1:p1 -> w1:p1
OSC 10;? / OSC 11;? from a pane: ]10;rgb:cdcd/d6d6/f4f4  ]11;rgb:1e1e/1e1e/2e2e
session_stop: ok, session_delete: ok

New tests added by the three feature commits: kitty_graphics::tests::{large_raw_uploads_are_deflated_and_round_trip, png_and_small_uploads_stay_raw, incompressible_raw_uploads_stay_raw}, client::events::tests::input_is_delivered_before_queued_server_frames, api::schema::tests::client_sidebar_toggle_request_round_trips, client::endpoint::control::tests::{sidebar_toggle_optional_control_round_trips, pane_pointer_shape_optional_control_round_trips}, client::shell::tests::chrome_context::toggle_sidebar_flips_the_collapsed_state_and_requests_a_resize, server::headless::tests::{sidebar_toggle_api_reaches_the_foreground_client, sidebar_toggle_api_reports_no_foreground_client}, client::shell::tests::pointer_shape::*.

Note: the plugin pane did not show up in herdr pane list (count stayed at 1) even though plugin pane open returned a pane object with focused: false; the stock 0.9.3 binary was not checked for the same listing behaviour. The --no-focus claim rests on the response and the unchanged focused pane id.

Note: the fork's OSC 22 host-cursor mirroring and the input-latency fix were verified by unit tests only; no interactive latency measurement was repeated on this branch.

Merge Danger

Door: two-way

Plain merge commit plus three feature commits on a fork branch; git revert -m 1 cf614e08 or resetting patt/perf-graphics to 134c42fb restores the previous release line. Upstream master on the fork was fast-forwarded separately (e7c96206..3d9d2b18).

Blast Radius: fork-wide

Follow-ups

https://claude.ai/code/session_01ApRKSwFTijvcbtt8EG9Erx

ogulcancelik and others added 30 commits September 10, 2026 16:37
refs herdrdev#3922

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
)

Codex's Windows input reader does not surface bracketed paste. It buffers
the prompt as a paste burst and rewrites a following Enter into a newline
until the burst idles out, so the previous size-based delay only reduced
the chance of losing the submit. Append a non-character key after the
paste so Codex flushes the burst synchronously, giving every prompt a
deterministic submit boundary.

refs herdrdev#3187
Native Windows lint and check only clippy-checked the herdr binary, while macOS and Linux run clippy across all targets. Enable --all-targets on Windows and gate the Unix-only test helpers that this exposed so Windows check matches the Unix one.
…drdev#3962)

* fix(config): keep utf8 bom from breaking config reads and writes

refs herdrdev#3678

* fix(config): only strip displaced boms when config is invalid

refs herdrdev#3678

* fix(config): strip only boms the toml parser rejects

refs herdrdev#3678
* fix(remote): show SSH authentication output

refs herdrdev#3606

* test(remote): stabilize SSH authentication output regression

refs herdrdev#3606

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
* ci: retain zig build caches across validation runs

* ci: reduce debug information in validation builds

* ci: build only the ghostty test target for scalar checks

* ci: measure debug profiles and remove duplicate macos caching

* ci: compare scalar build scopes on one runner

* ci: keep the zig compiler path stable across runs

* ci: run macos and windows lint alongside tests

* ci: inspect remaining zig cache misses

* ci: remove completed measurement probes

* ci: compare windows linkers without changing release builds

* ci: test linux incremental reuse and correct the linker probe

* ci: measure windows incremental state reuse

* test: verify incremental reuse after a source change

* ci: finalize measured compiler cache optimizations
* fix: support opencode v2 lifecycle reporting

* fix: repair Japanese docs

* fix: ignore payload-less OpenCode events

* fix: harden opencode v2 integration install and reporting

Follow-ups on top of the V2 lifecycle support:

- create `cli.json` when OpenCode has no V1 TUI preferences (`tui.json` or
  `kv.json`) to migrate, instead of only registering into an existing file
- settle stalled socket attempts with a plain connect timer, and resend the
  latest lifecycle state after a failed delivery so the pane cannot get stuck
- resolve the OpenCode state directory from `XDG_STATE_HOME`
- remove the managed `herdr-opencode` directory on uninstall
- document failed executions reporting `blocked`, keep the integration test
  environment independent of an inherited `XDG_STATE_HOME`, and simplify
  `reconcileBlockers` to reassign its map

---------

Co-authored-by: Jonathan Liebig <jonathan.liebig@gmail.com>
…erdrdev#3972)

refs herdrdev#3948

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
refs herdrdev#3833

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
refs herdrdev#3314

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
* fix: honor space row gaps across machines

refs herdrdev#3738

* test: cover scrolling with machine space gaps

refs herdrdev#3738

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
JJLiebig and others added 28 commits October 2, 2026 15:30
* fix: avoid per-cell allocations in terminal text reads

refs herdrdev#4506

* fix: preserve tight allocations for owned grapheme reads

refs herdrdev#4506

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
* fix: stop hidden panes keeping a full-size screen copy from creation

* fix: start new panes at their laid-out size

refs herdrdev#4419
* 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
…f-graphics

Takes upstream for the SGR-pixels mouse fix (superseded by herdrdev#3295 in
v0.9.1), the ui.sidebar.toggle api (the server no longer owns sidebar
state since herdrdev#3487) and the client-side perf and pointer-shape hunks,
which are re-expressed on the new client/graphics code in follow-up
commits. Keeps the OSC 22 pane tracker, the bench harness and the
pre-release version parsing.

Claude-Session: https://claude.ai/code/session_01ApRKSwFTijvcbtt8EG9Erx
Port of e3aa761 onto the upstream upload and transport split.

- kitty_graphics: write_kitty_upload deflates raw RGB/RGBA inline uploads
  (o=z) when that shrinks them; PNG, small and incompressible payloads
  stay raw. The temp-file path keeps raw pixels for Ghostty.
- client: server readers feed a dedicated two-slot channel consumed by
  the last arm of the biased Unix select (events::next_loop_event), so
  frame bursts block the reader and the server's render slot instead of
  queueing ahead of keystrokes. Windows keeps its existing channels.

Claude-Session: https://claude.ai/code/session_01ApRKSwFTijvcbtt8EG9Erx
… toggle cli

fork-local: upstream keeps sidebar state in the client, so the server
forwards the toggle to the foreground client as an endpoint control and
the client runs the same path as the toggle_sidebar keybinding

Claude-Session: https://claude.ai/code/session_01ApRKSwFTijvcbtt8EG9Erx
Forward each pane's latest OSC 22 shape to client shells as an
endpoint.pane-pointer-shape.v1 control, seed newly connected shells
with the current shapes, and let the client resolve the hovered pane
on every mouse move so the host cursor only changes when needed. The
shape resets outside panes, outside terminal mode, when the endpoint
is lost and on terminal restore.

Claude-Session: https://claude.ai/code/session_01ApRKSwFTijvcbtt8EG9Erx
@pattobrien

Copy link
Copy Markdown
Owner Author

Superseded by #3: same tree, based on master so the diff is only the fork delta.

@pattobrien pattobrien closed this Oct 6, 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.