from typing import Any, Dict, List, Optional from loguru import logger from surreal_commands import get_command_status, submit_command class CommandService: """Generic service layer for command operations""" @staticmethod async def submit_command_job( module_name: str, # Actually app_name for surreal-commands command_name: str, command_args: Dict[str, Any], context: Optional[Dict[str, Any]] = None, ) -> str: """Submit a generic command job for background processing""" try: # Ensure command modules are imported before submitting # This is needed because submit_command validates against local registry try: import commands.podcast_commands # noqa: F401 except ImportError as import_err: logger.error(f"Failed to import command modules: {import_err}") raise ValueError("Command modules not available") # surreal-commands expects: submit_command(app_name, command_name, args) cmd_id = submit_command( module_name, # This is actually the app name (e.g., "open_notebook") command_name, # Command name (e.g., "process_text") command_args, # Input data ) # Convert RecordID to string if needed if not cmd_id: raise ValueError("Failed to get cmd_id from submit_command") cmd_id_str = str(cmd_id) logger.info( f"Submitted command job: {cmd_id_str} for {module_name}.{command_name}" ) return cmd_id_str except Exception as e: logger.error(f"Failed to submit command job: {e}") raise @staticmethod async def get_command_status(job_id: str) -> Dict[str, Any]: """Get status of any command job""" try: status = await get_command_status(job_id) return { "job_id": job_id, "status": status.status if status else "unknown", "result": status.result if status else None, "error_message": getattr(status, "error_message", None) if status else None, "created": str(status.created) if status and hasattr(status, "created") and status.created else None, "updated": str(status.updated) if status and hasattr(status, "updated") and status.updated else None, "progress": getattr(status, "progress", None) if status else None, } except Exception as e: logger.error(f"Failed to get command status: {e}") raise @staticmethod async def list_command_jobs( module_filter: Optional[str] = None, command_filter: Optional[str] = None, status_filter: Optional[str] = None, limit: int = 50, ) -> List[Dict[str, Any]]: """List command jobs with optional filtering""" # This will be implemented with proper SurrealDB queries # For now, return empty list as this is foundation phase return [] @staticmethod async def cancel_command_job(job_id: str) -> bool: """Cancel a running command job""" try: # Implementation depends on surreal-commands cancellation support # For now, just log the attempt logger.info(f"Attempting to cancel job: {job_id}") return True except Exception as e: logger.error(f"Failed to cancel command job: {e}") raise