fleetbo-cockpit-cli 1.0.109 → 1.0.110
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 +47 -39
- package/package.json +1 -1
package/cli.js
CHANGED
|
@@ -12,7 +12,7 @@ const axios = require('axios');
|
|
|
12
12
|
const dotenv = require('dotenv');
|
|
13
13
|
const os = require('os');
|
|
14
14
|
const archiver = require('archiver');
|
|
15
|
-
|
|
15
|
+
const readline = require('readline');
|
|
16
16
|
|
|
17
17
|
// ============================================
|
|
18
18
|
// FLEETBO CLI - Centralized Package
|
|
@@ -629,53 +629,61 @@ if (command === 'alex') {
|
|
|
629
629
|
console.log('');
|
|
630
630
|
console.log(' \x1b[32m Alex ❯\x1b[0m Describe your feature.');
|
|
631
631
|
console.log('');
|
|
632
|
-
|
|
633
|
-
// ── Boucle interactive avec @inquirer/prompts ──
|
|
634
|
-
// Soumet sur une seule Entrée, gère le paste multi-lignes correctement,
|
|
635
|
-
// curseur clignotant natif du terminal.
|
|
636
|
-
const { input } = await import('@inquirer/prompts');
|
|
637
632
|
|
|
633
|
+
const rl = readline.createInterface({
|
|
634
|
+
input: process.stdin,
|
|
635
|
+
output: process.stdout,
|
|
636
|
+
prompt: `\x1b[34m${dynamicUsername} ❯ \x1b[0m`
|
|
637
|
+
});
|
|
638
|
+
|
|
639
|
+
process.stdout.write('\x1b[F');
|
|
640
|
+
rl.prompt();
|
|
641
|
+
|
|
642
|
+
let inputBuffer = "";
|
|
638
643
|
let isProcessing = false;
|
|
639
644
|
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
answer = await input({
|
|
645
|
-
message: `\x1b[34m${dynamicUsername} ❯\x1b[0m`,
|
|
646
|
-
theme: {
|
|
647
|
-
prefix: '',
|
|
648
|
-
style: { answer: (t) => `\x1b[0m${t}` }
|
|
649
|
-
}
|
|
650
|
-
});
|
|
651
|
-
} catch (e) {
|
|
652
|
-
// Ctrl+C ou Ctrl+D
|
|
653
|
-
console.log('\n\x1b[90m Alex session closed.\x1b[0m');
|
|
654
|
-
process.exit(0);
|
|
655
|
-
}
|
|
645
|
+
rl.on('line', async (line) => {
|
|
646
|
+
if (isProcessing) return;
|
|
647
|
+
|
|
648
|
+
const trimmedLine = line.trim();
|
|
656
649
|
|
|
657
|
-
|
|
650
|
+
if (['exit', 'quit'].includes(trimmedLine.toLowerCase())) {
|
|
651
|
+
console.log('\n\x1b[90m Alex session closed.\x1b[0m');
|
|
652
|
+
rl.close();
|
|
653
|
+
return;
|
|
654
|
+
}
|
|
658
655
|
|
|
659
|
-
|
|
656
|
+
if (trimmedLine !== "") {
|
|
657
|
+
// Accumule + invite à confirmer
|
|
658
|
+
inputBuffer += (inputBuffer ? "\n" : "") + line;
|
|
659
|
+
rl.setPrompt(" \x1b[90m↵ to confirm · type more to add lines\x1b[0m\n ");
|
|
660
|
+
rl.prompt();
|
|
661
|
+
} else {
|
|
662
|
+
if (inputBuffer.trim() !== "") {
|
|
663
|
+
const finalPrompt = inputBuffer.trim();
|
|
664
|
+
inputBuffer = "";
|
|
665
|
+
|
|
666
|
+
if (finalPrompt.length > 1000) {
|
|
667
|
+
console.log(`\n\x1b[31m⛔ [Alex Safety] Mission rejected: Excessive size (${finalPrompt.length}/1000 characters).\x1b[0m`);
|
|
668
|
+
rl.setPrompt(`\x1b[34m${dynamicUsername} ❯ \x1b[0m`);
|
|
669
|
+
rl.prompt();
|
|
670
|
+
return;
|
|
671
|
+
}
|
|
660
672
|
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
673
|
+
isProcessing = true;
|
|
674
|
+
rl.setPrompt("");
|
|
675
|
+
await processAlexRequest(finalPrompt);
|
|
676
|
+
isProcessing = false;
|
|
665
677
|
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
678
|
+
console.log('');
|
|
679
|
+
rl.setPrompt(`\x1b[34m${dynamicUsername} ❯ \x1b[0m`);
|
|
680
|
+
rl.prompt();
|
|
681
|
+
} else {
|
|
682
|
+
rl.setPrompt(`\x1b[34m${dynamicUsername} ❯ \x1b[0m`);
|
|
683
|
+
rl.prompt();
|
|
669
684
|
}
|
|
670
|
-
|
|
671
|
-
isProcessing = true;
|
|
672
|
-
await processAlexRequest(trimmed);
|
|
673
|
-
isProcessing = false;
|
|
674
|
-
console.log('');
|
|
675
685
|
}
|
|
676
|
-
};
|
|
677
|
-
|
|
678
|
-
runLoop();
|
|
686
|
+
});
|
|
679
687
|
};
|
|
680
688
|
|
|
681
689
|
if (!initialPrompt || initialPrompt === '?') startAlexSession();
|