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
**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)
WarFactory Engine Core
↓ DLL/SO Loader
AISSIA Modules (.dll/.so)
CELUNA Modules (.dll/.so)
- MonitoringModule.dll
- SchedulerModule.dll
- AIModule.dll
@ -238,7 +238,7 @@ Native OS APIs
// ui-imgui.dll module
class UIModule : public IModule {
void Render() {
ImGui::Begin("AISSIA Dashboard");
ImGui::Begin("CELUNA Dashboard");
// Render planning, tasks, settings
ImGui::End();
}
@ -371,7 +371,7 @@ MainWindow window; // Qt Widgets
**Architecture :**
```cpp
// aissia.exe - tout en un
// celuna.exe - tout en un
int main() {
MonitoringSystem monitor;
SchedulerSystem scheduler;
@ -439,7 +439,7 @@ Frontend
**Architecture :**
```
aissia-core.exe (Engine WarFactory)
celuna-core.exe (Engine WarFactory)
↓ DLL/SO Loader
modules/
monitoring.dll
@ -493,9 +493,9 @@ Similaire à Option 3 mais sans l'architecture complète WarFactory (IEngine, IM
**Architecture :**
```
User Machine
├── aissia-core.exe
├── celuna-core.exe
├── modules/*.dll
├── aissia.db (SQLite)
├── celuna.db (SQLite)
└── gameconfig.json
```
@ -552,8 +552,8 @@ S3 Storage
**Architecture :**
```
User Machine (Primary)
├── aissia-core.exe (local)
├── aissia.db (SQLite local)
├── celuna-core.exe (local)
├── celuna.db (SQLite local)
└── Sync Service (optionnel)
↓ HTTPS (si activé)
Cloud Sync Server (optionnel)
@ -657,7 +657,7 @@ User Machine A User Machine B
└─────────────┬───────────────────────┘
│ IntraIO (IPC local)
┌─────────────▼───────────────────────┐
aissia-core.exe │
celuna-core.exe │
│ (WarFactory Engine) │
│ ┌────────────────────────────────┐ │
│ │ ICoordinationModule │ │
@ -728,11 +728,11 @@ User Machine A User Machine B
#### 7. **Simplicité Déploiement**
✅ **Copier-coller dossier = fonctionne**
```
aissia/
├── aissia-core.exe
celuna/
├── celuna-core.exe
├── modules/*.dll
├── gameconfig.json
└── aissia.db
└── celuna.db
```
- Pas de Docker, K8s, services cloud
- Pas d'installation complexe
@ -878,7 +878,7 @@ aissia/
### Maintenabilité
- ✅ **Modules indépendants** : Build autonome `cmake .`
- ✅ **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
**Date:** 27 octobre 2025
@ -132,7 +132,7 @@ Assistant personnel intelligent et proactif qui :
### 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 :**
- **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é)
- ⚠️ **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)
- ✅ **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
- ⚠️ **Cross-platform automatique** : Docker + WASM = tourne partout sans effort (hypothétique - complexité à évaluer)
- ⚠️ **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
**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 :**
- **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 │
│ ┌───────────────────────────────┐ │
│ │ aissia-core.exe │ │
│ │ celuna-core.exe │ │
│ │ (WarFactory Engine) │ │
│ │ ├─ IEngine (DebugEngine) │ │
│ │ ├─ IModuleSystem (Sequential)│ │
@ -202,14 +202,14 @@ UN SEUL CODE, TROIS DÉPLOIEMENTS !
│ │ ├─ storage.dll │ │
│ │ └─ ui-imgui.dll │ │
│ └───────────────────────────────┘ │
│ SQLite local (aissia.db) │
│ SQLite local (celuna.db) │
└─────────────────────────────────────┘
```
**Caractéristiques :**
- ✅ **Hot-reload** : 0.4ms (750,000x plus rapide que rebuild complet)
- ✅ **UI** : Dear ImGui (C++, intégré WarFactory)
- ✅ **Storage** : SQLite local (aissia.db)
- ✅ **Storage** : SQLite local (celuna.db)
- ✅ **Coût** : $0 (tout local)
- ✅ **Privacy** : Données jamais uploadées (sauf appels Claude API)
- ✅ **Performance** : Native C++ (pas de WASM overhead)
@ -282,7 +282,7 @@ UN SEUL CODE, TROIS DÉPLOIEMENTS !
- **CI/CD** : GitHub Actions
#### Mode `local_dev` - Modules C++ (DLL)
- **Core Engine** : WarFactory (aissia-core.exe)
- **Core Engine** : WarFactory (celuna-core.exe)
- IEngine (DebugEngine)
- IModuleSystem (SequentialModuleSystem)
- IIO (IntraIO pour communication locale)
@ -292,9 +292,9 @@ UN SEUL CODE, TROIS DÉPLOIEMENTS !
- `scheduler.dll` : Algorithmes planning, détection procrastination
- `ai.dll` : Claude Haiku API integration
- `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
- **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)
#### 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
# 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)
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
https://aissia.app
https://celuna.app
┌───────────────────────────────────────────────────────────────┐
│ SERVICES EXTERNES │
@ -811,7 +811,7 @@ Schedule
**Objectif** : Version locale fonctionnelle avec hot-reload WarFactory (mode `local_dev` DLL uniquement)
**Core Engine :**
- [ ] aissia-core.exe (WarFactory engine)
- [ ] celuna-core.exe (WarFactory engine)
- IEngine (DebugEngine)
- IModuleSystem (SequentialModuleSystem)
- IIO (IntraIO)
@ -835,7 +835,7 @@ Schedule
- Whisper.cpp STT (speech-to-text local)
- Subscribe "ai_response", speak()
- [ ] StorageModule.dll
- SQLite local (aissia.db)
- SQLite local (celuna.db)
- CRUD tâches, historique, métriques
- [ ] UIModule-ImGui.dll
- Dear ImGui interface
@ -944,7 +944,7 @@ Schedule
## 8. KPIs de Succès
### 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)
- ✅ Hot-reload 0.4ms validé
- ✅ Utilisation personnelle quotidienne (dogfooding)
@ -985,7 +985,7 @@ MÊME code C++ (IModule WarFactory)
- **Dev** : Windows 10/11, Visual Studio 2022, WarFactory engine
- **Modules** : DLL (monitoring, scheduler, ai, voice, storage, ui-imgui)
- **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
**Mode 2 : `production_pwa` (Phase 3 - Optionnel) :**
@ -1029,7 +1029,7 @@ MÊME code C++ (IModule WarFactory)
- Vérifier performance WASM acceptable
3. **Création structure projet** (si POC validé) :
```
aissia/
celuna/
├── modules/ # C++ modules sources
│ ├── SchedulerModule/
│ ├── StorageModule/
@ -1130,7 +1130,7 @@ MÊME code C++ (IModule WarFactory)
- gameconfig.json mode `local_dev` uniquement
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)
- 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
@ -35,7 +35,7 @@ Assistant pour gérer le temps, l'hyperfocus et l'apprentissage de langues. Bas
## Structure
```
Aissia/
Celuna/
├── src/
│ ├── main.cpp # Main loop 10Hz + hot-reload
│ └── modules/ # Modules implémentés
@ -50,13 +50,13 @@ Aissia/
```bash
cmake -B build && cmake --build build -j4
./build/aissia
./build/celuna
# Hot-reload: rebuild modules seulement
cmake --build build --target modules
# Mode MCP Server (expose tools via JSON-RPC stdio)
./build/aissia --mcp-server
./build/celuna --mcp-server
```
## Documentation
@ -64,6 +64,6 @@ cmake --build build --target modules
| Doc | Contenu |
|-----|---------|
| `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 |
| `README.md` | Quick start, roadmap |

View File

@ -1,5 +1,5 @@
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_REQUIRED ON)
@ -60,31 +60,31 @@ FetchContent_MakeAvailable(httplib)
# ============================================================================
# LLM Providers Library
add_library(AissiaLLM STATIC
add_library(CelunaLLM STATIC
src/shared/llm/LLMProviderFactory.cpp
src/shared/llm/ClaudeProvider.cpp
src/shared/llm/OpenAIProvider.cpp
src/shared/llm/ToolRegistry.cpp
)
target_include_directories(AissiaLLM PUBLIC
target_include_directories(CelunaLLM PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/src
${httplib_SOURCE_DIR}
)
target_link_libraries(AissiaLLM PUBLIC
target_link_libraries(CelunaLLM PUBLIC
GroveEngine::impl
spdlog::spdlog
)
# Link Winsock for httplib on Windows
if(WIN32)
target_link_libraries(AissiaLLM PUBLIC ws2_32)
target_link_libraries(CelunaLLM PUBLIC ws2_32)
endif()
if(OPENSSL_FOUND)
target_link_libraries(AissiaLLM PUBLIC OpenSSL::SSL OpenSSL::Crypto)
target_compile_definitions(AissiaLLM PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT)
target_link_libraries(CelunaLLM PUBLIC OpenSSL::SSL OpenSSL::Crypto)
target_compile_definitions(CelunaLLM PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT)
endif()
# 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/FileSystemTools.cpp
src/shared/tools/MCPServerTools.cpp
@ -92,51 +92,51 @@ add_library(AissiaTools STATIC
src/shared/mcp/MCPClient.cpp
src/shared/mcp/MCPServer.cpp
)
target_include_directories(AissiaTools PUBLIC
target_include_directories(CelunaTools PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/src
)
target_link_libraries(AissiaTools PUBLIC
target_link_libraries(CelunaTools PUBLIC
GroveEngine::impl
spdlog::spdlog
)
# Platform Library (window tracking)
add_library(AissiaPlatform STATIC
add_library(CelunaPlatform STATIC
src/shared/platform/WindowTrackerFactory.cpp
)
target_include_directories(AissiaPlatform PUBLIC
target_include_directories(CelunaPlatform PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/src
)
target_link_libraries(AissiaPlatform PUBLIC
target_link_libraries(CelunaPlatform PUBLIC
spdlog::spdlog
)
if(WIN32)
target_link_libraries(AissiaPlatform PUBLIC psapi)
target_link_libraries(CelunaPlatform PUBLIC psapi)
endif()
# Audio Library (TTS/STT)
add_library(AissiaAudio STATIC
add_library(CelunaAudio STATIC
src/shared/audio/TTSEngineFactory.cpp
src/shared/audio/STTEngineFactory.cpp
src/shared/audio/VoskSTTEngine.cpp
src/shared/audio/PocketSphinxEngine.cpp
src/shared/audio/WhisperCppEngine.cpp
)
target_include_directories(AissiaAudio PUBLIC
target_include_directories(CelunaAudio PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/src
${httplib_SOURCE_DIR}
${nlohmann_json_SOURCE_DIR}/include
)
target_link_libraries(AissiaAudio PUBLIC
target_link_libraries(CelunaAudio PUBLIC
spdlog::spdlog
)
# Link Winsock for httplib on Windows
if(WIN32)
target_link_libraries(AissiaAudio PUBLIC ws2_32 sapi ole32)
target_link_libraries(CelunaAudio PUBLIC ws2_32 sapi ole32)
endif()
if(OPENSSL_FOUND)
target_link_libraries(AissiaAudio PUBLIC OpenSSL::SSL OpenSSL::Crypto)
target_compile_definitions(AissiaAudio PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT)
target_link_libraries(CelunaAudio PUBLIC OpenSSL::SSL OpenSSL::Crypto)
target_compile_definitions(CelunaAudio PRIVATE CPPHTTPLIB_OPENSSL_SUPPORT)
endif()
# Note: Si OpenSSL n'est pas trouvé, on ne définit PAS CPPHTTPLIB_OPENSSL_SUPPORT
# httplib utilisera HTTP simple sans SSL
@ -145,8 +145,8 @@ endif()
find_library(VOSK_LIBRARY vosk)
if(VOSK_LIBRARY)
message(STATUS "Vosk found: ${VOSK_LIBRARY}")
target_link_libraries(AissiaAudio PUBLIC ${VOSK_LIBRARY})
target_compile_definitions(AissiaAudio PRIVATE HAS_VOSK)
target_link_libraries(CelunaAudio PUBLIC ${VOSK_LIBRARY})
target_compile_definitions(CelunaAudio PRIVATE HAS_VOSK)
else()
message(STATUS "Vosk not found - STT will use fallback engines only")
endif()
@ -156,9 +156,9 @@ find_library(POCKETSPHINX_LIBRARY pocketsphinx)
find_library(SPHINXBASE_LIBRARY sphinxbase)
if(POCKETSPHINX_LIBRARY AND SPHINXBASE_LIBRARY)
message(STATUS "PocketSphinx found: ${POCKETSPHINX_LIBRARY}")
target_link_libraries(AissiaAudio PUBLIC ${POCKETSPHINX_LIBRARY} ${SPHINXBASE_LIBRARY})
target_compile_definitions(AissiaAudio PRIVATE HAVE_POCKETSPHINX)
target_include_directories(AissiaAudio PRIVATE /usr/include/pocketsphinx /usr/include/sphinxbase)
target_link_libraries(CelunaAudio PUBLIC ${POCKETSPHINX_LIBRARY} ${SPHINXBASE_LIBRARY})
target_compile_definitions(CelunaAudio PRIVATE HAVE_POCKETSPHINX)
target_include_directories(CelunaAudio PRIVATE /usr/include/pocketsphinx /usr/include/sphinxbase)
else()
message(STATUS "PocketSphinx not found - keyword spotting unavailable")
endif()
@ -167,9 +167,9 @@ endif()
find_library(WHISPER_LIBRARY whisper PATHS ${CMAKE_SOURCE_DIR}/external/whisper.cpp/build/src)
if(WHISPER_LIBRARY)
message(STATUS "Whisper.cpp found: ${WHISPER_LIBRARY}")
target_link_libraries(AissiaAudio PUBLIC ${WHISPER_LIBRARY})
target_compile_definitions(AissiaAudio PRIVATE HAVE_WHISPER_CPP)
target_include_directories(AissiaAudio PRIVATE
target_link_libraries(CelunaAudio PUBLIC ${WHISPER_LIBRARY})
target_compile_definitions(CelunaAudio PRIVATE HAVE_WHISPER_CPP)
target_include_directories(CelunaAudio PRIVATE
${CMAKE_SOURCE_DIR}/external/whisper.cpp/include
${CMAKE_SOURCE_DIR}/external/whisper.cpp/ggml/include)
else()
@ -179,40 +179,40 @@ endif()
# ============================================================================
# Infrastructure Services Library (linked into main)
# ============================================================================
add_library(AissiaServices STATIC
add_library(CelunaServices STATIC
src/services/LLMService.cpp
src/services/StorageService.cpp
src/services/PlatformService.cpp
src/services/VoiceService.cpp
src/services/STTService.cpp
)
target_include_directories(AissiaServices PUBLIC
target_include_directories(CelunaServices PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/src
)
target_link_libraries(AissiaServices PUBLIC
target_link_libraries(CelunaServices PUBLIC
GroveEngine::impl
spdlog::spdlog
AissiaLLM
AissiaTools
AissiaPlatform
AissiaAudio
CelunaLLM
CelunaTools
CelunaPlatform
CelunaAudio
SQLite::SQLite3
)
# ============================================================================
# Main Executable (with services)
# ============================================================================
add_executable(aissia
add_executable(celuna
src/main.cpp
)
target_link_libraries(aissia PRIVATE
target_link_libraries(celuna PRIVATE
GroveEngine::impl
spdlog::spdlog
AissiaServices
CelunaServices
)
target_include_directories(aissia PRIVATE
target_include_directories(celuna PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src
)
@ -370,12 +370,12 @@ endif()
# Create data directory
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/data)
# Run Aissia
# Run Celuna
add_custom_target(run
COMMAND $<TARGET_FILE:aissia>
DEPENDS aissia modules
COMMAND $<TARGET_FILE:celuna>
DEPENDS celuna modules
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
)
target_link_libraries(test_stt_engines
AissiaAudio
CelunaAudio
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
@ -42,7 +42,7 @@ src/shared/tools/
#include <vector>
#include <nlohmann/json.hpp>
namespace aissia::tools {
namespace celuna::tools {
struct FileSystemTools {
// Définitions des tools pour le LLM
@ -61,7 +61,7 @@ private:
static nlohmann::json grepFiles(const nlohmann::json& params);
};
} // namespace aissia::tools
} // namespace celuna::tools
```
### Dépendances
@ -106,7 +106,7 @@ nlohmann::json LLMService::executeTool(const std::string& name,
{
"allowed_paths": [
"/mnt/e/Users/Alexis Trouvé/Documents/Projets/",
"/tmp/aissia/"
"/tmp/celuna/"
],
"blocked_patterns": [
"*.env",
@ -137,10 +137,10 @@ nlohmann::json LLMService::executeTool(const std::string& name,
```bash
# 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
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

View File

@ -1,4 +1,4 @@
# Plan d'Implementation - Tests d'Integration AISSIA
# Plan d'Implementation - Tests d'Integration CELUNA
## Vue d'Ensemble
@ -65,7 +65,7 @@ public:
#### MockTransport.hpp
```cpp
class MockTransport : public aissia::mcp::IMCPTransport {
class MockTransport : public celuna::mcp::IMCPTransport {
public:
bool m_running = false;
std::vector<JsonRpcRequest> sentRequests;
@ -622,7 +622,7 @@ FetchContent_Declare(
FetchContent_MakeAvailable(Catch2)
# Test executable
add_executable(aissia_tests
add_executable(celuna_tests
tests/main.cpp
# Mocks
@ -642,14 +642,14 @@ add_executable(aissia_tests
tests/mcp/MCPClientTests.cpp
)
target_link_libraries(aissia_tests PRIVATE
target_link_libraries(celuna_tests PRIVATE
Catch2::Catch2WithMain
GroveEngine::impl
AissiaTools
CelunaTools
spdlog::spdlog
)
target_include_directories(aissia_tests PRIVATE
target_include_directories(celuna_tests PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/src
${CMAKE_CURRENT_SOURCE_DIR}/tests
)
@ -660,12 +660,12 @@ file(COPY tests/fixtures/ DESTINATION ${CMAKE_BINARY_DIR}/tests/fixtures)
# CTest integration
include(CTest)
include(Catch)
catch_discover_tests(aissia_tests)
catch_discover_tests(celuna_tests)
# Custom target for running tests
add_custom_target(test_all
COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure
DEPENDS aissia_tests
DEPENDS celuna_tests
COMMENT "Running all integration tests"
)
```
@ -724,10 +724,10 @@ cmake --build build
cmake --build build --target test_all
# Executer tests specifiques
./build/aissia_tests "[scheduler]" # Tests scheduler
./build/aissia_tests "[mcp]" # Tests MCP
./build/aissia_tests "[integration]" # Tous les TI
./build/celuna_tests "[scheduler]" # Tests scheduler
./build/celuna_tests "[mcp]" # Tests MCP
./build/celuna_tests "[integration]" # Tous les TI
# 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
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)
@ -12,8 +12,8 @@ Tu reprends le développement d'**AISSIA**, un assistant vocal agentique en C++1
✅ 6 modules hot-reload fonctionnels
✅ 4 services infrastructure (LLM, Storage, Platform, Voice)
✅ 17 tools pour l'agent LLM
✅ Mode MCP Server : `./build/aissia --mcp-server`
✅ Mode interactif : `./run.sh` ou `./build/aissia --interactive`
✅ Mode MCP Server : `./build/celuna --mcp-server`
✅ Mode interactif : `./run.sh` ou `./build/celuna --interactive`
**Tests MCP : 50/50 passent** (transport + client)
**Tests totaux : 110/110 passent** ✨ TOUS LES TESTS PASSENT ✨
**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/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/StdioTransport.*` | Transport stdio pour MCP (spawne process enfant) |
| `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 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
# Run normal (boucle principale sans interaction)
./build/aissia
./build/celuna
# Run comme serveur MCP (pour Claude Code)
./build/aissia --mcp-server
./build/celuna --mcp-server
# Tests
cp tests/fixtures/mock_mcp.json build/tests/fixtures/
./build/tests/aissia_tests # Tous (110/110) ✅
./build/tests/aissia_tests "[mcp]" # MCP (50/50)
./build/tests/aissia_tests "[transport]" # Transport (20/20)
./build/tests/aissia_tests "[client]" # Client (15/15)
./build/tests/celuna_tests # Tous (110/110) ✅
./build/tests/celuna_tests "[mcp]" # MCP (50/50)
./build/tests/celuna_tests "[transport]" # Transport (20/20)
./build/tests/celuna_tests "[client]" # Client (15/15)
```
## ~~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
- **Time Management**: Intelligent scheduling and task planning
- **Language Learning**: Interactive practice in target languages
@ -12,7 +12,7 @@ AISSIA helps manage:
## 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)
- **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
```
Aissia/
Celuna/
├── external/
│ └── GroveEngine/ # GroveEngine (symlink)
├── src/
@ -113,13 +113,13 @@ cmake --build build --target modules
./run.sh
# Or manually with .env loaded
source .env && ./build/aissia -i
source .env && ./build/celuna -i
# MCP Server mode (for Claude Code integration)
./build/aissia --mcp-server
./build/celuna --mcp-server
# Normal mode (background daemon)
./build/aissia
./build/celuna
```
**Note**: Create a `.env` file with your API key:
@ -129,7 +129,7 @@ ANTHROPIC_API_KEY=sk-ant-...
### Hot-Reload Workflow
1. Start AISSIA: `./build/aissia`
1. Start Celuna: `./build/celuna`
2. Edit a module: `src/modules/SchedulerModule.cpp`
3. Rebuild: `cmake --build build --target modules`
4. **Module reloads automatically with state preserved**
@ -188,7 +188,7 @@ See `docs/GROVEENGINE_GUIDE.md` for detailed module development guide.
## 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
**Auditeur** : Claude Code
@ -192,11 +192,11 @@ void StorageModule::setState(const grove::IDataNode& state) {
**CMakeLists.txt:86-101** :
```cmake
add_library(AissiaLLM STATIC ...)
target_link_libraries(AIModule PRIVATE AissiaLLM)
add_library(CelunaLLM STATIC ...)
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** :
- 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
@ -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.
**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
{
"mcpServers": {
"aissia": {
"command": "C:\\path\\to\\your\\aissia\\build\\aissia.exe",
"celuna": {
"command": "C:\\path\\to\\your\\celuna\\build\\celuna.exe",
"args": ["--mcp-server"],
"disabled": false
}
@ -52,23 +52,23 @@ Restart VS Code (or reload window: `Ctrl+Shift+P` → "Developer: Reload Window"
### 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?
Claude: I have access to the following MCP servers:
- aissia: 13 tools available
- celuna: 13 tools available
```
## 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)
1. **chat_with_aissia** ⭐ - Dialogue with AISSIA's AI assistant (Claude Sonnet 4)
### Celuna Core (5 tools)
1. **chat_with_celuna** ⭐ - Dialogue with Celuna's AI assistant (Claude Sonnet 4)
2. **transcribe_audio** - Transcribe audio files to text
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
### File System (8 tools)
@ -88,8 +88,8 @@ Once configured, Claude will have access to these 13 AISSIA tools:
```json
{
"mcpServers": {
"aissia": {
"command": "path/to/aissia.exe",
"celuna": {
"command": "path/to/celuna.exe",
"args": ["--mcp-server"],
"disabled": false
}
@ -104,11 +104,11 @@ To skip confirmation prompts for specific tools:
```json
{
"mcpServers": {
"aissia": {
"command": "path/to/aissia.exe",
"celuna": {
"command": "path/to/celuna.exe",
"args": ["--mcp-server"],
"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
To temporarily disable AISSIA without removing the configuration:
To temporarily disable Celuna without removing the configuration:
```json
{
"mcpServers": {
"aissia": {
"command": "path/to/aissia.exe",
"celuna": {
"command": "path/to/celuna.exe",
"args": ["--mcp-server"],
"disabled": true // <-- Set to true
}
@ -132,7 +132,7 @@ To temporarily disable AISSIA without removing the configuration:
## 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
```json
@ -141,14 +141,14 @@ Before running AISSIA in MCP server mode, ensure these config files exist:
"api_key": "sk-ant-api03-...",
"model": "claude-sonnet-4-20250514",
"max_iterations": 10,
"system_prompt": "Tu es AISSIA, un assistant personnel intelligent..."
"system_prompt": "Tu es Celuna, un assistant personnel intelligent..."
}
```
### config/storage.json
```json
{
"database_path": "./data/aissia.db",
"database_path": "./data/celuna.db",
"journal_mode": "WAL",
"busy_timeout_ms": 5000
}
@ -176,23 +176,23 @@ You can test the MCP server independently before integrating with Claude Code:
```bash
# 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
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
# Test chat_with_celuna tool
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
### "Server not found" or "Connection failed"
1. Verify the `command` path is correct and points to `aissia.exe`
2. Make sure AISSIA compiles successfully: `cmake --build build`
3. Test running `./build/aissia.exe --mcp-server` manually
1. Verify the `command` path is correct and points to `celuna.exe`
2. Make sure Celuna compiles successfully: `cmake --build build`
3. Test running `./build/celuna.exe --mcp-server` manually
### "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`
2. API key is valid: `"api_key": "sk-ant-api03-..."`
3. Provider is set: `"provider": "claude"`
@ -215,21 +215,21 @@ These will be completed in Phase 8.1 and 8.2.
## 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?"
Claude: [calls chat_with_aissia tool]
AISSIA: Based on your activity data, your most productive hours are 9-11 AM...
You: Use chat_with_celuna to ask "What are my top productivity patterns?"
Claude: [calls chat_with_celuna tool]
Celuna: Based on your activity data, your most productive hours are 9-11 AM...
```
### 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 chat_with_aissia with task list]
AISSIA: Here's a prioritized version based on urgency and dependencies...
Claude: [calls chat_with_celuna with task list]
Celuna: Here's a prioritized version based on urgency and dependencies...
```
### 3. Voice Transcription (future)
@ -244,13 +244,13 @@ Result: "Welcome to the team meeting. Today we're discussing..."
### Multiple MCP Servers
You can configure multiple MCP servers alongside AISSIA:
You can configure multiple MCP servers alongside Celuna:
```json
{
"mcpServers": {
"aissia": {
"command": "C:\\path\\to\\aissia\\build\\aissia.exe",
"celuna": {
"command": "C:\\path\\to\\celuna\\build\\celuna.exe",
"args": ["--mcp-server"],
"disabled": false
},
@ -273,17 +273,17 @@ You can configure multiple MCP servers alongside AISSIA:
### Environment Variables
Pass environment variables to AISSIA:
Pass environment variables to Celuna:
```json
{
"mcpServers": {
"aissia": {
"command": "C:\\path\\to\\aissia\\build\\aissia.exe",
"celuna": {
"command": "C:\\path\\to\\celuna\\build\\celuna.exe",
"args": ["--mcp-server"],
"disabled": false,
"env": {
"AISSIA_LOG_LEVEL": "debug",
"Celuna_LOG_LEVEL": "debug",
"CLAUDE_API_KEY": "sk-ant-api03-..."
}
}
@ -301,5 +301,5 @@ Pass environment variables to AISSIA:
For issues or questions:
1. Check the full documentation: `docs/CLAUDE_CODE_INTEGRATION.md`
2. Review logs: AISSIA writes to stderr in MCP mode
3. Test manually: `./build/aissia.exe --mcp-server` and send JSON-RPC requests
2. Review logs: Celuna writes to stderr in MCP mode
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": {
"aissia": {
"command": "C:\\Users\\alexi\\Documents\\projects\\aissia\\build\\aissia.exe",
"celuna": {
"command": "C:\\Users\\alexi\\Documents\\projects\\aissia\\build\\celuna.exe",
"args": ["--mcp-server"],
"disabled": false,
"alwaysAllow": []

View File

@ -1,5 +1,5 @@
{
"database_path": "./data/aissia.db",
"database_path": "./data/celuna.db",
"journal_mode": "WAL",
"busy_timeout_ms": 5000
}

View File

@ -1,26 +1,26 @@
# AISSIA - Claude Code Integration (Phase 8)
# CELUNA - Claude Code Integration (Phase 8)
## 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
AISSIA exposes **13 tools** total:
CELUNA exposes **13 tools** total:
### 1. AISSIA Core Tools (Priority)
### 1. CELUNA Core Tools (Priority)
#### `chat_with_aissia` ⭐ **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.
#### `chat_with_celuna` ⭐ **PRIORITY**
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**:
```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",
"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**:
```json
{
"response": "AISSIA's response text",
"response": "CELUNA's response text",
"conversation_id": "conversation-id",
"tokens": 1234,
"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 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
#### `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**:
```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
#### `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**:
```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`
**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
{
"mcpServers": {
"aissia": {
"command": "C:\\path\\to\\aissia\\build\\aissia.exe",
"celuna": {
"command": "C:\\path\\to\\celuna\\build\\celuna.exe",
"args": ["--mcp-server"],
"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
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
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
### 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
// Normal mode (async)
@ -239,9 +239,9 @@ for (auto& toolDef : FileSystemTools::getToolDefinitions()) {
registry.registerTool(toolDef);
}
// 3. AISSIA tools (5 tools)
MCPServerTools aissiaTools(llmService, storageService, voiceService);
for (const auto& toolDef : aissiaTools.getToolDefinitions()) {
// 3. CELUNA tools (5 tools)
MCPServerTools celunaTools(llmService, storageService, voiceService);
for (const auto& toolDef : celunaTools.getToolDefinitions()) {
registry.registerTool(toolDef);
}
```
@ -250,7 +250,7 @@ Total: **13 tools**
## 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/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
### 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
- [ ] `list_active_apps` - Get current monitored applications
- [ ] `send_notification` - Trigger system notifications
@ -303,12 +303,12 @@ AISSIA MCP Server requires these config files (same as normal mode):
### 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."
→ calls chat_with_aissia("Analyze recent focus patterns")
AISSIA: "Based on monitoring data, user has 3 hyperfocus sessions daily averaging 2.5 hours..."
Claude: "I need to analyze user behavior patterns. Let me ask CELUNA."
→ calls chat_with_celuna("Analyze recent focus patterns")
CELUNA: "Based on monitoring data, user has 3 hyperfocus sessions daily averaging 2.5 hours..."
```
### 2. Voice Transcription Workflow
@ -322,7 +322,7 @@ Claude: "Transcribe meeting-2025-01-30.wav"
### 3. Knowledge Management
```
Claude: "Save this important insight to AISSIA's memory"
Claude: "Save this important insight to CELUNA's memory"
→ calls save_memory(
title="Project architecture decision",
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
```
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 chat_with_aissia("Prioritize these tasks: ...")
→ calls chat_with_celuna("Prioritize these tasks: ...")
→ calls write_file("todos-prioritized.md", content=...)
```
@ -397,15 +397,15 @@ Test with `nc` or `socat`:
```bash
# 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
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:
```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
@ -430,7 +430,7 @@ Voice tools are optional. If you don't need STT/TTS, this is normal.
Make sure `config/storage.json` exists:
```json
{
"database_path": "./data/aissia.db",
"database_path": "./data/celuna.db",
"journal_mode": "WAL",
"busy_timeout_ms": 5000
}
@ -443,7 +443,7 @@ Check `tools/list` output to see which tools are actually registered.
## References
- **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`
- **LLM Service**: `src/services/LLMService.hpp`
- **MCPServer**: `src/shared/mcp/MCPServer.hpp`

View File

@ -8,7 +8,7 @@
## 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
- ✅ **TTS espeak-ng** : Synthèse vocale française
- ✅ **18 outils** : Scheduler, Storage, Filesystem, MCP, etc.
@ -21,15 +21,15 @@ AISSIA fonctionne parfaitement en mode interactif avec :
### Commande
```bash
echo "Bonjour AISSIA ! Quelle heure est-il ?" | ./build/aissia -i
echo "Bonjour CELUNA ! Quelle heure est-il ?" | ./build/celuna -i
```
### Résultat
**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 ?
**Actions automatiques** :
@ -65,7 +65,7 @@ echo "Bonjour AISSIA ! Quelle heure est-il ?" | ./build/aissia -i
### 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
[VoiceModule] [info] VoiceModule arrete. Spoken: 1, Transcribed: 0
[StorageService] [info] StorageService shutdown. Total queries: 2
@ -139,7 +139,7 @@ echo "Bonjour AISSIA ! Quelle heure est-il ?" | ./build/aissia -i
### ✅ TTS Multilingue
- Voix française (fr-fr)
- Détection automatique espeak-ng
- Parle toutes les réponses AISSIA
- Parle toutes les réponses CELUNA
### ✅ Hot-Reload
- 7 modules chargés dynamiquement
@ -199,7 +199,7 @@ echo "Bonjour AISSIA ! Quelle heure est-il ?" | ./build/aissia -i
**Tools** : `get_current_time`
### 2. Conversation Proactive ✅
**Input** : "Bonjour AISSIA !"
**Input** : "Bonjour CELUNA !"
**Output** : Propose de vérifier tâches et planifier la journée
**Tools** : Aucun (conversation pure)
@ -238,7 +238,7 @@ echo "Bonjour AISSIA ! Quelle heure est-il ?" | ./build/aissia -i
## Conclusion
**AISSIA est FONCTIONNEL en mode interactif** !
**CELUNA est FONCTIONNEL en mode interactif** !
**Résultats** :
- Conversation naturelle ✅

View File

@ -2,13 +2,13 @@
## 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
```
┌─────────────────────────────────────────────────────────────────────────────┐
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
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
@ -24,7 +24,7 @@ Assistant intelligent qui :
## Architecture
AISSIA réutilise l'**architecture modulaire WarFactory** :
CELUNA réutilise l'**architecture modulaire WarFactory** :
- **Hot-reload 0.4ms** : Modifications instantanées sans restart
- **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)
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)**
→ 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)**
→ Workflow de développement avec hot-reload 0.4ms
### 2. Modules AISSIA Prévus
### 2. Modules CELUNA Prévus
**MVP Phase 1 (Local uniquement) :**
- `SchedulerModule` : Planning intelligent des tâches
@ -155,12 +155,12 @@ DataOrientedEngine + ClusterModuleSystem + NetworkIO
**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
## 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
## Contribution

View File

@ -1,6 +1,6 @@
# 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

View File

@ -4,7 +4,7 @@ Guide pour configurer les moteurs de reconnaissance vocale STT sur Windows.
## État Actuel
AISSIA supporte **5 moteurs STT** avec priorités automatiques :
CELUNA supporte **5 moteurs STT** avec priorités automatiques :
| Moteur | Type | Status | Requis |
|--------|------|--------|--------|
@ -154,7 +154,7 @@ python create_test_audio_simple.py
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 :
- `voice:start_listening` (pub/sub)
@ -218,7 +218,7 @@ GOOGLE_API_KEY=AIzaSy...
### Whisper.cpp
- ✅ Intégré dans le build (external/whisper.cpp)
- ✅ Lié statiquement à AissiaAudio
- ✅ Lié statiquement à CelunaAudio
- ❌ Modèle requis : téléchargé dans `models/`
### APIs Cloud

View File

@ -1,8 +1,8 @@
# Document de Succession - AISSIA
# Document de Succession - CELUNA
## 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`
@ -26,15 +26,15 @@ AISSIA = Assistant vocal agentique basé sur GroveEngine (C++17 hot-reload). Arc
cmake -B build && cmake --build build -j4
# Run (depuis racine ou build/)
./build/aissia
./build/celuna
# Mode MCP Server (expose les tools via JSON-RPC stdio)
./build/aissia --mcp-server
./build/celuna --mcp-server
# Tests
cmake -B build -DBUILD_TESTING=ON
./build/tests/aissia_tests "[scheduler],[notification]" # Modules
./build/tests/aissia_tests "[types]" # MCP types
./build/tests/celuna_tests "[scheduler],[notification]" # Modules
./build/tests/celuna_tests "[types]" # MCP types
```
### Variables d'Environnement
@ -127,7 +127,7 @@ src/modules/StorageModule.*
```
src/shared/mcp/MCPTypes.hpp
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.*
config/mcp.json
```
@ -139,12 +139,12 @@ config/mcp.json
cmake -B build -DBUILD_TESTING=ON && cmake --build build -j4
# Par catégorie
./build/tests/aissia_tests "[scheduler]" # 10 tests
./build/tests/aissia_tests "[notification]" # 10 tests
./build/tests/aissia_tests "[types]" # 15 tests MCP
./build/tests/celuna_tests "[scheduler]" # 10 tests
./build/tests/celuna_tests "[notification]" # 10 tests
./build/tests/celuna_tests "[types]" # 15 tests MCP
# 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** :
@ -170,10 +170,10 @@ cmake -B build -DBUILD_TESTING=ON && cmake --build build -j4
## 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
./build/aissia --mcp-server
./build/celuna --mcp-server
```
### Protocole
@ -181,11 +181,11 @@ AISSIA peut fonctionner comme **serveur MCP**, exposant ses tools à des clients
Communication JSON-RPC 2.0 sur stdin/stdout :
```json
// Client → AISSIA
// Client → CELUNA
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"clientInfo":{"name":"client","version":"1.0"}}}
// AISSIA → Client
{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05","serverInfo":{"name":"aissia","version":"0.2.0"},...}}
// CELUNA → Client
{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05","serverInfo":{"name":"celuna","version":"0.2.0"},...}}
// Lister les tools
{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}
@ -200,8 +200,8 @@ Ajouter dans la config MCP :
```json
{
"servers": {
"aissia": {
"command": "/chemin/vers/build/aissia",
"celuna": {
"command": "/chemin/vers/build/celuna",
"args": ["--mcp-server"]
}
}

View File

@ -1,4 +1,4 @@
# Architecture Technique - AISSIA
# Architecture Technique - CELUNA
## Vision Globale
@ -96,7 +96,7 @@ class IModule {
#### Évolution Progressive Détaillée
**Phase 1 : Debug/Prototype (MVP AISSIA)**
**Phase 1 : Debug/Prototype (MVP CELUNA)**
```cpp
DebugEngine + SequentialModuleSystem + IntraIO
```
@ -139,7 +139,7 @@ DataOrientedEngine + ClusterModuleSystem + NetworkIO
#### Évolution Progressive Sans Régression
```cpp
// Phase 1 : Prototype (MVP AISSIA)
// Phase 1 : Prototype (MVP CELUNA)
DebugEngine + SequentialModuleSystem + IntraIO
→ 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)
```
## 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
- **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
### Mode Local (MVP AISSIA)
### Mode Local (MVP CELUNA)
**Architecture :**
- Tous modules locaux (IntraIO)

View File

@ -2,7 +2,7 @@
## 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é
@ -1631,5 +1631,5 @@ void testProviderConsistency() {
- [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)
- [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

View File

@ -1,8 +1,8 @@
# AISSIA - Vue d'Ensemble du Projet
# CELUNA - Vue d'Ensemble du Projet
## 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)
- Faciliter l'apprentissage de langues
- 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
```
Aissia/
Celuna/
├── CLAUDE.md # Instructions développement (obsolète → ce fichier)
├── docs/ # Documentation technique
│ ├── 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:
```cpp
// stt_impl.cpp - PAS d'include JsonDataNode.h
namespace aissia::stt_impl {
namespace celuna::stt_impl {
// Toute la logique STT ici
}
```
@ -179,7 +179,7 @@ namespace aissia::stt_impl {
### Option D: Compiler en Bibliothèque Statique 📦
```cmake
# 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
```

View File

@ -2,7 +2,7 @@
**Date de création** : 2025-11-29
**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 <memory>
namespace aissia {
namespace celuna {
enum class STTMode {
PASSIVE, // Keyword spotting (économe)
@ -167,7 +167,7 @@ public:
virtual std::string getCurrentEngine() const = 0;
};
} // namespace aissia
} // namespace celuna
```
**Estimation** : 50 lignes
@ -285,7 +285,7 @@ unzip vosk-model-small-fr-0.22.zip -d models/
#include <vosk_api.h>
#include <spdlog/spdlog.h>
namespace aissia {
namespace celuna {
class VoskSTTEngine : public ISTTEngine {
public:
@ -363,7 +363,7 @@ private:
}
};
} // namespace aissia
} // namespace celuna
```
**Estimation** : 200 lignes
@ -399,7 +399,7 @@ hey celuna /1e-50/
#include <pocketsphinx.h>
#include <spdlog/spdlog.h>
namespace aissia {
namespace celuna {
class PocketSphinxEngine : public ISTTEngine {
public:
@ -478,7 +478,7 @@ private:
}
};
} // namespace aissia
} // namespace celuna
```
**Estimation** : 180 lignes
@ -520,7 +520,7 @@ make
#include "WhisperCppEngine.hpp"
#include "WhisperAPIEngine.hpp"
namespace aissia {
namespace celuna {
std::unique_ptr<ISTTEngine> STTEngineFactory::create(
const std::string& type,
@ -556,7 +556,7 @@ std::unique_ptr<ISTTEngine> STTEngineFactory::create(
return std::make_unique<StubSTTEngine>();
}
} // namespace aissia
} // namespace celuna
```
**Estimation** : 80 lignes

View File

@ -1,10 +1,10 @@
# 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
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** :
- ✅ 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...
========================================
@ -318,7 +318,7 @@ ls build/tests/integration/
# ...
# Lancer les tests
./build/aissia --run-tests
./build/celuna --run-tests
# Vérifier exit code
echo $? # Doit être 0 si tous passent
@ -357,10 +357,10 @@ cmake --build build -j4
cmake --build build --target integration_tests
# Run tests avec verbose
./build/aissia --run-tests --verbose
./build/celuna --run-tests --verbose
# 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)
# (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
@ -59,7 +59,7 @@
## 📊 Résultats d'Exécution (Dernière Run)
```bash
cd build && ./aissia --run-tests
cd build && ./celuna --run-tests
```
**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
# 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
@ -238,8 +238,8 @@ plans/PROMPT_NEXT_INTEGRATION_TESTS.md +517 lignes (ce fichier)
**Tâches** :
1. Modifier `main.cpp` pour charger modules en mode test
2. Rebuild : `cmake --build build --target aissia`
3. Tester avec API : `cd build && source ../.env && ./aissia --run-tests`
2. Rebuild : `cmake --build build --target celuna`
3. Tester avec API : `cd build && source ../.env && ./celuna --run-tests`
4. Valider : 13/13 PASS ✅
**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
# 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
# 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)
# 4. Tester
cd build && ./aissia --run-tests
cd build && ./celuna --run-tests
cat test-results.json | python3 -m json.tool
```

View File

@ -1,10 +1,10 @@
# 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
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** :
- ✅ 6 modules fonctionnels (Scheduler, Notification, Monitoring, AI, Voice, Storage)
@ -121,13 +121,13 @@ Avant de considérer le travail terminé :
```bash
# Build
cmake --build build --target modules -j4
cmake --build build --target aissia_tests -j4
cmake --build build --target celuna_tests -j4
# Tests
./build/tests/aissia_tests "[web]"
./build/tests/celuna_tests "[web]"
# 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)
@ -135,7 +135,7 @@ cmake --build build --target aissia_tests -j4
### Hot-Reload
Teste manuellement le hot-reload :
```bash
# 1. Lance AISSIA
# 1. Lance CELUNA
./run.sh
# 2. Modifie WebModule.cpp (change un log)
@ -164,10 +164,10 @@ cmake -B build && cmake --build build -j4
cmake --build build --target modules
# Tests avec filtre
./build/tests/aissia_tests "[web]"
./build/tests/celuna_tests "[web]"
# Tous les tests
./build/tests/aissia_tests --reporter compact
./build/tests/celuna_tests --reporter compact
# Git
git add -A

View File

@ -1,6 +1,6 @@
# 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
**Auteur** : Claude Code
@ -11,7 +11,7 @@
### 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
- Services infrastructure (LLM, Storage, Platform, Voice)
- 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 │ │
@ -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, │ │
│ │ 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
```
1. User: ./build/aissia --run-tests
2. AISSIA démarre en mode test
1. User: ./build/celuna --run-tests
2. CELUNA démarre en mode test
3. Charge TestRunnerModule (au lieu des modules normaux)
4. TestRunnerModule:
a. Lit config/test_runner.json
@ -173,7 +173,7 @@ private:
**But** : Interface commune pour tous les modules de test
```cpp
namespace aissia::testing {
namespace celuna::testing {
struct TestResult {
bool passed = false;
@ -190,7 +190,7 @@ public:
virtual std::string getDescription() const = 0;
};
} // namespace aissia::testing
} // namespace celuna::testing
```
### 3.3 Modules de Test Individuels
@ -287,7 +287,7 @@ Exemple : `IT_001_GetCurrentTime.cpp`
#include <grove/JsonDataNode.h>
#include <chrono>
namespace aissia::testing {
namespace celuna::testing {
class IT_001_GetCurrentTime : public ITestModule {
public:
@ -387,12 +387,12 @@ private:
int m_timeout = 10000;
};
} // namespace aissia::testing
} // namespace celuna::testing
// Factory functions
extern "C" {
grove::IModule* createModule() {
return new aissia::testing::IT_001_GetCurrentTime();
return new celuna::testing::IT_001_GetCurrentTime();
}
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...
========================================
@ -671,16 +671,16 @@ ls build/tests/integration/
```bash
# Lancer tous les tests
./build/aissia --run-tests
./build/celuna --run-tests
# 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
./build/aissia --run-tests --verbose
./build/celuna --run-tests --verbose
# Sauvegarder résultats JSON
./build/aissia --run-tests --json-output results.json
./build/celuna --run-tests --json-output results.json
```
### 8.3 CI/CD
@ -696,7 +696,7 @@ cmake -B build -DBUILD_TESTING=ON
cmake --build build --target integration_tests -j4
# 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
if [ $? -eq 0 ]; then
@ -811,4 +811,4 @@ README.md # Documenter système de tests
**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 <spdlog/spdlog.h>
namespace aissia {
namespace celuna {
class WebModule : public grove::IModule {
public:
@ -96,7 +96,7 @@ private:
int m_failedRequests = 0;
};
} // namespace aissia
} // namespace celuna
```
#### `src/modules/WebModule.cpp` (180 lignes)
@ -251,8 +251,8 @@ TI_WEB_010: Error Response Format
7. **Exécuter les tests**
```bash
cmake --build build --target aissia_tests
./build/tests/aissia_tests "[web]"
cmake --build build --target celuna_tests
./build/tests/celuna_tests "[web]"
```
### Phase 3: Documentation & Exemples (30min)

View File

@ -187,7 +187,7 @@ int runMCPServer() {
// === Initialize Services ===
// 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")) {
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
// 2. StorageService (for save_memory/search_memories)
auto storageService = std::make_unique<aissia::StorageService>();
auto storageService = std::make_unique<celuna::StorageService>();
storageService->initialize(nullptr);
// 3. VoiceService (for TTS/STT)
auto voiceService = std::make_unique<aissia::VoiceService>();
auto voiceService = std::make_unique<celuna::VoiceService>();
// Note: Voice config is optional
voiceService->initialize(nullptr);
// === Create Tool Registry ===
aissia::ToolRegistry registry;
celuna::ToolRegistry registry;
// Register get_current_time tool
registry.registerTool(
@ -221,20 +221,20 @@ int runMCPServer() {
);
// 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>();
registry.registerTool(
toolName,
toolDef["description"].get<std::string>(),
toolDef["input_schema"],
[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) ===
aissia::tools::MCPServerTools aissiaTools(
celuna::tools::MCPServerTools aissiaTools(
llmService.get(),
storageService.get(),
voiceService.get()
@ -247,7 +247,7 @@ int runMCPServer() {
spdlog::info("Registered {} tools total", registry.size());
// Create and run MCP server
aissia::mcp::MCPServer server(registry);
celuna::mcp::MCPServer server(registry);
server.setServerInfo("aissia", "0.2.0");
server.run();
@ -356,7 +356,7 @@ int main(int argc, char* argv[]) {
auto voiceIO = grove::IOFactory::create("intra", "VoiceService");
// LLM Service
aissia::LLMService llmService;
celuna::LLMService llmService;
llmService.initialize(llmIO.get());
llmService.loadConfig(configDir + "ai.json");
@ -375,7 +375,7 @@ int main(int argc, char* argv[]) {
);
// Storage Service
aissia::StorageService storageService;
celuna::StorageService storageService;
storageService.initialize(storageIO.get());
{
auto storageConfig = loadConfig(configDir + "storage.json");
@ -386,7 +386,7 @@ int main(int argc, char* argv[]) {
}
// Platform Service
aissia::PlatformService platformService;
celuna::PlatformService platformService;
platformService.initialize(platformIO.get());
{
auto monitorConfig = loadConfig(configDir + "monitoring.json");
@ -396,7 +396,7 @@ int main(int argc, char* argv[]) {
}
// Voice Service
aissia::VoiceService voiceService;
celuna::VoiceService voiceService;
voiceService.initialize(voiceIO.get());
{
// Load voice.json directly as nlohmann::json for Phase 7 STT

View File

@ -2,7 +2,7 @@
#include <grove/IIO.h>
#include <grove/JsonDataNode.h>
namespace aissia {
namespace celuna {
AIModule::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);
}
} // namespace aissia
} // namespace celuna
#ifndef AISSIA_TEST_BUILD
#ifndef CELUNA_TEST_BUILD
extern "C" {
grove::IModule* createModule() {
return new aissia::AIModule();
return new celuna::AIModule();
}
void destroyModule(grove::IModule* module) {

View File

@ -9,7 +9,7 @@
#include <memory>
#include <string>
namespace aissia {
namespace celuna {
/**
* @brief AI Assistant Module - Pure business logic
@ -73,7 +73,7 @@ private:
void publishSuggestion(const std::string& message, int duration);
};
} // namespace aissia
} // namespace celuna
extern "C" {
grove::IModule* createModule();

View File

@ -3,7 +3,7 @@
#include <grove/JsonDataNode.h>
#include <algorithm>
namespace aissia {
namespace celuna {
MonitoringModule::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);
}
} // namespace aissia
} // namespace celuna
#ifndef AISSIA_TEST_BUILD
#ifndef CELUNA_TEST_BUILD
extern "C" {
grove::IModule* createModule() {
return new aissia::MonitoringModule();
return new celuna::MonitoringModule();
}
void destroyModule(grove::IModule* module) {

View File

@ -10,7 +10,7 @@
#include <set>
#include <map>
namespace aissia {
namespace celuna {
/**
* @brief Monitoring Module - App classification logic only
@ -77,7 +77,7 @@ private:
void handleToolQuery(const grove::IDataNode& request);
};
} // namespace aissia
} // namespace celuna
extern "C" {
grove::IModule* createModule();

View File

@ -1,7 +1,7 @@
#include "NotificationModule.h"
#include <grove/JsonDataNode.h>
namespace aissia {
namespace celuna {
NotificationModule::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);
}
} // namespace aissia
} // namespace celuna
#ifndef AISSIA_TEST_BUILD
#ifndef CELUNA_TEST_BUILD
extern "C" {
grove::IModule* createModule() {
return new aissia::NotificationModule();
return new celuna::NotificationModule();
}
void destroyModule(grove::IModule* module) {

View File

@ -9,7 +9,7 @@
#include <string>
#include <queue>
namespace aissia {
namespace celuna {
/**
* @brief Notification Module - Alertes système et TTS
@ -88,7 +88,7 @@ private:
std::string priorityToEmoji(Priority p);
};
} // namespace aissia
} // namespace celuna
extern "C" {
grove::IModule* createModule();

View File

@ -1,8 +1,9 @@
#include "SchedulerModule.h"
#include <grove/IIO.h>
#include <grove/JsonDataNode.h>
#include <sstream>
namespace aissia {
namespace celuna {
SchedulerModule::SchedulerModule() {
m_logger = spdlog::get("SchedulerModule");
@ -44,69 +45,43 @@ const grove::IDataNode& SchedulerModule::getConfiguration() {
}
void SchedulerModule::process(const grove::IDataNode& input) {
float currentTime = input.getDouble("gameTime", 0.0);
// Update last activity time
m_lastActivityTime = currentTime;
// Process incoming messages
m_lastActivityTime = input.getDouble("gameTime", 0.0);
processMessages();
// Convertir le temps en minutes pour les calculs
float sessionMinutes = (currentTime - m_sessionStartTime) / 60.0f;
// Verifier l'hyperfocus
checkHyperfocus(currentTime);
// Verifier les rappels de pause
checkBreakReminder(currentTime);
// Log periodique (toutes les 5 minutes simulees)
float sessionMinutes = (m_lastActivityTime - m_sessionStartTime) / 60.0f;
checkHyperfocus(m_lastActivityTime);
checkBreakReminder(m_lastActivityTime);
// Log periodique (toutes les 5 minutes)
static float lastLog = 0;
if (currentTime - lastLog > 300.0f) { // 300 secondes = 5 minutes
lastLog = currentTime;
m_logger->debug("Session: {:.1f}min, Focus aujourd'hui: {}min, Tache: {}",
sessionMinutes, m_totalFocusMinutesToday,
m_currentTaskId.empty() ? "(aucune)" : m_currentTaskId);
if (m_lastActivityTime - lastLog > 300.0f) {
lastLog = m_lastActivityTime;
m_logger->debug("Session: {:.1f}min, Focus: {}min, Tache: {}", sessionMinutes,
m_totalFocusMinutesToday, m_currentTaskId.empty() ? "(aucune)" : m_currentTaskId);
}
}
void SchedulerModule::processMessages() {
if (!m_io) return;
while (m_io->hasMessages() > 0) {
auto msg = m_io->pullMessage();
if (msg.topic == "user:task_switch" && msg.data) {
std::string taskId = msg.data->getString("taskId", "");
if (!taskId.empty()) {
startTask(taskId);
}
if (!taskId.empty()) startTask(taskId);
}
else if (msg.topic == "monitoring:idle_detected" && msg.data) {
// User went idle - pause tracking
else if (msg.topic == "monitoring:idle_detected" && msg.data)
m_logger->debug("User idle, pausing session tracking");
}
else if (msg.topic == "monitoring:activity_resumed" && msg.data) {
// User returned - resume tracking
else if (msg.topic == "monitoring:activity_resumed" && msg.data)
m_logger->debug("User active, resuming session tracking");
}
// Tool query handlers
else if (msg.topic == "scheduler:query" && msg.data) {
else if (msg.topic == "scheduler:query" && msg.data)
handleToolQuery(*msg.data);
}
else if (msg.topic == "scheduler:command" && msg.data) {
else if (msg.topic == "scheduler:command" && msg.data)
handleToolCommand(*msg.data);
}
}
}
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");
response->setString("correlation_id", correlationId);
response->setString("correlation_id", request.getString("correlation_id", ""));
std::string action = request.getString("action", "");
if (action == "get_current_task") {
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));
float sessionMinutes = m_currentTaskId.empty() ? 0 : (m_lastActivityTime - m_sessionStartTime) / 60.0f;
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") {
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) {
std::string correlationId = request.getString("correlation_id", "");
std::string action = request.getString("action", "");
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") {
std::string taskId = request.getString("task_id", "");
if (taskId.empty()) {
if (taskId.empty())
response->setString("error", "missing_task_id");
} else {
else {
startTask(taskId);
response->setBool("success", true);
response->setString("task_id", taskId);
@ -160,15 +142,11 @@ void SchedulerModule::handleToolCommand(const grove::IDataNode& request) {
}
else if (action == "complete_task") {
std::string taskId = request.getString("task_id", "");
if (taskId.empty()) {
// Complete current task
if (taskId.empty())
completeCurrentTask();
} else {
// Complete specific task
else {
Task* task = findTask(taskId);
if (task) {
task->completed = true;
}
if (task) task->completed = true;
}
response->setBool("success", true);
}
@ -177,34 +155,25 @@ void SchedulerModule::handleToolCommand(const grove::IDataNode& request) {
std::string reason = request.getString("reason", "break");
m_lastBreakTime = m_lastActivityTime;
m_logger->info("Pause demarree: {} minutes ({})", duration, reason);
// Publish break started event
auto event = std::make_unique<grove::JsonDataNode>("break");
event->setInt("duration", duration);
event->setString("reason", reason);
m_io->publish("scheduler:break_started", std::move(event));
response->setBool("success", true);
response->setInt("duration", duration);
}
else {
else
response->setString("error", "unknown_action");
}
m_io->publish("scheduler:response", std::move(response));
}
void SchedulerModule::checkHyperfocus(float currentTime) {
if (m_currentTaskId.empty()) return;
float sessionMinutes = (currentTime - m_sessionStartTime) / 60.0f;
if (sessionMinutes >= m_hyperfocusThresholdMinutes && !m_hyperfocusAlertSent) {
m_hyperfocusAlertSent = true;
m_logger->warn("HYPERFOCUS DETECTE! Session de {:.0f} minutes sur '{}'",
sessionMinutes, m_currentTaskId);
// Publish hyperfocus alert
m_logger->warn("HYPERFOCUS DETECTE! Session de {:.0f} minutes sur '{}'", sessionMinutes, m_currentTaskId);
if (m_io) {
auto event = std::make_unique<grove::JsonDataNode>("alert");
event->setString("type", "hyperfocus");
@ -217,12 +186,9 @@ void SchedulerModule::checkHyperfocus(float currentTime) {
void SchedulerModule::checkBreakReminder(float currentTime) {
float timeSinceBreak = (currentTime - m_lastBreakTime) / 60.0f;
if (timeSinceBreak >= m_breakReminderIntervalMinutes) {
m_lastBreakTime = currentTime;
m_logger->info("RAPPEL: Pause de {} minutes recommandee!", m_breakDurationMinutes);
// Publish break reminder
if (m_io) {
auto event = std::make_unique<grove::JsonDataNode>("reminder");
event->setString("type", "break");
@ -234,21 +200,12 @@ void SchedulerModule::checkBreakReminder(float currentTime) {
}
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_sessionStartTime = m_lastActivityTime;
m_hyperfocusAlertSent = false;
Task* task = findTask(taskId);
if (task) {
m_logger->info("Tache demarree: {} (estime: {}min)", task->name, task->estimatedMinutes);
}
// Publish task started
if (task) m_logger->info("Tache demarree: {} (estime: {}min)", task->name, task->estimatedMinutes);
if (m_io) {
auto event = std::make_unique<grove::JsonDataNode>("started");
event->setString("taskId", taskId);
@ -259,20 +216,14 @@ void SchedulerModule::startTask(const std::string& taskId) {
void SchedulerModule::completeCurrentTask() {
if (m_currentTaskId.empty()) return;
Task* task = findTask(m_currentTaskId);
float sessionMinutes = (m_lastActivityTime - m_sessionStartTime) / 60.0f;
if (task) {
task->actualMinutes = static_cast<int>(sessionMinutes);
task->completed = true;
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) {
auto event = std::make_unique<grove::JsonDataNode>("completed");
event->setString("taskId", m_currentTaskId);
@ -281,7 +232,6 @@ void SchedulerModule::completeCurrentTask() {
event->setBool("hyperfocus", m_hyperfocusAlertSent);
m_io->publish("scheduler:task_completed", std::move(event));
}
m_currentTaskId.clear();
}
@ -303,15 +253,12 @@ std::unique_ptr<grove::IDataNode> SchedulerModule::getHealthStatus() {
}
void SchedulerModule::shutdown() {
if (!m_currentTaskId.empty()) {
completeCurrentTask();
}
if (!m_currentTaskId.empty()) completeCurrentTask();
m_logger->info("SchedulerModule arrete. Focus total: {}min", m_totalFocusMinutesToday);
}
std::unique_ptr<grove::IDataNode> SchedulerModule::getState() {
auto state = std::make_unique<grove::JsonDataNode>("state");
state->setString("currentTaskId", m_currentTaskId);
state->setDouble("sessionStartTime", m_sessionStartTime);
state->setDouble("lastBreakTime", m_lastBreakTime);
@ -319,7 +266,6 @@ std::unique_ptr<grove::IDataNode> SchedulerModule::getState() {
state->setBool("hyperfocusAlertSent", m_hyperfocusAlertSent);
state->setInt("totalFocusMinutesToday", m_totalFocusMinutesToday);
state->setInt("taskCount", m_tasks.size());
m_logger->debug("Etat sauvegarde: {} taches, focus={}min", m_tasks.size(), m_totalFocusMinutesToday);
return state;
}
@ -331,19 +277,16 @@ void SchedulerModule::setState(const grove::IDataNode& state) {
m_lastActivityTime = state.getDouble("lastActivityTime", 0.0);
m_hyperfocusAlertSent = state.getBool("hyperfocusAlertSent", false);
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" {
grove::IModule* createModule() {
return new aissia::SchedulerModule();
return new celuna::SchedulerModule();
}
void destroyModule(grove::IModule* module) {

View File

@ -9,8 +9,11 @@
#include <string>
#include <vector>
#include <chrono>
#include <ctime>
#include <iomanip>
#include <sstream>
namespace aissia {
namespace celuna {
/**
* @brief Scheduler Module - Gestion du temps et détection d'hyperfocus
@ -93,7 +96,7 @@ private:
void handleToolCommand(const grove::IDataNode& request);
};
} // namespace aissia
} // namespace celuna
extern "C" {
grove::IModule* createModule();

View File

@ -1,8 +1,10 @@
#include "StorageModule.h"
#include <grove/IIO.h>
#include <grove/JsonDataNode.h>
#include <sstream>
#include <iomanip>
namespace aissia {
namespace celuna {
StorageModule::StorageModule() {
m_logger = spdlog::get("StorageModule");
@ -133,12 +135,14 @@ void StorageModule::handleToolCommand(const grove::IDataNode& request) {
if (content.empty()) {
response->setString("error", "missing_content");
} else {
// Create note in memory
Note note;
note.id = "note_" + std::to_string(m_notes.size());
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_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);
}
} // namespace aissia
} // namespace celuna
#ifndef AISSIA_TEST_BUILD
#ifndef CELUNA_TEST_BUILD
extern "C" {
grove::IModule* createModule() {
return new aissia::StorageModule();
return new celuna::StorageModule();
}
void destroyModule(grove::IModule* module) {

View File

@ -8,8 +8,10 @@
#include <memory>
#include <string>
#include <vector>
#include <chrono>
#include <ctime>
namespace aissia {
namespace celuna {
/**
* @brief Storage Module - Pure business logic for data persistence
@ -79,7 +81,7 @@ private:
void handleToolCommand(const grove::IDataNode& request);
};
} // namespace aissia
} // namespace celuna
extern "C" {
grove::IModule* createModule();

View File

@ -8,7 +8,7 @@
namespace fs = std::filesystem;
namespace aissia {
namespace celuna {
TestRunnerModule::TestRunnerModule() = default;
TestRunnerModule::~TestRunnerModule() = default;
@ -322,12 +322,12 @@ void TestRunnerModule::setState(const grove::IDataNode& state) {
m_executed = state.getBool("executed", false);
}
} // namespace aissia
} // namespace celuna
// Factory functions
extern "C" {
grove::IModule* createModule() {
return new aissia::TestRunnerModule();
return new celuna::TestRunnerModule();
}
void destroyModule(grove::IModule* module) {

View File

@ -9,7 +9,7 @@
#include <vector>
#include <memory>
namespace aissia {
namespace celuna {
/**
* @brief Orchestrator for integration tests
@ -76,4 +76,4 @@ private:
bool m_executed = false;
};
} // namespace aissia
} // namespace celuna

View File

@ -2,7 +2,7 @@
#include <grove/IIO.h>
#include <grove/JsonDataNode.h>
namespace aissia {
namespace celuna {
VoiceModule::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);
}
} // namespace aissia
} // namespace celuna
#ifndef AISSIA_TEST_BUILD
#ifndef CELUNA_TEST_BUILD
extern "C" {
grove::IModule* createModule() {
return new aissia::VoiceModule();
return new celuna::VoiceModule();
}
void destroyModule(grove::IModule* module) {

View File

@ -9,7 +9,7 @@
#include <string>
#include <queue>
namespace aissia {
namespace celuna {
/**
* @brief Voice Module - Voice interaction logic only
@ -77,7 +77,7 @@ private:
void handleToolCommand(const grove::IDataNode& request);
};
} // namespace aissia
} // namespace celuna
extern "C" {
grove::IModule* createModule();

View File

@ -5,7 +5,7 @@
#include <chrono>
#include <regex>
namespace aissia {
namespace celuna {
WebModule::WebModule() {
m_logger = spdlog::get("WebModule");
@ -221,12 +221,12 @@ void WebModule::setState(const grove::IDataNode& state) {
m_totalRequests, m_successfulRequests, m_failedRequests);
}
} // namespace aissia
} // namespace celuna
#ifndef AISSIA_TEST_BUILD
#ifndef CELUNA_TEST_BUILD
extern "C" {
grove::IModule* createModule() {
return new aissia::WebModule();
return new celuna::WebModule();
}
void destroyModule(grove::IModule* module) {

View File

@ -3,7 +3,7 @@
#include <memory>
#include <spdlog/spdlog.h>
namespace aissia {
namespace celuna {
/**
* @brief WebModule - Handles HTTP requests via IIO pub/sub
@ -59,4 +59,4 @@ private:
int m_failedRequests = 0;
};
} // namespace aissia
} // namespace celuna

View File

@ -5,7 +5,7 @@
#include <functional>
#include <memory>
namespace aissia {
namespace celuna {
enum class STTMode {
PASSIVE, // Keyword spotting (économe)
@ -100,4 +100,4 @@ public:
virtual std::string getCurrentEngine() const = 0;
};
} // namespace aissia
} // namespace celuna

View File

@ -3,7 +3,7 @@
#include <grove/IIO.h>
#include <string>
namespace aissia {
namespace celuna {
/**
* @brief Interface for infrastructure services
@ -36,4 +36,4 @@ public:
virtual bool isHealthy() const = 0;
};
} // namespace aissia
} // namespace celuna

View File

@ -4,7 +4,7 @@
#include <spdlog/sinks/stdout_color_sinks.h>
#include <fstream>
namespace aissia {
namespace celuna {
LLMService::LLMService() {
m_logger = spdlog::get("LLMService");
@ -372,4 +372,4 @@ LLMService::SyncResponse LLMService::sendMessageSync(
return syncResp;
}
} // namespace aissia
} // namespace celuna

View File

@ -19,7 +19,7 @@
#include <atomic>
#include <condition_variable>
namespace aissia {
namespace celuna {
/**
* @brief LLM Service - Async HTTP calls to LLM providers
@ -137,4 +137,4 @@ private:
void publishResponses();
};
} // namespace aissia
} // namespace celuna

View File

@ -2,7 +2,7 @@
#include <spdlog/sinks/stdout_color_sinks.h>
namespace aissia {
namespace celuna {
PlatformService::PlatformService() {
m_logger = spdlog::get("PlatformService");
@ -136,4 +136,4 @@ void PlatformService::shutdown() {
m_logger->info("PlatformService shutdown");
}
} // namespace aissia
} // namespace celuna

View File

@ -10,7 +10,7 @@
#include <memory>
#include <string>
namespace aissia {
namespace celuna {
/**
* @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);
};
} // namespace aissia
} // namespace celuna

View File

@ -12,7 +12,7 @@
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
namespace aissia {
namespace celuna {
STTService::STTService(const nlohmann::json& config)
: m_config(config)
@ -186,4 +186,4 @@ void STTService::loadEngines() {
}
}
} // namespace aissia
} // namespace celuna

View File

@ -7,7 +7,7 @@
#include <memory>
#include <string>
namespace aissia {
namespace celuna {
/**
* @brief STT Service implementation
@ -60,4 +60,4 @@ private:
void loadEngines();
};
} // namespace aissia
} // namespace celuna

View File

@ -7,7 +7,7 @@
namespace fs = std::filesystem;
namespace aissia {
namespace celuna {
StorageService::StorageService() {
m_logger = spdlog::get("StorageService");
@ -345,4 +345,4 @@ void StorageService::shutdown() {
m_logger->info("StorageService shutdown. Total queries: {}", m_totalQueries);
}
} // namespace aissia
} // namespace celuna

View File

@ -14,7 +14,7 @@
struct sqlite3;
struct sqlite3_stmt;
namespace aissia {
namespace celuna {
/**
* @brief Storage Service - SQLite persistence
@ -88,4 +88,4 @@ private:
void publishError(const std::string& message);
};
} // namespace aissia
} // namespace celuna

View File

@ -13,7 +13,7 @@
// Include spdlog after VoiceService.hpp
#include <spdlog/sinks/stdout_color_sinks.h>
namespace aissia {
namespace celuna {
VoiceService::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");
}
} // namespace aissia
} // namespace celuna

View File

@ -16,7 +16,7 @@
#include <string>
#include <queue>
namespace aissia {
namespace celuna {
/**
* @brief Voice Service - TTS and STT engines
@ -114,4 +114,4 @@ private:
void handleKeyword(const std::string& keyword);
};
} // namespace aissia
} // namespace celuna

View File

@ -11,7 +11,7 @@
#include <thread>
#include <atomic>
namespace aissia {
namespace celuna {
/**
* @brief Linux espeak-ng Text-to-Speech engine
@ -130,6 +130,6 @@ private:
}
};
} // namespace aissia
} // namespace celuna
#endif // __linux__

View File

@ -5,7 +5,7 @@
#include <vector>
#include <functional>
namespace aissia {
namespace celuna {
/**
* @brief Callback for transcription results (low-level engine)
@ -67,4 +67,4 @@ public:
const std::string& apiKey = "");
};
} // namespace aissia
} // namespace celuna

View File

@ -3,7 +3,7 @@
#include <string>
#include <memory>
namespace aissia {
namespace celuna {
/**
* @brief Interface for Text-to-Speech engines
@ -64,4 +64,4 @@ public:
static std::unique_ptr<ITTSEngine> create();
};
} // namespace aissia
} // namespace celuna

View File

@ -8,7 +8,7 @@
#include <pocketsphinx.h>
#endif
namespace aissia {
namespace celuna {
PocketSphinxEngine::PocketSphinxEngine(const std::string& modelPath,
const std::vector<std::string>& keywords)
@ -194,4 +194,4 @@ std::string PocketSphinxEngine::getEngineName() const {
return "pocketsphinx";
}
} // namespace aissia
} // namespace celuna

View File

@ -12,7 +12,7 @@ typedef struct ps_decoder_s ps_decoder_t;
struct cmd_ln_s;
typedef struct cmd_ln_s cmd_ln_t;
namespace aissia {
namespace celuna {
/**
* @brief CMU PocketSphinx Speech-to-Text engine
@ -77,4 +77,4 @@ private:
cmd_ln_t* m_config = nullptr;
};
} // namespace aissia
} // namespace celuna

View File

@ -9,7 +9,7 @@
#include <sphelper.h>
#include <memory>
namespace aissia {
namespace celuna {
/**
* @brief Windows SAPI Text-to-Speech engine
@ -112,6 +112,6 @@ private:
std::shared_ptr<spdlog::logger> m_logger;
};
} // namespace aissia
} // namespace celuna
#endif // _WIN32

View File

@ -6,7 +6,7 @@
#include <spdlog/spdlog.h>
#include <filesystem>
namespace aissia {
namespace celuna {
// Stub STT for when API key is not available
class StubSTTEngine : public ISTTEngine {
@ -117,4 +117,4 @@ std::unique_ptr<ISTTEngine> STTEngineFactory::create(
return std::make_unique<StubSTTEngine>();
}
} // namespace aissia
} // namespace celuna

View File

@ -8,7 +8,7 @@
#include "EspeakTTSEngine.hpp"
#endif
namespace aissia {
namespace celuna {
// Stub TTS for unsupported platforms
class StubTTSEngine : public ITTSEngine {
@ -48,4 +48,4 @@ std::unique_ptr<ITTSEngine> TTSEngineFactory::create() {
return std::make_unique<StubTTSEngine>();
}
} // namespace aissia
} // namespace celuna

View File

@ -11,7 +11,7 @@
#include <cstring>
#include <algorithm>
namespace aissia {
namespace celuna {
VoskSTTEngine::VoskSTTEngine(const std::string& modelPath, float sampleRate)
: m_sampleRate(sampleRate)
@ -249,4 +249,4 @@ bool VoskSTTEngine::readWavFile(const std::string& filePath, std::vector<float>&
return true;
}
} // namespace aissia
} // namespace celuna

View File

@ -13,7 +13,7 @@
struct VoskModel;
struct VoskRecognizer;
namespace aissia {
namespace celuna {
/**
* @brief Vosk Speech Recognition Engine
@ -74,4 +74,4 @@ private:
bool readWavFile(const std::string& filePath, std::vector<float>& outSamples);
};
} // namespace aissia
} // namespace celuna

View File

@ -6,7 +6,7 @@
#include <fstream>
#include <memory>
namespace aissia {
namespace celuna {
/**
* @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>
#endif
namespace aissia {
namespace celuna {
WhisperCppEngine::WhisperCppEngine(const std::string& modelPath)
: m_modelPath(modelPath)
@ -167,4 +167,4 @@ std::string WhisperCppEngine::getEngineName() const {
return "whisper-cpp";
}
} // namespace aissia
} // namespace celuna

View File

@ -10,7 +10,7 @@
struct whisper_context;
struct whisper_full_params;
namespace aissia {
namespace celuna {
/**
* @brief Whisper.cpp Speech-to-Text engine
@ -76,4 +76,4 @@ private:
whisper_context* m_ctx = nullptr;
};
} // namespace aissia
} // namespace celuna

View File

@ -17,7 +17,7 @@
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
namespace aissia {
namespace celuna {
using json = nlohmann::json;
@ -206,4 +206,4 @@ private:
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 <cstdlib>
namespace aissia {
namespace celuna {
ClaudeProvider::ClaudeProvider(const json& config) {
m_logger = spdlog::get("ClaudeProvider");
@ -178,4 +178,4 @@ json ClaudeProvider::buildAssistantContent(const LLMResponse& response) {
return content;
}
} // namespace aissia
} // namespace celuna

View File

@ -5,7 +5,7 @@
#include <spdlog/spdlog.h>
#include <memory>
namespace aissia {
namespace celuna {
/**
* @brief Anthropic Claude API provider
@ -50,4 +50,4 @@ private:
json buildAssistantContent(const LLMResponse& response);
};
} // namespace aissia
} // namespace celuna

View File

@ -5,7 +5,7 @@
#include <vector>
#include <memory>
namespace aissia {
namespace celuna {
using json = nlohmann::json;
@ -106,4 +106,4 @@ public:
virtual std::string getModel() const = 0;
};
} // namespace aissia
} // namespace celuna

View File

@ -4,7 +4,7 @@
#include <spdlog/spdlog.h>
#include <stdexcept>
namespace aissia {
namespace celuna {
std::unique_ptr<ILLMProvider> LLMProviderFactory::create(const nlohmann::json& config) {
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);
}
} // namespace aissia
} // namespace celuna

View File

@ -5,7 +5,7 @@
#include <memory>
#include <string>
namespace aissia {
namespace celuna {
/**
* @brief Factory for creating LLM providers
@ -53,4 +53,4 @@ public:
const nlohmann::json& providerConfig);
};
} // namespace aissia
} // namespace celuna

View File

@ -2,7 +2,7 @@
#include <spdlog/sinks/stdout_color_sinks.h>
#include <cstdlib>
namespace aissia {
namespace celuna {
OpenAIProvider::OpenAIProvider(const json& config) {
m_logger = spdlog::get("OpenAIProvider");
@ -198,4 +198,4 @@ void OpenAIProvider::appendAssistantMessage(json& messages, const LLMResponse& r
messages.push_back(assistantMsg);
}
} // namespace aissia
} // namespace celuna

View File

@ -5,7 +5,7 @@
#include <spdlog/spdlog.h>
#include <memory>
namespace aissia {
namespace celuna {
/**
* @brief OpenAI GPT API provider
@ -50,4 +50,4 @@ private:
json m_lastRawResponse;
};
} // namespace aissia
} // namespace celuna

View File

@ -1,7 +1,7 @@
#include "ToolRegistry.hpp"
#include <spdlog/spdlog.h>
namespace aissia {
namespace celuna {
void ToolRegistry::registerTool(const std::string& name,
const std::string& description,
@ -61,4 +61,4 @@ bool ToolRegistry::hasTool(const std::string& name) const {
return m_tools.find(name) != m_tools.end();
}
} // namespace aissia
} // namespace celuna

View File

@ -6,7 +6,7 @@
#include <functional>
#include <memory>
namespace aissia {
namespace celuna {
using json = nlohmann::json;
@ -85,4 +85,4 @@ private:
std::map<std::string, ToolDefinition> m_tools;
};
} // namespace aissia
} // namespace celuna

View File

@ -3,7 +3,7 @@
#include <fstream>
namespace aissia::mcp {
namespace celuna::mcp {
MCPClient::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 <string>
namespace aissia::mcp {
namespace celuna::mcp {
using json = nlohmann::json;
@ -107,4 +107,4 @@ private:
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 <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");
if (!m_logger) {
// 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());
}
} // namespace aissia::mcp
} // namespace celuna::mcp

View File

@ -11,7 +11,7 @@
#include <functional>
#include <string>
namespace aissia::mcp {
namespace celuna::mcp {
using json = nlohmann::json;
@ -31,7 +31,7 @@ using json = nlohmann::json;
*/
class MCPServer {
public:
explicit MCPServer(aissia::ToolRegistry& registry);
explicit MCPServer(celuna::ToolRegistry& registry);
~MCPServer();
// Server configuration
@ -66,7 +66,7 @@ private:
void sendNotification(const std::string& method, const json& params = json::object());
// State
aissia::ToolRegistry& m_registry;
celuna::ToolRegistry& m_registry;
std::atomic<bool> m_running{false};
bool m_initialized{false};
@ -82,4 +82,4 @@ private:
std::shared_ptr<spdlog::logger> m_logger;
};
} // namespace aissia::mcp
} // namespace celuna::mcp

View File

@ -5,7 +5,7 @@
#include <string>
#include <memory>
namespace aissia::mcp {
namespace celuna::mcp {
using json = nlohmann::json;
@ -48,4 +48,4 @@ public:
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 <optional>
namespace aissia::mcp {
namespace celuna::mcp {
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 <cstring>
namespace aissia::mcp {
namespace celuna::mcp {
StdioTransport::StdioTransport(const MCPServerConfig& config) : m_config(config) {
m_logger = spdlog::get("MCP:" + config.name);
@ -423,4 +423,4 @@ std::string StdioTransport::readLine() {
return line;
}
} // namespace aissia::mcp
} // namespace celuna::mcp

View File

@ -18,7 +18,7 @@
#include <signal.h>
#endif
namespace aissia::mcp {
namespace celuna::mcp {
/**
* @brief Stdio transport for MCP servers
@ -77,4 +77,4 @@ private:
void handleMessage(const json& message);
};
} // namespace aissia::mcp
} // namespace celuna::mcp

View File

@ -3,7 +3,7 @@
#include <string>
#include <memory>
namespace aissia {
namespace celuna {
/**
* @brief Interface for window tracking across platforms
@ -63,4 +63,4 @@ public:
static std::unique_ptr<IWindowTracker> create();
};
} // namespace aissia
} // namespace celuna

View File

@ -7,7 +7,7 @@
#include <Psapi.h>
#include <string>
namespace aissia {
namespace celuna {
/**
* @brief Windows implementation of window tracking
@ -85,6 +85,6 @@ public:
}
};
} // namespace aissia
} // namespace celuna
#endif // _WIN32

View File

@ -8,7 +8,7 @@
#include "X11WindowTracker.hpp"
#endif
namespace aissia {
namespace celuna {
// Stub implementation for unsupported platforms
class StubWindowTracker : public IWindowTracker {
@ -45,4 +45,4 @@ std::unique_ptr<IWindowTracker> WindowTrackerFactory::create() {
return std::make_unique<StubWindowTracker>();
}
} // namespace aissia
} // namespace celuna

View File

@ -10,7 +10,7 @@
#include <fstream>
#include <chrono>
namespace aissia {
namespace celuna {
/**
* @brief Linux X11 implementation of window tracking
@ -119,6 +119,6 @@ private:
}
};
} // namespace aissia
} // namespace celuna
#endif // __linux__

View File

@ -4,7 +4,7 @@
#include <string>
#include <nlohmann/json.hpp>
namespace aissia::testing {
namespace celuna::testing {
/**
* @brief Result of a test execution
@ -45,4 +45,4 @@ public:
virtual std::string getDescription() const = 0;
};
} // namespace aissia::testing
} // namespace celuna::testing

View File

@ -8,7 +8,7 @@
namespace fs = std::filesystem;
namespace aissia::tools {
namespace celuna::tools {
// Static configuration defaults
std::vector<std::string> FileSystemTools::s_allowedPaths = {};
@ -592,4 +592,4 @@ json FileSystemTools::makeSuccess(const json& content) {
return result;
}
} // namespace aissia::tools
} // namespace celuna::tools

View File

@ -5,7 +5,7 @@
#include <vector>
#include <optional>
namespace aissia::tools {
namespace celuna::tools {
using json = nlohmann::json;
@ -71,4 +71,4 @@ private:
static size_t s_maxWriteSize;
};
} // namespace aissia::tools
} // namespace celuna::tools

View File

@ -13,7 +13,7 @@
#include <atomic>
#include <unordered_map>
namespace aissia {
namespace celuna {
using json = nlohmann::json;
@ -184,4 +184,4 @@ private:
}
};
} // namespace aissia
} // namespace celuna

View File

@ -1,7 +1,7 @@
#include "InternalTools.hpp"
#include <spdlog/sinks/stdout_color_sinks.h>
namespace aissia {
namespace celuna {
InternalTools::InternalTools(grove::IIO* io) : m_io(io) {
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 <memory>
namespace aissia {
namespace celuna {
using json = nlohmann::json;
@ -67,4 +67,4 @@ private:
void registerTools();
};
} // namespace aissia
} // namespace celuna

Some files were not shown because too many files have changed in this diff Show More