import { type BashPermissionToolInput, type EditPermissionToolInput, type FindPermissionToolInput, type GrepPermissionToolInput, isBashToolInput, isEditToolInput, isFindToolInput, isGrepToolInput, isLsToolInput, isReadToolInput, isWriteToolInput, type LsPermissionToolInput, type PermissionToolInput, type ReadPermissionToolInput, type WritePermissionToolInput, } from "./tool-input.js"; export type ToolMatchResult = T | Promise; export interface ToolMatchHandlers { bash?: (tool: BashPermissionToolInput) => ToolMatchResult; read?: (tool: ReadPermissionToolInput) => ToolMatchResult; edit?: (tool: EditPermissionToolInput) => ToolMatchResult; write?: (tool: WritePermissionToolInput) => ToolMatchResult; grep?: (tool: GrepPermissionToolInput) => ToolMatchResult; find?: (tool: FindPermissionToolInput) => ToolMatchResult; ls?: (tool: LsPermissionToolInput) => ToolMatchResult; custom?: Record ToolMatchResult>; default?: (tool: PermissionToolInput) => ToolMatchResult; } export function matchTool( tool: PermissionToolInput, handlers: ToolMatchHandlers, ): ToolMatchResult { if (isBashToolInput(tool)) return handlers.bash?.(tool) ?? handlers.default?.(tool); if (isReadToolInput(tool)) return handlers.read?.(tool) ?? handlers.default?.(tool); if (isEditToolInput(tool)) return handlers.edit?.(tool) ?? handlers.default?.(tool); if (isWriteToolInput(tool)) return handlers.write?.(tool) ?? handlers.default?.(tool); if (isGrepToolInput(tool)) return handlers.grep?.(tool) ?? handlers.default?.(tool); if (isFindToolInput(tool)) return handlers.find?.(tool) ?? handlers.default?.(tool); if (isLsToolInput(tool)) return handlers.ls?.(tool) ?? handlers.default?.(tool); return handlers.custom?.[tool.toolName]?.(tool) ?? handlers.default?.(tool); }