Files
pentestagent/ghostcrew/tools/loader.py
2025-12-07 09:11:26 -07:00

144 lines
3.4 KiB
Python

"""Dynamic tool loader for GhostCrew."""
import importlib
import sys
from pathlib import Path
from typing import List, Optional
from .registry import get_all_tools
def discover_tools(tools_dir: Optional[Path] = None) -> List[str]:
"""
Discover all tool modules in the tools directory.
Args:
tools_dir: Path to tools directory. Defaults to package tools dir.
Returns:
List of discovered tool module names
"""
if tools_dir is None:
tools_dir = Path(__file__).parent
discovered = []
for item in tools_dir.iterdir():
# Skip non-tool items
if item.name.startswith("_"):
continue
if item.name in ("registry.py", "executor.py", "loader.py"):
continue
# Check if it's a tool module
if item.is_dir() and (item / "__init__.py").exists():
discovered.append(item.name)
elif item.suffix == ".py":
discovered.append(item.stem)
return discovered
def load_tool_module(module_name: str, tools_dir: Optional[Path] = None) -> bool:
"""
Load a tool module by name.
Args:
module_name: Name of the tool module to load
tools_dir: Path to tools directory
Returns:
True if loaded successfully, False otherwise
"""
if tools_dir is None:
tools_dir = Path(__file__).parent
try:
# Build the full module path
full_module_name = f"ghostcrew.tools.{module_name}"
# Check if already loaded
if full_module_name in sys.modules:
return True
# Try to import the module
importlib.import_module(full_module_name)
return True
except ImportError as e:
print(f"Warning: Failed to load tool module '{module_name}': {e}")
return False
except Exception as e:
print(f"Warning: Error loading tool module '{module_name}': {e}")
return False
def load_all_tools(tools_dir: Optional[Path] = None) -> List[str]:
"""
Discover and load all tool modules.
Args:
tools_dir: Path to tools directory
Returns:
List of successfully loaded tool module names
"""
discovered = discover_tools(tools_dir)
loaded = []
for module_name in discovered:
if load_tool_module(module_name, tools_dir):
loaded.append(module_name)
return loaded
def get_tool_info() -> List[dict]:
"""
Get information about all registered tools.
Returns:
List of tool info dictionaries
"""
tools = get_all_tools()
return [
{
"name": tool.name,
"description": tool.description,
"category": tool.category,
"enabled": tool.enabled,
"parameters": (
list(tool.schema.properties.keys()) if tool.schema.properties else []
),
}
for tool in tools
]
def reload_tools():
"""Reload all tool modules."""
from .registry import clear_tools
# Clear existing tools
clear_tools()
# Unload tool modules from sys.modules
to_remove = [
name
for name in sys.modules
if name.startswith("ghostcrew.tools.")
and name
not in (
"ghostcrew.tools",
"ghostcrew.tools.registry",
"ghostcrew.tools.executor",
"ghostcrew.tools.loader",
)
]
for name in to_remove:
del sys.modules[name]
# Reload all tools
return load_all_tools()