| // biome-ignore-all assist/source/organizeImports: ANT-ONLY import markers must not be reordered | |
| import { useMemo } from 'react' | |
| import type { Tools, ToolPermissionContext } from '../Tool.js' | |
| import { assembleToolPool } from '../tools.js' | |
| import { useAppState } from '../state/AppState.js' | |
| import { mergeAndFilterTools } from '../utils/toolPool.js' | |
| /** | |
| * React hook that assembles the full tool pool for the REPL. | |
| * | |
| * Uses assembleToolPool() (the shared pure function used by both REPL and runAgent) | |
| * to combine built-in tools with MCP tools, applying deny rules and deduplication. | |
| * Any extra initialTools are merged on top. | |
| * | |
| * @param initialTools - Extra tools to include (built-in + startup MCP from props). | |
| * These are merged with the assembled pool and take precedence in deduplication. | |
| * @param mcpTools - MCP tools discovered dynamically (from mcp state) | |
| * @param toolPermissionContext - Permission context for filtering | |
| */ | |
| export function useMergedTools( | |
| initialTools: Tools, | |
| mcpTools: Tools, | |
| toolPermissionContext: ToolPermissionContext, | |
| ): Tools { | |
| let replBridgeEnabled = false | |
| let replBridgeOutboundOnly = false | |
| return useMemo(() => { | |
| // assembleToolPool is the shared function that both REPL and runAgent use. | |
| // It handles: getTools() + MCP deny-rule filtering + dedup + MCP CLI exclusion. | |
| const assembled = assembleToolPool(toolPermissionContext, mcpTools) | |
| return mergeAndFilterTools( | |
| initialTools, | |
| assembled, | |
| toolPermissionContext.mode, | |
| ) | |
| }, [ | |
| initialTools, | |
| mcpTools, | |
| toolPermissionContext, | |
| replBridgeEnabled, | |
| replBridgeOutboundOnly, | |
| ]) | |
| } | |