Skip to content

feat: sync herdr v0.9.3 and add the whats-new full history view - #15

Merged
jsonMartin merged 100 commits into
mainfrom
upstream-sync/v0.9.3
Oct 8, 2026
Merged

jsonMartin merged 100 commits into
mainfrom
upstream-sync/v0.9.3

Conversation

@jsonMartin

Copy link
Copy Markdown
Owner

Merges upstream Herdr v0.9.3 (single merge commit per repo policy) and lands the accepted OpenSpec change whats-new-full-history (accepted by jsonMartin in the working session 2026-10-07, revision 2).

Verification (hotrod, 16 cores):

  • nextest: 4038 run / 4038 passed / 16 skipped (11 net new tests); one parallelism-only libtest flake in the herdr bin target reran clean serially (pre-existing, 16-core race in remote_bridge_tests)
  • cargo fmt --check clean on modified files; clippy --all-targets --locked -D warnings exit 0 (toolchain 1.96.1)
  • openspec validate --all --strict: 6 passed / 0 failed (archived change + new superherdr-release-notes baseline)
  • herdr --version → herdr 0.9.3 (superherdr 0.9.3.1)
  • just-recipe equivalents run by hand (no just on this machine): maintenance-test 96 OK, ui-hot-path-architecture-test 6 OK, integration-assets-test 55 pass

Notes:

  • Sync: Cargo.toml/Cargo.lock conflicts resolved keeping Superherdr name/version; fork snooze connect-drain ports; restore.rs layout-fingerprint restamp (intent-preserving); WIP state.rs test from the maintainers working tree landed with the sync commit.
  • Whats-new: embedded merged CHANGELOG (released sections first, inherited 0.9.1–0.9.3 below), menu always available, startup/product-announcement behavior untouched. Syncs now must graft inherited sections (test-enforced newest-first).

kangal-bot and others added 30 commits September 16, 2026 16:38
refs #4240

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
backup_preserves_legacy relied on a freshly created temp file already having a legacy DACL (D:(...)). Directories that grant inheritable ACEs produce D:AI(...) instead, so the fixture failed before exercising the backup path. Install the legacy DACL explicitly, preserving the existing ACEs while clearing the auto-inherit and protected control bits.
* fix(windows): prefer pwsh for the default pane shell

Windows panes launched Windows PowerShell 5.1 (powershell.exe) whenever [terminal] default_shell was unset, ignoring PowerShell 7 even when pwsh.exe resolved on PATH. Resolve the unset default against PATH and prefer pwsh.exe, falling back to the inbox powershell.exe. An explicit default_shell still wins.

* fix(windows): validate pwsh before using it as the default shell

portable-pty resolves the configured shell with Path::exists and passes that path to CreateProcessW, which does not fall through to later PATH entries. Selecting an invalid pwsh.exe would therefore break new panes instead of falling back. Only prefer a pwsh.exe that starts with the PE MZ magic, and return its path so the validated binary is the one launched.

* fix(windows): validate the full PE header before preferring pwsh

Checking only the DOS MZ signature still accepted truncated images, DLLs, and foreign-architecture binaries. Because portable-pty passes the resolved path straight to CreateProcessW without trying later PATH entries, validate the PE signature, the COFF header (machine, executable-image bit, not a DLL, section count), and the optional header before preferring pwsh.exe.

* fix(windows): accept native ARM64 pwsh and validate the section table

Herdr ships an x64 Windows build that also runs on Windows ARM64 under x64 emulation, so cfg!(target_arch) cannot tell whether a native ARM64 pwsh.exe is launchable. Accept every executable machine type Windows supports instead of rejecting ARM64 on the x86_64 build. Also bound-check the section table (40 bytes per declared section) after the optional header so a truncated table falls back instead of being selected.

* fix(windows): detect the native host machine for pwsh compatibility

Machine compatibility was derived from cfg!(target_arch), which reports the emulated x64 process on Windows ARM64, and then briefly accepted ARM64 on every host. Read the native machine with IsWow64Process2 in the platform layer instead: ARM64 Windows accepts ARM64/x64/x86 images, x64 accepts x64/x86, and x86 accepts only x86.
Windows refuses file symlinks with ERROR_PRIVILEGE_NOT_HELD (1314) unless
the test process is elevated or Developer Mode is enabled, which broke
non-admin local runs. Share a helper that reports the missing privilege so
the two symlink tests skip only the symlink-dependent assertions.
* test: add local windows input gauntlet

refs #4251

* test: add local windows input gauntlet

Harden elevation and channel identity checks, distinguish known host limitations, and surface incomplete cleanup.

refs #4251

* test(windows): harden input gauntlet execution

refs #4251

* test(windows): make input gauntlet self-contained

refs #4251

* test(windows): bound input gauntlet failure paths

refs #4251

* test(windows): extend input qualification gauntlet

refs #4251

* test(windows): complete input qualification matrix

refs #4251

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: Jonathan Liebig <jonathan.liebig@gmail.com>
* fix(windows): preserve mouse capture during refresh

refs #4284

* test(windows): fix default input gauntlet invocation

* fix(windows): preserve pixel mouse transitions

refs #4284
* test(windows): qualify remote clipboard image paste

refs #4314

* test(windows): verify staged clipboard image contents

refs #4314

* test(windows): safely clean failed clipboard leases

refs #4314
Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
* fix: preserve request ids in socket error responses

refs #4344

* docs: clarify socket error response limits

refs #4344

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
* fix: reveal selected agent when cycling the sidebar

* fix: reveal agent after endpoint activation
refs #4346

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: Can Celik <ogulcancelik@gmail.com>
* fix: prevent cursor jumps during synchronized redraws

refs #4303

* fix: settle cursor positions across delayed windows redraws

refs #4303

* fix(windows): hold jump-shaped cursor moves through the max window

* fix: bound windows cursor settling and repaint at its deadline

refs #4303

---------

Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
Co-authored-by: JJLiebig <jj@liebig.gg>
Co-authored-by: Axel Karlsson <axelalbertkarlsson@outlook.com>
…#4394)

* test(windows): distinguish clipboard paste origin in input gauntlet

refs #4314

* test(windows): correct gauntlet paste-origin evidence

refs #4314
* fix: detect kiro status from live controls and osc signals

refs #4203

* fix: handle variable-height kiro approval panels

refs #4203

---------

Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
* fix: detect codex status with custom interrupt keys

* test: remove unverified codex stale-status cases

* fix(detect): match punctuation in codex interrupt hints

Accept parentheses in remapped interrupt binding labels and simplify the cheap prefilter to a single any-gate shared by both manifest copies.

---------

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

* fix: preserve delayed mouse reports with confirmed keyboard input

refs #3480

* fix: capture geometry before replaying buffered mouse input

refs #3480

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
* fix: keep workspace navigation visible in terminal theme

refs #4300

* fix: clear workspace highlight on directional pane focus

refs #4300

---------

Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
refs #4293

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
Co-authored-by: Can Celik <ogulcancelik@gmail.com>
ogulcancelik and others added 24 commits September 27, 2026 20:57
* feat: let agents report their own resume command

* fix: keep reported resume commands tied to accepted sessions and current owners
`git apply` by default expects `-p1`, which is the default behavior of
`git diff`, but this can be overridden by config. Specify it explicitly
so it works regardless.
The interactive-shell idle test sent SIGINT as soon as it observed the
shell was busy. That condition can be true before the shell finishes
moving the command into its own foreground process group, so the
interrupt could arrive before the command reset its signal dispositions.
The command then survived in a stale foreground group while the shell
showed a prompt, and the pane was never observed idle again.

Run cat and end it with EOF instead. cat blocks on stdin, so the busy
state is stable, and EOF avoids the interrupt/job-control race.
* feat: support multiple prefix keys

keys.prefix accepts an array in addition to a single string so one
config can define several prefix keys. Every configured prefix enters
the same prefix mode, and the help panel lists them all.

Published keybinding profiles keep the primary prefix as a scalar and
carry the rest in an optional extra_prefixes field so older clients
keep working with the primary prefix.

* fix: reject an empty prefix list on reload

An explicitly empty keys.prefix array now stays empty through config
parsing so validation rejects it and a reload keeps the current
keybindings instead of silently falling back to ctrl+b.
* fix(windows): read agent command lines without PROCESS_VM_READ

Windows process command lines were read by opening each process with
PROCESS_VM_READ and walking its PEB. Hardened runtimes (Electron/Node) and
security products deny that access, so those processes resolved to a bare
`node.exe`/`bun.exe` name with no argv, argv0, or cmdline. A runtime-wrapped
agent launched from such a process was then indistinguishable from an
unrelated runtime process, and the pane stayed on the shell with
`agent_status: unknown`.

Prefer `NtQueryInformationProcess` with `ProcessCommandLineInformation`
(Windows 8.1+), which needs only `PROCESS_QUERY_LIMITED_INFORMATION`, and keep
the existing PEB read as a fallback for processes that do not expose a stored
command line. The fallback still requires `PROCESS_VM_READ`, so this only
widens coverage.

refs #4579

* fix(windows): handle growing command lines before failure test

The retry added for a command line that grows between the size probe and the
read was unreachable. NTSTATUS is signed, so STATUS_BUFFER_OVERFLOW,
STATUS_BUFFER_TOO_SMALL, and STATUS_INFO_LENGTH_MISMATCH are all negative and
were treated as failures by the earlier `status < 0` check.

Check the growth statuses first and retry once with the reported size. Also read
the returned UNICODE_STRING header unaligned, since a Vec<u8> buffer only
guarantees byte alignment.

* test(windows): keep command-line marker test process alive

Passing the marker as a second argument to `ping` let `ping` exit as soon as it
saw one target, so the command-line query could race the process exit. Move the
marker into a `rem` after `&` so it stays in cmd.exe's own command line and
`ping -n 11` keeps the process alive for the read.
…#4711)

* perf: send scrolling pane output as row shifts and skip blank cells

* fix: keep expanded scroll patches disjoint for the fast presentation path
* fix: summarize old servers and saved machines after herdr update

* fix: include reconnect and per-session restart commands in update summary
* fix: keep escape-prefixed terminal key bindings intact

refs #4751

* test: cover escape-prefixed option+backspace binding

refs #4751

(cherry picked from commit 898f733)
Copilot AI balanced review requested due to automatic review settings October 8, 2026 01:11

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@coderabbitai

coderabbitai Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 264 files, which is 164 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: a2a290c8-f3c8-45ea-baed-894597ec2dbd
📥 Commits

Reviewing files that changed from the base of the PR and between a0963cd and 545c636.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (264)
  • .zed/settings.json
  • AGENTS.md
  • CHANGELOG.md
  • CONTRIBUTING.md
  • Cargo.toml
  • README.md
  • build.rs
  • crates/ghostty-vt/Cargo.toml
  • crates/ghostty-vt/build.rs
  • crates/ghostty-vt/src/bindings.rs
  • crates/ghostty-vt/src/lib.rs
  • crates/ghostty-vt/src/native_image_sources.rs
  • crates/ghostty-vt/src/native_source.rs
  • crates/ghostty-vt/src/native_source_tests.rs
  • crates/ghostty-vt/src/pane_graphics_files.rs
  • crates/ghostty-vt/src/png_forward_tests.rs
  • distribution/agent-detection/codex.toml
  • distribution/agent-detection/grok.toml
  • distribution/agent-detection/kiro.toml
  • distribution/latest.json
  • distribution/preview.json
  • docs/next/api/herdr-api.schema.json
  • docs/next/focus-snooze-fork.md
  • justfile
  • nix/package.nix
  • openspec/changes/archive/2026-10-07-whats-new-full-history/proposal.md
  • openspec/changes/archive/2026-10-07-whats-new-full-history/specs/superherdr-release-notes/spec.md
  • openspec/changes/archive/2026-10-07-whats-new-full-history/tasks.md
  • openspec/specs/superherdr-release-notes/spec.md
  • scripts/agent_detection_manifest_check.py
  • scripts/generate_libghostty_bindings.sh
  • scripts/test_windows_input.ps1
  • scripts/test_windows_input.py
  • scripts/windows_input/Bootstrap.ps1
  • scripts/windows_input/Common.ps1
  • scripts/windows_input/Native.cs
  • scripts/windows_input/Probe.ps1
  • scripts/windows_input/README.md
  • scripts/windows_input/report.py
  • skills/herdr/SKILL.md
  • src/agent_resume.rs
  • src/api/client.rs
  • src/api/event_hub.rs
  • src/api/mod.rs
  • src/api/schema.rs
  • src/api/schema/agents.rs
  • src/api/schema/panes.rs
  • src/api/schema/response.rs
  • src/api/schema/server.rs
  • src/api/schema/tests.rs
  • src/api/server.rs
  • src/api/server/pane_graphics_stream.rs
  • src/api/server/subscription_socket_tests.rs
  • src/api/subscriptions.rs
  • src/app/actions.rs
  • src/app/agent_resume.rs
  • src/app/agents.rs
  • src/app/api.rs
  • src/app/api/pane_graphics.rs
  • src/app/api/panes.rs
  • src/app/api/plugins/manifest.rs
  • src/app/api/plugins/mod.rs
  • src/app/api/worktrees.rs
  • src/app/api/worktrees/deferred.rs
  • src/app/api/worktrees/reads.rs
  • src/app/creation.rs
  • src/app/mod.rs
  • src/app/pane_graphics.rs
  • src/app/session.rs
  • src/app/state.rs
  • src/app/terminal_targets.rs
  • src/build_info.rs
  • src/cli.rs
  • src/cli/agent.rs
  • src/cli/machine.rs
  • src/cli/pane.rs
  • src/cli/plugin.rs
  • src/cli/spec.rs
  • src/cli/spec/machine.rs
  • src/cli/status.rs
  • src/cli/target.rs
  • src/client/catalog_reload.rs
  • src/client/endpoint.rs
  • src/client/endpoint/catalog.rs
  • src/client/endpoint/control.rs
  • src/client/endpoint/ssh_metadata.rs
  • src/client/endpoint/supervisor.rs
  • src/client/frame_output.rs
  • src/client/frame_output_tests.rs
  • src/client/handshake.rs
  • src/client/image_files.rs
  • src/client/input.rs
  • src/client/input/windows_vti.rs
  • src/client/loop_config.rs
  • src/client/mod.rs
  • src/client/shell.rs
  • src/client/shell/actions.rs
  • src/client/shell/aggregate_navigation.rs
  • src/client/shell/composition.rs
  • src/client/shell/config.rs
  • src/client/shell/context_menu.rs
  • src/client/shell/copy_mode.rs
  • src/client/shell/endpoint_agent_state.rs
  • src/client/shell/endpoint_agents.rs
  • src/client/shell/endpoint_navigation.rs
  • src/client/shell/endpoint_sidebar.rs
  • src/client/shell/endpoints.rs
  • src/client/shell/global_menu.rs
  • src/client/shell/graphics.rs
  • src/client/shell/input.rs
  • src/client/shell/machine_diagnostics.rs
  • src/client/shell/mobile.rs
  • src/client/shell/mouse.rs
  • src/client/shell/overlay_input.rs
  • src/client/shell/overlays.rs
  • src/client/shell/render.rs
  • src/client/shell/sidebar.rs
  • src/client/shell/state.rs
  • src/client/shell/tests/chrome_context.rs
  • src/client/shell/tests/close_tab.rs
  • src/client/shell/tests/copy.rs
  • src/client/shell/tests/endpoints.rs
  • src/client/shell/tests/graphics.rs
  • src/client/shell/tests/input.rs
  • src/client/shell/tests/keybindings_settings.rs
  • src/client/shell/tests/mobile.rs
  • src/client/shell/tests/mod.rs
  • src/client/shell/tests/popup_focus_projection.rs
  • src/client/shell/tests/startup_overlays.rs
  • src/client/shell/tests/text_editing.rs
  • src/client/shell/tests/workspace_navigation.rs
  • src/client/shell/workspace_navigation.rs
  • src/client/shell_runtime.rs
  • src/client/state.rs
  • src/client/terminal_geometry.rs
  • src/client/terminal_sessions.rs
  • src/client/terminal_setup.rs
  • src/client/tests/mod.rs
  • src/config.rs
  • src/config/keybinds.rs
  • src/config/model.rs
  • src/detect/manifest.rs
  • src/detect/manifest/tests.rs
  • src/detect/manifests/codex.toml
  • src/detect/manifests/grok.toml
  • src/detect/manifests/kiro.toml
  • src/detect/mod.rs
  • src/events.rs
  • src/handoff_runtime.rs
  • src/input/encode.rs
  • src/input/keybind_help.rs
  • src/input/keybindings.rs
  • src/integration/actions.rs
  • src/integration/assets/herdr-agent-state.test.ts
  • src/integration/assets/opencode/herdr-agent-state.js
  • src/integration/assets/opencode/herdr-agent-state.test.ts
  • src/integration/assets/opencode/herdr-tui-session.js
  • src/integration/assets/opencode/herdr-tui-session.test.ts
  • src/integration/assets/opencode/tui.js
  • src/integration/config_file/tests.rs
  • src/integration/mod.rs
  • src/integration/opencode_config.rs
  • src/integration/targets.rs
  • src/integration/test_support.rs
  • src/integration/tests.rs
  • src/integration/types.rs
  • src/kitty_graphics.rs
  • src/kitty_graphics/output.rs
  • src/kitty_graphics/surface.rs
  • src/layout.rs
  • src/main.rs
  • src/pane.rs
  • src/pane/agent_detection.rs
  • src/pane/cursor.rs
  • src/pane/osc.rs
  • src/pane/terminal.rs
  • src/pane/terminal/migration_tests.rs
  • src/pane/xtgettcap.rs
  • src/pane_graphics_files.rs
  • src/persist/io.rs
  • src/persist/restore.rs
  • src/persist/snapshot.rs
  • src/persist/writer.rs
  • src/platform/linux.rs
  • src/platform/linux/shutdown.rs
  • src/platform/mod.rs
  • src/platform/ssh_agent.rs
  • src/platform/unix_common.rs
  • src/platform/unix_image_files.rs
  • src/platform/windows.rs
  • src/platform/windows/config_backup/tests.rs
  • src/protocol/endpoint.rs
  • src/protocol/mod.rs
  • src/protocol/render_ansi.rs
  • src/protocol/surface_delta.rs
  • src/protocol/surface_reuse.rs
  • src/protocol/surface_scroll.rs
  • src/protocol/wire.rs
  • src/raw_input.rs
  • src/release_notes.rs
  • src/remote.rs
  • src/remote/attach.rs
  • src/remote/host.rs
  • src/remote/saved.rs
  • src/remote/ssh_agent.rs
  • src/server/autodetect.rs
  • src/server/client_commands.rs
  • src/server/client_shell.rs
  • src/server/client_shell_graphics.rs
  • src/server/client_transport.rs
  • src/server/clients.rs
  • src/server/headless.rs
  • src/server/headless/client_views.rs
  • src/server/headless/endpoint_requests.rs
  • src/server/headless/lifecycle.rs
  • src/server/headless/native_graphics.rs
  • src/server/headless/notifications.rs
  • src/server/headless/pane_graphics.rs
  • src/server/headless/render.rs
  • src/server/headless/retained_surface.rs
  • src/server/headless/surface_interest.rs
  • src/server/headless/tests/event_fairness.rs
  • src/server/headless/tests/mod.rs
  • src/server/headless/tests/native_graphics.rs
  • src/server/headless/tests/pane_graphics.rs
  • src/server/headless/tests/pane_move.rs
  • src/server/headless/tests/project_snooze.rs
  • src/server/headless/tests/surface_delta.rs
  • src/server/headless/tests/surface_interest.rs
  • src/server/headless/tests/surface_scroll.rs
  • src/server/headless/tests/workspace_snooze.rs
  • src/server/keybindings.rs
  • src/server/notifications.rs
  • src/server/render_scale_benchmark.rs
  • src/server/render_stream.rs
  • src/terminal/id.rs
  • src/terminal/runtime.rs
  • src/terminal/state.rs
  • src/terminal_modes.rs
  • src/ui/panes.rs
  • src/ui/release_notes.rs
  • src/update.rs
  • src/worktree.rs
  • tests/auto_detect.rs
  • tests/cli/plugins.rs
  • tests/client_mode.rs
  • tests/host_shutdown.rs
  • tests/live_handoff.rs
  • tests/machine_api.rs
  • tests/machine_setup.rs
  • tests/remote_attach.rs
  • tests/support/terminal_screen.rs
  • vendor/libghostty-vt.patches.md
  • vendor/libghostty-vt/include/ghostty/vt/kitty_graphics.h
  • vendor/libghostty-vt/include/ghostty/vt/terminal.h
  • vendor/libghostty-vt/src/lib_vt.zig
  • vendor/libghostty-vt/src/terminal/c/kitty_graphics.zig
  • vendor/libghostty-vt/src/terminal/c/main.zig
  • vendor/libghostty-vt/src/terminal/c/terminal.zig
  • vendor/libghostty-vt/src/terminal/kitty/graphics_exec.zig
  • vendor/libghostty-vt/src/terminal/kitty/graphics_image.zig
  • vendor/libghostty-vt/src/terminal/kitty/graphics_storage.zig
  • vendor/patches/libghostty-vt/0006-clear-screen-preserving-cursor-line.patch
  • vendor/patches/libghostty-vt/0007-experimental-png-retention.patch

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@jsonMartin
jsonMartin force-pushed the upstream-sync/v0.9.3 branch from e1322db to 59becaf Compare October 8, 2026 01:25
@jsonMartin
jsonMartin merged commit ebe0ca6 into main Oct 8, 2026
6 checks passed
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.