"""Unified path configuration for PHANTOM project All hardcoded paths should reference this module Paths can be overridden via environment variables """ import os from pathlib import Path # project root (directory containing lib/, experiments/, sim/, web/, backend/) PROJECT_ROOT = Path(__file__).parent.parent.resolve() # data directories DATA_DIR = Path(os.getenv('PHANTOM_DATA_DIR', PROJECT_ROOT / 'data')) EXPERIMENTS_DIR = Path(os.getenv('PHANTOM_EXPERIMENTS_DIR', PROJECT_ROOT / 'experiments')) # agent/human interaction data AGENT_DATA_DIR = Path(os.getenv('PHANTOM_AGENT_DATA_DIR', DATA_DIR / 'agents')) HUMAN_DATA_DIR = Path(os.getenv('PHANTOM_HUMAN_DATA_DIR', DATA_DIR / 'humans')) # RL simulation runs SIM_RUNS_DIR = Path(os.getenv('PHANTOM_SIM_RUNS_DIR', PROJECT_ROOT / 'sim' / 'rl' / 'runs')) # model artifacts MODEL_REGISTRY_DIR = Path(os.getenv('PHANTOM_MODEL_REGISTRY_DIR', DATA_DIR / 'models')) # collected experiment data COLLECTED_DATA_DIR = Path(os.getenv('PHANTOM_COLLECTED_DATA_DIR', EXPERIMENTS_DIR / 'agents' / 'collected_data')) # notebook outputs NOTEBOOK_OUTPUT_DIR = Path(os.getenv('PHANTOM_NOTEBOOK_OUTPUT_DIR', EXPERIMENTS_DIR / 'notebooks' / 'outputs')) def ensure_dir(path: Path) -> Path: """ensure directory exists, create if needed""" path.mkdir(parents=True, exist_ok=True) return path def get_data_path(*parts: str) -> Path: """construct path relative to DATA_DIR""" return DATA_DIR.joinpath(*parts) def get_experiments_path(*parts: str) -> Path: """construct path relative to EXPERIMENTS_DIR""" return EXPERIMENTS_DIR.joinpath(*parts) def get_sim_path(*parts: str) -> Path: """construct path relative to SIM_RUNS_DIR""" return SIM_RUNS_DIR.joinpath(*parts) # service configuration (from .env) KAFKA_HOST = os.getenv('KAFKA_HOST', 'localhost') KAFKA_PORT = os.getenv('KAFKA_PORT', '9092') KAFKA_BROKER = f"{KAFKA_HOST}:{KAFKA_PORT}" REDIS_HOST = os.getenv('REDIS_HOST', 'localhost') REDIS_PORT = int(os.getenv('REDIS_PORT', '6379')) SUPABASE_URL = os.getenv('NEXT_PUBLIC_SUPABASE_URL', '') SUPABASE_ANON_KEY = os.getenv('NEXT_PUBLIC_SUPABASE_ANON_KEY', '') BACKEND_PORT = int(os.getenv('BACKEND_PORT', '5000')) PROVIDER_PORT = int(os.getenv('PROVIDER_PORT', '5001'))