blun-king-cli 7.0.1 → 7.0.3
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/lib/chat.js +51 -16
- package/lib/ui.js +26 -37
- package/package.json +1 -1
package/lib/chat.js
CHANGED
|
@@ -14,6 +14,7 @@ var localMode = false;
|
|
|
14
14
|
var permissionMode = "normal"; // safe, normal, god
|
|
15
15
|
|
|
16
16
|
function showPrompt(rl, username, model) {
|
|
17
|
+
ui.setCurrentPerm(permissionMode);
|
|
17
18
|
ui.renderInputBox(username, model, permissionMode);
|
|
18
19
|
rl.prompt();
|
|
19
20
|
}
|
|
@@ -22,6 +23,7 @@ function cyclePermission() {
|
|
|
22
23
|
var modes = ui.PERMISSION_MODES;
|
|
23
24
|
var idx = modes.indexOf(permissionMode);
|
|
24
25
|
permissionMode = modes[(idx + 1) % modes.length];
|
|
26
|
+
ui.setCurrentPerm(permissionMode);
|
|
25
27
|
return permissionMode;
|
|
26
28
|
}
|
|
27
29
|
|
|
@@ -241,26 +243,59 @@ function startChat() {
|
|
|
241
243
|
}
|
|
242
244
|
|
|
243
245
|
if (input === "/help") {
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
[
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
"
|
|
259
|
-
);
|
|
246
|
+
console.log(chalk.bold.cyan("\n Commands:\n"));
|
|
247
|
+
var helpLines = [
|
|
248
|
+
["/exit", "Exit chat"],
|
|
249
|
+
["/clear", "Clear screen"],
|
|
250
|
+
["/status", "Show token usage & uptime"],
|
|
251
|
+
["/login", "Login from chat"],
|
|
252
|
+
["/whoami", "Show current user info"],
|
|
253
|
+
["/keys", "List API keys"],
|
|
254
|
+
["/model", "Switch AI model"],
|
|
255
|
+
["/settings", "Show/change settings"],
|
|
256
|
+
["/perm", "Cycle permission mode (safe/normal/god)"],
|
|
257
|
+
["/help", "Show this help"],
|
|
258
|
+
];
|
|
259
|
+
helpLines.forEach(function (h) {
|
|
260
|
+
console.log(" " + chalk.green(h[0]) + " ".repeat(14 - h[0].length) + chalk.dim(h[1]));
|
|
261
|
+
});
|
|
262
|
+
console.log();
|
|
260
263
|
showPrompt(rl, username, model);
|
|
261
264
|
return;
|
|
262
265
|
}
|
|
263
266
|
|
|
267
|
+
// Slash command picker - type just "/" to open interactive menu
|
|
268
|
+
if (input === "/") {
|
|
269
|
+
var inquirer = require("inquirer");
|
|
270
|
+
inquirer.prompt([{
|
|
271
|
+
type: "list",
|
|
272
|
+
name: "cmd",
|
|
273
|
+
message: chalk.cyan("Select command"),
|
|
274
|
+
choices: [
|
|
275
|
+
{ name: chalk.green("/model") + chalk.dim(" Switch AI model"), value: "/model" },
|
|
276
|
+
{ name: chalk.green("/settings") + chalk.dim(" Show/change settings"), value: "/settings" },
|
|
277
|
+
{ name: chalk.green("/perm") + chalk.dim(" Cycle permission mode"), value: "/perm" },
|
|
278
|
+
{ name: chalk.green("/status") + chalk.dim(" Token usage & uptime"), value: "/status" },
|
|
279
|
+
{ name: chalk.green("/whoami") + chalk.dim(" Current user info"), value: "/whoami" },
|
|
280
|
+
{ name: chalk.green("/keys") + chalk.dim(" List API keys"), value: "/keys" },
|
|
281
|
+
{ name: chalk.green("/login") + chalk.dim(" Login from chat"), value: "/login" },
|
|
282
|
+
{ name: chalk.green("/clear") + chalk.dim(" Clear screen"), value: "/clear" },
|
|
283
|
+
{ name: chalk.green("/help") + chalk.dim(" Show all commands"), value: "/help" },
|
|
284
|
+
new inquirer.Separator(),
|
|
285
|
+
{ name: chalk.red("/exit") + chalk.dim(" Exit chat"), value: "/exit" },
|
|
286
|
+
{ name: chalk.dim("Cancel"), value: "" },
|
|
287
|
+
],
|
|
288
|
+
pageSize: 12,
|
|
289
|
+
}]).then(function (ans) {
|
|
290
|
+
if (ans.cmd) {
|
|
291
|
+
rl.emit("line", ans.cmd);
|
|
292
|
+
} else {
|
|
293
|
+
showPrompt(rl, username, model);
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
|
|
264
299
|
// Send message
|
|
265
300
|
if (localMode) {
|
|
266
301
|
ui.renderResponse(
|
package/lib/ui.js
CHANGED
|
@@ -61,30 +61,30 @@ function getInputBoxWidth() {
|
|
|
61
61
|
|
|
62
62
|
function renderInputBox(username, model, permMode) {
|
|
63
63
|
var w = getInputBoxWidth();
|
|
64
|
-
var
|
|
65
|
-
var
|
|
66
|
-
var
|
|
67
|
-
var
|
|
68
|
-
|
|
69
|
-
var hintsText = " " + hints + " ";
|
|
70
|
-
var topFill = w - labelText.length - hintsText.length;
|
|
71
|
-
if (topFill < 2) topFill = 2;
|
|
72
|
-
var topLine =
|
|
73
|
-
chalk.dim("\u256d") +
|
|
74
|
-
chalk.cyan(labelText) +
|
|
75
|
-
chalk.dim("\u2500".repeat(topFill)) +
|
|
76
|
-
chalk.dim(hintsText) +
|
|
77
|
-
chalk.dim("\u256e");
|
|
78
|
-
console.log(topLine);
|
|
64
|
+
var pm = permMode || currentPermMode || "normal";
|
|
65
|
+
var label = permissionLabels[pm] || permissionLabels.normal;
|
|
66
|
+
var modelTag = chalk.bgCyan.black(" " + (model || "auto") + " ");
|
|
67
|
+
var info = modelTag + chalk.dim(" | ") + label;
|
|
68
|
+
console.log(chalk.green("\u256d\u2500") + chalk.green.bold(" BLUN ") + chalk.green("\u2500".repeat(Math.max(2, w - 10))) + chalk.green("\u256e"));
|
|
79
69
|
}
|
|
80
70
|
|
|
71
|
+
var currentPermMode = "normal";
|
|
72
|
+
function setCurrentPerm(pm) { currentPermMode = pm; }
|
|
73
|
+
|
|
81
74
|
function renderInputBoxClose() {
|
|
82
75
|
var w = getInputBoxWidth();
|
|
83
|
-
|
|
76
|
+
var pm = currentPermMode || "normal";
|
|
77
|
+
var label = permissionLabels[pm] || permissionLabels.normal;
|
|
78
|
+
var stats = getStats();
|
|
79
|
+
var elapsed = Math.floor(stats.uptime / 1000);
|
|
80
|
+
var mins = Math.floor(elapsed / 60);
|
|
81
|
+
var secs = elapsed % 60;
|
|
82
|
+
var infoLine = label + chalk.dim(" | Tokens: " + totalTokens.toLocaleString() + " | " + mins + "m " + secs + "s");
|
|
83
|
+
console.log(chalk.green("\u2570") + chalk.green("\u2500") + chalk.dim(" ") + infoLine + chalk.dim(" ") + chalk.green("\u2500".repeat(Math.max(2, w - 40))) + chalk.green("\u256f"));
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
function renderPrompt() {
|
|
87
|
-
return chalk.
|
|
87
|
+
return chalk.green("\u2502 ") + chalk.bold.green("> ");
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
function renderPermissionLine(permMode) {
|
|
@@ -114,27 +114,15 @@ function renderResponse(text, type) {
|
|
|
114
114
|
var rendered = renderMarkdown(text);
|
|
115
115
|
|
|
116
116
|
if (type === "agent") {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
borderStyle: "round",
|
|
124
|
-
borderColor: "green",
|
|
125
|
-
})
|
|
126
|
-
);
|
|
117
|
+
// Claude Code style - plain text with green prefix, no box
|
|
118
|
+
var lines = rendered.split("\n");
|
|
119
|
+
lines.forEach(function (line) {
|
|
120
|
+
console.log(" " + chalk.green(line));
|
|
121
|
+
});
|
|
122
|
+
console.log();
|
|
127
123
|
} else if (type === "error") {
|
|
128
|
-
console.log(
|
|
129
|
-
|
|
130
|
-
title: chalk.red.bold(" \u2718 Error "),
|
|
131
|
-
titleAlignment: "left",
|
|
132
|
-
padding: { top: 0, bottom: 0, left: 1, right: 1 },
|
|
133
|
-
margin: { top: 0, bottom: 0, left: 1, right: 1 },
|
|
134
|
-
borderStyle: "round",
|
|
135
|
-
borderColor: "red",
|
|
136
|
-
})
|
|
137
|
-
);
|
|
124
|
+
console.log(chalk.red(" \u2718 " + rendered));
|
|
125
|
+
console.log();
|
|
138
126
|
} else if (type === "system") {
|
|
139
127
|
console.log(chalk.yellow.bold(" [SYS] ") + chalk.yellow(rendered));
|
|
140
128
|
console.log();
|
|
@@ -381,6 +369,7 @@ module.exports = {
|
|
|
381
369
|
renderPrompt: renderPrompt,
|
|
382
370
|
renderInputBox: renderInputBox,
|
|
383
371
|
renderInputBoxClose: renderInputBoxClose,
|
|
372
|
+
setCurrentPerm: setCurrentPerm,
|
|
384
373
|
renderWelcomeInfo: renderWelcomeInfo,
|
|
385
374
|
renderPermissionLine: renderPermissionLine,
|
|
386
375
|
renderMiniStatus: renderMiniStatus,
|