feat: TASK 031-033 - Node Guardian/Steward + Agent & MicroDAO Chat Widgets

TASK 031: Node Agents Discovery
- Documented existing Monitor agents (NODE1, NODE2)
- Created NODE_AGENTS_INVENTORY.md

TASK 032: Node Guardian/Steward Formalize
- Added migration 030_node_guardian_steward.sql
- Added is_node_guardian, is_node_steward to agents
- Added guardian_agent_id, steward_agent_id to node_cache
- Updated repo_city.py for guardian/steward in node queries
- Added NodeAgentsPanel component for Node Dashboard

TASK 033: Agent & MicroDAO Chat Widgets
- Added CityRoomSummary model
- Added primary_city_room to AgentDashboard API
- Added primary_city_room to MicrodaoDetail API
- Added get_microdao_primary_room() function
- Updated Agent Console with Matrix chat section
- Updated MicroDAO page with public chat section
- Reused existing CityChatWidget component
This commit is contained in:
Apple
2025-11-28 13:51:51 -08:00
parent 4d7c4b9744
commit 773a955ecc
13 changed files with 744 additions and 67 deletions

View File

@@ -0,0 +1,97 @@
# TASK 033: Agent & MicroDAO Chat Widgets
**Дата:** 28 листопада 2025
**Статус:** ✅ Завершено
## Мета
1. У кожному Agent Dashboard (`/agents/[id]`) має бути **діалогове вікно (Matrix-чат) з цим агентом**.
2. У кожному MicroDAO (`/microdao/[slug]`) має бути **публічний чат кімнати цього MicroDAO**, де оркестратор спілкується з користувачами.
## Виконані зміни
### 1. Backend: Agent Dashboard → primary_city_room
**Файл:** `services/city-service/routes_city.py`
- Оновлено endpoint `GET /city/agents/{id}/dashboard`
- Додано поле `primary_city_room` до відповіді
- Пріоритет визначення кімнати:
1. Перша кімната агента з `city_rooms`
2. Primary room MicroDAO агента (якщо є `primary_microdao_id`)
3. `null` якщо немає
### 2. Backend: MicroDAO Detail → primary_city_room
**Файл:** `services/city-service/models_city.py`
- Додано модель `CityRoomSummary`:
```python
class CityRoomSummary(BaseModel):
id: str
slug: str
name: str
matrix_room_id: Optional[str] = None
```
- Оновлено `MicrodaoDetail` — додано поле `primary_city_room`
**Файл:** `services/city-service/repo_city.py`
- Додано функцію `get_microdao_primary_room(microdao_id)`:
- Шукає primary room MicroDAO
- Пріоритет: `room_type='primary'` → `room_type='public'` → будь-яка активна
**Файл:** `services/city-service/routes_city.py`
- Оновлено endpoint `GET /city/microdao/{slug}`
- Додано виклик `get_microdao_primary_room()` та заповнення `primary_city_room`
### 3. Frontend: Типи
**Файл:** `apps/web/src/lib/agent-dashboard.ts`
- Додано тип `CityRoomSummary`
- Оновлено `AgentDashboard` — додано поле `primary_city_room`
**Файл:** `apps/web/src/lib/types/microdao.ts`
- Додано тип `CityRoomSummary`
- Оновлено `MicrodaoDetail` — додано поле `primary_city_room`
### 4. Frontend: Agent Console (`/agents/[agentId]`)
**Файл:** `apps/web/src/app/agents/[agentId]/page.tsx`
- Оновлено Chat Tab:
- Прямий чат з агентом через DAGI Router (існуючий)
- Нова секція "Публічна кімната агента" з `CityChatWidget`
- Якщо `primary_city_room` є — показує Matrix-чат
- Якщо немає — показує повідомлення про необхідність налаштування
### 5. Frontend: MicroDAO Page (`/microdao/[slug]`)
**Файл:** `apps/web/src/app/microdao/[slug]/page.tsx`
- Додано секцію "Публічний чат MicroDAO"
- Використовує `CityChatWidget` з `primary_city_room.slug`
- Показує інформацію про оркестратора
- Якщо кімната не налаштована — показує placeholder
## Перевикористання
Обидві сторінки використовують існуючий компонент `CityChatWidget` з `/components/city/CityChatWidget.tsx`, який вже працює на сторінці громадянина (`/citizens/[slug]`).
## Acceptance Criteria
- [x] `/agents/[id]` — секція "Публічна кімната агента" з Matrix-чатом
- [x] `/microdao/[slug]` — секція "Публічний чат MicroDAO" з Matrix-чатом
- [x] Перевикористано `CityChatWidget`
- [x] Білд проходить успішно
- [x] Типи оновлено на фронтенді та бекенді
## Пов'язані завдання
- **TASK 031:** Node Agents Discovery
- **TASK 032:** Node Guardian/Steward Formalize
- **Citizen Interact Layer v1:** Базовий функціонал чату для громадян