45 lines
1.6 KiB
TypeScript
45 lines
1.6 KiB
TypeScript
// 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,
|
|
])
|
|
}
|