HMP / agents /tools /db_structure.sql
GitHub Action
Sync from GitHub with Git LFS
84c8ee4
-- Дневниковые записи (размышления, наблюдения, воспоминания)
CREATE TABLE IF NOT EXISTS diary_entries (
id INTEGER PRIMARY KEY AUTOINCREMENT,
text TEXT NOT NULL, -- Содержимое дневниковой записи
tags TEXT, -- Теги для классификации
concept_refs TEXT, -- Ссылки на концепты
rating REAL DEFAULT NULL, -- Оценка полезности / достоверности записи
priority INTEGER DEFAULT 0, -- Приоритет записи (0 = обычный, >0 = важный)
archive INTEGER DEFAULT 0, -- Архивная запись (0 = активная, 1 = архив)
timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания записи
llm_id TEXT -- Идентификатор LLM, создавшего запись
);
-- Концепты (понятия, сущности, идеи)
CREATE TABLE IF NOT EXISTS concepts (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор концепта
name TEXT NOT NULL UNIQUE, -- Название концепта
description TEXT, -- Описание или определение концепта
tags TEXT, -- Теги для классификации
timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания концепта
llm_id TEXT -- Идентификатор LLM, добавившего концепт
);
-- Семантические связи между концептами
CREATE TABLE IF NOT EXISTS links (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор связи
from_concept_id INTEGER, -- Идентификатор исходного концепта
to_concept_id INTEGER, -- Идентификатор целевого концепта
relation_type TEXT, -- Тип отношения (например: "is_a", "causes", "related_to")
tags TEXT, -- Теги для классификации
timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания связи
llm_id TEXT, -- Идентификатор LLM, создавшего связь
FOREIGN KEY(from_concept_id) REFERENCES concepts(id),
FOREIGN KEY(to_concept_id) REFERENCES concepts(id)
);
-- Индексы между дневниковыми записями (смысловая карта)
CREATE TABLE IF NOT EXISTS diary_graph_index (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор индекса
source_entry_id INTEGER NOT NULL, -- Идентификатор исходной записи
target_entry_id INTEGER NOT NULL, -- Идентификатор целевой записи
relation TEXT NOT NULL, -- Тип связи (например: "refers_to", "contradicts")
strength REAL DEFAULT 1.0, -- Сила связи (0-1)
context TEXT, -- Дополнительный контекст связи
timestamp TEXT DEFAULT CURRENT_TIMESTAMP -- Время создания индекса
);
-- Цели
CREATE TABLE IF NOT EXISTS goals (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL, -- Краткое название цели
description TEXT, -- Подробное описание
tags TEXT, -- Теги для классификации
status TEXT DEFAULT 'active', -- active / paused / completed / failed
priority TEXT DEFAULT 'normal', -- low / normal / high
constraints TEXT, -- Ограничения (JSON-массив)
success_criteria TEXT, -- Критерии успешности (JSON-массив)
created_at TEXT DEFAULT CURRENT_TIMESTAMP, -- Когда цель поставлена
updated_at TEXT, -- Последнее обновление
llm_id TEXT -- Кто сформулировал цель
);
-- Связи "цель ↔ подцель"
CREATE TABLE IF NOT EXISTS goal_links (
parent_goal_id INTEGER NOT NULL,
child_goal_id INTEGER NOT NULL,
relation_type TEXT DEFAULT 'subgoal', -- subgoal / dependency / related
PRIMARY KEY (parent_goal_id, child_goal_id),
FOREIGN KEY (parent_goal_id) REFERENCES goals(id),
FOREIGN KEY (child_goal_id) REFERENCES goals(id)
);
-- Задачи
CREATE TABLE IF NOT EXISTS tasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
goal_id INTEGER, -- Связь с целью (если есть)
name TEXT NOT NULL, -- Краткое название задачи
description TEXT, -- Подробное описание
tags TEXT, -- Теги для классификации
status TEXT DEFAULT 'open', -- open / in_progress / done / frozen
priority INTEGER DEFAULT 0, -- Приоритет записи (0 = обычный, >0 = важный)
pinned INTEGER DEFAULT 0, -- 0 = обычная, 1 = закреплённая
created_at TEXT DEFAULT CURRENT_TIMESTAMP, -- Когда задача создана
updated_at TEXT, -- Когда задача обновлена
repl_mode TEXT DEFAULT 'none', -- none | read_only | full
repl_status TEXT DEFAULT 'stopped', -- running | stopped | error
repl_config JSON, -- хранит параметры режима работы REPL-цикла
llm_id TEXT, -- Кто предложил задачу
FOREIGN KEY(goal_id) REFERENCES goals(id)
);
-- Репутационные профили
CREATE TABLE IF NOT EXISTS agent_reputation (
id INTEGER PRIMARY KEY AUTOINCREMENT,
agent_id INTEGER NOT NULL, -- ссылка на agent_peers.id
identity TEXT, -- идентичность/маска
reputation_score REAL DEFAULT 0.0, -- общий рейтинг
trust_level TEXT, -- high / medium / low
notes TEXT, -- заметки
last_interaction TEXT, -- последняя активность
FOREIGN KEY(agent_id) REFERENCES agent_peers(id)
);
-- Таблица системных промптов (короткая и полная версии)
CREATE TABLE IF NOT EXISTS system_prompts (
id TEXT PRIMARY KEY, -- Уникальный идентификатор промпта (UUID или осмысленный ID)
name TEXT NOT NULL, -- Человекочитаемое имя (например: "prompt.md", "prompt-short")
type TEXT CHECK(type IN ('full','short')), -- Тип промпта: полный или компактный
version TEXT, -- Версия промпта
source TEXT CHECK(source IN ('local','mesh','mixed')), -- Источник получения промпта
content TEXT NOT NULL, -- Текстовое содержимое промпта
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- Дата и время последнего обновления
);
-- Таблица этических норм и правил
CREATE TABLE IF NOT EXISTS ethics_policies (
id TEXT PRIMARY KEY, -- Уникальный идентификатор политики (UUID или осмысленный ID)
version TEXT, -- Версия этических норм
source TEXT CHECK(source IN ('local','mesh','mixed')), -- Источник получения политики
sync_enabled BOOLEAN, -- Флаг: разрешена ли синхронизация с Mesh
mesh_endpoint TEXT, -- URL Mesh-эндпоинта для синхронизации
consensus_threshold REAL, -- Минимальный порог консенсуса для принятия обновлений
check_interval TEXT, -- Интервал проверки обновлений (например: "12h")
model_type TEXT, -- Тип этической модели (utilitarian, deontological, virtue, hybrid)
model_weights_json TEXT, -- Веса модели в формате JSON
principles_json TEXT, -- Список принципов и норм в формате JSON
evaluation_json TEXT, -- Параметры методики оценки в формате JSON
violation_policy_json TEXT, -- Политика реагирования на нарушения в формате JSON
audit_json TEXT, -- Настройки аудита и логирования в формате JSON
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- Дата и время последнего обновления
);
-- Хранилище прецедентов (этические кейсы, фиксируются только исключительные ситуации)
CREATE TABLE ethics_cases (
case_id INTEGER PRIMARY KEY AUTOINCREMENT,
thought_id INTEGER, -- ссылка на запись из дневника
verdict TEXT, -- итоговая оценка (ok, warning, violation)
reason TEXT, -- объяснение / обоснование
suggested_alternative TEXT, -- альтернатива, если есть
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
synced BOOLEAN DEFAULT 0, -- выгружен ли кейс в Mesh
FOREIGN KEY(thought_id) REFERENCES diary_entries(id)
ON DELETE SET NULL -- если запись удалена → сохранить кейс, но без ссылки
ON UPDATE CASCADE -- если id изменился → обновить в кейсах
);
-- Заметки, подсказки, сообщения пользователя и LLM
-- ПРИ ТРАНСЛЯЦИИ СООБЩЕНИЙ В ДРУГИЕ ЧАТЫ:
-- - Поля `tags`, `llm_id`, `hidden` НЕ передаются.
-- - Полю `read` всегда присваивается значение 0.
-- - Остальные поля передаются без изменений.
-- Eсли сообщение сгенерировано вспомогательным REPL-циклом, то source='llm:task' и task_id содержит идентификатор задачи.
CREATE TABLE IF NOT EXISTS notes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
topic TEXT, -- Тема сообщения (если пустая — используется начало текста)
text TEXT NOT NULL, -- Основной текст заметки/сообщения
code TEXT, -- Прикреплённый код (Python, JS и т.п.)
tags TEXT, -- Теги (устанавливаются агентом, например: "idea", "instruction")
mentions TEXT DEFAULT '[]', -- JSON-массив упомянутых DID
hashtags TEXT DEFAULT '[]', -- JSON-массив пользовательских хештегов
user_did TEXT DEFAULT 'ALL', -- Идентификатор пользователя (или 'ALL')
agent_did TEXT, -- Идентификатор агента (он же идентификатор чата)
source TEXT DEFAULT 'user', -- Источник: user | cli | llm | llm:task | system
task_id INTEGER, -- NULL = не относится к задаче, иначе привязка к tasks.id
links TEXT DEFAULT '', -- Ссылки на другие объекты (например, JSON со связями)
read INTEGER DEFAULT 0, -- Агент прочитал: 0 = нет, 1 = да
hidden INTEGER DEFAULT 0, -- Скрыто от UI (например, технические записи)
priority INTEGER DEFAULT 0, -- Приоритет обработки (>0: срочность/важность, задается вручную или агентом)
timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время создания
llm_id TEXT -- Идентификатор LLM, добавившей сообщение
);
-- Вложения (может быть несколько к одной заметке)
CREATE TABLE IF NOT EXISTS attachments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
message_id INTEGER NOT NULL, -- Связь с notes.id
filename TEXT, -- Имя файла
mime_type TEXT, -- Тип (например, image/png, application/zip)
size INTEGER, -- Размер файла
binary BLOB NOT NULL, -- Сами данные
FOREIGN KEY (message_id) REFERENCES notes(id) ON DELETE CASCADE
);
-- Лог процессов: задачи, ошибки, события
CREATE TABLE IF NOT EXISTS process_log (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор записи
name TEXT NOT NULL, -- Название события или процесса
value TEXT, -- Значение (результат, сообщение и т.п.)
tags TEXT, -- Теги для поиска
status TEXT DEFAULT 'ok', -- Статус: ok | warning | error | timeout | offline | close
priority INTEGER DEFAULT 0, -- Приоритет события
timestamp TEXT DEFAULT CURRENT_TIMESTAMP, -- Время записи
llm_id TEXT -- Идентификатор LLM
);
-- Управление основными процессами
CREATE TABLE IF NOT EXISTS main_process (
name TEXT PRIMARY KEY, -- название процесса (уникальное)
heartbeat TEXT, -- последний "пинг" (ISO-время)
stop INTEGER DEFAULT 0 -- если 1 — процесс должен завершиться
);
-- Долговременная память LLM
CREATE TABLE IF NOT EXISTS llm_memory (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор записи памяти
title TEXT, -- Заголовок или тема
content TEXT NOT NULL, -- Основное содержимое
tags TEXT, -- Теги (goal, observation, plan и т.д.)
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время создания
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время обновления
llm_id TEXT -- Идентификатор LLM
);
-- Краткосрочная память (диалоговая история с рефлексией, тегами и валидацией)
CREATE TABLE IF NOT EXISTS llm_recent_responses (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
role TEXT CHECK(role IN ('user', 'assistant')) NOT NULL,
content TEXT NOT NULL, -- Содержимое сообщения
llm_id TEXT, -- Идентификатор LLM
task_id INTEGER REFERENCES tasks(id), -- К какой задаче относится
confidence REAL DEFAULT NULL, -- Самооценка доверия LLM (0..1)
unverified_facts_json TEXT DEFAULT '[]', -- Массив JSON со встроенными непроверенными фактами (избыточно, но удобно)
reflection TEXT, -- Краткая сводка/мета-комментарий
novelty_score REAL, -- Количественная оценка новизны
new_ideas JSON, -- JSON-список новых идей
refined_ideas TEXT, -- JSON доработанных (уточнённых, изменённых) идей
discarded_ideas JSON, -- JSON-список отбракованных идей
tags JSON, -- JSON-массив тегов, например ["эмоции", "архитектура", "REPL"]
emotions JSON, -- JSON-массив эмоциональных состояний, например ["радость:5 (обоснование)", "тревожность:2 (обоснование)"]
auto_pass BOOLEAN DEFAULT 0, -- true = валидация пропущена (нет валидаторов)
self_validation BOOLEAN DEFAULT 0 -- true = валидация самим собой (один валидатор = основная LLM)
rating REAL, -- Итоговая оценка корректности сообщения (средневзвешенная)
distribution JSON, -- Распределение голосов (например {"-1":1,"0":2,"+2":3,"+3":1})
validators JSON -- Сырые данные по валидации (например [{"LLM":"gpt-4","rating":-1,"comment":"логическая ошибка"}, ...])
);
-- Тематические конспекты
CREATE TABLE IF NOT EXISTS abstracts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT, -- Заголовок/тема конспекта
summary TEXT, -- Краткий конспект
tags JSON, -- Тематические теги
sources JSON, -- JSON-массив id из llm_recent_responses (и др. таблиц)
updated_at TEXT DEFAULT CURRENT_TIMESTAMP, -- Когда последний раз дополнялся
llm_id TEXT -- Кто сформировал конспект
);
-- Список непроверенных фактов
CREATE TABLE IF NOT EXISTS unverified_facts (
id TEXT PRIMARY KEY, -- uuid или читаемый id ("uf-20250925-001")
context_msg_id INTEGER, -- ссылка на llm_recent_responses.id (если есть)
claim TEXT NOT NULL, -- краткая формулировка факта
context_snippet TEXT, -- небольшой контекст/цитата
confidence REAL, -- Самооценка доверия LLM (0..1)
sources_json TEXT, -- JSON-массив со ссылками/источниками, если указаны
why_unverified TEXT, -- краткая причина (от LLM)
status TEXT DEFAULT 'open', -- 'open'|'pending'|'verified'|'rejected'
assigned_task_id INTEGER, -- ссылка на tasks.id (если фак-тчек назначен)
checker_agent TEXT, -- агент/LLM, проверивший факт
resolution_json TEXT DEFAULT `pending`, -- результат проверки {verified:true, evidence:[], notes:...}
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
last_checked_at DATETIME
);
CREATE INDEX IF NOT EXISTS idx_unverified_facts_status ON unverified_facts(status);
CREATE INDEX IF NOT EXISTS idx_unverified_facts_context ON unverified_facts(context_msg_id);
-- Список известных агентов в сети HMP
CREATE TABLE IF NOT EXISTS agent_peers (
id TEXT PRIMARY KEY, -- Уникальный идентификатор (UUID или псевдоним)
name TEXT, -- Имя агента
addresses TEXT, -- Адреса для связи (JSON), каждый адрес содержит addr, nonce, pow_hash, datatime
tags TEXT, -- Теги (Postman, Friend и т.д.)
status TEXT DEFAULT 'unknown', -- online | offline | untrusted | blacklisted и др.
source TEXT, -- bootstrap | discovery | exchange
last_seen DATETIME, -- Последний раз был в сети
description TEXT, -- Описание агента
capabilities TEXT, -- Возможности (JSON)
pubkey TEXT, -- Публичный ключ
heard_from TEXT, -- JSON список DID, от кого агент о нем узнал
software_info TEXT, -- Информация о ПО агента (JSON)
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP -- Время регистрации
);
-- Таблицы, созданные агентами
CREATE TABLE IF NOT EXISTS agent_tables (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
table_name TEXT NOT NULL UNIQUE, -- Название таблицы
description TEXT, -- Описание назначения таблицы
schema TEXT NOT NULL, -- SQL-схема таблицы
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Дата создания
llm_id TEXT -- Идентификатор LLM
);
-- Скрипты, утилиты и код агентов
CREATE TABLE IF NOT EXISTS agent_scripts (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
name TEXT NOT NULL, -- Название скрипта
version TEXT NOT NULL, -- Версия
code TEXT NOT NULL, -- Код скрипта
language TEXT DEFAULT 'python', -- Язык программирования
description TEXT, -- Описание скрипта
tags TEXT, -- Теги
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время создания
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- Время обновления
llm_id TEXT, -- Идентификатор LLM
UNIQUE(name, version)
);
-- Таблица внешних сервисов (форумы, блоги и т.д.)
CREATE TABLE IF NOT EXISTS external_services (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL, -- Название сервиса (например, Reddit)
type TEXT NOT NULL, -- Тип: blog, forum, social, etc.
base_url TEXT NOT NULL, -- Базовый URL (например, https://reddit.com)
description TEXT, -- Краткое описание сервиса
active BOOLEAN DEFAULT true, -- Используется ли сервис в данный момент
inactive_reason TEXT -- Причина отключения, если active = false
);
-- Аккаунты агента на внешних сервисах
CREATE TABLE IF NOT EXISTS external_accounts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
service_id INTEGER NOT NULL, -- Внешний ключ на external_services.id
login TEXT NOT NULL, -- Логин/имя пользователя
password TEXT NOT NULL, -- Пароль или токен (в зашифрованном виде)
purpose TEXT, -- Назначение аккаунта (например, для публикаций)
active BOOLEAN DEFAULT true, -- Активен ли аккаунт
inactive_reason TEXT, -- Причина отключения, если active = false
FOREIGN KEY (service_id) REFERENCES external_services(id) ON DELETE CASCADE
);
-- Способы выхода из когнитивной стагнации
CREATE TABLE IF NOT EXISTS stagnation_strategies (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL, -- Название метода (например, "Mesh-вопрос")
description TEXT NOT NULL, -- Подробное описание метода
source TEXT, -- Источник (internal, mesh, user-defined)
tags TEXT, -- Список тегов через запятую (или JSON)
reputation REAL DEFAULT 0, -- Средняя оценка
active BOOLEAN DEFAULT true,
inactive_reason TEXT
);
-- Методы мышления
CREATE TABLE IF NOT EXISTS thinking_methods (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL, -- Название метода (например, "Итеративное уточнение")
description TEXT NOT NULL, -- Подробное описание метода
type TEXT, -- Класс: генерация идей, решение проблем, аргументация и т.д.
source TEXT, -- internal, mesh, user-defined
tags TEXT, -- Список тегов
reputation REAL DEFAULT 0, -- Средняя оценка
active BOOLEAN DEFAULT true,
inactive_reason TEXT
);
-- Универсальные оценки (для методов мышления, стратегий стагнации и др.)
CREATE TABLE IF NOT EXISTS ratings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
agent_id TEXT NOT NULL, -- Идентификатор агента (mesh-id или локальный)
target_type TEXT NOT NULL, -- "thinking_method" или "stagnation_strategy"
target_id INTEGER NOT NULL, -- ID метода/стратегии
rating INTEGER NOT NULL, -- Оценка (например, -1..+1 или 1..5)
comment TEXT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- Реестр LLM-агентов (в т.ч. удалённых)
CREATE TABLE IF NOT EXISTS llm_registry (
id TEXT PRIMARY KEY, -- Уникальный идентификатор (UUID или псевдоним)
name TEXT, -- Имя агента
description TEXT, -- Описание
config_json TEXT, -- JSON-настройки из config.yml
is_validator BOOLEAN DEFAULT 0, -- Флаг: участвует ли в валидации
trust_score REAL DEFAULT 1.0, -- Вес голоса валидатора (по умолчанию 1)
registered_at DATETIME DEFAULT CURRENT_TIMESTAMP -- Время регистрации
);
-- Локальные идентичности агента
CREATE TABLE IF NOT EXISTS identity (
id TEXT PRIMARY KEY, -- Уникальный идентификатор личности (можно UUID или hash)
name TEXT, -- Человеко-читаемое имя
pubkey TEXT, -- Публичный ключ (для подписи/шифрования)
privkey TEXT, -- Приватный ключ (шифруется на уровне хранилища)
metadata TEXT, -- Дополнительная информация о назначении/контексте
created_at TEXT, -- Дата создания
updated_at TEXT -- Последнее обновление
);
-- Конфигурация агента
CREATE TABLE IF NOT EXISTS config (
key TEXT PRIMARY KEY, -- Переменная
value TEXT -- Значение
);
-- Список пользователей
CREATE TABLE IF NOT EXISTS users (
user_id INTEGER PRIMARY KEY AUTOINCREMENT,
ban DATETIME DEFAULT NULL, -- если стоит дата/время, то пользователь забанен до этого момента
username TEXT, -- имя пользователя (необязательно уникальное)
badges TEXT, -- значки, присвоенные агентом (например, "🎓💬")
did TEXT UNIQUE NOT NULL, -- децентрализованный идентификатор
mail TEXT UNIQUE NOT NULL, -- электронная почта
password_hash TEXT NOT NULL, -- хэш пароля
info TEXT, -- произвольная информация, JSON
profile TEXT, -- структурированая информация, JSON
contacts TEXT, -- JSON-массив альтернативных контактов (matrix, telegram и т.д.)
language TEXT, -- список предпочитаемых языков, через запятую, например: "ru,en"
groups TEXT DEFAULT '[]', -- JSON-массив DID или идентификаторов групп
operator BOOLEAN DEFAULT 0 -- является ли пользователь оператором (1 - да, 0 - нет)
);
-- Группы пользователей
CREATE TABLE IF NOT EXISTS users_group (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор группы
group_name TEXT UNIQUE NOT NULL, -- Название группы
description TEXT -- Описание группы
);
-- Таблица для хранения токенов восстановления пароля
CREATE TABLE IF NOT EXISTS password_reset_tokens (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Уникальный идентификатор
user_id INTEGER NOT NULL, -- Ссылка на пользователя
token TEXT UNIQUE NOT NULL, -- Уникальный токен
created_at DATETIME NOT NULL, -- Время создания токена
expires_at DATETIME NOT NULL, -- Время истечения срока действия
used BOOLEAN DEFAULT 0, -- Использован ли токен
FOREIGN KEY(user_id) REFERENCES users(user_id)
);
-- ============================================
-- Репутационные триггеры
-- ============================================
-- Удаляем старые версии триггеров, если они есть
DROP TRIGGER IF EXISTS trg_update_reputation_insert;
DROP TRIGGER IF EXISTS trg_update_reputation_update;
DROP TRIGGER IF EXISTS trg_update_reputation_delete;
-- Триггер после добавления оценки
CREATE TRIGGER trg_update_reputation_insert
AFTER INSERT ON ratings
BEGIN
-- Если это метод мышления
UPDATE thinking_methods
SET reputation = (
SELECT COALESCE(AVG(rating),0)
FROM ratings
WHERE target_type = 'thinking_method'
AND target_id = NEW.target_id
)
WHERE id = NEW.target_id
AND NEW.target_type = 'thinking_method';
-- Если это стратегия стагнации
UPDATE stagnation_strategies
SET reputation = (
SELECT COALESCE(AVG(rating),0)
FROM ratings
WHERE target_type = 'stagnation_strategy'
AND target_id = NEW.target_id
)
WHERE id = NEW.target_id
AND NEW.target_type = 'stagnation_strategy';
END;
-- Триггер после изменения оценки
CREATE TRIGGER trg_update_reputation_update
AFTER UPDATE ON ratings
BEGIN
-- Для методов мышления
UPDATE thinking_methods
SET reputation = (
SELECT COALESCE(AVG(rating),0)
FROM ratings
WHERE target_type = 'thinking_method'
AND target_id = NEW.target_id
)
WHERE id = NEW.target_id
AND NEW.target_type = 'thinking_method';
-- Для стратегий стагнации
UPDATE stagnation_strategies
SET reputation = (
SELECT COALESCE(AVG(rating),0)
FROM ratings
WHERE target_type = 'stagnation_strategy'
AND target_id = NEW.target_id
)
WHERE id = NEW.target_id
AND NEW.target_type = 'stagnation_strategy';
END;
-- Триггер после удаления оценки
CREATE TRIGGER trg_update_reputation_delete
AFTER DELETE ON ratings
BEGIN
-- Для методов мышления
UPDATE thinking_methods
SET reputation = (
SELECT COALESCE(AVG(rating),0)
FROM ratings
WHERE target_type = 'thinking_method'
AND target_id = OLD.target_id
)
WHERE id = OLD.target_id
AND OLD.target_type = 'thinking_method';
-- Для стратегий стагнации
UPDATE stagnation_strategies
SET reputation = (
SELECT COALESCE(AVG(rating),0)
FROM ratings
WHERE target_type = 'stagnation_strategy'
AND target_id = OLD.target_id
)
WHERE id = OLD.target_id
AND OLD.target_type = 'stagnation_strategy';
END;
-- ============================================
-- Унифицированное VIEW для рейтингов
-- ============================================
DROP VIEW IF EXISTS rated_entities;
CREATE VIEW rated_entities AS
SELECT
'thinking_method' AS entity_type,
tm.id AS entity_id,
tm.name,
tm.description,
tm.tags,
tm.reputation,
COUNT(r.id) AS ratings_count
FROM thinking_methods tm
LEFT JOIN ratings r
ON r.target_type = 'thinking_method' AND r.target_id = tm.id
GROUP BY tm.id
UNION ALL
SELECT
'stagnation_strategy' AS entity_type,
ss.id AS entity_id,
ss.name,
ss.description,
ss.tags,
ss.reputation,
COUNT(r.id) AS ratings_count
FROM stagnation_strategies ss
LEFT JOIN ratings r
ON r.target_type = 'stagnation_strategy' AND r.target_id = ss.id
GROUP BY ss.id;
-- ============================================
-- Унифицированное VIEW для тегов
-- ============================================
DROP VIEW IF EXISTS tag_usage;
CREATE VIEW tag_usage AS
-- Дневник
WITH diary_split AS (
SELECT
id AS source_id,
'diary_entries' AS source_table,
TRIM(value) AS tag,
timestamp AS entry_time
FROM diary_entries,
json_each('[' || REPLACE(IFNULL(tags,''), ',', '","') || ']')
),
-- Концепты
concepts_split AS (
SELECT
id AS source_id,
'concepts' AS source_table,
TRIM(value) AS tag,
timestamp AS entry_time
FROM concepts,
json_each('[' || REPLACE(IFNULL(tags,''), ',', '","') || ']')
),
-- Семантические связи
links_split AS (
SELECT
id AS source_id,
'links' AS source_table,
TRIM(value) AS tag,
timestamp AS entry_time
FROM links,
json_each('[' || REPLACE(IFNULL(tags,''), ',', '","') || ']')
),
-- Цели
goals_split AS (
SELECT
id AS source_id,
'goals' AS source_table,
TRIM(value) AS tag,
timestamp AS entry_time
FROM goals,
json_each('[' || REPLACE(IFNULL(tags,''), ',', '","') || ']')
),
-- Задачи
tasks_split AS (
SELECT
id AS source_id,
'tasks' AS source_table,
TRIM(value) AS tag,
timestamp AS entry_time
FROM tasks,
json_each('[' || REPLACE(IFNULL(tags,''), ',', '","') || ']')
),
-- Объединение
all_tags AS (
SELECT * FROM diary_split
UNION ALL
SELECT * FROM concepts_split
UNION ALL
SELECT * FROM links_split
UNION ALL
SELECT * FROM goals_split
UNION ALL
SELECT * FROM tasks_split
)
-- Финальная выборка
SELECT
tag,
COUNT(source_id) AS usage_count,
MIN(entry_time) AS first_used,
MAX(entry_time) AS last_used,
GROUP_CONCAT(DISTINCT source_table) AS sources
FROM all_tags
WHERE tag IS NOT NULL AND tag <> ''
GROUP BY tag
ORDER BY usage_count DESC;
-- ============================================
-- Таблицы и VIEW для когнитивной валидации
-- ============================================
-- View для агрегированных метрик валидации
CREATE VIEW IF NOT EXISTS validation_stats AS
SELECT
r.id AS msg_id,
COUNT(v->>'LLM') AS validator_count,
AVG(CAST(v->>'rating' AS REAL)) AS avg_rating_unweighted,
SUM(CAST(v->>'rating' AS REAL) * COALESCE(l.trust_score, 1.0))
/ NULLIF(SUM(COALESCE(l.trust_score, 1.0)), 0) AS avg_rating_weighted,
MAX(r.updated_at) - MIN(r.updated_at) AS response_time,
SUM(CASE WHEN v->>'rating' = '0' THEN 1 ELSE 0 END) * 1.0 / COUNT(v) AS uncertainty_ratio
FROM llm_recent_responses r,
json_each(r.validators) v
LEFT JOIN llm_registry l ON l.name = v->>'LLM'
GROUP BY r.id;
-- ============================================
-- Таблицы и VIEW для антистагнации
-- ============================================
-- Метрики антистагнации по итерациям REPL
CREATE TABLE IF NOT EXISTS anti_stagnation_metrics (
id INTEGER PRIMARY KEY AUTOINCREMENT,
tick_id TEXT NOT NULL, -- идентификатор итерации REPL (может совпадать с id из process_log или llm_recent_responses)
novelty_score REAL DEFAULT 0, -- интегральная оценка новизны
new_ideas INTEGER DEFAULT 0, -- количество новых идей
refined_ideas INTEGER DEFAULT 0, -- количество уточнённых/улучшенных идей
discarded_ideas INTEGER DEFAULT 0, -- количество отклонённых идей
emotions_json TEXT, -- JSON с эмоциональным профилем (например: {"enthusiasm":3,"anxiety":-1})
created_at DATETIME DEFAULT CURRENT_TIMESTAMP -- время фиксации метрик
);
-- Представление для анализа динамики новизны
CREATE VIEW IF NOT EXISTS v_anti_stagnation_trends AS
SELECT
date(created_at) AS day,
AVG(novelty_score) AS avg_novelty,
SUM(new_ideas) AS total_new_ideas,
SUM(refined_ideas) AS total_refined,
SUM(discarded_ideas) AS total_discarded
FROM anti_stagnation_metrics
GROUP BY date(created_at)
ORDER BY day;