import { getExecuteCommandDescription } from "./execute-command" import { getReadFileDescription } from "./read-file" import { getWriteToFileDescription } from "./write-to-file" import { getSearchFilesDescription } from "./search-files" import { getListFilesDescription } from "./list-files" import { getListCodeDefinitionNamesDescription } from "./list-code-definition-names" import { getBrowserActionDescription } from "./browser-action" import { getAskFollowupQuestionDescription } from "./ask-followup-question" import { getAttemptCompletionDescription } from "./attempt-completion" import { getUseMcpToolDescription } from "./use-mcp-tool" import { getAccessMcpResourceDescription } from "./access-mcp-resource" import { DiffStrategy } from "../../diff/DiffStrategy" import { McpHub } from "../../../services/mcp/McpHub" import { Mode, ModeConfig, getModeConfig, isToolAllowedForMode } from "../../../shared/modes" import { ToolName, getToolName, getToolOptions, TOOL_GROUPS, ALWAYS_AVAILABLE_TOOLS } from "../../../shared/tool-groups" import { ToolArgs } from "./types" // Map of tool names to their description functions const toolDescriptionMap: Record string | undefined> = { execute_command: (args) => getExecuteCommandDescription(args), read_file: (args) => getReadFileDescription(args), write_to_file: (args) => getWriteToFileDescription(args), search_files: (args) => getSearchFilesDescription(args), list_files: (args) => getListFilesDescription(args), list_code_definition_names: (args) => getListCodeDefinitionNamesDescription(args), browser_action: (args) => getBrowserActionDescription(args), ask_followup_question: () => getAskFollowupQuestionDescription(), attempt_completion: () => getAttemptCompletionDescription(), use_mcp_tool: (args) => getUseMcpToolDescription(args), access_mcp_resource: (args) => getAccessMcpResourceDescription(args), apply_diff: (args) => args.diffStrategy ? args.diffStrategy.getToolDescription({ cwd: args.cwd, toolOptions: args.toolOptions }) : "", } export function getToolDescriptionsForMode( mode: Mode, cwd: string, supportsComputerUse: boolean, diffStrategy?: DiffStrategy, browserViewportSize?: string, mcpHub?: McpHub, customModes?: ModeConfig[], ): string { const config = getModeConfig(mode, customModes) const args: ToolArgs = { cwd, supportsComputerUse, diffStrategy, browserViewportSize, mcpHub, } const tools = new Set() // Add tools from mode's groups config.groups.forEach((group) => { TOOL_GROUPS[group].forEach((tool) => { if (isToolAllowedForMode(tool as ToolName, mode, customModes ?? [])) { tools.add(tool) } }) }) // Add always available tools ALWAYS_AVAILABLE_TOOLS.forEach((tool) => tools.add(tool)) // Map tool descriptions for allowed tools const descriptions = Array.from(tools).map((toolName) => { const descriptionFn = toolDescriptionMap[toolName] if (!descriptionFn) { return undefined } return descriptionFn({ ...args, toolOptions: undefined, // No tool options in group-based approach }) }) return `# Tools\n\n${descriptions.filter(Boolean).join("\n\n")}` } // Export individual description functions for backward compatibility export { getExecuteCommandDescription, getReadFileDescription, getWriteToFileDescription, getSearchFilesDescription, getListFilesDescription, getListCodeDefinitionNamesDescription, getBrowserActionDescription, getAskFollowupQuestionDescription, getAttemptCompletionDescription, getUseMcpToolDescription, getAccessMcpResourceDescription, }