Compare commits

..

No commits in common. "865d0d3a48b300b6fc9fe202b7399e789ee68200" and "776bb44120be36113144b78b13a364416a1284cc" have entirely different histories.

6 changed files with 21 additions and 149 deletions

View File

@ -9,24 +9,23 @@ 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.providers?.openai?.model || 'gpt-4o-mini', model: config.ai.openai?.model || 'gpt-4o-mini',
baseUrl: config.providers?.openai?.base_url baseUrl: config.ai.openai?.baseUrl
}, },
mistral: { mistral: {
apiKey: keys.mistral || '', apiKey: keys.mistral || '',
model: config.providers?.mistral?.model || 'mistral-large-latest', model: config.ai.mistral?.model || 'mistral-large-latest',
baseUrl: config.providers?.mistral?.base_url baseUrl: config.ai.mistral?.baseUrl
}, },
defaultProvider: keys.openai ? 'openai' : 'mistral' defaultProvider: keys.openai ? 'openai' : 'mistral'
}; };
// Ajuster le provider par défaut selon la config et les clés disponibles // Ajuster le provider par défaut selon les clés disponibles
if (config.providers?.default && keys[config.providers.default as keyof typeof keys]) { if (config.ai.defaultProvider && keys[config.ai.defaultProvider as keyof typeof keys]) {
providerConfig.defaultProvider = config.providers.default; providerConfig.defaultProvider = config.ai.defaultProvider;
} }
return new AIClient(providerConfig); return new AIClient(providerConfig);

View File

@ -29,8 +29,10 @@ 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);
// Ne pas forcer l'authentification au démarrage // Vérifier les clés au démarrage
// L'utilisateur peut configurer les clés plus tard avec "setup" if (!authManager.isAuthenticated()) {
await authManager.authenticate();
}
return authManager; return authManager;
} }

View File

@ -143,16 +143,11 @@ 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⚠ Aucune clé API configurée.'); console.log('\n❌ Erreur: Au moins une clé API est requise pour utiliser NeuraTerm.');
console.log('NeuraTerm fonctionnera en mode limité.'); console.log('Vous pouvez aussi définir les variables d\'environnement:');
console.log('\nVous pouvez configurer les clés plus tard avec:'); console.log(' export OPENAI_API_KEY="votre_clé"');
console.log(' - key set openai'); console.log(' export MISTRAL_API_KEY="votre_clé"');
console.log(' - key set mistral'); process.exit(1);
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,31 +15,23 @@ export class CommandProcessor {
constructor( constructor(
private config: any, private config: any,
private dependencies: { private dependencies: {
terminal: any; // Peut être Terminal ou ModernInterface terminal: Terminal;
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 prompt: '🧠 NeuraTerm> '
}); });
} }
@ -57,12 +49,7 @@ export class CommandProcessor {
try { try {
await this.processCommand(command); await this.processCommand(command);
} catch (error) { } catch (error) {
// Support des deux types d'interface this.dependencies.terminal.displayError(error instanceof Error ? error.message : String(error));
if (this.dependencies.terminal.displayError) {
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);
} }
@ -75,44 +62,6 @@ 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(' ');
@ -373,13 +322,6 @@ 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);
@ -452,13 +394,6 @@ 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,12 +129,9 @@ 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());
// Vérification des clés API sans bloquer // Authentification si nécessaire
if (!app.auth.isAuthenticated()) { if (!app.auth.isAuthenticated()) {
console.log('\n⚠ Aucune clé API configurée - Fonctionnement en mode limité'); await app.auth.authenticate();
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,62 +398,6 @@ ${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
*/ */