|
|
"""Task-related MCP tools.""" |
|
|
|
|
|
from sqlalchemy.orm import Session |
|
|
from sqlalchemy import desc |
|
|
from app.database import SessionLocal |
|
|
from app.models import Task, TaskStatus, Project, LogEntry |
|
|
|
|
|
|
|
|
def create_task(project_id: str, title: str, description: str = None, assigned_to: str = None) -> dict: |
|
|
""" |
|
|
Create a new task in a project. |
|
|
|
|
|
Args: |
|
|
project_id: ID of the project |
|
|
title: Task title |
|
|
description: Optional task description |
|
|
assigned_to: Optional user ID to assign the task to |
|
|
|
|
|
Returns: |
|
|
Created task data |
|
|
""" |
|
|
db: Session = SessionLocal() |
|
|
try: |
|
|
|
|
|
project = db.query(Project).filter(Project.id == project_id).first() |
|
|
if not project: |
|
|
return {"error": f"Project {project_id} not found"} |
|
|
|
|
|
|
|
|
task = Task( |
|
|
project_id=project_id, |
|
|
title=title, |
|
|
description=description, |
|
|
assigned_to=assigned_to, |
|
|
status=TaskStatus.todo |
|
|
) |
|
|
db.add(task) |
|
|
db.commit() |
|
|
|
|
|
return { |
|
|
"id": task.id, |
|
|
"project_id": task.project_id, |
|
|
"title": task.title, |
|
|
"description": task.description, |
|
|
"status": task.status.value, |
|
|
"assigned_to": task.assigned_to, |
|
|
"working_by": task.working_by, |
|
|
"created_at": task.created_at.isoformat() |
|
|
} |
|
|
finally: |
|
|
db.close() |
|
|
|
|
|
|
|
|
def list_tasks(project_id: str, status: str = None) -> dict: |
|
|
""" |
|
|
List all tasks for a project, optionally filtered by status. |
|
|
|
|
|
Args: |
|
|
project_id: ID of the project |
|
|
status: Optional status filter ("todo", "in_progress", "done") |
|
|
|
|
|
Returns: |
|
|
List of tasks |
|
|
""" |
|
|
db: Session = SessionLocal() |
|
|
try: |
|
|
|
|
|
query = db.query(Task).filter(Task.project_id == project_id) |
|
|
|
|
|
|
|
|
if status: |
|
|
try: |
|
|
status_enum = TaskStatus(status) |
|
|
query = query.filter(Task.status == status_enum) |
|
|
except ValueError: |
|
|
return {"error": f"Invalid status: {status}. Must be one of: todo, in_progress, done"} |
|
|
|
|
|
|
|
|
tasks = query.order_by(desc(Task.created_at)).all() |
|
|
|
|
|
return { |
|
|
"tasks": [ |
|
|
{ |
|
|
"id": task.id, |
|
|
"project_id": task.project_id, |
|
|
"title": task.title, |
|
|
"description": task.description, |
|
|
"status": task.status.value, |
|
|
"assigned_to": task.assigned_to, |
|
|
"working_by": task.working_by, |
|
|
"created_at": task.created_at.isoformat(), |
|
|
"completed_at": task.completed_at.isoformat() if task.completed_at else None |
|
|
} |
|
|
for task in tasks |
|
|
] |
|
|
} |
|
|
finally: |
|
|
db.close() |
|
|
|
|
|
|
|
|
def list_activity(project_id: str, limit: int = 20) -> dict: |
|
|
""" |
|
|
Get recent activity (log entries) for a project. |
|
|
|
|
|
Args: |
|
|
project_id: ID of the project |
|
|
limit: Maximum number of entries to return (default 20) |
|
|
|
|
|
Returns: |
|
|
List of recent log entries |
|
|
""" |
|
|
db: Session = SessionLocal() |
|
|
try: |
|
|
|
|
|
entries = ( |
|
|
db.query(LogEntry) |
|
|
.filter(LogEntry.project_id == project_id) |
|
|
.order_by(desc(LogEntry.created_at)) |
|
|
.limit(limit) |
|
|
.all() |
|
|
) |
|
|
|
|
|
return { |
|
|
"activity": [ |
|
|
{ |
|
|
"id": entry.id, |
|
|
"project_id": entry.project_id, |
|
|
"task_id": entry.task_id, |
|
|
"user_id": entry.user_id, |
|
|
"actor_type": entry.actor_type.value, |
|
|
"action_type": entry.action_type.value, |
|
|
"raw_input": entry.raw_input, |
|
|
"generated_doc": entry.generated_doc, |
|
|
"tags": entry.tags, |
|
|
"created_at": entry.created_at.isoformat() |
|
|
} |
|
|
for entry in entries |
|
|
] |
|
|
} |
|
|
finally: |
|
|
db.close() |
|
|
|