Newer
Older
navi-1 / navi / tools / list_profiles.py
"""Built-in tool: list available agent profiles with structured descriptions."""

from navi.tools._internal.base import Tool, ToolContext, ToolResult


class ListProfilesTool(Tool):
    name = "list_profiles"
    description = (
        "List all available agent profiles with their specialization, use cases, and key tools. "
        "Call this before switch_profile when you need details about what a profile does "
        "or to confirm which profile best fits the current task."
    )
    parameters = {
        "type": "object",
        "properties": {
            "profile_id": {
                "type": "string",
                "description": "Optional. Return full details for one specific profile only.",
            }
        },
        "required": [],
    }

    def __init__(self, profile_registry) -> None:
        self._profiles = profile_registry

    async def execute(self, params: dict, ctx: ToolContext | None = None) -> ToolResult:
        profile_id = (params.get("profile_id") or "").strip()

        if profile_id:
            try:
                p = self._profiles.get(profile_id)
            except Exception:
                available = ", ".join(x.id for x in self._profiles.all())
                return ToolResult(
                    success=False, output="",
                    error=f"Profile '{profile_id}' not found. Available: {available}",
                )
            return ToolResult(success=True, output=self._format(p))

        sections = [self._format(p) for p in self._profiles.all()]
        return ToolResult(success=True, output="\n\n".join(sections))

    @staticmethod
    def _format(p) -> str:
        fd = p.full_description or {}
        tag = " [subagent only]" if getattr(p, "is_subagent_only", False) else ""
        lines = [f"## {p.name}  [{p.id}]{tag}"]
        if p.short_description:
            lines.append(p.short_description)
        if fd.get("specialization"):
            lines.append(f"\nSpecialization: {fd['specialization']}")
        if fd.get("when_to_use"):
            lines.append(f"When to use:    {fd['when_to_use']}")
        if fd.get("key_tools"):
            tools = fd["key_tools"]
            if isinstance(tools, list):
                tools = ", ".join(tools)
            lines.append(f"Key tools:      {tools}")
        return "\n".join(lines)