/ src / tools.ts
tools.ts
 1  import { Tool } from './Tool.js'
 2  import { AgentTool } from './tools/AgentTool/AgentTool.js'
 3  import { ArchitectTool } from './tools/ArchitectTool/ArchitectTool.js'
 4  import { BashTool } from './tools/BashTool/BashTool.js'
 5  import { FileEditTool } from './tools/FileEditTool/FileEditTool.js'
 6  import { FileReadTool } from './tools/FileReadTool/FileReadTool.js'
 7  import { FileWriteTool } from './tools/FileWriteTool/FileWriteTool.js'
 8  import { GlobTool } from './tools/GlobTool/GlobTool.js'
 9  import { GrepTool } from './tools/GrepTool/GrepTool.js'
10  import { LSTool } from './tools/lsTool/lsTool.js'
11  import { MemoryReadTool } from './tools/MemoryReadTool/MemoryReadTool.js'
12  import { MemoryWriteTool } from './tools/MemoryWriteTool/MemoryWriteTool.js'
13  import { NotebookEditTool } from './tools/NotebookEditTool/NotebookEditTool.js'
14  import { NotebookReadTool } from './tools/NotebookReadTool/NotebookReadTool.js'
15  import { StickerRequestTool } from './tools/StickerRequestTool/StickerRequestTool.js'
16  import { ThinkTool } from './tools/ThinkTool/ThinkTool.js'
17  import { getMCPTools } from './services/mcpClient.js'
18  import { memoize } from 'lodash-es'
19  
20  const ANT_ONLY_TOOLS = [MemoryReadTool, MemoryWriteTool]
21  
22  // Function to avoid circular dependencies that break bun
23  export const getAllTools = (): Tool[] => {
24    return [
25      AgentTool,
26      BashTool,
27      GlobTool,
28      GrepTool,
29      LSTool,
30      FileReadTool,
31      FileEditTool,
32      FileWriteTool,
33      NotebookReadTool,
34      NotebookEditTool,
35      StickerRequestTool,
36      ThinkTool,
37      ...(process.env.USER_TYPE === 'ant' ? ANT_ONLY_TOOLS : []),
38    ]
39  }
40  
41  export const getTools = memoize(
42    async (enableArchitect?: boolean): Promise<Tool[]> => {
43      const tools = [...getAllTools(), ...(await getMCPTools())]
44  
45      // Only include Architect tool if enabled via config or CLI flag
46      if (enableArchitect) {
47        tools.push(ArchitectTool)
48      }
49  
50      const isEnabled = await Promise.all(tools.map(tool => tool.isEnabled()))
51      return tools.filter((_, i) => isEnabled[i])
52    },
53  )
54  
55  export const getReadOnlyTools = memoize(async (): Promise<Tool[]> => {
56    const tools = getAllTools().filter(tool => tool.isReadOnly())
57    const isEnabled = await Promise.all(tools.map(tool => tool.isEnabled()))
58    return tools.filter((_, index) => isEnabled[index])
59  })