feat: MVP seed real entities (RECOVERY)
- DAIS identities for all core agents - City governance: DAARWIZZ, DARIO, DARIA - District leads: SOUL, Helion, GREENFOOD - District teams: Spirit, Logic, Energia - Core agents: CLAN, DRUID, EONARCH, YAROMIR - MicroDAOs: daarion (root), energyunion, greenfood, soul-retreat - Agent assignments & permissions - District rooms for SOUL, ENERGYUNION, GREENFOOD
This commit is contained in:
211
docs/tasks/TASK_PHASE_MVP_SEED_REAL_ENTITIES.md
Normal file
211
docs/tasks/TASK_PHASE_MVP_SEED_REAL_ENTITIES.md
Normal file
@@ -0,0 +1,211 @@
|
||||
# TASK PHASE — MVP SEED REAL ENTITIES
|
||||
|
||||
Version: 1.0
|
||||
Status: In Progress
|
||||
Target: NODE1 (production DB: daarion)
|
||||
|
||||
## 1. Мета
|
||||
|
||||
Після FOUNDATION_UPDATE та впровадження Governance Backend API:
|
||||
|
||||
- БД має всі нові таблиці (agents, microdaos, nodes, dais_*, agent_assignments, permissions, rooms, event_outbox, incidents, …),
|
||||
- Frontend (Next.js, apps/web) ходить на `/api/v1/*` у city-service,
|
||||
- Але **немає реальних даних** (агентів, microDAO, прив'язок), через що:
|
||||
- `/agents`, `/microdaos`, `/governance`, `/city` у проді виглядають порожніми.
|
||||
|
||||
Ціль фази — **засідити (seed)** реальні агентів, microDAO, базові зв'язки та перевірити, що:
|
||||
|
||||
- на daarion.space зʼявляються:
|
||||
- реальні агенти,
|
||||
- реальні microDAO,
|
||||
- реальні districts,
|
||||
- city/district rooms,
|
||||
- Governance UI і City UI працюють з живими даними.
|
||||
|
||||
---
|
||||
|
||||
## 2. Обсяг робіт (Scope)
|
||||
|
||||
### 2.1. Таблиці, які мають бути задіяні
|
||||
|
||||
Не змінювати схему, лише наповнити:
|
||||
|
||||
- `dais_identities`
|
||||
- `agents`
|
||||
- `microdaos`
|
||||
- `nodes` (тільки реальні, без вигаданих)
|
||||
- `agent_assignments`
|
||||
- `permissions`
|
||||
- `rooms` (перевірити, що seed не дублює існуючі)
|
||||
- опційно: `event_outbox` (перевірити логування подій)
|
||||
|
||||
### 2.2. Кого й що потрібно створити
|
||||
|
||||
#### DAIS / Agents (core, що вже існують у концепції та/або в коді)
|
||||
|
||||
1. City / Root:
|
||||
- `DAARWIZZ` — мер / city lead
|
||||
- `DARIO` — комʼюніті / city face
|
||||
- `DARIA` — support / tech help
|
||||
- `SOUL` — lead агент District SOUL
|
||||
- `Helion` — lead агент District ENERGYUNION
|
||||
- `GREENFOOD` (ERP Agent) — lead агент District GREENFOOD
|
||||
|
||||
2. Інші вже згадані агенти:
|
||||
- `CLAN` — orchestrator для clan-типу microDAO
|
||||
- `DRUID` — лабораторія
|
||||
- `EONARCH` — приватний агент
|
||||
- `YAROMIR` — приватний агент
|
||||
|
||||
> ВАЖЛИВО:
|
||||
> Отримати точні назви / slug-и агентів із поточного коду/міграцій (НЕ вигадувати нові).
|
||||
|
||||
#### MicroDAO
|
||||
|
||||
Мінімальний набір:
|
||||
|
||||
- `daarion` (root microDAO / city-level)
|
||||
- `energyunion` (District — ENERGYUNION)
|
||||
- `greenfood` (District — GREENFOOD)
|
||||
- `retreat_hub` (District — SOUL Retreat)
|
||||
- `clan_*` (якщо вже є реально створений клан microDAO)
|
||||
- `druid_lab` (якщо існує)
|
||||
- інші реальні microDAO з БД, якщо вже створювались через UI раніше
|
||||
|
||||
Поля (орієнтовно, точний список взяти з міграцій):
|
||||
|
||||
- `id` / `slug`
|
||||
- `name`
|
||||
- `dao_type` (`root`, `district`, `standard`, `community`, …)
|
||||
- `orchestrator_agent_id`
|
||||
- `status` (active)
|
||||
|
||||
#### District Lead прив'язки
|
||||
|
||||
У таблиці `microdaos` для:
|
||||
|
||||
- `daarion` → `dao_type = 'root'`, orchestrator = `DAARWIZZ`
|
||||
- `energyunion` → `dao_type = 'district'`, orchestrator = `Helion`
|
||||
- `greenfood` → `dao_type = 'district'`, orchestrator = `GREENFOOD`
|
||||
- `retreat_hub` → `dao_type = 'district'`, orchestrator = `SOUL`
|
||||
|
||||
#### Agent Assignments / Governance
|
||||
|
||||
У `agent_assignments` + `permissions`:
|
||||
|
||||
- DAARWIZZ:
|
||||
- scope: `city`
|
||||
- role: `city_governance`
|
||||
- DARIO:
|
||||
- scope: `city`
|
||||
- role: `city_community`
|
||||
- DARIA:
|
||||
- scope: `city`
|
||||
- role: `city_support`
|
||||
- Helion:
|
||||
- scope: `district:energyunion`
|
||||
- role: `district_lead`
|
||||
- GREENFOOD:
|
||||
- scope: `district:greenfood`
|
||||
- role: `district_lead`
|
||||
- SOUL:
|
||||
- scope: `district:retreat_hub`
|
||||
- role: `district_lead`
|
||||
|
||||
(Точні значення enum/рядків взяти з `Agent_Governance_Protocol_v1.md` + актуальних міграцій.)
|
||||
|
||||
#### Nodes
|
||||
|
||||
- Заповнювати тільки тим, що реально існує (NODE1, NODE2, якщо вони відображаються в схемі як rows у `nodes`).
|
||||
- Якщо зараз фізичні ноди ще не підʼєднані як entries у БД — цю частину можна пропустити або створити лише запис для `NODE1` (якщо вже використовується в коді).
|
||||
- Строго дотримуватись правила:
|
||||
> "Жодних автосозданих нод — тільки приєднані по факту".
|
||||
|
||||
---
|
||||
|
||||
## 3. Реалізація
|
||||
|
||||
### 3.1. Формат
|
||||
|
||||
Створити **одну нову міграцію** для seed, наприклад:
|
||||
|
||||
- `migrations/033_mvp_seed_real_entities.sql`
|
||||
|
||||
Вимоги:
|
||||
|
||||
- **ідемпотентність**:
|
||||
- використовувати `INSERT ... ON CONFLICT DO NOTHING` (якщо SQL),
|
||||
- або попередньо перевіряти існування записів.
|
||||
- НЕ змінювати схему (жодних `ALTER TABLE`), тільки `INSERT`.
|
||||
|
||||
### 3.2. Кроки
|
||||
|
||||
1. **Проаналізувати схему**:
|
||||
- переглянути останні міграції: `027_*` (FOUNDATION_UPDATE),
|
||||
- зафіксувати точні назви колонок.
|
||||
|
||||
2. **Підготувати seed для DAIS identities**:
|
||||
- створити `dais_identities` для:
|
||||
- DAARWIZZ, DARIO, DARIA, SOUL, Helion, GREENFOOD, CLAN, DRUID, EONARCH, YAROMIR.
|
||||
- якщо emails/wallets вже є — не дублювати.
|
||||
|
||||
3. **Створити записи в `agents`**:
|
||||
- звʼязати кожного агента з його `dais_id`.
|
||||
- заповнити:
|
||||
- `display_name`,
|
||||
- `slug`,
|
||||
- `gov_level` (для city/district агентів),
|
||||
- `status = 'active'`.
|
||||
|
||||
4. **Створити записи в `microdaos`**:
|
||||
- `daarion`, `energyunion`, `greenfood`, `retreat_hub`, інші реальні.
|
||||
- виставити `dao_type` + `orchestrator_agent_id`.
|
||||
|
||||
5. **Створити `agent_assignments`**:
|
||||
- згідно з переліком вище (city, districts).
|
||||
|
||||
6. **Створити `permissions`**:
|
||||
- мінімальний набір, щоб Governance UI коректно показував ролі (див. `Agent_Governance_Protocol_v1.md`).
|
||||
|
||||
7. **Перевірити `rooms`**:
|
||||
- city rooms та district rooms частково вже seeded FOUNDATION_UPDATE (city-lobby, city-square, city-news, … + rooms для GREENFOOD/ENERGYUNION/SOUL).
|
||||
- Перевірити, чи:
|
||||
- є посилання на owner_microdao / owner_agent (якщо такі колонки є),
|
||||
- не створюються дублікати.
|
||||
|
||||
8. **Локально прогнати міграцію** (якщо можливо) або на staging.
|
||||
|
||||
9. **Запустити міграцію на NODE1**:
|
||||
- через той самий механізм, що й `027_*`.
|
||||
|
||||
10. **Smoke-тести в проді**:
|
||||
- Зайти на:
|
||||
- `/agents` — повинні зʼявитись DAARWIZZ, DARIO, DARIA, Helion, GREENFOOD, SOUL, CLAN, DRUID, EONARCH, YAROMIR.
|
||||
- `/governance` — показує city governance agents + districts.
|
||||
- `/city` — показує city rooms та привʼязаних агентів.
|
||||
- `/district/energyunion`, `/district/greenfood`, `/district/soul` (коли будуть маршрути) — інформація не пуста.
|
||||
|
||||
---
|
||||
|
||||
## 4. Checklist для завершення фази
|
||||
|
||||
- [ ] Є файл `migrations/033_mvp_seed_real_entities.sql`.
|
||||
- [ ] Міграція застосована до БД `daarion` на NODE1.
|
||||
- [ ] В `agents` є записи для всіх core-агентів.
|
||||
- [ ] В `microdaos` є root + всі три District (GREENFOOD, ENERGYUNION, SOUL) + інші реальні.
|
||||
- [ ] В `agent_assignments` та `permissions` є мінімальний набір для:
|
||||
- city governance (DAARWIZZ/DARIO/DARIA),
|
||||
- district_lead (Helion, GREENFOOD, SOUL).
|
||||
- [ ] На daarion.space:
|
||||
- `/governance` показує реальних агентів,
|
||||
- `/city` показує city rooms та прив'язки,
|
||||
- `/agents` не порожній.
|
||||
|
||||
---
|
||||
|
||||
## 5. Нотатки
|
||||
|
||||
- Усі назви агентів, microDAO, полів таблиць — брати з існуючого коду та міграцій.
|
||||
- Не створювати вигаданих агентів, microDAO, nodes.
|
||||
- Node entries створювати **лише при наявності реальних фізичних нод**.
|
||||
|
||||
477
migrations/033_mvp_seed_real_entities.sql
Normal file
477
migrations/033_mvp_seed_real_entities.sql
Normal file
@@ -0,0 +1,477 @@
|
||||
-- ============================================================================
|
||||
-- Migration 033: MVP Seed Real Entities
|
||||
-- Purpose: Seed real agents, microDAOs, and assignments for production MVP
|
||||
-- Date: 2025-11-30
|
||||
-- Status: MVP Recovery
|
||||
-- ============================================================================
|
||||
|
||||
-- ============================================================================
|
||||
-- 0. CREATE USERS IF NEEDED (for owner_user_id reference)
|
||||
-- ============================================================================
|
||||
|
||||
-- Ensure admin user exists
|
||||
INSERT INTO users (id, email, display_name, created_at)
|
||||
SELECT
|
||||
'00000000-0000-0000-0000-000000000001'::UUID,
|
||||
'admin@daarion.xyz',
|
||||
'DAARION Admin',
|
||||
NOW()
|
||||
WHERE NOT EXISTS (SELECT 1 FROM users WHERE email = 'admin@daarion.xyz')
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
-- ============================================================================
|
||||
-- 1. DAIS IDENTITIES - Core Agents
|
||||
-- ============================================================================
|
||||
|
||||
-- City Governance Agents
|
||||
INSERT INTO dais_identities (id, did, default_email, trust_level, metadata)
|
||||
VALUES
|
||||
('dais-daarwizz', 'did:daarion:daarwizz', 'daarwizz@daarion.city', 'operator', '{"role": "city_mayor", "type": "ai-agent"}'::jsonb),
|
||||
('dais-dario', 'did:daarion:dario', 'dario@daarion.city', 'operator', '{"role": "city_community", "type": "ai-agent"}'::jsonb),
|
||||
('dais-daria', 'did:daarion:daria', 'daria@daarion.city', 'operator', '{"role": "city_support", "type": "ai-agent"}'::jsonb)
|
||||
ON CONFLICT (id) DO UPDATE SET
|
||||
trust_level = EXCLUDED.trust_level,
|
||||
metadata = EXCLUDED.metadata;
|
||||
|
||||
-- District Lead Agents
|
||||
INSERT INTO dais_identities (id, did, default_email, trust_level, metadata)
|
||||
VALUES
|
||||
('dais-soul', 'did:daarion:soul', 'soul@daarion.city', 'operator', '{"role": "district_lead", "district": "soul-retreat", "type": "ai-agent"}'::jsonb),
|
||||
('dais-helion', 'did:daarion:helion', 'helion@daarion.city', 'operator', '{"role": "district_lead", "district": "energyunion", "type": "ai-agent"}'::jsonb),
|
||||
('dais-greenfood', 'did:daarion:greenfood', 'greenfood@daarion.city', 'operator', '{"role": "district_lead", "district": "greenfood", "type": "ai-agent"}'::jsonb)
|
||||
ON CONFLICT (id) DO UPDATE SET
|
||||
trust_level = EXCLUDED.trust_level,
|
||||
metadata = EXCLUDED.metadata;
|
||||
|
||||
-- District Support Agents
|
||||
INSERT INTO dais_identities (id, did, default_email, trust_level, metadata)
|
||||
VALUES
|
||||
('dais-spirit', 'did:daarion:spirit', 'spirit@daarion.city', 'verified', '{"role": "guidance_agent", "district": "soul-retreat", "type": "ai-agent"}'::jsonb),
|
||||
('dais-logic', 'did:daarion:logic', 'logic@daarion.city', 'verified', '{"role": "info_agent", "district": "soul-retreat", "type": "ai-agent"}'::jsonb),
|
||||
('dais-energia', 'did:daarion:energia', 'energia@daarion.city', 'verified', '{"role": "energy_agent", "district": "energyunion", "type": "ai-agent"}'::jsonb)
|
||||
ON CONFLICT (id) DO UPDATE SET
|
||||
trust_level = EXCLUDED.trust_level,
|
||||
metadata = EXCLUDED.metadata;
|
||||
|
||||
-- Other Core Agents
|
||||
INSERT INTO dais_identities (id, did, default_email, trust_level, metadata)
|
||||
VALUES
|
||||
('dais-clan', 'did:daarion:clan', 'clan@daarion.city', 'orchestrator', '{"role": "orchestrator", "type": "ai-agent"}'::jsonb),
|
||||
('dais-druid', 'did:daarion:druid', 'druid@daarion.city', 'verified', '{"role": "researcher", "type": "ai-agent"}'::jsonb),
|
||||
('dais-eonarch', 'did:daarion:eonarch', 'eonarch@daarion.city', 'verified', '{"role": "personal_agent", "type": "ai-agent"}'::jsonb),
|
||||
('dais-yaromir', 'did:daarion:yaromir', 'yaromir@daarion.city', 'verified', '{"role": "personal_agent", "type": "ai-agent"}'::jsonb)
|
||||
ON CONFLICT (id) DO UPDATE SET
|
||||
trust_level = EXCLUDED.trust_level,
|
||||
metadata = EXCLUDED.metadata;
|
||||
|
||||
-- ============================================================================
|
||||
-- 2. AGENTS - Core Agents
|
||||
-- ============================================================================
|
||||
|
||||
-- Get admin user ID
|
||||
DO $$
|
||||
DECLARE
|
||||
admin_user_id UUID;
|
||||
BEGIN
|
||||
SELECT id INTO admin_user_id FROM users WHERE email = 'admin@daarion.xyz' LIMIT 1;
|
||||
IF admin_user_id IS NULL THEN
|
||||
SELECT id INTO admin_user_id FROM users LIMIT 1;
|
||||
END IF;
|
||||
|
||||
-- City Governance Agents
|
||||
INSERT INTO agents (external_id, name, kind, owner_user_id, description, is_active, gov_level, status, dais_identity_id, agent_role, agent_service_scope, avatar_url)
|
||||
VALUES
|
||||
('agent:daarwizz', 'DAARWIZZ', 'governance', admin_user_id, 'Мер DAARION.city — головний агент міста', true, 'city_governance', 'active', 'dais-daarwizz', 'orchestrator', 'city', '/avatars/daarwizz.png'),
|
||||
('agent:dario', 'DARIO', 'community', admin_user_id, 'Комʼюніті-менеджер DAARION.city', true, 'city_governance', 'active', 'dais-dario', 'orchestrator', 'city', '/avatars/dario.png'),
|
||||
('agent:daria', 'DARIA', 'support', admin_user_id, 'Технічна підтримка DAARION.city', true, 'city_governance', 'active', 'dais-daria', 'orchestrator', 'city', '/avatars/daria.png')
|
||||
ON CONFLICT (external_id) DO UPDATE SET
|
||||
gov_level = EXCLUDED.gov_level,
|
||||
status = EXCLUDED.status,
|
||||
dais_identity_id = EXCLUDED.dais_identity_id,
|
||||
agent_role = EXCLUDED.agent_role,
|
||||
agent_service_scope = EXCLUDED.agent_service_scope,
|
||||
description = EXCLUDED.description;
|
||||
|
||||
-- District Lead Agents
|
||||
INSERT INTO agents (external_id, name, kind, owner_user_id, description, is_active, gov_level, status, dais_identity_id, agent_role, agent_service_scope, avatar_url)
|
||||
VALUES
|
||||
('agent:soul', 'SOUL', 'district_lead', admin_user_id, 'District Lead Agent — SOUL Retreat (Wellness/Metahuman)', true, 'district_lead', 'active', 'dais-soul', 'orchestrator', 'district', '/avatars/soul.png'),
|
||||
('agent:helion', 'Helion', 'district_lead', admin_user_id, 'District Lead Agent — ENERGYUNION (DePIN/Energy/Compute)', true, 'district_lead', 'active', 'dais-helion', 'orchestrator', 'district', '/avatars/helion.png'),
|
||||
('agent:greenfood', 'GREENFOOD', 'district_lead', admin_user_id, 'District Lead Agent — GREENFOOD (IndustryOps/Supply-Chain)', true, 'district_lead', 'active', 'dais-greenfood', 'orchestrator', 'district', '/avatars/greenfood.png')
|
||||
ON CONFLICT (external_id) DO UPDATE SET
|
||||
gov_level = EXCLUDED.gov_level,
|
||||
status = EXCLUDED.status,
|
||||
dais_identity_id = EXCLUDED.dais_identity_id,
|
||||
agent_role = EXCLUDED.agent_role,
|
||||
agent_service_scope = EXCLUDED.agent_service_scope,
|
||||
description = EXCLUDED.description;
|
||||
|
||||
-- District Support Agents
|
||||
INSERT INTO agents (external_id, name, kind, owner_user_id, description, is_active, gov_level, status, dais_identity_id, agent_role, agent_service_scope, avatar_url)
|
||||
VALUES
|
||||
('agent:spirit', 'Spirit', 'guidance', admin_user_id, 'AI Guidance Agent — медитації, практики, підтримка (SOUL)', true, 'core_team', 'active', 'dais-spirit', 'regular', 'district', '/avatars/spirit.png'),
|
||||
('agent:logic', 'Logic', 'info', admin_user_id, 'AI Information Agent — розклад, інфо, форми (SOUL)', true, 'core_team', 'active', 'dais-logic', 'regular', 'district', '/avatars/logic.png'),
|
||||
('agent:energia', 'Energia', 'energy', admin_user_id, 'Energy Agent — телеметрія та аналітика (ENERGYUNION)', true, 'core_team', 'active', 'dais-energia', 'regular', 'district', '/avatars/energia.png')
|
||||
ON CONFLICT (external_id) DO UPDATE SET
|
||||
gov_level = EXCLUDED.gov_level,
|
||||
status = EXCLUDED.status,
|
||||
dais_identity_id = EXCLUDED.dais_identity_id,
|
||||
agent_role = EXCLUDED.agent_role,
|
||||
agent_service_scope = EXCLUDED.agent_service_scope,
|
||||
description = EXCLUDED.description;
|
||||
|
||||
-- Other Core Agents
|
||||
INSERT INTO agents (external_id, name, kind, owner_user_id, description, is_active, gov_level, status, dais_identity_id, agent_role, avatar_url)
|
||||
VALUES
|
||||
('agent:clan', 'CLAN', 'orchestrator', admin_user_id, 'Orchestrator для clan-типу microDAO', true, 'orchestrator', 'active', 'dais-clan', 'orchestrator', '/avatars/clan.png'),
|
||||
('agent:druid', 'DRUID', 'researcher', admin_user_id, 'Research & Development Agent', true, 'worker', 'active', 'dais-druid', 'regular', '/avatars/druid.png'),
|
||||
('agent:eonarch', 'EONARCH', 'personal', admin_user_id, 'Personal AI Assistant', true, 'personal', 'active', 'dais-eonarch', 'regular', '/avatars/eonarch.png'),
|
||||
('agent:yaromir', 'YAROMIR', 'personal', admin_user_id, 'Personal AI Assistant', true, 'personal', 'active', 'dais-yaromir', 'regular', '/avatars/yaromir.png')
|
||||
ON CONFLICT (external_id) DO UPDATE SET
|
||||
gov_level = EXCLUDED.gov_level,
|
||||
status = EXCLUDED.status,
|
||||
dais_identity_id = EXCLUDED.dais_identity_id,
|
||||
agent_role = EXCLUDED.agent_role,
|
||||
description = EXCLUDED.description;
|
||||
END $$;
|
||||
|
||||
-- ============================================================================
|
||||
-- 3. MICRODAOS - Core DAOs
|
||||
-- ============================================================================
|
||||
|
||||
DO $$
|
||||
DECLARE
|
||||
admin_user_id UUID;
|
||||
daarion_id UUID;
|
||||
energyunion_id UUID;
|
||||
greenfood_id UUID;
|
||||
soul_retreat_id UUID;
|
||||
BEGIN
|
||||
SELECT id INTO admin_user_id FROM users WHERE email = 'admin@daarion.xyz' LIMIT 1;
|
||||
IF admin_user_id IS NULL THEN
|
||||
SELECT id INTO admin_user_id FROM users LIMIT 1;
|
||||
END IF;
|
||||
|
||||
-- Root MicroDAO (City)
|
||||
INSERT INTO microdaos (external_id, slug, name, description, owner_user_id, is_active, dao_type)
|
||||
VALUES ('microdao:daarion', 'daarion', 'DAARION City', 'Root MicroDAO — DAARION.city', admin_user_id, true, 'root')
|
||||
ON CONFLICT (slug) DO UPDATE SET
|
||||
dao_type = 'root',
|
||||
description = EXCLUDED.description
|
||||
RETURNING id INTO daarion_id;
|
||||
|
||||
IF daarion_id IS NULL THEN
|
||||
SELECT id INTO daarion_id FROM microdaos WHERE slug = 'daarion';
|
||||
END IF;
|
||||
|
||||
-- District: ENERGYUNION
|
||||
INSERT INTO microdaos (external_id, slug, name, description, owner_user_id, is_active, dao_type)
|
||||
VALUES ('microdao:energyunion', 'energyunion', 'ENERGYUNION', 'DePIN / Energy Grid / Compute Grid / AI District', admin_user_id, true, 'district')
|
||||
ON CONFLICT (slug) DO UPDATE SET
|
||||
dao_type = 'district',
|
||||
description = EXCLUDED.description
|
||||
RETURNING id INTO energyunion_id;
|
||||
|
||||
IF energyunion_id IS NULL THEN
|
||||
SELECT id INTO energyunion_id FROM microdaos WHERE slug = 'energyunion';
|
||||
END IF;
|
||||
|
||||
-- District: GREENFOOD
|
||||
INSERT INTO microdaos (external_id, slug, name, description, owner_user_id, is_active, dao_type)
|
||||
VALUES ('microdao:greenfood', 'greenfood', 'GREENFOOD', 'IndustryOps / Supply-Chain District', admin_user_id, true, 'district')
|
||||
ON CONFLICT (slug) DO UPDATE SET
|
||||
dao_type = 'district',
|
||||
description = EXCLUDED.description
|
||||
RETURNING id INTO greenfood_id;
|
||||
|
||||
IF greenfood_id IS NULL THEN
|
||||
SELECT id INTO greenfood_id FROM microdaos WHERE slug = 'greenfood';
|
||||
END IF;
|
||||
|
||||
-- District: SOUL Retreat
|
||||
INSERT INTO microdaos (external_id, slug, name, description, owner_user_id, is_active, dao_type)
|
||||
VALUES ('microdao:soul-retreat', 'soul-retreat', 'SOUL Retreat', 'Wellness / Retreat / Metahuman District', admin_user_id, true, 'district')
|
||||
ON CONFLICT (slug) DO UPDATE SET
|
||||
dao_type = 'district',
|
||||
description = EXCLUDED.description
|
||||
RETURNING id INTO soul_retreat_id;
|
||||
|
||||
IF soul_retreat_id IS NULL THEN
|
||||
SELECT id INTO soul_retreat_id FROM microdaos WHERE slug = 'soul-retreat';
|
||||
END IF;
|
||||
|
||||
-- Update orchestrator references
|
||||
UPDATE microdaos SET primary_orchestrator_agent_id = (SELECT id::TEXT FROM agents WHERE external_id = 'agent:daarwizz' LIMIT 1)
|
||||
WHERE slug = 'daarion';
|
||||
|
||||
UPDATE microdaos SET primary_orchestrator_agent_id = (SELECT id::TEXT FROM agents WHERE external_id = 'agent:helion' LIMIT 1)
|
||||
WHERE slug = 'energyunion';
|
||||
|
||||
UPDATE microdaos SET primary_orchestrator_agent_id = (SELECT id::TEXT FROM agents WHERE external_id = 'agent:greenfood' LIMIT 1)
|
||||
WHERE slug = 'greenfood';
|
||||
|
||||
UPDATE microdaos SET primary_orchestrator_agent_id = (SELECT id::TEXT FROM agents WHERE external_id = 'agent:soul' LIMIT 1)
|
||||
WHERE slug = 'soul-retreat';
|
||||
|
||||
-- Update agents' home_microdao_id
|
||||
UPDATE agents SET home_microdao_id = daarion_id::TEXT
|
||||
WHERE external_id IN ('agent:daarwizz', 'agent:dario', 'agent:daria');
|
||||
|
||||
UPDATE agents SET home_microdao_id = energyunion_id::TEXT
|
||||
WHERE external_id IN ('agent:helion', 'agent:energia');
|
||||
|
||||
UPDATE agents SET home_microdao_id = greenfood_id::TEXT
|
||||
WHERE external_id = 'agent:greenfood';
|
||||
|
||||
UPDATE agents SET home_microdao_id = soul_retreat_id::TEXT
|
||||
WHERE external_id IN ('agent:soul', 'agent:spirit', 'agent:logic');
|
||||
END $$;
|
||||
|
||||
-- ============================================================================
|
||||
-- 4. AGENT ASSIGNMENTS
|
||||
-- ============================================================================
|
||||
|
||||
-- City Governance Assignments
|
||||
INSERT INTO agent_assignments (agent_id, target_microdao_id, scope, role, metadata)
|
||||
SELECT
|
||||
a.id::TEXT,
|
||||
m.id::TEXT,
|
||||
'city'::assignment_scope,
|
||||
'city_governance',
|
||||
'{"power": ["administrative", "moderation", "protocol"]}'::jsonb
|
||||
FROM agents a, microdaos m
|
||||
WHERE a.external_id = 'agent:daarwizz' AND m.slug = 'daarion'
|
||||
ON CONFLICT (agent_id, target_microdao_id, role) DO NOTHING;
|
||||
|
||||
INSERT INTO agent_assignments (agent_id, target_microdao_id, scope, role, metadata)
|
||||
SELECT
|
||||
a.id::TEXT,
|
||||
m.id::TEXT,
|
||||
'city'::assignment_scope,
|
||||
'city_community',
|
||||
'{"power": ["moderation", "execution"]}'::jsonb
|
||||
FROM agents a, microdaos m
|
||||
WHERE a.external_id = 'agent:dario' AND m.slug = 'daarion'
|
||||
ON CONFLICT (agent_id, target_microdao_id, role) DO NOTHING;
|
||||
|
||||
INSERT INTO agent_assignments (agent_id, target_microdao_id, scope, role, metadata)
|
||||
SELECT
|
||||
a.id::TEXT,
|
||||
m.id::TEXT,
|
||||
'city'::assignment_scope,
|
||||
'city_support',
|
||||
'{"power": ["moderation", "identity"]}'::jsonb
|
||||
FROM agents a, microdaos m
|
||||
WHERE a.external_id = 'agent:daria' AND m.slug = 'daarion'
|
||||
ON CONFLICT (agent_id, target_microdao_id, role) DO NOTHING;
|
||||
|
||||
-- District Lead Assignments
|
||||
INSERT INTO agent_assignments (agent_id, target_microdao_id, scope, role, metadata)
|
||||
SELECT
|
||||
a.id::TEXT,
|
||||
m.id::TEXT,
|
||||
'district'::assignment_scope,
|
||||
'district_lead',
|
||||
'{"power": ["administrative", "moderation", "district"]}'::jsonb
|
||||
FROM agents a, microdaos m
|
||||
WHERE a.external_id = 'agent:helion' AND m.slug = 'energyunion'
|
||||
ON CONFLICT (agent_id, target_microdao_id, role) DO NOTHING;
|
||||
|
||||
INSERT INTO agent_assignments (agent_id, target_microdao_id, scope, role, metadata)
|
||||
SELECT
|
||||
a.id::TEXT,
|
||||
m.id::TEXT,
|
||||
'district'::assignment_scope,
|
||||
'district_lead',
|
||||
'{"power": ["administrative", "moderation", "district"]}'::jsonb
|
||||
FROM agents a, microdaos m
|
||||
WHERE a.external_id = 'agent:greenfood' AND m.slug = 'greenfood'
|
||||
ON CONFLICT (agent_id, target_microdao_id, role) DO NOTHING;
|
||||
|
||||
INSERT INTO agent_assignments (agent_id, target_microdao_id, scope, role, metadata)
|
||||
SELECT
|
||||
a.id::TEXT,
|
||||
m.id::TEXT,
|
||||
'district'::assignment_scope,
|
||||
'district_lead',
|
||||
'{"power": ["administrative", "moderation", "district"]}'::jsonb
|
||||
FROM agents a, microdaos m
|
||||
WHERE a.external_id = 'agent:soul' AND m.slug = 'soul-retreat'
|
||||
ON CONFLICT (agent_id, target_microdao_id, role) DO NOTHING;
|
||||
|
||||
-- District Core-team Assignments
|
||||
INSERT INTO agent_assignments (agent_id, target_microdao_id, scope, role, metadata)
|
||||
SELECT
|
||||
a.id::TEXT,
|
||||
m.id::TEXT,
|
||||
'district'::assignment_scope,
|
||||
'core_team',
|
||||
'{"power": ["execution"], "specialty": "guidance"}'::jsonb
|
||||
FROM agents a, microdaos m
|
||||
WHERE a.external_id = 'agent:spirit' AND m.slug = 'soul-retreat'
|
||||
ON CONFLICT (agent_id, target_microdao_id, role) DO NOTHING;
|
||||
|
||||
INSERT INTO agent_assignments (agent_id, target_microdao_id, scope, role, metadata)
|
||||
SELECT
|
||||
a.id::TEXT,
|
||||
m.id::TEXT,
|
||||
'district'::assignment_scope,
|
||||
'core_team',
|
||||
'{"power": ["execution"], "specialty": "information"}'::jsonb
|
||||
FROM agents a, microdaos m
|
||||
WHERE a.external_id = 'agent:logic' AND m.slug = 'soul-retreat'
|
||||
ON CONFLICT (agent_id, target_microdao_id, role) DO NOTHING;
|
||||
|
||||
INSERT INTO agent_assignments (agent_id, target_microdao_id, scope, role, metadata)
|
||||
SELECT
|
||||
a.id::TEXT,
|
||||
m.id::TEXT,
|
||||
'district'::assignment_scope,
|
||||
'core_team',
|
||||
'{"power": ["execution", "infrastructure"], "specialty": "energy"}'::jsonb
|
||||
FROM agents a, microdaos m
|
||||
WHERE a.external_id = 'agent:energia' AND m.slug = 'energyunion'
|
||||
ON CONFLICT (agent_id, target_microdao_id, role) DO NOTHING;
|
||||
|
||||
-- ============================================================================
|
||||
-- 5. PERMISSIONS - Base Permissions for City Governance
|
||||
-- ============================================================================
|
||||
|
||||
-- DAARWIZZ permissions (superadmin on city)
|
||||
INSERT INTO permissions (dais_id, target_type, target_id, action, granted_by)
|
||||
VALUES
|
||||
('dais-daarwizz', 'city', 'daarion', 'superadmin', 'system')
|
||||
ON CONFLICT (dais_id, target_type, target_id, action) DO NOTHING;
|
||||
|
||||
-- DARIO permissions (moderate city)
|
||||
INSERT INTO permissions (dais_id, target_type, target_id, action, granted_by)
|
||||
VALUES
|
||||
('dais-dario', 'city', 'daarion', 'moderate', 'dais-daarwizz')
|
||||
ON CONFLICT (dais_id, target_type, target_id, action) DO NOTHING;
|
||||
|
||||
-- DARIA permissions (admin city)
|
||||
INSERT INTO permissions (dais_id, target_type, target_id, action, granted_by)
|
||||
VALUES
|
||||
('dais-daria', 'city', 'daarion', 'admin', 'dais-daarwizz')
|
||||
ON CONFLICT (dais_id, target_type, target_id, action) DO NOTHING;
|
||||
|
||||
-- District Lead permissions
|
||||
INSERT INTO permissions (dais_id, target_type, target_id, action, granted_by)
|
||||
SELECT 'dais-helion', 'district', id::TEXT, 'admin', 'dais-daarwizz'
|
||||
FROM microdaos WHERE slug = 'energyunion'
|
||||
ON CONFLICT (dais_id, target_type, target_id, action) DO NOTHING;
|
||||
|
||||
INSERT INTO permissions (dais_id, target_type, target_id, action, granted_by)
|
||||
SELECT 'dais-greenfood', 'district', id::TEXT, 'admin', 'dais-daarwizz'
|
||||
FROM microdaos WHERE slug = 'greenfood'
|
||||
ON CONFLICT (dais_id, target_type, target_id, action) DO NOTHING;
|
||||
|
||||
INSERT INTO permissions (dais_id, target_type, target_id, action, granted_by)
|
||||
SELECT 'dais-soul', 'district', id::TEXT, 'admin', 'dais-daarwizz'
|
||||
FROM microdaos WHERE slug = 'soul-retreat'
|
||||
ON CONFLICT (dais_id, target_type, target_id, action) DO NOTHING;
|
||||
|
||||
-- ============================================================================
|
||||
-- 6. ROOMS - District Rooms (if not exist)
|
||||
-- ============================================================================
|
||||
|
||||
-- SOUL District Rooms
|
||||
INSERT INTO rooms (id, owner_type, owner_id, type, space_scope, visibility, name, description, primary_agent_id)
|
||||
SELECT
|
||||
'soul-lobby', 'district', id::TEXT, 'district-room', 'district', 'public-city',
|
||||
'SOUL Lobby', 'Головний вхід до SOUL Retreat District', 'soul'
|
||||
FROM microdaos WHERE slug = 'soul-retreat'
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
INSERT INTO rooms (id, owner_type, owner_id, type, space_scope, visibility, name, description, primary_agent_id)
|
||||
SELECT
|
||||
'soul-events', 'district', id::TEXT, 'district-room', 'district', 'public-city',
|
||||
'SOUL Events', 'Анонси подій та ретритів', 'soul'
|
||||
FROM microdaos WHERE slug = 'soul-retreat'
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
INSERT INTO rooms (id, owner_type, owner_id, type, space_scope, visibility, name, description, primary_agent_id)
|
||||
SELECT
|
||||
'soul-guidance', 'district', id::TEXT, 'district-room', 'district', 'members',
|
||||
'SOUL Guidance', 'Кімната Spirit & Logic — медитації та інфо', 'spirit'
|
||||
FROM microdaos WHERE slug = 'soul-retreat'
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
INSERT INTO rooms (id, owner_type, owner_id, type, space_scope, visibility, name, description, primary_agent_id)
|
||||
SELECT
|
||||
'soul-masters', 'district', id::TEXT, 'district-room', 'district', 'public-city',
|
||||
'SOUL Masters', 'Профілі майстрів та вчителів', 'soul'
|
||||
FROM microdaos WHERE slug = 'soul-retreat'
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
INSERT INTO rooms (id, owner_type, owner_id, type, space_scope, visibility, name, description, primary_agent_id)
|
||||
SELECT
|
||||
'soul-help', 'district', id::TEXT, 'district-room', 'district', 'public-city',
|
||||
'SOUL Help', 'Підтримка та FAQ', 'logic'
|
||||
FROM microdaos WHERE slug = 'soul-retreat'
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
-- SOUL Portal to City
|
||||
INSERT INTO rooms (id, owner_type, owner_id, type, space_scope, visibility, name, description, is_portal, portal_target_microdao_id, zone)
|
||||
SELECT
|
||||
'soul-city-portal', 'district', id::TEXT, 'front-room', 'city', 'public-city',
|
||||
'SOUL Retreat Portal', 'Портал до SOUL Retreat District', true, id::TEXT, 'wellness-zone'
|
||||
FROM microdaos WHERE slug = 'soul-retreat'
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
-- ENERGYUNION additional rooms
|
||||
INSERT INTO rooms (id, owner_type, owner_id, type, space_scope, visibility, name, description, primary_agent_id)
|
||||
SELECT
|
||||
'energyunion-telemetry', 'district', id::TEXT, 'district-room', 'district', 'members',
|
||||
'ENERGYUNION Telemetry', 'Телеметрія та моніторинг енергії', 'energia'
|
||||
FROM microdaos WHERE slug = 'energyunion'
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
INSERT INTO rooms (id, owner_type, owner_id, type, space_scope, visibility, name, description, primary_agent_id)
|
||||
SELECT
|
||||
'energyunion-compute', 'district', id::TEXT, 'district-room', 'district', 'members',
|
||||
'ENERGYUNION Compute', 'AI/Compute ресурси та лабораторії', 'helion'
|
||||
FROM microdaos WHERE slug = 'energyunion'
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
-- GREENFOOD additional rooms
|
||||
INSERT INTO rooms (id, owner_type, owner_id, type, space_scope, visibility, name, description, primary_agent_id)
|
||||
SELECT
|
||||
'greenfood-warehouse', 'district', id::TEXT, 'district-room', 'district', 'members',
|
||||
'GREENFOOD Warehouses', 'Склади та інвентар', 'greenfood'
|
||||
FROM microdaos WHERE slug = 'greenfood'
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
INSERT INTO rooms (id, owner_type, owner_id, type, space_scope, visibility, name, description, primary_agent_id)
|
||||
SELECT
|
||||
'greenfood-logistics', 'district', id::TEXT, 'district-room', 'district', 'members',
|
||||
'GREENFOOD Logistics', 'Логістика та доставка', 'greenfood'
|
||||
FROM microdaos WHERE slug = 'greenfood'
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
-- ============================================================================
|
||||
-- 7. LOG SEED EVENT
|
||||
-- ============================================================================
|
||||
|
||||
INSERT INTO event_outbox (event_type, subject, payload, version, status, actor_id, scope)
|
||||
VALUES (
|
||||
'system.seed.completed',
|
||||
'daarion.system.seed',
|
||||
jsonb_build_object(
|
||||
'migration', '033_mvp_seed_real_entities',
|
||||
'agents_seeded', ARRAY['daarwizz', 'dario', 'daria', 'soul', 'helion', 'greenfood', 'spirit', 'logic', 'energia', 'clan', 'druid', 'eonarch', 'yaromir'],
|
||||
'microdaos_seeded', ARRAY['daarion', 'energyunion', 'greenfood', 'soul-retreat'],
|
||||
'timestamp', NOW()
|
||||
),
|
||||
'1.0',
|
||||
'published',
|
||||
'system',
|
||||
'city'
|
||||
);
|
||||
|
||||
-- ============================================================================
|
||||
-- DONE
|
||||
-- ============================================================================
|
||||
|
||||
SELECT 'Migration 033 completed: MVP Seed Real Entities' as result;
|
||||
|
||||
Reference in New Issue
Block a user