import uvicorn import logging import asyncio import subprocess from config.settings import settings from api.server import app from messenger.telegram_bot import create_telegram_app from job_queue.task_queue import task_queue, worker_loop from browser.manager import browser_manager from agent.brain import AgentBrain logging.basicConfig( level=logging.INFO, format='[BROWSER] %(asctime)s - %(name)s - %(levelname)s - %(message)s' ) logger = logging.getLogger(__name__) worker_handles: list[asyncio.Task] = [] brain: AgentBrain | None = None async def start_background_services(): global brain # Start Tor Daemon try: subprocess.Popen(["tor"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) logger.info(f"Tor daemon started on port {settings.tor_socks_port}.") except FileNotFoundError: logger.warning("Tor daemon executable not found. Ghost Mode will not work unless Tor is installed.") except Exception as e: logger.error(f"Failed to start Tor daemon: {e}") # Start Telegram Bot if configured telegram_app = None if settings.telegram_bot_token: telegram_app = create_telegram_app() await telegram_app.initialize() await telegram_app.start() await telegram_app.updater.start_polling() logger.info("Telegram Bot gestartet.") # Start Task Queue Worker await task_queue.initialize() brain = AgentBrain() for worker_index in range(max(1, settings.max_concurrent_browsers)): handle = asyncio.create_task( worker_loop( task_queue, brain, browser_manager, telegram_app.bot if telegram_app else None, ), name=f"agent-worker-{worker_index + 1}", ) worker_handles.append(handle) logger.info("Background services started.") @app.on_event("startup") async def startup_services(): await start_background_services() @app.on_event("shutdown") async def shutdown_services(): for handle in worker_handles: handle.cancel() if worker_handles: await asyncio.gather(*worker_handles, return_exceptions=True) if brain: await brain.close() await browser_manager.close_all() await task_queue._store.close() if __name__ == "__main__": # Startet den internen Uvicorn Server auf Port 8765 (offen für den Verkehrspolizisten) uvicorn.run( "main:app", host="0.0.0.0", port=settings.internal_api_port, reload=False )