Skip to content

feat(pty-proxy): window title follows child process - #4447

Merged
atuin-bot merged 1 commit into
mainfrom
feat/handle-osc-1-2
Oct 22, 2026
Merged

atuin-bot merged 1 commit into
mainfrom
feat/handle-osc-1-2

Conversation

@markovejnovic

@markovejnovic markovejnovic commented Oct 17, 2026 •

Copy link
Copy Markdown
Member

Under pty-proxy, a terminal that names the program running in it finds the proxy in the foreground of its pty, so every tab says atuin. The proxy now titles the terminal after the program in the foreground of its own pty, much as tmux's automatic-rename names windows via OSC 0.

Behaviour changes

  • Terminals that never showed process names get them now, unless the shell titles the terminal itself.
  • After a program sets its own title, the terminal keeps it for the rest of the session. This is standard OSC 0 behavior.
  • Inside tmux the proxy's title becomes the pane title, which the default status-right shows in place of the hostname.

@greptile-apps

greptile-apps Bot commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 5/5 Tier: plus

[Medium impact] Appears safe to merge; a delayed title can still briefly show a finished command.

Findings

  1. P2Β Delayed updates show finished commands β–Ά

Summary

Makes terminal titles follow the child’s foreground program.

  • The proxy names the terminal after the foreground program.
  • Screen capture and debug views share one parser for the child's output.

markovejnovic confirmed that leaderless pipelines intentionally keep their old title to match tmux without scanning processes. Child-set titles also intentionally last for the session. Greptile withdrew both earlier objections.

Code review only; tests were not run.

Reviews (8) Β· Last reviewed commit: "test(common): kill the renamed sleep fro..." Β· Reviewed by Greptile

Comment thread crates/atuin-pty-proxy/src/title.rs Resolved
Comment thread crates/atuin-pty-proxy/src/title.rs Resolved
@markovejnovic markovejnovic changed the title feat(pty-proxy): title the terminal after the foreground program feat(pty-proxy): OSC0-2 Support Oct 19, 2026
@markovejnovic markovejnovic changed the title feat(pty-proxy): OSC0-2 Support feat(pty-proxy): window title follows child process Oct 19, 2026
Comment thread crates/atuin-pty-proxy/src/title.rs Resolved
@markovejnovic
markovejnovic changed the base branch from main to refactor/pty-proxy-emulator October 22, 2026 00:26
@atuin-bot
atuin-bot force-pushed the refactor/pty-proxy-emulator branch from 95ab7f0 to f86a54c Compare October 22, 2026 00:32
atuin-bot pushed a commit that referenced this pull request Oct 22, 2026
`screen.rs`'s `Parser` is the emulator that snapshots the screen, and shares its name with `markers::Parser` (and with the stream parser #4447 adds). It is now `Emulator`, with `EmulatorOptions`, `spawn_emulator` and an `atuin-pty-emulator` thread. No behaviour change.

Tested locally on macOS: clippy, `cargo nextest run -p atuin-pty-proxy`, and the pty-proxy e2e suites. Bash's login case in `e2e_pty_proxy_init` fails, the same way on main.


Drafted with Claude Code.
Base automatically changed from refactor/pty-proxy-emulator to main October 22, 2026 00:32
@markovejnovic
markovejnovic changed the base branch from main to refactor/pty-proxy-one-parser October 22, 2026 01:49
@markovejnovic
markovejnovic force-pushed the feat/handle-osc-1-2 branch 3 times, most recently from 7c43588 to 2c8f317 Compare October 22, 2026 03:42
@atuin-bot
atuin-bot force-pushed the refactor/pty-proxy-one-parser branch from 8ad26fa to af714d0 Compare October 22, 2026 04:02
Base automatically changed from refactor/pty-proxy-one-parser to main October 22, 2026 04:02
@markovejnovic
markovejnovic marked this pull request as ready for review October 22, 2026 04:10
@markovejnovic

Copy link
Copy Markdown
Member Author

/merge

@atuin-bot

atuin-bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Collaborator

Landed as e065659. GitHub shows this merged once it reaches main.

Under pty-proxy, a terminal that names the program running in it finds the proxy in the foreground of its pty, so every tab says `atuin`. The proxy now titles the terminal after the program in the foreground of its own pty, much as tmux's `automatic-rename` names windows via `OSC 0`.

## Behaviour changes

- Terminals that never showed process names get them now, unless the shell titles the terminal itself.
- After a program sets its own title, the terminal keeps it for the rest of the session. This is standard `OSC 0` behavior.
- Inside tmux the proxy's title becomes the pane title, which the default `status-right` shows in place of the hostname.
@atuin-bot
atuin-bot force-pushed the feat/handle-osc-1-2 branch from 78dc5d1 to e065659 Compare October 22, 2026 04:25
@atuin-bot
atuin-bot merged commit e065659 into main Oct 22, 2026
3 checks passed
@atuin-bot
atuin-bot deleted the feat/handle-osc-1-2 branch October 22, 2026 04:25
atuin-bot pushed a commit that referenced this pull request Oct 22, 2026
### Bug Fixes

- *(ai)* Import IntoStaticStr from strum_macros, not strum ([#4480](#4480))
- *(ai)* Improve detection of git repositories ([#4450](#4450))
- *(client)* Resolve relative config paths beside config.toml, not the cwd ([#4479](#4479))
- *(config)* Don't print errors twice ([#4501](#4501))
- *(daemon)* Fetch the server's capabilities until a fetch succeeds
- *(daemon)* Spare a stale pidfile's PID when evicting ([#4512](#4512))
- *(daemon)* Handle daemons not spawned by atuin ([#4516](#4516))
- *(output)* Keep quoted words together in output search ([#4502](#4502))
- *(packfile)* Load only the records inside a manifest's range
- *(pty-proxy)* Standalone init with `atuin pty-proxy init` ([#4449](#4449))
- *(pty-proxy)* Wait for input on a non-blocking inherited stdin ([#4486](#4486))
- *(pty-proxy)* Don't re-exec shells running commands from a string or file ([#4414](#4414))
- *(search)* Don't panic when copying with no results ([#4426](#4426))
- *(server)* Let `ATUIN_*` environment variables override server.toml ([#4456](#4456))
- *(update)* Accept ATUIN_GITHUB_TOKEN ([#4262](#4262))
- Remove duplicated word in the no-history stats message ([#4451](#4451))
- Error printing in `?` handler ([#4448](#4448))
- Normalize relative gitdir paths in worktree resolution ([#4506](#4506))
- Upgrade regressions found in release QA ([#4519](#4519))


### Documentation

- Fix ctrl_n_shortcuts default value ([#4458](#4458))
- List all history list --format variables ([#4460](#4460))
- Fix the --reverse default for history list ([#4472](#4472))
- Mention December default in wrapped --year help ([#4476](#4476))


### Features

- *(common)* AbsPath and AbsPathBuf, Path and PathBuf checked to be absolute ([#4481](#4481))
- *(common)* Find a process's cgroup under cgroup v1 and v2 ([#4513](#4513))
- *(daemon)* Run the daemon as a launchd agent on macOS ([#4517](#4517))
- *(pty-proxy)* Window title follows child process ([#4447](#4447))
- *(secrets)* Keep HashiCorp tokens out of history ([#4445](#4445))


### Miscellaneous Tasks

- Give mono its own nixfmt step and scope atuin's to atuin/
- Say a /merge's landed commit gets CI on main
- Rebuild the apt .deb cache for Ubuntu 24.04 ([#4504](#4504))
- Remove the benchmarks ([#4511](#4511))


### Performance

- *(common)* Compile the vendor regexes once ([#4485](#4485))
- *(common)* Drop the tree watcher's file-id cache ([#4492](#4492))
- *(common)* Release a line reader's buffer at the end of the file ([#4494](#4494))
- *(common)* Keep no tree watcher entry for a rejected file ([#4493](#4493))
- *(daemon)* Warm up only a resumed session's unanswered calls ([#4490](#4490))
- *(packfile)* Compress packs in one shot ([#4484](#4484))


### Refactor

- *(daemon)* Managed daemon service with multiple backends ([#4488](#4488))
- *(daemon)* Move daemon startup into the service module ([#4503](#4503))
- *(daemon)* Keep where the daemon listens behind service::address ([#4514](#4514))
- *(daemon)* Take up the daemon's socket in SocketHolder, not Backend ([#4515](#4515))
- *(deps)* Bump clap_complete_nushell from 4.6.0 to 4.6.2 ([#4473](#4473))
- *(deps)* Bump clap_complete from 4.6.9 to 4.6.11 ([#4396](#4396))
- *(deps)* Bump ratatui from 0.30.0 to 0.30.2 ([#4474](#4474))
- *(deps)* Bump certifi from 2025.11.12 to 2026.10.19 in /docs in the uv group across 1 directory ([#4500](#4500))
- *(pty-proxy)* Run on tokio with the parser on its own runtime ([#4482](#4482))
- *(pty-proxy)* Forward captures to the daemon on the proxy's runtime ([#4487](#4487))
- *(pty-proxy)* Rename the screen's parser to Emulator ([#4510](#4510))
- *(pty-proxy)* Migrate output parsing to vte ([#4518](#4518))


### Testing

- *(daemon)* Run the output index tests under rstest ([#4496](#4496))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants