aissia/plans/PROMPT_WEBMODULE.md
StillHammer 18f4f16213 feat: Add WebModule for HTTP requests via IIO
Implements WebModule that allows other modules to make HTTP requests
through IIO pub/sub messaging system.

Features:
- HTTP GET/POST support via existing HttpClient
- Request/response via IIO topics (web:request/web:response)
- Security: blocks localhost and private IPs
- Statistics tracking (total, success, failed)
- Hot-reload state preservation
- Custom headers and timeout configuration

Module architecture:
- WebModule.h/cpp: 296 lines total (within 300 line limit)
- config/web.json: Configuration file
- 10 integration tests (TI_WEB_001 to TI_WEB_010)

Tests: 120/120 passing (110 existing + 10 new)

Protocol:
- Subscribe: web:request
- Publish: web:response
- Request fields: requestId, url, method, headers, body, timeoutMs
- Response fields: requestId, success, statusCode, body, error, durationMs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 17:15:46 +08:00

229 lines
6.9 KiB
Markdown

# Prompt pour Implémenter WebModule
Salut ! Je reprends l'implémentation du **WebModule** pour AISSIA.
## Contexte
AISSIA est un assistant vocal agentique en C++17 basé sur GroveEngine. Le projet utilise une architecture modulaire avec hot-reload et communication pub/sub via IIO.
**État actuel** :
- ✅ 6 modules fonctionnels (Scheduler, Notification, Monitoring, AI, Voice, Storage)
- ✅ 110/110 tests passent
- ✅ LLM Service avec Claude Sonnet 4
- ✅ HttpClient.hpp déjà implémenté et fonctionnel
## Objectif
Implémenter un **WebModule** qui permet aux autres modules de faire des requêtes HTTP de manière dynamique via IIO pub/sub.
## Plan d'Implémentation
Le plan complet est dans `plans/webmodule-implementation.md`. Lis-le attentivement avant de commencer.
**Résumé des étapes** :
### Phase 1: Core Module (1h)
1. Créer `src/modules/WebModule.h` (voir plan section 2.1)
2. Créer `src/modules/WebModule.cpp` (voir plan section 2.1)
3. Créer `config/web.json` (voir plan section 2.2)
4. Ajouter le module au `CMakeLists.txt`
5. Ajouter le module au `src/main.cpp`
### Phase 2: Tests (1h)
6. Créer `tests/modules/WebModuleTests.cpp` (10 tests - voir plan section 2.3)
7. Exécuter et valider tous les tests
### Phase 3: Documentation (30min)
8. Mettre à jour `README.md`
9. Mettre à jour `CLAUDE.md`
10. Créer un exemple d'utilisation
## Contraintes Importantes
### Règles GroveEngine (voir CLAUDE.md)
- **200-300 lignes max** par module
- **Logique métier pure** : pas de threading/network dans les modules
- **Communication JSON** via IIO pub/sub
- **Hot-reload ready** : sérialiser l'état dans `getState()` / `setState()`
### Protocole IIO
**Requête** (`web:request`) :
```json
{
"requestId": "unique-id-123",
"url": "https://api.example.com/data",
"method": "GET",
"headers": {},
"body": "",
"timeoutMs": 30000
}
```
**Réponse** (`web:response`) :
```json
{
"requestId": "unique-id-123",
"success": true,
"statusCode": 200,
"body": "{...}",
"durationMs": 234
}
```
### Réutiliser l'existant
**IMPORTANT** : Utilise `src/shared/http/HttpClient.hpp` qui est déjà implémenté et fonctionnel. Regarde comment il est utilisé dans `src/shared/llm/ClaudeProvider.cpp` pour un exemple.
Exemple d'utilisation :
```cpp
#include "../shared/http/HttpClient.hpp"
HttpClient client;
HttpResponse response = client.get("https://example.com");
// response.statusCode, response.body, response.headers
```
## Fichiers à Créer/Modifier
**Nouveaux fichiers** :
- [ ] `src/modules/WebModule.h`
- [ ] `src/modules/WebModule.cpp`
- [ ] `config/web.json`
- [ ] `tests/modules/WebModuleTests.cpp`
**Fichiers à modifier** :
- [ ] `CMakeLists.txt` (ajouter WebModule target)
- [ ] `src/main.cpp` (charger WebModule)
- [ ] `README.md` (documenter WebModule)
## Tests à Implémenter
Liste des 10 tests (voir plan section 2.3) :
1. `TI_WEB_001_SimpleGetRequest`
2. `TI_WEB_002_PostRequestWithBody`
3. `TI_WEB_003_InvalidUrlHandling`
4. `TI_WEB_004_TimeoutHandling`
5. `TI_WEB_005_MultipleConcurrentRequests`
6. `TI_WEB_006_RequestIdTracking`
7. `TI_WEB_007_StatisticsTracking`
8. `TI_WEB_008_StateSerialization`
9. `TI_WEB_009_ConfigurationLoading`
10. `TI_WEB_010_ErrorResponseFormat`
Utilise le pattern des tests existants (voir `tests/modules/AIModuleTests.cpp` pour exemple).
## Validation
Avant de considérer le travail terminé :
### Build & Tests
```bash
# Build
cmake --build build --target modules -j4
cmake --build build --target aissia_tests -j4
# Tests
./build/tests/aissia_tests "[web]"
# Vérifier que tous les tests passent toujours
./build/tests/aissia_tests --reporter compact
```
**Critère de succès** : 120/120 tests passent (110 existants + 10 nouveaux)
### Hot-Reload
Teste manuellement le hot-reload :
```bash
# 1. Lance AISSIA
./run.sh
# 2. Modifie WebModule.cpp (change un log)
# 3. Rebuild juste le module
cmake --build build --target modules
# 4. Vérifie que le module se recharge automatiquement
# Les stats doivent être préservées
```
### Code Review
- [ ] Pas de warnings de compilation
- [ ] Code suit le style existant
- [ ] Commentaires clairs
- [ ] Gestion d'erreurs complète
- [ ] Logs informatifs
## Commandes Utiles
```bash
# Build complet
cmake -B build && cmake --build build -j4
# Build modules seulement
cmake --build build --target modules
# Tests avec filtre
./build/tests/aissia_tests "[web]"
# Tous les tests
./build/tests/aissia_tests --reporter compact
# Git
git add -A
git commit -m "feat: Add WebModule for HTTP requests via IIO"
git push
```
## Ressources
### Fichiers de référence
- `src/modules/AIModule.cpp` - Exemple de module bien structuré
- `src/modules/MonitoringModule.cpp` - Exemple de pub/sub IIO
- `src/shared/http/HttpClient.hpp` - Client HTTP à réutiliser
- `src/shared/llm/ClaudeProvider.cpp` - Utilisation de HttpClient
- `tests/modules/AIModuleTests.cpp` - Pattern de tests
### Documentation
- `plans/webmodule-implementation.md` - Plan complet détaillé
- `docs/GROVEENGINE_GUIDE.md` - Guide GroveEngine complet
- `CLAUDE.md` - Règles de développement
## Notes Importantes
1. **Pas de threading** : Les requêtes HTTP sont synchrones via HttpClient. C'est OK car le module process() est appelé dans la main loop.
2. **State management** : Les stats (total, success, failed) doivent être sauvegardées dans `getState()` et restaurées dans `setState()` pour le hot-reload.
3. **Error handling** : Toutes les erreurs doivent être catchées et transformées en message `web:response` avec `success: false`.
4. **Request ID** : Le `requestId` permet aux modules clients de matcher les requêtes/réponses. C'est crucial pour le pub/sub asynchrone.
5. **Testing** : Utilise MockIO pour les tests (voir tests existants). Pas besoin de vrai serveur HTTP, les tests peuvent mocker les réponses.
## Questions Fréquentes
**Q: Comment tester sans vrai serveur HTTP ?**
R: Utilise MockIO pour injecter des messages `web:request` et vérifier les `web:response`. Tu peux aussi créer un simple echo server en Python pour les tests d'intégration (optionnel).
**Q: Le module doit-il gérer le retry ?**
R: Non, pas dans la v1. Le module client doit gérer le retry s'il en a besoin.
**Q: Faut-il supporter websockets ?**
R: Non, seulement HTTP/HTTPS classique pour la v1.
**Q: Cache HTTP ?**
R: Non pour la v1. C'est une extension future (voir plan section 7).
---
**Bonne chance !** Suis le plan étape par étape et n'hésite pas si tu as des questions. L'objectif est d'avoir un module clean, testé, et qui s'intègre parfaitement avec l'architecture existante.
**Timeline suggérée** :
- Jour 1 : Phase 1 (Core Module)
- Jour 2 : Phase 2 (Tests)
- Jour 3 : Phase 3 (Documentation) + Validation finale
**Auteur du plan** : Claude Code (Session précédente)
**Date** : 2025-11-28