Files
mesh/NEXT_STEPS.md
Gilles Soulier 1d177e96a6 first
2026-01-05 13:20:54 +01:00

398 lines
9.5 KiB
Markdown

# Prochaines Étapes - Projet Mesh
**Date**: 2026-01-04
**Phase Actuelle**: Agent Rust ✅ COMPLET
**Phase Suivante**: Serveur Python + Tests E2E
---
## 🎉 Où en sommes-nous ?
### Composants Terminés
#### ✅ Agent Rust (100%)
- **WebSocket Client**: Connexion serveur + event routing
- **QUIC Endpoint**: TLS 1.3 + P2P handshake
- **File Transfer**: Chunking 256KB + Blake3 hash
- **Terminal Streaming**: PTY cross-platform
- **CLI**: run, send-file, share-terminal
- **Tests**: 14/14 passants
- **Documentation**: README, E2E_TEST, STATUS
**Binaire**: `agent/target/release/mesh-agent` (4,8 MB)
#### ✅ Infrastructure (100%)
- Docker Compose
- Pre-commit hooks
- VS Code snippets
- Documentation complète
#### 🟡 Serveur Python (~40%)
- Structure projet ✅
- Configuration ✅
- Health check API ✅
- **À faire**: Auth JWT, WebSocket, DB, P2P API
#### 🟡 Client React (~40%)
- Setup Vite + React ✅
- Thème Monokai ✅
- Routing ✅
- **À faire**: Auth UI, WebSocket, Chat, WebRTC
---
## 🎯 Prochaine Priorité: Serveur Python
### Objectif
Implémenter le **Control Plane** (serveur) pour permettre les tests E2E avec l'agent.
### Tâches Critiques
#### 1. Base de Données & Modèles (4h)
**Fichiers à créer**:
- `server/app/models/user.py`
- `server/app/models/room.py`
- `server/app/models/session.py`
- `server/alembic/versions/001_initial.py`
**Actions**:
- Définir modèles SQLAlchemy (User, Room, P2PSession)
- Créer migrations Alembic
- Tester connexion PostgreSQL
**Validation**:
```bash
cd server
poetry run alembic upgrade head
poetry run python -c "from app.models import User; print('OK')"
```
#### 2. Authentification JWT (4h)
**Fichiers à créer**:
- `server/app/auth/jwt.py`
- `server/app/api/auth.py`
- `server/app/schemas/auth.py`
**Actions**:
- Endpoints `/api/auth/register` et `/api/auth/login`
- Génération JWT avec PyJWT
- Password hashing avec bcrypt
- Middleware authentication
**Validation**:
```bash
curl -X POST http://localhost:8000/api/auth/register \
-H "Content-Type: application/json" \
-d '{"username":"test","password":"test123"}'
# Doit retourner: {"access_token": "...", "token_type": "bearer"}
```
#### 3. WebSocket Connection Manager (6h)
**Fichiers à créer**:
- `server/app/ws/manager.py`
- `server/app/ws/handlers/system.py`
- `server/app/ws/handlers/room.py`
- `server/app/ws/handlers/p2p.py`
**Actions**:
- ConnectionManager pour tracking clients WebSocket
- Event routing par type (system.*, room.*, p2p.*)
- Handlers pour system.hello, room.join, p2p.session.request
- Broadcast messages aux membres d'une room
**Validation**:
```bash
# Terminal 1
cd server
poetry run uvicorn app.main:app --reload
# Terminal 2 - Test WebSocket
wscat -c "ws://localhost:8000/ws?token=<jwt_token>"
> {"type":"system.hello","device_id":"test-device"}
# Doit retourner: {"type":"system.welcome",...}
```
#### 4. API P2P Session Creation (4h)
**Fichiers à créer**:
- `server/app/api/p2p.py`
- `server/app/schemas/p2p.py`
- `server/app/services/p2p.py`
**Actions**:
- Endpoint `POST /api/p2p/sessions`
- Génération session_token avec TTL (60-180s)
- Stockage session en DB avec expires_at
- Event `p2p.session.created` via WebSocket
**Validation**:
```bash
curl -X POST http://localhost:8000/api/p2p/sessions \
-H "Authorization: Bearer <jwt>" \
-H "Content-Type: application/json" \
-d '{
"kind": "file",
"target_device_id": "device-b",
"ttl": 120
}'
# Doit retourner:
# {
# "session_id": "abc123",
# "session_token": "xyz789",
# "expires_at": "2026-01-04T23:00:00Z",
# "endpoints": {
# "initiator": {"ip": "192.168.1.50", "port": 5000},
# "target": {"ip": "192.168.1.100", "port": 5000}
# }
# }
```
---
## 🧪 Tests E2E Agent ↔ Serveur
### Scénario 1: Connexion Agent → Serveur
**Prérequis**:
- Serveur running avec WebSocket
- Agent compilé avec config valide
**Test**:
```bash
# Terminal 1 - Serveur
cd server
poetry run uvicorn app.main:app --host 0.0.0.0 --port 8000
# Terminal 2 - Agent
cd agent
RUST_LOG=info ./target/release/mesh-agent run
```
**Résultat attendu**:
- Agent logs: `WebSocket connected`, `Sent system.hello`
- Serveur logs: `WebSocket client connected`, `Event: system.hello`
- Agent reçoit `system.welcome`
### Scénario 2: P2P Session Creation
**Test**:
```bash
# Terminal 1 - Agent A (daemon)
cd agent
RUST_LOG=info ./target/release/mesh-agent run
# Terminal 2 - Create P2P session (via API ou Web UI)
curl -X POST http://localhost:8000/api/p2p/sessions \
-H "Authorization: Bearer <jwt>" \
-d '{"kind":"file","target_device_id":"device-a","ttl":120}'
# Observer Agent A logs
# Attendu: "P2P session created: session_id=..., expires_in=120"
```
### Scénario 3: File Transfer E2E
**Test**:
```bash
# Terminal 1 - Agent A (daemon, récepteur)
RUST_LOG=info ./target/release/mesh-agent run
# Terminal 2 - Agent B (sender)
RUST_LOG=info ./target/release/mesh-agent send-file \
--session-id "session_from_server" \
--peer-addr "192.168.1.50:5000" \
--token "token_from_server" \
--file test.txt
```
**Résultat attendu**:
- Agent B: `Connecting to peer...`, `P2P connection established`, `File sent successfully!`
- Agent A: `Incoming QUIC connection`, `P2P handshake successful`, `File received`
- Hash Blake3 identique des deux côtés
---
## 📋 Checklist Phase Serveur
### Base de Données
- [ ] Modèles SQLAlchemy (User, Room, P2PSession)
- [ ] Migrations Alembic
- [ ] Connexion PostgreSQL testée
- [ ] CRUD operations (create, read, update, delete)
### Authentification
- [ ] Endpoint `/api/auth/register`
- [ ] Endpoint `/api/auth/login`
- [ ] JWT generation (access_token)
- [ ] Password hashing (bcrypt)
- [ ] Middleware auth pour routes protégées
### WebSocket
- [ ] ConnectionManager (tracking clients)
- [ ] Event routing par type
- [ ] Handler `system.hello``system.welcome`
- [ ] Handler `room.join``room.joined`
- [ ] Handler `p2p.session.request``p2p.session.created`
- [ ] Broadcast messages dans rooms
### API P2P
- [ ] Endpoint `POST /api/p2p/sessions`
- [ ] Génération session_token (JWT ou random)
- [ ] TTL management (expires_at)
- [ ] Event `p2p.session.created` via WebSocket
- [ ] Endpoint info (IP:port des peers)
### Tests
- [ ] Tests unitaires (pytest)
- [ ] Tests integration (DB, WebSocket)
- [ ] Tests E2E (Agent ↔ Serveur)
---
## 📚 Documentation à Consulter
### Pour Serveur Python
1. **[server/CLAUDE.md](server/CLAUDE.md)** - Guidelines serveur
2. **[docs/protocol_events_v_2.md](docs/protocol_events_v_2.md)** - Events WebSocket
3. **[docs/signaling_v_2.md](docs/signaling_v_2.md)** - P2P signaling
4. **[docs/security.md](docs/security.md)** - Modèle sécurité
### Pour Agent (référence)
1. **[agent/README.md](agent/README.md)** - Usage agent
2. **[agent/E2E_TEST.md](agent/E2E_TEST.md)** - Scénarios tests
3. **[docs/AGENT.md](docs/AGENT.md)** - Architecture agent
---
## 🚀 Commandes Utiles
### Serveur
```bash
# Installer dépendances
cd server
poetry install
# Migrations DB
poetry run alembic upgrade head
# Lancer serveur dev
poetry run uvicorn app.main:app --reload
# Tests
poetry run pytest
# Linter
poetry run ruff check .
```
### Agent (rappel)
```bash
# Compiler
cd agent
cargo build --release
# Tests
cargo test
# Lancer daemon
RUST_LOG=info ./target/release/mesh-agent run
```
### Docker Compose (full stack)
```bash
# Démarrer tous les services
docker-compose up -d
# Logs
docker-compose logs -f mesh-server
docker-compose logs -f postgres
# Arrêter
docker-compose down
```
---
## ⚠️ Points d'Attention
### Intégration Agent ↔ Serveur
1. **Event Format**:
- Serveur et Agent utilisent le même format JSON
- Champs: `type`, `id`, `timestamp`, `from`, `to`, `payload`
- Voir `server/app/schemas/events.py` et `agent/src/mesh/types.rs`
2. **Session Token Lifecycle**:
```
Client Web → POST /api/p2p/sessions
Serveur → Génère session_token (TTL 60-180s)
Serveur → Event p2p.session.created via WebSocket
Agent → Cache token localement
Agent → Valide token lors P2P_HELLO
```
3. **QUIC Endpoint Discovery**:
- Agent envoie son QUIC port au serveur (system.hello)
- Serveur stocke IP:port dans DB
- API P2P retourne endpoints des 2 peers
- Agents se connectent directement (P2P)
4. **Firewall/NAT**:
- Pour MVP: Tests LAN seulement
- Production: STUN/TURN à implémenter
- Port UDP QUIC doit être ouvert
---
## 🎯 Objectif Final MVP
**Définition of Done**:
- [ ] 2 utilisateurs peuvent s'authentifier
- [ ] Chat en temps réel fonctionne
- [ ] Appel audio/vidéo WebRTC établi
- [ ] **Fichier transféré via Agent QUIC** ← **VALIDABLE DÈS SERVEUR PRÊT**
- [ ] Terminal partagé en preview
- [ ] Notifications Gotify reçues
**Timeline Estimée**:
- Serveur Python: 2-3 semaines
- Client React: 2-3 semaines
- Tests E2E & Debug: 1 semaine
- **Total MVP**: 5-7 semaines
---
## 📞 Rappel Workflow
1. **Avant de commencer**:
- Lire CLAUDE.md du composant
- Choisir tâche dans TODO.md
- Utiliser `/clear` si changement de contexte
2. **Pendant développement**:
- Itérations courtes (1-2h max)
- Headers de traçabilité sur fichiers
- Commentaires en français
- Commits fréquents
3. **Après implémentation**:
- Tester (unit + integration)
- Mettre à jour DEVELOPMENT.md
- Mettre à jour TODO.md
- Documenter dans STATUS.md
---
**Principe Fondamental**:
> **La vérité du projet Mesh est dans les fichiers.** La conversation n'est qu'un outil temporaire.
---
**Dernière mise à jour**: 2026-01-04
**Prochaine action**: Implémenter Serveur Python (Phase 1: Base de Données & Modèles)