Commit Graph
242 Commits
Author SHA1 Message Date
Can CelikandCameron fc1cb77f05 feat: add Letta Code detection and restore (#3107)
refs #3106

Co-authored-by: Cameron <cameron@pfiffer.org>
2026-09-13 17:36:47 +02:00
a5e1c94157 fix: restrict claude session hooks to native sources (#4046)
refs #4018

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com>
2026-09-13 15:04:22 +02:00
Can Celik fc44f61a10 fix: disconnect stalled terminal observers (#4039) 2026-09-13 13:47:53 +03:00
akbashandakbash-bot aa6b531a42 fix: update grok session after new (#2683)
* fix: update grok session after new

refs #2681

* fix: avoid powershell args shadowing

refs #2681

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-09-13 02:04:27 +02:00
Mark JaquithandJonathan Liebig fb5525fc22 fix: opencode v2 lifecycle reporting (#3757)
* 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>
2026-09-11 22:36:18 +02:00
Can Celik a0474ae770 fix: preserve whole-word selection while dragging (#3969)
refs #1836
2026-09-11 22:58:01 +03:00
JJ Liebig 871ff8b91f fix: flush Windows Codex paste burst before prompt submit (#3961)
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 #3187
2026-09-11 17:04:06 +02:00
Can Celik 5827145940 feat: support conditional sidebar token hiding (#3925) 2026-09-11 00:55:19 +03:00
Can Celik 043b804c44 feat: route cli commands to saved ssh machines (#3918) 2026-09-10 23:33:27 +03:00
Can Celik 1682cab326 fix: restore plugin focus events for client navigation (#3850)
refs #3824
2026-09-09 22:04:47 +03:00
b9ce96869e feat: navigate and highlight workspaces across machines (#3755)
* fix: highlight workspace navigation with saved machines

refs #3754

* feat: navigate workspaces across connected machines

refs #3754

* feat: navigate workspaces across machines

refs #3754

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-09-09 02:35:31 +03:00
JJ LiebigandOgulcan Celik 8996fc54fe fix: support preinstalled windows remote hosts (#3661)
* fix: support windows hosts in saved ssh machines

refs #3651

* fix: keep windows ssh bridge writes blocking

refs #3651

* fix: close saved windows ssh bootstrap input

refs #3651

* refactor: simplify remote bridge helpers

refs #3651

* refactor: isolate remote bridge platform behavior

refs #3651

* fix: close captured ssh input under windows consoles

refs #3651

* test: remove redundant remote command assertions

refs #3651

refs #3701

* test: handle framed ssh commands in machine setup

refs #3651

---------

Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-09-09 00:08:42 +03:00
68c7b78ec2 fix: collapse worktree groups with saved machines (#3781)
* fix: collapse worktree groups with saved machines

refs #3778

* fix: scope worktree collapse by machine

refs #3778

* fix: collapse machines without switching focus

refs #3778

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-09-08 17:51:59 +03:00
Ogulcan Celik 9be481fea6 docs: prepare 0.9.0 release documentation 2026-09-07 22:04:55 +03:00
Ogulcan Celik 702aa1e455 fix: require explicit consent for remote server replacement 2026-09-07 19:33:11 +03:00
4828181304 feat: make ui.pane_borders a three-state auto/always/off mode (#3234)
* feat: make ui.pane_borders a three-state auto/always/off mode

Legacy booleans keep parsing (true = auto, false = off); "always" frames
a lone pane while pane_outer_borders is enabled.

* fix: align pane border reload test and documentation

---------

Co-authored-by: Rudolf Schmidt <me@rudionrails.com>
Co-authored-by: Jonathan Liebig <jonathan.liebig@gmail.com>
2026-09-07 14:04:54 +02:00
Can Celik c7b79294e2 feat: add conditional styles for sidebar tokens (#3693) 2026-09-06 23:44:15 +03:00
Can Celik 9e9bc8a144 feat: manage multiple ssh machines from one client (#3670) 2026-09-06 02:27:06 +03:00
JJ LiebigandCan Celik 8162e26509 fix(windows): use active release directory on PATH (#3618)
* fix(windows): use active release directory on PATH

refs #3611

* fix(windows): expand variables in PATH comparisons

refs #3611

* fix(windows): restrict installer channel detection

refs #3611

---------

Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-09-05 01:47:00 +03:00
Ogulcan Celik a2b128978a feat: enable kitty graphics by default 2026-09-04 21:59:13 +03:00
JJ Liebig 3150bd92d6 fix(integration): resolve Devin config on Windows (#3595)
refs #2724
2026-09-04 01:05:35 +02:00
JJ Liebig 8633a398e6 fix: reliably submit delayed agent prompts (#3506) 2026-09-02 13:34:03 +02:00
Can Celik 6c0bb273d5 feat: support independent multi-client tab views (#3526) 2026-09-02 14:24:33 +03:00
Can Celik cc88b3b8e5 feat: add stable client endpoint compatibility (#3509)
* feat: add stable client endpoint compatibility

* fix: keep portable-pty patch checks composable

* ci: run maintenance checks in pull requests

* fix: reject endpoint errors from terminal clients

* feat: keep compatible servers running across updates
2026-09-02 02:45:20 +03:00
Can Celik 207be3c771 refactor: render the shell in the client (#3487)
* feat: add opt-in client-rendered shell

* feat: add client-owned shell mouse controls

* feat: complete client-owned shell chrome

* feat: add client-owned shell settings and notifications

* feat: run client shell custom commands

* feat: render popup terminals in client shell

* feat: add client-owned scrollback and copy mode

* fix: preserve client worktree trust defaults

* feat: render startup diagnostics in client shell

* feat: render onboarding in client shell

* feat: render product announcements in client shell

* feat: render release notes in client shell

* feat: render mobile switcher in client shell

* feat: render kitty graphics in client shell

* fix: preserve client shell lifecycle coherence

* refactor: route client shell commands through endpoint connections

* refactor: make the client-rendered shell the default

* refactor: remove monolithic launch mode

* refactor: complete client-rendered shell cutover

* perf: retain client pane surface updates

* perf: scale retained pane surface updates

* perf: remove remote pane input latency

* test: make client shell checks platform-independent

* fix: prevent client timer starvation

* test: fix client shell platform gates

* test: accept retained surfaces in cross-area checks

* test: make client mode assertions platform-neutral

* fix: badge only outdated integrations
2026-09-01 15:48:22 +03:00
Can Celik 095f1337d6 fix: trust worktree repositories per request (#3344)
refs #3044
2026-08-28 18:25:07 +03:00
7b675f42af feat(detect): add muse agent with generic Pick blocked detection (#2489)
* feat(detect): add muse agent with generic Pick blocked detection

Add Muse agent manifests and runtime detection for idle/working/blocked
states. Blocked Pick is generic on footer 'Enter to select' so any
question title/message triggers, fixing missed waiting answer where
previous AND-gated rule required specific hint combos. Cover process
names muse, muse-bin, muse-code variants and YOLO footer.

refs #herdr

* fix(detect): tighten muse manifest and agent lookup

- manifests: change working_esc_interrupt and blocked_approval
  from whole_recent to bottom_non_empty_lines(8) to use captured
  bottom-buffer controls instead of incidental whole-pane text
- manifests: anchor idle_prompt line_regex to ^\s*⟩\s*$ so working
  chrome "⟩ ..." does not match idle
- runtime: restrict muse lookup to explicit aliases
  (muse|muse-bin|muse-code|muse-cli), remove starts_with("muse")
  fallback that misclassified museum/muse-helper/muser; add
  positive/negative identification tests
- keep website mirror identical; verified with agent_detection
  manifest check --require-website

refs #2489
refs #2456

* fix(detect): address mjdouglas vendor findings for muse

- manifests: widen pick_request_blocked to bottom_non_empty_lines(8) and add
  Enter to toggle for multi-select; add menu_request_blocked for user-opened
  pickers (enter confirm/esc go back/esc close/space toggle); add
  workspace_trust_blocked for Do you trust dialog; tighten blocked_approval
  to footer chrome Allow once/Always allow/Yes proceed; split idle_prompt
  into any gate for empty and typed draft and not-gate pick/menu anchors;
  change idle_status_fallback from YOLO to model \u00b7 effort \u00b7 cwd shape
- runtime: replace bare muse-bin alias with muse-bin-<version> digit check
  to match versioned launcher binary and avoid museum/muse-binary false
  positives
- cross-checked with vendor-side captures reported on PR #2489 against
  strings in shipped muse-bin binary

refs #2489

* fix(detect): handle path-qualified muse-bin versioned binary

lookup_agent now uses path_basename before matching so a launcher
exec with absolute argv0 like /usr/local/lib/muse/muse-bin-0.1.0-R708.1
is correctly identified. is_muse_versioned_binary also checks basename
so direct path-qualified names succeed without relying on the
argv0_argv fallback path. Prevents missed Muse detection when screen
state and sound overrides are not applied.

refs #2489

* fix(detect): add enter save to muse menu detection

Evidence documents /theme with enter save footer which was not
matched. Add enter save to menu_request_blocked any list and to
idle_prompt not-gate (highlighted row ⟩ <choice> shares glyph) and
keep website mirror in sync. Update evidence comment counts from
four to five.

refs #2489

* docs: add Muse to supported agents table

Muse detection (manifest, process identification, sound)
was added earlier but docs/next agents table omitted the row.
Add Muse as screen manifest / none (no integration hook,
consistent with Amp/Kiro/Maki) to en/ja/zh-cn translations.

* fix(detect): resize agent arrays for new upstream variant

Agent::ALL and SCREEN_MANIFEST_AGENTS gained an entry from master
but kept stale size annotations, breaking compilation after rebase.

refs #2489

* docs: add muse detection entry to next changelog

refs #2489

* docs: add muse sound override to config reference

refs #2489

* fix(detect): prevent false muse blocked states

refs #2489

---------

Co-authored-by: Omer Hamid Kamisli <ohkamisli@poikus.com>
Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-08-27 14:30:24 +03:00
akbashandakbash-bot d79fd746a9 fix: require explicit workspace group close (#3206)
refs #2874

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-08-25 23:44:56 +03:00
Can Celik 20a500a7f3 fix(api): start lifecycle subscriptions from live events (#3134)
refs #1270
2026-08-23 02:01:24 +03:00
Can Celik c9601b9396 fix(windows): add local cmd installer bootstrap (#3133)
* fix(windows): add local cmd installer bootstrap

refs #2751

* fix(windows): bound installer downloads

refs #2751
2026-08-23 00:37:31 +03:00
AlexandOgulcan Celik db6f301f13 feat: add per-mode theme overrides (#2324)
* feat: add per-mode theme overrides

allow [theme.custom.light] and [theme.custom.dark] blocks so custom
overrides can differ per resolved appearance when auto_switch flips.
precedence: theme defaults, then [theme.custom], then the block for
the active mode. configs without the new blocks resolve unchanged.

refs #837

* docs: complete per-mode theme documentation

---------

Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
2026-08-23 00:18:56 +03:00
Ogulcan Celik 81864e516a docs: document macos keychain launch context
refs #966
2026-08-21 21:30:20 +03:00
akbashandakbash-bot 4d17957c43 fix: strip ansi sequences from tab bar status (#3003)
* fix: strip ansi sequences from tab bar status

refs #3001

* docs: clarify tab bar escape sequence scope

refs #3001

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-08-20 00:17:25 +03:00
Ogulcan Celik 92b645ec9e docs: finalize 0.8.2 release notes 2026-08-19 20:44:16 +03:00
Ogulcan Celik 9fac517226 feat: make Windows generally available 2026-08-18 22:39:38 +03:00
Ogulcan Celik 1147e60bc0 docs: sync localized configuration updates 2026-08-17 17:18:09 +03:00
Can Celik 9166e07b31 fix(theme): keep default active rows subtle and add navigate cursor color (#2838)
refs #2792
2026-08-15 15:36:12 +03:00
Can Celik 15539d3dec feat: make headless terminal size configurable (#2829)
refs #2828
2026-08-15 15:09:53 +03:00
Can Celik d2c317adc4 fix: keep active sidebar rows visible (#2794)
refs #2792
2026-08-14 05:01:12 +03:00
akbashandakbash-bot 9351b058f3 fix: reject prompts to blocked agents (#2790)
* fix: reject prompts to blocked agents

refs #2788

* docs: clarify agent prompt timing

refs #2788

---------

Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
2026-08-14 01:22:46 +03:00
Can Celik b7dca4bb2a fix(graphics): support high-dpi direct file frames (#2680) 2026-08-13 17:21:26 +03:00
Can Celik a4d52ab602 feat: add qwen code detection and restore (#2743)
refs #2730
2026-08-13 03:00:35 +03:00
Ogulcan Celik ddffb6e1d7 chore: refresh english documentation 2026-08-11 03:54:03 +03:00
JJ LiebigandCan Celik 7ae4b056a0 fix: wait for agent prompt readiness (#2537)
* fix: wait for agent prompt readiness

refs #2410

* fix: return pane updates after tab bar command

refs #2410

---------

Co-authored-by: Can Celik <ogulcancelik@gmail.com>
2026-08-11 03:24:02 +03:00
David Heinemeier HanssonandOgulcan Celik 350f001320 feat: keep the outer terminal window title in sync with the session (#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>
2026-08-11 03:04:12 +03:00
David Heinemeier Hansson f5067ed829 feat: add move tab keybind actions (#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
2026-08-10 01:55:28 +03:00
Can CelikandDavid Heinemeier Hansson e48d83067a feat: add configurable tab bar status (#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>
2026-08-10 01:20:09 +03:00
David Heinemeier Hansson 4e31084495 feat: add direct pane resize keybindings (#2558) 2026-08-09 19:10:52 +03:00
Can Celik 1777e9bba3 feat(graphics): add direct pane frame streaming (#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
2026-08-09 02:04:39 +03:00
David Heinemeier Hansson 36a8d36a72 feat: make outer pane borders configurable (#2535) 2026-08-09 01:37:57 +03:00