fleetbo-cockpit-cli 1.0.141 → 1.0.143
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 +41 -37
- package/package.json +1 -1
package/cli.js
CHANGED
|
@@ -639,12 +639,11 @@ if (command === 'alex') {
|
|
|
639
639
|
process.stdout.write('\n\x1b[F');
|
|
640
640
|
rl.prompt();
|
|
641
641
|
|
|
642
|
-
let inputBuffer =
|
|
642
|
+
let inputBuffer = []; // 👈 C'est devenu un Tableau (Array) !
|
|
643
643
|
let isProcessing = false;
|
|
644
|
-
let
|
|
645
|
-
let
|
|
644
|
+
let burstTimer = null;
|
|
645
|
+
let isPastingMode = false;
|
|
646
646
|
|
|
647
|
-
// Fonction d'exécution isolée pour plus de propreté
|
|
648
647
|
const executePrompt = async (text) => {
|
|
649
648
|
if (['exit', 'quit'].includes(text.toLowerCase())) {
|
|
650
649
|
console.log('\n\x1b[90m Alex session closed.\x1b[0m');
|
|
@@ -671,48 +670,53 @@ if (command === 'alex') {
|
|
|
671
670
|
}
|
|
672
671
|
};
|
|
673
672
|
|
|
674
|
-
rl.on('line',
|
|
673
|
+
rl.on('line', (line) => {
|
|
675
674
|
if (isProcessing) return;
|
|
676
675
|
|
|
677
|
-
// 1.
|
|
678
|
-
if (
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
676
|
+
// 1. SI ON EST DÉJÀ EN MODE "MANUEL" (Suite à un collage)
|
|
677
|
+
if (isPastingMode) {
|
|
678
|
+
if (line.trim() === "") {
|
|
679
|
+
// Le pilote a fait "Entrée" à vide pour valider
|
|
680
|
+
const finalPrompt = inputBuffer.join('\n').trim();
|
|
681
|
+
inputBuffer = []; // On vide le panier
|
|
682
|
+
isPastingMode = false;
|
|
683
|
+
executePrompt(finalPrompt);
|
|
684
|
+
} else {
|
|
685
|
+
// Le pilote continue d'écrire en dessous de son collage
|
|
686
|
+
inputBuffer.push(line);
|
|
687
|
+
}
|
|
683
688
|
return;
|
|
684
689
|
}
|
|
685
690
|
|
|
686
|
-
// 2.
|
|
687
|
-
inputBuffer
|
|
691
|
+
// 2. ACCUMULATION (Frappe ou Collage)
|
|
692
|
+
inputBuffer.push(line);
|
|
688
693
|
|
|
689
|
-
//
|
|
690
|
-
if (
|
|
694
|
+
// On annule le timer à chaque nouvelle ligne entrante
|
|
695
|
+
if (burstTimer) clearTimeout(burstTimer);
|
|
691
696
|
|
|
692
|
-
//
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
submitTimeout = null;
|
|
696
|
-
isPasting = true; // 🚨 L'IA comprend que tu colles et passe en mode Manuel
|
|
697
|
-
return;
|
|
698
|
-
}
|
|
697
|
+
// 3. ANALYSE DU PANIER (30ms après la dernière ligne reçue)
|
|
698
|
+
burstTimer = setTimeout(() => {
|
|
699
|
+
burstTimer = null;
|
|
699
700
|
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
701
|
+
if (inputBuffer.length === 1) {
|
|
702
|
+
// 👉 CAS A : Le panier ne contient qu'UNE SEULE ligne.
|
|
703
|
+
// C'est un humain qui a tapé une phrase et appuyé sur Entrée.
|
|
704
|
+
const finalPrompt = inputBuffer[0].trim();
|
|
705
|
+
inputBuffer = []; // On vide le panier
|
|
706
|
+
|
|
707
|
+
if (finalPrompt === "") {
|
|
708
|
+
rl.prompt(); // Entrée dans le vide
|
|
709
|
+
} else {
|
|
710
|
+
executePrompt(finalPrompt); // Envoi direct !
|
|
711
|
+
}
|
|
712
|
+
} else {
|
|
713
|
+
// 👉 CAS B : Le panier contient PLUSIEURS lignes d'un coup.
|
|
714
|
+
// C'est mathématiquement un copier-coller (même avec des sauts de lignes dedans).
|
|
715
|
+
isPastingMode = true;
|
|
716
|
+
// On ajoute un petit indicateur visuel ultra-propre pour te prévenir
|
|
717
|
+
console.log('\x1b[90m [Copier-coller détecté. Appuyez sur Entrée (ligne vide) pour valider]\x1b[0m');
|
|
718
|
+
rl.prompt();
|
|
710
719
|
}
|
|
711
|
-
|
|
712
|
-
// Envoi direct ! (Car c'est bien une frappe humaine unique)
|
|
713
|
-
const finalPrompt = inputBuffer.trim();
|
|
714
|
-
inputBuffer = "";
|
|
715
|
-
await executePrompt(finalPrompt);
|
|
716
720
|
}, 30);
|
|
717
721
|
});
|
|
718
722
|
};
|