Newer
Older
navi-1 / navi / core / tool_utils.py
"""Tool list construction shared between Agent and SubAgentRunner."""

from pathlib import Path

from navi.config import settings
from navi.tools._internal.base import Tool

_USER_ENABLED_FILE = Path(settings.tools_dir) / "enabled.json"


def load_user_enabled_tools() -> list[str]:
    try:
        import json
        return json.loads(_USER_ENABLED_FILE.read_text())
    except Exception:
        return []


def build_tool_list(
    enabled: list[str],
    mcp_servers: dict[str, list[str]] | None,
    tool_registry,
    mcp_manager,
) -> list[Tool]:
    """Resolve enabled tool names + MCP groups into concrete Tool objects."""
    names = list(enabled)
    extra = load_user_enabled_tools()
    for name in extra:
        if name not in names:
            names.append(name)

    # Expand MCP server groups into concrete tool names
    from navi.mcp.tools import build_mcp_name

    if mcp_servers and mcp_manager:
        for server_name, groups in mcp_servers.items():
            if "*" in groups:
                prefix = build_mcp_name(server_name, "")
                for tool in tool_registry.all():
                    if tool.name.startswith(prefix) and tool.name not in names:
                        names.append(tool.name)
            else:
                for group_name in groups:
                    for tool_name in mcp_manager.resolve_group(server_name, group_name):
                        full_name = build_mcp_name(server_name, tool_name)
                        if full_name not in names:
                            names.append(full_name)

    result = []
    for name in names:
        try:
            result.append(tool_registry.get(name))
        except Exception:
            pass
    return result