diff --git a/agent/display.py b/agent/display.py index 120cfd12a2..4bf4f466e4 100644 --- a/agent/display.py +++ b/agent/display.py @@ -5,6 +5,7 @@ Used by AIAgent._execute_tool_calls for CLI feedback. """ import json +import logging import os import random import sys @@ -15,6 +16,8 @@ import time _RED = "\033[31m" _RESET = "\033[0m" +logger = logging.getLogger(__name__) + # ========================================================================= # Skin-aware helpers (lazy import to avoid circular deps) @@ -363,7 +366,7 @@ def _detect_tool_failure(tool_name: str, result: str | None) -> tuple[bool, str] if exit_code is not None and exit_code != 0: return True, f" [exit {exit_code}]" except (json.JSONDecodeError, TypeError, AttributeError): - pass + logger.debug("Could not parse terminal result as JSON for exit code check") return False, "" # Memory-specific: distinguish "full" from real errors @@ -373,7 +376,7 @@ def _detect_tool_failure(tool_name: str, result: str | None) -> tuple[bool, str] if data.get("success") is False and "exceed the limit" in data.get("error", ""): return True, " [full]" except (json.JSONDecodeError, TypeError, AttributeError): - pass + logger.debug("Could not parse memory result as JSON for capacity check") # Generic heuristic for non-terminal tools lower = result[:500].lower() diff --git a/agent/prompt_builder.py b/agent/prompt_builder.py index 0582d63d36..d1370a524f 100644 --- a/agent/prompt_builder.py +++ b/agent/prompt_builder.py @@ -159,8 +159,8 @@ def _read_skill_description(skill_file: Path, max_chars: int = 60) -> str: if len(desc) > max_chars: desc = desc[:max_chars - 3] + "..." return desc - except Exception: - pass + except Exception as e: + logger.debug("Failed to read skill description from %s: %s", skill_file, e) return "" diff --git a/tools/browser_tool.py b/tools/browser_tool.py index 480093eaa5..98a80d78b2 100644 --- a/tools/browser_tool.py +++ b/tools/browser_tool.py @@ -1613,12 +1613,12 @@ def _cleanup_old_screenshots(screenshots_dir, max_age_hours=24): cutoff = time.time() - (max_age_hours * 3600) for f in screenshots_dir.glob("browser_screenshot_*.png"): try: - if f.stat().st_mtime < cutoff: - f.unlink() - except Exception: - pass - except Exception: - pass # Non-critical — don't fail the screenshot operation + if f.stat().st_mtime < cutoff: + f.unlink() + except Exception as e: + logger.debug("Failed to clean old screenshot %s: %s", f, e) + except Exception as e: + logger.debug("Screenshot cleanup error (non-critical): %s", e) def _cleanup_old_recordings(max_age_hours=72): @@ -1632,12 +1632,12 @@ def _cleanup_old_recordings(max_age_hours=72): cutoff = time.time() - (max_age_hours * 3600) for f in recordings_dir.glob("session_*.webm"): try: - if f.stat().st_mtime < cutoff: - f.unlink() - except Exception: - pass - except Exception: - pass + if f.stat().st_mtime < cutoff: + f.unlink() + except Exception as e: + logger.debug("Failed to clean old recording %s: %s", f, e) + except Exception as e: + logger.debug("Recording cleanup error (non-critical): %s", e) # ============================================================================ @@ -1749,7 +1749,7 @@ def cleanup_browser(task_id: Optional[str] = None) -> None: os.kill(daemon_pid, signal.SIGTERM) logger.debug("Killed daemon pid %s for %s", daemon_pid, session_name) except (ProcessLookupError, ValueError, PermissionError, OSError): - pass + logger.debug("Could not kill daemon pid for %s (already dead or inaccessible)", session_name) shutil.rmtree(socket_dir, ignore_errors=True) logger.debug("Removed task %s from active sessions", task_id) diff --git a/tools/code_execution_tool.py b/tools/code_execution_tool.py index 63ac7dec21..b5278b5099 100644 --- a/tools/code_execution_tool.py +++ b/tools/code_execution_tool.py @@ -332,10 +332,10 @@ def _rpc_server_loop( pass finally: if conn: - try: - conn.close() - except OSError: - pass + try: + conn.close() + except OSError as e: + logger.debug("RPC conn close error: %s", e) # --------------------------------------------------------------------------- @@ -547,10 +547,10 @@ def execute_code( finally: # Cleanup temp dir and socket - try: - server_sock.close() - except Exception: - pass + try: + server_sock.close() + except Exception as e: + logger.debug("Server socket close error: %s", e) try: import shutil shutil.rmtree(tmpdir, ignore_errors=True) diff --git a/tools/terminal_tool.py b/tools/terminal_tool.py index 5791bf33e0..29a05e3e5d 100644 --- a/tools/terminal_tool.py +++ b/tools/terminal_tool.py @@ -82,10 +82,10 @@ def _check_disk_usage_warning(): for path in glob.glob(str(scratch_dir / "hermes-*")): for f in Path(path).rglob('*'): if f.is_file(): - try: - total_bytes += f.stat().st_size - except OSError: - pass + try: + total_bytes += f.stat().st_size + except OSError as e: + logger.debug("Could not stat file %s: %s", f, e) total_gb = total_bytes / (1024 ** 3) @@ -228,16 +228,16 @@ def _prompt_for_sudo_password(timeout_seconds: int = 45) -> str: result["password"] = "" finally: if tty_fd is not None and old_attrs is not None: - try: - import termios as _termios - _termios.tcsetattr(tty_fd, _termios.TCSAFLUSH, old_attrs) - except Exception: - pass - if tty_fd is not None: - try: - os.close(tty_fd) - except Exception: - pass + try: + import termios as _termios + _termios.tcsetattr(tty_fd, _termios.TCSAFLUSH, old_attrs) + except Exception as e: + logger.debug("Failed to restore terminal attributes: %s", e) + if tty_fd is not None: + try: + os.close(tty_fd) + except Exception as e: + logger.debug("Failed to close tty fd: %s", e) result["done"] = True try: @@ -669,10 +669,10 @@ def get_active_environments_info() -> Dict[str, Any]: import glob for path in glob.glob(str(scratch_dir / pattern)): try: - size = sum(f.stat().st_size for f in Path(path).rglob('*') if f.is_file()) - total_size += size - except OSError: - pass + size = sum(f.stat().st_size for f in Path(path).rglob('*') if f.is_file()) + total_size += size + except OSError as e: + logger.debug("Could not stat path %s: %s", path, e) info["total_disk_usage_mb"] = round(total_size / (1024 * 1024), 2) return info @@ -697,10 +697,10 @@ def cleanup_all_environments(): import glob for path in glob.glob(str(scratch_dir / "hermes-*")): try: - shutil.rmtree(path, ignore_errors=True) - logger.info("Removed orphaned: %s", path) - except OSError: - pass + shutil.rmtree(path, ignore_errors=True) + logger.info("Removed orphaned: %s", path) + except OSError as e: + logger.debug("Failed to remove orphaned path %s: %s", path, e) if cleaned > 0: logger.info("Cleaned %d environments", cleaned)