from __future__ import annotations import os from dataclasses import dataclass from pathlib import Path from dotenv import load_dotenv def _env_bool(name: str, default: bool = False) -> bool: raw = os.getenv(name) if raw is None: return default return raw.strip().lower() in {"1", "true", "yes", "on"} @dataclass(frozen=True) class AppConfig: openai_api_key: str screenjob_token: str disable_ui: bool default_model: str safety_model: str host: str port: int runs_dir: Path db_path: Path def load_app_config(cwd: Path) -> AppConfig: load_dotenv() openai_api_key = os.getenv("OPENAI_API_KEY", "").strip() screenjob_token = os.getenv("SCREENJOB_TOKEN", "").strip() default_model = os.getenv("SCREENJOB_DEFAULT_MODEL", "gpt-5.4-mini").strip() or "gpt-5.4-mini" safety_model = os.getenv("SCREENJOB_SAFETY_MODEL", "gpt-5.4-mini").strip() or "gpt-5.4-mini" host = os.getenv("SCREENJOB_HOST", "127.0.0.1").strip() or "127.0.0.1" port = int(os.getenv("SCREENJOB_PORT", "8787").strip() or "8787") runs_dir = cwd / "screenjob_runs" db_path = cwd / "screenjob.db" disable_ui = _env_bool("DISABLE_UI", default=False) return AppConfig( openai_api_key=openai_api_key, screenjob_token=screenjob_token, disable_ui=disable_ui, default_model=default_model, safety_model=safety_model, host=host, port=port, runs_dir=runs_dir, db_path=db_path, )