""" =============================================================================== FILE: modules/ai_engine/handlers/task_handler.py PROJECT: SCUD Orion AI (Unified Architecture) MODULE: modules / ai_engine / handlers ROLE: Изолированная обработка вызовов инструментов задач (get, edit, delete, export). AI-CONTEXT-ANCHORS: - ANCHOR[TASK_HANDLER_DISPATCH]: Обработка вызовов db_get_tasks и db_tasks_edit. =============================================================================== """ from typing import Dict, Any, Tuple, Optional from services.tasks.service import get_tasks, execute_task_action from modules.web_api.llm.db.db_chat import db_save_chat_message, db_get_chat_history from modules.web_api.llm.db.db_prompts import db_set_session_state # ANCHOR[TASK_HANDLER_DISPATCH] def handle_tasks_call( fn_name: str, fn_args: Dict[str, Any], user_id: int, session_id: str ) -> Tuple[str, list, Optional[Dict[str, Any]]]: """Обрабатывает нативные tool-вызовы по задачам.""" # 1. Просмотр задач if fn_name == "db_get_tasks": raw_tasks = get_tasks(user_id, status=fn_args.get("status")) reply_text = "Вот интерактивный список ваших текущих задач:" db_save_chat_message(session_id, "assistant", reply_text, is_ephemeral=1) return reply_text, db_get_chat_history(session_id), { "type": "TASK_INTERACTIVE_CARD", "tasks": raw_tasks } # 2. Модификация / Удаление / Экспорт action = (fn_args.get("action") or "UPDATE").upper() if fn_name == "db_add_task": action = "ADD" elif fn_name == "db_delete_task": action = "DELETE" elif fn_name == "db_update_task_status": action = "UPDATE" # Двухфазное подтверждение удаления if action == "DELETE": task_id_raw = str(fn_args.get("task_id", "")).replace("#", "").replace("TASK-", "").strip() db_set_session_state(session_id, "TASK_DELETE_CONFIRM", {"task_id": task_id_raw, "idle_turns": 0}) reply_text = f"Вы действительно хотите удалить задачу #{task_id_raw}?" db_save_chat_message(session_id, "assistant", reply_text, is_ephemeral=1) return reply_text, db_get_chat_history(session_id), { "type": "TASK_DELETE_CONFIRM", "buttons": [ {"label": f"Удалить #{task_id_raw}", "value": f"подтверждаю удаление задачи {task_id_raw}", "style": "danger"}, {"label": "Отмена", "value": "отмена", "style": "secondary"} ] } # Экспорт в Markdown elif action == "EXPORT": export_res = execute_task_action( user_id=user_id, action="EXPORT", filename=fn_args.get("filename"), status=fn_args.get("status") ) reply_text = export_res.get("message", "Отчет по задачам успешно экспортирован.") db_save_chat_message(session_id, "assistant", reply_text, is_ephemeral=0) action_payload = None if export_res.get("status") == "success": action_payload = { "type": "FILE_DOWNLOAD_CARD", "filename": export_res.get("filename"), "download_url": export_res.get("download_url"), "tasks_count": export_res.get("tasks_count") } return reply_text, db_get_chat_history(session_id), action_payload # Создание и обновление else: res = execute_task_action( user_id=user_id, action=action, task_id=fn_args.get("task_id"), title=fn_args.get("title"), priority=fn_args.get("priority", "MEDIUM"), status=fn_args.get("status"), module=fn_args.get("module", "general"), due_date=fn_args.get("due_date") ) raw_tasks = get_tasks(user_id) reply_text = res.get("message", "Операция над задачами выполнена.") db_save_chat_message(session_id, "assistant", reply_text, is_ephemeral=1) return reply_text, db_get_chat_history(session_id), { "type": "TASK_INTERACTIVE_CARD", "tasks": raw_tasks }