Commit Graph
1680 Commits
Author SHA1 Message Date
kangal-bot cee4fc2dc6 docs: publish preview documentation 2026-09-16 16:38:39 +00:00
Ogulcan Celik 2c29fb29e3 fix: avoid workstation sdk requirement in preview checks preview-2026-09-16-2c29fb29e302 2026-09-16 19:22:17 +03:00
Ogulcan Celik 3f78f172d9 fix: address release promotion review findings preview-2026-09-16-3f78f172d9f9 2026-09-16 18:43:23 +03:00
Can Celik 36db8ff3f4 ci: promote stable releases from protected previews (#4241) 2026-09-16 18:25:59 +03:00
Can Celik aff99878d3 fix: offer forced removal for worktrees with submodules (#4238)
refs #1797
2026-09-16 17:06:08 +03:00
Eric YueandJJ Liebig 0d14759cb6 test: wait for app readiness before late session injection (#4224)
Root cause:
The API socket is bound before App evaluates session restore. Waiting only
for that socket lets the late-session test inject its file during startup,
so the server may load it normally instead of exercising late-file recovery.
The missing backup then fails an otherwise correct persistence assertion.

Fix:
Wait for a read-only workspace-list request to pass through App and assert
that the workspace list is still empty before injecting the session file.
Keep the existing autosave deadline and byte-for-byte backup assertion.
Add no sleeps, retries, longer timeouts or production changes.

Validation:
The original assertion fails with unchanged master. With the barrier, five
independent runs pass. Full native just ci passes 3624 Rust tests with six
default skips, formatting, all-target Clippy, 112 maintenance tests, six
architecture tests and 39 integration-asset tests. All seven docs contract
tests pass. Local Windows cross-lint was not run because its SDK is absent.

Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
2026-09-16 14:52:48 +02:00
Eric YueandJJ Liebig ab15da285e fix: require exact session names before deletion (#4233)
* fix: require exact session names before deletion

refs #3819

* test: isolate session deletion regression tests

refs #3819

---------

Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
2026-09-16 14:41:41 +02:00
Can Celik 68ae6adea0 fix: let local agent clicks cancel remote handoffs (#4236)
refs #3903
2026-09-16 15:29:45 +03:00
Can Celik d1a53b2c0e fix: keep local usable when remote machines stall (#4234)
refs #3903
2026-09-16 15:16:45 +03:00
Can Celik 18061191fd fix: keep remote surface updates incremental (#4209)
refs #3769

refs #3745
2026-09-16 00:58:23 +03:00
Ogulcan Celik fc548768db chore: approve vinayshah1998 as contributor 2026-09-15 23:18:45 +03:00
Can Celik 266b8e3802 fix: preserve macos services across logout (#4202)
refs #4100
2026-09-15 21:37:49 +03:00
Can Celik 4428e1664d fix: preserve unloaded sessions before replacement (#4190)
refs #4125
2026-09-15 21:17:32 +03:00
JJ Liebig f70a1f835e fix(windows): reject dynamic msvc runtime in packaging (#4200)
The v0.8.2 Windows archive shipped an herdr.exe that imported
VCRUNTIME140.dll and the api-ms-win-crt-* Universal CRT, none of which the
archive provides. Static CRT linkage was restored for x86_64-pc-windows-msvc
in .cargo/config.toml, but nothing verified the packaged executable, so the
dependency could silently regress.

Parse the PE import and delay-import tables and reject herdr.exe when it
depends on the dynamic Microsoft C/C++ runtime, including release and debug
variants. Check the input while staging and re-check the staged executable
before archiving so a direct archive cannot bypass the guard.

refs #3129
2026-09-15 18:14:07 +02:00
JJ Liebig 9db1eed391 fix(windows): normalize pane launch cwd casing (#4199) 2026-09-15 17:17:47 +02:00
Can Celik ee064a0c79 fix(windows): preserve sgr mouse encoding after native capture (#4195)
refs #4155
2026-09-15 17:24:35 +03:00
akbashandakbash-bot 963f78f46c fix: preserve live selections during pane output (#4193)
refs #3841

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-09-15 16:20:51 +02:00
Eric Yue 7808478d3b fix: reconcile client locations after no-focus pane moves (#4171)
refs #4153

Root cause:
A no-focus pane move can remove the source tab without changing the
server's numeric workspace and tab coordinates. PaneMove is not classified
as a topology change, so a client viewing that tab retains its deleted ID.
Its target lookup falls back to the server default and can follow a later,
unrelated focus change instead of staying in the source workspace.

Fix:
Include PaneMove in the existing client-location reconciliation path.
Extend the existing focus-guard test with a client on the removed tab and
verify that a later server-default change cannot move its view. Preserve
the other client's view and existing error, no-op and zoom assertions.

Validation:
The minimized regression fails five times on PR #4159's unchanged head and
passes five times with the one-line fix. All 19 pane-move tests, native
lint, maintenance, architecture and integration-asset checks pass.
Full native just ci on the publication branch, including the unchanged
prerequisites from #4159 and #4168, passes 3585 Rust tests with six default
skips plus lint, 106 maintenance, six architecture and 39 integration-asset
tests. All seven docs contract tests pass. Local Windows cross-lint was
not run because its SDK is unavailable.

No geometry policy, protocol or periodic rendering behavior is changed.
2026-09-15 17:48:58 +04:00
Eric YueandJJ Liebig 35707684b9 test: wait for runtime readiness in integration tests (#4168)
Root cause:
The handoff test starts an agent immediately after workspace creation,
before the new shell is necessarily ready. The reconnect test assumes a
fixed sidebar row and searches raw ANSI output for text that can arrive
as separate incremental cell updates.

Fix:
Wait for a shell builtin to write a readiness marker before sending the
single raw agent.start request. Exercise the gap with a delayed shell.
Locate the recovered workspace in the rendered sidebar and check the
reconstructed screen for selection and input, including overlay borders.
Do not extend existing timeouts or add retries that hide failures.

Validation:
All 25 affected group and helper tests pass. Ten repeated rounds of the
two runtime tests and the row helper pass, for 30 test executions without
retries. Standalone native just ci passes 3582 Rust tests with six default
skips, formatting, all-target Clippy, 106 maintenance tests, six architecture
tests and 39 integration-asset tests. Windows cross-lint was not run because
its SDK is not installed.

Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
2026-09-15 15:28:59 +02:00
f236ba5419 fix: propagate focused pane moves to attached clients (#4159)
refs #4153

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
2026-09-15 15:11:39 +02:00
Ogulcan Celik 9bd5f4ed37 fix: reveal newly focused workspaces in the machines sidebar 2026-09-15 15:02:09 +03:00
akbashandakbash-bot 052779c415 fix: reveal the full last tab in overflowing tab strips (#4152)
refs #4151

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-09-15 03:20:59 +02:00
JJ Liebig 32503f81f7 fix(windows): prefer VT input for SSH clients (#4148)
refs #3932
2026-09-15 00:15:23 +02:00
JJ Liebig 734faae72a fix(windows): batch input trace diagnostics (#4146)
refs #3932
2026-09-14 23:21:54 +02:00
JJ Liebig e61206cc9d test: deflake recent CI failures (#4139) 2026-09-14 22:41:54 +02:00
JJ Liebig f867dabbe6 fix: reject stale pane surfaces after reconnect (#4141) 2026-09-14 22:31:31 +02:00
JJ Liebig b0c05e6663 fix: map pixel mouse by integer cell pitch (#4140)
refs #3295
2026-09-14 22:21:15 +02:00
5e38e5fb5f fix: protect integration configs from failed writes (#3973)
* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

* fix: atomically write integration configs

refs #3970

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
2026-09-14 22:13:52 +02:00
Mark JaquithandJJ Liebig b0f21ed2cb feat: add cursor-based editing to text inputs (#3698)
* feat: add cursor-based editing to text inputs

refs #1803

* fix: preserve dialog actions with associated text

refs #1803

* refactor: simplify text editor outcomes and tests

refs #1803

---------

Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
2026-09-14 21:47:53 +02:00
Can Celik d8b36691d1 fix: avoid resending terminal cells for metadata updates (#4137) 2026-09-14 22:36:04 +03:00
Eric YueandJonathan Liebig 4c3b613c84 fix: keep modified enter compatible with legacy panes (#4110)
* fix: keep modified enter compatible with legacy panes

refs #4103

* fix: synchronize modified key negotiation state

refs #4103

* test: cover windows legacy modified enter

refs #4103

---------

Co-authored-by: Jonathan Liebig <jonathan.liebig@gmail.com>
2026-09-14 21:02:55 +02:00
JJ Liebig 01a9733f59 fix(windows): avoid lossy native Win32 input mode (#4133)
refs #3932
refs #3702
refs #3910
2026-09-14 22:02:44 +04:00
JJ Liebig ad41567287 fix: scope window titles to each client view (#4130)
refs #4091
2026-09-14 18:35:18 +02:00
Can Celik b5154541cc fix: restore saved machine screens after reconnect (#4126)
refs #3842
2026-09-14 19:26:55 +03:00
Can Celik 03749ae397 fix: default pane splits to the calling pane (#4123) 2026-09-14 18:16:13 +03:00
Can Celik 0af53b75d9 ci: restore zig local build cache reuse (#4118) 2026-09-14 18:01:54 +03:00
Can Celik 7fe5a7cd42 fix: detect pi working border (#4113)
refs #3629
2026-09-14 17:34:53 +03:00
Eric YueandOgulcan Celik 7e51b2832d fix: detect codex activity with static titles and queued inputs (#4099)
* fix: detect codex activity with static titles and queued inputs

refs #4092

Codex 0.154.0 can omit the activity bullet when tui.animations is false
and replace the literal Working label with a task-specific label. Its
terminal title can also remain static during an active turn, so the OSC
spinner rule is not sufficient to identify work.

The screen fallback required a bullet followed by Working in the last
three non-empty lines. It therefore missed both the animation-disabled
status line and dynamic labels. Queued follow-ups add a heading, input
text, and an edit hint below the activity line, moving that line outside
the three-line region. The lower-priority non-empty OSC title rule then
reported idle while Codex still showed an active timer and interrupt
control.

Recognize the elapsed-time and esc-to-interrupt controls in the detection
snapshot before the current composer. Allow an optional bullet, a dynamic
activity label, and queued follow-ups below that line. Require that no
later response, completion, or interruption marker supersedes the live
activity. This excludes composer text and stale output without letting an
earlier interruption suppress a subsequent active turn.

Keep OSC state precedence and transcript-viewer skip behavior unchanged.
Update the bundled and distributed manifests together to 2026.09.14.1.
Add regression coverage for optional bullets, dynamic labels, queued
inputs, resumed work after interruption, and stale or quoted controls.

Avoid discarding Regex search caches on every detection poll. The loader
previously cloned the entire compiled rule vector, and each Regex clone
created a fresh search cache pool despite sharing compiled read-only
state. Share the immutable rules through Arc instead. Reload publishes a
new array while in-flight readers retain a valid old generation, without
holding the global cache lock during matching. Add a cheap contains gate
for the required interrupt text before running the multiline expression.

Add a deterministic regression for compiled-rule sharing, reload
replacement, retained old readers, and concurrent detection. Measure the
baseline and optimized detector kernels in three alternating rounds on
CPU 24 with NUMA node 0 and CPU 25 with NUMA node 1. Real queued detection
falls from about 116 to 22 microseconds, and two evaluations per pane over
15 panes fall from about 3.45 to 0.65 milliseconds on both sockets, about
81 percent less time. No benchmark match results change. The cache
improvement requires the updated binary, not just a manifest reload.

Validate on the official Herdr 0.9.0 release with Codex 0.154.0 by toggling
the old and new manifests during the same active queued task. Confirm
working for active turns and idle after completion or interruption.
Pass 86 captured-screen and semantic checks through the optimized source
binary, 69 manifest/cache tests, CPU-pinned render scaling, and the full
native CI suite: 3535 Rust tests passed, with six default skips. Run CI
serially with inherited Herdr session context removed; no tests were
excluded or expectations relaxed to make CI pass.

* fix: detect codex pending follow-ups as working

refs #4092

* fix: handle wrapped codex follow-up hints

refs #4092

---------

Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-09-14 17:33:30 +03:00
Can Celik 970b92682c fix: remove stale maintainer username 2026-09-14 16:04:00 +03:00
Eric Yue be03b7a19f fix: preserve agent panel scroll when switching machines (#4101)
refs #3937

Root cause:
Activating another endpoint applies a snapshot with a different
endpoint-qualified graphics scope. This triggers reset_endpoint_projection,
which clears agent_scroll together with endpoint-local state even though
the agent list aggregates all machines. The selected agent receives focus,
but the list jumps back to the top.

Fix:
Save the client-owned agent scroll offset and restore it only when
activation changes endpoints. Keep same-endpoint reboot resets,
workspace/tab scroll resets, input cleanup and existing list bounds
clamping unchanged. This adds constant-time work on endpoint activation,
with no protocol, persisted-state or pane-scaled rendering changes.

Validation:
The new regression fails on the original implementation with scroll 0
instead of 6. Tests cover repeated bidirectional agent clicks, stable
visible rows, shrinking lists and same-machine reboots. All 242 client
shell tests pass.

Real SSH A/B testing against the same two disposable 0.9.0 servers
reproduces the reset with both the stable and current-master clients.
The patched client preserves the visible rows through six cross-machine
switches and two same-machine control clicks.

Native just ci passes: 3535 Rust tests, six default skips, plus lint,
maintenance, architecture and integration-asset checks. All seven docs
contract tests pass. Windows cross-lint was not run because its SDK is
not installed; native macOS and Windows UI behavior was not tested.
2026-09-14 15:46:39 +03:00
Can Celik c77af1892f fix: clean up idle ssh bridges and back off flapping connections (#4083)
* fix: clean up idle ssh bridges and back off flapping connections

* chore: keep ssh liveness smoke tooling local
2026-09-14 03:55:53 +03:00
Can Celik 21c1f8cf85 fix: hide only kitty image placements overlapping overlays (#4081) 2026-09-14 03:02:14 +03:00
JJ Liebig add3dd28f9 test(windows): deflake media player invalid media assertion (#4082)
* test(windows): deflake media player invalid media assertion

The Windows sound test required MediaPlayer's MediaFailed event for invalid
media. Some runners never raise it, so the script exits through its playback
timer and the test saw "sound playback timed out" instead, panicking on the
MediaFailed assertion.

Accept either terminal error and keep the timer short under test via
HERDR_SOUND_TIMEOUT_SECONDS so a missed MediaFailed no longer waits out the
production 15 second bound.

* test(windows): keep media player timeout override test-only

Generate the short-timer player script only in tests instead of reading a
process environment override. This keeps the production script's fixed 15
second bound unchanged, and the script-content test now proves the test
variant rewrites the timer.
2026-09-14 02:42:59 +03:00
JJ Liebiganddengos 247f6d1f82 fix(client): re-assert host mouse modes after a terminal reconnect (#4079)
Co-authored-by: dengos <dengoswei@gmail.com>
2026-09-14 02:42:21 +03:00
JJ Liebig aa961df943 fix(windows): restore mouse reporting when reattaching (#4080) 2026-09-14 02:06:01 +03:00
3b478e69dc fix: scope agent views to the selected machine (#3784)
* fix: scope agent views to the selected machine

refs #3732

* fix: preserve stable agent view ordering

refs #3732

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
2026-09-14 02:11:07 +04:00
Ogulcan Celik 4e1096b101 fix: clarify agent integration settings description 2026-09-14 00:24:47 +03:00
JJ Liebig 2746ac7ebf ci: migrate remaining pinned actions to node24 (#4023)
* ci: migrate remaining pinned actions to node24

actions/cache@v4 and mlugg/setup-zig@v2.2.1 still target Node 20, which
GitHub removes from runners on 2026-09-23. Bump actions/cache to v6.1.0 and
replace mlugg/setup-zig with vercel-labs/setup-zig@v1.0.2.

vercel-labs/setup-zig takes only `version`, so the use-cache/cache-size-limit
tuning and Zig global-cache reuse are dropped. See the PR for alternatives.

* ci: restore zig caching for vercel setup-zig

vercel-labs/setup-zig has no cache controls, so redirect the Zig global cache
into the workspace .zig-cache and run the Zig build cache step on Linux too.

Drop this commit if we switch to a setup action that owns Zig caching, e.g.
step-security/setup-zig or xyzzylabs/setup-zig.
2026-09-13 23:39:48 +03:00
Can Celik 6075d25f47 fix: keep plugins working after client-only updates (#4077) 2026-09-13 23:37:26 +03:00
caner-akcaandJJ Liebig b847e6cdb6 fix(linux): bound the foreground process-tree scan (#3674)
refs #3621

Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
2026-09-14 00:22:15 +04:00