Skip to content

Commit 01c998b

Browse files
committed
refactor: centralize toolProtocol configuration checks
- Created src/utils/toolProtocol.ts with getToolProtocolFromSettings() utility - Replaced all direct vscode.workspace.getConfiguration() calls with centralized utility - Updated 6 files to use the new utility function - All tests pass and TypeScript compilation succeeds
1 parent b2f204f commit 01c998b

File tree

6 files changed

+33
-37
lines changed

6 files changed

+33
-37
lines changed

src/core/assistant-message/presentAssistantMessage.ts

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ import { Task } from "../task/Task"
3838
import { codebaseSearchTool } from "../tools/CodebaseSearchTool"
3939
import { experiments, EXPERIMENT_IDS } from "../../shared/experiments"
4040
import { applyDiffTool as applyDiffToolClass } from "../tools/ApplyDiffTool"
41-
import * as vscode from "vscode"
42-
import { ToolProtocol, isNativeProtocol } from "@roo-code/types"
41+
import { isNativeProtocol } from "@roo-code/types"
42+
import { getToolProtocolFromSettings } from "../../utils/toolProtocol"
4343

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

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

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

505502
// Check if native protocol is enabled - if so, always use single-file class-based tool
506-
const toolProtocol = vscode.workspace
507-
.getConfiguration(Package.name)
508-
.get<ToolProtocol>("toolProtocol", "xml")
509-
if (isNativeProtocol(toolProtocol)) {
503+
if (isNativeProtocol(getToolProtocolFromSettings())) {
510504
await applyDiffToolClass.handle(cline, block as ToolUse<"apply_diff">, {
511505
askApproval,
512506
handleError,

src/core/prompts/responses.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@ import * as path from "path"
33
import * as diff from "diff"
44
import { RooIgnoreController, LOCK_TEXT_SYMBOL } from "../ignore/RooIgnoreController"
55
import { RooProtectedController } from "../protect/RooProtectedController"
6-
import * as vscode from "vscode"
76
import { ToolProtocol, isNativeProtocol } from "@roo-code/types"
8-
import { Package } from "../../shared/package"
7+
import { getToolProtocolFromSettings } from "../../utils/toolProtocol"
98

109
export const formatResponse = {
1110
toolDenied: () => `The user denied this operation.`,
@@ -250,7 +249,6 @@ Always ensure you provide all required parameters for the tool you wish to use.`
250249
* @returns The tool use instructions reminder text
251250
*/
252251
function getToolInstructionsReminder(protocol?: ToolProtocol): string {
253-
const effectiveProtocol =
254-
protocol ?? vscode.workspace.getConfiguration(Package.name).get<ToolProtocol>("toolProtocol", "xml")
252+
const effectiveProtocol = protocol ?? getToolProtocolFromSettings()
255253
return isNativeProtocol(effectiveProtocol) ? toolUseInstructionsReminderNative : toolUseInstructionsReminder
256254
}

src/core/task/Task.ts

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ import {
4242
MAX_CHECKPOINT_TIMEOUT_SECONDS,
4343
MIN_CHECKPOINT_TIMEOUT_SECONDS,
4444
TOOL_PROTOCOL,
45-
ToolProtocol,
4645
} from "@roo-code/types"
4746
import { TelemetryService } from "@roo-code/telemetry"
4847
import { CloudService, BridgeOrchestrator } from "@roo-code/cloud"
48+
import { getToolProtocolFromSettings } from "../../utils/toolProtocol"
4949

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

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

414413
this.messageQueueService = new MessageQueueService()
415414

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

24182417
// Check if we're using native protocol
2419-
const toolProtocol = vscode.workspace
2420-
.getConfiguration(Package.name)
2421-
.get<ToolProtocol>("toolProtocol", "xml")
2422-
const isNative = isNativeProtocol(toolProtocol)
2418+
const isNative = isNativeProtocol(getToolProtocolFromSettings())
24232419

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

25882582
if (isNativeProtocol && this.apiConversationHistory.length > 0) {
25892583
const lastMessage = this.apiConversationHistory[this.apiConversationHistory.length - 1]
@@ -2770,9 +2764,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
27702764
newTaskRequireTodos: vscode.workspace
27712765
.getConfiguration(Package.name)
27722766
.get<boolean>("newTaskRequireTodos", false),
2773-
toolProtocol: vscode.workspace
2774-
.getConfiguration(Package.name)
2775-
.get<ToolProtocol>("toolProtocol", "xml"),
2767+
toolProtocol: getToolProtocolFromSettings(),
27762768
},
27772769
undefined, // todoList
27782770
this.api.getModel().id,
@@ -2982,7 +2974,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
29822974
// Determine if we should include native tools based on:
29832975
// 1. Tool protocol is set to NATIVE
29842976
// 2. Model supports native tools
2985-
const toolProtocol = vscode.workspace.getConfiguration(Package.name).get<ToolProtocol>("toolProtocol", "xml")
2977+
const toolProtocol = getToolProtocolFromSettings()
29862978
const modelInfo = this.api.getModel().info
29872979
const shouldIncludeTools = toolProtocol === TOOL_PROTOCOL.NATIVE && (modelInfo.supportsNativeTools ?? false)
29882980

src/core/tools/MultiApplyDiffTool.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@ import { parseXmlForDiff } from "../../utils/xml"
1616
import { EXPERIMENT_IDS, experiments } from "../../shared/experiments"
1717
import { applyDiffTool as applyDiffToolClass } from "./ApplyDiffTool"
1818
import { computeDiffStats, sanitizeUnifiedDiff } from "../diff/stats"
19-
import * as vscode from "vscode"
20-
import { ToolProtocol, isNativeProtocol } from "@roo-code/types"
21-
import { Package } from "../../shared/package"
19+
import { isNativeProtocol } from "@roo-code/types"
20+
import { getToolProtocolFromSettings } from "../../utils/toolProtocol"
2221

2322
interface DiffOperation {
2423
path: string
@@ -63,8 +62,7 @@ export async function applyDiffTool(
6362
removeClosingTag: RemoveClosingTag,
6463
) {
6564
// Check if native protocol is enabled - if so, always use single-file class-based tool
66-
const toolProtocol = vscode.workspace.getConfiguration(Package.name).get<ToolProtocol>("toolProtocol", "xml")
67-
if (isNativeProtocol(toolProtocol)) {
65+
if (isNativeProtocol(getToolProtocolFromSettings())) {
6866
return applyDiffToolClass.handle(cline, block as ToolUse<"apply_diff">, {
6967
askApproval,
7068
handleError,

src/core/webview/generateSystemPrompt.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import { experiments as experimentsModule, EXPERIMENT_IDS } from "../../shared/e
77
import { SYSTEM_PROMPT } from "../prompts/system"
88
import { MultiSearchReplaceDiffStrategy } from "../diff/strategies/multi-search-replace"
99
import { MultiFileSearchReplaceDiffStrategy } from "../diff/strategies/multi-file-search-replace"
10-
import { ToolProtocol } from "@roo-code/types"
1110
import { Package } from "../../shared/package"
11+
import { getToolProtocolFromSettings } from "../../utils/toolProtocol"
1212

1313
import { ClineProvider } from "./ClineProvider"
1414

@@ -93,7 +93,7 @@ export const generateSystemPrompt = async (provider: ClineProvider, message: Web
9393
newTaskRequireTodos: vscode.workspace
9494
.getConfiguration(Package.name)
9595
.get<boolean>("newTaskRequireTodos", false),
96-
toolProtocol: vscode.workspace.getConfiguration(Package.name).get<ToolProtocol>("toolProtocol", "xml"),
96+
toolProtocol: getToolProtocolFromSettings(),
9797
},
9898
)
9999

src/utils/toolProtocol.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import * as vscode from "vscode"
2+
import { ToolProtocol } from "@roo-code/types"
3+
import { Package } from "../shared/package"
4+
5+
/**
6+
* Get the tool protocol setting from VSCode configuration.
7+
* This centralizes the logic for retrieving the toolProtocol setting,
8+
* ensuring consistent behavior across the codebase.
9+
*
10+
* @returns The configured tool protocol, defaults to "xml" if not set
11+
*/
12+
export function getToolProtocolFromSettings(): ToolProtocol {
13+
return vscode.workspace.getConfiguration(Package.name).get<ToolProtocol>("toolProtocol", "xml")
14+
}

0 commit comments

Comments
 (0)