# backend/core/profile_manager.py from pathlib import Path import json from typing import Dict, Any, List, Optional from datetime import datetime class ProfileManager: """Manages configuration profiles""" DEFAULT_PROFILE = { "id": "default", "name": "Default Profile", "work_dir": "", "llm_settings": { "model": "gpt-4", "temperature": 0.7, "api_key": "" }, "created_at": "", "updated_at": "" } def __init__(self, data_dir: Path): self.data_dir = data_dir self.profiles_file = data_dir / "profiles.json" self.profiles: Dict[str, Dict] = self._load_profiles() def _load_profiles(self) -> Dict[str, Dict]: """Load profiles from file""" if self.profiles_file.exists(): try: with open(self.profiles_file, 'r', encoding='utf-8') as f: profiles = json.load(f) # Ensure default profile exists if "default" not in profiles: profiles["default"] = self._create_default_profile() return profiles except Exception as e: print(f"Error loading profiles: {e}") return {"default": self._create_default_profile()} else: # Create directory if it doesn't exist self.profiles_file.parent.mkdir(parents=True, exist_ok=True) # Create default profile profiles = {"default": self._create_default_profile()} self._save_profiles(profiles) return profiles def _create_default_profile(self) -> Dict[str, Any]: """Create default profile with timestamp""" profile = self.DEFAULT_PROFILE.copy() now = datetime.now().isoformat() profile["created_at"] = now profile["updated_at"] = now return profile def _save_profiles(self, profiles: Optional[Dict] = None): """Save profiles to file""" if profiles is None: profiles = self.profiles with open(self.profiles_file, 'w', encoding='utf-8') as f: json.dump(profiles, f, indent=4) def get_all_profiles(self) -> List[Dict[str, Any]]: """Get all profiles""" return list(self.profiles.values()) def get_profile(self, profile_id: str) -> Optional[Dict[str, Any]]: """Get specific profile""" return self.profiles.get(profile_id) def create_profile(self, profile_data: Dict[str, Any]) -> Dict[str, Any]: """Create new profile""" if "id" not in profile_data: raise ValueError("Profile must have an id") profile_id = profile_data["id"] if profile_id in self.profiles: raise ValueError(f"Profile {profile_id} already exists") # Add timestamps now = datetime.now().isoformat() profile_data["created_at"] = now profile_data["updated_at"] = now # Ensure required fields for key in ["name", "work_dir", "llm_settings"]: if key not in profile_data: profile_data[key] = self.DEFAULT_PROFILE[key] self.profiles[profile_id] = profile_data self._save_profiles() return profile_data def update_profile(self, profile_id: str, profile_data: Dict[str, Any]) -> Dict[str, Any]: """Update existing profile""" if profile_id not in self.profiles: raise ValueError(f"Profile {profile_id} not found") if profile_id == "default" and "id" in profile_data: raise ValueError("Cannot change id of default profile") # Update timestamp profile_data["updated_at"] = datetime.now().isoformat() # Update profile self.profiles[profile_id].update(profile_data) self._save_profiles() return self.profiles[profile_id] def delete_profile(self, profile_id: str): """Delete profile""" if profile_id == "default": raise ValueError("Cannot delete default profile") if profile_id not in self.profiles: raise ValueError(f"Profile {profile_id} not found") del self.profiles[profile_id] self._save_profiles()