Skip to content

Commit 9bc2c8b

Browse files
fix: stop running commands from disabling tool uses (#826)
1 parent 3575866 commit 9bc2c8b

File tree

1 file changed

+48
-12
lines changed
  • crates/q_cli/src/cli/chat

1 file changed

+48
-12
lines changed

crates/q_cli/src/cli/chat/mod.rs

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ enum ChatState {
271271
PromptUser {
272272
/// Tool uses to present to the user.
273273
tool_uses: Option<Vec<QueuedTool>>,
274+
skip_printing_tools: bool,
274275
},
275276
/// Handle the user input, depending on if any tools require execution.
276277
HandleInput {
@@ -289,7 +290,10 @@ enum ChatState {
289290

290291
impl Default for ChatState {
291292
fn default() -> Self {
292-
Self::PromptUser { tool_uses: None }
293+
Self::PromptUser {
294+
tool_uses: None,
295+
skip_printing_tools: false,
296+
}
293297
}
294298
}
295299

@@ -304,7 +308,10 @@ where
304308

305309
let mut ctrl_c_stream = signal(SignalKind::interrupt())?;
306310

307-
let mut next_state = Some(ChatState::PromptUser { tool_uses: None });
311+
let mut next_state = Some(ChatState::PromptUser {
312+
tool_uses: None,
313+
skip_printing_tools: true,
314+
});
308315

309316
if let Some(user_input) = self.initial_input.take() {
310317
execute!(
@@ -327,7 +334,10 @@ where
327334
debug!(?chat_state, "changing to state");
328335

329336
let result = match chat_state {
330-
ChatState::PromptUser { tool_uses } => self.prompt_user(tool_uses).await,
337+
ChatState::PromptUser {
338+
tool_uses,
339+
skip_printing_tools,
340+
} => self.prompt_user(tool_uses, skip_printing_tools).await,
331341
ChatState::HandleInput { input, tool_uses } => self.handle_input(input, tool_uses).await,
332342
ChatState::ExecuteTools(tool_uses) => {
333343
let tool_uses_clone = tool_uses.clone();
@@ -424,19 +434,26 @@ where
424434
},
425435
}
426436
self.conversation_state.fix_history();
427-
next_state = Some(ChatState::PromptUser { tool_uses: None });
437+
next_state = Some(ChatState::PromptUser {
438+
tool_uses: None,
439+
skip_printing_tools: false,
440+
});
428441
},
429442
}
430443
}
431444
}
432445

433446
/// Read input from the user.
434-
async fn prompt_user(&mut self, mut tool_uses: Option<Vec<QueuedTool>>) -> Result<ChatState, ChatError> {
447+
async fn prompt_user(
448+
&mut self,
449+
mut tool_uses: Option<Vec<QueuedTool>>,
450+
skip_printing_tools: bool,
451+
) -> Result<ChatState, ChatError> {
435452
if self.interactive {
436453
execute!(self.output, cursor::Show)?;
437454
}
438455
let tool_uses = tool_uses.take().unwrap_or_default();
439-
if !tool_uses.is_empty() {
456+
if !tool_uses.is_empty() && !skip_printing_tools {
440457
self.print_tool_descriptions(&tool_uses)?;
441458

442459
execute!(
@@ -472,7 +489,10 @@ where
472489
tool_uses: Option<Vec<QueuedTool>>,
473490
) -> Result<ChatState, ChatError> {
474491
let Ok(command) = Command::parse(&user_input) else {
475-
return Ok(ChatState::PromptUser { tool_uses });
492+
return Ok(ChatState::PromptUser {
493+
tool_uses,
494+
skip_printing_tools: true,
495+
});
476496
};
477497

478498
let tool_uses = tool_uses.unwrap_or_default();
@@ -509,7 +529,10 @@ where
509529
queue!(self.output, style::Print('\n'))?;
510530
std::process::Command::new("bash").args(["-c", &command]).status().ok();
511531
queue!(self.output, style::Print('\n'))?;
512-
ChatState::PromptUser { tool_uses: None }
532+
ChatState::PromptUser {
533+
tool_uses: None,
534+
skip_printing_tools: false,
535+
}
513536
},
514537
Command::Clear => {
515538
self.conversation_state.clear();
@@ -521,11 +544,17 @@ where
521544
style::SetForegroundColor(Color::Reset)
522545
)?;
523546

524-
ChatState::PromptUser { tool_uses: None }
547+
ChatState::PromptUser {
548+
tool_uses: None,
549+
skip_printing_tools: true,
550+
}
525551
},
526552
Command::Help => {
527553
execute!(self.output, style::Print(HELP_TEXT))?;
528-
ChatState::PromptUser { tool_uses: None }
554+
ChatState::PromptUser {
555+
tool_uses: Some(tool_uses),
556+
skip_printing_tools: true,
557+
}
529558
},
530559
Command::AcceptAll => {
531560
self.accept_all = !self.accept_all;
@@ -541,7 +570,10 @@ where
541570
style::SetForegroundColor(Color::Reset)
542571
)?;
543572

544-
ChatState::PromptUser { tool_uses: None }
573+
ChatState::PromptUser {
574+
tool_uses: Some(tool_uses),
575+
skip_printing_tools: true,
576+
}
545577
},
546578
Command::Quit => ChatState::Exit,
547579
})
@@ -828,7 +860,10 @@ where
828860
if !tool_uses.is_empty() {
829861
Ok(ChatState::ValidateTools(tool_uses))
830862
} else {
831-
Ok(ChatState::PromptUser { tool_uses: None })
863+
Ok(ChatState::PromptUser {
864+
tool_uses: None,
865+
skip_printing_tools: false,
866+
})
832867
}
833868
}
834869

@@ -922,6 +957,7 @@ where
922957
},
923958
false => Ok(ChatState::PromptUser {
924959
tool_uses: Some(queued_tools),
960+
skip_printing_tools: false,
925961
}),
926962
}
927963
}

0 commit comments

Comments
 (0)