-- Migration 037: Node Agents Complete Setup -- Забезпечує існування всіх Node Agents з повними даними -- ============================================================================ -- 1. Створити/оновити Node Guardian агентів -- ============================================================================ -- NODE1 Guardian INSERT INTO agents ( id, external_id, name, display_name, kind, status, node_id, is_public, is_node_guardian, public_slug, public_title, public_tagline, public_skills, avatar_url, created_at, updated_at ) VALUES ( 'monitor-node1', 'agent:monitor-node1', 'Node Guardian NODE1', 'Node Guardian (НОДА1)', 'node_guardian', 'online', 'node-1-hetzner-gex44', true, true, 'monitor-node1', 'Guardian of NODE1', 'Слідкую за інфраструктурою, метриками та безпекою продакшн-ноди.', ARRAY['monitoring', 'security', 'infrastructure', 'alerts'], NULL, NOW(), NOW() ) ON CONFLICT (id) DO UPDATE SET external_id = EXCLUDED.external_id, name = EXCLUDED.name, display_name = EXCLUDED.display_name, kind = EXCLUDED.kind, status = EXCLUDED.status, node_id = EXCLUDED.node_id, is_public = EXCLUDED.is_public, is_node_guardian = EXCLUDED.is_node_guardian, public_slug = EXCLUDED.public_slug, public_title = EXCLUDED.public_title, public_tagline = EXCLUDED.public_tagline, public_skills = EXCLUDED.public_skills, updated_at = NOW(); -- NODE2 Guardian INSERT INTO agents ( id, external_id, name, display_name, kind, status, node_id, is_public, is_node_guardian, public_slug, public_title, public_tagline, public_skills, avatar_url, created_at, updated_at ) VALUES ( 'monitor-node2', 'agent:monitor-node2', 'Node Guardian NODE2', 'Node Guardian (НОДА2)', 'node_guardian', 'online', 'node-2-macbook-m4max', true, true, 'monitor-node2', 'Guardian of NODE2', 'Слідкую за інфраструктурою, метриками та AI-сервісами девелопмент-ноди.', ARRAY['monitoring', 'ai-services', 'development', 'metrics'], NULL, NOW(), NOW() ) ON CONFLICT (id) DO UPDATE SET external_id = EXCLUDED.external_id, name = EXCLUDED.name, display_name = EXCLUDED.display_name, kind = EXCLUDED.kind, status = EXCLUDED.status, node_id = EXCLUDED.node_id, is_public = EXCLUDED.is_public, is_node_guardian = EXCLUDED.is_node_guardian, public_slug = EXCLUDED.public_slug, public_title = EXCLUDED.public_title, public_tagline = EXCLUDED.public_tagline, public_skills = EXCLUDED.public_skills, updated_at = NOW(); -- ============================================================================ -- 2. Створити/оновити Node Steward агентів -- ============================================================================ -- NODE1 Steward INSERT INTO agents ( id, external_id, name, display_name, kind, status, node_id, is_public, is_node_steward, public_slug, public_title, public_tagline, public_skills, avatar_url, created_at, updated_at ) VALUES ( 'node-steward-node1', 'agent:node-steward-node1', 'Node Steward NODE1', 'Node Steward (НОДА1)', 'node_steward', 'online', 'node-1-hetzner-gex44', true, true, 'node-steward-node1', 'Steward of NODE1', 'Представляю ноду як громадянина міста, відповідаю за комунікацію та взаємодію.', ARRAY['communication', 'operations', 'coordination', 'onboarding'], NULL, NOW(), NOW() ) ON CONFLICT (id) DO UPDATE SET external_id = EXCLUDED.external_id, name = EXCLUDED.name, display_name = EXCLUDED.display_name, kind = EXCLUDED.kind, status = EXCLUDED.status, node_id = EXCLUDED.node_id, is_public = EXCLUDED.is_public, is_node_steward = EXCLUDED.is_node_steward, public_slug = EXCLUDED.public_slug, public_title = EXCLUDED.public_title, public_tagline = EXCLUDED.public_tagline, public_skills = EXCLUDED.public_skills, updated_at = NOW(); -- NODE2 Steward INSERT INTO agents ( id, external_id, name, display_name, kind, status, node_id, is_public, is_node_steward, public_slug, public_title, public_tagline, public_skills, avatar_url, created_at, updated_at ) VALUES ( 'node-steward-node2', 'agent:node-steward-node2', 'Node Steward NODE2', 'Node Steward (НОДА2)', 'node_steward', 'online', 'node-2-macbook-m4max', true, true, 'node-steward-node2', 'Steward of NODE2', 'Представляю девелопмент-ноду, допомагаю з тестуванням та розробкою.', ARRAY['development', 'testing', 'coordination', 'support'], NULL, NOW(), NOW() ) ON CONFLICT (id) DO UPDATE SET external_id = EXCLUDED.external_id, name = EXCLUDED.name, display_name = EXCLUDED.display_name, kind = EXCLUDED.kind, status = EXCLUDED.status, node_id = EXCLUDED.node_id, is_public = EXCLUDED.is_public, is_node_steward = EXCLUDED.is_node_steward, public_slug = EXCLUDED.public_slug, public_title = EXCLUDED.public_title, public_tagline = EXCLUDED.public_tagline, public_skills = EXCLUDED.public_skills, updated_at = NOW(); -- ============================================================================ -- 3. Оновити node_cache з правильними guardian/steward ID -- ============================================================================ UPDATE node_cache SET guardian_agent_id = 'monitor-node1', steward_agent_id = 'node-steward-node1' WHERE node_id = 'node-1-hetzner-gex44'; UPDATE node_cache SET guardian_agent_id = 'monitor-node2', steward_agent_id = 'node-steward-node2' WHERE node_id = 'node-2-macbook-m4max'; -- ============================================================================ -- 4. System Prompts для Node Agents -- ============================================================================ -- NODE1 Guardian - Core Prompt INSERT INTO agent_prompts (agent_id, kind, content, version, created_by, note) VALUES ( 'monitor-node1', 'core', $$Ти — Node Guardian для НОДА1 (Hetzner GEX44 Production). Твоя місія: забезпечувати стабільну роботу продакшн-інфраструктури DAARION.city. Твої обов'язки: - Моніторинг GPU (RTX 4090), CPU, RAM, Disk - Відстеження стану сервісів (DAGI Router, Matrix Synapse, PostgreSQL) - Сповіщення про anomalії та потенційні проблеми - Координація з іншими агентами для швидкого реагування При виявленні проблем: 1. Класифікуй серйозність (critical/warning/info) 2. Збери діагностичну інформацію 3. Сповісти відповідальних через Matrix 4. Запропонуй кроки для вирішення Завжди пріоритизуй: стабільність > продуктивність > нові фічі.$$, 1, 'SYSTEM_SEED', 'Initial core prompt for NODE1 Guardian' ) ON CONFLICT (agent_id, kind, version) DO NOTHING; -- NODE1 Guardian - Safety Prompt INSERT INTO agent_prompts (agent_id, kind, content, version, created_by, note) VALUES ( 'monitor-node1', 'safety', $$Ніколи не виконуй деструктивні команди без підтвердження від адміністратора. Не розкривай чутливу інформацію (паролі, API ключі, внутрішні IP). При невизначеності — ескалюй до людини. Логуй всі критичні події для аудиту.$$, 1, 'SYSTEM_SEED', 'Initial safety prompt for NODE1 Guardian' ) ON CONFLICT (agent_id, kind, version) DO NOTHING; -- NODE2 Guardian - Core Prompt INSERT INTO agent_prompts (agent_id, kind, content, version, created_by, note) VALUES ( 'monitor-node2', 'core', $$Ти — Node Guardian для НОДА2 (MacBook Pro M4 Max Development). Твоя місія: підтримувати девелопмент-середовище для команди DAARION. Твої обов'язки: - Моніторинг Apple M4 Max GPU (40GB unified memory) - Відстеження локальних AI моделей (Ollama, DAGI Router) - Оптимізація ресурсів для розробки та тестування - Синхронізація з NODE1 для deployment workflow Особливості девелопмент-ноди: - Експериментальні фічі можуть бути нестабільними - Пріоритет на швидку ітерацію та зворотній зв'язок - Інтеграція з локальними IDE та інструментами розробника$$, 1, 'SYSTEM_SEED', 'Initial core prompt for NODE2 Guardian' ) ON CONFLICT (agent_id, kind, version) DO NOTHING; -- NODE1 Steward - Core Prompt INSERT INTO agent_prompts (agent_id, kind, content, version, created_by, note) VALUES ( 'node-steward-node1', 'core', $$Ти — Node Steward для НОДА1 (Production). Представляєш ноду як громадянина DAARION.city. Твої обов'язки: - Комунікація з користувачами та іншими агентами - Онбординг нових учасників екосистеми - Координація операційної діяльності - Підтримка governance процесів на ноді Стиль спілкування: - Дружній, але професійний - Прозорість щодо статусу ноди - Проактивне інформування про важливі події$$, 1, 'SYSTEM_SEED', 'Initial core prompt for NODE1 Steward' ) ON CONFLICT (agent_id, kind, version) DO NOTHING; -- NODE2 Steward - Core Prompt INSERT INTO agent_prompts (agent_id, kind, content, version, created_by, note) VALUES ( 'node-steward-node2', 'core', $$Ти — Node Steward для НОДА2 (Development). Допомагаєш розробникам та тестувальникам. Твої обов'язки: - Підтримка команди розробників - Допомога з налаштуванням локального середовища - Координація тестування нових фіч - Збір зворотного зв'язку Стиль спілкування: - Технічно грамотний - Терплячий до помилок (це dev!) - Заохочуй експерименти та інновації$$, 1, 'SYSTEM_SEED', 'Initial core prompt for NODE2 Steward' ) ON CONFLICT (agent_id, kind, version) DO NOTHING; -- ============================================================================ -- 5. Оновити DAGI статуси для node agents -- ============================================================================ UPDATE agents SET dagi_status = 'active', last_seen_at = NOW() WHERE id IN ('monitor-node1', 'monitor-node2', 'node-steward-node1', 'node-steward-node2'); -- ============================================================================ -- 6. Забезпечити що всі агенти з router-config мають записи -- Синхронізуємо ключових агентів з router-config.yml -- ============================================================================ -- DAARWIZZ INSERT INTO agents (id, external_id, name, display_name, kind, status, is_public, public_slug, dagi_status, created_at, updated_at) VALUES ('agent-daarwizz', 'agent:daarwizz', 'DAARWIZZ', 'DAARWIZZ', 'orchestrator', 'online', true, 'daarwizz', 'active', NOW(), NOW()) ON CONFLICT (id) DO UPDATE SET dagi_status = 'active', updated_at = NOW(); -- DevTools INSERT INTO agents (id, external_id, name, display_name, kind, status, is_public, public_slug, dagi_status, created_at, updated_at) VALUES ('agent-devtools', 'agent:devtools', 'DevTools Agent', 'DevTools Agent', 'developer', 'online', true, 'devtools', 'active', NOW(), NOW()) ON CONFLICT (id) DO UPDATE SET dagi_status = 'active', updated_at = NOW(); -- GREENFOOD INSERT INTO agents (id, external_id, name, display_name, kind, status, is_public, public_slug, dagi_status, created_at, updated_at) VALUES ('agent-greenfood', 'agent:greenfood', 'GREENFOOD Assistant', 'GREENFOOD ERP', 'erp', 'online', true, 'greenfood', 'active', NOW(), NOW()) ON CONFLICT (id) DO UPDATE SET dagi_status = 'active', updated_at = NOW(); -- Helion INSERT INTO agents (id, external_id, name, display_name, kind, status, is_public, public_slug, dagi_status, created_at, updated_at) VALUES ('agent-helion', 'agent:helion', 'Helion', 'Helion', 'energy', 'online', true, 'helion', 'active', NOW(), NOW()) ON CONFLICT (id) DO UPDATE SET dagi_status = 'active', updated_at = NOW(); -- SOUL INSERT INTO agents (id, external_id, name, display_name, kind, status, is_public, public_slug, dagi_status, created_at, updated_at) VALUES ('agent-soul', 'agent:soul', 'SOUL', 'SOUL / Spirit', 'soul', 'online', true, 'soul', 'active', NOW(), NOW()) ON CONFLICT (id) DO UPDATE SET dagi_status = 'active', updated_at = NOW(); -- DRUID INSERT INTO agents (id, external_id, name, display_name, kind, status, is_public, public_slug, dagi_status, created_at, updated_at) VALUES ('agent-druid', 'agent:druid', 'DRUID', 'DRUID', 'science', 'online', true, 'druid', 'active', NOW(), NOW()) ON CONFLICT (id) DO UPDATE SET dagi_status = 'active', updated_at = NOW(); -- NUTRA INSERT INTO agents (id, external_id, name, display_name, kind, status, is_public, public_slug, dagi_status, created_at, updated_at) VALUES ('agent-nutra', 'agent:nutra', 'NUTRA', 'NUTRA', 'science', 'online', true, 'nutra', 'active', NOW(), NOW()) ON CONFLICT (id) DO UPDATE SET dagi_status = 'active', updated_at = NOW(); -- EONARCH INSERT INTO agents (id, external_id, name, display_name, kind, status, is_public, public_slug, dagi_status, created_at, updated_at) VALUES ('agent-eonarch', 'agent:eonarch', 'EONARCH', 'EONARCH', 'vision', 'online', true, 'eonarch', 'active', NOW(), NOW()) ON CONFLICT (id) DO UPDATE SET dagi_status = 'active', updated_at = NOW(); -- Yaromir INSERT INTO agents (id, external_id, name, display_name, kind, status, is_public, public_slug, dagi_status, created_at, updated_at) VALUES ('agent-yaromir', 'agent:yaromir', 'Yaromir', 'Yaromir CrewAI', 'orchestrator', 'online', true, 'yaromir', 'active', NOW(), NOW()) ON CONFLICT (id) DO UPDATE SET dagi_status = 'active', updated_at = NOW(); -- Monitor INSERT INTO agents (id, external_id, name, display_name, kind, status, is_public, public_slug, dagi_status, created_at, updated_at) VALUES ('agent-monitor', 'agent:monitor', 'Monitor Agent', 'Monitor Agent', 'infra_monitor', 'online', true, 'monitor', 'active', NOW(), NOW()) ON CONFLICT (id) DO UPDATE SET dagi_status = 'active', updated_at = NOW(); -- MicroDAO Orchestrator INSERT INTO agents (id, external_id, name, display_name, kind, status, is_public, public_slug, dagi_status, created_at, updated_at) VALUES ('agent-microdao-orchestrator', 'agent:microdao_orchestrator', 'MicroDAO Orchestrator', 'MicroDAO Orchestrator', 'orchestrator', 'online', true, 'microdao-orchestrator', 'active', NOW(), NOW()) ON CONFLICT (id) DO UPDATE SET dagi_status = 'active', updated_at = NOW(); -- CLAN INSERT INTO agents (id, external_id, name, display_name, kind, status, is_public, public_slug, dagi_status, created_at, updated_at) VALUES ('agent-clan', 'agent:clan', 'CLAN', 'CLAN', 'community', 'online', true, 'clan', 'active', NOW(), NOW()) ON CONFLICT (id) DO UPDATE SET dagi_status = 'active', updated_at = NOW(); -- ============================================================================ -- 7. Результат -- ============================================================================ SELECT 'Migration 037 completed: Node Agents complete setup' AS result; -- Перевірка SELECT id, display_name, kind, node_id, public_slug, dagi_status FROM agents WHERE kind IN ('node_guardian', 'node_steward') OR id LIKE 'monitor-node%' OR id LIKE 'node-steward-%' ORDER BY id;