myrmidon / python /src /server /services /projects /task_service.py
tek Atrust
chore(deploy): build monolithic server for Hugging Face
d5ef46f
Raw
History Blame Contribute Delete
6.02 kB
"""
Task Service Module for Archon
This module provides core business logic for task operations that can be
shared between MCP tools and FastAPI endpoints.
"""
import asyncio
from datetime import datetime
from typing import Any
from src.server.repositories.base_repository import BaseRepository
from src.server.utils import get_supabase_client
from ...config.logfire_config import get_logger
logger = get_logger(__name__)
class TaskService(BaseRepository):
"""Service class for task operations"""
VALID_STATUSES = ["todo", "doing", "review", "done", "processing", "dispatched"]
def __init__(self, supabase_client=None):
"""Initialize with optional supabase client"""
client = supabase_client or get_supabase_client()
super().__init__(client)
def _notify_ai_agent_of_assignment(self, task_id: str, agent_id: str):
from .tasks.maintenance import notify_ai_agent_logic
asyncio.create_task(notify_ai_agent_logic(task_id, agent_id))
def validate_status(self, status: str) -> tuple[bool, str]:
from .tasks.maintenance import validate_status_logic
return validate_status_logic(status, self.VALID_STATUSES)
def validate_assignee(self, assignee: str) -> tuple[bool, str]:
from .tasks.maintenance import validate_assignee_logic
return validate_assignee_logic(assignee)
async def create_info_request_task(
self, requester_id: str, subject: str, context: str, lead_id: str | None = None
) -> tuple[bool, dict[str, Any]]:
from .tasks.create_logic import create_info_request_task_logic
return await create_info_request_task_logic(self, requester_id, subject, context, lead_id)
async def create_task(
self,
project_id: str,
title: str,
description: str = "",
assignee: str = "User",
task_order: int = 0,
feature: str | None = None,
sources: list[dict[str, Any]] | None = None,
code_examples: list[dict[str, Any]] | None = None,
due_date: datetime | None = None,
knowledge_source_ids: list[str] | None = None,
assignee_id: str | None = None,
collaborator_agent_ids: list[str] | None = None,
priority: str = "medium",
is_recurring: bool = False,
crawler_target_id: str | None = None,
schedule_config: dict[str, Any] | None = None,
) -> tuple[bool, dict[str, Any]]:
from .tasks.create_logic import create_task_logic
return await create_task_logic(
self,
project_id,
title,
description,
assignee,
task_order,
feature,
sources,
code_examples,
due_date,
knowledge_source_ids,
assignee_id,
collaborator_agent_ids,
priority,
is_recurring,
crawler_target_id,
schedule_config,
)
async def list_tasks(
self,
project_id: str | None = None,
status: str | None = None,
include_closed: bool = False,
exclude_large_fields: bool = False,
include_archived: bool = False,
assignee_id: str | None = None,
assignee_name: str | None = None,
include_unassigned: bool = False,
) -> tuple[bool, dict[str, Any]]:
from .tasks.query_logic import list_tasks_logic
return await list_tasks_logic(
self,
project_id,
status,
include_closed,
exclude_large_fields,
include_archived,
assignee_id,
assignee_name,
include_unassigned,
)
async def get_task(self, task_id: str) -> tuple[bool, dict[str, Any]]:
from .tasks.query_logic import get_task_logic
return await get_task_logic(self, task_id)
async def update_task(self, task_id: str, update_fields: dict[str, Any]) -> tuple[bool, dict[str, Any]]:
from .tasks.update_logic import update_task_logic
return await update_task_logic(self, task_id, update_fields)
async def archive_task(self, task_id: str, archived_by: str = "mcp") -> tuple[bool, dict[str, Any]]:
from .tasks.maintenance import archive_task_logic
return await archive_task_logic(self, task_id, archived_by)
async def update_task_status_from_agent(
self, task_id: str, new_status: str, agent_id: str
) -> tuple[bool, dict[str, Any]]:
from .tasks.maintenance import update_task_status_from_agent_logic
return await update_task_status_from_agent_logic(self, task_id, new_status, agent_id)
async def save_agent_output(
self, task_id: str, output: dict[str, Any], agent_id: str
) -> tuple[bool, dict[str, Any]]:
from .tasks.maintenance import save_agent_output_logic
return await save_agent_output_logic(self, task_id, output, agent_id)
async def refine_task_description(self, title: str, description: str) -> str:
from .tasks.ai_operations import refine_task_description_logic
return await refine_task_description_logic(self.supabase_client, title, description)
async def get_all_project_task_counts(self) -> tuple[bool, dict[str, dict[str, int]]]:
from .tasks.query_logic import get_all_project_task_counts_logic
return await get_all_project_task_counts_logic(self)
async def generate_task_from_alert(
self, alert_id: str, assignee_id: str | None = None, triggered_by: str | None = None
) -> tuple[bool, dict[str, Any]]:
from .tasks.ai_operations import generate_task_from_alert_logic
return await generate_task_from_alert_logic(self, alert_id, assignee_id)
async def prune_archived_tasks(self, days_old: int = 30) -> tuple[bool, dict[str, Any]]:
from .tasks.maintenance import prune_archived_tasks_logic
return await prune_archived_tasks_logic(self, days_old)
task_service = TaskService()