- matrix-gateway: POST /internal/matrix/presence/online endpoint - usePresenceHeartbeat hook with activity tracking - Auto away after 5 min inactivity - Offline on page close/visibility change - Integrated in MatrixChatRoom component
5.6 KiB
TASK_PHASE_CITY_FINISHER.md
DAARION CITY — FINISHER (Phase 3 Completion)
Цей таск завершує Phase 3 (City MVP).
Ти маєш додати 3 ключові компоненти:
- Public Rooms (API + WS + UI)
- Full Presence System (WS heartbeats + user statuses)
- 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.tsxCityRoomView.tsxCityRoomMessageList.tsxCityRoomInput.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:
- знаходить SecondMe agent user'а
- дає короткий контекст
- викликає
/agents/{id}/invoke - зберігає відповідь
- повертає 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.
Працювати в існуючих сервісах і фронтенді."