tui: reject unavailable queued slash drafts

Co-authored-by: Codex <noreply@openai.com>
This commit is contained in:
Charles Cunningham
2026-03-15 23:32:51 -07:00
co-authored by Codex
parent efa6715884
commit d8c0839fc2
2 changed files with 13 additions and 22 deletions
+2 -10
View File
@@ -5700,11 +5700,7 @@ impl ChatWidget {
pub(crate) fn handle_serialized_slash_command(&mut self, draft: UserMessage) {
let Some((cmd, _, _)) = self.parse_builtin_slash_command(&draft.text) else {
if let Some((name, _, _)) = parse_slash_name(&draft.text)
&& !name.contains('/')
&& SlashCommand::from_str(name).is_ok()
{
self.queue_user_message(draft);
if self.reject_unavailable_builtin_slash_command(&draft) {
return;
}
self.add_error_message(format!("Failed to handle slash command: {}", draft.text));
@@ -5787,11 +5783,7 @@ impl ChatWidget {
fn execute_serialized_slash_command(&mut self, draft: UserMessage) -> QueueReplayControl {
let preview = draft.text.clone();
let Some((cmd, rest, rest_offset)) = self.parse_builtin_slash_command(&preview) else {
if let Some((name, _, _)) = parse_slash_name(&preview)
&& !name.contains('/')
&& SlashCommand::from_str(name).is_ok()
{
self.submit_user_message(draft);
if self.reject_unavailable_builtin_slash_command(&draft) {
return QueueReplayControl::Stop;
}
self.add_error_message(format!("Failed to replay queued slash command: {preview}"));
+11 -12
View File
@@ -8850,8 +8850,8 @@ async fn disabled_fast_slash_command_with_args_restores_draft_instead_of_queuein
}
#[tokio::test]
async fn queued_disabled_fast_slash_draft_replays_as_user_text() {
let (mut chat, _rx, mut op_rx) = make_chatwidget_manual(Some("gpt-5.3-codex")).await;
async fn queued_disabled_fast_slash_draft_is_rejected_on_replay() {
let (mut chat, mut rx, mut op_rx) = make_chatwidget_manual(Some("gpt-5.3-codex")).await;
chat.thread_id = Some(ThreadId::new());
chat.set_feature_enabled(Feature::FastMode, false);
chat.on_task_started();
@@ -8865,16 +8865,15 @@ async fn queued_disabled_fast_slash_draft_replays_as_user_text() {
chat.on_task_complete(None, false);
match next_submit_op(&mut op_rx) {
Op::UserTurn { items, .. } => assert_eq!(
items,
vec![UserInput::Text {
text: "/fast on".to_string(),
text_elements: Vec::new(),
}]
),
other => panic!("expected queued disabled slash draft Op::UserTurn, got {other:?}"),
}
assert_no_submit_op(&mut op_rx);
assert!(chat.queued_user_messages.is_empty());
assert_eq!(chat.bottom_pane.composer_text(), "/fast on");
let inserted = drain_insert_history(&mut rx);
assert_eq!(inserted.len(), 1);
assert!(
lines_to_single_string(&inserted[0]).contains("/fast is not available in this session.")
);
}
#[tokio::test]