@@ -479,6 +479,7 @@ private void ParseToolUseFromContentItem(JsonElement item, CliOutputEvent output
479479 outputEvent . ItemType = "command_execution" ;
480480
481481 var toolName = GetStringProperty ( item , "name" ) ?? GetStringProperty ( item , "tool" ) ;
482+ var toolUseId = GetStringProperty ( item , "id" ) ;
482483 var contentBuilder = new StringBuilder ( ) ;
483484 if ( ! string . IsNullOrWhiteSpace ( toolName ) )
484485 {
@@ -501,6 +502,18 @@ private void ParseToolUseFromContentItem(JsonElement item, CliOutputEvent output
501502 return ;
502503 }
503504
505+ // Claude Code 的 AskUserQuestion 工具:展示问题让用户选择
506+ if ( ! string . IsNullOrWhiteSpace ( toolName ) &&
507+ string . Equals ( toolName , "AskUserQuestion" , StringComparison . OrdinalIgnoreCase ) )
508+ {
509+ outputEvent . ItemType = "user_question" ;
510+ outputEvent . Title = "请回答问题" ;
511+ outputEvent . Content = FormatAskUserQuestionInput ( inputEl , outputEvent , toolUseId ) ;
512+ outputEvent . CommandExecution = null ;
513+ outputEvent . IsUnknown = false ;
514+ return ;
515+ }
516+
504517 var command = GetStringProperty ( inputEl , "command" ) ;
505518 if ( ! string . IsNullOrWhiteSpace ( command ) )
506519 {
@@ -518,6 +531,91 @@ private void ParseToolUseFromContentItem(JsonElement item, CliOutputEvent output
518531 outputEvent . IsUnknown = false ;
519532 }
520533
534+ private static string FormatAskUserQuestionInput ( JsonElement inputEl , CliOutputEvent outputEvent , string ? toolUseId )
535+ {
536+ outputEvent . UserQuestion = new CliUserQuestion
537+ {
538+ ToolUseId = toolUseId ,
539+ Questions = new List < CliQuestionItem > ( )
540+ } ;
541+ var sb = new StringBuilder ( ) ;
542+
543+ // AskUserQuestion 结构:{ questions: [ { header, question, multiSelect, options: [ { label, description } ] } ] }
544+ if ( inputEl . TryGetProperty ( "questions" , out var questionsEl ) && questionsEl . ValueKind == JsonValueKind . Array )
545+ {
546+ foreach ( var question in questionsEl . EnumerateArray ( ) )
547+ {
548+ if ( question . ValueKind != JsonValueKind . Object )
549+ {
550+ continue ;
551+ }
552+
553+ var questionItem = new CliQuestionItem
554+ {
555+ Header = GetStringProperty ( question , "header" ) ,
556+ Question = GetStringProperty ( question , "question" ) ,
557+ MultiSelect = false ,
558+ Options = new List < CliQuestionOption > ( )
559+ } ;
560+
561+ // 解析 multiSelect
562+ if ( question . TryGetProperty ( "multiSelect" , out var multiSelectEl ) &&
563+ multiSelectEl . ValueKind == JsonValueKind . True )
564+ {
565+ questionItem . MultiSelect = true ;
566+ }
567+
568+ // 解析选项
569+ if ( question . TryGetProperty ( "options" , out var optionsEl ) && optionsEl . ValueKind == JsonValueKind . Array )
570+ {
571+ foreach ( var option in optionsEl . EnumerateArray ( ) )
572+ {
573+ if ( option . ValueKind != JsonValueKind . Object )
574+ {
575+ continue ;
576+ }
577+
578+ questionItem . Options . Add ( new CliQuestionOption
579+ {
580+ Label = GetStringProperty ( option , "label" ) ,
581+ Description = GetStringProperty ( option , "description" )
582+ } ) ;
583+ }
584+ }
585+
586+ outputEvent . UserQuestion . Questions . Add ( questionItem ) ;
587+
588+ // 构建显示文本
589+ if ( ! string . IsNullOrWhiteSpace ( questionItem . Header ) )
590+ {
591+ sb . AppendLine ( $ "**{ questionItem . Header } **") ;
592+ }
593+ if ( ! string . IsNullOrWhiteSpace ( questionItem . Question ) )
594+ {
595+ sb . AppendLine ( questionItem . Question ) ;
596+ }
597+ if ( questionItem . Options . Count > 0 )
598+ {
599+ sb . AppendLine ( ) ;
600+ foreach ( var opt in questionItem . Options )
601+ {
602+ var optText = $ "- { opt . Label } ";
603+ if ( ! string . IsNullOrWhiteSpace ( opt . Description ) )
604+ {
605+ optText += $ ": { opt . Description } ";
606+ }
607+ sb . AppendLine ( optText ) ;
608+ }
609+ }
610+ sb . AppendLine ( ) ;
611+ }
612+
613+ return sb . Length > 0 ? sb . ToString ( ) . TrimEnd ( ) : "请选择一个选项" ;
614+ }
615+
616+ return inputEl . GetRawText ( ) ;
617+ }
618+
521619 private static string FormatTodoToolInput ( JsonElement inputEl , CliOutputEvent outputEvent )
522620 {
523621 outputEvent . TodoItems = new List < CliTodoItem > ( ) ;
0 commit comments