Skip to content

TASK_PHASE_CITY_FINISHER.md

DAARION CITY — FINISHER (Phase 3 Completion)

Цей таск завершує Phase 3 (City MVP).

Ти маєш додати 3 ключові компоненти:

  1. Public Rooms (API + WS + UI)
  2. Full Presence System (WS heartbeats + user statuses)
  3. Second Me (MVP stub: простий агент із короткою пам'яттю)

0. Цілі

Після виконання цього таску DAARION City має:

✔ Глобальні публічні кімнати міста
✔ Живий статус онлайн-користувачів
✔ Прості персональні агенти Second Me
✔ Готовність до подальшої інтеграції Matrix (без самого Matrix)


1. PUBLIC ROOMS (Міські кімнати)

1.1 Backend API

Створити endpoints в services/city-service:

GET /city/rooms

Повертає список всіх кімнат:

[
  {
    "id": "city_general",
    "name": "General",
    "members_online": 42,
    "last_event": "...",
    "description": "Головна кімната міста"
  }
]

POST /city/rooms

Створення нової публічної кімнати:

{
  "name": "Science",
  "description": "Наукова спільнота"
}

GET /city/rooms/{id}

Повертає: - метадані кімнати - останні 50 повідомлень - онлайн-учасників

POST /city/rooms/{id}/messages

Додати повідомлення в кімнату.


1.2 WebSocket

WS канал:

/ws/city/rooms/{roomId}

Події:

city.room.message
city.room.join
city.room.leave
city.room.presence

1.3 Frontend UI

Додати папку:

src/features/city/rooms/

Компоненти: - CityRoomsPage.tsx - CityRoomView.tsx - CityRoomMessageList.tsx - CityRoomInput.tsx

Функції: - Лістинг кімнат - Стан онлайн-учасників - Чат у реальному часі - Тайпінг індикатор (optional) - Автоскрол останніх повідомлень


2. PRESENCE SYSTEM (Повноцінна система присутності)

2.1 Backend

WS канал:

/ws/city/presence

Кожні 20 секунд фронтенд надсилає heartbeat:

{
  "event": "presence.heartbeat",
  "user_id": "u_123"
}

Backend: - оновлює Redis key: presence:u_123 = online - TTL = 40 секунд - публікує у WS:

{
  "event": "presence.update",
  "user_id": "...",
  "status": "online|offline"
}

2.2 Frontend

Додати:

src/lib/presence.ts

Функції: - підключення до WS /ws/city/presence - кожні 20 секунд надсилати heartbeat - локальна мапа userId → status - глобальний presence store (Zustand)


2.3 Presence UI

Використати:

src/features/city/presence/PresenceBar.tsx
  • список активних юзерів
  • аватари
  • статуси (online/offline)
  • індикатор "active now"

3. SECOND ME (MVP)

Мінімальний персональний агент: - коротка пам'ять (останні 5 interaction logs) - LLM-виклик через agents core (/agents/{id}/invoke) - UI з 1 полем вводу - контекст: userId + останні 5 фраз


3.1 Backend API

Створити сервіс:

services/secondme-service/

Endpoints:

POST /secondme/invoke

{
  "prompt": "Порадь ідею для міського району",
  "user_id": "u_123"
}

Backend: 1. знаходить SecondMe agent user'а
2. дає короткий контекст
3. викликає /agents/{id}/invoke
4. зберігає відповідь
5. повертає JSON з відповіддю

GET /secondme/history?user_id=...

Повертає 5 останніх interaction entries.


3.2 Frontend UI

Додати:

src/features/secondme/SecondMePage.tsx
src/features/secondme/SecondMeChat.tsx

Функції: - поле вводу prompt
- вивід LLM-відповіді
- горизонтальна стрічка історії
- кнопка "clear history"


4. РОЗШИРЕННЯ CITY HOME

На головній сторінці міста показати: - кількість online мешканців (із presence) - останні 3 події Feed - 3 популярні кімнати - швидкий доступ до Second Me (CTA)


5. Acceptance Criteria

Public Rooms

✔ Створення, лістинг, перегляд
✔ Чат працює через WS
✔ Online members оновлюються в реальному часі

Presence System

✔ Heartbeats працюють
✔ Redis TTL працює
✔ PresenceBar показує онлайн-юзерів
✔ Оновлення статусів через WS

Second Me MVP

✔ prompt → відповідь
✔ історія зберігається
✔ UI працює на окремій сторінці

City Home

✔ всі нові елементи працюють
✔ загальний досвід живого "міста"


6. Команда для Cursor

"Завершити Phase 3 згідно TASK_PHASE_CITY_FINISHER.md.
Додати Public Rooms, Presence System, Second Me.
Працювати в існуючих сервісах і фронтенді."