import importlib import sys from types import ModuleType from typing import Any from strix.config import Config from strix.tools.registry import clear_registry def _empty_config_load(_cls: type[Config]) -> dict[str, dict[str, str]]: return {"env": {}} def _reload_tools_module() -> ModuleType: clear_registry() for name in list(sys.modules): if name == "strix.tools" or name.startswith("strix.tools."): sys.modules.pop(name, None) return importlib.import_module("strix.tools") def test_non_sandbox_skips_browser_and_web_search_when_disabled( monkeypatch: Any, ) -> None: """Browser registration is gated on STRIX_DISABLE_BROWSER and web_search on PERPLEXITY_API_KEY; both should stay out of the in-container ``register_tool`` registry when their gates are off. Agents_graph is no longer in this registry — those tools are SDK function tools (host-side only), not in-container tools. """ monkeypatch.setenv("STRIX_SANDBOX_MODE", "false") monkeypatch.setenv("STRIX_DISABLE_BROWSER", "true") monkeypatch.delenv("PERPLEXITY_API_KEY", raising=False) monkeypatch.setattr(Config, "load", classmethod(_empty_config_load)) tools = _reload_tools_module() names = set(tools.get_tool_names()) assert "browser_action" not in names assert "web_search" not in names def test_sandbox_registers_sandbox_tools_but_not_non_sandbox_tools( monkeypatch: Any, ) -> None: monkeypatch.setenv("STRIX_SANDBOX_MODE", "true") monkeypatch.setenv("STRIX_DISABLE_BROWSER", "true") monkeypatch.delenv("PERPLEXITY_API_KEY", raising=False) monkeypatch.setattr(Config, "load", classmethod(_empty_config_load)) tools = _reload_tools_module() names = set(tools.get_tool_names()) assert "terminal_execute" in names assert "python_action" in names assert "list_requests" in names assert "create_agent" not in names assert "finish_scan" not in names assert "browser_action" not in names assert "web_search" not in names