Spaces:
Running
Running
| 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""" | |
| 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 | |
| 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 | |
| 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 [] | |
| 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 | |