Newer
Older
navi-1 / navi / tools / reload_tools.py
"""Built-in tool to hot-reload user tools and context providers without restarting."""

from ._internal.base import Tool, ToolContext, ToolResult


class ReloadToolsTool(Tool):
    name = "reload_tools"
    description = (
        "Hot-reload all tools from the tools/ directory, context providers from "
        "context_providers/, and reconnect all configured MCP servers without "
        "restarting the server. Call this after writing or editing a tool, context "
        "provider, or MCP server configuration. Returns a report of what was loaded "
        "and any errors per file or server."
    )
    parameters = {
        "type": "object",
        "properties": {},
        "required": [],
    }

    def __init__(self, registry=None, cp_registry=None, mcp_manager=None) -> None:
        self._registry = registry
        self._cp_registry = cp_registry
        self._mcp_manager = mcp_manager

    async def execute(self, params: dict, ctx: ToolContext | None = None) -> ToolResult:
        if self._registry is None:
            return ToolResult(success=False, output="Tool registry not available.", error="no_registry")

        from navi.core.reload import reload_all

        report = await reload_all(self._registry, self._cp_registry, self._mcp_manager)
        return ToolResult(success=report.ok, output="\n".join(report.lines()))