| from typing import Dict, List, Optional, Any | |
| from .domain.entities import AgentId, VersionId, UserId | |
| from .services.version_service import VersionService | |
| from .infrastructure.dependencies import get_version_service | |
| from utils.logger import logger | |
| class VersionManagerFacade: | |
| def __init__(self): | |
| self._service: Optional[VersionService] = None | |
| async def _get_service(self) -> VersionService: | |
| if not self._service: | |
| self._service = await get_version_service() | |
| return self._service | |
| async def create_version( | |
| self, | |
| agent_id: str, | |
| user_id: str, | |
| system_prompt: str, | |
| configured_mcps: List[Dict[str, Any]] = None, | |
| custom_mcps: List[Dict[str, Any]] = None, | |
| agentpress_tools: Dict[str, Any] = None, | |
| version_name: Optional[str] = None, | |
| change_description: Optional[str] = None | |
| ) -> Dict[str, Any]: | |
| service = await self._get_service() | |
| try: | |
| version = await service.create_version( | |
| agent_id=AgentId.from_string(agent_id), | |
| user_id=UserId.from_string(user_id), | |
| system_prompt=system_prompt, | |
| configured_mcps=configured_mcps or [], | |
| custom_mcps=custom_mcps or [], | |
| agentpress_tools=agentpress_tools or {}, | |
| version_name=version_name, | |
| change_description=change_description | |
| ) | |
| logger.info(f"Created version {version.version_name} for agent {agent_id}") | |
| return version.to_dict() | |
| except Exception as e: | |
| logger.error(f"Error creating version: {str(e)}") | |
| raise | |
| async def get_version( | |
| self, agent_id: str, version_id: str, user_id: str | |
| ) -> Dict[str, Any]: | |
| service = await self._get_service() | |
| try: | |
| version = await service.get_version( | |
| agent_id=AgentId.from_string(agent_id), | |
| version_id=VersionId.from_string(version_id), | |
| user_id=UserId.from_string(user_id) | |
| ) | |
| return version.to_dict() | |
| except Exception as e: | |
| logger.error(f"Error getting version: {str(e)}") | |
| raise | |
| async def get_all_versions( | |
| self, agent_id: str, user_id: str | |
| ) -> List[Dict[str, Any]]: | |
| service = await self._get_service() | |
| try: | |
| versions = await service.get_all_versions( | |
| agent_id=AgentId.from_string(agent_id), | |
| user_id=UserId.from_string(user_id) | |
| ) | |
| return [v.to_dict() for v in versions] | |
| except Exception as e: | |
| logger.error(f"Error getting versions: {str(e)}") | |
| raise | |
| async def activate_version( | |
| self, agent_id: str, version_id: str, user_id: str | |
| ) -> None: | |
| service = await self._get_service() | |
| try: | |
| await service.activate_version( | |
| agent_id=AgentId.from_string(agent_id), | |
| version_id=VersionId.from_string(version_id), | |
| user_id=UserId.from_string(user_id) | |
| ) | |
| logger.info(f"Activated version {version_id} for agent {agent_id}") | |
| except Exception as e: | |
| logger.error(f"Error activating version: {str(e)}") | |
| raise | |
| async def compare_versions( | |
| self, | |
| agent_id: str, | |
| version1_id: str, | |
| version2_id: str, | |
| user_id: str | |
| ) -> Dict[str, Any]: | |
| service = await self._get_service() | |
| try: | |
| return await service.compare_versions( | |
| agent_id=AgentId.from_string(agent_id), | |
| version1_id=VersionId.from_string(version1_id), | |
| version2_id=VersionId.from_string(version2_id), | |
| user_id=UserId.from_string(user_id) | |
| ) | |
| except Exception as e: | |
| logger.error(f"Error comparing versions: {str(e)}") | |
| raise | |
| async def update_version_details( | |
| self, | |
| agent_id: str, | |
| version_id: str, | |
| user_id: str, | |
| version_name: Optional[str] = None, | |
| change_description: Optional[str] = None | |
| ) -> Dict[str, Any]: | |
| service = await self._get_service() | |
| try: | |
| updated_version = await service.update_version_details( | |
| agent_id=AgentId.from_string(agent_id), | |
| version_id=VersionId.from_string(version_id), | |
| user_id=UserId.from_string(user_id), | |
| version_name=version_name, | |
| change_description=change_description | |
| ) | |
| logger.info(f"Updated version details for version {version_id} of agent {agent_id}") | |
| return updated_version.to_dict() | |
| except Exception as e: | |
| logger.error(f"Error updating version details: {str(e)}") | |
| raise | |
| async def auto_create_version_on_config_change( | |
| self, | |
| agent_id: str, | |
| user_id: str, | |
| change_description: str = "Auto-saved configuration changes" | |
| ) -> Optional[str]: | |
| service = await self._get_service() | |
| db_client = await service.agent_repo.client | |
| try: | |
| agent_result = await db_client.table('agents').select( | |
| '*, agent_versions!current_version_id(*)' | |
| ).eq('agent_id', agent_id).execute() | |
| if not agent_result.data: | |
| logger.warning(f"Agent {agent_id} not found for auto-versioning") | |
| return None | |
| agent = agent_result.data[0] | |
| current_version = agent.get('agent_versions') | |
| current_config = { | |
| 'system_prompt': agent['system_prompt'], | |
| 'configured_mcps': agent.get('configured_mcps', []), | |
| 'custom_mcps': agent.get('custom_mcps', []), | |
| 'agentpress_tools': agent.get('agentpress_tools', {}) | |
| } | |
| if current_version: | |
| version_config = { | |
| 'system_prompt': current_version['system_prompt'], | |
| 'configured_mcps': current_version.get('configured_mcps', []), | |
| 'custom_mcps': current_version.get('custom_mcps', []), | |
| 'agentpress_tools': current_version.get('agentpress_tools', {}) | |
| } | |
| if current_config == version_config: | |
| logger.info(f"No configuration changes detected for agent {agent_id}") | |
| return None | |
| logger.info(f"Configuration changes detected for agent {agent_id}, creating auto-version") | |
| new_version = await self.create_version( | |
| agent_id=agent_id, | |
| user_id=user_id, | |
| system_prompt=current_config['system_prompt'], | |
| configured_mcps=current_config['configured_mcps'], | |
| custom_mcps=current_config['custom_mcps'], | |
| agentpress_tools=current_config['agentpress_tools'], | |
| change_description=change_description | |
| ) | |
| return new_version['version_id'] | |
| except Exception as e: | |
| logger.error(f"Error in auto-versioning for agent {agent_id}: {str(e)}") | |
| return None | |
| version_manager = VersionManagerFacade() |