fleetbo-cockpit-cli 1.0.37 → 1.0.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli.js +28 -16
- package/package.json +1 -1
package/cli.js
CHANGED
|
@@ -462,41 +462,53 @@ if (command === 'alex') {
|
|
|
462
462
|
// --- LOGIQUE DE BUFFER MULTILIGNE ---
|
|
463
463
|
let inputBuffer = ""; // La "salle d'attente" du texte
|
|
464
464
|
|
|
465
|
+
let isProcessing = false;
|
|
466
|
+
let pasteDebounceTimer = null;
|
|
467
|
+
|
|
465
468
|
rl.on('line', async (line) => {
|
|
469
|
+
if (isProcessing) return; // Blocage de sécurité pendant qu'Alex forge
|
|
470
|
+
|
|
466
471
|
const trimmedLine = line.trim();
|
|
467
472
|
|
|
468
|
-
// 1.
|
|
473
|
+
// 1. EXIT COMMANDS
|
|
469
474
|
if (['exit', 'quit'].includes(trimmedLine.toLowerCase())) {
|
|
470
475
|
console.log('\n\x1b[90m Alex session closed.\x1b[0m');
|
|
471
476
|
rl.close();
|
|
472
477
|
return;
|
|
473
478
|
}
|
|
474
479
|
|
|
475
|
-
// 2. ACCUMULATION
|
|
480
|
+
// 2. ACCUMULATION
|
|
476
481
|
if (trimmedLine !== "") {
|
|
477
|
-
// Si la ligne contient du texte, on l'ajoute au buffer
|
|
478
482
|
inputBuffer += (inputBuffer ? "\n" : "") + line;
|
|
479
|
-
|
|
480
|
-
// On change le prompt visuel pour montrer qu'on attend la suite (ligne suivante)
|
|
481
483
|
rl.setPrompt(`\x1b[34m > \x1b[0m`);
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
// 3. SMART DETECTION (PASTE vs ENTER)
|
|
487
|
+
// On annule le timer précédent si une nouvelle ligne arrive trop vite (< 50ms)
|
|
488
|
+
if (pasteDebounceTimer) clearTimeout(pasteDebounceTimer);
|
|
489
|
+
|
|
490
|
+
pasteDebounceTimer = setTimeout(async () => {
|
|
491
|
+
// On ne déclenche la forge QUE si :
|
|
492
|
+
// - La dernière touche pressée était "Entrée" sur une ligne VIDE
|
|
493
|
+
// - ET que le buffer n'est pas vide
|
|
494
|
+
if (trimmedLine === "" && inputBuffer.trim() !== "") {
|
|
486
495
|
const finalPrompt = inputBuffer.trim();
|
|
487
|
-
inputBuffer = ""; // Reset
|
|
496
|
+
inputBuffer = ""; // Reset immédiat
|
|
488
497
|
|
|
489
|
-
// Remise à zéro du prompt visuel d'origine
|
|
490
498
|
rl.setPrompt(`\x1b[34m${dynamicUsername} ❯ \x1b[0m`);
|
|
491
499
|
|
|
492
|
-
|
|
500
|
+
isProcessing = true; // Verrouille l'entrée
|
|
493
501
|
await processAlexRequest(finalPrompt);
|
|
502
|
+
isProcessing = false; // Libère l'entrée
|
|
503
|
+
|
|
494
504
|
console.log('');
|
|
495
505
|
}
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
506
|
+
|
|
507
|
+
// Rafraîchissement visuel du prompt
|
|
508
|
+
process.stdout.write('\n\x1b[F');
|
|
509
|
+
rl.prompt();
|
|
510
|
+
|
|
511
|
+
}, 50); // Pause de 50ms pour absorber les "Coller" massifs
|
|
500
512
|
});
|
|
501
513
|
};
|
|
502
514
|
|