From d80578c415662cc28095a1c0c0c39d44a7cb3852 Mon Sep 17 00:00:00 2001 From: STJ Date: Fri, 13 Mar 2026 19:28:20 -0700 Subject: [PATCH] suppress cdp + add logging --- strix/interface/main.py | 26 ++++++++++++++++++- .../tool_components/browser_renderer.py | 2 -- strix/tools/browser/browser_actions.py | 9 ++++--- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/strix/interface/main.py b/strix/interface/main.py index 7ac6f135..a6b759f5 100644 --- a/strix/interface/main.py +++ b/strix/interface/main.py @@ -46,7 +46,31 @@ from strix.telemetry import posthog # noqa: E402 from strix.telemetry.tracer import get_global_tracer # noqa: E402 -logging.getLogger().setLevel(logging.ERROR) +_log_dir = Path("strix_runs") +_log_dir.mkdir(exist_ok=True) +_file_handler = logging.FileHandler(_log_dir / "strix.log") +_file_handler.setLevel(logging.INFO) +_file_handler.setFormatter(logging.Formatter("%(asctime)s %(name)s %(levelname)s %(message)s")) + +_root = logging.getLogger() +_root.setLevel(logging.INFO) +_root.handlers = [_file_handler] + +# prevent any library from adding StreamHandlers (console) to the root logger +_orig_add_handler = logging.Logger.addHandler + + +def _guarded_add_handler(self: logging.Logger, handler: logging.Handler) -> None: + if ( + self is _root + and isinstance(handler, logging.StreamHandler) + and not isinstance(handler, logging.FileHandler) + ): + return + _orig_add_handler(self, handler) + + +logging.Logger.addHandler = _guarded_add_handler # type: ignore[assignment] def validate_environment() -> None: # noqa: PLR0912, PLR0915 diff --git a/strix/interface/tool_components/browser_renderer.py b/strix/interface/tool_components/browser_renderer.py index a9bc8bf9..05dff5f6 100644 --- a/strix/interface/tool_components/browser_renderer.py +++ b/strix/interface/tool_components/browser_renderer.py @@ -160,10 +160,8 @@ class BrowserRenderer(BaseToolRenderer): @classmethod def _build_launch(cls, status: str, result: Any) -> Text: - mode = result.get("mode", "sandboxed") if isinstance(result, dict) else "sandboxed" text = Text("◈ ", style=cls.LIFE) text.append("launching browser", style=f"bold {cls.LIFE}") - text.append(f" {mode}", style=cls.DIM) text.append_text(cls._status_mark(status)) res = result if isinstance(result, dict) else {} warning = res.get("warning") diff --git a/strix/tools/browser/browser_actions.py b/strix/tools/browser/browser_actions.py index bb845826..f737c9f8 100644 --- a/strix/tools/browser/browser_actions.py +++ b/strix/tools/browser/browser_actions.py @@ -131,10 +131,13 @@ async def _run_browser_agent( ] _bl.propagate = True - async def log_step(step: Any) -> None: - logger.info("Agent step completed: %s", step) + # cdp_use.client spams "unexpected message" warnings from Chromium; suppress + _cdp_client = logging.getLogger("cdp_use.client") + _cdp_client.handlers = [] + _cdp_client.setLevel(logging.ERROR) + _cdp_client.propagate = False - result = await agent.run(on_step_end=log_step) + result = await agent.run() if hasattr(result, "is_successful") and not result.is_successful(): final_result = (