import asyncio import psutil from backend.ws.agent_ws import ws_manager async def start_system_stats_loop(): while True: try: cpu = psutil.cpu_percent(interval=None) ram = psutil.virtual_memory().percent disk = psutil.disk_usage('/').percent # Simple network diff (mocking sparklines requires history, but we can just send current stats and let UI keep history) net_io = psutil.net_io_counters() gpu = "N/A" try: import pynvml pynvml.nvmlInit() handle = pynvml.nvmlDeviceGetHandleByIndex(0) meminfo = pynvml.nvmlDeviceGetMemoryInfo(handle) gpu = int((meminfo.used / meminfo.total) * 100) except Exception as e: import logging; logging.getLogger(__name__).error(f"Swallowed exception: {e}") await ws_manager.broadcast({ "event": "system:metrics", "payload": { "cpu": cpu, "ram": ram, "disk": disk, "gpu": gpu, "network": { "sent": net_io.bytes_sent, "recv": net_io.bytes_recv } } }) except asyncio.CancelledError: logging.info("System Monitor Loop cancelled, shutting down cleanly.") break except Exception as e: logging.error(f"System Monitor Loop swallowed exception: {e}") await asyncio.sleep(1)