Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 4 additions & 10 deletions src/core/assistant-message/presentAssistantMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ import { Task } from "../task/Task"
import { codebaseSearchTool } from "../tools/CodebaseSearchTool"
import { experiments, EXPERIMENT_IDS } from "../../shared/experiments"
import { applyDiffTool as applyDiffToolClass } from "../tools/ApplyDiffTool"
import * as vscode from "vscode"
import { ToolProtocol, isNativeProtocol } from "@roo-code/types"
import { isNativeProtocol } from "@roo-code/types"
import { getToolProtocolFromSettings } from "../../utils/toolProtocol"

/**
* Processes and presents assistant message content to the user interface.
Expand Down Expand Up @@ -279,10 +279,7 @@ export async function presentAssistantMessage(cline: Task) {

const pushToolResult = (content: ToolResponse) => {
// Check if we're using native tool protocol
const toolProtocol = vscode.workspace
.getConfiguration(Package.name)
.get<ToolProtocol>("toolProtocol", "xml")
const isNative = isNativeProtocol(toolProtocol)
const isNative = isNativeProtocol(getToolProtocolFromSettings())

// Get the tool call ID if this is a native tool call
const toolCallId = (block as any).id
Expand Down Expand Up @@ -503,10 +500,7 @@ export async function presentAssistantMessage(cline: Task) {
await checkpointSaveAndMark(cline)

// Check if native protocol is enabled - if so, always use single-file class-based tool
const toolProtocol = vscode.workspace
.getConfiguration(Package.name)
.get<ToolProtocol>("toolProtocol", "xml")
if (isNativeProtocol(toolProtocol)) {
if (isNativeProtocol(getToolProtocolFromSettings())) {
await applyDiffToolClass.handle(cline, block as ToolUse<"apply_diff">, {
askApproval,
handleError,
Expand Down
6 changes: 2 additions & 4 deletions src/core/prompts/responses.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@ import * as path from "path"
import * as diff from "diff"
import { RooIgnoreController, LOCK_TEXT_SYMBOL } from "../ignore/RooIgnoreController"
import { RooProtectedController } from "../protect/RooProtectedController"
import * as vscode from "vscode"
import { ToolProtocol, isNativeProtocol } from "@roo-code/types"
import { Package } from "../../shared/package"
import { getToolProtocolFromSettings } from "../../utils/toolProtocol"

export const formatResponse = {
toolDenied: () => `The user denied this operation.`,
Expand Down Expand Up @@ -250,7 +249,6 @@ Always ensure you provide all required parameters for the tool you wish to use.`
* @returns The tool use instructions reminder text
*/
function getToolInstructionsReminder(protocol?: ToolProtocol): string {
const effectiveProtocol =
protocol ?? vscode.workspace.getConfiguration(Package.name).get<ToolProtocol>("toolProtocol", "xml")
const effectiveProtocol = protocol ?? getToolProtocolFromSettings()
return isNativeProtocol(effectiveProtocol) ? toolUseInstructionsReminderNative : toolUseInstructionsReminder
}
28 changes: 9 additions & 19 deletions src/core/task/Task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,10 @@ import {
MAX_CHECKPOINT_TIMEOUT_SECONDS,
MIN_CHECKPOINT_TIMEOUT_SECONDS,
TOOL_PROTOCOL,
ToolProtocol,
} from "@roo-code/types"
import { TelemetryService } from "@roo-code/telemetry"
import { CloudService, BridgeOrchestrator } from "@roo-code/cloud"
import { getToolProtocolFromSettings } from "../../utils/toolProtocol"

// api
import { ApiHandler, ApiHandlerCreateMessageMetadata, buildApiHandler } from "../../api"
Expand Down Expand Up @@ -408,8 +408,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {

// Initialize the assistant message parser only for XML protocol.
// For native protocol, tool calls come as tool_call chunks, not XML.
const toolProtocol = vscode.workspace.getConfiguration(Package.name).get<ToolProtocol>("toolProtocol", "xml")
this.assistantMessageParser = toolProtocol === "xml" ? new AssistantMessageParser() : undefined
this.assistantMessageParser = getToolProtocolFromSettings() === "xml" ? new AssistantMessageParser() : undefined

this.messageQueueService = new MessageQueueService()

Expand Down Expand Up @@ -2416,16 +2415,14 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
const parsedBlocks = this.assistantMessageParser.getContentBlocks()

// Check if we're using native protocol
const toolProtocol = vscode.workspace
.getConfiguration(Package.name)
.get<ToolProtocol>("toolProtocol", "xml")
const isNative = isNativeProtocol(toolProtocol)
const isNative = isNativeProtocol(getToolProtocolFromSettings())

if (isNative) {
// For native protocol: Preserve tool_use blocks that were added via tool_call chunks
// These are added directly to assistantMessageContent and have an 'id' property
const nativeToolBlocks = this.assistantMessageContent.filter(
(block): block is ToolUse<any> => block.type === "tool_use" && (block as any).id !== undefined,
(block): block is ToolUse<any> =>
block.type === "tool_use" && (block as any).id !== undefined,
)
// Merge: parser blocks (text) + native tool blocks (tools with IDs)
this.assistantMessageContent = [...parsedBlocks, ...nativeToolBlocks]
Expand Down Expand Up @@ -2580,12 +2577,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
// apiConversationHistory at line 1876. Since the assistant failed to respond,
// we need to remove that message before retrying to avoid having two consecutive
// user messages (which would cause tool_result validation errors).
const toolProtocol = vscode.workspace
.getConfiguration(Package.name)
.get<ToolProtocol>("toolProtocol", "xml")
const isNativeProtocol = toolProtocol === TOOL_PROTOCOL.NATIVE

if (isNativeProtocol && this.apiConversationHistory.length > 0) {
if (isNativeProtocol(getToolProtocolFromSettings()) && this.apiConversationHistory.length > 0) {
const lastMessage = this.apiConversationHistory[this.apiConversationHistory.length - 1]
if (lastMessage.role === "user") {
// Remove the last user message that we added earlier
Expand Down Expand Up @@ -2647,7 +2639,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
} else {
// User declined to retry
// For native protocol, re-add the user message we removed
if (isNativeProtocol) {
if (isNativeProtocol(getToolProtocolFromSettings())) {
await this.addToApiConversationHistory({
role: "user",
content: currentUserContent,
Expand Down Expand Up @@ -2770,9 +2762,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
newTaskRequireTodos: vscode.workspace
.getConfiguration(Package.name)
.get<boolean>("newTaskRequireTodos", false),
toolProtocol: vscode.workspace
.getConfiguration(Package.name)
.get<ToolProtocol>("toolProtocol", "xml"),
toolProtocol: getToolProtocolFromSettings(),
},
undefined, // todoList
this.api.getModel().id,
Expand Down Expand Up @@ -2982,7 +2972,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
// Determine if we should include native tools based on:
// 1. Tool protocol is set to NATIVE
// 2. Model supports native tools
const toolProtocol = vscode.workspace.getConfiguration(Package.name).get<ToolProtocol>("toolProtocol", "xml")
const toolProtocol = getToolProtocolFromSettings()
const modelInfo = this.api.getModel().info
const shouldIncludeTools = toolProtocol === TOOL_PROTOCOL.NATIVE && (modelInfo.supportsNativeTools ?? false)

Expand Down
8 changes: 3 additions & 5 deletions src/core/tools/MultiApplyDiffTool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,8 @@ import { parseXmlForDiff } from "../../utils/xml"
import { EXPERIMENT_IDS, experiments } from "../../shared/experiments"
import { applyDiffTool as applyDiffToolClass } from "./ApplyDiffTool"
import { computeDiffStats, sanitizeUnifiedDiff } from "../diff/stats"
import * as vscode from "vscode"
import { ToolProtocol, isNativeProtocol } from "@roo-code/types"
import { Package } from "../../shared/package"
import { isNativeProtocol } from "@roo-code/types"
import { getToolProtocolFromSettings } from "../../utils/toolProtocol"

interface DiffOperation {
path: string
Expand Down Expand Up @@ -63,8 +62,7 @@ export async function applyDiffTool(
removeClosingTag: RemoveClosingTag,
) {
// Check if native protocol is enabled - if so, always use single-file class-based tool
const toolProtocol = vscode.workspace.getConfiguration(Package.name).get<ToolProtocol>("toolProtocol", "xml")
if (isNativeProtocol(toolProtocol)) {
if (isNativeProtocol(getToolProtocolFromSettings())) {
return applyDiffToolClass.handle(cline, block as ToolUse<"apply_diff">, {
askApproval,
handleError,
Expand Down
4 changes: 2 additions & 2 deletions src/core/webview/generateSystemPrompt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import { experiments as experimentsModule, EXPERIMENT_IDS } from "../../shared/e
import { SYSTEM_PROMPT } from "../prompts/system"
import { MultiSearchReplaceDiffStrategy } from "../diff/strategies/multi-search-replace"
import { MultiFileSearchReplaceDiffStrategy } from "../diff/strategies/multi-file-search-replace"
import { ToolProtocol } from "@roo-code/types"
import { Package } from "../../shared/package"
import { getToolProtocolFromSettings } from "../../utils/toolProtocol"

import { ClineProvider } from "./ClineProvider"

Expand Down Expand Up @@ -93,7 +93,7 @@ export const generateSystemPrompt = async (provider: ClineProvider, message: Web
newTaskRequireTodos: vscode.workspace
.getConfiguration(Package.name)
.get<boolean>("newTaskRequireTodos", false),
toolProtocol: vscode.workspace.getConfiguration(Package.name).get<ToolProtocol>("toolProtocol", "xml"),
toolProtocol: getToolProtocolFromSettings(),
},
)

Expand Down
14 changes: 14 additions & 0 deletions src/utils/toolProtocol.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import * as vscode from "vscode"
import { ToolProtocol } from "@roo-code/types"
import { Package } from "../shared/package"

/**
* Get the tool protocol setting from VSCode configuration.
* This centralizes the logic for retrieving the toolProtocol setting,
* ensuring consistent behavior across the codebase.
*
* @returns The configured tool protocol, defaults to "xml" if not set
*/
export function getToolProtocolFromSettings(): ToolProtocol {
return vscode.workspace.getConfiguration(Package.name).get<ToolProtocol>("toolProtocol", "xml")
}
Loading