core-agent-ide/docs
rakan-oai 56cc2c71f4
tui: preserve kill buffer across submit and slash-command clears (#12006)
## Problem

Before this change, composer paths that cleared the textarea after
submit or slash-command dispatch
also cleared the textarea kill buffer. That meant a user could `Ctrl+K`
part of a draft, trigger a
composer action that cleared the visible draft, and then lose the
ability to `Ctrl+Y` the killed
text back.

This was especially awkward for workflows where the user wants to
temporarily remove text, run a
composer action such as changing reasoning level or dispatching a slash
command, and then restore
the killed text into the now-empty draft.

## Mental model

This change separates visible draft state from editing-history state.

The visible draft includes the current textarea contents and text
elements that should be cleared
when the composer submits or dispatches a command. The kill buffer is
different: it represents the
most recent killed text and should survive those composer-driven clears
so the user can still yank
it back afterward.

After this change, submit and slash-command dispatch still clear the
visible textarea contents, but
they no longer erase the most recent kill.

## Non-goals

This does not implement a multi-entry kill ring or change the semantics
of `Ctrl+K` and `Ctrl+Y`
beyond preserving the existing yank target across these clears.

It also does not change how submit, slash-command parsing, prompt
expansion, or attachment handling
work, except that those flows no longer discard the textarea kill buffer
as a side effect of
clearing the draft.

## Tradeoffs

The main tradeoff is that clearing the visible textarea is no longer
equivalent to fully resetting
all editing state. That is intentional here, because submit and
slash-command dispatch are composer
actions, not requests to forget the user's most recent kill.

The benefit is better editing continuity. The cost is that callers must
understand that full-buffer
replacement resets visible draft state but not the kill buffer.

## Architecture

The behavioral change is in `TextArea`: full-buffer replacement now
rebuilds text and elements
without clearing `kill_buffer`.

`ChatComposer` already clears the textarea after successful submit and
slash-command dispatch by
calling into those textarea replacement paths. With this change, those
existing composer flows
inherit the new behavior automatically: the visible draft is cleared,
but the last killed text
remains available for `Ctrl+Y`.

The tests cover both layers:

- `TextArea` verifies that the kill buffer survives full-buffer
replacement.
- `ChatComposer` verifies that it survives submit.
- `ChatComposer` also verifies that it survives slash-command dispatch.

## Observability

There is no dedicated logging for kill-buffer preservation. The most
direct way to reason about the
behavior is to inspect textarea-wide replacement paths and confirm
whether they treat the kill
buffer as visible-buffer state or as editing-history state.

If this regresses in the future, the likely failure mode is simple and
user-visible: `Ctrl+Y` stops
restoring text after submit or slash-command clears even though ordinary
kill/yank still works
within a single uninterrupted draft.

## Tests

Added focused regression coverage for the new contract:

- `kill_buffer_persists_across_set_text`
- `kill_buffer_persists_after_submit`
- `kill_buffer_persists_after_slash_command_dispatch`

Local verification:
- `just fmt`
- `cargo test -p codex-tui`

---------

Co-authored-by: Josh McKinney <joshka@openai.com>
2026-03-03 02:06:08 +00:00
..
agents_md.md Rename hierarchical_agents to child_agents_md (#9215) 2026-01-14 19:14:24 +00:00
authentication.md Replaced user documentation with links to developers docs site (#8662) 2026-01-02 13:01:53 -07:00
CLA.md chore: subject docs/*.md to Prettier checks (#4645) 2025-10-03 11:35:48 -07:00
config.md notify: include client in legacy hook payload (#12968) 2026-02-26 22:27:34 -08:00
contributing.md [Codex][CLI] Gate image inputs by model modalities (#10271) 2026-02-02 18:56:39 -08:00
example-config.md Replaced user documentation with links to developers docs site (#8662) 2026-01-02 13:01:53 -07:00
exec.md Replaced user documentation with links to developers docs site (#8662) 2026-01-02 13:01:53 -07:00
execpolicy.md Replaced user documentation with links to developers docs site (#8662) 2026-01-02 13:01:53 -07:00
exit-confirmation-prompt-design.md feat(tui): retire the tui2 experiment (#9640) 2026-01-22 01:02:29 +00:00
getting-started.md Replaced user documentation with links to developers docs site (#8662) 2026-01-02 13:01:53 -07:00
install.md feat: discourage the use of the --all-features flag (#12429) 2026-02-20 23:02:24 -08:00
js_repl.md Log js_repl nested tool responses in rollout history (#12837) 2026-02-26 10:12:28 -08:00
license.md chore: subject docs/*.md to Prettier checks (#4645) 2025-10-03 11:35:48 -07:00
open-source-fund.md chore: subject docs/*.md to Prettier checks (#4645) 2025-10-03 11:35:48 -07:00
prompts.md Replaced user documentation with links to developers docs site (#8662) 2026-01-02 13:01:53 -07:00
sandbox.md Replaced user documentation with links to developers docs site (#8662) 2026-01-02 13:01:53 -07:00
skills.md Point skills docs to developer documentation site (#8407) 2025-12-21 16:18:58 -08:00
slash_commands.md Replaced user documentation with links to developers docs site (#8662) 2026-01-02 13:01:53 -07:00
tui-alternate-screen.md fix: add tui.alternate_screen config and --no-alt-screen CLI flag for Zellij scrollback (#8555) 2026-01-09 18:38:26 +00:00
tui-chat-composer.md tui: preserve kill buffer across submit and slash-command clears (#12006) 2026-03-03 02:06:08 +00:00
tui-request-user-input.md tui: make Esc clear request_user_input notes while notes are shown (#10569) 2026-02-03 16:17:06 -08:00
tui-stream-chunking-review.md feat(tui): pace catch-up stream chunking with hysteresis (#10461) 2026-02-03 15:01:51 -08:00
tui-stream-chunking-tuning.md feat(tui): pace catch-up stream chunking with hysteresis (#10461) 2026-02-03 15:01:51 -08:00
tui-stream-chunking-validation.md feat(core): add configurable log_dir (#10678) 2026-02-05 01:23:30 +00:00