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:
StillHammer 2026-01-03 18:37:13 +07:00
parent ce2b25a599
commit d17ee5fbdc
132 changed files with 634 additions and 682 deletions

View File

@ -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)
--- ---

View File

@ -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

View File

@ -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 |

View File

@ -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)

View File

@ -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

View File

@ -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
``` ```

View File

@ -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

View File

@ -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):
``` ```
┌─────────────────────────────────────────────┐ ┌─────────────────────────────────────────────┐

View File

@ -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

View File

@ -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

View File

@ -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."
} }

View File

@ -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": []

View File

@ -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
} }

View File

@ -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`

View File

@ -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 ✅

View File

@ -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 │
├─────────────────────────────────────────────────────────────────────────────┤ ├─────────────────────────────────────────────────────────────────────────────┤
│ │ │ │
│ ┌──────────┐ ┌──────────┐ ┌─────────────────────────────────────┐ │ │ ┌──────────┐ ┌──────────┐ ┌─────────────────────────────────────┐ │

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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"]
} }
} }

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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
``` ```

View File

@ -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

View File

@ -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)

View File

@ -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
``` ```

View File

@ -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

View File

@ -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.

View File

@ -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)

View File

@ -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

View File

@ -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) {

View File

@ -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();

View File

@ -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) {

View File

@ -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();

View File

@ -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) {

View File

@ -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();

View File

@ -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) {

View File

@ -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();

View File

@ -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) {

View File

@ -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();

View File

@ -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) {

View File

@ -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

View File

@ -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) {

View File

@ -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();

View File

@ -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) {

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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__

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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__

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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