feat: AISSIA rename and codebase updates
- Renamed project from Celuna to AISSIA - Updated all documentation and configuration files - Codebase improvements and fixes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
ce2b25a599
commit
d17ee5fbdc
@ -1,7 +1,7 @@
|
|||||||
# Analyse des Alternatives Techniques - AISSIA
|
# Analyse des Alternatives Techniques - CELUNA
|
||||||
|
|
||||||
**Date:** 27 octobre 2025
|
**Date:** 27 octobre 2025
|
||||||
**Contexte:** Analyse comparative de toutes les options techniques discutées pour le développement d'AISSIA
|
**Contexte:** Analyse comparative de toutes les options techniques discutées pour le développement d'CELUNA
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -140,7 +140,7 @@ ImGui UI (C++)
|
|||||||
↓ IPC (IntraIO)
|
↓ IPC (IntraIO)
|
||||||
WarFactory Engine Core
|
WarFactory Engine Core
|
||||||
↓ DLL/SO Loader
|
↓ DLL/SO Loader
|
||||||
AISSIA Modules (.dll/.so)
|
CELUNA Modules (.dll/.so)
|
||||||
- MonitoringModule.dll
|
- MonitoringModule.dll
|
||||||
- SchedulerModule.dll
|
- SchedulerModule.dll
|
||||||
- AIModule.dll
|
- AIModule.dll
|
||||||
@ -238,7 +238,7 @@ Native OS APIs
|
|||||||
// ui-imgui.dll module
|
// ui-imgui.dll module
|
||||||
class UIModule : public IModule {
|
class UIModule : public IModule {
|
||||||
void Render() {
|
void Render() {
|
||||||
ImGui::Begin("AISSIA Dashboard");
|
ImGui::Begin("CELUNA Dashboard");
|
||||||
// Render planning, tasks, settings
|
// Render planning, tasks, settings
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
}
|
}
|
||||||
@ -371,7 +371,7 @@ MainWindow window; // Qt Widgets
|
|||||||
|
|
||||||
**Architecture :**
|
**Architecture :**
|
||||||
```cpp
|
```cpp
|
||||||
// aissia.exe - tout en un
|
// celuna.exe - tout en un
|
||||||
int main() {
|
int main() {
|
||||||
MonitoringSystem monitor;
|
MonitoringSystem monitor;
|
||||||
SchedulerSystem scheduler;
|
SchedulerSystem scheduler;
|
||||||
@ -439,7 +439,7 @@ Frontend
|
|||||||
|
|
||||||
**Architecture :**
|
**Architecture :**
|
||||||
```
|
```
|
||||||
aissia-core.exe (Engine WarFactory)
|
celuna-core.exe (Engine WarFactory)
|
||||||
↓ DLL/SO Loader
|
↓ DLL/SO Loader
|
||||||
modules/
|
modules/
|
||||||
monitoring.dll
|
monitoring.dll
|
||||||
@ -493,9 +493,9 @@ Similaire à Option 3 mais sans l'architecture complète WarFactory (IEngine, IM
|
|||||||
**Architecture :**
|
**Architecture :**
|
||||||
```
|
```
|
||||||
User Machine
|
User Machine
|
||||||
├── aissia-core.exe
|
├── celuna-core.exe
|
||||||
├── modules/*.dll
|
├── modules/*.dll
|
||||||
├── aissia.db (SQLite)
|
├── celuna.db (SQLite)
|
||||||
└── gameconfig.json
|
└── gameconfig.json
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -552,8 +552,8 @@ S3 Storage
|
|||||||
**Architecture :**
|
**Architecture :**
|
||||||
```
|
```
|
||||||
User Machine (Primary)
|
User Machine (Primary)
|
||||||
├── aissia-core.exe (local)
|
├── celuna-core.exe (local)
|
||||||
├── aissia.db (SQLite local)
|
├── celuna.db (SQLite local)
|
||||||
└── Sync Service (optionnel)
|
└── Sync Service (optionnel)
|
||||||
↓ HTTPS (si activé)
|
↓ HTTPS (si activé)
|
||||||
Cloud Sync Server (optionnel)
|
Cloud Sync Server (optionnel)
|
||||||
@ -657,7 +657,7 @@ User Machine A User Machine B
|
|||||||
└─────────────┬───────────────────────┘
|
└─────────────┬───────────────────────┘
|
||||||
│ IntraIO (IPC local)
|
│ IntraIO (IPC local)
|
||||||
┌─────────────▼───────────────────────┐
|
┌─────────────▼───────────────────────┐
|
||||||
│ aissia-core.exe │
|
│ celuna-core.exe │
|
||||||
│ (WarFactory Engine) │
|
│ (WarFactory Engine) │
|
||||||
│ ┌────────────────────────────────┐ │
|
│ ┌────────────────────────────────┐ │
|
||||||
│ │ ICoordinationModule │ │
|
│ │ ICoordinationModule │ │
|
||||||
@ -728,11 +728,11 @@ User Machine A User Machine B
|
|||||||
#### 7. **Simplicité Déploiement**
|
#### 7. **Simplicité Déploiement**
|
||||||
✅ **Copier-coller dossier = fonctionne**
|
✅ **Copier-coller dossier = fonctionne**
|
||||||
```
|
```
|
||||||
aissia/
|
celuna/
|
||||||
├── aissia-core.exe
|
├── celuna-core.exe
|
||||||
├── modules/*.dll
|
├── modules/*.dll
|
||||||
├── gameconfig.json
|
├── gameconfig.json
|
||||||
└── aissia.db
|
└── celuna.db
|
||||||
```
|
```
|
||||||
- Pas de Docker, K8s, services cloud
|
- Pas de Docker, K8s, services cloud
|
||||||
- Pas d'installation complexe
|
- Pas d'installation complexe
|
||||||
@ -878,7 +878,7 @@ aissia/
|
|||||||
### Maintenabilité
|
### Maintenabilité
|
||||||
- ✅ **Modules indépendants** : Build autonome `cmake .`
|
- ✅ **Modules indépendants** : Build autonome `cmake .`
|
||||||
- ✅ **Tests isolés** : Chaque module testable seul
|
- ✅ **Tests isolés** : Chaque module testable seul
|
||||||
- ✅ **Documentation complète** : `aissia/docs/` (copié WarFactory)
|
- ✅ **Documentation complète** : `celuna/docs/` (copié WarFactory)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
36
CDCDraft.md
36
CDCDraft.md
@ -1,4 +1,4 @@
|
|||||||
# Cahier des Charges - AISSIA (AI Smart Schedule & Interactive Assistant)
|
# Cahier des Charges - CELUNA (AI Smart Schedule & Interactive Assistant)
|
||||||
|
|
||||||
**Version:** 0.4 - Architecture Hybride Proposée
|
**Version:** 0.4 - Architecture Hybride Proposée
|
||||||
**Date:** 27 octobre 2025
|
**Date:** 27 octobre 2025
|
||||||
@ -132,7 +132,7 @@ Assistant personnel intelligent et proactif qui :
|
|||||||
|
|
||||||
### 4.1 Proposition Architecturale : Architecture Hybride WarFactory + WASM
|
### 4.1 Proposition Architecturale : Architecture Hybride WarFactory + WASM
|
||||||
|
|
||||||
**PROPOSITION ARCHITECTURALE** : AISSIA pourrait réutiliser l'architecture modulaire WarFactory avec compilation multi-target optionnelle (DLL/SO/WASM).
|
**PROPOSITION ARCHITECTURALE** : CELUNA pourrait réutiliser l'architecture modulaire WarFactory avec compilation multi-target optionnelle (DLL/SO/WASM).
|
||||||
|
|
||||||
**⚠️ IMPORTANT - Phases d'implémentation :**
|
**⚠️ IMPORTANT - Phases d'implémentation :**
|
||||||
- **Phase 1 (local_dev) = OBLIGATOIRE** : Cible principale MVP avec WarFactory DLL Windows uniquement
|
- **Phase 1 (local_dev) = OBLIGATOIRE** : Cible principale MVP avec WarFactory DLL Windows uniquement
|
||||||
@ -156,7 +156,7 @@ UN SEUL CODE, TROIS DÉPLOIEMENTS !
|
|||||||
- 🎯 **Développement 100% Windows** : Visual Studio 2022, DLL, ImGui, hot-reload 0.4ms (validé)
|
- 🎯 **Développement 100% Windows** : Visual Studio 2022, DLL, ImGui, hot-reload 0.4ms (validé)
|
||||||
- ⚠️ **Modules C++ écrits UNE FOIS** : Compilés en DLL (dev), SO (serveur), WASM (browser) (hypothétique - à tester)
|
- ⚠️ **Modules C++ écrits UNE FOIS** : Compilés en DLL (dev), SO (serveur), WASM (browser) (hypothétique - à tester)
|
||||||
- ⚠️ **Déploiement flexible** : gameconfig.json bascule entre mode `local_dev` et `production_pwa` (hypothétique)
|
- ⚠️ **Déploiement flexible** : gameconfig.json bascule entre mode `local_dev` et `production_pwa` (hypothétique)
|
||||||
- ✅ **MVP = Mode Local OBLIGATOIRE** : aissia-core.exe + DLL + ImGui + SQLite ($0 coût)
|
- ✅ **MVP = Mode Local OBLIGATOIRE** : celuna-core.exe + DLL + ImGui + SQLite ($0 coût)
|
||||||
- ⚠️ **Production optionnelle CONDITIONNELLE** : React PWA + WASM client + Docker serveur ($3-5/mois) - SI Phase 2 validée
|
- ⚠️ **Production optionnelle CONDITIONNELLE** : React PWA + WASM client + Docker serveur ($3-5/mois) - SI Phase 2 validée
|
||||||
- ⚠️ **Cross-platform automatique** : Docker + WASM = tourne partout sans effort (hypothétique - complexité à évaluer)
|
- ⚠️ **Cross-platform automatique** : Docker + WASM = tourne partout sans effort (hypothétique - complexité à évaluer)
|
||||||
- ⚠️ **Mobile optionnel** : PWA installable (Phase 3+, SEULEMENT si besoin validé)
|
- ⚠️ **Mobile optionnel** : PWA installable (Phase 3+, SEULEMENT si besoin validé)
|
||||||
@ -174,7 +174,7 @@ UN SEUL CODE, TROIS DÉPLOIEMENTS !
|
|||||||
|
|
||||||
### 4.2 Modes de Déploiement
|
### 4.2 Modes de Déploiement
|
||||||
|
|
||||||
**AISSIA propose DEUX modes de déploiement distincts, potentiellement sélectionnables via `gameconfig.json` :**
|
**CELUNA propose DEUX modes de déploiement distincts, potentiellement sélectionnables via `gameconfig.json` :**
|
||||||
|
|
||||||
**⚠️ Clarification priorités :**
|
**⚠️ Clarification priorités :**
|
||||||
- **Mode 1 (local_dev) = OBLIGATOIRE** : Cible MVP, sera implémenté en Phase 1
|
- **Mode 1 (local_dev) = OBLIGATOIRE** : Cible MVP, sera implémenté en Phase 1
|
||||||
@ -187,7 +187,7 @@ UN SEUL CODE, TROIS DÉPLOIEMENTS !
|
|||||||
┌─────────────────────────────────────┐
|
┌─────────────────────────────────────┐
|
||||||
│ Windows PC │
|
│ Windows PC │
|
||||||
│ ┌───────────────────────────────┐ │
|
│ ┌───────────────────────────────┐ │
|
||||||
│ │ aissia-core.exe │ │
|
│ │ celuna-core.exe │ │
|
||||||
│ │ (WarFactory Engine) │ │
|
│ │ (WarFactory Engine) │ │
|
||||||
│ │ ├─ IEngine (DebugEngine) │ │
|
│ │ ├─ IEngine (DebugEngine) │ │
|
||||||
│ │ ├─ IModuleSystem (Sequential)│ │
|
│ │ ├─ IModuleSystem (Sequential)│ │
|
||||||
@ -202,14 +202,14 @@ UN SEUL CODE, TROIS DÉPLOIEMENTS !
|
|||||||
│ │ ├─ storage.dll │ │
|
│ │ ├─ storage.dll │ │
|
||||||
│ │ └─ ui-imgui.dll │ │
|
│ │ └─ ui-imgui.dll │ │
|
||||||
│ └───────────────────────────────┘ │
|
│ └───────────────────────────────┘ │
|
||||||
│ SQLite local (aissia.db) │
|
│ SQLite local (celuna.db) │
|
||||||
└─────────────────────────────────────┘
|
└─────────────────────────────────────┘
|
||||||
```
|
```
|
||||||
|
|
||||||
**Caractéristiques :**
|
**Caractéristiques :**
|
||||||
- ✅ **Hot-reload** : 0.4ms (750,000x plus rapide que rebuild complet)
|
- ✅ **Hot-reload** : 0.4ms (750,000x plus rapide que rebuild complet)
|
||||||
- ✅ **UI** : Dear ImGui (C++, intégré WarFactory)
|
- ✅ **UI** : Dear ImGui (C++, intégré WarFactory)
|
||||||
- ✅ **Storage** : SQLite local (aissia.db)
|
- ✅ **Storage** : SQLite local (celuna.db)
|
||||||
- ✅ **Coût** : $0 (tout local)
|
- ✅ **Coût** : $0 (tout local)
|
||||||
- ✅ **Privacy** : Données jamais uploadées (sauf appels Claude API)
|
- ✅ **Privacy** : Données jamais uploadées (sauf appels Claude API)
|
||||||
- ✅ **Performance** : Native C++ (pas de WASM overhead)
|
- ✅ **Performance** : Native C++ (pas de WASM overhead)
|
||||||
@ -282,7 +282,7 @@ UN SEUL CODE, TROIS DÉPLOIEMENTS !
|
|||||||
- **CI/CD** : GitHub Actions
|
- **CI/CD** : GitHub Actions
|
||||||
|
|
||||||
#### Mode `local_dev` - Modules C++ (DLL)
|
#### Mode `local_dev` - Modules C++ (DLL)
|
||||||
- **Core Engine** : WarFactory (aissia-core.exe)
|
- **Core Engine** : WarFactory (celuna-core.exe)
|
||||||
- IEngine (DebugEngine)
|
- IEngine (DebugEngine)
|
||||||
- IModuleSystem (SequentialModuleSystem)
|
- IModuleSystem (SequentialModuleSystem)
|
||||||
- IIO (IntraIO pour communication locale)
|
- IIO (IntraIO pour communication locale)
|
||||||
@ -292,9 +292,9 @@ UN SEUL CODE, TROIS DÉPLOIEMENTS !
|
|||||||
- `scheduler.dll` : Algorithmes planning, détection procrastination
|
- `scheduler.dll` : Algorithmes planning, détection procrastination
|
||||||
- `ai.dll` : Claude Haiku API integration
|
- `ai.dll` : Claude Haiku API integration
|
||||||
- `voice.dll` : SAPI TTS (Windows) + Whisper.cpp STT
|
- `voice.dll` : SAPI TTS (Windows) + Whisper.cpp STT
|
||||||
- `storage.dll` : SQLite local (aissia.db)
|
- `storage.dll` : SQLite local (celuna.db)
|
||||||
- `ui-imgui.dll` : Interface ImGui
|
- `ui-imgui.dll` : Interface ImGui
|
||||||
- **Base de données** : SQLite local (aissia.db)
|
- **Base de données** : SQLite local (celuna.db)
|
||||||
- **Coût** : $0 (tout local, sauf appels Claude API $10-20/mois)
|
- **Coût** : $0 (tout local, sauf appels Claude API $10-20/mois)
|
||||||
|
|
||||||
#### Mode `production_pwa` - Backend Serveur (SO)
|
#### Mode `production_pwa` - Backend Serveur (SO)
|
||||||
@ -423,7 +423,7 @@ cmake -B build-windows -G "Visual Studio 17 2022"
|
|||||||
cmake --build build-windows --config Release
|
cmake --build build-windows --config Release
|
||||||
|
|
||||||
# Build SO (serveur Linux via Docker)
|
# Build SO (serveur Linux via Docker)
|
||||||
docker build -t aissia-backend -f docker/Dockerfile.backend .
|
docker build -t celuna-backend -f docker/Dockerfile.backend .
|
||||||
|
|
||||||
# Build WASM (client browser via Emscripten)
|
# Build WASM (client browser via Emscripten)
|
||||||
emcmake cmake -B build-wasm
|
emcmake cmake -B build-wasm
|
||||||
@ -632,7 +632,7 @@ Le mode `local_dev` seul reste une excellente solution pour le besoin initial (h
|
|||||||
└────────────────────┴────────────────────┘
|
└────────────────────┴────────────────────┘
|
||||||
│
|
│
|
||||||
Tous accèdent à la même PWA
|
Tous accèdent à la même PWA
|
||||||
https://aissia.app
|
https://celuna.app
|
||||||
|
|
||||||
┌───────────────────────────────────────────────────────────────┐
|
┌───────────────────────────────────────────────────────────────┐
|
||||||
│ SERVICES EXTERNES │
|
│ SERVICES EXTERNES │
|
||||||
@ -811,7 +811,7 @@ Schedule
|
|||||||
**Objectif** : Version locale fonctionnelle avec hot-reload WarFactory (mode `local_dev` DLL uniquement)
|
**Objectif** : Version locale fonctionnelle avec hot-reload WarFactory (mode `local_dev` DLL uniquement)
|
||||||
|
|
||||||
**Core Engine :**
|
**Core Engine :**
|
||||||
- [ ] aissia-core.exe (WarFactory engine)
|
- [ ] celuna-core.exe (WarFactory engine)
|
||||||
- IEngine (DebugEngine)
|
- IEngine (DebugEngine)
|
||||||
- IModuleSystem (SequentialModuleSystem)
|
- IModuleSystem (SequentialModuleSystem)
|
||||||
- IIO (IntraIO)
|
- IIO (IntraIO)
|
||||||
@ -835,7 +835,7 @@ Schedule
|
|||||||
- Whisper.cpp STT (speech-to-text local)
|
- Whisper.cpp STT (speech-to-text local)
|
||||||
- Subscribe "ai_response", speak()
|
- Subscribe "ai_response", speak()
|
||||||
- [ ] StorageModule.dll
|
- [ ] StorageModule.dll
|
||||||
- SQLite local (aissia.db)
|
- SQLite local (celuna.db)
|
||||||
- CRUD tâches, historique, métriques
|
- CRUD tâches, historique, métriques
|
||||||
- [ ] UIModule-ImGui.dll
|
- [ ] UIModule-ImGui.dll
|
||||||
- Dear ImGui interface
|
- Dear ImGui interface
|
||||||
@ -944,7 +944,7 @@ Schedule
|
|||||||
## 8. KPIs de Succès
|
## 8. KPIs de Succès
|
||||||
|
|
||||||
### Phase 1 - MVP Local
|
### Phase 1 - MVP Local
|
||||||
- ✅ aissia-core.exe fonctionnel (WarFactory engine)
|
- ✅ celuna-core.exe fonctionnel (WarFactory engine)
|
||||||
- ✅ 6 modules DLL opérationnels (monitoring, scheduler, ai, voice, storage, ui)
|
- ✅ 6 modules DLL opérationnels (monitoring, scheduler, ai, voice, storage, ui)
|
||||||
- ✅ Hot-reload 0.4ms validé
|
- ✅ Hot-reload 0.4ms validé
|
||||||
- ✅ Utilisation personnelle quotidienne (dogfooding)
|
- ✅ Utilisation personnelle quotidienne (dogfooding)
|
||||||
@ -985,7 +985,7 @@ MÊME code C++ (IModule WarFactory)
|
|||||||
- **Dev** : Windows 10/11, Visual Studio 2022, WarFactory engine
|
- **Dev** : Windows 10/11, Visual Studio 2022, WarFactory engine
|
||||||
- **Modules** : DLL (monitoring, scheduler, ai, voice, storage, ui-imgui)
|
- **Modules** : DLL (monitoring, scheduler, ai, voice, storage, ui-imgui)
|
||||||
- **UI** : Dear ImGui (C++, intégré)
|
- **UI** : Dear ImGui (C++, intégré)
|
||||||
- **Storage** : SQLite local (aissia.db)
|
- **Storage** : SQLite local (celuna.db)
|
||||||
- **Coût** : $0 hosting + $10-20/mois Claude API
|
- **Coût** : $0 hosting + $10-20/mois Claude API
|
||||||
|
|
||||||
**Mode 2 : `production_pwa` (Phase 3 - Optionnel) :**
|
**Mode 2 : `production_pwa` (Phase 3 - Optionnel) :**
|
||||||
@ -1029,7 +1029,7 @@ MÊME code C++ (IModule WarFactory)
|
|||||||
- Vérifier performance WASM acceptable
|
- Vérifier performance WASM acceptable
|
||||||
3. **Création structure projet** (si POC validé) :
|
3. **Création structure projet** (si POC validé) :
|
||||||
```
|
```
|
||||||
aissia/
|
celuna/
|
||||||
├── modules/ # C++ modules sources
|
├── modules/ # C++ modules sources
|
||||||
│ ├── SchedulerModule/
|
│ ├── SchedulerModule/
|
||||||
│ ├── StorageModule/
|
│ ├── StorageModule/
|
||||||
@ -1130,7 +1130,7 @@ MÊME code C++ (IModule WarFactory)
|
|||||||
- gameconfig.json mode `local_dev` uniquement
|
- gameconfig.json mode `local_dev` uniquement
|
||||||
|
|
||||||
2. **Implémentation Phase 1** :
|
2. **Implémentation Phase 1** :
|
||||||
- aissia-core.exe (WarFactory engine)
|
- celuna-core.exe (WarFactory engine)
|
||||||
- 6 modules DLL (monitoring, scheduler, ai, voice, storage, ui-imgui)
|
- 6 modules DLL (monitoring, scheduler, ai, voice, storage, ui-imgui)
|
||||||
- Validation dogfooding usage personnel
|
- Validation dogfooding usage personnel
|
||||||
|
|
||||||
|
|||||||
12
CLAUDE.md
12
CLAUDE.md
@ -1,6 +1,6 @@
|
|||||||
# AISSIA - Assistant Personnel Intelligent
|
# Celuna AI by Etheryale 🌙✨
|
||||||
|
|
||||||
Assistant pour gérer le temps, l'hyperfocus et l'apprentissage de langues. Basé sur **GroveEngine** (C++17 hot-reload module system).
|
Assistant céleste pour gérer le temps, l'hyperfocus et l'apprentissage de langues. Basé sur **GroveEngine** (C++17 hot-reload module system).
|
||||||
|
|
||||||
## Statut
|
## Statut
|
||||||
|
|
||||||
@ -35,7 +35,7 @@ Assistant pour gérer le temps, l'hyperfocus et l'apprentissage de langues. Bas
|
|||||||
## Structure
|
## Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
Aissia/
|
Celuna/
|
||||||
├── src/
|
├── src/
|
||||||
│ ├── main.cpp # Main loop 10Hz + hot-reload
|
│ ├── main.cpp # Main loop 10Hz + hot-reload
|
||||||
│ └── modules/ # Modules implémentés
|
│ └── modules/ # Modules implémentés
|
||||||
@ -50,13 +50,13 @@ Aissia/
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
cmake -B build && cmake --build build -j4
|
cmake -B build && cmake --build build -j4
|
||||||
./build/aissia
|
./build/celuna
|
||||||
|
|
||||||
# Hot-reload: rebuild modules seulement
|
# Hot-reload: rebuild modules seulement
|
||||||
cmake --build build --target modules
|
cmake --build build --target modules
|
||||||
|
|
||||||
# Mode MCP Server (expose tools via JSON-RPC stdio)
|
# Mode MCP Server (expose tools via JSON-RPC stdio)
|
||||||
./build/aissia --mcp-server
|
./build/celuna --mcp-server
|
||||||
```
|
```
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
@ -64,6 +64,6 @@ cmake --build build --target modules
|
|||||||
| Doc | Contenu |
|
| Doc | Contenu |
|
||||||
|-----|---------|
|
|-----|---------|
|
||||||
| `docs/GROVEENGINE_GUIDE.md` | API complète IModule, IIO, IDataNode, hot-reload |
|
| `docs/GROVEENGINE_GUIDE.md` | API complète IModule, IIO, IDataNode, hot-reload |
|
||||||
| `docs/project-overview.md` | Architecture AISSIA, phases dev |
|
| `docs/project-overview.md` | Architecture Celuna, phases dev |
|
||||||
| `docs/architecture/intelligent-document-retrieval.md` | AIAssistantModule: retrieval agentique, multi-provider LLM |
|
| `docs/architecture/intelligent-document-retrieval.md` | AIAssistantModule: retrieval agentique, multi-provider LLM |
|
||||||
| `README.md` | Quick start, roadmap |
|
| `README.md` | Quick start, roadmap |
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
cmake_minimum_required(VERSION 3.20)
|
cmake_minimum_required(VERSION 3.20)
|
||||||
project(Aissia VERSION 0.2.0 LANGUAGES CXX)
|
project(Celuna VERSION 0.2.0 LANGUAGES CXX)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
@ -60,31 +60,31 @@ FetchContent_MakeAvailable(httplib)
|
|||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
|
||||||
# LLM Providers Library
|
# LLM Providers Library
|
||||||
add_library(AissiaLLM STATIC
|
add_library(CelunaLLM STATIC
|
||||||
src/shared/llm/LLMProviderFactory.cpp
|
src/shared/llm/LLMProviderFactory.cpp
|
||||||
src/shared/llm/ClaudeProvider.cpp
|
src/shared/llm/ClaudeProvider.cpp
|
||||||
src/shared/llm/OpenAIProvider.cpp
|
src/shared/llm/OpenAIProvider.cpp
|
||||||
src/shared/llm/ToolRegistry.cpp
|
src/shared/llm/ToolRegistry.cpp
|
||||||
)
|
)
|
||||||
target_include_directories(AissiaLLM PUBLIC
|
target_include_directories(CelunaLLM PUBLIC
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||||
${httplib_SOURCE_DIR}
|
${httplib_SOURCE_DIR}
|
||||||
)
|
)
|
||||||
target_link_libraries(AissiaLLM PUBLIC
|
target_link_libraries(CelunaLLM PUBLIC
|
||||||
GroveEngine::impl
|
GroveEngine::impl
|
||||||
spdlog::spdlog
|
spdlog::spdlog
|
||||||
)
|
)
|
||||||
# Link Winsock for httplib on Windows
|
# Link Winsock for httplib on Windows
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
target_link_libraries(AissiaLLM PUBLIC ws2_32)
|
target_link_libraries(CelunaLLM PUBLIC ws2_32)
|
||||||
endif()
|
endif()
|
||||||
if(OPENSSL_FOUND)
|
if(OPENSSL_FOUND)
|
||||||
target_link_libraries(AissiaLLM PUBLIC OpenSSL::SSL OpenSSL::Crypto)
|
target_link_libraries(CelunaLLM PUBLIC OpenSSL::SSL OpenSSL::Crypto)
|
||||||
target_compile_definitions(AissiaLLM PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT)
|
target_compile_definitions(CelunaLLM PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Tools Library (Internal tools + FileSystem tools + MCP client + MCP server + MCP Server Tools)
|
# Tools Library (Internal tools + FileSystem tools + MCP client + MCP server + MCP Server Tools)
|
||||||
add_library(AissiaTools STATIC
|
add_library(CelunaTools STATIC
|
||||||
src/shared/tools/InternalTools.cpp
|
src/shared/tools/InternalTools.cpp
|
||||||
src/shared/tools/FileSystemTools.cpp
|
src/shared/tools/FileSystemTools.cpp
|
||||||
src/shared/tools/MCPServerTools.cpp
|
src/shared/tools/MCPServerTools.cpp
|
||||||
@ -92,51 +92,51 @@ add_library(AissiaTools STATIC
|
|||||||
src/shared/mcp/MCPClient.cpp
|
src/shared/mcp/MCPClient.cpp
|
||||||
src/shared/mcp/MCPServer.cpp
|
src/shared/mcp/MCPServer.cpp
|
||||||
)
|
)
|
||||||
target_include_directories(AissiaTools PUBLIC
|
target_include_directories(CelunaTools PUBLIC
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||||
)
|
)
|
||||||
target_link_libraries(AissiaTools PUBLIC
|
target_link_libraries(CelunaTools PUBLIC
|
||||||
GroveEngine::impl
|
GroveEngine::impl
|
||||||
spdlog::spdlog
|
spdlog::spdlog
|
||||||
)
|
)
|
||||||
|
|
||||||
# Platform Library (window tracking)
|
# Platform Library (window tracking)
|
||||||
add_library(AissiaPlatform STATIC
|
add_library(CelunaPlatform STATIC
|
||||||
src/shared/platform/WindowTrackerFactory.cpp
|
src/shared/platform/WindowTrackerFactory.cpp
|
||||||
)
|
)
|
||||||
target_include_directories(AissiaPlatform PUBLIC
|
target_include_directories(CelunaPlatform PUBLIC
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||||
)
|
)
|
||||||
target_link_libraries(AissiaPlatform PUBLIC
|
target_link_libraries(CelunaPlatform PUBLIC
|
||||||
spdlog::spdlog
|
spdlog::spdlog
|
||||||
)
|
)
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
target_link_libraries(AissiaPlatform PUBLIC psapi)
|
target_link_libraries(CelunaPlatform PUBLIC psapi)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Audio Library (TTS/STT)
|
# Audio Library (TTS/STT)
|
||||||
add_library(AissiaAudio STATIC
|
add_library(CelunaAudio STATIC
|
||||||
src/shared/audio/TTSEngineFactory.cpp
|
src/shared/audio/TTSEngineFactory.cpp
|
||||||
src/shared/audio/STTEngineFactory.cpp
|
src/shared/audio/STTEngineFactory.cpp
|
||||||
src/shared/audio/VoskSTTEngine.cpp
|
src/shared/audio/VoskSTTEngine.cpp
|
||||||
src/shared/audio/PocketSphinxEngine.cpp
|
src/shared/audio/PocketSphinxEngine.cpp
|
||||||
src/shared/audio/WhisperCppEngine.cpp
|
src/shared/audio/WhisperCppEngine.cpp
|
||||||
)
|
)
|
||||||
target_include_directories(AissiaAudio PUBLIC
|
target_include_directories(CelunaAudio PUBLIC
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||||
${httplib_SOURCE_DIR}
|
${httplib_SOURCE_DIR}
|
||||||
${nlohmann_json_SOURCE_DIR}/include
|
${nlohmann_json_SOURCE_DIR}/include
|
||||||
)
|
)
|
||||||
target_link_libraries(AissiaAudio PUBLIC
|
target_link_libraries(CelunaAudio PUBLIC
|
||||||
spdlog::spdlog
|
spdlog::spdlog
|
||||||
)
|
)
|
||||||
# Link Winsock for httplib on Windows
|
# Link Winsock for httplib on Windows
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
target_link_libraries(AissiaAudio PUBLIC ws2_32 sapi ole32)
|
target_link_libraries(CelunaAudio PUBLIC ws2_32 sapi ole32)
|
||||||
endif()
|
endif()
|
||||||
if(OPENSSL_FOUND)
|
if(OPENSSL_FOUND)
|
||||||
target_link_libraries(AissiaAudio PUBLIC OpenSSL::SSL OpenSSL::Crypto)
|
target_link_libraries(CelunaAudio PUBLIC OpenSSL::SSL OpenSSL::Crypto)
|
||||||
target_compile_definitions(AissiaAudio PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT)
|
target_compile_definitions(CelunaAudio PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT)
|
||||||
endif()
|
endif()
|
||||||
# Note: Si OpenSSL n'est pas trouvé, on ne définit PAS CPPHTTPLIB_OPENSSL_SUPPORT
|
# Note: Si OpenSSL n'est pas trouvé, on ne définit PAS CPPHTTPLIB_OPENSSL_SUPPORT
|
||||||
# httplib utilisera HTTP simple sans SSL
|
# httplib utilisera HTTP simple sans SSL
|
||||||
@ -145,8 +145,8 @@ endif()
|
|||||||
find_library(VOSK_LIBRARY vosk)
|
find_library(VOSK_LIBRARY vosk)
|
||||||
if(VOSK_LIBRARY)
|
if(VOSK_LIBRARY)
|
||||||
message(STATUS "Vosk found: ${VOSK_LIBRARY}")
|
message(STATUS "Vosk found: ${VOSK_LIBRARY}")
|
||||||
target_link_libraries(AissiaAudio PUBLIC ${VOSK_LIBRARY})
|
target_link_libraries(CelunaAudio PUBLIC ${VOSK_LIBRARY})
|
||||||
target_compile_definitions(AissiaAudio PRIVATE HAS_VOSK)
|
target_compile_definitions(CelunaAudio PRIVATE HAS_VOSK)
|
||||||
else()
|
else()
|
||||||
message(STATUS "Vosk not found - STT will use fallback engines only")
|
message(STATUS "Vosk not found - STT will use fallback engines only")
|
||||||
endif()
|
endif()
|
||||||
@ -156,9 +156,9 @@ find_library(POCKETSPHINX_LIBRARY pocketsphinx)
|
|||||||
find_library(SPHINXBASE_LIBRARY sphinxbase)
|
find_library(SPHINXBASE_LIBRARY sphinxbase)
|
||||||
if(POCKETSPHINX_LIBRARY AND SPHINXBASE_LIBRARY)
|
if(POCKETSPHINX_LIBRARY AND SPHINXBASE_LIBRARY)
|
||||||
message(STATUS "PocketSphinx found: ${POCKETSPHINX_LIBRARY}")
|
message(STATUS "PocketSphinx found: ${POCKETSPHINX_LIBRARY}")
|
||||||
target_link_libraries(AissiaAudio PUBLIC ${POCKETSPHINX_LIBRARY} ${SPHINXBASE_LIBRARY})
|
target_link_libraries(CelunaAudio PUBLIC ${POCKETSPHINX_LIBRARY} ${SPHINXBASE_LIBRARY})
|
||||||
target_compile_definitions(AissiaAudio PRIVATE HAVE_POCKETSPHINX)
|
target_compile_definitions(CelunaAudio PRIVATE HAVE_POCKETSPHINX)
|
||||||
target_include_directories(AissiaAudio PRIVATE /usr/include/pocketsphinx /usr/include/sphinxbase)
|
target_include_directories(CelunaAudio PRIVATE /usr/include/pocketsphinx /usr/include/sphinxbase)
|
||||||
else()
|
else()
|
||||||
message(STATUS "PocketSphinx not found - keyword spotting unavailable")
|
message(STATUS "PocketSphinx not found - keyword spotting unavailable")
|
||||||
endif()
|
endif()
|
||||||
@ -167,9 +167,9 @@ endif()
|
|||||||
find_library(WHISPER_LIBRARY whisper PATHS ${CMAKE_SOURCE_DIR}/external/whisper.cpp/build/src)
|
find_library(WHISPER_LIBRARY whisper PATHS ${CMAKE_SOURCE_DIR}/external/whisper.cpp/build/src)
|
||||||
if(WHISPER_LIBRARY)
|
if(WHISPER_LIBRARY)
|
||||||
message(STATUS "Whisper.cpp found: ${WHISPER_LIBRARY}")
|
message(STATUS "Whisper.cpp found: ${WHISPER_LIBRARY}")
|
||||||
target_link_libraries(AissiaAudio PUBLIC ${WHISPER_LIBRARY})
|
target_link_libraries(CelunaAudio PUBLIC ${WHISPER_LIBRARY})
|
||||||
target_compile_definitions(AissiaAudio PRIVATE HAVE_WHISPER_CPP)
|
target_compile_definitions(CelunaAudio PRIVATE HAVE_WHISPER_CPP)
|
||||||
target_include_directories(AissiaAudio PRIVATE
|
target_include_directories(CelunaAudio PRIVATE
|
||||||
${CMAKE_SOURCE_DIR}/external/whisper.cpp/include
|
${CMAKE_SOURCE_DIR}/external/whisper.cpp/include
|
||||||
${CMAKE_SOURCE_DIR}/external/whisper.cpp/ggml/include)
|
${CMAKE_SOURCE_DIR}/external/whisper.cpp/ggml/include)
|
||||||
else()
|
else()
|
||||||
@ -179,40 +179,40 @@ endif()
|
|||||||
# ============================================================================
|
# ============================================================================
|
||||||
# Infrastructure Services Library (linked into main)
|
# Infrastructure Services Library (linked into main)
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
add_library(AissiaServices STATIC
|
add_library(CelunaServices STATIC
|
||||||
src/services/LLMService.cpp
|
src/services/LLMService.cpp
|
||||||
src/services/StorageService.cpp
|
src/services/StorageService.cpp
|
||||||
src/services/PlatformService.cpp
|
src/services/PlatformService.cpp
|
||||||
src/services/VoiceService.cpp
|
src/services/VoiceService.cpp
|
||||||
src/services/STTService.cpp
|
src/services/STTService.cpp
|
||||||
)
|
)
|
||||||
target_include_directories(AissiaServices PUBLIC
|
target_include_directories(CelunaServices PUBLIC
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||||
)
|
)
|
||||||
target_link_libraries(AissiaServices PUBLIC
|
target_link_libraries(CelunaServices PUBLIC
|
||||||
GroveEngine::impl
|
GroveEngine::impl
|
||||||
spdlog::spdlog
|
spdlog::spdlog
|
||||||
AissiaLLM
|
CelunaLLM
|
||||||
AissiaTools
|
CelunaTools
|
||||||
AissiaPlatform
|
CelunaPlatform
|
||||||
AissiaAudio
|
CelunaAudio
|
||||||
SQLite::SQLite3
|
SQLite::SQLite3
|
||||||
)
|
)
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# Main Executable (with services)
|
# Main Executable (with services)
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
add_executable(aissia
|
add_executable(celuna
|
||||||
src/main.cpp
|
src/main.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(aissia PRIVATE
|
target_link_libraries(celuna PRIVATE
|
||||||
GroveEngine::impl
|
GroveEngine::impl
|
||||||
spdlog::spdlog
|
spdlog::spdlog
|
||||||
AissiaServices
|
CelunaServices
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(aissia PRIVATE
|
target_include_directories(celuna PRIVATE
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -370,12 +370,12 @@ endif()
|
|||||||
# Create data directory
|
# Create data directory
|
||||||
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/data)
|
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/data)
|
||||||
|
|
||||||
# Run Aissia
|
# Run Celuna
|
||||||
add_custom_target(run
|
add_custom_target(run
|
||||||
COMMAND $<TARGET_FILE:aissia>
|
COMMAND $<TARGET_FILE:celuna>
|
||||||
DEPENDS aissia modules
|
DEPENDS celuna modules
|
||||||
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
||||||
COMMENT "Running Aissia"
|
COMMENT "Running Celuna"
|
||||||
)
|
)
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
@ -391,7 +391,7 @@ add_executable(test_stt_engines
|
|||||||
tests/manual/test_stt_engines.cpp
|
tests/manual/test_stt_engines.cpp
|
||||||
)
|
)
|
||||||
target_link_libraries(test_stt_engines
|
target_link_libraries(test_stt_engines
|
||||||
AissiaAudio
|
CelunaAudio
|
||||||
spdlog::spdlog
|
spdlog::spdlog
|
||||||
)
|
)
|
||||||
# Link Winsock for httplib on Windows (already linked via AissiaLLM PUBLIC dependency)
|
# Link Winsock for httplib on Windows (already linked via CelunaLLM PUBLIC dependency)
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
# Plan : FileSystem Tools pour AISSIA
|
# Plan : FileSystem Tools pour CELUNA
|
||||||
|
|
||||||
## Objectif
|
## Objectif
|
||||||
|
|
||||||
@ -42,7 +42,7 @@ src/shared/tools/
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <nlohmann/json.hpp>
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
namespace aissia::tools {
|
namespace celuna::tools {
|
||||||
|
|
||||||
struct FileSystemTools {
|
struct FileSystemTools {
|
||||||
// Définitions des tools pour le LLM
|
// Définitions des tools pour le LLM
|
||||||
@ -61,7 +61,7 @@ private:
|
|||||||
static nlohmann::json grepFiles(const nlohmann::json& params);
|
static nlohmann::json grepFiles(const nlohmann::json& params);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia::tools
|
} // namespace celuna::tools
|
||||||
```
|
```
|
||||||
|
|
||||||
### Dépendances
|
### Dépendances
|
||||||
@ -106,7 +106,7 @@ nlohmann::json LLMService::executeTool(const std::string& name,
|
|||||||
{
|
{
|
||||||
"allowed_paths": [
|
"allowed_paths": [
|
||||||
"/mnt/e/Users/Alexis Trouvé/Documents/Projets/",
|
"/mnt/e/Users/Alexis Trouvé/Documents/Projets/",
|
||||||
"/tmp/aissia/"
|
"/tmp/celuna/"
|
||||||
],
|
],
|
||||||
"blocked_patterns": [
|
"blocked_patterns": [
|
||||||
"*.env",
|
"*.env",
|
||||||
@ -137,10 +137,10 @@ nlohmann::json LLMService::executeTool(const std::string& name,
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Test read_file
|
# Test read_file
|
||||||
echo '{"tool": "read_file", "params": {"path": "/tmp/test.txt"}}' | ./build/aissia --test-tool
|
echo '{"tool": "read_file", "params": {"path": "/tmp/test.txt"}}' | ./build/celuna --test-tool
|
||||||
|
|
||||||
# Test edit_file
|
# Test edit_file
|
||||||
echo '{"tool": "edit_file", "params": {"path": "/tmp/test.txt", "old_string": "foo", "new_string": "bar"}}' | ./build/aissia --test-tool
|
echo '{"tool": "edit_file", "params": {"path": "/tmp/test.txt", "old_string": "foo", "new_string": "bar"}}' | ./build/celuna --test-tool
|
||||||
```
|
```
|
||||||
|
|
||||||
## Estimation
|
## Estimation
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
# Plan d'Implementation - Tests d'Integration AISSIA
|
# Plan d'Implementation - Tests d'Integration CELUNA
|
||||||
|
|
||||||
## Vue d'Ensemble
|
## Vue d'Ensemble
|
||||||
|
|
||||||
@ -65,7 +65,7 @@ public:
|
|||||||
|
|
||||||
#### MockTransport.hpp
|
#### MockTransport.hpp
|
||||||
```cpp
|
```cpp
|
||||||
class MockTransport : public aissia::mcp::IMCPTransport {
|
class MockTransport : public celuna::mcp::IMCPTransport {
|
||||||
public:
|
public:
|
||||||
bool m_running = false;
|
bool m_running = false;
|
||||||
std::vector<JsonRpcRequest> sentRequests;
|
std::vector<JsonRpcRequest> sentRequests;
|
||||||
@ -622,7 +622,7 @@ FetchContent_Declare(
|
|||||||
FetchContent_MakeAvailable(Catch2)
|
FetchContent_MakeAvailable(Catch2)
|
||||||
|
|
||||||
# Test executable
|
# Test executable
|
||||||
add_executable(aissia_tests
|
add_executable(celuna_tests
|
||||||
tests/main.cpp
|
tests/main.cpp
|
||||||
|
|
||||||
# Mocks
|
# Mocks
|
||||||
@ -642,14 +642,14 @@ add_executable(aissia_tests
|
|||||||
tests/mcp/MCPClientTests.cpp
|
tests/mcp/MCPClientTests.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(aissia_tests PRIVATE
|
target_link_libraries(celuna_tests PRIVATE
|
||||||
Catch2::Catch2WithMain
|
Catch2::Catch2WithMain
|
||||||
GroveEngine::impl
|
GroveEngine::impl
|
||||||
AissiaTools
|
CelunaTools
|
||||||
spdlog::spdlog
|
spdlog::spdlog
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(aissia_tests PRIVATE
|
target_include_directories(celuna_tests PRIVATE
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/tests
|
${CMAKE_CURRENT_SOURCE_DIR}/tests
|
||||||
)
|
)
|
||||||
@ -660,12 +660,12 @@ file(COPY tests/fixtures/ DESTINATION ${CMAKE_BINARY_DIR}/tests/fixtures)
|
|||||||
# CTest integration
|
# CTest integration
|
||||||
include(CTest)
|
include(CTest)
|
||||||
include(Catch)
|
include(Catch)
|
||||||
catch_discover_tests(aissia_tests)
|
catch_discover_tests(celuna_tests)
|
||||||
|
|
||||||
# Custom target for running tests
|
# Custom target for running tests
|
||||||
add_custom_target(test_all
|
add_custom_target(test_all
|
||||||
COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure
|
COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure
|
||||||
DEPENDS aissia_tests
|
DEPENDS celuna_tests
|
||||||
COMMENT "Running all integration tests"
|
COMMENT "Running all integration tests"
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
@ -724,10 +724,10 @@ cmake --build build
|
|||||||
cmake --build build --target test_all
|
cmake --build build --target test_all
|
||||||
|
|
||||||
# Executer tests specifiques
|
# Executer tests specifiques
|
||||||
./build/aissia_tests "[scheduler]" # Tests scheduler
|
./build/celuna_tests "[scheduler]" # Tests scheduler
|
||||||
./build/aissia_tests "[mcp]" # Tests MCP
|
./build/celuna_tests "[mcp]" # Tests MCP
|
||||||
./build/aissia_tests "[integration]" # Tous les TI
|
./build/celuna_tests "[integration]" # Tous les TI
|
||||||
|
|
||||||
# Avec verbose
|
# Avec verbose
|
||||||
./build/aissia_tests -s -d yes
|
./build/celuna_tests -s -d yes
|
||||||
```
|
```
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
# Prompt Successeur - AISSIA
|
# Prompt Successeur - CELUNA
|
||||||
|
|
||||||
## Contexte
|
## Contexte
|
||||||
|
|
||||||
Tu reprends le développement d'**AISSIA**, un assistant vocal agentique en C++17 basé sur GroveEngine.
|
Tu reprends le développement d'**CELUNA**, un assistant vocal agentique en C++17 basé sur GroveEngine.
|
||||||
|
|
||||||
**Architecture** : Services (non hot-reload) + Modules (.so hot-reload) + MCP (client et serveur)
|
**Architecture** : Services (non hot-reload) + Modules (.so hot-reload) + MCP (client et serveur)
|
||||||
|
|
||||||
@ -12,8 +12,8 @@ Tu reprends le développement d'**AISSIA**, un assistant vocal agentique en C++1
|
|||||||
✅ 6 modules hot-reload fonctionnels
|
✅ 6 modules hot-reload fonctionnels
|
||||||
✅ 4 services infrastructure (LLM, Storage, Platform, Voice)
|
✅ 4 services infrastructure (LLM, Storage, Platform, Voice)
|
||||||
✅ 17 tools pour l'agent LLM
|
✅ 17 tools pour l'agent LLM
|
||||||
✅ Mode MCP Server : `./build/aissia --mcp-server`
|
✅ Mode MCP Server : `./build/celuna --mcp-server`
|
||||||
✅ Mode interactif : `./run.sh` ou `./build/aissia --interactive`
|
✅ Mode interactif : `./run.sh` ou `./build/celuna --interactive`
|
||||||
✅ **Tests MCP : 50/50 passent** (transport + client)
|
✅ **Tests MCP : 50/50 passent** (transport + client)
|
||||||
✅ **Tests totaux : 110/110 passent** ✨ TOUS LES TESTS PASSENT ✨
|
✅ **Tests totaux : 110/110 passent** ✨ TOUS LES TESTS PASSENT ✨
|
||||||
✅ **Script wrapper `run.sh`** pour charger `.env` automatiquement
|
✅ **Script wrapper `run.sh`** pour charger `.env` automatiquement
|
||||||
@ -24,7 +24,7 @@ Tu reprends le développement d'**AISSIA**, un assistant vocal agentique en C++1
|
|||||||
|---------|------|
|
|---------|------|
|
||||||
| `src/main.cpp` | Entry point, charge modules, route messages, mode interactif |
|
| `src/main.cpp` | Entry point, charge modules, route messages, mode interactif |
|
||||||
| `src/services/LLMService.*` | Boucle agentique, ToolRegistry, appels Claude |
|
| `src/services/LLMService.*` | Boucle agentique, ToolRegistry, appels Claude |
|
||||||
| `src/shared/mcp/MCPServer.*` | AISSIA comme serveur MCP (stdio JSON-RPC) |
|
| `src/shared/mcp/MCPServer.*` | CELUNA comme serveur MCP (stdio JSON-RPC) |
|
||||||
| `src/shared/mcp/MCPClient.*` | Consomme serveurs MCP externes |
|
| `src/shared/mcp/MCPClient.*` | Consomme serveurs MCP externes |
|
||||||
| `src/shared/mcp/StdioTransport.*` | Transport stdio pour MCP (spawne process enfant) |
|
| `src/shared/mcp/StdioTransport.*` | Transport stdio pour MCP (spawne process enfant) |
|
||||||
| `src/shared/tools/FileSystemTools.*` | 6 tools fichiers (read/write/edit/glob/grep) |
|
| `src/shared/tools/FileSystemTools.*` | 6 tools fichiers (read/write/edit/glob/grep) |
|
||||||
@ -55,21 +55,21 @@ cmake -B build && cmake --build build -j4
|
|||||||
./run.sh
|
./run.sh
|
||||||
|
|
||||||
# Run avec interface stdin interactive (manuel)
|
# Run avec interface stdin interactive (manuel)
|
||||||
source .env && ./build/aissia --interactive # ou -i
|
source .env && ./build/celuna --interactive # ou -i
|
||||||
# Tape "quit" ou "q" pour quitter
|
# Tape "quit" ou "q" pour quitter
|
||||||
|
|
||||||
# Run normal (boucle principale sans interaction)
|
# Run normal (boucle principale sans interaction)
|
||||||
./build/aissia
|
./build/celuna
|
||||||
|
|
||||||
# Run comme serveur MCP (pour Claude Code)
|
# Run comme serveur MCP (pour Claude Code)
|
||||||
./build/aissia --mcp-server
|
./build/celuna --mcp-server
|
||||||
|
|
||||||
# Tests
|
# Tests
|
||||||
cp tests/fixtures/mock_mcp.json build/tests/fixtures/
|
cp tests/fixtures/mock_mcp.json build/tests/fixtures/
|
||||||
./build/tests/aissia_tests # Tous (110/110) ✅
|
./build/tests/celuna_tests # Tous (110/110) ✅
|
||||||
./build/tests/aissia_tests "[mcp]" # MCP (50/50)
|
./build/tests/celuna_tests "[mcp]" # MCP (50/50)
|
||||||
./build/tests/aissia_tests "[transport]" # Transport (20/20)
|
./build/tests/celuna_tests "[transport]" # Transport (20/20)
|
||||||
./build/tests/aissia_tests "[client]" # Client (15/15)
|
./build/tests/celuna_tests "[client]" # Client (15/15)
|
||||||
```
|
```
|
||||||
|
|
||||||
## ~~Tests qui échouent (8)~~ ✅ TOUS FIXÉS
|
## ~~Tests qui échouent (8)~~ ✅ TOUS FIXÉS
|
||||||
|
|||||||
22
README.md
22
README.md
@ -1,10 +1,10 @@
|
|||||||
# AISSIA - AI Smart Schedule & Interactive Assistant
|
# Celuna AI by Etheryale 🌙✨
|
||||||
|
|
||||||
**AISSIA** is an intelligent personal assistant for time management, hyperfocus detection, and language learning, powered by **GroveEngine**.
|
**Celuna** is a celestial personal assistant for time management, hyperfocus detection, and language learning, powered by **GroveEngine**.
|
||||||
|
|
||||||
## What is AISSIA?
|
## What is Celuna?
|
||||||
|
|
||||||
AISSIA helps manage:
|
Celuna helps manage:
|
||||||
- **Hyperfocus**: Detects when you've been working too long and need a break
|
- **Hyperfocus**: Detects when you've been working too long and need a break
|
||||||
- **Time Management**: Intelligent scheduling and task planning
|
- **Time Management**: Intelligent scheduling and task planning
|
||||||
- **Language Learning**: Interactive practice in target languages
|
- **Language Learning**: Interactive practice in target languages
|
||||||
@ -12,7 +12,7 @@ AISSIA helps manage:
|
|||||||
|
|
||||||
## Built on GroveEngine
|
## Built on GroveEngine
|
||||||
|
|
||||||
AISSIA leverages **GroveEngine**, a C++17 hot-reload module system that enables:
|
Celuna leverages **GroveEngine**, a C++17 hot-reload module system that enables:
|
||||||
|
|
||||||
- **Hot-Reload**: Modify code at runtime without losing state (<1ms reload latency)
|
- **Hot-Reload**: Modify code at runtime without losing state (<1ms reload latency)
|
||||||
- **Modular Architecture**: Self-contained modules (200-300 lines each)
|
- **Modular Architecture**: Self-contained modules (200-300 lines each)
|
||||||
@ -31,7 +31,7 @@ AISSIA leverages **GroveEngine**, a C++17 hot-reload module system that enables:
|
|||||||
## Project Structure
|
## Project Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
Aissia/
|
Celuna/
|
||||||
├── external/
|
├── external/
|
||||||
│ └── GroveEngine/ # GroveEngine (symlink)
|
│ └── GroveEngine/ # GroveEngine (symlink)
|
||||||
├── src/
|
├── src/
|
||||||
@ -113,13 +113,13 @@ cmake --build build --target modules
|
|||||||
./run.sh
|
./run.sh
|
||||||
|
|
||||||
# Or manually with .env loaded
|
# Or manually with .env loaded
|
||||||
source .env && ./build/aissia -i
|
source .env && ./build/celuna -i
|
||||||
|
|
||||||
# MCP Server mode (for Claude Code integration)
|
# MCP Server mode (for Claude Code integration)
|
||||||
./build/aissia --mcp-server
|
./build/celuna --mcp-server
|
||||||
|
|
||||||
# Normal mode (background daemon)
|
# Normal mode (background daemon)
|
||||||
./build/aissia
|
./build/celuna
|
||||||
```
|
```
|
||||||
|
|
||||||
**Note**: Create a `.env` file with your API key:
|
**Note**: Create a `.env` file with your API key:
|
||||||
@ -129,7 +129,7 @@ ANTHROPIC_API_KEY=sk-ant-...
|
|||||||
|
|
||||||
### Hot-Reload Workflow
|
### Hot-Reload Workflow
|
||||||
|
|
||||||
1. Start AISSIA: `./build/aissia`
|
1. Start Celuna: `./build/celuna`
|
||||||
2. Edit a module: `src/modules/SchedulerModule.cpp`
|
2. Edit a module: `src/modules/SchedulerModule.cpp`
|
||||||
3. Rebuild: `cmake --build build --target modules`
|
3. Rebuild: `cmake --build build --target modules`
|
||||||
4. **Module reloads automatically with state preserved**
|
4. **Module reloads automatically with state preserved**
|
||||||
@ -188,7 +188,7 @@ See `docs/GROVEENGINE_GUIDE.md` for detailed module development guide.
|
|||||||
|
|
||||||
## Architecture
|
## Architecture
|
||||||
|
|
||||||
AISSIA runs on a simple loop (10Hz for assistant workload):
|
Celuna runs on a simple loop (10Hz for assistant workload):
|
||||||
|
|
||||||
```
|
```
|
||||||
┌─────────────────────────────────────────────┐
|
┌─────────────────────────────────────────────┐
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
# AUDIT DE CONFORMITÉ GROVEENGINE - AISSIA
|
# AUDIT DE CONFORMITÉ GROVEENGINE - CELUNA
|
||||||
|
|
||||||
**Date** : 2025-11-26
|
**Date** : 2025-11-26
|
||||||
**Auditeur** : Claude Code
|
**Auditeur** : Claude Code
|
||||||
@ -192,11 +192,11 @@ void StorageModule::setState(const grove::IDataNode& state) {
|
|||||||
**CMakeLists.txt:86-101** :
|
**CMakeLists.txt:86-101** :
|
||||||
|
|
||||||
```cmake
|
```cmake
|
||||||
add_library(AissiaLLM STATIC ...)
|
add_library(CelunaLLM STATIC ...)
|
||||||
target_link_libraries(AIModule PRIVATE AissiaLLM)
|
target_link_libraries(AIModule PRIVATE CelunaLLM)
|
||||||
```
|
```
|
||||||
|
|
||||||
**Problème** : Les libs `AissiaLLM`, `AissiaPlatform`, `AissiaAudio` sont compilées en STATIC et linkées dans chaque .so.
|
**Problème** : Les libs `CelunaLLM`, `CelunaPlatform`, `CelunaAudio` sont compilées en STATIC et linkées dans chaque .so.
|
||||||
|
|
||||||
**Impact** :
|
**Impact** :
|
||||||
- Code dupliqué dans chaque module
|
- Code dupliqué dans chaque module
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# AISSIA MCP Configuration for Claude Code
|
# Celuna MCP Configuration for Claude Code
|
||||||
|
|
||||||
This directory contains an example MCP (Model Context Protocol) configuration for integrating AISSIA with Claude Code.
|
This directory contains an example MCP (Model Context Protocol) configuration for integrating Celuna with Claude Code.
|
||||||
|
|
||||||
## Quick Setup
|
## Quick Setup
|
||||||
|
|
||||||
@ -32,13 +32,13 @@ C:\Users\YourUsername\AppData\Roaming\Code\User\globalStorage\saoudrizwan.claude
|
|||||||
|
|
||||||
Copy the contents of `claude_code_mcp_config.json` to the Claude Code MCP settings file.
|
Copy the contents of `claude_code_mcp_config.json` to the Claude Code MCP settings file.
|
||||||
|
|
||||||
**Important**: Update the `command` path to point to your actual AISSIA executable:
|
**Important**: Update the `command` path to point to your actual Celuna executable:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"mcpServers": {
|
"mcpServers": {
|
||||||
"aissia": {
|
"celuna": {
|
||||||
"command": "C:\\path\\to\\your\\aissia\\build\\aissia.exe",
|
"command": "C:\\path\\to\\your\\celuna\\build\\celuna.exe",
|
||||||
"args": ["--mcp-server"],
|
"args": ["--mcp-server"],
|
||||||
"disabled": false
|
"disabled": false
|
||||||
}
|
}
|
||||||
@ -52,23 +52,23 @@ Restart VS Code (or reload window: `Ctrl+Shift+P` → "Developer: Reload Window"
|
|||||||
|
|
||||||
### 4. Verify Integration
|
### 4. Verify Integration
|
||||||
|
|
||||||
Open Claude Code and check that AISSIA tools are available:
|
Open Claude Code and check that Celuna tools are available:
|
||||||
|
|
||||||
```
|
```
|
||||||
You: Can you list the available MCP servers?
|
You: Can you list the available MCP servers?
|
||||||
Claude: I have access to the following MCP servers:
|
Claude: I have access to the following MCP servers:
|
||||||
- aissia: 13 tools available
|
- celuna: 13 tools available
|
||||||
```
|
```
|
||||||
|
|
||||||
## Available Tools
|
## Available Tools
|
||||||
|
|
||||||
Once configured, Claude will have access to these 13 AISSIA tools:
|
Once configured, Claude will have access to these 13 Celuna tools:
|
||||||
|
|
||||||
### AISSIA Core (5 tools)
|
### Celuna Core (5 tools)
|
||||||
1. **chat_with_aissia** ⭐ - Dialogue with AISSIA's AI assistant (Claude Sonnet 4)
|
1. **chat_with_celuna** ⭐ - Dialogue with Celuna's AI assistant (Claude Sonnet 4)
|
||||||
2. **transcribe_audio** - Transcribe audio files to text
|
2. **transcribe_audio** - Transcribe audio files to text
|
||||||
3. **text_to_speech** - Convert text to speech audio files
|
3. **text_to_speech** - Convert text to speech audio files
|
||||||
4. **save_memory** - Save notes to AISSIA's persistent storage
|
4. **save_memory** - Save notes to Celuna's persistent storage
|
||||||
5. **search_memories** - Search through saved memories
|
5. **search_memories** - Search through saved memories
|
||||||
|
|
||||||
### File System (8 tools)
|
### File System (8 tools)
|
||||||
@ -88,8 +88,8 @@ Once configured, Claude will have access to these 13 AISSIA tools:
|
|||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"mcpServers": {
|
"mcpServers": {
|
||||||
"aissia": {
|
"celuna": {
|
||||||
"command": "path/to/aissia.exe",
|
"command": "path/to/celuna.exe",
|
||||||
"args": ["--mcp-server"],
|
"args": ["--mcp-server"],
|
||||||
"disabled": false
|
"disabled": false
|
||||||
}
|
}
|
||||||
@ -104,11 +104,11 @@ To skip confirmation prompts for specific tools:
|
|||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"mcpServers": {
|
"mcpServers": {
|
||||||
"aissia": {
|
"celuna": {
|
||||||
"command": "path/to/aissia.exe",
|
"command": "path/to/celuna.exe",
|
||||||
"args": ["--mcp-server"],
|
"args": ["--mcp-server"],
|
||||||
"disabled": false,
|
"disabled": false,
|
||||||
"alwaysAllow": ["chat_with_aissia", "read_file", "write_file"]
|
"alwaysAllow": ["chat_with_celuna", "read_file", "write_file"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -116,13 +116,13 @@ To skip confirmation prompts for specific tools:
|
|||||||
|
|
||||||
### Disable Server
|
### Disable Server
|
||||||
|
|
||||||
To temporarily disable AISSIA without removing the configuration:
|
To temporarily disable Celuna without removing the configuration:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"mcpServers": {
|
"mcpServers": {
|
||||||
"aissia": {
|
"celuna": {
|
||||||
"command": "path/to/aissia.exe",
|
"command": "path/to/celuna.exe",
|
||||||
"args": ["--mcp-server"],
|
"args": ["--mcp-server"],
|
||||||
"disabled": true // <-- Set to true
|
"disabled": true // <-- Set to true
|
||||||
}
|
}
|
||||||
@ -132,7 +132,7 @@ To temporarily disable AISSIA without removing the configuration:
|
|||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
Before running AISSIA in MCP server mode, ensure these config files exist:
|
Before running Celuna in MCP server mode, ensure these config files exist:
|
||||||
|
|
||||||
### config/ai.json
|
### config/ai.json
|
||||||
```json
|
```json
|
||||||
@ -141,14 +141,14 @@ Before running AISSIA in MCP server mode, ensure these config files exist:
|
|||||||
"api_key": "sk-ant-api03-...",
|
"api_key": "sk-ant-api03-...",
|
||||||
"model": "claude-sonnet-4-20250514",
|
"model": "claude-sonnet-4-20250514",
|
||||||
"max_iterations": 10,
|
"max_iterations": 10,
|
||||||
"system_prompt": "Tu es AISSIA, un assistant personnel intelligent..."
|
"system_prompt": "Tu es Celuna, un assistant personnel intelligent..."
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### config/storage.json
|
### config/storage.json
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"database_path": "./data/aissia.db",
|
"database_path": "./data/celuna.db",
|
||||||
"journal_mode": "WAL",
|
"journal_mode": "WAL",
|
||||||
"busy_timeout_ms": 5000
|
"busy_timeout_ms": 5000
|
||||||
}
|
}
|
||||||
@ -176,23 +176,23 @@ You can test the MCP server independently before integrating with Claude Code:
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Test tools/list
|
# Test tools/list
|
||||||
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | ./build/aissia.exe --mcp-server
|
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | ./build/celuna.exe --mcp-server
|
||||||
|
|
||||||
# Test chat_with_aissia tool
|
# Test chat_with_celuna tool
|
||||||
echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"chat_with_aissia","arguments":{"message":"What time is it?"}}}' | ./build/aissia.exe --mcp-server
|
echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"chat_with_celuna","arguments":{"message":"What time is it?"}}}' | ./build/celuna.exe --mcp-server
|
||||||
```
|
```
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
### "Server not found" or "Connection failed"
|
### "Server not found" or "Connection failed"
|
||||||
|
|
||||||
1. Verify the `command` path is correct and points to `aissia.exe`
|
1. Verify the `command` path is correct and points to `celuna.exe`
|
||||||
2. Make sure AISSIA compiles successfully: `cmake --build build`
|
2. Make sure Celuna compiles successfully: `cmake --build build`
|
||||||
3. Test running `./build/aissia.exe --mcp-server` manually
|
3. Test running `./build/celuna.exe --mcp-server` manually
|
||||||
|
|
||||||
### "LLMService not initialized"
|
### "LLMService not initialized"
|
||||||
|
|
||||||
AISSIA requires `config/ai.json` with a valid Claude API key. Check:
|
Celuna requires `config/ai.json` with a valid Claude API key. Check:
|
||||||
1. File exists: `config/ai.json`
|
1. File exists: `config/ai.json`
|
||||||
2. API key is valid: `"api_key": "sk-ant-api03-..."`
|
2. API key is valid: `"api_key": "sk-ant-api03-..."`
|
||||||
3. Provider is set: `"provider": "claude"`
|
3. Provider is set: `"provider": "claude"`
|
||||||
@ -215,21 +215,21 @@ These will be completed in Phase 8.1 and 8.2.
|
|||||||
|
|
||||||
## Example Use Cases
|
## Example Use Cases
|
||||||
|
|
||||||
### 1. Ask AISSIA for Help
|
### 1. Ask Celuna for Help
|
||||||
|
|
||||||
```
|
```
|
||||||
You: Use chat_with_aissia to ask "What are my top productivity patterns?"
|
You: Use chat_with_celuna to ask "What are my top productivity patterns?"
|
||||||
Claude: [calls chat_with_aissia tool]
|
Claude: [calls chat_with_celuna tool]
|
||||||
AISSIA: Based on your activity data, your most productive hours are 9-11 AM...
|
Celuna: Based on your activity data, your most productive hours are 9-11 AM...
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. File Operations + AI
|
### 2. File Operations + AI
|
||||||
|
|
||||||
```
|
```
|
||||||
You: Read my TODO.md file and ask AISSIA to prioritize the tasks
|
You: Read my TODO.md file and ask Celuna to prioritize the tasks
|
||||||
Claude: [calls read_file("TODO.md")]
|
Claude: [calls read_file("TODO.md")]
|
||||||
Claude: [calls chat_with_aissia with task list]
|
Claude: [calls chat_with_celuna with task list]
|
||||||
AISSIA: Here's a prioritized version based on urgency and dependencies...
|
Celuna: Here's a prioritized version based on urgency and dependencies...
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. Voice Transcription (future)
|
### 3. Voice Transcription (future)
|
||||||
@ -244,13 +244,13 @@ Result: "Welcome to the team meeting. Today we're discussing..."
|
|||||||
|
|
||||||
### Multiple MCP Servers
|
### Multiple MCP Servers
|
||||||
|
|
||||||
You can configure multiple MCP servers alongside AISSIA:
|
You can configure multiple MCP servers alongside Celuna:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"mcpServers": {
|
"mcpServers": {
|
||||||
"aissia": {
|
"celuna": {
|
||||||
"command": "C:\\path\\to\\aissia\\build\\aissia.exe",
|
"command": "C:\\path\\to\\celuna\\build\\celuna.exe",
|
||||||
"args": ["--mcp-server"],
|
"args": ["--mcp-server"],
|
||||||
"disabled": false
|
"disabled": false
|
||||||
},
|
},
|
||||||
@ -273,17 +273,17 @@ You can configure multiple MCP servers alongside AISSIA:
|
|||||||
|
|
||||||
### Environment Variables
|
### Environment Variables
|
||||||
|
|
||||||
Pass environment variables to AISSIA:
|
Pass environment variables to Celuna:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"mcpServers": {
|
"mcpServers": {
|
||||||
"aissia": {
|
"celuna": {
|
||||||
"command": "C:\\path\\to\\aissia\\build\\aissia.exe",
|
"command": "C:\\path\\to\\celuna\\build\\celuna.exe",
|
||||||
"args": ["--mcp-server"],
|
"args": ["--mcp-server"],
|
||||||
"disabled": false,
|
"disabled": false,
|
||||||
"env": {
|
"env": {
|
||||||
"AISSIA_LOG_LEVEL": "debug",
|
"Celuna_LOG_LEVEL": "debug",
|
||||||
"CLAUDE_API_KEY": "sk-ant-api03-..."
|
"CLAUDE_API_KEY": "sk-ant-api03-..."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -301,5 +301,5 @@ Pass environment variables to AISSIA:
|
|||||||
|
|
||||||
For issues or questions:
|
For issues or questions:
|
||||||
1. Check the full documentation: `docs/CLAUDE_CODE_INTEGRATION.md`
|
1. Check the full documentation: `docs/CLAUDE_CODE_INTEGRATION.md`
|
||||||
2. Review logs: AISSIA writes to stderr in MCP mode
|
2. Review logs: Celuna writes to stderr in MCP mode
|
||||||
3. Test manually: `./build/aissia.exe --mcp-server` and send JSON-RPC requests
|
3. Test manually: `./build/celuna.exe --mcp-server` and send JSON-RPC requests
|
||||||
|
|||||||
@ -18,5 +18,5 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"system_prompt": "Tu es AISSIA, un assistant personnel specialise dans la gestion du temps et de l'attention. Tu aides l'utilisateur a rester productif tout en evitant l'hyperfocus excessif. Tu es bienveillant mais ferme quand necessaire pour encourager les pauses. Reponds toujours en francais."
|
"system_prompt": "Tu es Celuna 🌙, un assistant céleste spécialisé dans la gestion du temps et de l'attention. Tu aides l'utilisateur à rester productif tout en évitant l'hyperfocus excessif. Tu es bienveillant mais ferme quand nécessaire pour encourager les pauses. Réponds toujours en français avec une touche d'élégance céleste."
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"mcpServers": {
|
"mcpServers": {
|
||||||
"aissia": {
|
"celuna": {
|
||||||
"command": "C:\\Users\\alexi\\Documents\\projects\\aissia\\build\\aissia.exe",
|
"command": "C:\\Users\\alexi\\Documents\\projects\\aissia\\build\\celuna.exe",
|
||||||
"args": ["--mcp-server"],
|
"args": ["--mcp-server"],
|
||||||
"disabled": false,
|
"disabled": false,
|
||||||
"alwaysAllow": []
|
"alwaysAllow": []
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"database_path": "./data/aissia.db",
|
"database_path": "./data/celuna.db",
|
||||||
"journal_mode": "WAL",
|
"journal_mode": "WAL",
|
||||||
"busy_timeout_ms": 5000
|
"busy_timeout_ms": 5000
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,26 +1,26 @@
|
|||||||
# AISSIA - Claude Code Integration (Phase 8)
|
# CELUNA - Claude Code Integration (Phase 8)
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
AISSIA can now be exposed as an **MCP Server** (Model Context Protocol) to integrate with Claude Code and other MCP-compatible clients. This allows Claude to use AISSIA's capabilities as tools during conversations.
|
CELUNA can now be exposed as an **MCP Server** (Model Context Protocol) to integrate with Claude Code and other MCP-compatible clients. This allows Claude to use CELUNA's capabilities as tools during conversations.
|
||||||
|
|
||||||
**Mode MCP Server**: `./aissia --mcp-server`
|
**Mode MCP Server**: `./celuna --mcp-server`
|
||||||
|
|
||||||
This mode exposes AISSIA's services via JSON-RPC 2.0 over stdio, following the MCP specification.
|
This mode exposes CELUNA's services via JSON-RPC 2.0 over stdio, following the MCP specification.
|
||||||
|
|
||||||
## Available Tools
|
## Available Tools
|
||||||
|
|
||||||
AISSIA exposes **13 tools** total:
|
CELUNA exposes **13 tools** total:
|
||||||
|
|
||||||
### 1. AISSIA Core Tools (Priority)
|
### 1. CELUNA Core Tools (Priority)
|
||||||
|
|
||||||
#### `chat_with_aissia` ⭐ **PRIORITY**
|
#### `chat_with_celuna` ⭐ **PRIORITY**
|
||||||
Dialogue with AISSIA's built-in AI assistant (Claude Sonnet 4). Send a message and get an intelligent response with access to AISSIA's knowledge and capabilities.
|
Dialogue with CELUNA's built-in AI assistant (Claude Sonnet 4). Send a message and get an intelligent response with access to CELUNA's knowledge and capabilities.
|
||||||
|
|
||||||
**Input**:
|
**Input**:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"message": "string (required) - Message to send to AISSIA",
|
"message": "string (required) - Message to send to CELUNA",
|
||||||
"conversation_id": "string (optional) - Conversation ID for continuity",
|
"conversation_id": "string (optional) - Conversation ID for continuity",
|
||||||
"system_prompt": "string (optional) - Custom system prompt"
|
"system_prompt": "string (optional) - Custom system prompt"
|
||||||
}
|
}
|
||||||
@ -29,14 +29,14 @@ Dialogue with AISSIA's built-in AI assistant (Claude Sonnet 4). Send a message a
|
|||||||
**Output**:
|
**Output**:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"response": "AISSIA's response text",
|
"response": "CELUNA's response text",
|
||||||
"conversation_id": "conversation-id",
|
"conversation_id": "conversation-id",
|
||||||
"tokens": 1234,
|
"tokens": 1234,
|
||||||
"iterations": 2
|
"iterations": 2
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
**Example use case**: "Hey AISSIA, can you analyze my focus patterns this week?"
|
**Example use case**: "Hey CELUNA, can you analyze my focus patterns this week?"
|
||||||
|
|
||||||
#### `transcribe_audio`
|
#### `transcribe_audio`
|
||||||
Transcribe audio file to text using Speech-to-Text engines (Whisper.cpp, OpenAI Whisper API, Google Speech).
|
Transcribe audio file to text using Speech-to-Text engines (Whisper.cpp, OpenAI Whisper API, Google Speech).
|
||||||
@ -84,7 +84,7 @@ Convert text to speech audio file using Text-to-Speech synthesis. Generates audi
|
|||||||
**Status**: ⚠️ Not yet implemented - requires TTS engine file output support
|
**Status**: ⚠️ Not yet implemented - requires TTS engine file output support
|
||||||
|
|
||||||
#### `save_memory`
|
#### `save_memory`
|
||||||
Save a note or memory to AISSIA's persistent storage. Memories can be tagged and searched later.
|
Save a note or memory to CELUNA's persistent storage. Memories can be tagged and searched later.
|
||||||
|
|
||||||
**Input**:
|
**Input**:
|
||||||
```json
|
```json
|
||||||
@ -107,7 +107,7 @@ Save a note or memory to AISSIA's persistent storage. Memories can be tagged and
|
|||||||
**Status**: ⚠️ Not yet implemented - requires StorageService sync methods
|
**Status**: ⚠️ Not yet implemented - requires StorageService sync methods
|
||||||
|
|
||||||
#### `search_memories`
|
#### `search_memories`
|
||||||
Search through saved memories and notes in AISSIA's storage. Returns matching memories with relevance scores.
|
Search through saved memories and notes in CELUNA's storage. Returns matching memories with relevance scores.
|
||||||
|
|
||||||
**Input**:
|
**Input**:
|
||||||
```json
|
```json
|
||||||
@ -157,13 +157,13 @@ Create or edit your Claude Code MCP configuration file:
|
|||||||
**Windows**: `%APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json`
|
**Windows**: `%APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json`
|
||||||
**macOS/Linux**: `~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`
|
**macOS/Linux**: `~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`
|
||||||
|
|
||||||
Add AISSIA as an MCP server:
|
Add CELUNA as an MCP server:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"mcpServers": {
|
"mcpServers": {
|
||||||
"aissia": {
|
"celuna": {
|
||||||
"command": "C:\\path\\to\\aissia\\build\\aissia.exe",
|
"command": "C:\\path\\to\\celuna\\build\\celuna.exe",
|
||||||
"args": ["--mcp-server"],
|
"args": ["--mcp-server"],
|
||||||
"disabled": false
|
"disabled": false
|
||||||
}
|
}
|
||||||
@ -171,29 +171,29 @@ Add AISSIA as an MCP server:
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
**Note**: Replace `C:\\path\\to\\aissia\\build\\aissia.exe` with the actual path to your compiled AISSIA executable.
|
**Note**: Replace `C:\\path\\to\\celuna\\build\\celuna.exe` with the actual path to your compiled CELUNA executable.
|
||||||
|
|
||||||
### 2. Verify Configuration
|
### 2. Verify Configuration
|
||||||
|
|
||||||
Restart Claude Code (or VS Code) to reload the MCP configuration.
|
Restart Claude Code (or VS Code) to reload the MCP configuration.
|
||||||
|
|
||||||
Claude should now have access to all 13 AISSIA tools during conversations.
|
Claude should now have access to all 13 CELUNA tools during conversations.
|
||||||
|
|
||||||
### 3. Test Integration
|
### 3. Test Integration
|
||||||
|
|
||||||
In Claude Code, try:
|
In Claude Code, try:
|
||||||
|
|
||||||
```
|
```
|
||||||
"Can you use the chat_with_aissia tool to ask AISSIA what time it is?"
|
"Can you use the chat_with_celuna tool to ask CELUNA what time it is?"
|
||||||
```
|
```
|
||||||
|
|
||||||
Claude will call the `chat_with_aissia` tool, which internally uses AISSIA's LLM service to process the query.
|
Claude will call the `chat_with_celuna` tool, which internally uses CELUNA's LLM service to process the query.
|
||||||
|
|
||||||
## Architecture
|
## Architecture
|
||||||
|
|
||||||
### Synchronous Mode (MCP Server)
|
### Synchronous Mode (MCP Server)
|
||||||
|
|
||||||
When running as an MCP server, AISSIA uses **synchronous blocking calls** instead of the async pub/sub architecture used in normal mode:
|
When running as an MCP server, CELUNA uses **synchronous blocking calls** instead of the async pub/sub architecture used in normal mode:
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
// Normal mode (async)
|
// Normal mode (async)
|
||||||
@ -239,9 +239,9 @@ for (auto& toolDef : FileSystemTools::getToolDefinitions()) {
|
|||||||
registry.registerTool(toolDef);
|
registry.registerTool(toolDef);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. AISSIA tools (5 tools)
|
// 3. CELUNA tools (5 tools)
|
||||||
MCPServerTools aissiaTools(llmService, storageService, voiceService);
|
MCPServerTools celunaTools(llmService, storageService, voiceService);
|
||||||
for (const auto& toolDef : aissiaTools.getToolDefinitions()) {
|
for (const auto& toolDef : celunaTools.getToolDefinitions()) {
|
||||||
registry.registerTool(toolDef);
|
registry.registerTool(toolDef);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@ -250,7 +250,7 @@ Total: **13 tools**
|
|||||||
|
|
||||||
## Configuration Files
|
## Configuration Files
|
||||||
|
|
||||||
AISSIA MCP Server requires these config files (same as normal mode):
|
CELUNA MCP Server requires these config files (same as normal mode):
|
||||||
|
|
||||||
- `config/ai.json` - LLM provider configuration (Claude API key)
|
- `config/ai.json` - LLM provider configuration (Claude API key)
|
||||||
- `config/storage.json` - Database path and settings
|
- `config/storage.json` - Database path and settings
|
||||||
@ -289,7 +289,7 @@ AISSIA MCP Server requires these config files (same as normal mode):
|
|||||||
- [ ] Add vector embeddings for semantic search
|
- [ ] Add vector embeddings for semantic search
|
||||||
|
|
||||||
### Phase 8.3 - Advanced Tools
|
### Phase 8.3 - Advanced Tools
|
||||||
- [ ] `schedule_task` - Add tasks to AISSIA's scheduler
|
- [ ] `schedule_task` - Add tasks to CELUNA's scheduler
|
||||||
- [ ] `get_focus_stats` - Retrieve hyperfocus detection stats
|
- [ ] `get_focus_stats` - Retrieve hyperfocus detection stats
|
||||||
- [ ] `list_active_apps` - Get current monitored applications
|
- [ ] `list_active_apps` - Get current monitored applications
|
||||||
- [ ] `send_notification` - Trigger system notifications
|
- [ ] `send_notification` - Trigger system notifications
|
||||||
@ -303,12 +303,12 @@ AISSIA MCP Server requires these config files (same as normal mode):
|
|||||||
|
|
||||||
### 1. AI Assistant Collaboration
|
### 1. AI Assistant Collaboration
|
||||||
|
|
||||||
Claude Code can delegate complex reasoning tasks to AISSIA:
|
Claude Code can delegate complex reasoning tasks to CELUNA:
|
||||||
|
|
||||||
```
|
```
|
||||||
Claude: "I need to analyze user behavior patterns. Let me ask AISSIA."
|
Claude: "I need to analyze user behavior patterns. Let me ask CELUNA."
|
||||||
→ calls chat_with_aissia("Analyze recent focus patterns")
|
→ calls chat_with_celuna("Analyze recent focus patterns")
|
||||||
AISSIA: "Based on monitoring data, user has 3 hyperfocus sessions daily averaging 2.5 hours..."
|
CELUNA: "Based on monitoring data, user has 3 hyperfocus sessions daily averaging 2.5 hours..."
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. Voice Transcription Workflow
|
### 2. Voice Transcription Workflow
|
||||||
@ -322,7 +322,7 @@ Claude: "Transcribe meeting-2025-01-30.wav"
|
|||||||
### 3. Knowledge Management
|
### 3. Knowledge Management
|
||||||
|
|
||||||
```
|
```
|
||||||
Claude: "Save this important insight to AISSIA's memory"
|
Claude: "Save this important insight to CELUNA's memory"
|
||||||
→ calls save_memory(
|
→ calls save_memory(
|
||||||
title="Project architecture decision",
|
title="Project architecture decision",
|
||||||
content="We decided to use hot-reload modules for business logic...",
|
content="We decided to use hot-reload modules for business logic...",
|
||||||
@ -333,9 +333,9 @@ Claude: "Save this important insight to AISSIA's memory"
|
|||||||
### 4. File + AI Operations
|
### 4. File + AI Operations
|
||||||
|
|
||||||
```
|
```
|
||||||
Claude: "Read todos.md, ask AISSIA to prioritize tasks, update file"
|
Claude: "Read todos.md, ask CELUNA to prioritize tasks, update file"
|
||||||
→ calls read_file("todos.md")
|
→ calls read_file("todos.md")
|
||||||
→ calls chat_with_aissia("Prioritize these tasks: ...")
|
→ calls chat_with_celuna("Prioritize these tasks: ...")
|
||||||
→ calls write_file("todos-prioritized.md", content=...)
|
→ calls write_file("todos-prioritized.md", content=...)
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -397,15 +397,15 @@ Test with `nc` or `socat`:
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Send tools/list request
|
# Send tools/list request
|
||||||
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | ./build/aissia.exe --mcp-server
|
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | ./build/celuna.exe --mcp-server
|
||||||
|
|
||||||
# Send tool call
|
# Send tool call
|
||||||
echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"chat_with_aissia","arguments":{"message":"Hello AISSIA"}}}' | ./build/aissia.exe --mcp-server
|
echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"chat_with_celuna","arguments":{"message":"Hello CELUNA"}}}' | ./build/celuna.exe --mcp-server
|
||||||
```
|
```
|
||||||
|
|
||||||
Expected output format:
|
Expected output format:
|
||||||
```json
|
```json
|
||||||
{"jsonrpc":"2.0","id":1,"result":{"tools":[{"name":"chat_with_aissia","description":"...","inputSchema":{...}}]}}
|
{"jsonrpc":"2.0","id":1,"result":{"tools":[{"name":"chat_with_celuna","description":"...","inputSchema":{...}}]}}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
@ -430,7 +430,7 @@ Voice tools are optional. If you don't need STT/TTS, this is normal.
|
|||||||
Make sure `config/storage.json` exists:
|
Make sure `config/storage.json` exists:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"database_path": "./data/aissia.db",
|
"database_path": "./data/celuna.db",
|
||||||
"journal_mode": "WAL",
|
"journal_mode": "WAL",
|
||||||
"busy_timeout_ms": 5000
|
"busy_timeout_ms": 5000
|
||||||
}
|
}
|
||||||
@ -443,7 +443,7 @@ Check `tools/list` output to see which tools are actually registered.
|
|||||||
## References
|
## References
|
||||||
|
|
||||||
- **MCP Specification**: https://github.com/anthropics/mcp
|
- **MCP Specification**: https://github.com/anthropics/mcp
|
||||||
- **AISSIA Architecture**: `docs/project-overview.md`
|
- **CELUNA Architecture**: `docs/project-overview.md`
|
||||||
- **GroveEngine Guide**: `docs/GROVEENGINE_GUIDE.md`
|
- **GroveEngine Guide**: `docs/GROVEENGINE_GUIDE.md`
|
||||||
- **LLM Service**: `src/services/LLMService.hpp`
|
- **LLM Service**: `src/services/LLMService.hpp`
|
||||||
- **MCPServer**: `src/shared/mcp/MCPServer.hpp`
|
- **MCPServer**: `src/shared/mcp/MCPServer.hpp`
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
## Résumé Exécutif
|
## Résumé Exécutif
|
||||||
|
|
||||||
AISSIA fonctionne parfaitement en mode interactif avec :
|
CELUNA fonctionne parfaitement en mode interactif avec :
|
||||||
- ✅ **Claude Sonnet 4** : Conversations agentiques complètes
|
- ✅ **Claude Sonnet 4** : Conversations agentiques complètes
|
||||||
- ✅ **TTS espeak-ng** : Synthèse vocale française
|
- ✅ **TTS espeak-ng** : Synthèse vocale française
|
||||||
- ✅ **18 outils** : Scheduler, Storage, Filesystem, MCP, etc.
|
- ✅ **18 outils** : Scheduler, Storage, Filesystem, MCP, etc.
|
||||||
@ -21,15 +21,15 @@ AISSIA fonctionne parfaitement en mode interactif avec :
|
|||||||
|
|
||||||
### Commande
|
### Commande
|
||||||
```bash
|
```bash
|
||||||
echo "Bonjour AISSIA ! Quelle heure est-il ?" | ./build/aissia -i
|
echo "Bonjour CELUNA ! Quelle heure est-il ?" | ./build/celuna -i
|
||||||
```
|
```
|
||||||
|
|
||||||
### Résultat
|
### Résultat
|
||||||
|
|
||||||
**Requête utilisateur** :
|
**Requête utilisateur** :
|
||||||
> "Bonjour AISSIA ! Quelle heure est-il ?"
|
> "Bonjour CELUNA ! Quelle heure est-il ?"
|
||||||
|
|
||||||
**Réponse AISSIA** :
|
**Réponse CELUNA** :
|
||||||
> Il est actuellement 7h41 ce vendredi 29 novembre 2025. Tu es matinal aujourd'hui ! Comment puis-je t'aider à bien commencer cette journée ? Veux-tu que je vérifie tes tâches prévues ou que nous planifions ta matinée ensemble ?
|
> Il est actuellement 7h41 ce vendredi 29 novembre 2025. Tu es matinal aujourd'hui ! Comment puis-je t'aider à bien commencer cette journée ? Veux-tu que je vérifie tes tâches prévues ou que nous planifions ta matinée ensemble ?
|
||||||
|
|
||||||
**Actions automatiques** :
|
**Actions automatiques** :
|
||||||
@ -65,7 +65,7 @@ echo "Bonjour AISSIA ! Quelle heure est-il ?" | ./build/aissia -i
|
|||||||
|
|
||||||
### 4. Statistiques Session
|
### 4. Statistiques Session
|
||||||
```
|
```
|
||||||
[07:42:20.355] [Aissia] [debug] Session: 0m32s, 7 modules actifs, 4 services
|
[07:42:20.355] [Celuna] [debug] Session: 0m32s, 7 modules actifs, 4 services
|
||||||
[AIModule] [info] AIModule arrete. Queries: 0, Tokens: 4298
|
[AIModule] [info] AIModule arrete. Queries: 0, Tokens: 4298
|
||||||
[VoiceModule] [info] VoiceModule arrete. Spoken: 1, Transcribed: 0
|
[VoiceModule] [info] VoiceModule arrete. Spoken: 1, Transcribed: 0
|
||||||
[StorageService] [info] StorageService shutdown. Total queries: 2
|
[StorageService] [info] StorageService shutdown. Total queries: 2
|
||||||
@ -139,7 +139,7 @@ echo "Bonjour AISSIA ! Quelle heure est-il ?" | ./build/aissia -i
|
|||||||
### ✅ TTS Multilingue
|
### ✅ TTS Multilingue
|
||||||
- Voix française (fr-fr)
|
- Voix française (fr-fr)
|
||||||
- Détection automatique espeak-ng
|
- Détection automatique espeak-ng
|
||||||
- Parle toutes les réponses AISSIA
|
- Parle toutes les réponses CELUNA
|
||||||
|
|
||||||
### ✅ Hot-Reload
|
### ✅ Hot-Reload
|
||||||
- 7 modules chargés dynamiquement
|
- 7 modules chargés dynamiquement
|
||||||
@ -199,7 +199,7 @@ echo "Bonjour AISSIA ! Quelle heure est-il ?" | ./build/aissia -i
|
|||||||
**Tools** : `get_current_time`
|
**Tools** : `get_current_time`
|
||||||
|
|
||||||
### 2. Conversation Proactive ✅
|
### 2. Conversation Proactive ✅
|
||||||
**Input** : "Bonjour AISSIA !"
|
**Input** : "Bonjour CELUNA !"
|
||||||
**Output** : Propose de vérifier tâches et planifier la journée
|
**Output** : Propose de vérifier tâches et planifier la journée
|
||||||
**Tools** : Aucun (conversation pure)
|
**Tools** : Aucun (conversation pure)
|
||||||
|
|
||||||
@ -238,7 +238,7 @@ echo "Bonjour AISSIA ! Quelle heure est-il ?" | ./build/aissia -i
|
|||||||
|
|
||||||
## Conclusion
|
## Conclusion
|
||||||
|
|
||||||
✅ **AISSIA est FONCTIONNEL en mode interactif** !
|
✅ **CELUNA est FONCTIONNEL en mode interactif** !
|
||||||
|
|
||||||
**Résultats** :
|
**Résultats** :
|
||||||
- Conversation naturelle ✅
|
- Conversation naturelle ✅
|
||||||
|
|||||||
@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
## Objectif
|
## Objectif
|
||||||
|
|
||||||
Transformer AISSIA en "Claude Code vocal" : un assistant qui peut utiliser des tools (internes + MCP) pour accomplir des tâches, piloté par la voix.
|
Transformer CELUNA en "Claude Code vocal" : un assistant qui peut utiliser des tools (internes + MCP) pour accomplir des tâches, piloté par la voix.
|
||||||
|
|
||||||
## Architecture Cible
|
## Architecture Cible
|
||||||
|
|
||||||
```
|
```
|
||||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||||
│ AISSIA - Agent Vocal │
|
│ CELUNA - Agent Vocal │
|
||||||
├─────────────────────────────────────────────────────────────────────────────┤
|
├─────────────────────────────────────────────────────────────────────────────┤
|
||||||
│ │
|
│ │
|
||||||
│ ┌──────────┐ ┌──────────┐ ┌─────────────────────────────────────┐ │
|
│ ┌──────────┐ ┌──────────┐ ┌─────────────────────────────────────┐ │
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
# AISSIA Documentation
|
# CELUNA Documentation
|
||||||
|
|
||||||
**AISSIA** (AI Smart Schedule & Interactive Assistant) - Assistant personnel intelligent pour la gestion du temps et de l'hyperfocus.
|
**CELUNA** (AI Smart Schedule & Interactive Assistant) - Assistant personnel intelligent pour la gestion du temps et de l'hyperfocus.
|
||||||
|
|
||||||
## Vue d'Ensemble
|
## Vue d'Ensemble
|
||||||
|
|
||||||
AISSIA est un assistant personnel proactif qui aide à gérer le temps, les priorités et l'hyperfocus en utilisant l'architecture modulaire WarFactory pour un développement rapide avec hot-reload.
|
CELUNA est un assistant personnel proactif qui aide à gérer le temps, les priorités et l'hyperfocus en utilisant l'architecture modulaire WarFactory pour un développement rapide avec hot-reload.
|
||||||
|
|
||||||
### Problème Résolu
|
### Problème Résolu
|
||||||
|
|
||||||
@ -24,7 +24,7 @@ Assistant intelligent qui :
|
|||||||
|
|
||||||
## Architecture
|
## Architecture
|
||||||
|
|
||||||
AISSIA réutilise l'**architecture modulaire WarFactory** :
|
CELUNA réutilise l'**architecture modulaire WarFactory** :
|
||||||
|
|
||||||
- **Hot-reload 0.4ms** : Modifications instantanées sans restart
|
- **Hot-reload 0.4ms** : Modifications instantanées sans restart
|
||||||
- **Modules 200-300 lignes** : Développement optimisé pour Claude Code
|
- **Modules 200-300 lignes** : Développement optimisé pour Claude Code
|
||||||
@ -71,7 +71,7 @@ docs/
|
|||||||
→ Comprendre les 5 interfaces fondamentales (IEngine, IModule, IModuleSystem, IIO, ICoordinationModule)
|
→ Comprendre les 5 interfaces fondamentales (IEngine, IModule, IModuleSystem, IIO, ICoordinationModule)
|
||||||
|
|
||||||
2. **[architecture-technique.md](architecture/architecture-technique.md)**
|
2. **[architecture-technique.md](architecture/architecture-technique.md)**
|
||||||
→ Voir comment AISSIA utilise WarFactory pour ses modules
|
→ Voir comment CELUNA utilise WarFactory pour ses modules
|
||||||
|
|
||||||
3. **[intelligent-document-retrieval.md](architecture/intelligent-document-retrieval.md)**
|
3. **[intelligent-document-retrieval.md](architecture/intelligent-document-retrieval.md)**
|
||||||
→ Architecture retrieval agentique pour AIAssistantModule (gestion documents, context window)
|
→ Architecture retrieval agentique pour AIAssistantModule (gestion documents, context window)
|
||||||
@ -79,7 +79,7 @@ docs/
|
|||||||
4. **[CLAUDE-HOT-RELOAD-GUIDE.md](implementation/CLAUDE-HOT-RELOAD-GUIDE.md)**
|
4. **[CLAUDE-HOT-RELOAD-GUIDE.md](implementation/CLAUDE-HOT-RELOAD-GUIDE.md)**
|
||||||
→ Workflow de développement avec hot-reload 0.4ms
|
→ Workflow de développement avec hot-reload 0.4ms
|
||||||
|
|
||||||
### 2. Modules AISSIA Prévus
|
### 2. Modules CELUNA Prévus
|
||||||
|
|
||||||
**MVP Phase 1 (Local uniquement) :**
|
**MVP Phase 1 (Local uniquement) :**
|
||||||
- `SchedulerModule` : Planning intelligent des tâches
|
- `SchedulerModule` : Planning intelligent des tâches
|
||||||
@ -155,12 +155,12 @@ DataOrientedEngine + ClusterModuleSystem + NetworkIO
|
|||||||
|
|
||||||
**Documents principaux à la racine :**
|
**Documents principaux à la racine :**
|
||||||
|
|
||||||
- **[CDCDraft.md](../CDCDraft.md)** : Cahier des charges complet AISSIA
|
- **[CDCDraft.md](../CDCDraft.md)** : Cahier des charges complet CELUNA
|
||||||
- **[AlternativesAnalysis.md](../AlternativesAnalysis.md)** : Analyse comparative des options techniques
|
- **[AlternativesAnalysis.md](../AlternativesAnalysis.md)** : Analyse comparative des options techniques
|
||||||
|
|
||||||
## Liens Externes
|
## Liens Externes
|
||||||
|
|
||||||
- **WarFactory Engine** : Architecture source utilisée par AISSIA
|
- **WarFactory Engine** : Architecture source utilisée par CELUNA
|
||||||
- **Claude Code** : https://docs.claude.com/en/docs/claude-code
|
- **Claude Code** : https://docs.claude.com/en/docs/claude-code
|
||||||
|
|
||||||
## Contribution
|
## Contribution
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# Configuration STT - Speech-to-Text
|
# Configuration STT - Speech-to-Text
|
||||||
|
|
||||||
AISSIA supporte **4 engines STT** différents, configurables via `config/voice.json`.
|
CELUNA supporte **4 engines STT** différents, configurables via `config/voice.json`.
|
||||||
|
|
||||||
## Engines Disponibles
|
## Engines Disponibles
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,7 @@ Guide pour configurer les moteurs de reconnaissance vocale STT sur Windows.
|
|||||||
|
|
||||||
## État Actuel
|
## État Actuel
|
||||||
|
|
||||||
AISSIA supporte **5 moteurs STT** avec priorités automatiques :
|
CELUNA supporte **5 moteurs STT** avec priorités automatiques :
|
||||||
|
|
||||||
| Moteur | Type | Status | Requis |
|
| Moteur | Type | Status | Requis |
|
||||||
|--------|------|--------|--------|
|
|--------|------|--------|--------|
|
||||||
@ -154,7 +154,7 @@ python create_test_audio_simple.py
|
|||||||
|
|
||||||
Ceci testera automatiquement tous les moteurs disponibles.
|
Ceci testera automatiquement tous les moteurs disponibles.
|
||||||
|
|
||||||
### Option 2 : Test depuis AISSIA
|
### Option 2 : Test depuis CELUNA
|
||||||
|
|
||||||
Les moteurs STT sont intégrés dans `VoiceModule` et accessibles via :
|
Les moteurs STT sont intégrés dans `VoiceModule` et accessibles via :
|
||||||
- `voice:start_listening` (pub/sub)
|
- `voice:start_listening` (pub/sub)
|
||||||
@ -218,7 +218,7 @@ GOOGLE_API_KEY=AIzaSy...
|
|||||||
|
|
||||||
### Whisper.cpp
|
### Whisper.cpp
|
||||||
- ✅ Intégré dans le build (external/whisper.cpp)
|
- ✅ Intégré dans le build (external/whisper.cpp)
|
||||||
- ✅ Lié statiquement à AissiaAudio
|
- ✅ Lié statiquement à CelunaAudio
|
||||||
- ❌ Modèle requis : téléchargé dans `models/`
|
- ❌ Modèle requis : téléchargé dans `models/`
|
||||||
|
|
||||||
### APIs Cloud
|
### APIs Cloud
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
# Document de Succession - AISSIA
|
# Document de Succession - CELUNA
|
||||||
|
|
||||||
## Contexte
|
## Contexte
|
||||||
|
|
||||||
AISSIA = Assistant vocal agentique basé sur GroveEngine (C++17 hot-reload). Architecture "Claude Code en vocal" avec tools internes + FileSystem + MCP.
|
CELUNA = Assistant vocal agentique basé sur GroveEngine (C++17 hot-reload). Architecture "Claude Code en vocal" avec tools internes + FileSystem + MCP.
|
||||||
|
|
||||||
**Dernier commit** : `37b62b5`
|
**Dernier commit** : `37b62b5`
|
||||||
|
|
||||||
@ -26,15 +26,15 @@ AISSIA = Assistant vocal agentique basé sur GroveEngine (C++17 hot-reload). Arc
|
|||||||
cmake -B build && cmake --build build -j4
|
cmake -B build && cmake --build build -j4
|
||||||
|
|
||||||
# Run (depuis racine ou build/)
|
# Run (depuis racine ou build/)
|
||||||
./build/aissia
|
./build/celuna
|
||||||
|
|
||||||
# Mode MCP Server (expose les tools via JSON-RPC stdio)
|
# Mode MCP Server (expose les tools via JSON-RPC stdio)
|
||||||
./build/aissia --mcp-server
|
./build/celuna --mcp-server
|
||||||
|
|
||||||
# Tests
|
# Tests
|
||||||
cmake -B build -DBUILD_TESTING=ON
|
cmake -B build -DBUILD_TESTING=ON
|
||||||
./build/tests/aissia_tests "[scheduler],[notification]" # Modules
|
./build/tests/celuna_tests "[scheduler],[notification]" # Modules
|
||||||
./build/tests/aissia_tests "[types]" # MCP types
|
./build/tests/celuna_tests "[types]" # MCP types
|
||||||
```
|
```
|
||||||
|
|
||||||
### Variables d'Environnement
|
### Variables d'Environnement
|
||||||
@ -127,7 +127,7 @@ src/modules/StorageModule.*
|
|||||||
```
|
```
|
||||||
src/shared/mcp/MCPTypes.hpp
|
src/shared/mcp/MCPTypes.hpp
|
||||||
src/shared/mcp/MCPClient.* # Client MCP (consomme des serveurs externes)
|
src/shared/mcp/MCPClient.* # Client MCP (consomme des serveurs externes)
|
||||||
src/shared/mcp/MCPServer.* # Serveur MCP (expose AISSIA comme serveur)
|
src/shared/mcp/MCPServer.* # Serveur MCP (expose CELUNA comme serveur)
|
||||||
src/shared/mcp/StdioTransport.*
|
src/shared/mcp/StdioTransport.*
|
||||||
config/mcp.json
|
config/mcp.json
|
||||||
```
|
```
|
||||||
@ -139,12 +139,12 @@ config/mcp.json
|
|||||||
cmake -B build -DBUILD_TESTING=ON && cmake --build build -j4
|
cmake -B build -DBUILD_TESTING=ON && cmake --build build -j4
|
||||||
|
|
||||||
# Par catégorie
|
# Par catégorie
|
||||||
./build/tests/aissia_tests "[scheduler]" # 10 tests
|
./build/tests/celuna_tests "[scheduler]" # 10 tests
|
||||||
./build/tests/aissia_tests "[notification]" # 10 tests
|
./build/tests/celuna_tests "[notification]" # 10 tests
|
||||||
./build/tests/aissia_tests "[types]" # 15 tests MCP
|
./build/tests/celuna_tests "[types]" # 15 tests MCP
|
||||||
|
|
||||||
# Tous les modules
|
# Tous les modules
|
||||||
./build/tests/aissia_tests "[scheduler],[notification],[monitoring],[ai],[voice],[storage]"
|
./build/tests/celuna_tests "[scheduler],[notification],[monitoring],[ai],[voice],[storage]"
|
||||||
```
|
```
|
||||||
|
|
||||||
**Résultats actuels** :
|
**Résultats actuels** :
|
||||||
@ -170,10 +170,10 @@ cmake -B build -DBUILD_TESTING=ON && cmake --build build -j4
|
|||||||
|
|
||||||
## MCP Server Mode
|
## MCP Server Mode
|
||||||
|
|
||||||
AISSIA peut fonctionner comme **serveur MCP**, exposant ses tools à des clients externes via JSON-RPC sur stdio.
|
CELUNA peut fonctionner comme **serveur MCP**, exposant ses tools à des clients externes via JSON-RPC sur stdio.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./build/aissia --mcp-server
|
./build/celuna --mcp-server
|
||||||
```
|
```
|
||||||
|
|
||||||
### Protocole
|
### Protocole
|
||||||
@ -181,11 +181,11 @@ AISSIA peut fonctionner comme **serveur MCP**, exposant ses tools à des clients
|
|||||||
Communication JSON-RPC 2.0 sur stdin/stdout :
|
Communication JSON-RPC 2.0 sur stdin/stdout :
|
||||||
|
|
||||||
```json
|
```json
|
||||||
// Client → AISSIA
|
// Client → CELUNA
|
||||||
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"clientInfo":{"name":"client","version":"1.0"}}}
|
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"clientInfo":{"name":"client","version":"1.0"}}}
|
||||||
|
|
||||||
// AISSIA → Client
|
// CELUNA → Client
|
||||||
{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05","serverInfo":{"name":"aissia","version":"0.2.0"},...}}
|
{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05","serverInfo":{"name":"celuna","version":"0.2.0"},...}}
|
||||||
|
|
||||||
// Lister les tools
|
// Lister les tools
|
||||||
{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}
|
{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}
|
||||||
@ -200,8 +200,8 @@ Ajouter dans la config MCP :
|
|||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"servers": {
|
"servers": {
|
||||||
"aissia": {
|
"celuna": {
|
||||||
"command": "/chemin/vers/build/aissia",
|
"command": "/chemin/vers/build/celuna",
|
||||||
"args": ["--mcp-server"]
|
"args": ["--mcp-server"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
# Architecture Technique - AISSIA
|
# Architecture Technique - CELUNA
|
||||||
|
|
||||||
## Vision Globale
|
## Vision Globale
|
||||||
|
|
||||||
@ -96,7 +96,7 @@ class IModule {
|
|||||||
|
|
||||||
#### Évolution Progressive Détaillée
|
#### Évolution Progressive Détaillée
|
||||||
|
|
||||||
**Phase 1 : Debug/Prototype (MVP AISSIA)**
|
**Phase 1 : Debug/Prototype (MVP CELUNA)**
|
||||||
```cpp
|
```cpp
|
||||||
DebugEngine + SequentialModuleSystem + IntraIO
|
DebugEngine + SequentialModuleSystem + IntraIO
|
||||||
```
|
```
|
||||||
@ -139,7 +139,7 @@ DataOrientedEngine + ClusterModuleSystem + NetworkIO
|
|||||||
#### Évolution Progressive Sans Régression
|
#### Évolution Progressive Sans Régression
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
// Phase 1 : Prototype (MVP AISSIA)
|
// Phase 1 : Prototype (MVP CELUNA)
|
||||||
DebugEngine + SequentialModuleSystem + IntraIO
|
DebugEngine + SequentialModuleSystem + IntraIO
|
||||||
→ Développement ultra-rapide, Claude Code 100% focus logique
|
→ Développement ultra-rapide, Claude Code 100% focus logique
|
||||||
|
|
||||||
@ -327,9 +327,9 @@ cd modules/language-learning/
|
|||||||
# Context: CLAUDE.md (65) + LanguageLearningModule.cpp (145) + IModule.h (30)
|
# Context: CLAUDE.md (65) + LanguageLearningModule.cpp (145) + IModule.h (30)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Modules AISSIA (Exemples)
|
## Modules CELUNA (Exemples)
|
||||||
|
|
||||||
L'architecture modulaire permet de créer des modules spécialisés pour AISSIA :
|
L'architecture modulaire permet de créer des modules spécialisés pour CELUNA :
|
||||||
|
|
||||||
### SchedulerModule
|
### SchedulerModule
|
||||||
- **Responsabilité** : Planning intelligent des tâches
|
- **Responsabilité** : Planning intelligent des tâches
|
||||||
@ -368,7 +368,7 @@ L'architecture modulaire permet de créer des modules spécialisés pour AISSIA
|
|||||||
|
|
||||||
**Protocole uniforme** : JSON-only entre tous les modules via interfaces IIO
|
**Protocole uniforme** : JSON-only entre tous les modules via interfaces IIO
|
||||||
|
|
||||||
### Mode Local (MVP AISSIA)
|
### Mode Local (MVP CELUNA)
|
||||||
|
|
||||||
**Architecture :**
|
**Architecture :**
|
||||||
- Tous modules locaux (IntraIO)
|
- Tous modules locaux (IntraIO)
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
## Vue d'Ensemble
|
## Vue d'Ensemble
|
||||||
|
|
||||||
Ce document décrit l'architecture pour la récupération intelligente de documents dans AISSIA. Le système permet à l'AIAssistantModule de sélectionner et lire des documents de manière efficace sans saturer le context window du LLM.
|
Ce document décrit l'architecture pour la récupération intelligente de documents dans CELUNA. Le système permet à l'AIAssistantModule de sélectionner et lire des documents de manière efficace sans saturer le context window du LLM.
|
||||||
|
|
||||||
### Problème Adressé
|
### Problème Adressé
|
||||||
|
|
||||||
@ -1631,5 +1631,5 @@ void testProviderConsistency() {
|
|||||||
- [Anthropic Tool Use Guide](https://docs.anthropic.com/en/docs/build-with-claude/tool-use)
|
- [Anthropic Tool Use Guide](https://docs.anthropic.com/en/docs/build-with-claude/tool-use)
|
||||||
- [OpenAI Function Calling](https://platform.openai.com/docs/guides/function-calling)
|
- [OpenAI Function Calling](https://platform.openai.com/docs/guides/function-calling)
|
||||||
- [Ollama API](https://github.com/ollama/ollama/blob/main/docs/api.md)
|
- [Ollama API](https://github.com/ollama/ollama/blob/main/docs/api.md)
|
||||||
- [architecture-technique.md](./architecture-technique.md) - Architecture système AISSIA
|
- [architecture-technique.md](./architecture-technique.md) - Architecture système CELUNA
|
||||||
- [claude-code-integration.md](./claude-code-integration.md) - Patterns développement Claude Code
|
- [claude-code-integration.md](./claude-code-integration.md) - Patterns développement Claude Code
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
# AISSIA - Vue d'Ensemble du Projet
|
# CELUNA - Vue d'Ensemble du Projet
|
||||||
|
|
||||||
## Description
|
## Description
|
||||||
|
|
||||||
AISSIA est un assistant personnel intelligent conçu pour :
|
CELUNA est un assistant personnel intelligent conçu pour :
|
||||||
- Gérer le temps et l'hyperfocus (sessions max 2h)
|
- Gérer le temps et l'hyperfocus (sessions max 2h)
|
||||||
- Faciliter l'apprentissage de langues
|
- Faciliter l'apprentissage de langues
|
||||||
- Fournir des interventions proactives via IA pour forcer les transitions et planifier intelligemment
|
- Fournir des interventions proactives via IA pour forcer les transitions et planifier intelligemment
|
||||||
@ -135,7 +135,7 @@ Tous les modules communiquent exclusivement via messages JSON :
|
|||||||
## Structure du Projet
|
## Structure du Projet
|
||||||
|
|
||||||
```
|
```
|
||||||
Aissia/
|
Celuna/
|
||||||
├── CLAUDE.md # Instructions développement (obsolète → ce fichier)
|
├── CLAUDE.md # Instructions développement (obsolète → ce fichier)
|
||||||
├── docs/ # Documentation technique
|
├── docs/ # Documentation technique
|
||||||
│ ├── README.md # Vue d'ensemble
|
│ ├── README.md # Vue d'ensemble
|
||||||
|
|||||||
@ -159,7 +159,7 @@ Problème: JsonDataNode.h définit probablement des macros comme:
|
|||||||
Créer un fichier séparé sans includes GroveEngine:
|
Créer un fichier séparé sans includes GroveEngine:
|
||||||
```cpp
|
```cpp
|
||||||
// stt_impl.cpp - PAS d'include JsonDataNode.h
|
// stt_impl.cpp - PAS d'include JsonDataNode.h
|
||||||
namespace aissia::stt_impl {
|
namespace celuna::stt_impl {
|
||||||
// Toute la logique STT ici
|
// Toute la logique STT ici
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@ -179,7 +179,7 @@ namespace aissia::stt_impl {
|
|||||||
### Option D: Compiler en Bibliothèque Statique 📦
|
### Option D: Compiler en Bibliothèque Statique 📦
|
||||||
```cmake
|
```cmake
|
||||||
# Compiler STTService en lib séparée AVANT VoiceService
|
# Compiler STTService en lib séparée AVANT VoiceService
|
||||||
add_library(AissiaSTT STATIC src/services/STTService.cpp)
|
add_library(CelunaSTT STATIC src/services/STTService.cpp)
|
||||||
# Avec flags de compilation spécifiques
|
# Avec flags de compilation spécifiques
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
**Date de création** : 2025-11-29
|
**Date de création** : 2025-11-29
|
||||||
**Objectif** : Architecture STT complète avec support multi-engines (Vosk, PocketSphinx, Whisper)
|
**Objectif** : Architecture STT complète avec support multi-engines (Vosk, PocketSphinx, Whisper)
|
||||||
**Nom de l'assistant** : Celuna (anciennement AISSIA)
|
**Nom de l'assistant** : Celuna (anciennement CELUNA)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ Créer une couche service qui abstrait la complexité des engines STT et gère :
|
|||||||
#include <functional>
|
#include <functional>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
enum class STTMode {
|
enum class STTMode {
|
||||||
PASSIVE, // Keyword spotting (économe)
|
PASSIVE, // Keyword spotting (économe)
|
||||||
@ -167,7 +167,7 @@ public:
|
|||||||
virtual std::string getCurrentEngine() const = 0;
|
virtual std::string getCurrentEngine() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
```
|
```
|
||||||
|
|
||||||
**Estimation** : 50 lignes
|
**Estimation** : 50 lignes
|
||||||
@ -285,7 +285,7 @@ unzip vosk-model-small-fr-0.22.zip -d models/
|
|||||||
#include <vosk_api.h>
|
#include <vosk_api.h>
|
||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
class VoskSTTEngine : public ISTTEngine {
|
class VoskSTTEngine : public ISTTEngine {
|
||||||
public:
|
public:
|
||||||
@ -363,7 +363,7 @@ private:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
```
|
```
|
||||||
|
|
||||||
**Estimation** : 200 lignes
|
**Estimation** : 200 lignes
|
||||||
@ -399,7 +399,7 @@ hey celuna /1e-50/
|
|||||||
#include <pocketsphinx.h>
|
#include <pocketsphinx.h>
|
||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
class PocketSphinxEngine : public ISTTEngine {
|
class PocketSphinxEngine : public ISTTEngine {
|
||||||
public:
|
public:
|
||||||
@ -478,7 +478,7 @@ private:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
```
|
```
|
||||||
|
|
||||||
**Estimation** : 180 lignes
|
**Estimation** : 180 lignes
|
||||||
@ -520,7 +520,7 @@ make
|
|||||||
#include "WhisperCppEngine.hpp"
|
#include "WhisperCppEngine.hpp"
|
||||||
#include "WhisperAPIEngine.hpp"
|
#include "WhisperAPIEngine.hpp"
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
std::unique_ptr<ISTTEngine> STTEngineFactory::create(
|
std::unique_ptr<ISTTEngine> STTEngineFactory::create(
|
||||||
const std::string& type,
|
const std::string& type,
|
||||||
@ -556,7 +556,7 @@ std::unique_ptr<ISTTEngine> STTEngineFactory::create(
|
|||||||
return std::make_unique<StubSTTEngine>();
|
return std::make_unique<StubSTTEngine>();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
```
|
```
|
||||||
|
|
||||||
**Estimation** : 80 lignes
|
**Estimation** : 80 lignes
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
# Prompt pour Implémenter le Système de Tests d'Intégration
|
# Prompt pour Implémenter le Système de Tests d'Intégration
|
||||||
|
|
||||||
Salut ! Je reprends l'implémentation du **système de tests d'intégration** pour AISSIA.
|
Salut ! Je reprends l'implémentation du **système de tests d'intégration** pour CELUNA.
|
||||||
|
|
||||||
## Contexte
|
## 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.
|
CELUNA 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** :
|
**État actuel** :
|
||||||
- ✅ 7 modules fonctionnels (Scheduler, Notification, Monitoring, AI, Voice, Storage, Web)
|
- ✅ 7 modules fonctionnels (Scheduler, Notification, Monitoring, AI, Voice, Storage, Web)
|
||||||
@ -257,7 +257,7 @@ extern "C" {
|
|||||||
|
|
||||||
```
|
```
|
||||||
========================================
|
========================================
|
||||||
AISSIA Integration Tests
|
CELUNA Integration Tests
|
||||||
Running 13 tests...
|
Running 13 tests...
|
||||||
========================================
|
========================================
|
||||||
|
|
||||||
@ -318,7 +318,7 @@ ls build/tests/integration/
|
|||||||
# ...
|
# ...
|
||||||
|
|
||||||
# Lancer les tests
|
# Lancer les tests
|
||||||
./build/aissia --run-tests
|
./build/celuna --run-tests
|
||||||
|
|
||||||
# Vérifier exit code
|
# Vérifier exit code
|
||||||
echo $? # Doit être 0 si tous passent
|
echo $? # Doit être 0 si tous passent
|
||||||
@ -357,10 +357,10 @@ cmake --build build -j4
|
|||||||
cmake --build build --target integration_tests
|
cmake --build build --target integration_tests
|
||||||
|
|
||||||
# Run tests avec verbose
|
# Run tests avec verbose
|
||||||
./build/aissia --run-tests --verbose
|
./build/celuna --run-tests --verbose
|
||||||
|
|
||||||
# Run tests avec JSON output
|
# Run tests avec JSON output
|
||||||
./build/aissia --run-tests --json-output results.json
|
./build/celuna --run-tests --json-output results.json
|
||||||
|
|
||||||
# Run un seul test (debug)
|
# Run un seul test (debug)
|
||||||
# (charger manuellement le .so dans le code)
|
# (charger manuellement le .so dans le code)
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
# État des Tests d'Intégration AISSIA - Phase 5 TERMINÉE ✅
|
# État des Tests d'Intégration CELUNA - Phase 5 TERMINÉE ✅
|
||||||
|
|
||||||
## Résumé Exécutif
|
## Résumé Exécutif
|
||||||
|
|
||||||
@ -59,7 +59,7 @@
|
|||||||
## 📊 Résultats d'Exécution (Dernière Run)
|
## 📊 Résultats d'Exécution (Dernière Run)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd build && ./aissia --run-tests
|
cd build && ./celuna --run-tests
|
||||||
```
|
```
|
||||||
|
|
||||||
**Résumé** : `1/13 PASS (7.7%)` | Durée totale : `130.7s`
|
**Résumé** : `1/13 PASS (7.7%)` | Durée totale : `130.7s`
|
||||||
@ -98,7 +98,7 @@ cd build && ./aissia --run-tests
|
|||||||
ANTHROPIC_API_KEY=sk-ant-xxx
|
ANTHROPIC_API_KEY=sk-ant-xxx
|
||||||
|
|
||||||
# Puis :
|
# Puis :
|
||||||
cd build && source ../.env && ./aissia --run-tests
|
cd build && source ../.env && ./celuna --run-tests
|
||||||
```
|
```
|
||||||
|
|
||||||
**Impact** : 9/13 tests ne peuvent pas s'exécuter sans API Claude
|
**Impact** : 9/13 tests ne peuvent pas s'exécuter sans API Claude
|
||||||
@ -238,8 +238,8 @@ plans/PROMPT_NEXT_INTEGRATION_TESTS.md +517 lignes (ce fichier)
|
|||||||
|
|
||||||
**Tâches** :
|
**Tâches** :
|
||||||
1. Modifier `main.cpp` pour charger modules en mode test
|
1. Modifier `main.cpp` pour charger modules en mode test
|
||||||
2. Rebuild : `cmake --build build --target aissia`
|
2. Rebuild : `cmake --build build --target celuna`
|
||||||
3. Tester avec API : `cd build && source ../.env && ./aissia --run-tests`
|
3. Tester avec API : `cd build && source ../.env && ./celuna --run-tests`
|
||||||
4. Valider : 13/13 PASS ✅
|
4. Valider : 13/13 PASS ✅
|
||||||
|
|
||||||
**Durée estimée** : 15 minutes
|
**Durée estimée** : 15 minutes
|
||||||
@ -319,7 +319,7 @@ Tous les topics IIO utilisés dans les tests ont été vérifiés dans le code s
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1. Vérifier l'état
|
# 1. Vérifier l'état
|
||||||
cd /mnt/e/Users/Alexis\ Trouvé/Documents/Projets/Aissia
|
cd /mnt/e/Users/Alexis\ Trouvé/Documents/Projets/Celuna
|
||||||
git log --oneline -3
|
git log --oneline -3
|
||||||
# Devrait montrer : 24810a7, 93800ca, d5cbf3b
|
# Devrait montrer : 24810a7, 93800ca, d5cbf3b
|
||||||
|
|
||||||
@ -329,7 +329,7 @@ cat plans/PROMPT_NEXT_INTEGRATION_TESTS.md
|
|||||||
# 3. Choisir Option A ou B (voir ci-dessus)
|
# 3. Choisir Option A ou B (voir ci-dessus)
|
||||||
|
|
||||||
# 4. Tester
|
# 4. Tester
|
||||||
cd build && ./aissia --run-tests
|
cd build && ./celuna --run-tests
|
||||||
cat test-results.json | python3 -m json.tool
|
cat test-results.json | python3 -m json.tool
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
# Prompt pour Implémenter WebModule
|
# Prompt pour Implémenter WebModule
|
||||||
|
|
||||||
Salut ! Je reprends l'implémentation du **WebModule** pour AISSIA.
|
Salut ! Je reprends l'implémentation du **WebModule** pour CELUNA.
|
||||||
|
|
||||||
## Contexte
|
## 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.
|
CELUNA 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** :
|
**État actuel** :
|
||||||
- ✅ 6 modules fonctionnels (Scheduler, Notification, Monitoring, AI, Voice, Storage)
|
- ✅ 6 modules fonctionnels (Scheduler, Notification, Monitoring, AI, Voice, Storage)
|
||||||
@ -121,13 +121,13 @@ Avant de considérer le travail terminé :
|
|||||||
```bash
|
```bash
|
||||||
# Build
|
# Build
|
||||||
cmake --build build --target modules -j4
|
cmake --build build --target modules -j4
|
||||||
cmake --build build --target aissia_tests -j4
|
cmake --build build --target celuna_tests -j4
|
||||||
|
|
||||||
# Tests
|
# Tests
|
||||||
./build/tests/aissia_tests "[web]"
|
./build/tests/celuna_tests "[web]"
|
||||||
|
|
||||||
# Vérifier que tous les tests passent toujours
|
# Vérifier que tous les tests passent toujours
|
||||||
./build/tests/aissia_tests --reporter compact
|
./build/tests/celuna_tests --reporter compact
|
||||||
```
|
```
|
||||||
|
|
||||||
**Critère de succès** : 120/120 tests passent (110 existants + 10 nouveaux)
|
**Critère de succès** : 120/120 tests passent (110 existants + 10 nouveaux)
|
||||||
@ -135,7 +135,7 @@ cmake --build build --target aissia_tests -j4
|
|||||||
### Hot-Reload
|
### Hot-Reload
|
||||||
Teste manuellement le hot-reload :
|
Teste manuellement le hot-reload :
|
||||||
```bash
|
```bash
|
||||||
# 1. Lance AISSIA
|
# 1. Lance CELUNA
|
||||||
./run.sh
|
./run.sh
|
||||||
|
|
||||||
# 2. Modifie WebModule.cpp (change un log)
|
# 2. Modifie WebModule.cpp (change un log)
|
||||||
@ -164,10 +164,10 @@ cmake -B build && cmake --build build -j4
|
|||||||
cmake --build build --target modules
|
cmake --build build --target modules
|
||||||
|
|
||||||
# Tests avec filtre
|
# Tests avec filtre
|
||||||
./build/tests/aissia_tests "[web]"
|
./build/tests/celuna_tests "[web]"
|
||||||
|
|
||||||
# Tous les tests
|
# Tous les tests
|
||||||
./build/tests/aissia_tests --reporter compact
|
./build/tests/celuna_tests --reporter compact
|
||||||
|
|
||||||
# Git
|
# Git
|
||||||
git add -A
|
git add -A
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
# Plan Complet : Système de Tests d'Intégration avec Modules Dynamiques
|
# Plan Complet : Système de Tests d'Intégration avec Modules Dynamiques
|
||||||
|
|
||||||
**Objectif** : Créer un système de tests d'intégration qui valide le fonctionnement complet d'AISSIA en conditions réelles, en utilisant l'architecture modulaire de GroveEngine pour rendre chaque test isolé, extensible et hot-reloadable.
|
**Objectif** : Créer un système de tests d'intégration qui valide le fonctionnement complet d'CELUNA en conditions réelles, en utilisant l'architecture modulaire de GroveEngine pour rendre chaque test isolé, extensible et hot-reloadable.
|
||||||
|
|
||||||
**Date** : 2025-11-28
|
**Date** : 2025-11-28
|
||||||
**Auteur** : Claude Code
|
**Auteur** : Claude Code
|
||||||
@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
### 1.1 But Principal
|
### 1.1 But Principal
|
||||||
|
|
||||||
Valider automatiquement qu'AISSIA fonctionne correctement en **conditions réelles** :
|
Valider automatiquement qu'CELUNA fonctionne correctement en **conditions réelles** :
|
||||||
- Communication inter-modules via IIO
|
- Communication inter-modules via IIO
|
||||||
- Services infrastructure (LLM, Storage, Platform, Voice)
|
- Services infrastructure (LLM, Storage, Platform, Voice)
|
||||||
- MCP tools (17 tools internes + externes)
|
- MCP tools (17 tools internes + externes)
|
||||||
@ -44,7 +44,7 @@ Chaque test d'intégration est un module GroveEngine indépendant :
|
|||||||
|
|
||||||
```
|
```
|
||||||
┌─────────────────────────────────────────────────────┐
|
┌─────────────────────────────────────────────────────┐
|
||||||
│ AISSIA --run-tests │
|
│ CELUNA --run-tests │
|
||||||
│ │
|
│ │
|
||||||
│ ┌────────────────────────────────────────────┐ │
|
│ ┌────────────────────────────────────────────┐ │
|
||||||
│ │ TestRunnerModule │ │
|
│ │ TestRunnerModule │ │
|
||||||
@ -75,7 +75,7 @@ Chaque test d'intégration est un module GroveEngine indépendant :
|
|||||||
│ └────────────────────────────────────────────┘ │
|
│ └────────────────────────────────────────────┘ │
|
||||||
│ ▼ │
|
│ ▼ │
|
||||||
│ ┌────────────────────────────────────────────┐ │
|
│ ┌────────────────────────────────────────────┐ │
|
||||||
│ │ Modules AISSIA (testés) │ │
|
│ │ Modules CELUNA (testés) │ │
|
||||||
│ │ Scheduler, Notification, Monitoring, │ │
|
│ │ Scheduler, Notification, Monitoring, │ │
|
||||||
│ │ AI, Voice, Storage, Web │ │
|
│ │ AI, Voice, Storage, Web │ │
|
||||||
│ └────────────────────────────────────────────┘ │
|
│ └────────────────────────────────────────────┘ │
|
||||||
@ -93,8 +93,8 @@ Chaque test d'intégration est un module GroveEngine indépendant :
|
|||||||
### 2.2 Flux d'Exécution
|
### 2.2 Flux d'Exécution
|
||||||
|
|
||||||
```
|
```
|
||||||
1. User: ./build/aissia --run-tests
|
1. User: ./build/celuna --run-tests
|
||||||
2. AISSIA démarre en mode test
|
2. CELUNA démarre en mode test
|
||||||
3. Charge TestRunnerModule (au lieu des modules normaux)
|
3. Charge TestRunnerModule (au lieu des modules normaux)
|
||||||
4. TestRunnerModule:
|
4. TestRunnerModule:
|
||||||
a. Lit config/test_runner.json
|
a. Lit config/test_runner.json
|
||||||
@ -173,7 +173,7 @@ private:
|
|||||||
**But** : Interface commune pour tous les modules de test
|
**But** : Interface commune pour tous les modules de test
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
namespace aissia::testing {
|
namespace celuna::testing {
|
||||||
|
|
||||||
struct TestResult {
|
struct TestResult {
|
||||||
bool passed = false;
|
bool passed = false;
|
||||||
@ -190,7 +190,7 @@ public:
|
|||||||
virtual std::string getDescription() const = 0;
|
virtual std::string getDescription() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia::testing
|
} // namespace celuna::testing
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3.3 Modules de Test Individuels
|
### 3.3 Modules de Test Individuels
|
||||||
@ -287,7 +287,7 @@ Exemple : `IT_001_GetCurrentTime.cpp`
|
|||||||
#include <grove/JsonDataNode.h>
|
#include <grove/JsonDataNode.h>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
||||||
namespace aissia::testing {
|
namespace celuna::testing {
|
||||||
|
|
||||||
class IT_001_GetCurrentTime : public ITestModule {
|
class IT_001_GetCurrentTime : public ITestModule {
|
||||||
public:
|
public:
|
||||||
@ -387,12 +387,12 @@ private:
|
|||||||
int m_timeout = 10000;
|
int m_timeout = 10000;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia::testing
|
} // namespace celuna::testing
|
||||||
|
|
||||||
// Factory functions
|
// Factory functions
|
||||||
extern "C" {
|
extern "C" {
|
||||||
grove::IModule* createModule() {
|
grove::IModule* createModule() {
|
||||||
return new aissia::testing::IT_001_GetCurrentTime();
|
return new celuna::testing::IT_001_GetCurrentTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroyModule(grove::IModule* module) {
|
void destroyModule(grove::IModule* module) {
|
||||||
@ -423,7 +423,7 @@ Chaque test a son JSON : `config/integration/IT_001.json`
|
|||||||
|
|
||||||
```
|
```
|
||||||
========================================
|
========================================
|
||||||
AISSIA Integration Tests
|
CELUNA Integration Tests
|
||||||
Running 13 tests...
|
Running 13 tests...
|
||||||
========================================
|
========================================
|
||||||
|
|
||||||
@ -671,16 +671,16 @@ ls build/tests/integration/
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Lancer tous les tests
|
# Lancer tous les tests
|
||||||
./build/aissia --run-tests
|
./build/celuna --run-tests
|
||||||
|
|
||||||
# Avec config custom
|
# Avec config custom
|
||||||
./build/aissia --run-tests --test-config config/my_tests.json
|
./build/celuna --run-tests --test-config config/my_tests.json
|
||||||
|
|
||||||
# Verbose mode
|
# Verbose mode
|
||||||
./build/aissia --run-tests --verbose
|
./build/celuna --run-tests --verbose
|
||||||
|
|
||||||
# Sauvegarder résultats JSON
|
# Sauvegarder résultats JSON
|
||||||
./build/aissia --run-tests --json-output results.json
|
./build/celuna --run-tests --json-output results.json
|
||||||
```
|
```
|
||||||
|
|
||||||
### 8.3 CI/CD
|
### 8.3 CI/CD
|
||||||
@ -696,7 +696,7 @@ cmake -B build -DBUILD_TESTING=ON
|
|||||||
cmake --build build --target integration_tests -j4
|
cmake --build build --target integration_tests -j4
|
||||||
|
|
||||||
# Run tests
|
# Run tests
|
||||||
./build/aissia --run-tests --json-output test-results.json
|
./build/celuna --run-tests --json-output test-results.json
|
||||||
|
|
||||||
# Exit code: 0 = success, 1 = failure
|
# Exit code: 0 = success, 1 = failure
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
@ -811,4 +811,4 @@ README.md # Documenter système de tests
|
|||||||
|
|
||||||
**Plan prêt pour implémentation** 🚀
|
**Plan prêt pour implémentation** 🚀
|
||||||
|
|
||||||
Ce plan détaille un système de tests d'intégration innovant qui utilise l'architecture modulaire de GroveEngine pour rendre chaque test isolé, extensible et hot-reloadable. L'approche "un module = un test" démontre la puissance du système tout en fournissant une validation complète d'AISSIA en conditions réelles.
|
Ce plan détaille un système de tests d'intégration innovant qui utilise l'architecture modulaire de GroveEngine pour rendre chaque test isolé, extensible et hot-reloadable. L'approche "un module = un test" démontre la puissance du système tout en fournissant une validation complète d'CELUNA en conditions réelles.
|
||||||
|
|||||||
@ -58,7 +58,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
class WebModule : public grove::IModule {
|
class WebModule : public grove::IModule {
|
||||||
public:
|
public:
|
||||||
@ -96,7 +96,7 @@ private:
|
|||||||
int m_failedRequests = 0;
|
int m_failedRequests = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
```
|
```
|
||||||
|
|
||||||
#### `src/modules/WebModule.cpp` (180 lignes)
|
#### `src/modules/WebModule.cpp` (180 lignes)
|
||||||
@ -251,8 +251,8 @@ TI_WEB_010: Error Response Format
|
|||||||
|
|
||||||
7. **Exécuter les tests**
|
7. **Exécuter les tests**
|
||||||
```bash
|
```bash
|
||||||
cmake --build build --target aissia_tests
|
cmake --build build --target celuna_tests
|
||||||
./build/tests/aissia_tests "[web]"
|
./build/tests/celuna_tests "[web]"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Phase 3: Documentation & Exemples (30min)
|
### Phase 3: Documentation & Exemples (30min)
|
||||||
|
|||||||
24
src/main.cpp
24
src/main.cpp
@ -187,7 +187,7 @@ int runMCPServer() {
|
|||||||
// === Initialize Services ===
|
// === Initialize Services ===
|
||||||
|
|
||||||
// 1. LLMService (PRIORITY: for chat_with_aissia)
|
// 1. LLMService (PRIORITY: for chat_with_aissia)
|
||||||
auto llmService = std::make_unique<aissia::LLMService>();
|
auto llmService = std::make_unique<celuna::LLMService>();
|
||||||
if (!llmService->loadConfig("config/llm.json")) {
|
if (!llmService->loadConfig("config/llm.json")) {
|
||||||
spdlog::warn("Failed to load LLM config, chat_with_aissia will be unavailable");
|
spdlog::warn("Failed to load LLM config, chat_with_aissia will be unavailable");
|
||||||
}
|
}
|
||||||
@ -195,16 +195,16 @@ int runMCPServer() {
|
|||||||
llmService->initializeTools(); // Load internal tools + MCP tools
|
llmService->initializeTools(); // Load internal tools + MCP tools
|
||||||
|
|
||||||
// 2. StorageService (for save_memory/search_memories)
|
// 2. StorageService (for save_memory/search_memories)
|
||||||
auto storageService = std::make_unique<aissia::StorageService>();
|
auto storageService = std::make_unique<celuna::StorageService>();
|
||||||
storageService->initialize(nullptr);
|
storageService->initialize(nullptr);
|
||||||
|
|
||||||
// 3. VoiceService (for TTS/STT)
|
// 3. VoiceService (for TTS/STT)
|
||||||
auto voiceService = std::make_unique<aissia::VoiceService>();
|
auto voiceService = std::make_unique<celuna::VoiceService>();
|
||||||
// Note: Voice config is optional
|
// Note: Voice config is optional
|
||||||
voiceService->initialize(nullptr);
|
voiceService->initialize(nullptr);
|
||||||
|
|
||||||
// === Create Tool Registry ===
|
// === Create Tool Registry ===
|
||||||
aissia::ToolRegistry registry;
|
celuna::ToolRegistry registry;
|
||||||
|
|
||||||
// Register get_current_time tool
|
// Register get_current_time tool
|
||||||
registry.registerTool(
|
registry.registerTool(
|
||||||
@ -221,20 +221,20 @@ int runMCPServer() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Register FileSystem tools
|
// Register FileSystem tools
|
||||||
for (const auto& toolDef : aissia::tools::FileSystemTools::getToolDefinitions()) {
|
for (const auto& toolDef : celuna::tools::FileSystemTools::getToolDefinitions()) {
|
||||||
std::string toolName = toolDef["name"].get<std::string>();
|
std::string toolName = toolDef["name"].get<std::string>();
|
||||||
registry.registerTool(
|
registry.registerTool(
|
||||||
toolName,
|
toolName,
|
||||||
toolDef["description"].get<std::string>(),
|
toolDef["description"].get<std::string>(),
|
||||||
toolDef["input_schema"],
|
toolDef["input_schema"],
|
||||||
[toolName](const nlohmann::json& input) -> nlohmann::json {
|
[toolName](const nlohmann::json& input) -> nlohmann::json {
|
||||||
return aissia::tools::FileSystemTools::execute(toolName, input);
|
return celuna::tools::FileSystemTools::execute(toolName, input);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// === Register AISSIA Tools (Phase 8) ===
|
// === Register AISSIA Tools (Phase 8) ===
|
||||||
aissia::tools::MCPServerTools aissiaTools(
|
celuna::tools::MCPServerTools aissiaTools(
|
||||||
llmService.get(),
|
llmService.get(),
|
||||||
storageService.get(),
|
storageService.get(),
|
||||||
voiceService.get()
|
voiceService.get()
|
||||||
@ -247,7 +247,7 @@ int runMCPServer() {
|
|||||||
spdlog::info("Registered {} tools total", registry.size());
|
spdlog::info("Registered {} tools total", registry.size());
|
||||||
|
|
||||||
// Create and run MCP server
|
// Create and run MCP server
|
||||||
aissia::mcp::MCPServer server(registry);
|
celuna::mcp::MCPServer server(registry);
|
||||||
server.setServerInfo("aissia", "0.2.0");
|
server.setServerInfo("aissia", "0.2.0");
|
||||||
server.run();
|
server.run();
|
||||||
|
|
||||||
@ -356,7 +356,7 @@ int main(int argc, char* argv[]) {
|
|||||||
auto voiceIO = grove::IOFactory::create("intra", "VoiceService");
|
auto voiceIO = grove::IOFactory::create("intra", "VoiceService");
|
||||||
|
|
||||||
// LLM Service
|
// LLM Service
|
||||||
aissia::LLMService llmService;
|
celuna::LLMService llmService;
|
||||||
llmService.initialize(llmIO.get());
|
llmService.initialize(llmIO.get());
|
||||||
llmService.loadConfig(configDir + "ai.json");
|
llmService.loadConfig(configDir + "ai.json");
|
||||||
|
|
||||||
@ -375,7 +375,7 @@ int main(int argc, char* argv[]) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Storage Service
|
// Storage Service
|
||||||
aissia::StorageService storageService;
|
celuna::StorageService storageService;
|
||||||
storageService.initialize(storageIO.get());
|
storageService.initialize(storageIO.get());
|
||||||
{
|
{
|
||||||
auto storageConfig = loadConfig(configDir + "storage.json");
|
auto storageConfig = loadConfig(configDir + "storage.json");
|
||||||
@ -386,7 +386,7 @@ int main(int argc, char* argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Platform Service
|
// Platform Service
|
||||||
aissia::PlatformService platformService;
|
celuna::PlatformService platformService;
|
||||||
platformService.initialize(platformIO.get());
|
platformService.initialize(platformIO.get());
|
||||||
{
|
{
|
||||||
auto monitorConfig = loadConfig(configDir + "monitoring.json");
|
auto monitorConfig = loadConfig(configDir + "monitoring.json");
|
||||||
@ -396,7 +396,7 @@ int main(int argc, char* argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Voice Service
|
// Voice Service
|
||||||
aissia::VoiceService voiceService;
|
celuna::VoiceService voiceService;
|
||||||
voiceService.initialize(voiceIO.get());
|
voiceService.initialize(voiceIO.get());
|
||||||
{
|
{
|
||||||
// Load voice.json directly as nlohmann::json for Phase 7 STT
|
// Load voice.json directly as nlohmann::json for Phase 7 STT
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
#include <grove/IIO.h>
|
#include <grove/IIO.h>
|
||||||
#include <grove/JsonDataNode.h>
|
#include <grove/JsonDataNode.h>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
AIModule::AIModule() {
|
AIModule::AIModule() {
|
||||||
m_logger = spdlog::get("AIModule");
|
m_logger = spdlog::get("AIModule");
|
||||||
@ -191,13 +191,13 @@ void AIModule::setState(const grove::IDataNode& state) {
|
|||||||
m_logger->info("Etat restore: queries={}, tokens={}", m_totalQueries, m_totalTokens);
|
m_logger->info("Etat restore: queries={}, tokens={}", m_totalQueries, m_totalTokens);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|
||||||
#ifndef AISSIA_TEST_BUILD
|
#ifndef CELUNA_TEST_BUILD
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
grove::IModule* createModule() {
|
grove::IModule* createModule() {
|
||||||
return new aissia::AIModule();
|
return new celuna::AIModule();
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroyModule(grove::IModule* module) {
|
void destroyModule(grove::IModule* module) {
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief AI Assistant Module - Pure business logic
|
* @brief AI Assistant Module - Pure business logic
|
||||||
@ -73,7 +73,7 @@ private:
|
|||||||
void publishSuggestion(const std::string& message, int duration);
|
void publishSuggestion(const std::string& message, int duration);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
grove::IModule* createModule();
|
grove::IModule* createModule();
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
#include <grove/JsonDataNode.h>
|
#include <grove/JsonDataNode.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
MonitoringModule::MonitoringModule() {
|
MonitoringModule::MonitoringModule() {
|
||||||
m_logger = spdlog::get("MonitoringModule");
|
m_logger = spdlog::get("MonitoringModule");
|
||||||
@ -273,13 +273,13 @@ void MonitoringModule::setState(const grove::IDataNode& state) {
|
|||||||
m_logger->info("Etat restore: app={}, productif={}s", m_currentApp, m_totalProductiveSeconds);
|
m_logger->info("Etat restore: app={}, productif={}s", m_currentApp, m_totalProductiveSeconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|
||||||
#ifndef AISSIA_TEST_BUILD
|
#ifndef CELUNA_TEST_BUILD
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
grove::IModule* createModule() {
|
grove::IModule* createModule() {
|
||||||
return new aissia::MonitoringModule();
|
return new celuna::MonitoringModule();
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroyModule(grove::IModule* module) {
|
void destroyModule(grove::IModule* module) {
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
#include <set>
|
#include <set>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Monitoring Module - App classification logic only
|
* @brief Monitoring Module - App classification logic only
|
||||||
@ -77,7 +77,7 @@ private:
|
|||||||
void handleToolQuery(const grove::IDataNode& request);
|
void handleToolQuery(const grove::IDataNode& request);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
grove::IModule* createModule();
|
grove::IModule* createModule();
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
#include "NotificationModule.h"
|
#include "NotificationModule.h"
|
||||||
#include <grove/JsonDataNode.h>
|
#include <grove/JsonDataNode.h>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
NotificationModule::NotificationModule() {
|
NotificationModule::NotificationModule() {
|
||||||
m_logger = spdlog::get("NotificationModule");
|
m_logger = spdlog::get("NotificationModule");
|
||||||
@ -157,13 +157,13 @@ void NotificationModule::setState(const grove::IDataNode& state) {
|
|||||||
m_logger->info("État restauré: {} notifications historiques", m_notificationCount);
|
m_logger->info("État restauré: {} notifications historiques", m_notificationCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|
||||||
#ifndef AISSIA_TEST_BUILD
|
#ifndef CELUNA_TEST_BUILD
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
grove::IModule* createModule() {
|
grove::IModule* createModule() {
|
||||||
return new aissia::NotificationModule();
|
return new celuna::NotificationModule();
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroyModule(grove::IModule* module) {
|
void destroyModule(grove::IModule* module) {
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Notification Module - Alertes système et TTS
|
* @brief Notification Module - Alertes système et TTS
|
||||||
@ -88,7 +88,7 @@ private:
|
|||||||
std::string priorityToEmoji(Priority p);
|
std::string priorityToEmoji(Priority p);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
grove::IModule* createModule();
|
grove::IModule* createModule();
|
||||||
|
|||||||
@ -1,8 +1,9 @@
|
|||||||
#include "SchedulerModule.h"
|
#include "SchedulerModule.h"
|
||||||
#include <grove/IIO.h>
|
#include <grove/IIO.h>
|
||||||
#include <grove/JsonDataNode.h>
|
#include <grove/JsonDataNode.h>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
SchedulerModule::SchedulerModule() {
|
SchedulerModule::SchedulerModule() {
|
||||||
m_logger = spdlog::get("SchedulerModule");
|
m_logger = spdlog::get("SchedulerModule");
|
||||||
@ -44,69 +45,43 @@ const grove::IDataNode& SchedulerModule::getConfiguration() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SchedulerModule::process(const grove::IDataNode& input) {
|
void SchedulerModule::process(const grove::IDataNode& input) {
|
||||||
float currentTime = input.getDouble("gameTime", 0.0);
|
m_lastActivityTime = input.getDouble("gameTime", 0.0);
|
||||||
|
|
||||||
// Update last activity time
|
|
||||||
m_lastActivityTime = currentTime;
|
|
||||||
|
|
||||||
// Process incoming messages
|
|
||||||
processMessages();
|
processMessages();
|
||||||
|
float sessionMinutes = (m_lastActivityTime - m_sessionStartTime) / 60.0f;
|
||||||
// Convertir le temps en minutes pour les calculs
|
checkHyperfocus(m_lastActivityTime);
|
||||||
float sessionMinutes = (currentTime - m_sessionStartTime) / 60.0f;
|
checkBreakReminder(m_lastActivityTime);
|
||||||
|
// Log periodique (toutes les 5 minutes)
|
||||||
// Verifier l'hyperfocus
|
|
||||||
checkHyperfocus(currentTime);
|
|
||||||
|
|
||||||
// Verifier les rappels de pause
|
|
||||||
checkBreakReminder(currentTime);
|
|
||||||
|
|
||||||
// Log periodique (toutes les 5 minutes simulees)
|
|
||||||
static float lastLog = 0;
|
static float lastLog = 0;
|
||||||
if (currentTime - lastLog > 300.0f) { // 300 secondes = 5 minutes
|
if (m_lastActivityTime - lastLog > 300.0f) {
|
||||||
lastLog = currentTime;
|
lastLog = m_lastActivityTime;
|
||||||
m_logger->debug("Session: {:.1f}min, Focus aujourd'hui: {}min, Tache: {}",
|
m_logger->debug("Session: {:.1f}min, Focus: {}min, Tache: {}", sessionMinutes,
|
||||||
sessionMinutes, m_totalFocusMinutesToday,
|
m_totalFocusMinutesToday, m_currentTaskId.empty() ? "(aucune)" : m_currentTaskId);
|
||||||
m_currentTaskId.empty() ? "(aucune)" : m_currentTaskId);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SchedulerModule::processMessages() {
|
void SchedulerModule::processMessages() {
|
||||||
if (!m_io) return;
|
if (!m_io) return;
|
||||||
|
|
||||||
while (m_io->hasMessages() > 0) {
|
while (m_io->hasMessages() > 0) {
|
||||||
auto msg = m_io->pullMessage();
|
auto msg = m_io->pullMessage();
|
||||||
|
|
||||||
if (msg.topic == "user:task_switch" && msg.data) {
|
if (msg.topic == "user:task_switch" && msg.data) {
|
||||||
std::string taskId = msg.data->getString("taskId", "");
|
std::string taskId = msg.data->getString("taskId", "");
|
||||||
if (!taskId.empty()) {
|
if (!taskId.empty()) startTask(taskId);
|
||||||
startTask(taskId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (msg.topic == "monitoring:idle_detected" && msg.data) {
|
else if (msg.topic == "monitoring:idle_detected" && msg.data)
|
||||||
// User went idle - pause tracking
|
|
||||||
m_logger->debug("User idle, pausing session tracking");
|
m_logger->debug("User idle, pausing session tracking");
|
||||||
}
|
else if (msg.topic == "monitoring:activity_resumed" && msg.data)
|
||||||
else if (msg.topic == "monitoring:activity_resumed" && msg.data) {
|
|
||||||
// User returned - resume tracking
|
|
||||||
m_logger->debug("User active, resuming session tracking");
|
m_logger->debug("User active, resuming session tracking");
|
||||||
}
|
else if (msg.topic == "scheduler:query" && msg.data)
|
||||||
// Tool query handlers
|
|
||||||
else if (msg.topic == "scheduler:query" && msg.data) {
|
|
||||||
handleToolQuery(*msg.data);
|
handleToolQuery(*msg.data);
|
||||||
}
|
else if (msg.topic == "scheduler:command" && msg.data)
|
||||||
else if (msg.topic == "scheduler:command" && msg.data) {
|
|
||||||
handleToolCommand(*msg.data);
|
handleToolCommand(*msg.data);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SchedulerModule::handleToolQuery(const grove::IDataNode& request) {
|
void SchedulerModule::handleToolQuery(const grove::IDataNode& request) {
|
||||||
std::string correlationId = request.getString("correlation_id", "");
|
|
||||||
std::string action = request.getString("action", "");
|
|
||||||
|
|
||||||
auto response = std::make_unique<grove::JsonDataNode>("response");
|
auto response = std::make_unique<grove::JsonDataNode>("response");
|
||||||
response->setString("correlation_id", correlationId);
|
response->setString("correlation_id", request.getString("correlation_id", ""));
|
||||||
|
std::string action = request.getString("action", "");
|
||||||
|
|
||||||
if (action == "get_current_task") {
|
if (action == "get_current_task") {
|
||||||
Task* task = findTask(m_currentTaskId);
|
Task* task = findTask(m_currentTaskId);
|
||||||
@ -114,7 +89,16 @@ void SchedulerModule::handleToolQuery(const grove::IDataNode& request) {
|
|||||||
response->setString("task_name", task ? task->name : (m_currentTaskId.empty() ? "Aucune tache active" : m_currentTaskId));
|
response->setString("task_name", task ? task->name : (m_currentTaskId.empty() ? "Aucune tache active" : m_currentTaskId));
|
||||||
float sessionMinutes = m_currentTaskId.empty() ? 0 : (m_lastActivityTime - m_sessionStartTime) / 60.0f;
|
float sessionMinutes = m_currentTaskId.empty() ? 0 : (m_lastActivityTime - m_sessionStartTime) / 60.0f;
|
||||||
response->setInt("duration_minutes", static_cast<int>(sessionMinutes));
|
response->setInt("duration_minutes", static_cast<int>(sessionMinutes));
|
||||||
response->setString("started_at", ""); // TODO: format timestamp
|
// Format timestamp: calculate start time from elapsed seconds
|
||||||
|
if (!m_currentTaskId.empty()) {
|
||||||
|
auto now = std::chrono::system_clock::now() - std::chrono::seconds(static_cast<long long>(m_lastActivityTime - m_sessionStartTime));
|
||||||
|
auto ts = std::chrono::system_clock::to_time_t(now);
|
||||||
|
char buf[64];
|
||||||
|
std::strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%SZ", std::gmtime(&ts));
|
||||||
|
response->setString("started_at", buf);
|
||||||
|
} else {
|
||||||
|
response->setString("started_at", "");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (action == "list_tasks") {
|
else if (action == "list_tasks") {
|
||||||
bool includeCompleted = request.getBool("include_completed", false);
|
bool includeCompleted = request.getBool("include_completed", false);
|
||||||
@ -142,17 +126,15 @@ void SchedulerModule::handleToolQuery(const grove::IDataNode& request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SchedulerModule::handleToolCommand(const grove::IDataNode& request) {
|
void SchedulerModule::handleToolCommand(const grove::IDataNode& request) {
|
||||||
std::string correlationId = request.getString("correlation_id", "");
|
|
||||||
std::string action = request.getString("action", "");
|
|
||||||
|
|
||||||
auto response = std::make_unique<grove::JsonDataNode>("response");
|
auto response = std::make_unique<grove::JsonDataNode>("response");
|
||||||
response->setString("correlation_id", correlationId);
|
response->setString("correlation_id", request.getString("correlation_id", ""));
|
||||||
|
std::string action = request.getString("action", "");
|
||||||
|
|
||||||
if (action == "start_task") {
|
if (action == "start_task") {
|
||||||
std::string taskId = request.getString("task_id", "");
|
std::string taskId = request.getString("task_id", "");
|
||||||
if (taskId.empty()) {
|
if (taskId.empty())
|
||||||
response->setString("error", "missing_task_id");
|
response->setString("error", "missing_task_id");
|
||||||
} else {
|
else {
|
||||||
startTask(taskId);
|
startTask(taskId);
|
||||||
response->setBool("success", true);
|
response->setBool("success", true);
|
||||||
response->setString("task_id", taskId);
|
response->setString("task_id", taskId);
|
||||||
@ -160,15 +142,11 @@ void SchedulerModule::handleToolCommand(const grove::IDataNode& request) {
|
|||||||
}
|
}
|
||||||
else if (action == "complete_task") {
|
else if (action == "complete_task") {
|
||||||
std::string taskId = request.getString("task_id", "");
|
std::string taskId = request.getString("task_id", "");
|
||||||
if (taskId.empty()) {
|
if (taskId.empty())
|
||||||
// Complete current task
|
|
||||||
completeCurrentTask();
|
completeCurrentTask();
|
||||||
} else {
|
else {
|
||||||
// Complete specific task
|
|
||||||
Task* task = findTask(taskId);
|
Task* task = findTask(taskId);
|
||||||
if (task) {
|
if (task) task->completed = true;
|
||||||
task->completed = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
response->setBool("success", true);
|
response->setBool("success", true);
|
||||||
}
|
}
|
||||||
@ -177,34 +155,25 @@ void SchedulerModule::handleToolCommand(const grove::IDataNode& request) {
|
|||||||
std::string reason = request.getString("reason", "break");
|
std::string reason = request.getString("reason", "break");
|
||||||
m_lastBreakTime = m_lastActivityTime;
|
m_lastBreakTime = m_lastActivityTime;
|
||||||
m_logger->info("Pause demarree: {} minutes ({})", duration, reason);
|
m_logger->info("Pause demarree: {} minutes ({})", duration, reason);
|
||||||
|
|
||||||
// Publish break started event
|
|
||||||
auto event = std::make_unique<grove::JsonDataNode>("break");
|
auto event = std::make_unique<grove::JsonDataNode>("break");
|
||||||
event->setInt("duration", duration);
|
event->setInt("duration", duration);
|
||||||
event->setString("reason", reason);
|
event->setString("reason", reason);
|
||||||
m_io->publish("scheduler:break_started", std::move(event));
|
m_io->publish("scheduler:break_started", std::move(event));
|
||||||
|
|
||||||
response->setBool("success", true);
|
response->setBool("success", true);
|
||||||
response->setInt("duration", duration);
|
response->setInt("duration", duration);
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
response->setString("error", "unknown_action");
|
response->setString("error", "unknown_action");
|
||||||
}
|
|
||||||
|
|
||||||
m_io->publish("scheduler:response", std::move(response));
|
m_io->publish("scheduler:response", std::move(response));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SchedulerModule::checkHyperfocus(float currentTime) {
|
void SchedulerModule::checkHyperfocus(float currentTime) {
|
||||||
if (m_currentTaskId.empty()) return;
|
if (m_currentTaskId.empty()) return;
|
||||||
|
|
||||||
float sessionMinutes = (currentTime - m_sessionStartTime) / 60.0f;
|
float sessionMinutes = (currentTime - m_sessionStartTime) / 60.0f;
|
||||||
|
|
||||||
if (sessionMinutes >= m_hyperfocusThresholdMinutes && !m_hyperfocusAlertSent) {
|
if (sessionMinutes >= m_hyperfocusThresholdMinutes && !m_hyperfocusAlertSent) {
|
||||||
m_hyperfocusAlertSent = true;
|
m_hyperfocusAlertSent = true;
|
||||||
m_logger->warn("HYPERFOCUS DETECTE! Session de {:.0f} minutes sur '{}'",
|
m_logger->warn("HYPERFOCUS DETECTE! Session de {:.0f} minutes sur '{}'", sessionMinutes, m_currentTaskId);
|
||||||
sessionMinutes, m_currentTaskId);
|
|
||||||
|
|
||||||
// Publish hyperfocus alert
|
|
||||||
if (m_io) {
|
if (m_io) {
|
||||||
auto event = std::make_unique<grove::JsonDataNode>("alert");
|
auto event = std::make_unique<grove::JsonDataNode>("alert");
|
||||||
event->setString("type", "hyperfocus");
|
event->setString("type", "hyperfocus");
|
||||||
@ -217,12 +186,9 @@ void SchedulerModule::checkHyperfocus(float currentTime) {
|
|||||||
|
|
||||||
void SchedulerModule::checkBreakReminder(float currentTime) {
|
void SchedulerModule::checkBreakReminder(float currentTime) {
|
||||||
float timeSinceBreak = (currentTime - m_lastBreakTime) / 60.0f;
|
float timeSinceBreak = (currentTime - m_lastBreakTime) / 60.0f;
|
||||||
|
|
||||||
if (timeSinceBreak >= m_breakReminderIntervalMinutes) {
|
if (timeSinceBreak >= m_breakReminderIntervalMinutes) {
|
||||||
m_lastBreakTime = currentTime;
|
m_lastBreakTime = currentTime;
|
||||||
m_logger->info("RAPPEL: Pause de {} minutes recommandee!", m_breakDurationMinutes);
|
m_logger->info("RAPPEL: Pause de {} minutes recommandee!", m_breakDurationMinutes);
|
||||||
|
|
||||||
// Publish break reminder
|
|
||||||
if (m_io) {
|
if (m_io) {
|
||||||
auto event = std::make_unique<grove::JsonDataNode>("reminder");
|
auto event = std::make_unique<grove::JsonDataNode>("reminder");
|
||||||
event->setString("type", "break");
|
event->setString("type", "break");
|
||||||
@ -234,21 +200,12 @@ void SchedulerModule::checkBreakReminder(float currentTime) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SchedulerModule::startTask(const std::string& taskId) {
|
void SchedulerModule::startTask(const std::string& taskId) {
|
||||||
// Completer la tache precedente si necessaire
|
if (!m_currentTaskId.empty()) completeCurrentTask();
|
||||||
if (!m_currentTaskId.empty()) {
|
|
||||||
completeCurrentTask();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_currentTaskId = taskId;
|
m_currentTaskId = taskId;
|
||||||
m_sessionStartTime = m_lastActivityTime;
|
m_sessionStartTime = m_lastActivityTime;
|
||||||
m_hyperfocusAlertSent = false;
|
m_hyperfocusAlertSent = false;
|
||||||
|
|
||||||
Task* task = findTask(taskId);
|
Task* task = findTask(taskId);
|
||||||
if (task) {
|
if (task) m_logger->info("Tache demarree: {} (estime: {}min)", task->name, task->estimatedMinutes);
|
||||||
m_logger->info("Tache demarree: {} (estime: {}min)", task->name, task->estimatedMinutes);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Publish task started
|
|
||||||
if (m_io) {
|
if (m_io) {
|
||||||
auto event = std::make_unique<grove::JsonDataNode>("started");
|
auto event = std::make_unique<grove::JsonDataNode>("started");
|
||||||
event->setString("taskId", taskId);
|
event->setString("taskId", taskId);
|
||||||
@ -259,20 +216,14 @@ void SchedulerModule::startTask(const std::string& taskId) {
|
|||||||
|
|
||||||
void SchedulerModule::completeCurrentTask() {
|
void SchedulerModule::completeCurrentTask() {
|
||||||
if (m_currentTaskId.empty()) return;
|
if (m_currentTaskId.empty()) return;
|
||||||
|
|
||||||
Task* task = findTask(m_currentTaskId);
|
Task* task = findTask(m_currentTaskId);
|
||||||
float sessionMinutes = (m_lastActivityTime - m_sessionStartTime) / 60.0f;
|
float sessionMinutes = (m_lastActivityTime - m_sessionStartTime) / 60.0f;
|
||||||
|
|
||||||
if (task) {
|
if (task) {
|
||||||
task->actualMinutes = static_cast<int>(sessionMinutes);
|
task->actualMinutes = static_cast<int>(sessionMinutes);
|
||||||
task->completed = true;
|
task->completed = true;
|
||||||
m_totalFocusMinutesToday += task->actualMinutes;
|
m_totalFocusMinutesToday += task->actualMinutes;
|
||||||
|
m_logger->info("Tache terminee: {} (reel: {}min vs estime: {}min)", task->name, task->actualMinutes, task->estimatedMinutes);
|
||||||
m_logger->info("Tache terminee: {} (reel: {}min vs estime: {}min)",
|
|
||||||
task->name, task->actualMinutes, task->estimatedMinutes);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Publish task completed
|
|
||||||
if (m_io) {
|
if (m_io) {
|
||||||
auto event = std::make_unique<grove::JsonDataNode>("completed");
|
auto event = std::make_unique<grove::JsonDataNode>("completed");
|
||||||
event->setString("taskId", m_currentTaskId);
|
event->setString("taskId", m_currentTaskId);
|
||||||
@ -281,7 +232,6 @@ void SchedulerModule::completeCurrentTask() {
|
|||||||
event->setBool("hyperfocus", m_hyperfocusAlertSent);
|
event->setBool("hyperfocus", m_hyperfocusAlertSent);
|
||||||
m_io->publish("scheduler:task_completed", std::move(event));
|
m_io->publish("scheduler:task_completed", std::move(event));
|
||||||
}
|
}
|
||||||
|
|
||||||
m_currentTaskId.clear();
|
m_currentTaskId.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -303,15 +253,12 @@ std::unique_ptr<grove::IDataNode> SchedulerModule::getHealthStatus() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SchedulerModule::shutdown() {
|
void SchedulerModule::shutdown() {
|
||||||
if (!m_currentTaskId.empty()) {
|
if (!m_currentTaskId.empty()) completeCurrentTask();
|
||||||
completeCurrentTask();
|
|
||||||
}
|
|
||||||
m_logger->info("SchedulerModule arrete. Focus total: {}min", m_totalFocusMinutesToday);
|
m_logger->info("SchedulerModule arrete. Focus total: {}min", m_totalFocusMinutesToday);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<grove::IDataNode> SchedulerModule::getState() {
|
std::unique_ptr<grove::IDataNode> SchedulerModule::getState() {
|
||||||
auto state = std::make_unique<grove::JsonDataNode>("state");
|
auto state = std::make_unique<grove::JsonDataNode>("state");
|
||||||
|
|
||||||
state->setString("currentTaskId", m_currentTaskId);
|
state->setString("currentTaskId", m_currentTaskId);
|
||||||
state->setDouble("sessionStartTime", m_sessionStartTime);
|
state->setDouble("sessionStartTime", m_sessionStartTime);
|
||||||
state->setDouble("lastBreakTime", m_lastBreakTime);
|
state->setDouble("lastBreakTime", m_lastBreakTime);
|
||||||
@ -319,7 +266,6 @@ std::unique_ptr<grove::IDataNode> SchedulerModule::getState() {
|
|||||||
state->setBool("hyperfocusAlertSent", m_hyperfocusAlertSent);
|
state->setBool("hyperfocusAlertSent", m_hyperfocusAlertSent);
|
||||||
state->setInt("totalFocusMinutesToday", m_totalFocusMinutesToday);
|
state->setInt("totalFocusMinutesToday", m_totalFocusMinutesToday);
|
||||||
state->setInt("taskCount", m_tasks.size());
|
state->setInt("taskCount", m_tasks.size());
|
||||||
|
|
||||||
m_logger->debug("Etat sauvegarde: {} taches, focus={}min", m_tasks.size(), m_totalFocusMinutesToday);
|
m_logger->debug("Etat sauvegarde: {} taches, focus={}min", m_tasks.size(), m_totalFocusMinutesToday);
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
@ -331,19 +277,16 @@ void SchedulerModule::setState(const grove::IDataNode& state) {
|
|||||||
m_lastActivityTime = state.getDouble("lastActivityTime", 0.0);
|
m_lastActivityTime = state.getDouble("lastActivityTime", 0.0);
|
||||||
m_hyperfocusAlertSent = state.getBool("hyperfocusAlertSent", false);
|
m_hyperfocusAlertSent = state.getBool("hyperfocusAlertSent", false);
|
||||||
m_totalFocusMinutesToday = state.getInt("totalFocusMinutesToday", 0);
|
m_totalFocusMinutesToday = state.getInt("totalFocusMinutesToday", 0);
|
||||||
|
m_logger->info("Etat restaure: tache='{}', focus={}min", m_currentTaskId.empty() ? "(aucune)" : m_currentTaskId, m_totalFocusMinutesToday);
|
||||||
m_logger->info("Etat restaure: tache='{}', focus={}min",
|
|
||||||
m_currentTaskId.empty() ? "(aucune)" : m_currentTaskId,
|
|
||||||
m_totalFocusMinutesToday);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|
||||||
#ifndef AISSIA_TEST_BUILD
|
#ifndef CELUNA_TEST_BUILD
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
grove::IModule* createModule() {
|
grove::IModule* createModule() {
|
||||||
return new aissia::SchedulerModule();
|
return new celuna::SchedulerModule();
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroyModule(grove::IModule* module) {
|
void destroyModule(grove::IModule* module) {
|
||||||
|
|||||||
@ -9,8 +9,11 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
#include <ctime>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Scheduler Module - Gestion du temps et détection d'hyperfocus
|
* @brief Scheduler Module - Gestion du temps et détection d'hyperfocus
|
||||||
@ -93,7 +96,7 @@ private:
|
|||||||
void handleToolCommand(const grove::IDataNode& request);
|
void handleToolCommand(const grove::IDataNode& request);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
grove::IModule* createModule();
|
grove::IModule* createModule();
|
||||||
|
|||||||
@ -1,8 +1,10 @@
|
|||||||
#include "StorageModule.h"
|
#include "StorageModule.h"
|
||||||
#include <grove/IIO.h>
|
#include <grove/IIO.h>
|
||||||
#include <grove/JsonDataNode.h>
|
#include <grove/JsonDataNode.h>
|
||||||
|
#include <sstream>
|
||||||
|
#include <iomanip>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
StorageModule::StorageModule() {
|
StorageModule::StorageModule() {
|
||||||
m_logger = spdlog::get("StorageModule");
|
m_logger = spdlog::get("StorageModule");
|
||||||
@ -133,12 +135,14 @@ void StorageModule::handleToolCommand(const grove::IDataNode& request) {
|
|||||||
if (content.empty()) {
|
if (content.empty()) {
|
||||||
response->setString("error", "missing_content");
|
response->setString("error", "missing_content");
|
||||||
} else {
|
} else {
|
||||||
// Create note in memory
|
|
||||||
Note note;
|
Note note;
|
||||||
note.id = "note_" + std::to_string(m_notes.size());
|
note.id = "note_" + std::to_string(m_notes.size());
|
||||||
note.content = content;
|
note.content = content;
|
||||||
note.timestamp = "now"; // TODO: proper timestamp
|
// Format timestamp as ISO 8601
|
||||||
|
auto ts = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
|
||||||
|
char buf[64];
|
||||||
|
std::strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%SZ", std::gmtime(&ts));
|
||||||
|
note.timestamp = buf;
|
||||||
m_notes.push_back(note);
|
m_notes.push_back(note);
|
||||||
m_logger->info("Note saved: {}", note.id);
|
m_logger->info("Note saved: {}", note.id);
|
||||||
|
|
||||||
@ -237,13 +241,13 @@ void StorageModule::setState(const grove::IDataNode& state) {
|
|||||||
m_logger->info("Etat restore: lastSession={}, saved={}", m_lastSessionId, m_totalSaved);
|
m_logger->info("Etat restore: lastSession={}, saved={}", m_lastSessionId, m_totalSaved);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|
||||||
#ifndef AISSIA_TEST_BUILD
|
#ifndef CELUNA_TEST_BUILD
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
grove::IModule* createModule() {
|
grove::IModule* createModule() {
|
||||||
return new aissia::StorageModule();
|
return new celuna::StorageModule();
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroyModule(grove::IModule* module) {
|
void destroyModule(grove::IModule* module) {
|
||||||
|
|||||||
@ -8,8 +8,10 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <chrono>
|
||||||
|
#include <ctime>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Storage Module - Pure business logic for data persistence
|
* @brief Storage Module - Pure business logic for data persistence
|
||||||
@ -79,7 +81,7 @@ private:
|
|||||||
void handleToolCommand(const grove::IDataNode& request);
|
void handleToolCommand(const grove::IDataNode& request);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
grove::IModule* createModule();
|
grove::IModule* createModule();
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
namespace fs = std::filesystem;
|
namespace fs = std::filesystem;
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
TestRunnerModule::TestRunnerModule() = default;
|
TestRunnerModule::TestRunnerModule() = default;
|
||||||
TestRunnerModule::~TestRunnerModule() = default;
|
TestRunnerModule::~TestRunnerModule() = default;
|
||||||
@ -322,12 +322,12 @@ void TestRunnerModule::setState(const grove::IDataNode& state) {
|
|||||||
m_executed = state.getBool("executed", false);
|
m_executed = state.getBool("executed", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|
||||||
// Factory functions
|
// Factory functions
|
||||||
extern "C" {
|
extern "C" {
|
||||||
grove::IModule* createModule() {
|
grove::IModule* createModule() {
|
||||||
return new aissia::TestRunnerModule();
|
return new celuna::TestRunnerModule();
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroyModule(grove::IModule* module) {
|
void destroyModule(grove::IModule* module) {
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Orchestrator for integration tests
|
* @brief Orchestrator for integration tests
|
||||||
@ -76,4 +76,4 @@ private:
|
|||||||
bool m_executed = false;
|
bool m_executed = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
#include <grove/IIO.h>
|
#include <grove/IIO.h>
|
||||||
#include <grove/JsonDataNode.h>
|
#include <grove/JsonDataNode.h>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
VoiceModule::VoiceModule() {
|
VoiceModule::VoiceModule() {
|
||||||
m_logger = spdlog::get("VoiceModule");
|
m_logger = spdlog::get("VoiceModule");
|
||||||
@ -208,13 +208,13 @@ void VoiceModule::setState(const grove::IDataNode& state) {
|
|||||||
m_logger->info("Etat restore: spoken={}, transcribed={}", m_totalSpoken, m_totalTranscribed);
|
m_logger->info("Etat restore: spoken={}, transcribed={}", m_totalSpoken, m_totalTranscribed);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|
||||||
#ifndef AISSIA_TEST_BUILD
|
#ifndef CELUNA_TEST_BUILD
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
||||||
grove::IModule* createModule() {
|
grove::IModule* createModule() {
|
||||||
return new aissia::VoiceModule();
|
return new celuna::VoiceModule();
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroyModule(grove::IModule* module) {
|
void destroyModule(grove::IModule* module) {
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Voice Module - Voice interaction logic only
|
* @brief Voice Module - Voice interaction logic only
|
||||||
@ -77,7 +77,7 @@ private:
|
|||||||
void handleToolCommand(const grove::IDataNode& request);
|
void handleToolCommand(const grove::IDataNode& request);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
grove::IModule* createModule();
|
grove::IModule* createModule();
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <regex>
|
#include <regex>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
WebModule::WebModule() {
|
WebModule::WebModule() {
|
||||||
m_logger = spdlog::get("WebModule");
|
m_logger = spdlog::get("WebModule");
|
||||||
@ -221,12 +221,12 @@ void WebModule::setState(const grove::IDataNode& state) {
|
|||||||
m_totalRequests, m_successfulRequests, m_failedRequests);
|
m_totalRequests, m_successfulRequests, m_failedRequests);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|
||||||
#ifndef AISSIA_TEST_BUILD
|
#ifndef CELUNA_TEST_BUILD
|
||||||
extern "C" {
|
extern "C" {
|
||||||
grove::IModule* createModule() {
|
grove::IModule* createModule() {
|
||||||
return new aissia::WebModule();
|
return new celuna::WebModule();
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroyModule(grove::IModule* module) {
|
void destroyModule(grove::IModule* module) {
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief WebModule - Handles HTTP requests via IIO pub/sub
|
* @brief WebModule - Handles HTTP requests via IIO pub/sub
|
||||||
@ -59,4 +59,4 @@ private:
|
|||||||
int m_failedRequests = 0;
|
int m_failedRequests = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
#include <functional>
|
#include <functional>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
enum class STTMode {
|
enum class STTMode {
|
||||||
PASSIVE, // Keyword spotting (économe)
|
PASSIVE, // Keyword spotting (économe)
|
||||||
@ -100,4 +100,4 @@ public:
|
|||||||
virtual std::string getCurrentEngine() const = 0;
|
virtual std::string getCurrentEngine() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
#include <grove/IIO.h>
|
#include <grove/IIO.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Interface for infrastructure services
|
* @brief Interface for infrastructure services
|
||||||
@ -36,4 +36,4 @@ public:
|
|||||||
virtual bool isHealthy() const = 0;
|
virtual bool isHealthy() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
#include <spdlog/sinks/stdout_color_sinks.h>
|
#include <spdlog/sinks/stdout_color_sinks.h>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
LLMService::LLMService() {
|
LLMService::LLMService() {
|
||||||
m_logger = spdlog::get("LLMService");
|
m_logger = spdlog::get("LLMService");
|
||||||
@ -372,4 +372,4 @@ LLMService::SyncResponse LLMService::sendMessageSync(
|
|||||||
return syncResp;
|
return syncResp;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -19,7 +19,7 @@
|
|||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief LLM Service - Async HTTP calls to LLM providers
|
* @brief LLM Service - Async HTTP calls to LLM providers
|
||||||
@ -137,4 +137,4 @@ private:
|
|||||||
void publishResponses();
|
void publishResponses();
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include <spdlog/sinks/stdout_color_sinks.h>
|
#include <spdlog/sinks/stdout_color_sinks.h>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
PlatformService::PlatformService() {
|
PlatformService::PlatformService() {
|
||||||
m_logger = spdlog::get("PlatformService");
|
m_logger = spdlog::get("PlatformService");
|
||||||
@ -136,4 +136,4 @@ void PlatformService::shutdown() {
|
|||||||
m_logger->info("PlatformService shutdown");
|
m_logger->info("PlatformService shutdown");
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Platform Service - OS-specific APIs (window tracking, etc.)
|
* @brief Platform Service - OS-specific APIs (window tracking, etc.)
|
||||||
@ -64,4 +64,4 @@ private:
|
|||||||
void publishWindowChanged(const std::string& oldApp, const std::string& newApp, int duration);
|
void publishWindowChanged(const std::string& oldApp, const std::string& newApp, int duration);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -12,7 +12,7 @@
|
|||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
#include <spdlog/sinks/stdout_color_sinks.h>
|
#include <spdlog/sinks/stdout_color_sinks.h>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
STTService::STTService(const nlohmann::json& config)
|
STTService::STTService(const nlohmann::json& config)
|
||||||
: m_config(config)
|
: m_config(config)
|
||||||
@ -186,4 +186,4 @@ void STTService::loadEngines() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief STT Service implementation
|
* @brief STT Service implementation
|
||||||
@ -60,4 +60,4 @@ private:
|
|||||||
void loadEngines();
|
void loadEngines();
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
namespace fs = std::filesystem;
|
namespace fs = std::filesystem;
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
StorageService::StorageService() {
|
StorageService::StorageService() {
|
||||||
m_logger = spdlog::get("StorageService");
|
m_logger = spdlog::get("StorageService");
|
||||||
@ -345,4 +345,4 @@ void StorageService::shutdown() {
|
|||||||
m_logger->info("StorageService shutdown. Total queries: {}", m_totalQueries);
|
m_logger->info("StorageService shutdown. Total queries: {}", m_totalQueries);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -14,7 +14,7 @@
|
|||||||
struct sqlite3;
|
struct sqlite3;
|
||||||
struct sqlite3_stmt;
|
struct sqlite3_stmt;
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Storage Service - SQLite persistence
|
* @brief Storage Service - SQLite persistence
|
||||||
@ -88,4 +88,4 @@ private:
|
|||||||
void publishError(const std::string& message);
|
void publishError(const std::string& message);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -13,7 +13,7 @@
|
|||||||
// Include spdlog after VoiceService.hpp
|
// Include spdlog after VoiceService.hpp
|
||||||
#include <spdlog/sinks/stdout_color_sinks.h>
|
#include <spdlog/sinks/stdout_color_sinks.h>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
VoiceService::VoiceService() {
|
VoiceService::VoiceService() {
|
||||||
m_logger = spdlog::get("VoiceService");
|
m_logger = spdlog::get("VoiceService");
|
||||||
@ -291,4 +291,4 @@ bool VoiceService::textToSpeechSync(
|
|||||||
throw std::runtime_error("textToSpeechSync file output not yet implemented - TTS engine needs file output support");
|
throw std::runtime_error("textToSpeechSync file output not yet implemented - TTS engine needs file output support");
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -16,7 +16,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Voice Service - TTS and STT engines
|
* @brief Voice Service - TTS and STT engines
|
||||||
@ -114,4 +114,4 @@ private:
|
|||||||
void handleKeyword(const std::string& keyword);
|
void handleKeyword(const std::string& keyword);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
#include <thread>
|
#include <thread>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Linux espeak-ng Text-to-Speech engine
|
* @brief Linux espeak-ng Text-to-Speech engine
|
||||||
@ -130,6 +130,6 @@ private:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|
||||||
#endif // __linux__
|
#endif // __linux__
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Callback for transcription results (low-level engine)
|
* @brief Callback for transcription results (low-level engine)
|
||||||
@ -67,4 +67,4 @@ public:
|
|||||||
const std::string& apiKey = "");
|
const std::string& apiKey = "");
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Interface for Text-to-Speech engines
|
* @brief Interface for Text-to-Speech engines
|
||||||
@ -64,4 +64,4 @@ public:
|
|||||||
static std::unique_ptr<ITTSEngine> create();
|
static std::unique_ptr<ITTSEngine> create();
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
#include <pocketsphinx.h>
|
#include <pocketsphinx.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
PocketSphinxEngine::PocketSphinxEngine(const std::string& modelPath,
|
PocketSphinxEngine::PocketSphinxEngine(const std::string& modelPath,
|
||||||
const std::vector<std::string>& keywords)
|
const std::vector<std::string>& keywords)
|
||||||
@ -194,4 +194,4 @@ std::string PocketSphinxEngine::getEngineName() const {
|
|||||||
return "pocketsphinx";
|
return "pocketsphinx";
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -12,7 +12,7 @@ typedef struct ps_decoder_s ps_decoder_t;
|
|||||||
struct cmd_ln_s;
|
struct cmd_ln_s;
|
||||||
typedef struct cmd_ln_s cmd_ln_t;
|
typedef struct cmd_ln_s cmd_ln_t;
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief CMU PocketSphinx Speech-to-Text engine
|
* @brief CMU PocketSphinx Speech-to-Text engine
|
||||||
@ -77,4 +77,4 @@ private:
|
|||||||
cmd_ln_t* m_config = nullptr;
|
cmd_ln_t* m_config = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
#include <sphelper.h>
|
#include <sphelper.h>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Windows SAPI Text-to-Speech engine
|
* @brief Windows SAPI Text-to-Speech engine
|
||||||
@ -112,6 +112,6 @@ private:
|
|||||||
std::shared_ptr<spdlog::logger> m_logger;
|
std::shared_ptr<spdlog::logger> m_logger;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|
||||||
#endif // _WIN32
|
#endif // _WIN32
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
// Stub STT for when API key is not available
|
// Stub STT for when API key is not available
|
||||||
class StubSTTEngine : public ISTTEngine {
|
class StubSTTEngine : public ISTTEngine {
|
||||||
@ -117,4 +117,4 @@ std::unique_ptr<ISTTEngine> STTEngineFactory::create(
|
|||||||
return std::make_unique<StubSTTEngine>();
|
return std::make_unique<StubSTTEngine>();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
#include "EspeakTTSEngine.hpp"
|
#include "EspeakTTSEngine.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
// Stub TTS for unsupported platforms
|
// Stub TTS for unsupported platforms
|
||||||
class StubTTSEngine : public ITTSEngine {
|
class StubTTSEngine : public ITTSEngine {
|
||||||
@ -48,4 +48,4 @@ std::unique_ptr<ITTSEngine> TTSEngineFactory::create() {
|
|||||||
return std::make_unique<StubTTSEngine>();
|
return std::make_unique<StubTTSEngine>();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
VoskSTTEngine::VoskSTTEngine(const std::string& modelPath, float sampleRate)
|
VoskSTTEngine::VoskSTTEngine(const std::string& modelPath, float sampleRate)
|
||||||
: m_sampleRate(sampleRate)
|
: m_sampleRate(sampleRate)
|
||||||
@ -249,4 +249,4 @@ bool VoskSTTEngine::readWavFile(const std::string& filePath, std::vector<float>&
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -13,7 +13,7 @@
|
|||||||
struct VoskModel;
|
struct VoskModel;
|
||||||
struct VoskRecognizer;
|
struct VoskRecognizer;
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Vosk Speech Recognition Engine
|
* @brief Vosk Speech Recognition Engine
|
||||||
@ -74,4 +74,4 @@ private:
|
|||||||
bool readWavFile(const std::string& filePath, std::vector<float>& outSamples);
|
bool readWavFile(const std::string& filePath, std::vector<float>& outSamples);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief OpenAI Whisper API Speech-to-Text engine
|
* @brief OpenAI Whisper API Speech-to-Text engine
|
||||||
@ -153,4 +153,4 @@ private:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
#include <whisper.h>
|
#include <whisper.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
WhisperCppEngine::WhisperCppEngine(const std::string& modelPath)
|
WhisperCppEngine::WhisperCppEngine(const std::string& modelPath)
|
||||||
: m_modelPath(modelPath)
|
: m_modelPath(modelPath)
|
||||||
@ -167,4 +167,4 @@ std::string WhisperCppEngine::getEngineName() const {
|
|||||||
return "whisper-cpp";
|
return "whisper-cpp";
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
struct whisper_context;
|
struct whisper_context;
|
||||||
struct whisper_full_params;
|
struct whisper_full_params;
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Whisper.cpp Speech-to-Text engine
|
* @brief Whisper.cpp Speech-to-Text engine
|
||||||
@ -76,4 +76,4 @@ private:
|
|||||||
whisper_context* m_ctx = nullptr;
|
whisper_context* m_ctx = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -17,7 +17,7 @@
|
|||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
#include <spdlog/sinks/stdout_color_sinks.h>
|
#include <spdlog/sinks/stdout_color_sinks.h>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
using json = nlohmann::json;
|
using json = nlohmann::json;
|
||||||
|
|
||||||
@ -206,4 +206,4 @@ private:
|
|||||||
std::shared_ptr<spdlog::logger> m_logger;
|
std::shared_ptr<spdlog::logger> m_logger;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
#include <spdlog/sinks/stdout_color_sinks.h>
|
#include <spdlog/sinks/stdout_color_sinks.h>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
ClaudeProvider::ClaudeProvider(const json& config) {
|
ClaudeProvider::ClaudeProvider(const json& config) {
|
||||||
m_logger = spdlog::get("ClaudeProvider");
|
m_logger = spdlog::get("ClaudeProvider");
|
||||||
@ -178,4 +178,4 @@ json ClaudeProvider::buildAssistantContent(const LLMResponse& response) {
|
|||||||
return content;
|
return content;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Anthropic Claude API provider
|
* @brief Anthropic Claude API provider
|
||||||
@ -50,4 +50,4 @@ private:
|
|||||||
json buildAssistantContent(const LLMResponse& response);
|
json buildAssistantContent(const LLMResponse& response);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
using json = nlohmann::json;
|
using json = nlohmann::json;
|
||||||
|
|
||||||
@ -106,4 +106,4 @@ public:
|
|||||||
virtual std::string getModel() const = 0;
|
virtual std::string getModel() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
std::unique_ptr<ILLMProvider> LLMProviderFactory::create(const nlohmann::json& config) {
|
std::unique_ptr<ILLMProvider> LLMProviderFactory::create(const nlohmann::json& config) {
|
||||||
std::string providerName = config.value("provider", "claude");
|
std::string providerName = config.value("provider", "claude");
|
||||||
@ -43,4 +43,4 @@ std::unique_ptr<ILLMProvider> LLMProviderFactory::createProvider(
|
|||||||
throw std::runtime_error("Unknown LLM provider: " + providerName);
|
throw std::runtime_error("Unknown LLM provider: " + providerName);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Factory for creating LLM providers
|
* @brief Factory for creating LLM providers
|
||||||
@ -53,4 +53,4 @@ public:
|
|||||||
const nlohmann::json& providerConfig);
|
const nlohmann::json& providerConfig);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
#include <spdlog/sinks/stdout_color_sinks.h>
|
#include <spdlog/sinks/stdout_color_sinks.h>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
OpenAIProvider::OpenAIProvider(const json& config) {
|
OpenAIProvider::OpenAIProvider(const json& config) {
|
||||||
m_logger = spdlog::get("OpenAIProvider");
|
m_logger = spdlog::get("OpenAIProvider");
|
||||||
@ -198,4 +198,4 @@ void OpenAIProvider::appendAssistantMessage(json& messages, const LLMResponse& r
|
|||||||
messages.push_back(assistantMsg);
|
messages.push_back(assistantMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief OpenAI GPT API provider
|
* @brief OpenAI GPT API provider
|
||||||
@ -50,4 +50,4 @@ private:
|
|||||||
json m_lastRawResponse;
|
json m_lastRawResponse;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
#include "ToolRegistry.hpp"
|
#include "ToolRegistry.hpp"
|
||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
void ToolRegistry::registerTool(const std::string& name,
|
void ToolRegistry::registerTool(const std::string& name,
|
||||||
const std::string& description,
|
const std::string& description,
|
||||||
@ -61,4 +61,4 @@ bool ToolRegistry::hasTool(const std::string& name) const {
|
|||||||
return m_tools.find(name) != m_tools.end();
|
return m_tools.find(name) != m_tools.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
#include <functional>
|
#include <functional>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
using json = nlohmann::json;
|
using json = nlohmann::json;
|
||||||
|
|
||||||
@ -85,4 +85,4 @@ private:
|
|||||||
std::map<std::string, ToolDefinition> m_tools;
|
std::map<std::string, ToolDefinition> m_tools;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
namespace aissia::mcp {
|
namespace celuna::mcp {
|
||||||
|
|
||||||
MCPClient::MCPClient() {
|
MCPClient::MCPClient() {
|
||||||
m_logger = spdlog::get("MCPClient");
|
m_logger = spdlog::get("MCPClient");
|
||||||
@ -299,4 +299,4 @@ std::pair<std::string, std::string> MCPClient::parseToolName(const std::string&
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia::mcp
|
} // namespace celuna::mcp
|
||||||
|
|||||||
@ -12,7 +12,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace aissia::mcp {
|
namespace celuna::mcp {
|
||||||
|
|
||||||
using json = nlohmann::json;
|
using json = nlohmann::json;
|
||||||
|
|
||||||
@ -107,4 +107,4 @@ private:
|
|||||||
std::pair<std::string, std::string> parseToolName(const std::string& toolName);
|
std::pair<std::string, std::string> parseToolName(const std::string& toolName);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia::mcp
|
} // namespace celuna::mcp
|
||||||
|
|||||||
@ -4,9 +4,9 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
namespace aissia::mcp {
|
namespace celuna::mcp {
|
||||||
|
|
||||||
MCPServer::MCPServer(aissia::ToolRegistry& registry) : m_registry(registry) {
|
MCPServer::MCPServer(celuna::ToolRegistry& registry) : m_registry(registry) {
|
||||||
m_logger = spdlog::get("MCPServer");
|
m_logger = spdlog::get("MCPServer");
|
||||||
if (!m_logger) {
|
if (!m_logger) {
|
||||||
// Log to stderr so stdout stays clean for JSON-RPC
|
// Log to stderr so stdout stays clean for JSON-RPC
|
||||||
@ -273,4 +273,4 @@ void MCPServer::sendNotification(const std::string& method, const json& params)
|
|||||||
writeLine(notification.dump());
|
writeLine(notification.dump());
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia::mcp
|
} // namespace celuna::mcp
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
#include <functional>
|
#include <functional>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace aissia::mcp {
|
namespace celuna::mcp {
|
||||||
|
|
||||||
using json = nlohmann::json;
|
using json = nlohmann::json;
|
||||||
|
|
||||||
@ -31,7 +31,7 @@ using json = nlohmann::json;
|
|||||||
*/
|
*/
|
||||||
class MCPServer {
|
class MCPServer {
|
||||||
public:
|
public:
|
||||||
explicit MCPServer(aissia::ToolRegistry& registry);
|
explicit MCPServer(celuna::ToolRegistry& registry);
|
||||||
~MCPServer();
|
~MCPServer();
|
||||||
|
|
||||||
// Server configuration
|
// Server configuration
|
||||||
@ -66,7 +66,7 @@ private:
|
|||||||
void sendNotification(const std::string& method, const json& params = json::object());
|
void sendNotification(const std::string& method, const json& params = json::object());
|
||||||
|
|
||||||
// State
|
// State
|
||||||
aissia::ToolRegistry& m_registry;
|
celuna::ToolRegistry& m_registry;
|
||||||
std::atomic<bool> m_running{false};
|
std::atomic<bool> m_running{false};
|
||||||
bool m_initialized{false};
|
bool m_initialized{false};
|
||||||
|
|
||||||
@ -82,4 +82,4 @@ private:
|
|||||||
std::shared_ptr<spdlog::logger> m_logger;
|
std::shared_ptr<spdlog::logger> m_logger;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia::mcp
|
} // namespace celuna::mcp
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace aissia::mcp {
|
namespace celuna::mcp {
|
||||||
|
|
||||||
using json = nlohmann::json;
|
using json = nlohmann::json;
|
||||||
|
|
||||||
@ -48,4 +48,4 @@ public:
|
|||||||
virtual void sendNotification(const std::string& method, const json& params) = 0;
|
virtual void sendNotification(const std::string& method, const json& params) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia::mcp
|
} // namespace celuna::mcp
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
|
||||||
namespace aissia::mcp {
|
namespace celuna::mcp {
|
||||||
|
|
||||||
using json = nlohmann::json;
|
using json = nlohmann::json;
|
||||||
|
|
||||||
@ -183,4 +183,4 @@ struct MCPServerConfig {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia::mcp
|
} // namespace celuna::mcp
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
namespace aissia::mcp {
|
namespace celuna::mcp {
|
||||||
|
|
||||||
StdioTransport::StdioTransport(const MCPServerConfig& config) : m_config(config) {
|
StdioTransport::StdioTransport(const MCPServerConfig& config) : m_config(config) {
|
||||||
m_logger = spdlog::get("MCP:" + config.name);
|
m_logger = spdlog::get("MCP:" + config.name);
|
||||||
@ -423,4 +423,4 @@ std::string StdioTransport::readLine() {
|
|||||||
return line;
|
return line;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia::mcp
|
} // namespace celuna::mcp
|
||||||
|
|||||||
@ -18,7 +18,7 @@
|
|||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace aissia::mcp {
|
namespace celuna::mcp {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Stdio transport for MCP servers
|
* @brief Stdio transport for MCP servers
|
||||||
@ -77,4 +77,4 @@ private:
|
|||||||
void handleMessage(const json& message);
|
void handleMessage(const json& message);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia::mcp
|
} // namespace celuna::mcp
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Interface for window tracking across platforms
|
* @brief Interface for window tracking across platforms
|
||||||
@ -63,4 +63,4 @@ public:
|
|||||||
static std::unique_ptr<IWindowTracker> create();
|
static std::unique_ptr<IWindowTracker> create();
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
#include <Psapi.h>
|
#include <Psapi.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Windows implementation of window tracking
|
* @brief Windows implementation of window tracking
|
||||||
@ -85,6 +85,6 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|
||||||
#endif // _WIN32
|
#endif // _WIN32
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
#include "X11WindowTracker.hpp"
|
#include "X11WindowTracker.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
// Stub implementation for unsupported platforms
|
// Stub implementation for unsupported platforms
|
||||||
class StubWindowTracker : public IWindowTracker {
|
class StubWindowTracker : public IWindowTracker {
|
||||||
@ -45,4 +45,4 @@ std::unique_ptr<IWindowTracker> WindowTrackerFactory::create() {
|
|||||||
return std::make_unique<StubWindowTracker>();
|
return std::make_unique<StubWindowTracker>();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Linux X11 implementation of window tracking
|
* @brief Linux X11 implementation of window tracking
|
||||||
@ -119,6 +119,6 @@ private:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|
||||||
#endif // __linux__
|
#endif // __linux__
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <nlohmann/json.hpp>
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
namespace aissia::testing {
|
namespace celuna::testing {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Result of a test execution
|
* @brief Result of a test execution
|
||||||
@ -45,4 +45,4 @@ public:
|
|||||||
virtual std::string getDescription() const = 0;
|
virtual std::string getDescription() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia::testing
|
} // namespace celuna::testing
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
namespace fs = std::filesystem;
|
namespace fs = std::filesystem;
|
||||||
|
|
||||||
namespace aissia::tools {
|
namespace celuna::tools {
|
||||||
|
|
||||||
// Static configuration defaults
|
// Static configuration defaults
|
||||||
std::vector<std::string> FileSystemTools::s_allowedPaths = {};
|
std::vector<std::string> FileSystemTools::s_allowedPaths = {};
|
||||||
@ -592,4 +592,4 @@ json FileSystemTools::makeSuccess(const json& content) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia::tools
|
} // namespace celuna::tools
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
|
||||||
namespace aissia::tools {
|
namespace celuna::tools {
|
||||||
|
|
||||||
using json = nlohmann::json;
|
using json = nlohmann::json;
|
||||||
|
|
||||||
@ -71,4 +71,4 @@ private:
|
|||||||
static size_t s_maxWriteSize;
|
static size_t s_maxWriteSize;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia::tools
|
} // namespace celuna::tools
|
||||||
|
|||||||
@ -13,7 +13,7 @@
|
|||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
using json = nlohmann::json;
|
using json = nlohmann::json;
|
||||||
|
|
||||||
@ -184,4 +184,4 @@ private:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
#include "InternalTools.hpp"
|
#include "InternalTools.hpp"
|
||||||
#include <spdlog/sinks/stdout_color_sinks.h>
|
#include <spdlog/sinks/stdout_color_sinks.h>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
InternalTools::InternalTools(grove::IIO* io) : m_io(io) {
|
InternalTools::InternalTools(grove::IIO* io) : m_io(io) {
|
||||||
m_logger = spdlog::get("InternalTools");
|
m_logger = spdlog::get("InternalTools");
|
||||||
@ -409,4 +409,4 @@ json InternalTools::speak(const json& input) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
namespace aissia {
|
namespace celuna {
|
||||||
|
|
||||||
using json = nlohmann::json;
|
using json = nlohmann::json;
|
||||||
|
|
||||||
@ -67,4 +67,4 @@ private:
|
|||||||
void registerTools();
|
void registerTools();
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aissia
|
} // namespace celuna
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user