@@ -79,6 +79,7 @@ import { DiffStrategy, getDiffStrategy } from "./diff/DiffStrategy"
7979import { insertGroups } from "./diff/insert-groups"
8080import { telemetryService } from "../services/telemetry/TelemetryService"
8181import { validateToolUse , isToolAllowedForMode , ToolName } from "./mode-validator"
82+ import { parseXml } from "../utils/xml"
8283import { readLines } from "../integrations/misc/read-lines"
8384import { getWorkspacePath } from "../utils/path"
8485
@@ -2324,8 +2325,6 @@ export class Cline extends EventEmitter<ClineEvents> {
23242325 let sourceCodeDef = ""
23252326
23262327 if ( isRangeRead ) {
2327- // Read specific lines (startLine is guaranteed to be defined if isRangeRead is true)
2328- console . log ( "Reading specific lines" , startLine , endLine , startLineStr , endLineStr )
23292328 if ( startLine === undefined ) {
23302329 content = addLineNumbers ( await readLines ( absolutePath , endLine , startLine ) )
23312330 } else {
@@ -2868,6 +2867,7 @@ export class Cline extends EventEmitter<ClineEvents> {
28682867 }
28692868 case "ask_followup_question" : {
28702869 const question : string | undefined = block . params . question
2870+ const follow_up : string | undefined = block . params . follow_up
28712871 try {
28722872 if ( block . partial ) {
28732873 await this . ask ( "followup" , removeClosingTag ( "question" , question ) , block . partial ) . catch (
@@ -2882,8 +2882,52 @@ export class Cline extends EventEmitter<ClineEvents> {
28822882 )
28832883 break
28842884 }
2885+
2886+ if ( ! follow_up ) {
2887+ this . consecutiveMistakeCount ++
2888+ pushToolResult (
2889+ await this . sayAndCreateMissingParamError ( "ask_followup_question" , "follow_up" ) ,
2890+ )
2891+ break
2892+ }
2893+
2894+ let normalizedSuggest = null
2895+
2896+ type Suggest = {
2897+ answer : string
2898+ }
2899+
2900+ let parsedSuggest : {
2901+ suggest : Suggest [ ] | Suggest
2902+ }
2903+
2904+ try {
2905+ parsedSuggest = parseXml ( follow_up , [ "suggest" ] ) as {
2906+ suggest : Suggest [ ] | Suggest
2907+ }
2908+ } catch ( error ) {
2909+ this . consecutiveMistakeCount ++
2910+ await this . say ( "error" , `Failed to parse operations: ${ error . message } ` )
2911+ pushToolResult ( formatResponse . toolError ( "Invalid operations xml format" ) )
2912+ break
2913+ }
2914+
28852915 this . consecutiveMistakeCount = 0
2886- const { text, images } = await this . ask ( "followup" , question , false )
2916+
2917+ normalizedSuggest = Array . isArray ( parsedSuggest ?. suggest )
2918+ ? parsedSuggest . suggest
2919+ : [ parsedSuggest ?. suggest ] . filter ( ( sug ) : sug is Suggest => sug !== undefined )
2920+
2921+ const follow_up_json = {
2922+ question,
2923+ suggest : normalizedSuggest ,
2924+ }
2925+
2926+ const { text, images } = await this . ask (
2927+ "followup" ,
2928+ JSON . stringify ( follow_up_json ) ,
2929+ false ,
2930+ )
28872931 await this . say ( "user_feedback" , text ?? "" , images )
28882932 pushToolResult ( formatResponse . toolResult ( `<answer>\n${ text } \n</answer>` , images ) )
28892933 break
0 commit comments