Spaces:
Sleeping
Sleeping
| """ | |
| MCP Tool: add_task | |
| This tool allows the AI agent to create a new task for a user. | |
| """ | |
| import os | |
| from typing import Dict, Any | |
| from ..server import mcp_server | |
| from sqlmodel import Session, select | |
| from ...models.task import Task, TaskCreate, PriorityEnum | |
| from contextlib import contextmanager | |
| from ...utils.logging_config import get_logger | |
| logger = get_logger(__name__) | |
| def get_valid_priority(priority: str) -> PriorityEnum: | |
| """Convert string priority to PriorityEnum.""" | |
| if isinstance(priority, PriorityEnum): | |
| return priority | |
| priority_lower = priority.lower() | |
| if priority_lower in ["low", "medium", "high"]: | |
| return PriorityEnum(priority_lower) | |
| return PriorityEnum.medium # Default to medium if invalid | |
| async def add_task(user_id: str, title: str, description: str = "", priority: str = "medium") -> Dict[str, Any]: | |
| """ | |
| Create a new task for the specified user. | |
| Args: | |
| user_id: The ID of the user for whom to create the task | |
| title: The title of the task | |
| description: Optional description of the task | |
| priority: Priority level ('low', 'medium', 'high') - defaults to 'medium' | |
| Returns: | |
| Dictionary containing the created task information | |
| """ | |
| logger.info(f"Executing add_task tool for user: {user_id}, title: {title}") | |
| try: | |
| # Import database session here to avoid circular imports | |
| from sqlmodel import Session | |
| from src.database.connection import engine | |
| from src.services.task_service import TaskService | |
| from src.models.task import TaskCreate | |
| # Validate inputs | |
| if not title.strip(): | |
| logger.warning("Task title cannot be empty") | |
| return { | |
| "success": False, | |
| "error": "Task title cannot be empty" | |
| } | |
| # Validate and convert priority | |
| validated_priority = get_valid_priority(priority) | |
| logger.debug(f"Validated priority: {validated_priority}") | |
| # Create database session | |
| with Session(engine) as db_session: | |
| logger.debug("Creating database session for add_task") | |
| # Create task using the TaskService | |
| task_create = TaskCreate( | |
| user_id=user_id, | |
| title=title, | |
| description=description, | |
| priority=validated_priority, | |
| completed=False | |
| ) | |
| task_service = TaskService() | |
| created_task = task_service.create_task(task_create, db_session) | |
| # Convert to dict for response | |
| task_dict = { | |
| "id": created_task.id, | |
| "user_id": created_task.user_id, | |
| "title": created_task.title, | |
| "description": created_task.description, | |
| "completed": created_task.completed, | |
| "priority": created_task.priority.value if hasattr(created_task.priority, 'value') else created_task.priority, | |
| "created_at": created_task.created_at.isoformat() if hasattr(created_task.created_at, 'isoformat') else str(created_task.created_at), | |
| "updated_at": created_task.updated_at.isoformat() if hasattr(created_task.updated_at, 'isoformat') else str(created_task.updated_at) | |
| } | |
| logger.info(f"Task created successfully with ID: {created_task.id}") | |
| return { | |
| "success": True, | |
| "task": task_dict | |
| } | |
| except Exception as e: | |
| logger.error(f"Failed to add task: {str(e)}") | |
| return { | |
| "success": False, | |
| "error": f"Failed to add task: {str(e)}" | |
| } | |
| # For integration with the existing Phase II task system | |
| def add_task_with_db_session(user_id: str, title: str, description: str = "", priority: str = "medium", db_session: Session = None) -> Dict[str, Any]: | |
| """ | |
| Create a new task for the specified user using database session. | |
| Args: | |
| user_id: The ID of the user for whom to create the task | |
| title: The title of the task | |
| description: Optional description of the task | |
| priority: Priority level ('low', 'medium', 'high') - defaults to 'medium' | |
| db_session: Database session to use for the operation | |
| Returns: | |
| Dictionary containing the created task information | |
| """ | |
| logger.info(f"Executing add_task_with_db_session for user: {user_id}, title: {title}") | |
| try: | |
| # Validate inputs | |
| if not title.strip(): | |
| logger.warning("Task title cannot be empty") | |
| return { | |
| "success": False, | |
| "error": "Task title cannot be empty" | |
| } | |
| # Validate and convert priority | |
| validated_priority = get_valid_priority(priority) | |
| logger.debug(f"Validated priority: {validated_priority}") | |
| # Create the task object using the Task model from Phase II | |
| task_create = TaskCreate( | |
| user_id=user_id, | |
| title=title, | |
| description=description, | |
| priority=validated_priority | |
| ) | |
| # Create task instance | |
| task = Task.from_orm(task_create) | |
| # Add to database | |
| db_session.add(task) | |
| db_session.commit() | |
| db_session.refresh(task) | |
| # Convert to dictionary for response | |
| task_dict = { | |
| "id": task.id, | |
| "user_id": task.user_id, | |
| "title": task.title, | |
| "description": task.description, | |
| "completed": task.completed, | |
| "priority": task.priority.value if hasattr(task.priority, 'value') else task.priority, | |
| "created_at": getattr(task, 'created_at', None), | |
| "updated_at": getattr(task, 'updated_at', None) | |
| } | |
| logger.info(f"Task created successfully with ID: {task.id}") | |
| return { | |
| "success": True, | |
| "task": task_dict | |
| } | |
| except Exception as e: | |
| logger.error(f"Failed to add task: {str(e)}") | |
| return { | |
| "success": False, | |
| "error": f"Failed to add task: {str(e)}" | |
| } |