Skip to content

Commit f1efeca

Browse files
samhvw8mrubens
andauthored
feat follow up suggest (#1783)
* feat follow up suggest * Cleanup --------- Co-authored-by: Matt Rubens <[email protected]>
1 parent 38d8a3d commit f1efeca

File tree

11 files changed

+413
-25
lines changed

11 files changed

+413
-25
lines changed

package-lock.json

Lines changed: 27 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,7 @@
362362
"diff": "^5.2.0",
363363
"diff-match-patch": "^1.0.5",
364364
"fast-deep-equal": "^3.1.3",
365+
"fast-xml-parser": "^4.5.1",
365366
"fastest-levenshtein": "^1.0.16",
366367
"fzf": "^0.5.2",
367368
"get-folder-size": "^5.0.0",

src/core/Cline.ts

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ import { DiffStrategy, getDiffStrategy } from "./diff/DiffStrategy"
7979
import { insertGroups } from "./diff/insert-groups"
8080
import { telemetryService } from "../services/telemetry/TelemetryService"
8181
import { validateToolUse, isToolAllowedForMode, ToolName } from "./mode-validator"
82+
import { parseXml } from "../utils/xml"
8283
import { readLines } from "../integrations/misc/read-lines"
8384
import { 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

src/core/assistant-message/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export const toolParamNames = [
5757
"mode",
5858
"message",
5959
"cwd",
60+
"follow_up",
6061
] as const
6162

6263
export type ToolParamName = (typeof toolParamNames)[number]
@@ -122,7 +123,7 @@ export interface AccessMcpResourceToolUse extends ToolUse {
122123

123124
export interface AskFollowupQuestionToolUse extends ToolUse {
124125
name: "ask_followup_question"
125-
params: Partial<Pick<Record<ToolParamName, string>, "question">>
126+
params: Partial<Pick<Record<ToolParamName, string>, "question" | "follow_up">>
126127
}
127128

128129
export interface AttemptCompletionToolUse extends ToolUse {

0 commit comments

Comments
 (0)