Compare commits

...

2 Commits

Author SHA1 Message Date
Network Monitor Bot
865d0d3a48 🚀 Fix: Résolution critique du flux d'authentification - NeuraTerm v2.0 opérationnel
Corrections majeures pour permettre le démarrage complet de l'application:

• AUTHENTIFICATION: Suppression du process.exit(1) bloquant dans keyManager
• DÉMARRAGE: Gestion gracieuse de l'absence de clés API au lancement
• UX: Messages informatifs non-bloquants pour guider l'utilisateur
• SÉCURITÉ: Protection des fonctions IA sans clés avec messages appropriés
• INTERFACE: Aide complète intégrée dans ModernInterface

 NeuraTerm v2.0 démarre maintenant parfaitement avec architecture C4
 Boucle de commandes interactive fonctionnelle
 Mode limité disponible sans clés, configuration possible via 'setup'
 Toutes les fonctionnalités accessibles une fois les clés configurées

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-20 07:19:55 +02:00
Network Monitor Bot
f248062ef1 🔧 Fix: Correction de compatibilité configuration et interface
- Ajout de compatibilité ancienne structure config.ai
- Support des deux types d'interface (Terminal et ModernInterface)
- Helper displayMessage pour unifier l'affichage
- Correction des types de configuration NeuraConfig
- Fix initialisation IA avec nouvelle config unifiée

NeuraTerm v2.0 se lance maintenant correctement avec la nouvelle architecture !
2025-08-20 07:08:10 +02:00
6 changed files with 149 additions and 21 deletions

View File

@ -9,23 +9,24 @@ export async function initAI(config: any, auth: any): Promise<AIClient> {
const keyManager = auth.getKeyManager(); const keyManager = auth.getKeyManager();
const keys = keyManager.loadKeys(); const keys = keyManager.loadKeys();
// Utiliser la configuration unifiée pour les modèles
const providerConfig: ProviderConfig = { const providerConfig: ProviderConfig = {
openai: { openai: {
apiKey: keys.openai || '', apiKey: keys.openai || '',
model: config.ai.openai?.model || 'gpt-4o-mini', model: config.providers?.openai?.model || 'gpt-4o-mini',
baseUrl: config.ai.openai?.baseUrl baseUrl: config.providers?.openai?.base_url
}, },
mistral: { mistral: {
apiKey: keys.mistral || '', apiKey: keys.mistral || '',
model: config.ai.mistral?.model || 'mistral-large-latest', model: config.providers?.mistral?.model || 'mistral-large-latest',
baseUrl: config.ai.mistral?.baseUrl baseUrl: config.providers?.mistral?.base_url
}, },
defaultProvider: keys.openai ? 'openai' : 'mistral' defaultProvider: keys.openai ? 'openai' : 'mistral'
}; };
// Ajuster le provider par défaut selon les clés disponibles // Ajuster le provider par défaut selon la config et les clés disponibles
if (config.ai.defaultProvider && keys[config.ai.defaultProvider as keyof typeof keys]) { if (config.providers?.default && keys[config.providers.default as keyof typeof keys]) {
providerConfig.defaultProvider = config.ai.defaultProvider; providerConfig.defaultProvider = config.providers.default;
} }
return new AIClient(providerConfig); return new AIClient(providerConfig);

View File

@ -29,10 +29,8 @@ export class AuthManager {
export async function initAuthentication(config: any): Promise<AuthManager> { export async function initAuthentication(config: any): Promise<AuthManager> {
const authManager = new AuthManager(config); const authManager = new AuthManager(config);
// Vérifier les clés au démarrage // Ne pas forcer l'authentification au démarrage
if (!authManager.isAuthenticated()) { // L'utilisateur peut configurer les clés plus tard avec "setup"
await authManager.authenticate();
}
return authManager; return authManager;
} }

View File

@ -143,11 +143,16 @@ export class KeyManager {
// Vérifier qu'au moins une clé est disponible // Vérifier qu'au moins une clé est disponible
if (!keys.openai && !keys.mistral) { if (!keys.openai && !keys.mistral) {
console.log('\n❌ Erreur: Au moins une clé API est requise pour utiliser NeuraTerm.'); console.log('\n⚠ Aucune clé API configurée.');
console.log('Vous pouvez aussi définir les variables d\'environnement:'); console.log('NeuraTerm fonctionnera en mode limité.');
console.log(' export OPENAI_API_KEY="votre_clé"'); console.log('\nVous pouvez configurer les clés plus tard avec:');
console.log(' export MISTRAL_API_KEY="votre_clé"'); console.log(' - key set openai');
process.exit(1); console.log(' - key set mistral');
console.log('Ou définir les variables d\'environnement:');
console.log(' - export OPENAI_API_KEY="votre_clé"');
console.log(' - export MISTRAL_API_KEY="votre_clé"');
console.log('\n💡 Tapez "setup" pour configurer les clés maintenant.');
return keys; // Retourner les clés vides au lieu de quitter
} }
// Sauvegarder les nouvelles clés // Sauvegarder les nouvelles clés

View File

@ -15,23 +15,31 @@ export class CommandProcessor {
constructor( constructor(
private config: any, private config: any,
private dependencies: { private dependencies: {
terminal: Terminal; terminal: any; // Peut être Terminal ou ModernInterface
auth: any; auth: any;
ai: AIClient; ai: AIClient;
codebase: any; codebase: any;
fileOps: any; fileOps: any;
execution: any; execution: any;
errors: any; errors: any;
engine?: any;
memory?: any;
identity?: any;
} }
) { ) {
this.taskPlanner = new TaskPlanner( this.taskPlanner = new TaskPlanner(
this.dependencies.ai, this.dependencies.ai,
this.dependencies.execution.getCommandExecutor() this.dependencies.execution.getCommandExecutor()
); );
// Utiliser le prompt de la nouvelle interface si disponible
const prompt = this.dependencies.terminal.getPrompt ?
this.dependencies.terminal.getPrompt() :
'🧠 NeuraTerm> ';
this.rl = readline.createInterface({ this.rl = readline.createInterface({
input: process.stdin, input: process.stdin,
output: process.stdout, output: process.stdout,
prompt: '🧠 NeuraTerm> ' prompt
}); });
} }
@ -49,7 +57,12 @@ export class CommandProcessor {
try { try {
await this.processCommand(command); await this.processCommand(command);
} catch (error) { } catch (error) {
// Support des deux types d'interface
if (this.dependencies.terminal.displayError) {
this.dependencies.terminal.displayError(error instanceof Error ? error.message : String(error)); this.dependencies.terminal.displayError(error instanceof Error ? error.message : String(error));
} else {
console.error(`❌ Erreur: ${error instanceof Error ? error.message : String(error)}`);
}
logger.error('Erreur lors du traitement de la commande:', error); logger.error('Erreur lors du traitement de la commande:', error);
} }
@ -62,6 +75,44 @@ export class CommandProcessor {
}); });
} }
/**
* Helper pour supporter les deux types d'interface
*/
private displayMessage(type: 'error' | 'success' | 'info' | 'warning', message: string): void {
const terminal = this.dependencies.terminal;
switch (type) {
case 'error':
if (terminal.displayError) {
terminal.displayError(message);
} else {
console.error(`❌ Erreur: ${message}`);
}
break;
case 'success':
if (terminal.displaySuccess) {
terminal.displaySuccess(message);
} else {
console.log(`${message}`);
}
break;
case 'info':
if (terminal.displayInfo) {
terminal.displayInfo(message);
} else {
console.log(`💡 ${message}`);
}
break;
case 'warning':
if (terminal.displayWarning) {
terminal.displayWarning(message);
} else {
console.log(`⚠️ ${message}`);
}
break;
}
}
private async processCommand(command: string): Promise<void> { private async processCommand(command: string): Promise<void> {
const [cmd, ...args] = command.split(' '); const [cmd, ...args] = command.split(' ');
@ -322,6 +373,13 @@ export class CommandProcessor {
return; return;
} }
// Vérifier si les clés API sont disponibles
if (!this.dependencies.auth.isAuthenticated()) {
console.log('\n⚠ Planification IA non disponible - Aucune clé API configurée');
console.log('💡 Tapez "setup" pour configurer vos clés API');
return;
}
try { try {
console.log('\n📋 Création du plan d\'action...'); console.log('\n📋 Création du plan d\'action...');
const plan = await this.taskPlanner.createPlan(request); const plan = await this.taskPlanner.createPlan(request);
@ -394,6 +452,13 @@ export class CommandProcessor {
} }
private async handleSmartQuery(query: string): Promise<void> { private async handleSmartQuery(query: string): Promise<void> {
// Vérifier si les clés API sont disponibles
if (!this.dependencies.auth.isAuthenticated()) {
console.log('\n⚠ Fonctionnalités IA non disponibles - Aucune clé API configurée');
console.log('💡 Tapez "setup" pour configurer vos clés API');
return;
}
try { try {
// Déterminer si la demande nécessite des commandes système // Déterminer si la demande nécessite des commandes système
const analysisPrompt = ` const analysisPrompt = `

View File

@ -129,9 +129,12 @@ export async function run(app: AppInstance): Promise<void> {
// Présentation de l'identité NeuraTerm // Présentation de l'identité NeuraTerm
console.log(app.identity.generateIntroduction()); console.log(app.identity.generateIntroduction());
// Authentification si nécessaire // Vérification des clés API sans bloquer
if (!app.auth.isAuthenticated()) { if (!app.auth.isAuthenticated()) {
await app.auth.authenticate(); console.log('\n⚠ Aucune clé API configurée - Fonctionnement en mode limité');
console.log('💡 Tapez "setup" pour configurer vos clés API ou "help" pour voir les commandes disponibles');
} else {
console.log('\n✅ Clés API configurées - Toutes les fonctionnalités disponibles');
} }
// Enregistrer le démarrage en mémoire // Enregistrer le démarrage en mémoire

View File

@ -398,6 +398,62 @@ ${this.theme.muted('Tapez')} ${this.theme.primary('help')} ${this.theme.muted('p
return truncated + this.theme.muted('... (tronqué)'); return truncated + this.theme.muted('... (tronqué)');
} }
/**
* Afficher l'aide des commandes
*/
displayHelp(): void {
console.log(`\n${this.theme.primary('📚 Aide NeuraTerm v2.0.0')}`);
console.log(this.theme.primary('─'.repeat(50)));
console.log(`\n${this.theme.info('🔧 Commandes système:')}`);
console.log(` ${this.theme.accent('help')} - Afficher cette aide`);
console.log(` ${this.theme.accent('clear')} - Effacer l'écran`);
console.log(` ${this.theme.accent('exit/quit')} - Quitter NeuraTerm`);
console.log(` ${this.theme.accent('config')} - Afficher la configuration`);
console.log(`\n${this.theme.info('🔑 Gestion des clés API:')}`);
console.log(` ${this.theme.accent('setup')} - Configuration interactive des clés`);
console.log(` ${this.theme.accent('keys')} - Statut des clés API`);
console.log(` ${this.theme.accent('key set <provider>')} - Configurer une clé (openai/mistral)`);
console.log(` ${this.theme.accent('key status')} - Afficher le statut des clés`);
console.log(`\n${this.theme.info('🤖 Providers IA:')}`);
console.log(` ${this.theme.accent('providers')} - Lister les providers disponibles`);
console.log(` ${this.theme.accent('provider <nom>')} - Changer de provider`);
console.log(` ${this.theme.accent('stats [provider]')} - Statistiques d'utilisation`);
console.log(` ${this.theme.accent('cost')} - Coût total`);
console.log(`\n${this.theme.info('🛠️ Exécution et planification:')}`);
console.log(` ${this.theme.accent('exec <commande>')} - Exécuter une commande système`);
console.log(` ${this.theme.accent('plan <demande>')} - Créer un plan d'action`);
console.log(` ${this.theme.accent('run')} - Exécuter le plan actuel`);
console.log(` ${this.theme.accent('cancel')} - Annuler le plan actuel`);
console.log(`\n${this.theme.info('🧠 Mode IA intelligent:')}`);
console.log(` ${this.theme.muted('Tapez simplement votre demande pour une analyse automatique')}`);
console.log(` ${this.theme.muted('NeuraTerm déterminera s\'il faut exécuter des commandes')}`);
console.log(`\n${this.theme.muted('💡 Astuce: Les commandes précédées de')} ${this.theme.primary('@neura')} ${this.theme.muted('activent le mode IA')}`);
}
/**
* Afficher un message de bienvenue
*/
displayWelcome(): void {
this.displayBanner();
}
/**
* Afficher le contenu d'une réponse (pour compatibilité)
*/
displayResponse(response: any): void {
this.displayAIResponse(response, {
showProvider: true,
showTokens: true,
showCost: true
});
}
/** /**
* Effacer l'écran avec style * Effacer l'écran avec style
*/ */