feat: allow esc to interrupt session (#2054)

## Summary
- allow Esc to interrupt the current session when a task is running
- document Esc as an interrupt key in status indicator

## Testing
- `just fmt`
- `just fix` *(fails: E0658 `let` expressions in this position are
unstable)*
- `cargo test --all-features` *(fails: E0658 `let` expressions in this
position are unstable)*

------
https://chatgpt.com/codex/tasks/task_i_689698cf605883208f57b0317ff6a303
This commit is contained in:
pakrym-oai
2025-08-08 18:59:54 -07:00
committed by GitHub
parent 4a916ba914
commit 329f01b728
3 changed files with 24 additions and 2 deletions

View File

@@ -236,6 +236,20 @@ impl App<'_> {
self.app_event_tx.send(AppEvent::ExitRequest);
}
},
KeyEvent {
code: KeyCode::Esc,
kind: KeyEventKind::Press,
..
} => match &mut self.app_state {
AppState::Chat { widget } => {
if !widget.on_esc() {
self.dispatch_key_event(key_event);
}
}
AppState::Onboarding { .. } => {
self.dispatch_key_event(key_event);
}
},
KeyEvent {
code: KeyCode::Char('z'),
modifiers: crossterm::event::KeyModifiers::CONTROL,

View File

@@ -571,6 +571,14 @@ impl ChatWidget<'_> {
self.bottom_pane.on_file_search_result(query, matches);
}
pub(crate) fn on_esc(&mut self) -> bool {
if self.bottom_pane.is_task_running() {
self.interrupt_running_task();
return true;
}
false
}
/// Handle Ctrl-C key press.
/// Returns CancellationEvent::Handled if the event was consumed by the UI, or
/// CancellationEvent::Ignored if the caller should handle it (e.g. exit).

View File

@@ -231,14 +231,14 @@ impl WidgetRef for StatusIndicatorWidget {
spans.extend(animated_spans);
// Space between header and bracket block
spans.push(Span::raw(" "));
// Non-animated, dim bracket content, with only "Ctrl c" bold
// Non-animated, dim bracket content, with keys bold
let bracket_prefix = format!("({elapsed}s • ");
spans.push(Span::styled(
bracket_prefix,
Style::default().fg(Color::Gray).add_modifier(Modifier::DIM),
));
spans.push(Span::styled(
"Ctrl C",
"Esc",
Style::default()
.fg(Color::Gray)
.add_modifier(Modifier::DIM | Modifier::BOLD),