import type { Tool } from '../../Tool.js' import { AgentTool } from '../AgentTool/AgentTool.js' import { BashTool } from '../BashTool/BashTool.js' import { FileEditTool } from '../FileEditTool/FileEditTool.js' import { FileReadTool } from '../FileReadTool/FileReadTool.js' import { FileWriteTool } from '../FileWriteTool/FileWriteTool.js' import { GlobTool } from '../GlobTool/GlobTool.js' import { GrepTool } from '../GrepTool/GrepTool.js' import { NotebookEditTool } from '../NotebookEditTool/NotebookEditTool.js' let _primitiveTools: readonly Tool[] | undefined /** * Primitive tools hidden from direct model use when REPL mode is on * (REPL_ONLY_TOOLS) but still accessible inside the REPL VM context. * Exported so display-side code (collapseReadSearch, renderers) can * classify/render virtual messages for these tools even when they're * absent from the filtered execution tools list. * * Lazy getter — the import chain collapseReadSearch.ts → primitiveTools.ts * → FileReadTool.tsx → ... loops back through the tool registry, so a * top-level const hits "Cannot access before initialization". Deferring * to call time avoids the TDZ. * * Referenced directly rather than via getAllBaseTools() because that * excludes Glob/Grep when hasEmbeddedSearchTools() is true. */ export function getReplPrimitiveTools(): readonly Tool[] { return (_primitiveTools ??= [ FileReadTool, FileWriteTool, FileEditTool, GlobTool, GrepTool, BashTool, NotebookEditTool, AgentTool, ]) }