mirror of
https://github.com/openai/codex.git
synced 2026-04-24 06:35:50 +00:00
Merge branch 'agentydragon-19-bash-command-rendering-improvements' into agentydragon
# Conflicts: # agentydragon/tasks/19-bash-command-rendering-improvements.md
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
+++
|
||||
id = "19"
|
||||
title = "Bash Command Rendering Improvements for Less Verbosity"
|
||||
status = "Not started"
|
||||
dependencies = "" # No prerequisites
|
||||
status = "Done"
|
||||
dependencies = "02,07,09,11,14,29"
|
||||
last_updated = "2025-06-25T01:40:09.600000"
|
||||
+++
|
||||
|
||||
@@ -18,12 +18,23 @@ last_updated = "2025-06-25T01:40:09.600000"
|
||||
- Automated examples or tests verify the new rendering behavior.
|
||||
|
||||
## Implementation
|
||||
This change will touch both the event-processing and rendering layers of the Rust TUI:
|
||||
|
||||
**How it was implemented**
|
||||
- Update the internal shell-command renderer to strip out `bash -lc` wrappers and emit raw commands.
|
||||
- Modify the message formatting component to place role labels and content on one line.
|
||||
- Refactor the result-annotation logic to emit `✅ 12ms` or `exit code: 123 12ms`.
|
||||
- Add or extend tests/examples to cover these formatting rules.
|
||||
- **Event processing** (`codex-rs/exec/src/event_processor.rs`):
|
||||
- Strip any `bash -lc` wrapper when formatting shell commands via `escape_command`.
|
||||
- Replace verbose `BackgroundEvent` logs for sandbox-denied errors and automatic retries with a unified exec-command begin/end sequence.
|
||||
- Annotate completed commands with either a checkmark (✅) and `<duration>ms` for success or `exit code: N <duration>ms` for failures.
|
||||
|
||||
- **TUI rendering** (`codex-rs/tui/src/history_cell.rs`):
|
||||
- Collapse consecutive `BackgroundEvent` entries related to exec failures/retries into the standard active/completed exec-command cells.
|
||||
- Update `new_active_exec_command` and `new_completed_exec_command` to use the new inline format (icon or exit code + duration, with `$ <command>` on the same block).
|
||||
- Ensure role labels and plain-text messages render on a single line separated by a space.
|
||||
|
||||
- **Tests** (`codex-rs/tui/tests/`):
|
||||
- Add or update test fixtures to verify:
|
||||
- Commands appear without any `bash -lc` boilerplate.
|
||||
- Completed commands show the correct checkmark or exit-code annotation with accurate duration formatting.
|
||||
- Background debugging events no longer leak raw debug strings and are correctly collapsed into the exec-command flow.
|
||||
|
||||
## Notes
|
||||
|
||||
|
||||
@@ -174,7 +174,12 @@ impl EventProcessor {
|
||||
ts_println!(self, "{prefix} {message}");
|
||||
}
|
||||
EventMsg::BackgroundEvent(BackgroundEventEvent { message }) => {
|
||||
ts_println!(self, "{}", message.style(self.dimmed));
|
||||
// Collapse verbose sandbox-denied and retry logs into exec flow; skip them here.
|
||||
if message.contains("sandbox denied") || message.contains("retrying") {
|
||||
// drop verbose background messages for exec errors/retries
|
||||
} else {
|
||||
ts_println!(self, "{}", message.style(self.dimmed));
|
||||
}
|
||||
}
|
||||
EventMsg::TaskStarted | EventMsg::TaskComplete(_) => {
|
||||
// Ignore.
|
||||
@@ -470,6 +475,10 @@ impl EventProcessor {
|
||||
}
|
||||
|
||||
fn escape_command(command: &[String]) -> String {
|
||||
// Strip any `bash -lc` wrapper and return the inner command directly.
|
||||
if command.len() == 3 && command[0] == "bash" && command[1] == "-lc" {
|
||||
return command[2].clone();
|
||||
}
|
||||
try_join(command.iter().map(|s| s.as_str())).unwrap_or_else(|_| command.join(" "))
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
use crate::cell_widget::CellWidget;
|
||||
use crate::exec_command::escape_command;
|
||||
use crate::exec_command::strip_bash_lc_and_escape;
|
||||
use crate::markdown::append_markdown;
|
||||
use crate::text_block::TextBlock;
|
||||
use crate::text_formatting::format_and_truncate_tool_result;
|
||||
@@ -224,7 +224,7 @@ impl HistoryCell {
|
||||
}
|
||||
|
||||
pub(crate) fn new_active_exec_command(call_id: String, command: Vec<String>) -> Self {
|
||||
let command_escaped = escape_command(&command);
|
||||
let command_escaped = strip_bash_lc_and_escape(&command);
|
||||
let start = Instant::now();
|
||||
|
||||
let lines: Vec<Line<'static>> = vec![
|
||||
@@ -252,14 +252,16 @@ impl HistoryCell {
|
||||
let mut lines: Vec<Line<'static>> = Vec::new();
|
||||
|
||||
// Title depends on whether we have output yet.
|
||||
// Annotate success or failure: checkmark or exit code plus duration in ms
|
||||
let duration_ms = duration.as_millis();
|
||||
let annotation = if exit_code == 0 {
|
||||
format!("✅ {}ms", duration_ms)
|
||||
} else {
|
||||
format!("exit code: {} {}ms", exit_code, duration_ms)
|
||||
};
|
||||
let title_line = Line::from(vec![
|
||||
"command".magenta(),
|
||||
format!(
|
||||
" (code: {}, duration: {})",
|
||||
exit_code,
|
||||
format_duration(duration)
|
||||
)
|
||||
.dim(),
|
||||
format!(" {annotation}").dim(),
|
||||
]);
|
||||
lines.push(title_line);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user