client: confirm an unbracketed paste that carries any control byte #229

Merged
natsukium merged 1 commit from client/paste-control-confirm into main 2026-10-23 11:07:18 +09:00
Owner

With bracketed paste off, the confirmation bar (REQ-804) asked only when a paste carried a line break. Other C0 controls act as typed keys at the receiving program just as a newline does, so the bar now asks for any C0 control other than HT. DEL, C1 and non-ASCII text do not raise it.

  • felis-client-core: paste_needs_confirmation widened; a single-line paste reads "Paste text containing control characters? …" instead of "Paste 1 lines?". Unit tests and proptests.
  • The daemon's paste framing is unchanged, so felis sessions send still delivers exactly what a script wrote.
  • Docs: REQ-804, input explanation, keybindings confirmation-bar table, key-encoding paste note; CHANGELOG.

Closes #217

With bracketed paste off, the confirmation bar (REQ-804) asked only when a paste carried a line break. Other C0 controls act as typed keys at the receiving program just as a newline does, so the bar now asks for any C0 control other than HT. DEL, C1 and non-ASCII text do not raise it. - `felis-client-core`: `paste_needs_confirmation` widened; a single-line paste reads "Paste text containing control characters? …" instead of "Paste 1 lines?". Unit tests and proptests. - The daemon's paste framing is unchanged, so `felis sessions send` still delivers exactly what a script wrote. - Docs: REQ-804, input explanation, keybindings confirmation-bar table, key-encoding paste note; CHANGELOG. Closes #217
client: confirm an unbracketed paste that carries any control byte
Some checks failed
fuzz / cargo fuzz nightly long-run (pull_request) Has been skipped
darwin / detect relevant changes (pull_request) Successful in 9s
darwin / darwin docs-only no-op (pull_request) Has been skipped
windows / detect relevant changes (pull_request) Successful in 16s
windows / windows docs-only no-op (pull_request) Has been skipped
darwin / build felis (aarch64-darwin) (pull_request) Successful in 1m12s
windows / cargo nextest (Windows) (pull_request) Successful in 3m44s
windows / frontend smoke (Windows) (pull_request) Successful in 1m11s
bench / instruction-count regression gate (pull_request) Successful in 1m33s
fuzz / cargo fuzz smoke (per target) (pull_request) Successful in 1m14s
pr / nix flake check (pull_request) Successful in 2m56s
pr / cargo build / clippy / test / deny (pull_request) Failing after 3m0s
pr / wire schema is compatible with the base (pull_request) Successful in 11s
pr / frontend smoke (x86_64-linux) (pull_request) Successful in 1m3s
windows / cargo clippy (Windows cross) (pull_request) Successful in 18s
ba924005b1
With bracketed paste off, every pasted byte reaches the program as a
typed key, and the confirmation bar fired only on a line break. Other
C0 controls are just as live at a line editor: ^O runs the line in bash
and zsh, ^C and ^D cancel or exit, ESC starts a key sequence. The gate
now fires on any C0 control except HT, which pasted code is full of.

The check stays on the client and the confirmed bytes still ship
verbatim; stripping them on the daemon would change what
`felis sessions send` delivers.

Assisted-by: Claude Code
natsukium force-pushed client/paste-control-confirm from ba924005b1
Some checks failed
fuzz / cargo fuzz nightly long-run (pull_request) Has been skipped
darwin / detect relevant changes (pull_request) Successful in 9s
darwin / darwin docs-only no-op (pull_request) Has been skipped
windows / detect relevant changes (pull_request) Successful in 16s
windows / windows docs-only no-op (pull_request) Has been skipped
darwin / build felis (aarch64-darwin) (pull_request) Successful in 1m12s
windows / cargo nextest (Windows) (pull_request) Successful in 3m44s
windows / frontend smoke (Windows) (pull_request) Successful in 1m11s
bench / instruction-count regression gate (pull_request) Successful in 1m33s
fuzz / cargo fuzz smoke (per target) (pull_request) Successful in 1m14s
pr / nix flake check (pull_request) Successful in 2m56s
pr / cargo build / clippy / test / deny (pull_request) Failing after 3m0s
pr / wire schema is compatible with the base (pull_request) Successful in 11s
pr / frontend smoke (x86_64-linux) (pull_request) Successful in 1m3s
windows / cargo clippy (Windows cross) (pull_request) Successful in 18s
to f2a08840c7
All checks were successful
fuzz / cargo fuzz nightly long-run (pull_request) Has been skipped
darwin / detect relevant changes (pull_request) Successful in 9s
darwin / darwin docs-only no-op (pull_request) Has been skipped
windows / detect relevant changes (pull_request) Successful in 10s
windows / windows docs-only no-op (pull_request) Has been skipped
bench / instruction-count regression gate (pull_request) Successful in 51s
darwin / build felis (aarch64-darwin) (pull_request) Successful in 1m13s
fuzz / cargo fuzz smoke (per target) (pull_request) Successful in 48s
pr / nix flake check (pull_request) Successful in 29s
windows / cargo nextest (Windows) (pull_request) Successful in 3m1s
windows / frontend smoke (Windows) (pull_request) Successful in 44s
pr / cargo build / clippy / test / deny (pull_request) Successful in 2m38s
pr / wire schema is compatible with the base (pull_request) Successful in 3s
pr / frontend smoke (x86_64-linux) (pull_request) Successful in 27s
windows / cargo clippy (Windows cross) (pull_request) Successful in 14s
2026-10-23 11:00:54 +09:00
Compare
natsukium deleted branch client/paste-control-confirm 2026-10-23 11:07:18 +09:00
Sign in to join this conversation.
No reviewers
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
felis-terminal/felis!229
No description provided.