@@ -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
290291impl 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