Skip to content

Commit 471caff

Browse files
authored
Clean up types related to tools (#2719)
1 parent 026091e commit 471caff

38 files changed

+536
-559
lines changed

.changeset/wise-spies-type.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"roo-cline": patch
3+
---
4+
5+
Clean up types related to tools

src/core/Cline.ts

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,14 @@ import getFolderSize from "get-folder-size"
1212
import { serializeError } from "serialize-error"
1313
import * as vscode from "vscode"
1414

15+
// schemas
1516
import { TokenUsage } from "../schemas"
17+
18+
// api
1619
import { ApiHandler, buildApiHandler } from "../api"
1720
import { ApiStream } from "../api/transform/stream"
18-
import { DIFF_VIEW_URI_SCHEME, DiffViewProvider } from "../integrations/editor/DiffViewProvider"
19-
import { CheckpointServiceOptions, RepoPerTaskCheckpointService } from "../services/checkpoints"
20-
import { findToolName, formatContentBlockToMarkdown } from "../integrations/misc/export-markdown"
21-
import { fetchInstructionsTool } from "./tools/fetchInstructionsTool"
22-
import { listFilesTool } from "./tools/listFilesTool"
23-
import { readFileTool } from "./tools/readFileTool"
24-
import { ExitCodeDetails, TerminalProcess } from "../integrations/terminal/TerminalProcess"
25-
import { Terminal } from "../integrations/terminal/Terminal"
26-
import { TerminalRegistry } from "../integrations/terminal/TerminalRegistry"
27-
import { UrlContentFetcher } from "../services/browser/UrlContentFetcher"
28-
import { listFiles } from "../services/glob/list-files"
21+
22+
// shared
2923
import { ApiConfiguration } from "../shared/api"
3024
import { findLastIndex } from "../shared/array"
3125
import { combineApiRequests } from "../shared/combineApiRequests"
@@ -42,26 +36,35 @@ import { getApiMetrics } from "../shared/getApiMetrics"
4236
import { HistoryItem } from "../shared/HistoryItem"
4337
import { ClineAskResponse } from "../shared/WebviewMessage"
4438
import { GlobalFileNames } from "../shared/globalFileNames"
45-
import { defaultModeSlug, getModeBySlug, getFullModeDetails } from "../shared/modes"
39+
import { defaultModeSlug, getModeBySlug, getFullModeDetails, isToolAllowedForMode } from "../shared/modes"
4640
import { EXPERIMENT_IDS, experiments as Experiments, ExperimentId } from "../shared/experiments"
47-
import { calculateApiCostAnthropic } from "../utils/cost"
48-
import { fileExistsAtPath } from "../utils/fs"
49-
import { arePathsEqual } from "../utils/path"
50-
import { parseMentions } from "./mentions"
51-
import { FileContextTracker } from "./context-tracking/FileContextTracker"
52-
import { RooIgnoreController } from "./ignore/RooIgnoreController"
53-
import { AssistantMessageContent, parseAssistantMessage, ToolParamName, ToolUseName } from "./assistant-message"
54-
import { formatResponse } from "./prompts/responses"
55-
import { SYSTEM_PROMPT } from "./prompts/system"
56-
import { truncateConversationIfNeeded } from "./sliding-window"
57-
import { ClineProvider } from "./webview/ClineProvider"
58-
import { BrowserSession } from "../services/browser/BrowserSession"
5941
import { formatLanguage } from "../shared/language"
42+
import { ToolParamName, ToolName, ToolResponse } from "../shared/tools"
43+
44+
// services
45+
import { UrlContentFetcher } from "../services/browser/UrlContentFetcher"
46+
import { listFiles } from "../services/glob/list-files"
47+
import { BrowserSession } from "../services/browser/BrowserSession"
6048
import { McpHub } from "../services/mcp/McpHub"
61-
import { DiffStrategy, getDiffStrategy } from "./diff/DiffStrategy"
6249
import { telemetryService } from "../services/telemetry/TelemetryService"
63-
import { validateToolUse, isToolAllowedForMode, ToolName } from "./mode-validator"
64-
import { getWorkspacePath } from "../utils/path"
50+
import { CheckpointServiceOptions, RepoPerTaskCheckpointService } from "../services/checkpoints"
51+
52+
// integrations
53+
import { DIFF_VIEW_URI_SCHEME, DiffViewProvider } from "../integrations/editor/DiffViewProvider"
54+
import { findToolName, formatContentBlockToMarkdown } from "../integrations/misc/export-markdown"
55+
import { ExitCodeDetails, TerminalProcess } from "../integrations/terminal/TerminalProcess"
56+
import { Terminal } from "../integrations/terminal/Terminal"
57+
import { TerminalRegistry } from "../integrations/terminal/TerminalRegistry"
58+
59+
// utils
60+
import { calculateApiCostAnthropic } from "../utils/cost"
61+
import { fileExistsAtPath } from "../utils/fs"
62+
import { arePathsEqual, getWorkspacePath } from "../utils/path"
63+
64+
// tools
65+
import { fetchInstructionsTool } from "./tools/fetchInstructionsTool"
66+
import { listFilesTool } from "./tools/listFilesTool"
67+
import { readFileTool } from "./tools/readFileTool"
6568
import { writeToFileTool } from "./tools/writeToFileTool"
6669
import { applyDiffTool } from "./tools/applyDiffTool"
6770
import { insertContentTool } from "./tools/insertContentTool"
@@ -78,7 +81,20 @@ import { attemptCompletionTool } from "./tools/attemptCompletionTool"
7881
import { newTaskTool } from "./tools/newTaskTool"
7982
import { appendToFileTool } from "./tools/appendToFileTool"
8083

81-
export type ToolResponse = string | Array<Anthropic.TextBlockParam | Anthropic.ImageBlockParam>
84+
// prompts
85+
import { formatResponse } from "./prompts/responses"
86+
import { SYSTEM_PROMPT } from "./prompts/system"
87+
88+
// ... everything else
89+
import { parseMentions } from "./mentions"
90+
import { FileContextTracker } from "./context-tracking/FileContextTracker"
91+
import { RooIgnoreController } from "./ignore/RooIgnoreController"
92+
import { type AssistantMessageContent, parseAssistantMessage } from "./assistant-message"
93+
import { truncateConversationIfNeeded } from "./sliding-window"
94+
import { ClineProvider } from "./webview/ClineProvider"
95+
import { DiffStrategy, getDiffStrategy } from "./diff/DiffStrategy"
96+
import { validateToolUse } from "./mode-validator"
97+
8298
type UserContent = Array<Anthropic.Messages.ContentBlockParam>
8399

84100
export type ClineEvents = {
@@ -573,7 +589,7 @@ export class Cline extends EventEmitter<ClineEvents> {
573589
}
574590
}
575591

576-
async sayAndCreateMissingParamError(toolName: ToolUseName, paramName: string, relPath?: string) {
592+
async sayAndCreateMissingParamError(toolName: ToolName, paramName: string, relPath?: string) {
577593
await this.say(
578594
"error",
579595
`Roo tried to use ${toolName}${

src/core/__tests__/mode-validator.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { isToolAllowedForMode, getModeConfig, modes, ModeConfig } from "../../shared/modes"
2-
import { TOOL_GROUPS } from "../../shared/tool-groups"
2+
import { TOOL_GROUPS } from "../../shared/tools"
33
import { validateToolUse } from "../mode-validator"
44

55
const [codeMode, architectMode, askMode] = modes.map((mode) => mode.slug)

src/core/__tests__/read-file-maxReadFileLine.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import * as path from "path"
2+
23
import { countFileLines } from "../../integrations/misc/line-counter"
34
import { readLines } from "../../integrations/misc/read-lines"
45
import { extractTextFromFile, addLineNumbers } from "../../integrations/misc/extract-text"
56
import { parseSourceCodeDefinitionsForFile } from "../../services/tree-sitter"
67
import { isBinaryFile } from "isbinaryfile"
7-
import { ReadFileToolUse } from "../assistant-message"
8-
import { Cline } from "../Cline"
8+
import { ReadFileToolUse } from "../../shared/tools"
99

1010
// Mock dependencies
1111
jest.mock("../../integrations/misc/line-counter")

src/core/__tests__/read-file-xml.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import * as path from "path"
2+
23
import { countFileLines } from "../../integrations/misc/line-counter"
34
import { readLines } from "../../integrations/misc/read-lines"
4-
import { extractTextFromFile, addLineNumbers } from "../../integrations/misc/extract-text"
5+
import { extractTextFromFile } from "../../integrations/misc/extract-text"
56
import { parseSourceCodeDefinitionsForFile } from "../../services/tree-sitter"
67
import { isBinaryFile } from "isbinaryfile"
7-
import { ReadFileToolUse } from "../assistant-message"
8-
import { Cline } from "../Cline"
8+
import { ReadFileToolUse } from "../../shared/tools"
99

1010
// Mock dependencies
1111
jest.mock("../../integrations/misc/line-counter")
Lines changed: 1 addition & 156 deletions
Original file line numberDiff line numberDiff line change
@@ -1,156 +1 @@
1-
export type AssistantMessageContent = TextContent | ToolUse
2-
3-
export { parseAssistantMessage } from "./parse-assistant-message"
4-
5-
export interface TextContent {
6-
type: "text"
7-
content: string
8-
partial: boolean
9-
}
10-
11-
export const toolUseNames = [
12-
"execute_command",
13-
"read_file",
14-
"write_to_file",
15-
"append_to_file",
16-
"apply_diff",
17-
"insert_content",
18-
"search_and_replace",
19-
"search_files",
20-
"list_files",
21-
"list_code_definition_names",
22-
"browser_action",
23-
"use_mcp_tool",
24-
"access_mcp_resource",
25-
"ask_followup_question",
26-
"attempt_completion",
27-
"switch_mode",
28-
"new_task",
29-
"fetch_instructions",
30-
] as const
31-
32-
// Converts array of tool call names into a union type ("execute_command" | "read_file" | ...)
33-
export type ToolUseName = (typeof toolUseNames)[number]
34-
35-
export const toolParamNames = [
36-
"command",
37-
"path",
38-
"content",
39-
"line_count",
40-
"regex",
41-
"file_pattern",
42-
"recursive",
43-
"action",
44-
"url",
45-
"coordinate",
46-
"text",
47-
"server_name",
48-
"tool_name",
49-
"arguments",
50-
"uri",
51-
"question",
52-
"result",
53-
"diff",
54-
"start_line",
55-
"end_line",
56-
"mode_slug",
57-
"reason",
58-
"operations",
59-
"mode",
60-
"message",
61-
"cwd",
62-
"follow_up",
63-
"task",
64-
"size",
65-
] as const
66-
67-
export type ToolParamName = (typeof toolParamNames)[number]
68-
69-
export interface ToolUse {
70-
type: "tool_use"
71-
name: ToolUseName
72-
// params is a partial record, allowing only some or none of the possible parameters to be used
73-
params: Partial<Record<ToolParamName, string>>
74-
partial: boolean
75-
}
76-
77-
export interface ExecuteCommandToolUse extends ToolUse {
78-
name: "execute_command"
79-
// Pick<Record<ToolParamName, string>, "command"> makes "command" required, but Partial<> makes it optional
80-
params: Partial<Pick<Record<ToolParamName, string>, "command" | "cwd">>
81-
}
82-
83-
export interface ReadFileToolUse extends ToolUse {
84-
name: "read_file"
85-
params: Partial<Pick<Record<ToolParamName, string>, "path" | "start_line" | "end_line">>
86-
}
87-
88-
export interface FetchInstructionsToolUse extends ToolUse {
89-
name: "fetch_instructions"
90-
params: Partial<Pick<Record<ToolParamName, string>, "task">>
91-
}
92-
93-
export interface WriteToFileToolUse extends ToolUse {
94-
name: "write_to_file"
95-
params: Partial<Pick<Record<ToolParamName, string>, "path" | "content" | "line_count">>
96-
}
97-
98-
export interface AppendToFileToolUse extends ToolUse {
99-
name: "append_to_file"
100-
params: Partial<Pick<Record<ToolParamName, string>, "path" | "content">>
101-
}
102-
103-
export interface InsertCodeBlockToolUse extends ToolUse {
104-
name: "insert_content"
105-
params: Partial<Pick<Record<ToolParamName, string>, "path" | "operations">>
106-
}
107-
108-
export interface SearchFilesToolUse extends ToolUse {
109-
name: "search_files"
110-
params: Partial<Pick<Record<ToolParamName, string>, "path" | "regex" | "file_pattern">>
111-
}
112-
113-
export interface ListFilesToolUse extends ToolUse {
114-
name: "list_files"
115-
params: Partial<Pick<Record<ToolParamName, string>, "path" | "recursive">>
116-
}
117-
118-
export interface ListCodeDefinitionNamesToolUse extends ToolUse {
119-
name: "list_code_definition_names"
120-
params: Partial<Pick<Record<ToolParamName, string>, "path">>
121-
}
122-
123-
export interface BrowserActionToolUse extends ToolUse {
124-
name: "browser_action"
125-
params: Partial<Pick<Record<ToolParamName, string>, "action" | "url" | "coordinate" | "text" | "size">>
126-
}
127-
128-
export interface UseMcpToolToolUse extends ToolUse {
129-
name: "use_mcp_tool"
130-
params: Partial<Pick<Record<ToolParamName, string>, "server_name" | "tool_name" | "arguments">>
131-
}
132-
133-
export interface AccessMcpResourceToolUse extends ToolUse {
134-
name: "access_mcp_resource"
135-
params: Partial<Pick<Record<ToolParamName, string>, "server_name" | "uri">>
136-
}
137-
138-
export interface AskFollowupQuestionToolUse extends ToolUse {
139-
name: "ask_followup_question"
140-
params: Partial<Pick<Record<ToolParamName, string>, "question" | "follow_up">>
141-
}
142-
143-
export interface AttemptCompletionToolUse extends ToolUse {
144-
name: "attempt_completion"
145-
params: Partial<Pick<Record<ToolParamName, string>, "result" | "command">>
146-
}
147-
148-
export interface SwitchModeToolUse extends ToolUse {
149-
name: "switch_mode"
150-
params: Partial<Pick<Record<ToolParamName, string>, "mode_slug" | "reason">>
151-
}
152-
153-
export interface NewTaskToolUse extends ToolUse {
154-
name: "new_task"
155-
params: Partial<Pick<Record<ToolParamName, string>, "mode" | "message">>
156-
}
1+
export { type AssistantMessageContent, parseAssistantMessage } from "./parse-assistant-message"

src/core/assistant-message/parse-assistant-message.ts

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
1-
import {
2-
AssistantMessageContent,
3-
TextContent,
4-
ToolUse,
5-
ToolParamName,
6-
toolParamNames,
7-
toolUseNames,
8-
ToolUseName,
9-
} from "."
1+
import { TextContent, ToolUse, ToolParamName, toolParamNames, toolNames, ToolName } from "../../shared/tools"
2+
3+
export type AssistantMessageContent = TextContent | ToolUse
104

115
export function parseAssistantMessage(assistantMessage: string) {
126
let contentBlocks: AssistantMessageContent[] = []
@@ -84,13 +78,13 @@ export function parseAssistantMessage(assistantMessage: string) {
8478
// no currentToolUse
8579

8680
let didStartToolUse = false
87-
const possibleToolUseOpeningTags = toolUseNames.map((name) => `<${name}>`)
81+
const possibleToolUseOpeningTags = toolNames.map((name) => `<${name}>`)
8882
for (const toolUseOpeningTag of possibleToolUseOpeningTags) {
8983
if (accumulator.endsWith(toolUseOpeningTag)) {
9084
// start of a new tool use
9185
currentToolUse = {
9286
type: "tool_use",
93-
name: toolUseOpeningTag.slice(1, -1) as ToolUseName,
87+
name: toolUseOpeningTag.slice(1, -1) as ToolName,
9488
params: {},
9589
partial: true,
9690
}

src/core/diff/strategies/multi-search-replace.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import { distance } from "fastest-levenshtein"
2+
13
import { DiffStrategy, DiffResult } from "../types"
24
import { addLineNumbers, everyLineHasLineNumbers, stripLineNumbers } from "../../../integrations/misc/extract-text"
3-
import { distance } from "fastest-levenshtein"
45
import { ToolProgressStatus } from "../../../shared/ExtensionMessage"
5-
import { ToolUse } from "../../assistant-message"
6+
import { ToolUse } from "../../../shared/tools"
67
import { normalizeString } from "../../../utils/text-normalization"
78

89
const BUFFER_LINES = 40 // Number of extra context lines to show before and after matches

src/core/diff/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
* Interface for implementing different diff strategies
33
*/
44

5+
import { ToolUse } from "../../shared/tools"
56
import { ToolProgressStatus } from "../../shared/ExtensionMessage"
6-
import { ToolUse } from "../assistant-message"
77

88
export type DiffResult =
99
| { success: true; content: string; failParts?: DiffResult[] }

src/core/mode-validator.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
1+
import { ToolName } from "../shared/tools"
12
import { Mode, isToolAllowedForMode, ModeConfig } from "../shared/modes"
2-
import { ToolName } from "../shared/tool-groups"
3-
4-
export { isToolAllowedForMode }
5-
export type { ToolName }
63

74
export function validateToolUse(
85
toolName: ToolName,

0 commit comments

Comments
 (0)