blun-king-cli 5.2.2 → 5.2.4
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/blun-cli.js +11 -99
- package/package.json +1 -1
package/blun-cli.js
CHANGED
|
@@ -630,105 +630,12 @@ async function sendChat(message) {
|
|
|
630
630
|
dots++;
|
|
631
631
|
}, 300);
|
|
632
632
|
|
|
633
|
-
// Try streaming first, fall back to non-streaming
|
|
634
|
-
var useStreaming = true;
|
|
635
633
|
var fullAnswer = "";
|
|
636
634
|
var receivedFiles = [];
|
|
637
635
|
var meta = "";
|
|
638
|
-
var headerPrinted = false;
|
|
639
636
|
|
|
640
637
|
try {
|
|
641
|
-
//
|
|
642
|
-
var contextMsg = message;
|
|
643
|
-
if (lastCreatedFiles.length > 0) {
|
|
644
|
-
contextMsg = message + "\n\n[Kontext: Zuletzt erstellte Dateien im Ordner " + config.workdir + ": " +
|
|
645
|
-
lastCreatedFiles.map(function(f) { return f.name; }).join(", ") + "]";
|
|
646
|
-
}
|
|
647
|
-
var stream = await apiStreamCall("/chat/stream", {
|
|
648
|
-
message: contextMsg,
|
|
649
|
-
workdir: config.workdir,
|
|
650
|
-
history: chatHistory.slice(-10)
|
|
651
|
-
});
|
|
652
|
-
|
|
653
|
-
var buffer = "";
|
|
654
|
-
var streamMeta = {};
|
|
655
|
-
var headerShown = false;
|
|
656
|
-
|
|
657
|
-
await new Promise(function(resolve, reject) {
|
|
658
|
-
stream.on("data", function(chunk) {
|
|
659
|
-
buffer += chunk.toString();
|
|
660
|
-
var lines = buffer.split("\n");
|
|
661
|
-
buffer = lines.pop() || "";
|
|
662
|
-
|
|
663
|
-
for (var i = 0; i < lines.length; i++) {
|
|
664
|
-
var line = lines[i].trim();
|
|
665
|
-
if (line.startsWith("event: ")) {
|
|
666
|
-
var eventType = line.slice(7);
|
|
667
|
-
i++;
|
|
668
|
-
if (i < lines.length && lines[i].trim().startsWith("data: ")) {
|
|
669
|
-
var dataStr = lines[i].trim().slice(6);
|
|
670
|
-
try {
|
|
671
|
-
var eventData = JSON.parse(dataStr);
|
|
672
|
-
|
|
673
|
-
if (eventType === "meta") {
|
|
674
|
-
streamMeta = eventData;
|
|
675
|
-
// Stop thinking, show header
|
|
676
|
-
clearInterval(thinkTimer);
|
|
677
|
-
process.stdout.write("\r\x1b[2K");
|
|
678
|
-
console.log("");
|
|
679
|
-
console.log(C.green + C.bold + " " + BOX.bot + " BLUN King" + C.reset +
|
|
680
|
-
C.gray + " " + BOX.dot + " " + (eventData.task_type || "") + "/" + (eventData.role || "") + C.reset);
|
|
681
|
-
console.log(C.green + " " + BOX.h.repeat(40) + C.reset);
|
|
682
|
-
process.stdout.write(" ");
|
|
683
|
-
headerShown = true;
|
|
684
|
-
}
|
|
685
|
-
else if (eventType === "token") {
|
|
686
|
-
fullAnswer += eventData.text;
|
|
687
|
-
// Live output — write token directly
|
|
688
|
-
process.stdout.write(eventData.text);
|
|
689
|
-
}
|
|
690
|
-
else if (eventType === "retry") {
|
|
691
|
-
fullAnswer = "";
|
|
692
|
-
process.stdout.write("\n" + C.yellow + " \u21BB retry..." + C.reset + "\n ");
|
|
693
|
-
}
|
|
694
|
-
else if (eventType === "tool") {
|
|
695
|
-
process.stdout.write("\n" + C.cyan + " \u2699 " + eventData.name + C.reset);
|
|
696
|
-
if (eventData.args && eventData.args.name) process.stdout.write(C.dim + " " + eventData.args.name + C.reset);
|
|
697
|
-
process.stdout.write("\n ");
|
|
698
|
-
}
|
|
699
|
-
else if (eventType === "files") {
|
|
700
|
-
receivedFiles = eventData.files || [];
|
|
701
|
-
}
|
|
702
|
-
else if (eventType === "done") {
|
|
703
|
-
meta = (streamMeta.task_type || "") + "/" + (streamMeta.role || "") + " " + BOX.dot +
|
|
704
|
-
" score: " + ((eventData.quality || {}).score || "?") +
|
|
705
|
-
(eventData.status ? " " + BOX.dot + " " + eventData.status : "");
|
|
706
|
-
}
|
|
707
|
-
else if (eventType === "error") {
|
|
708
|
-
process.stdout.write("\n" + C.red + " ERROR: " + eventData.error + C.reset + "\n");
|
|
709
|
-
}
|
|
710
|
-
} catch(e) {}
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
}
|
|
714
|
-
});
|
|
715
|
-
|
|
716
|
-
stream.on("end", function() { resolve(); });
|
|
717
|
-
stream.on("error", function(e) { reject(e); });
|
|
718
|
-
});
|
|
719
|
-
|
|
720
|
-
// Finish streaming output
|
|
721
|
-
if (!headerShown) {
|
|
722
|
-
clearInterval(thinkTimer);
|
|
723
|
-
process.stdout.write("\r\x1b[2K");
|
|
724
|
-
}
|
|
725
|
-
console.log("\n");
|
|
726
|
-
if (meta) console.log(C.dim + " " + meta + C.reset);
|
|
727
|
-
console.log("");
|
|
728
|
-
|
|
729
|
-
} catch(streamErr) {
|
|
730
|
-
// Fallback to non-streaming
|
|
731
|
-
useStreaming = false;
|
|
638
|
+
// Non-streaming — reliable
|
|
732
639
|
clearInterval(thinkTimer);
|
|
733
640
|
process.stdout.write("\r\x1b[2K");
|
|
734
641
|
|
|
@@ -751,6 +658,11 @@ async function sendChat(message) {
|
|
|
751
658
|
(resp.data.status ? " " + BOX.dot + " " + resp.data.status : "");
|
|
752
659
|
|
|
753
660
|
await streamAnswer(fullAnswer, meta);
|
|
661
|
+
} catch(reqErr) {
|
|
662
|
+
clearInterval(thinkTimer);
|
|
663
|
+
process.stdout.write("\r\x1b[2K");
|
|
664
|
+
printError("Connection failed: " + reqErr.message);
|
|
665
|
+
return;
|
|
754
666
|
}
|
|
755
667
|
|
|
756
668
|
chatHistory.push({ role: "user", content: message });
|
|
@@ -2881,20 +2793,20 @@ async function main() {
|
|
|
2881
2793
|
{ patterns: ["plugin.*install", "plugin.*hinzuf", "erweiterung"], cmd: "/plugin" },
|
|
2882
2794
|
{ patterns: ["mcp.*server", "mcp.*install", "mcp.*einricht"], cmd: "/mcp" },
|
|
2883
2795
|
{ patterns: ["welches model", "which model", "modell.*wechsel", "model.*switch", "anderes.*model"], cmd: "/model" },
|
|
2884
|
-
{ patterns: ["permission", "berechtigung", "zugriff"
|
|
2885
|
-
{ patterns: ["einstellung", "setting", "config", "
|
|
2886
|
-
{ patterns: ["health.*check", "
|
|
2796
|
+
{ patterns: ["^permission", "berechtigung.*zeig", "zugriff.*einst"], cmd: "/permissions" },
|
|
2797
|
+
{ patterns: ["^einstellung", "^setting", "^config$", "konfiguration.*zeig"], cmd: "/config" },
|
|
2798
|
+
{ patterns: ["health.*check", "status.*check"], cmd: "/health" },
|
|
2887
2799
|
{ patterns: ["zeig.*skills", "was kannst", "show.*skills", "faehigkeit"], cmd: "/skills" },
|
|
2888
2800
|
{ patterns: ["zeig.*agent", "list.*agent", "welche.*agent"], cmd: "/agents" },
|
|
2889
2801
|
{ patterns: ["screenshot.*mach", "screenshot.*von", "take.*screenshot"], cmd: null, extract: function(t) { var m = t.match(/(?:screenshot|bildschirmfoto).*?(https?:\/\/\S+)/i); return m ? "/screenshot " + m[1] : "/screenshot"; } },
|
|
2890
|
-
{ patterns: ["hilfe", "help", "
|
|
2802
|
+
{ patterns: ["hilfe", "^help$", "befehle"], cmd: "/help" },
|
|
2891
2803
|
{ patterns: ["doctor", "diagnose", "problem.*check"], cmd: "/doctor" },
|
|
2892
2804
|
{ patterns: ["login", "anmeld", "einlogg"], cmd: "/login" },
|
|
2893
2805
|
{ patterns: ["logout", "abmeld", "auslogg"], cmd: "/logout" },
|
|
2894
2806
|
{ patterns: ["komprimier", "compact", "zusammenfass"], cmd: "/compact" },
|
|
2895
2807
|
{ patterns: ["kosten", "verbrauch", "cost", "tokens.*used"], cmd: "/cost" },
|
|
2896
2808
|
{ patterns: ["update.*check", "neue.*version", "aktualisier"], cmd: "/versions" },
|
|
2897
|
-
{ patterns: ["
|
|
2809
|
+
{ patterns: ["^memory", "memory.*show", "was weisst.*du", "^erinnerung.*zeig"], cmd: "/memory" },
|
|
2898
2810
|
{ patterns: ["hook", "webhook"], cmd: "/hooks" },
|
|
2899
2811
|
];
|
|
2900
2812
|
|