| Age | Commit message (Collapse) | Author |
|
* feat: add named persistent sessions
* feat: add session management commands
* fix: tighten named session stop and override precedence
* fix: handle session help and stop test race
* test: isolate default session env test
---------
Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
|
|
* fix: mouse resize panel failed with claude-code no flicker
* test: run pane mouse reporting drag tests inside tokio runtime
Switch the new horizontal/vertical drag tests to `#[tokio::test]` so
`PaneRuntime::test_with_screen_bytes` has a reactor when it calls
`tokio::spawn`. CI was panicking with "there is no reactor running".
* test: refresh git state in workspace drop slot test
Workspace::test_new caches the parent repo's git branch at construction
time. On master CI the herdr checkout has ref: refs/heads/master in HEAD,
so the cache is populated and workspace_row_height returns 2. On PR CI
actions/checkout uses a detached merge ref, git_branch returns None, row
height becomes 1, and the drop-slot tie-break flips workspace_drop_index_at_row(2)
from Some(0) to Some(1). Refresh git state after pointing identity_cwd at
the per-test temp repo so the cache reflects the temp repo's HEAD.
|
|
|
|
|
|
fixes #58
|
|
fixes #58
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* feat(opencode): report blocked state on question.asked event
* docs: add question.asked/replied/rejected to opencode plugin mapping
|
|
|
|
|
|
|
|
|
|
Shells like zsh highlight pasted text using reverse video (SGR 7). The
render pipeline makes the default background transparent (None) when it
matches the host terminal background. When inverse swaps fg and bg, the
transparent bg becomes fg=None (Color::Reset), which the host terminal
renders as its default foreground — the same hue as the new bg, making
the text invisible.
Resolve None to the actual terminal background color before swapping so
inverse produces correct contrasting colors.
Fixes ogulcancelik/herdr#44
Co-authored-by: Can Celik <ogulcancelik@gmail.com>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Make herdr persistent by default.
Launching herdr now starts or reattaches to a background session
server. Clients can detach and reattach while panes and agent
processes keep running. Session mode now supports multi-client attach,
auto-detect startup, and a thin-client/headless-server split.
This also refactors the large app, ui, input, pane, config,
workspace, and persistence modules into smaller focused submodules,
while preserving behavior and colocating tests with the code they
exercise.
Upgrade notes:
- persistence mode is now the default
- in-app quit detaches the current client instead of stopping the server
- use `herdr server stop` to stop the background session
- use `--no-session` for the old single-process behavior
- default socket paths now live under the config directory
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
herdr embeds `libghostty-vt` as a headless terminal emulator per pane,
and its readonly stream handler silently drops `.clipboard_contents`
actions. As a result, any child process that writes OSC 52 to copy to
the system clipboard (for example Amp, which enables mouse reporting
and handles selection internally) has its sequence swallowed before it
can reach the host terminal — the user sees the child's "copied" toast
but the system clipboard is never updated.
This change adds an `Osc52Forwarder` that observes raw PTY bytes in
`process_pty_bytes`, reconstructs completed `ESC ] 52 ; (c|) ; <base64>
(BEL|ST)` sequences (write/clear only — queries are dropped since herdr
has no path to reply to the child), and returns them through the
existing `ProcessBytesResult`. The reader task forwards the bytes to
the main loop via a new `AppEvent::ClipboardWrite`, which is written
to stdout from `handle_internal_event`. Routing through the main loop
keeps stdout writes serialized with `terminal.draw` and the other
existing host-terminal emitters, so the new forwarder does not race
with rendering.
Existing herdr-native selection (mouse drag in panes without mouse
reporting) is unchanged and still writes through `selection::write_osc52`.
|