97 lines
4.4 KiB
Python
97 lines
4.4 KiB
Python
"""
|
|
===============================================================================
|
|
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
|
|
} |