blun-king-cli 4.0.0 → 4.0.1
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/bin/blun.js +18 -71
- package/package.json +1 -1
package/bin/blun.js
CHANGED
|
@@ -643,12 +643,9 @@ async function sendChat(message) {
|
|
|
643
643
|
history: chatHistory.slice(-10)
|
|
644
644
|
});
|
|
645
645
|
|
|
646
|
-
|
|
647
|
-
process.stdout.write("\r\x1b[2K");
|
|
648
|
-
|
|
646
|
+
// Collect tokens silently — only update thinking animation
|
|
649
647
|
var buffer = "";
|
|
650
|
-
var
|
|
651
|
-
var flushTimer = null;
|
|
648
|
+
var streamMeta = {};
|
|
652
649
|
|
|
653
650
|
await new Promise(function(resolve, reject) {
|
|
654
651
|
stream.on("data", function(chunk) {
|
|
@@ -660,80 +657,36 @@ async function sendChat(message) {
|
|
|
660
657
|
var line = lines[i].trim();
|
|
661
658
|
if (line.startsWith("event: ")) {
|
|
662
659
|
var eventType = line.slice(7);
|
|
663
|
-
// Next line should be data:
|
|
664
660
|
i++;
|
|
665
661
|
if (i < lines.length && lines[i].trim().startsWith("data: ")) {
|
|
666
662
|
var dataStr = lines[i].trim().slice(6);
|
|
667
663
|
try {
|
|
668
664
|
var eventData = JSON.parse(dataStr);
|
|
669
|
-
|
|
665
|
+
// Handle events silently — just collect data
|
|
666
|
+
if (eventType === "meta") streamMeta = eventData;
|
|
667
|
+
else if (eventType === "token") fullAnswer += eventData.text;
|
|
668
|
+
else if (eventType === "retry") fullAnswer = "";
|
|
669
|
+
else if (eventType === "files") receivedFiles = eventData.files || [];
|
|
670
|
+
else if (eventType === "done") {
|
|
671
|
+
meta = (streamMeta.task_type || "") + "/" + (streamMeta.role || "") + " " + BOX.dot +
|
|
672
|
+
" score: " + ((eventData.quality || {}).score || "?") +
|
|
673
|
+
(eventData.status ? " " + BOX.dot + " " + eventData.status : "");
|
|
674
|
+
}
|
|
670
675
|
} catch(e) {}
|
|
671
676
|
}
|
|
672
677
|
}
|
|
673
678
|
}
|
|
674
679
|
});
|
|
675
680
|
|
|
676
|
-
stream.on("end", function() {
|
|
677
|
-
// Flush remaining token buffer
|
|
678
|
-
if (tokenBuffer.length > 0) {
|
|
679
|
-
process.stdout.write(tokenBuffer);
|
|
680
|
-
tokenBuffer = "";
|
|
681
|
-
}
|
|
682
|
-
resolve();
|
|
683
|
-
});
|
|
684
|
-
|
|
681
|
+
stream.on("end", function() { resolve(); });
|
|
685
682
|
stream.on("error", function(e) { reject(e); });
|
|
686
|
-
|
|
687
|
-
function handleSSEEvent(type, data) {
|
|
688
|
-
switch(type) {
|
|
689
|
-
case "meta":
|
|
690
|
-
// Print header
|
|
691
|
-
if (!headerPrinted) {
|
|
692
|
-
console.log("");
|
|
693
|
-
console.log(C.green + C.bold + " " + BOX.bot + " BLUN King" + C.reset +
|
|
694
|
-
C.gray + " " + BOX.dot + " " + (data.task_type || "") + "/" + (data.role || "") + C.reset);
|
|
695
|
-
console.log(C.green + " " + BOX.h.repeat(40) + C.reset);
|
|
696
|
-
process.stdout.write(" ");
|
|
697
|
-
headerPrinted = true;
|
|
698
|
-
}
|
|
699
|
-
break;
|
|
700
|
-
|
|
701
|
-
case "token":
|
|
702
|
-
fullAnswer += data.text;
|
|
703
|
-
// Write token directly to stdout for live streaming
|
|
704
|
-
process.stdout.write(data.text);
|
|
705
|
-
break;
|
|
706
|
-
|
|
707
|
-
case "retry":
|
|
708
|
-
process.stdout.write("\n" + C.yellow + " ↻ retry: " + (data.reason || []).join(", ") + C.reset + "\n ");
|
|
709
|
-
fullAnswer = "";
|
|
710
|
-
break;
|
|
711
|
-
|
|
712
|
-
case "tool":
|
|
713
|
-
process.stdout.write("\n" + C.cyan + " ⚙ " + data.name + C.reset + "\n ");
|
|
714
|
-
break;
|
|
715
|
-
|
|
716
|
-
case "tool_result":
|
|
717
|
-
process.stdout.write(C.dim + " → " + (data.result || "").slice(0, 100) + C.reset + "\n ");
|
|
718
|
-
break;
|
|
719
|
-
|
|
720
|
-
case "files":
|
|
721
|
-
receivedFiles = data.files || [];
|
|
722
|
-
break;
|
|
723
|
-
|
|
724
|
-
case "done":
|
|
725
|
-
meta = "score: " + ((data.quality || {}).score || "?") +
|
|
726
|
-
(data.status ? " " + BOX.dot + " " + data.status : "");
|
|
727
|
-
break;
|
|
728
|
-
|
|
729
|
-
case "error":
|
|
730
|
-
process.stdout.write("\n" + C.red + " ERROR: " + data.error + C.reset + "\n");
|
|
731
|
-
break;
|
|
732
|
-
}
|
|
733
|
-
}
|
|
734
683
|
});
|
|
735
684
|
|
|
736
|
-
|
|
685
|
+
// Now stop thinking and show formatted answer
|
|
686
|
+
clearInterval(thinkTimer);
|
|
687
|
+
process.stdout.write("\r\x1b[2K");
|
|
688
|
+
|
|
689
|
+
await streamAnswer(fullAnswer, meta);
|
|
737
690
|
|
|
738
691
|
} catch(streamErr) {
|
|
739
692
|
// Fallback to non-streaming
|
|
@@ -788,12 +741,6 @@ async function sendChat(message) {
|
|
|
788
741
|
console.log("");
|
|
789
742
|
}
|
|
790
743
|
|
|
791
|
-
// Show meta for streaming mode
|
|
792
|
-
if (useStreaming && meta) {
|
|
793
|
-
console.log(C.dim + " " + meta + C.reset);
|
|
794
|
-
console.log("");
|
|
795
|
-
}
|
|
796
|
-
|
|
797
744
|
// Auto Memory Dream Mode
|
|
798
745
|
dreamCounter++;
|
|
799
746
|
if (dreamCounter >= DREAM_INTERVAL) {
|