import os import logging from pathlib import Path from flask import Flask # Local imports from .utils.settings import get_settings from .logging_setup import wire_logging_once, get_app_logger, get_engine_logger from app.blueprints import ui # ui blueprint from app.blueprints import api # api blueprint def create_app() -> Flask: """ Create and configure the Flask application instance. Returns: Flask: The configured Flask app. """ # Basic app object app = Flask(__name__, template_folder="templates", static_folder="static") # logging setup wire_logging_once(app) app_logger = get_app_logger() # Load settings (safe fallback to defaults if file missing) settings = get_settings() # Secret key loaded from env (warn if missing) app.secret_key = os.getenv("SECRET_KEY") if not app.secret_key: app_logger.warning("[init] SECRET_KEY is not set; sessions may be insecure in production.") # Configure storage directory (bind-mount is still handled by sandbox.sh) sandbox_storage_default = Path("/data") app.config["SANDBOX_STORAGE"] = str(sandbox_storage_default) # App metadata available to templates app.config["APP_NAME"] = settings.app.name app.config["APP_VERSION"] = f"v{settings.app.version_major}.{settings.app.version_minor}" # Register blueprints app.register_blueprint(ui.bp) app.register_blueprint(api.api_bp) app_logger = get_app_logger() # Example log lines so we know we booted cleanly app_logger.info(f"SneakyScope started: {app.config['APP_NAME']} {app.config['APP_VERSION']}") app_logger.info(f"SANDBOX_STORAGE: {app.config['SANDBOX_STORAGE']}") return app