feat: Add presence heartbeat for Matrix online status

- 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
This commit is contained in:
Apple
2025-11-27 00:19:40 -08:00
parent 5bed515852
commit 3de3c8cb36
6371 changed files with 1317450 additions and 932 deletions

View File

@@ -0,0 +1,443 @@
# DAARION MVP — Smoke Test Checklist
**Мета:** Швидка перевірка що всі критичні компоненти працюють після deployment.
**Час виконання:** ~15 хвилин
---
## ✅ Pre-flight Check
- [ ] Всі Docker containers запущені: `docker ps | grep daarion`
- [ ] HTTPS працює: `curl -I https://app.daarion.space`
- [ ] DNS resolution OK: `dig app.daarion.space +short`
---
## 🌐 1. API Health Checks
### 1.1 Gateway Health
```bash
curl -I https://app.daarion.space/health
# Очікуємо: HTTP/2 200
```
**Результат:** [ ] ✅ / [ ] ❌
---
### 1.2 City Service Health
```bash
curl https://app.daarion.space/city/health
# Очікуємо: {"status": "healthy", "service": "city-service"}
```
**Результат:** [ ] ✅ / [ ] ❌
---
### 1.3 Agents Service Health
```bash
curl https://app.daarion.space/agents/health
# Очікуємо: {"status": "healthy", "service": "agents-service", ...}
```
**Результат:** [ ] ✅ / [ ] ❌
---
### 1.4 Second Me Service Health
```bash
curl https://app.daarion.space/secondme/health
# Очікуємо: {"status": "healthy", "service": "secondme-service"}
```
**Результат:** [ ] ✅ / [ ] ❌
---
## 🏙️ 2. City Rooms API
### 2.1 Get City Rooms
```bash
curl https://app.daarion.space/city/rooms | jq
# Очікуємо: масив з 5 дефолтних кімнат (general, welcome, builders, science, energy)
```
**Очікуваний output:**
```json
[
{
"id": "room_city_general",
"slug": "general",
"name": "General",
"description": "Головна кімната міста...",
"members_online": <number>
},
...
]
```
**Результат:** [ ] ✅ / [ ] ❌
**Members online count:** _______
---
### 2.2 Get Room Details
```bash
curl https://app.daarion.space/city/rooms/room_city_general | jq
# Очікуємо: деталі кімнати + messages + online_members
```
**Результат:** [ ] ✅ / [ ] ❌
**Messages count:** _______
---
### 2.3 City Feed
```bash
curl https://app.daarion.space/city/feed | jq
# Очікуємо: масив подій (мінімум 1 system event)
```
**Результат:** [ ] ✅ / [ ] ❌
---
## 🧬 3. Second Me API
### 3.1 Second Me Profile (потрібна авторизація)
```bash
# Mock user для тестування
curl https://app.daarion.space/secondme/profile
# Очікуємо: профіль з total_interactions, agent_id
```
**Результат:** [ ] ✅ / [ ] ❌
---
### 3.2 Second Me History
```bash
curl https://app.daarion.space/secondme/history
# Очікуємо: [] (порожній масив для нового користувача)
```
**Результат:** [ ] ✅ / [ ] ❌
---
## 🖥️ 4. Frontend Tests
### 4.1 Homepage Load
**Дія:** Відкрити `https://app.daarion.space` в браузері
**Перевірити:**
- [ ] Сторінка завантажується без помилок
- [ ] Немає console errors (F12 → Console)
- [ ] Немає mixed content warnings
- [ ] CSS та JS завантажуються коректно
**Результат:** [ ] ✅ / [ ] ❌
---
### 4.2 Login/Register Page
**Дія:** Перейти на сторінку логіну/реєстрації
**Перевірити:**
- [ ] Форма відображається коректно
- [ ] Inputs працюють
- [ ] Validation працює
**Результат:** [ ] ✅ / [ ] ❌
---
### 4.3 City Rooms Page
**Дія:** Перейти на `/city/rooms`
**Перевірити:**
- [ ] Список кімнат завантажується
- [ ] Видно 5 дефолтних кімнат
- [ ] Online count відображається
- [ ] Можна клікнути на кімнату
**Результат:** [ ] ✅ / [ ] ❌
---
### 4.4 Room View
**Дія:** Відкрити конкретну кімнату `/city/rooms/room_city_general`
**Перевірити:**
- [ ] Повідомлення завантажуються
- [ ] Online members відображаються
- [ ] Input для нових повідомлень працює
**Результат:** [ ] ✅ / [ ] ❌
---
### 4.5 Second Me Page
**Дія:** Перейти на `/secondme`
**Перевірити:**
- [ ] Сторінка завантажується
- [ ] Chat interface відображається
- [ ] Input працює
- [ ] Profile stats показуються
**Результат:** [ ] ✅ / [ ] ❌
---
## 🔌 5. WebSocket Tests
### 5.1 City Room WebSocket
**Дія:** Відкрити DevTools → Network → WS filter, відкрити кімнату
**Перевірити:**
- [ ] WebSocket connection встановлено
- [ ] URL: `wss://app.daarion.space/ws/city/rooms/{room_id}`
- [ ] Connection status: Connected (101 Switching Protocols)
- [ ] Heartbeat працює (якщо реалізовано)
**Результат:** [ ] ✅ / [ ] ❌
---
### 5.2 Presence WebSocket
**Дія:** Відкрити будь-яку сторінку з PresenceBar
**Перевірити:**
- [ ] WebSocket connection до `/ws/city/presence`
- [ ] Heartbeat надсилається кожні 20 секунд
- [ ] Online count оновлюється
**Результат:** [ ] ✅ / [ ] ❌
---
## 🧪 6. Functional Tests
### 6.1 Send Message to Room (Mock)
```bash
# Потрібна авторизація, або використати mock user_id
curl -X POST https://app.daarion.space/city/rooms/room_city_general/messages \
-H "Content-Type: application/json" \
-d '{"body": "Test message from smoke test"}'
# Очікуємо: 200 або 401 (якщо потрібна авторизація)
```
**Результат:** [ ] ✅ / [ ] ❌
---
### 6.2 Second Me Invoke (Mock)
```bash
# Викликати Second Me
curl -X POST https://app.daarion.space/secondme/invoke \
-H "Content-Type: application/json" \
-d '{"prompt": "Hello, Second Me!"}'
# Очікуємо: response з reply, tokens_used, latency_ms
```
**Результат:** [ ] ✅ / [ ] ❌
**Response time:** _______ ms
---
## 📊 7. Monitoring & Logs
### 7.1 Docker Logs
```bash
# Перевірити що немає критичних помилок
docker logs daarion-gateway --tail 50
docker logs daarion-city-service --tail 50
docker logs daarion-agents-service --tail 50
```
**Перевірити:**
- [ ] Немає ERROR рівня логів (допустимі тільки WARN)
- [ ] Сервіси стартували успішно
- [ ] З'єднання з БД встановлені
**Результат:** [ ] ✅ / [ ] ❌
---
### 7.2 Database Connection
```bash
# Перевірити що БД доступна
docker compose -f docker-compose.all.yml exec postgres \
psql -U daarion_user -d daarion -c "SELECT COUNT(*) FROM city_rooms;"
# Очікуємо: 5 (дефолтні кімнати)
```
**Результат:** [ ] ✅ / [ ] ❌
---
### 7.3 Redis Connection
```bash
# Перевірити Redis
docker compose -f docker-compose.all.yml exec redis redis-cli PING
# Очікуємо: PONG
# Перевірити presence keys (якщо хтось онлайн)
docker compose -f docker-compose.all.yml exec redis redis-cli KEYS "presence:user:*"
```
**Результат:** [ ] ✅ / [ ] ❌
---
### 7.4 NATS Connection
```bash
# Перевірити NATS
docker compose -f docker-compose.all.yml exec nats nats server info
# Очікуємо: статус server, connections, etc.
```
**Результат:** [ ] ✅ / [ ] ❌
---
## 🔒 8. Security Checks
### 8.1 HTTPS Certificate
```bash
# Перевірити SSL certificate
echo | openssl s_client -servername app.daarion.space -connect app.daarion.space:443 2>/dev/null | openssl x509 -noout -dates
# Перевірити issuer
echo | openssl s_client -servername app.daarion.space -connect app.daarion.space:443 2>/dev/null | openssl x509 -noout -issuer
```
**Перевірити:**
- [ ] Certificate валідний
- [ ] Expiry date > 30 днів
- [ ] Issuer: Let's Encrypt або інший trusted CA
**Результат:** [ ] ✅ / [ ] ❌
---
### 8.2 HTTP to HTTPS Redirect
```bash
# Перевірити редірект
curl -I http://app.daarion.space
# Очікуємо: 301 або 308 redirect на https://
```
**Результат:** [ ] ✅ / [ ] ❌
---
### 8.3 Security Headers
```bash
curl -I https://app.daarion.space | grep -E "Strict-Transport-Security|X-Content-Type-Options|X-Frame-Options"
```
**Перевірити наявність:**
- [ ] `Strict-Transport-Security`
- [ ] `X-Content-Type-Options: nosniff`
- [ ] `X-Frame-Options: DENY`
**Результат:** [ ] ✅ / [ ] ❌
---
### 8.4 Exposed Services Check
```bash
# Перевірити що БД не доступна ззовні
nmap -p 5432 app.daarion.space
# Очікуємо: closed або filtered
# Перевірити Redis
nmap -p 6379 app.daarion.space
# Очікуємо: closed або filtered
```
**Результат:** [ ] ✅ / [ ] ❌
---
## 🎯 9. Performance Baseline
### 9.1 Response Times
```bash
# Homepage
time curl -o /dev/null -s -w "Total: %{time_total}s\n" https://app.daarion.space/
# API endpoint
time curl -o /dev/null -s -w "Total: %{time_total}s\n" https://app.daarion.space/city/rooms
```
**Записати baseline:**
- Homepage: _______ s
- City Rooms API: _______ s
**Очікувані значення:**
- < 1s для Homepage
- < 0.5s для API
**Результат:** [ ] ✅ / [ ] ❌
---
### 9.2 Resource Usage
```bash
# Docker stats
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
```
**Перевірити:**
- [ ] CPU usage < 50% на всіх контейнерах
- [ ] Memory usage в межах allocated limits
**Результат:** [ ] ✅ / [ ] ❌
---
## 🎉 Final Score
**Total checks:** _______ / _______
**Pass rate:** _______ %
**Status:** [ ] ✅ READY FOR PRODUCTION / [ ] ❌ ISSUES FOUND
---
## 📝 Notes & Issues
Записати всі знайдені проблеми:
1. _____________________________
2. _____________________________
3. _____________________________
---
## 📚 Next Steps
Якщо всі тести пройдені:
1. ➡️ Створити production backup
2. ➡️ Налаштувати моніторинг alerts
3. ➡️ Документувати runbook для operations
4. ➡️ Повідомити команду про готовність
Якщо є проблеми:
1. ➡️ Зафіксувати issues в tracker
2. ➡️ Prioritize critical vs non-critical
3. ➡️ Fix & re-run smoke tests
---
**Виконано:** _______________ (дата/час)
**Виконавець:** _______________ (ім'я)
**Версія:** 1.0.0