mirror of
https://github.com/RooVetGit/Roo-Code.git
synced 2026-09-19 00:01:19 +00:00
Added strict validation for the `follow_up` parameter to check for presence and type (Array). Added test cases covering missing, null, and invalid type scenarios. Refactored parameter error handling into a helper method to reduce duplication.
66 lines
2.2 KiB
TypeScript
66 lines
2.2 KiB
TypeScript
import { Task } from "../task/Task"
|
|
import { formatResponse } from "../prompts/responses"
|
|
import type { ToolUse } from "../../shared/tools"
|
|
|
|
import { BaseTool, ToolCallbacks } from "./BaseTool"
|
|
|
|
interface Suggestion {
|
|
text: string
|
|
mode?: string
|
|
}
|
|
|
|
interface AskFollowupQuestionParams {
|
|
question: string
|
|
follow_up: Suggestion[]
|
|
}
|
|
|
|
export class AskFollowupQuestionTool extends BaseTool<"ask_followup_question"> {
|
|
readonly name = "ask_followup_question" as const
|
|
|
|
async execute(params: AskFollowupQuestionParams, task: Task, callbacks: ToolCallbacks): Promise<void> {
|
|
const { question, follow_up } = params
|
|
const { handleError, pushToolResult } = callbacks
|
|
|
|
const recordMissingParamError = async (paramName: string): Promise<void> => {
|
|
task.consecutiveMistakeCount++
|
|
task.recordToolError("ask_followup_question")
|
|
task.didToolFailInCurrentTurn = true
|
|
pushToolResult(await task.sayAndCreateMissingParamError("ask_followup_question", paramName))
|
|
}
|
|
|
|
try {
|
|
if (!question) {
|
|
await recordMissingParamError("question")
|
|
return
|
|
}
|
|
|
|
if (!follow_up || !Array.isArray(follow_up)) {
|
|
await recordMissingParamError("follow_up")
|
|
return
|
|
}
|
|
|
|
// Transform follow_up suggestions to the format expected by task.ask
|
|
const follow_up_json = {
|
|
question,
|
|
suggest: follow_up.map((s) => ({ answer: s.text, mode: s.mode })),
|
|
}
|
|
|
|
task.consecutiveMistakeCount = 0
|
|
const { text, images } = await task.ask("followup", JSON.stringify(follow_up_json), false)
|
|
await task.say("user_feedback", text ?? "", images)
|
|
pushToolResult(formatResponse.toolResult(`<user_message>\n${text}\n</user_message>`, images))
|
|
} catch (error) {
|
|
await handleError("asking question", error as Error)
|
|
}
|
|
}
|
|
|
|
override async handlePartial(task: Task, block: ToolUse<"ask_followup_question">): Promise<void> {
|
|
const question: string | undefined = block.nativeArgs?.question ?? block.params.question
|
|
|
|
// During partial streaming, only show the question to avoid displaying raw JSON
|
|
// The full JSON with suggestions will be sent when the tool call is complete (!block.partial)
|
|
await task.ask("followup", question ?? "", block.partial).catch(() => {})
|
|
}
|
|
}
|
|
|
|
export const askFollowupQuestionTool = new AskFollowupQuestionTool()
|