"""Conservative mapping from Hermes tools to HUX capabilities.""" from __future__ import annotations from dataclasses import dataclass @dataclass(frozen=True) class ToolPolicy: """The HUX gate inputs for one tool family.""" capability: str risk: str external: bool EXACT = { "read_file": ToolPolicy("read_files", "low", False), "read_many_files": ToolPolicy("read_files", "low", False), "list_directory": ToolPolicy("read_files", "low", False), "search_files": ToolPolicy("read_files", "low", False), "session_search": ToolPolicy("read_files", "low", False), "tool_search": ToolPolicy("read_files", "low", False), "write_file": ToolPolicy("write_files", "medium", False), "patch": ToolPolicy("write_files", "medium", False), "memory": ToolPolicy("memory_write", "medium", False), "delegate_task": ToolPolicy("delegate", "high", False), "terminal": ToolPolicy("shell", "high", True), "python": ToolPolicy("shell", "high", True), } PREFIXES = ( (("web_", "browser_", "http_", "mcp_"), ToolPolicy("network", "high", True)), (("send_", "mail_", "email_", "slack_", "discord_", "telegram_"), ToolPolicy("send_message", "high", True)), (("kubectl_", "flux_", "deploy_", "release_"), ToolPolicy("deploy", "high", True)), (("image_", "video_", "vision_"), ToolPolicy("external_side_effect", "high", True)), (("artifact_",), ToolPolicy("artifact_write", "medium", False)), (("memory_",), ToolPolicy("memory_write", "medium", False)), (("delegate_", "subagent_"), ToolPolicy("delegate", "high", False)), (("write_", "edit_", "file_"), ToolPolicy("write_files", "medium", False)), ) UNKNOWN = ToolPolicy("external_side_effect", "high", True) def classify(tool_name: str) -> ToolPolicy: """Return a known mapping, treating every unknown tool as high-risk external.""" name = tool_name.strip().lower() if isinstance(tool_name, str) else "" if name in EXACT: return EXACT[name] for prefixes, policy in PREFIXES: if name.startswith(prefixes): return policy return UNKNOWN