Skip to content

feat: support all agent integrations on windows - #2496

Merged
ogulcancelik merged 1 commit into
masterfrom
feature/windows-integrations
Aug 7, 2026
Merged

feat: support all agent integrations on windows#2496
ogulcancelik merged 1 commit into
masterfrom
feature/windows-integrations

Conversation

@ogulcancelik

Copy link
Copy Markdown
Collaborator

Summary

  • add native Windows integration assets for Cursor, Devin, Grok, and MastraCode
  • enable Windows installation and detection for Cursor, Devin, Grok, MastraCode, and Hermes
  • use Cursor’s unambiguous cursor-agent.cmd launcher and make Hermes session reporting cross-platform
  • document Windows integration paths and scripts

Validation

  • just check
  • native Windows build and targeted integration tests
  • live Windows smoke tests for Cursor, Grok, MastraCode, and Hermes

Devin was installed on the Windows VM, but its authenticated agent smoke test requires a Devin login.

@kangal-bot kangal-bot added the ai-review Trigger automated AI reviews for pull requests admitted by the PR gate label Aug 7, 2026
@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: b2e101d8-c6ae-418b-82ac-0a65727fc163

📥 Commits

Reviewing files that changed from the base of the PR and between 29eeeff and 0fce2c8.

📒 Files selected for processing (5)
  • docs/next/website/src/content/docs/integrations.mdx
  • docs/next/website/src/content/docs/ja/integrations.mdx
  • docs/next/website/src/content/docs/zh-cn/integrations.mdx
  • src/integration/assets/hermes/__init__.py
  • src/integration/mod.rs
🚧 Files skipped from review as they are similar to previous changes (4)
  • docs/next/website/src/content/docs/ja/integrations.mdx
  • src/integration/mod.rs
  • docs/next/website/src/content/docs/zh-cn/integrations.mdx
  • docs/next/website/src/content/docs/integrations.mdx

📝 Walkthrough

Walkthrough

Native Windows support was added for Devin, Hermes, Cursor, MastraCode, and Grok. The changes add PowerShell hooks, platform-specific commands and executables, Hermes path resolution, subprocess reporting, detection updates, tests, and documentation.

Changes

Native Windows integrations

Layer / File(s) Summary
Platform-specific agent detection and resume
src/agent_resume.rs, src/detect/mod.rs
Cursor uses cursor-agent.cmd on Windows. MastraCode detection recognizes its Node package CLI path.
Hermes subprocess reporting and path resolution
src/integration/assets/hermes/__init__.py, src/integration/env.rs, src/integration/registry.rs, scripts/test_hermes_integration_asset.py
Hermes reports sessions through the Herdr CLI, supports HERMES_HOME, resolves Windows defaults, and suppresses subprocess windows.
PowerShell hooks and installation wiring
src/integration/assets/*/herdr-agent-state.ps1, src/integration/mod.rs, src/integration/registry.rs
Devin, Cursor, MastraCode, and Grok use Windows PowerShell assets and retain shell assets on other platforms.
Platform-aware hook commands and validation
src/integration/targets.rs, src/integration/tests.rs
Hook installation and removal use platform-aware commands. MastraCode uses encoded PowerShell commands on Windows. Tests validate Windows support and generated commands.
Integration documentation
docs/next/CHANGELOG.md, docs/next/website/src/content/docs/integrations.mdx, docs/next/website/src/content/docs/ja/integrations.mdx, docs/next/website/src/content/docs/zh-cn/integrations.mdx
Documentation describes Windows hook filenames and Hermes path defaults in three languages.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant AgentCLI
  participant PowerShellHook
  participant HerdrCLI
  participant PaneState
  AgentCLI->>PowerShellHook: send session event JSON
  PowerShellHook->>HerdrCLI: report-agent-session with session metadata
  HerdrCLI->>PaneState: update active pane session
  PowerShellHook-->>AgentCLI: emit empty JSON response
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: native support for all agent integrations on Windows.
Description check ✅ Passed The description directly covers the Windows integration assets, detection, cross-platform behavior, documentation, and validation.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/windows-integrations

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

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 2


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 1698632b-c7e9-4519-a4d5-f8849f5b88e9

📥 Commits

Reviewing files that changed from the base of the PR and between 7d77e92 and 4e54e2f.

📒 Files selected for processing (17)
  • docs/next/CHANGELOG.md
  • docs/next/website/src/content/docs/integrations.mdx
  • docs/next/website/src/content/docs/ja/integrations.mdx
  • docs/next/website/src/content/docs/zh-cn/integrations.mdx
  • scripts/test_hermes_integration_asset.py
  • src/agent_resume.rs
  • src/detect/mod.rs
  • src/integration/assets/cursor/herdr-agent-state.ps1
  • src/integration/assets/devin/herdr-agent-state.ps1
  • src/integration/assets/grok/herdr-agent-state.ps1
  • src/integration/assets/hermes/__init__.py
  • src/integration/assets/mastracode/herdr-agent-state.ps1
  • src/integration/env.rs
  • src/integration/mod.rs
  • src/integration/registry.rs
  • src/integration/targets.rs
  • src/integration/tests.rs

Comment thread docs/next/website/src/content/docs/integrations.mdx Outdated
Comment thread src/integration/tests.rs
@ogulcancelik
ogulcancelik force-pushed the feature/windows-integrations branch from 4e54e2f to 29eeeff Compare August 7, 2026 19:42
@greptile-apps

greptile-apps Bot commented Aug 7, 2026

Copy link
Copy Markdown

Greptile Summary

The PR adds native Windows support for Cursor, Devin, Grok, MastraCode, and Hermes integrations.

  • Adds PowerShell hook assets and platform-specific installation commands.
  • Enables Windows integration detection, installation, status checks, and agent restoration.
  • Replaces Hermes socket reporting with a cross-platform Herdr CLI invocation.
  • Bumps the Hermes integration version to ensure existing installations are detected as outdated and reinstalled.

Confidence Score: 5/5

The PR appears safe to merge.

The previously reported Hermes upgrade issue is fixed because both the installed asset marker and the integration registry constant are now version 5, so existing version 4 installations are classified as outdated; no blocking failure remains.

Important Files Changed

Filename Overview
src/integration/assets/hermes/init.py Replaces Unix-socket session reporting with a cross-platform argv-based Herdr CLI invocation and correctly advances the asset marker to version 5.
src/integration/mod.rs Selects platform-specific integration assets and advances the Hermes registry version to 5, matching the installed asset.
src/integration/targets.rs Generates platform-appropriate hook commands for Cursor, MastraCode, and Grok.
src/integration/env.rs Injects the current Herdr executable path into panes and resolves the platform-specific Hermes home directory.
src/integration/registry.rs Enables the new Windows integration targets and aligns Hermes availability detection with its resolved home directory.
src/integration/tests.rs Updates integration coverage for Windows support, command generation, installation, and availability.
src/agent_resume.rs Uses Cursor's unambiguous Windows command launcher when restoring sessions.
src/detect/mod.rs Uses the Windows Cursor launcher and recognizes node-wrapped MastraCode processes.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  Pane[Herdr-managed pane] --> Env[Injected pane environment]
  Env --> Agent[Agent CLI]
  Agent --> Hook[Installed PowerShell or Python hook]
  Hook --> CLI[Herdr reporting CLI]
  CLI --> Server[Herdr server]
  Server --> State[Pane agent session/state]
Loading

Reviews (2): Last reviewed commit: "feat: support all agent integrations on ..." | Re-trigger Greptile

Comment thread src/integration/assets/hermes/__init__.py
@ogulcancelik
ogulcancelik force-pushed the feature/windows-integrations branch from 29eeeff to 0fce2c8 Compare August 7, 2026 19:51
@ogulcancelik
ogulcancelik merged commit 50ddc06 into master Aug 7, 2026
8 checks passed
@kangal-bot kangal-bot removed the ai-review Trigger automated AI reviews for pull requests admitted by the PR gate label Aug 7, 2026
yjuyjuy added a commit to yjuyjuy/herdr that referenced this pull request Aug 13, 2026
* fix: preserve claude settings formatting (herdrdev#2089)

refs herdrdev#2066

Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>

* fix(client): query host cell size when the ioctl reports no pixels (herdrdev#2160)

* fix(cli): report non-UTF-8 arguments instead of panicking (herdrdev#2207)

* fix(cli): report non-UTF-8 arguments instead of panicking

* fix(cli): avoid echoing malformed arguments

---------

Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>

* fix: avoid blocking on foreground cwd checks (herdrdev#2213)

refs herdrdev#2206

* fix(docs): publish only released documentation

* fix(docs): support older git in snapshot checks

* fix(input): preserve hover during extended-button drags

* fix: propagate host color scheme to pane apps (herdrdev#2214)

refs herdrdev#714

* fix(pi): restrict state reporting to tui sessions (herdrdev#2159)

Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* fix: page keys scroll pane scrollback at zsh and REPL prompts (herdrdev#2191)

* fix: page keys scroll pane scrollback at zsh and REPL prompts

PageUp/PageDown were forwarded to the pane whenever DECCKM (application
cursor) was on, assuming only primary-screen pagers enable it, but zsh's
line editor also enables DECCKM, as do REPLs such as python3. The result
was PageUp scrolling shell history instead of Herdr scrollback.

Bracketed paste discriminates the two: it means the app accepts typed or
pasted text at a prompt, so line editors enable it and pagers do not.

* test: update page key state fixture

---------

Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* feat(website): rebuild marketing pages on new brand chassis

* docs: finalize 0.8.0 release documentation

* release: v0.8.0

* docs: update website manifest for v0.8.0

* docs: refine cpu optimization blog post

* fix(ui): keep collapsed workspace status visible (herdrdev#2239)

refs herdrdev#2216

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* docs: publish preview documentation

* feat(plugins): index marketplace manifests

* fix(docs): allow corrections to published versions

refs herdrdev#916

* fix(input): preserve shift-tab in pane automation (herdrdev#2259)

refs herdrdev#1561

* fix(ui): preserve sidebar scroll across clients (herdrdev#2280)

refs herdrdev#2255

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

* fix(website): copy heading links to clipboard

* fix: detect claude confirmation prompts

refs herdrdev#2268

* feat(ui): add distinct status indicators (herdrdev#2282)

refs herdrdev#2260

* fix(input): keep pending url clicks across host focus loss (herdrdev#2291)

Opening a URL raises the browser, which takes focus away from the host
terminal before the mouse release arrives. release_input_source(_headless)
cleared pending_url_click_sources on that focus loss, so the release was
forwarded to the pane and the agent opened the same URL again.

Clear the set in clear_input_source instead, whose only production caller
is remove_client.

refs herdrdev#2290

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

* fix(cli): resolve pane query --current from caller (herdrdev#2298)

refs herdrdev#2297

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

* fix(input): parse default mouse reports (herdrdev#2312)

* fix(input): parse default mouse reports

refs herdrdev#2309

* fix(input): preserve split default mouse reports

refs herdrdev#2309

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* fix(ui): search single-tab names in navigator (herdrdev#2320)

* fix(layout): return focus to the pane a split was opened from (herdrdev#2266)

Closing a focused pane handed focus to the next pane in tree order.
For a pane opened beside another one -- a plugin split, a file viewer,
any transient tool pane -- that is rarely where the user was: it lands
on some unrelated neighbour rather than the pane that opened it.

Track the pane focus came from in TileLayout and prefer it when the
focused pane closes, falling back to tree order when there is no
history, when it points at the pane being closed, or when it points at
a pane that has since gone away. The history lives in the layout, so it
can only ever name a pane in the same tab.

A one-slot history is only sound if internal focus excursions never
write it, so the tree edits that used to bounce focus around now go
through target-taking primitives instead. close_pane removes a
background pane directly, so detach_pane and take_pane_for_move stop
focus-close-refocusing. split_pane splits a target without moving
focus: the runtime split path only focuses the new pane once the spawn
succeeds, which makes a failed split a pure rollback, and the targeted
and unfocused workspace split paths stop fabricating history.
insert_pane_near now takes the focus intent, so an unfocused pane move
leaves the target tab's history alone. The layout-level focused-split
helpers become test-only; production splits all flow through the
target-taking path.

Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* fix(terminal): render halfwidth katakana voiced marks (herdrdev#2257)

Co-authored-by: oyoguhito <oyoguhito@kamatanoMacBook-Pro.local>
Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* fix(ci): make issue gate structural

* fix(input): preserve modifyOtherKeys key releases (herdrdev#2303)

refs herdrdev#2302

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* fix(config): accept retired agent panel scope (herdrdev#2295)

refs herdrdev#2292

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* feat(theme): add optional sidebar background

* docs: refresh readme and sponsors

* chore: remove project-local worktree extension

refs herdrdev#2325

* fix(website): update author X profile

* feat(windows): support remote attach to unix hosts (herdrdev#2329)

* feat(windows): support remote attach to unix hosts

* fix(remote): preserve unix bridge behavior

* fix(sidebar): highlight active agent in collapsed sidebar (herdrdev#2382)

The collapsed sidebar renders agent rows with an unconditional
Style::default().fg(p.overlay0), so the active agent is
indistinguishable from the others. The workspace list directly above
it, and render_agent_detail in the expanded sidebar, both mark the
active entry.

Reuse the existing active treatment: resolve the active entry with the
same is_active_pane call the expanded agent panel uses, then paint the
row background with surface_dim and the position number with text, the
same tokens the collapsed workspace rows already use.

Assisted-By: devx/717e5259-915f-4a7b-af07-6abe46da5b90

* ci: restore approved contributor gate

* chore: update canonical repository references

* fix(ci): repair contributor gate handling

* fix: avoid ctrl-tab escape sequences in legacy panes

refs herdrdev#2296

* fix: render OSC 4 palette overrides instead of forwarding the index (herdrdev#2162)

Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* fix: keep plugin marketplace counts current

* fix(cli): accept --flag=value and reordered options in pane read/wait-output (herdrdev#2183)

* fix(cli): accept --flag=value and reordered options in pane read/wait-output

* test(cli): trim redundant pane parser coverage

---------

Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* docs: document custom agent integrations

* fix(detect): recognize versioned Python agent wrappers (herdrdev#2188)

Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* fix(terminal): restore keyboard reporting on detach (herdrdev#2395)

refs herdrdev#2393

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

* feat(copy-mode): add big-word motions (herdrdev#2270)

Co-authored-by: Ubuntu <ubuntu@ip-172-31-252-234.ca-west-1.compute.internal>
Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* fix: add positive idle detection for kiro-cli prompt (herdrdev#2301)

* fix: add positive idle detection for kiro-cli prompt

refs discussion herdrdev#982

* fix: remove manifest integration tests per reviewer request

---------

Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* fix(detect): ignore Cursor Run Everything status (herdrdev#2220)

* fix(detect): ignore Cursor Run Everything status

refs herdrdev#1763

* fix(detect): constrain Cursor approval controls

refs herdrdev#1763

* test(detect): remove cursor manifest behavior fixture

---------

Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>

* fix(theme): refresh host appearance on focus (herdrdev#2417)

* fix(theme): refresh host appearance on focus

refs herdrdev#2416

* fix(input): preserve split appearance replies

refs herdrdev#2416

* fix(input): retain fragmented appearance reports

refs herdrdev#2416

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* feat(marketplace): track star history for trending and new plugin surfaces

* chore: update website

* fix: publish stable release checksums

* fix: verify stable release checksums

* feat(website): rebuild compare page in new design with runtime positioning

* fix(remote): restore blocking bridge streams (herdrdev#2485)

refs herdrdev#2478

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

* fix(input): preserve shift in kitty alternate reports (herdrdev#2479)

refs herdrdev#2435

* fix: avoid redundant Windows recent-history snapshots (herdrdev#2474)

refs herdrdev#962

Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* fix(config): report unknown theme names (herdrdev#2488)

refs herdrdev#2452

* fix(windows): share Git Bash agent candidate scans (herdrdev#2494)

refs herdrdev#2459

* feat: support all agent integrations on windows (herdrdev#2496)

* fix: forward pane terminal bells (herdrdev#2498)

refs herdrdev#2453

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

* chore: approve dhh as contributor

* feat(input): add per-pane right-click routing (herdrdev#2504)

* fix: make windows installer swaps atomic (herdrdev#2530)

refs herdrdev#2356

* feat: make outer pane borders configurable (herdrdev#2535)

* feat(graphics): add direct pane frame streaming (herdrdev#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

* fix(ui): reclaim scrollbar gutter in alternate screen (herdrdev#2538)

* fix(website): improve plugins page readability on dark ground

* fix(input): preserve alt-prefixed control keys (herdrdev#2543)

refs herdrdev#2514

* perf(ui): avoid full pane mode reads for scrollbars (herdrdev#2554)

* fix(client): avoid abort on terminal hangup (herdrdev#2427)

* fix(client): avoid abort on terminal hangup

refs herdrdev#2424

* test(client): gate PTY integration on unix

refs herdrdev#2424

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* feat: add direct pane resize keybindings (herdrdev#2558)

* test: guard pane-scaled render performance

refs herdrdev#2550

* feat: add configurable tab bar status (herdrdev#2586)

* feat: show a zoom indicator in the desktop tab bar

Reserve the right edge of the tab row for a ZOOM pill while the
focused pane is zoomed, matching the accent style of the mode bars.
The per-tab Z suffix stays; the pill makes the zoomed state visible
at a glance like tmux's status-right flag.

* feat: optionally show the hostname in the desktop tab bar

Add ui.tab_bar_hostname to display the machine's hostname at the right
edge of the tab row, like tmux's #h in status-right. The value resolves
where the server renders, so remote sessions show the remote host. Off
by default.

* fix: strip control characters from the tab bar hostname

* fix: hide the hostname when it would squeeze out the tab strip

* feat: add configurable tab bar status

* fix: harden tab bar status updates

* fix: terminate tab bar status process trees

* fix: disable status commands on unsupported platforms

* fix: skip unchanged status command renders

* fix: keep tab bar status opt-in by default

---------

Co-authored-by: David Heinemeier Hansson <david@hey.com>

* feat: add move tab keybind actions (herdrdev#2561)

* feat: add move tab keybind actions

Add optional keys.move_tab_previous/move_tab_next actions that reorder
the active tab one position, wrapping at either end. Reuses the
existing tab.move runtime path that mouse drag reordering already
drives.

* fix: exit navigate mode on single-tab move attempts

* fix: center tab labels for symmetric highlight padding (herdrdev#2570)

* fix: center tab labels for symmetric highlight padding

* docs: note centered tab labels in the changelog

* fix: center tab labels by display width, not char count

* fix(ui): anchor the host cursor to modal name inputs (herdrdev#2569)

* fix(ui): anchor the host cursor to modal name inputs

IMEs draw their composition preview at the host terminal cursor. The rename
and new-worktree dialogs drew a block glyph instead of setting one, so the
frame carried no cursor and the client kept the position the focused pane
last reported. Japanese composition appeared behind the dialog and only
reached the field on Enter.

Set the cursor to the caret column instead, counting wide characters as two
cells.

refs herdrdev#1755

* fix(ui): keep the clamped caret cell blank

A name that fills the field left the clamped caret sitting on the last
rendered glyph. A terminal inverts the cell under its cursor and an IME
composes there, so the glyph was hidden and composition overlapped it.

Render the text one column short of the field. The field is still cleared
in full, so the clamped caret always lands on a blank cell.

refs herdrdev#1755

---------

Co-authored-by: kataokatsuki <kataokatsuki@users.noreply.github.com>
Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* fix: track opencode tui session selection (herdrdev#2455)

refs herdrdev#2450

Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>

* test(windows): serialize media player environment access (herdrdev#2619)

* fix(server): prioritize shutdown requests (herdrdev#2624)

refs herdrdev#2612

* fix(windows): strip elevated terminal title decoration (herdrdev#2632)

* ci: remove automatic issue gate

* fix(input): ignore modified j/k/up/down in session navigator (herdrdev#2377)

The Char('j')/Char('k')/Down/Up match arms in handle_navigator_key
had no modifier guard, unlike every sibling arm in the same match
block, so Ctrl+K, Alt+J, etc. also moved the navigator selection.

refs herdrdev#1981

Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* refactor(website): clean up homepage

* feat: keep the outer terminal window title in sync with the session (herdrdev#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>

* fix: wait for agent prompt readiness (herdrdev#2537)

* fix: wait for agent prompt readiness

refs herdrdev#2410

* fix: return pane updates after tab bar command

refs herdrdev#2410

---------

Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* chore: refresh english documentation

* fix: derive repo name for embedded bare layouts (herdrdev#2660)

refs herdrdev#2657

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

* fix: make just build cross-platform (herdrdev#2647)

Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* fix(windows): reduce idle agent detection CPU (herdrdev#2651)

* fix(windows): reduce idle agent detection CPU

refs herdrdev#2642

* fix(windows): gate agent process discovery

refs herdrdev#2642

---------

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

* fix(render): compact large terminal redraws (herdrdev#2675)

refs herdrdev#2670

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

* fix: disambiguate shifted punctuation keybinds (herdrdev#2676)

refs herdrdev#2674

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* fix: detect claude 2.1.228 half-circle busy spinner

* fix: synchronously terminate cancelled status commands

* perf: avoid repeated Git config reads (herdrdev#2688)

refs herdrdev#2643

Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* chore: update contributor list

* fix: preserve workspace labels for root repositories (herdrdev#2727)

refs herdrdev#2594

* fix: use the running binary in agent hooks (herdrdev#2722)

* fix: strip claude title spinner frames (herdrdev#2709)

* fix: source title activity glyphs from manifests

refs herdrdev#2707

* fix: simplify manifest-driven title stripping

refs herdrdev#2707

* fix: reconcile handoff title policies

refs herdrdev#2707

* fix: strip claude title spinner frames

refs herdrdev#2707

* fix: keep claude detection manifest unchanged

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>

* fix(agent): focus Copilot before prompting (herdrdev#2734)

* fix(agent): focus Copilot before prompting

refs herdrdev#1698

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* test(agent): cover stale focus-reporting state

refs herdrdev#1698

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: add qwen code detection and restore (herdrdev#2743)

refs herdrdev#2730

* fix: preserve logical lines in scrollback editor (herdrdev#2735)

refs herdrdev#2733

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: Can Celik <ogulcancelik@gmail.com>

* fix(graphics): support high-dpi direct file frames (herdrdev#2680)

---------

Co-authored-by: akbash <akbash@herdr.dev>
Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
Co-authored-by: WakaTaira <50697207+WakaTaira@users.noreply.github.com>
Co-authored-by: Florian <13469873+VialFlorian@users.noreply.github.com>
Co-authored-by: Rhys <105699450+rhjoh@users.noreply.github.com>
Co-authored-by: Michael Hackner <mhackner@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: kangal-bot <285672167+kangal-bot@users.noreply.github.com>
Co-authored-by: Kataoka Katsuki <49934462+kataokatsuki@users.noreply.github.com>
Co-authored-by: kataokatsuki <kataokatsuki@users.noreply.github.com>
Co-authored-by: Jon Kinney <jonkinney@gmail.com>
Co-authored-by: Kazunari Kamata <14287197+kazunari-kamata@users.noreply.github.com>
Co-authored-by: oyoguhito <oyoguhito@kamatanoMacBook-Pro.local>
Co-authored-by: Ian Ker-Seymer <i.kerseymer@gmail.com>
Co-authored-by: Mo <77584024+hamidi-dev@users.noreply.github.com>
Co-authored-by: Kyle Corbeille <kcorbeille76@gmail.com>
Co-authored-by: Phil Larson <hello@phillarson.xyz>
Co-authored-by: JP Lew <462836+jplew@users.noreply.github.com>
Co-authored-by: Ubuntu <ubuntu@ip-172-31-252-234.ca-west-1.compute.internal>
Co-authored-by: Sam Biggins <sambiggins@gmail.com>
Co-authored-by: Jesse Zhang <j3ssezhang102@gmail.com>
Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
Co-authored-by: David Heinemeier Hansson <david@hey.com>
Co-authored-by: PISIT KOOLPLUKPOL <pisit.koolplukpol@outlook.com>
Co-authored-by: Erik Krogen <erikkrogen@gmail.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
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.

2 participants