Files
scud_orion_ai_v2/app/db/database.py
T

153 lines
5.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import sqlite3
DB_NAME = "/home/puh/scud_orion_ai_v2/data/scud_orion_ai.db"
def get_connection():
return sqlite3.connect(DB_NAME)
def db_get_active_system_prompt() -> str:
"""Извлекает активный системный промпт из базы данных SQLite."""
try:
conn = get_connection()
cursor = conn.cursor()
cursor.execute("SELECT prompt_text FROM system_prompts WHERE name = 'main_agent' AND is_active = 1 LIMIT 1")
row = cursor.fetchone()
conn.close()
if row and row[0]:
return row[0].replace("**", "")
except Exception as e:
print(f"Ошибка чтения системного промпта из БД: {e}")
return "Ты — интеллектуальный ИИ-ассистент и архитектурный координатор проекта SCUD Orion AI."
def db_add_system_prompt(name: str = "main_agent", prompt_text: str = "") -> dict:
"""Обновляет или добавляет активный системный промпт в БД."""
clean_text = prompt_text.replace("**", "")
conn = get_connection()
cursor = conn.cursor()
cursor.execute("""
INSERT INTO system_prompts (name, prompt_text, is_active)
VALUES (?, ?, 1)
ON CONFLICT(name) DO UPDATE SET prompt_text=excluded.prompt_text, updated_at=CURRENT_TIMESTAMP
""", (name, clean_text))
conn.commit()
conn.close()
return {"status": "success", "message": f"Системный промпт '{name}' успешно обновлен в базе!"}
def db_get_rules() -> list:
"""Извлекает правила из таблицы ai_knowledge_base."""
conn = get_connection()
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
cursor.execute("SELECT id, rule_text, added_by FROM ai_knowledge_base ORDER BY id")
rows = [dict(r) for r in cursor.fetchall()]
conn.close()
return rows
def db_add_rule(rule_text: str, added_by: str = "Operator") -> dict:
"""Добавляет новое правило или инструкцию в таблицу ai_knowledge_base."""
clean_text = rule_text.replace("**", "")
conn = get_connection()
cursor = conn.cursor()
cursor.execute(
"INSERT INTO ai_knowledge_base (rule_text, added_by) VALUES (?, ?)",
(clean_text, added_by)
)
rule_id = cursor.lastrowid
conn.commit()
conn.close()
return {"status": "success", "message": f"Правило #{rule_id} успешно добавлено в базу знаний!", "rule_id": rule_id}
def db_get_tasks(status: str = None) -> list:
"""Извлекает список задач из реестра БД."""
conn = get_connection()
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
if status:
cursor.execute("SELECT * FROM tasks WHERE status = ? ORDER BY task_id", (status.upper(),))
else:
cursor.execute("SELECT * FROM tasks ORDER BY task_id")
rows = [dict(r) for r in cursor.fetchall()]
conn.close()
return rows
def db_update_task_status(task_id: str, status: str = None, due_date: str = None) -> dict:
"""Обновляет статус и/или срок выполнения задачи."""
conn = get_connection()
cursor = conn.cursor()
updates = []
params = []
if status:
status_upper = status.upper()
updates.append("status = ?")
params.append(status_upper)
if status_upper == "COMPLETED":
updates.append("completed_at = CURRENT_TIMESTAMP")
else:
updates.append("completed_at = NULL")
if due_date:
updates.append("due_date = ?")
params.append(due_date)
if not updates:
conn.close()
return {"error": "Не указаны параметры для обновления"}
params.append(task_id.upper())
query = f"UPDATE tasks SET {', '.join(updates)} WHERE task_id = ?"
cursor.execute(query, tuple(params))
if cursor.rowcount == 0:
conn.close()
return {"error": f"Задача {task_id} не найдена"}
conn.commit()
conn.close()
return {"status": "success", "message": f"Задача {task_id} обновлена"}
def db_delete_task(task_id: str) -> dict:
"""Удаляет задачу из базы данных по её task_id."""
conn = get_connection()
cursor = conn.cursor()
cursor.execute("DELETE FROM tasks WHERE task_id = ?", (task_id.upper(),))
deleted_count = cursor.rowcount
conn.commit()
conn.close()
if deleted_count == 0:
return {"error": f"Задача {task_id} не найдена"}
return {"status": "success", "message": f"Задача {task_id} удалена"}
def db_add_task(module: str = "general", title: str = "", priority: str = "MEDIUM", due_date: str = None, task_id: str = None) -> dict:
"""Добавляет новую задачу в реестр с авто-генерацией TASK-ID."""
conn = get_connection()
cursor = conn.cursor()
if not task_id:
cursor.execute("SELECT task_id FROM tasks WHERE task_id LIKE 'TASK-%'")
rows = cursor.fetchall()
max_num = 0
for r in rows:
try:
num = int(r[0].replace("TASK-", ""))
if num > max_num:
max_num = num
except ValueError:
pass
task_id = f"TASK-{max_num + 1:02d}"
try:
cursor.execute(
"INSERT INTO tasks (task_id, module, title, status, priority, due_date) VALUES (?, ?, ?, 'BACKLOG', ?, ?)",
(task_id.upper(), module, title, priority.upper(), due_date)
)
conn.commit()
res = {"status": "success", "message": f"Задача {task_id} создана", "task_id": task_id}
except sqlite3.IntegrityError:
res = {"error": f"Задача с ID {task_id} уже существует"}
finally:
conn.close()
return res