# #region AssistantToolTaskStatus [C:3] [TYPE Module] [SEMANTICS assistant, tool, status, task] # @defgroup AssistantApi Module group. # @BRIEF Handler for the "get_task_status" tool — retrieve task status by id or latest user task. # @LAYER API # @RELATION DEPENDS_ON -> [AssistantToolRegistry] # @RELATION DEPENDS_ON -> [TaskManager] from __future__ import annotations from typing import Any from fastapi import HTTPException from sqlalchemy.orm import Session from src.core.config_manager import ConfigManager from src.core.logger import belief_scope, logger from src.core.task_manager import TaskManager from src.schemas.auth import User from ._resolvers import _build_task_observability_summary, _extract_result_deep_links from ._schemas import AssistantAction from ._tool_registry import _check_any_permission, assistant_tool # #region handle_get_task_status [C:3] [TYPE Function] # @ingroup AssistantApi @assistant_tool( operation="get_task_status", domain="status", description="Get task status by task_id or latest user task", optional_entities=["task_id"], risk_level="safe", requires_confirmation=False, permission_checks=[("tasks", "READ")], ) @belief_scope("get_task_status") async def handle_get_task_status( intent: dict[str, Any], current_user: User, task_manager: TaskManager, config_manager: ConfigManager, db: Session, ) -> tuple[str, str | None, list[AssistantAction]]: """Get task status by task_id or latest user task.""" _check_any_permission(current_user, [("tasks", "READ")]) entities = intent.get("entities", {}) task_id = entities.get("task_id") if not task_id: recent = [ t for t in task_manager.get_tasks(limit=20, offset=0) if t.user_id == current_user.id ] if not recent: return ("У вас пока нет задач в истории.", None, []) task = recent[0] actions = [AssistantAction(type="open_task", label="Open Task", target=task.id)] if str(task.status).upper() in {"SUCCESS", "FAILED"}: actions.extend(_extract_result_deep_links(task, config_manager)) summary_line = _build_task_observability_summary(task, config_manager) text = ( f"Последняя задача: {task.id}, статус: {task.status}." + (f"\n{summary_line}" if summary_line else "") ) return (text, task.id, actions) task = task_manager.get_task(task_id) if not task: raise HTTPException(status_code=404, detail=f"Task {task_id} not found") actions = [AssistantAction(type="open_task", label="Open Task", target=task.id)] if str(task.status).upper() in {"SUCCESS", "FAILED"}: actions.extend(_extract_result_deep_links(task, config_manager)) summary_line = _build_task_observability_summary(task, config_manager) text = ( f"Статус задачи {task.id}: {task.status}." + (f"\n{summary_line}" if summary_line else "") ) return (text, task.id, actions) # #endregion handle_get_task_status # #endregion AssistantToolTaskStatus