index.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import { getExecuteCommandDescription } from "./execute-command"
  2. import { getReadFileDescription } from "./read-file"
  3. import { getWriteToFileDescription } from "./write-to-file"
  4. import { getSearchFilesDescription } from "./search-files"
  5. import { getListFilesDescription } from "./list-files"
  6. import { getInsertContentDescription } from "./insert-content"
  7. import { getSearchAndReplaceDescription } from "./search-and-replace"
  8. import { getListCodeDefinitionNamesDescription } from "./list-code-definition-names"
  9. import { getBrowserActionDescription } from "./browser-action"
  10. import { getAskFollowupQuestionDescription } from "./ask-followup-question"
  11. import { getAttemptCompletionDescription } from "./attempt-completion"
  12. import { getUseMcpToolDescription } from "./use-mcp-tool"
  13. import { getAccessMcpResourceDescription } from "./access-mcp-resource"
  14. import { getSwitchModeDescription } from "./switch-mode"
  15. import { getNewTaskDescription } from "./new-task"
  16. import { DiffStrategy } from "../../diff/DiffStrategy"
  17. import { McpHub } from "../../../services/mcp/McpHub"
  18. import { Mode, ModeConfig, getModeConfig, isToolAllowedForMode, getGroupName } from "../../../shared/modes"
  19. import { ToolName, TOOL_GROUPS, ALWAYS_AVAILABLE_TOOLS } from "../../../shared/tool-groups"
  20. import { ToolArgs } from "./types"
  21. // Map of tool names to their description functions
  22. const toolDescriptionMap: Record<string, (args: ToolArgs) => string | undefined> = {
  23. execute_command: (args) => getExecuteCommandDescription(args),
  24. read_file: (args) => getReadFileDescription(args),
  25. write_to_file: (args) => getWriteToFileDescription(args),
  26. search_files: (args) => getSearchFilesDescription(args),
  27. list_files: (args) => getListFilesDescription(args),
  28. list_code_definition_names: (args) => getListCodeDefinitionNamesDescription(args),
  29. browser_action: (args) => getBrowserActionDescription(args),
  30. ask_followup_question: () => getAskFollowupQuestionDescription(),
  31. attempt_completion: () => getAttemptCompletionDescription(),
  32. use_mcp_tool: (args) => getUseMcpToolDescription(args),
  33. access_mcp_resource: (args) => getAccessMcpResourceDescription(args),
  34. switch_mode: () => getSwitchModeDescription(),
  35. new_task: (args) => getNewTaskDescription(args),
  36. insert_content: (args) => getInsertContentDescription(args),
  37. search_and_replace: (args) => getSearchAndReplaceDescription(args),
  38. apply_diff: (args) =>
  39. args.diffStrategy ? args.diffStrategy.getToolDescription({ cwd: args.cwd, toolOptions: args.toolOptions }) : "",
  40. }
  41. export function getToolDescriptionsForMode(
  42. mode: Mode,
  43. cwd: string,
  44. supportsComputerUse: boolean,
  45. diffStrategy?: DiffStrategy,
  46. browserViewportSize?: string,
  47. mcpHub?: McpHub,
  48. customModes?: ModeConfig[],
  49. experiments?: Record<string, boolean>,
  50. ): string {
  51. const config = getModeConfig(mode, customModes)
  52. const args: ToolArgs = {
  53. cwd,
  54. supportsComputerUse,
  55. diffStrategy,
  56. browserViewportSize,
  57. mcpHub,
  58. }
  59. const tools = new Set<string>()
  60. // Add tools from mode's groups
  61. config.groups.forEach((groupEntry) => {
  62. const groupName = getGroupName(groupEntry)
  63. const toolGroup = TOOL_GROUPS[groupName]
  64. if (toolGroup) {
  65. toolGroup.tools.forEach((tool) => {
  66. if (isToolAllowedForMode(tool as ToolName, mode, customModes ?? [], experiments ?? {})) {
  67. tools.add(tool)
  68. }
  69. })
  70. }
  71. })
  72. // Add always available tools
  73. ALWAYS_AVAILABLE_TOOLS.forEach((tool) => tools.add(tool))
  74. // Map tool descriptions for allowed tools
  75. const descriptions = Array.from(tools).map((toolName) => {
  76. const descriptionFn = toolDescriptionMap[toolName]
  77. if (!descriptionFn) {
  78. return undefined
  79. }
  80. return descriptionFn({
  81. ...args,
  82. toolOptions: undefined, // No tool options in group-based approach
  83. })
  84. })
  85. return `# Tools\n\n${descriptions.filter(Boolean).join("\n\n")}`
  86. }
  87. // Export individual description functions for backward compatibility
  88. export {
  89. getExecuteCommandDescription,
  90. getReadFileDescription,
  91. getWriteToFileDescription,
  92. getSearchFilesDescription,
  93. getListFilesDescription,
  94. getListCodeDefinitionNamesDescription,
  95. getBrowserActionDescription,
  96. getAskFollowupQuestionDescription,
  97. getAttemptCompletionDescription,
  98. getUseMcpToolDescription,
  99. getAccessMcpResourceDescription,
  100. getSwitchModeDescription,
  101. getInsertContentDescription,
  102. getSearchAndReplaceDescription,
  103. }