""" ThinkStorm Configuration Module Manages application settings, service URLs, secret keys, and default policies. """ import os from pathlib import Path from dataclasses import dataclass, field from typing import Dict, Any, List BASE_DIR = Path(__file__).resolve().parent.parent DATA_DIR = BASE_DIR / "data" DATA_DIR.mkdir(parents=True, exist_ok=True) DB_PATH = DATA_DIR / "thinkstorm.db" # Automatic .env File Loader def _load_env_file(path: Path): if not path.is_file(): return try: with open(path, "r", encoding="utf-8") as f: for line in f: line = line.strip() if not line or line.startswith("#") or "=" not in line: continue k, v = line.split("=", 1) k = k.strip() v = v.strip().strip("'\"") if v: os.environ[k] = v except Exception as e: print(f"[ThinkStorm Config] Notice loading .env from {path}: {e}") _load_env_file(Path("/root/.env")) _load_env_file(BASE_DIR / ".env") _load_env_file(BASE_DIR / "thinkstorm" / ".env") @dataclass class ServiceEndpoints: opengist_url: str = os.getenv("OPENGIST_URL", "https://gist.labyricorn.com") opengist_api_token: str = os.getenv("OPENGIST_API_TOKEN", "") gitea_url: str = os.getenv("GITEA_URL", "https://git.labyricorn.com") gitea_api_token: str = os.getenv("GITEA_API_TOKEN", "") gitea_client_id: str = os.getenv("GITEA_CLIENT_ID", "") gitea_client_secret: str = os.getenv("GITEA_CLIENT_SECRET", "") searxng_url: str = os.getenv("SEARXNG_URL", "https://sx.godno.de") perplexica_url: str = os.getenv("PERPLEXICA_URL", "https://px.godno.de") omniroute_url: str = os.getenv("OMNIROUTE_URL", "https://omni.godno.de/v1") omniroute_api_key: str = os.getenv("OMNIROUTE_API_KEY", "sk-6008fe4dfd069465-236c4f-28414ca2") omniroute_manage_api_key: str = os.getenv("OMNIROUTE_MANAGE_API_KEY", "") omniroute_model_reasoning: str = os.getenv("OMNIROUTE_MODEL_REASONING", "auto/best-reasoning") omniroute_model_coding: str = os.getenv("OMNIROUTE_MODEL_CODING", "auto/best-coding") omniroute_model_fast: str = os.getenv("OMNIROUTE_MODEL_FAST", "auto/best-fast") virustotal_api_key: str = os.getenv("VIRUSTOTAL_API_KEY", "") @dataclass class AppConfig: app_name: str = "ThinkStorm" version: str = "0.1.0-mvp" base_url: str = os.getenv("BASE_URL", "https://ts.labyricorn.com") host: str = os.getenv("HOST", "0.0.0.0") port: int = int(os.getenv("PORT", "8000")) secret_key: str = os.getenv("SECRET_KEY", "thinkstorm-secret-key-development-2026") admin_bootstrap_key: str = os.getenv("ADMIN_BOOTSTRAP_KEY", "admin-thinkstorm-pass-2026") admin_usernames: List[str] = field(default_factory=lambda: ["admin", "root", "labyricorn"]) # Abuse & Rate Limiting Controls max_submission_chars: int = 10000 max_extracted_urls: int = 10 rate_limit_window_seconds: int = 60 rate_limit_max_submissions: int = int(os.getenv("RATE_LIMIT_MAX_SUBMISSIONS", "100")) # Queue Limits max_concurrent_background_jobs: int = 2 max_processor_retries: int = 3 processor_timeout_seconds: int = 45 services: ServiceEndpoints = field(default_factory=ServiceEndpoints) config = AppConfig()