blun-king-cli 7.0.2 → 7.0.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/lib/chat.js +71 -16
- package/lib/ui.js +16 -5
- package/package.json +1 -1
package/lib/chat.js
CHANGED
|
@@ -15,6 +15,7 @@ var permissionMode = "normal"; // safe, normal, god
|
|
|
15
15
|
|
|
16
16
|
function showPrompt(rl, username, model) {
|
|
17
17
|
ui.setCurrentPerm(permissionMode);
|
|
18
|
+
ui.renderInputBox(username, model, permissionMode);
|
|
18
19
|
rl.prompt();
|
|
19
20
|
}
|
|
20
21
|
|
|
@@ -72,11 +73,32 @@ function startChat() {
|
|
|
72
73
|
ui.renderPermissionLine(permissionMode);
|
|
73
74
|
console.log();
|
|
74
75
|
|
|
76
|
+
var SLASH_COMMANDS = [
|
|
77
|
+
["/help", "Show all commands"],
|
|
78
|
+
["/model", "Switch AI model"],
|
|
79
|
+
["/settings", "Show/change settings"],
|
|
80
|
+
["/perm", "Cycle permission mode (safe/normal/god)"],
|
|
81
|
+
["/status", "Token usage & uptime"],
|
|
82
|
+
["/whoami", "Current user info"],
|
|
83
|
+
["/keys", "List API keys"],
|
|
84
|
+
["/login", "Login from chat"],
|
|
85
|
+
["/clear", "Clear screen"],
|
|
86
|
+
["/exit", "Exit chat"],
|
|
87
|
+
];
|
|
88
|
+
var slashNames = SLASH_COMMANDS.map(function (c) { return c[0]; });
|
|
89
|
+
|
|
75
90
|
var rl = readline.createInterface({
|
|
76
91
|
input: process.stdin,
|
|
77
92
|
output: process.stdout,
|
|
78
93
|
prompt: ui.renderPrompt(),
|
|
79
94
|
terminal: true,
|
|
95
|
+
completer: function (line) {
|
|
96
|
+
if (line.startsWith("/")) {
|
|
97
|
+
var hits = slashNames.filter(function (c) { return c.startsWith(line); });
|
|
98
|
+
return [hits.length ? hits : slashNames, line];
|
|
99
|
+
}
|
|
100
|
+
return [[], line];
|
|
101
|
+
},
|
|
80
102
|
});
|
|
81
103
|
|
|
82
104
|
showPrompt(rl, username, model);
|
|
@@ -242,26 +264,59 @@ function startChat() {
|
|
|
242
264
|
}
|
|
243
265
|
|
|
244
266
|
if (input === "/help") {
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
[
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
"
|
|
260
|
-
);
|
|
267
|
+
console.log(chalk.bold.cyan("\n Commands:\n"));
|
|
268
|
+
var helpLines = [
|
|
269
|
+
["/exit", "Exit chat"],
|
|
270
|
+
["/clear", "Clear screen"],
|
|
271
|
+
["/status", "Show token usage & uptime"],
|
|
272
|
+
["/login", "Login from chat"],
|
|
273
|
+
["/whoami", "Show current user info"],
|
|
274
|
+
["/keys", "List API keys"],
|
|
275
|
+
["/model", "Switch AI model"],
|
|
276
|
+
["/settings", "Show/change settings"],
|
|
277
|
+
["/perm", "Cycle permission mode (safe/normal/god)"],
|
|
278
|
+
["/help", "Show this help"],
|
|
279
|
+
];
|
|
280
|
+
helpLines.forEach(function (h) {
|
|
281
|
+
console.log(" " + chalk.green(h[0]) + " ".repeat(14 - h[0].length) + chalk.dim(h[1]));
|
|
282
|
+
});
|
|
283
|
+
console.log();
|
|
261
284
|
showPrompt(rl, username, model);
|
|
262
285
|
return;
|
|
263
286
|
}
|
|
264
287
|
|
|
288
|
+
// Slash command picker - type just "/" to open interactive menu
|
|
289
|
+
if (input === "/") {
|
|
290
|
+
var inquirer = require("inquirer");
|
|
291
|
+
inquirer.prompt([{
|
|
292
|
+
type: "list",
|
|
293
|
+
name: "cmd",
|
|
294
|
+
message: chalk.cyan("Select command"),
|
|
295
|
+
choices: [
|
|
296
|
+
{ name: chalk.green("/model") + chalk.dim(" Switch AI model"), value: "/model" },
|
|
297
|
+
{ name: chalk.green("/settings") + chalk.dim(" Show/change settings"), value: "/settings" },
|
|
298
|
+
{ name: chalk.green("/perm") + chalk.dim(" Cycle permission mode"), value: "/perm" },
|
|
299
|
+
{ name: chalk.green("/status") + chalk.dim(" Token usage & uptime"), value: "/status" },
|
|
300
|
+
{ name: chalk.green("/whoami") + chalk.dim(" Current user info"), value: "/whoami" },
|
|
301
|
+
{ name: chalk.green("/keys") + chalk.dim(" List API keys"), value: "/keys" },
|
|
302
|
+
{ name: chalk.green("/login") + chalk.dim(" Login from chat"), value: "/login" },
|
|
303
|
+
{ name: chalk.green("/clear") + chalk.dim(" Clear screen"), value: "/clear" },
|
|
304
|
+
{ name: chalk.green("/help") + chalk.dim(" Show all commands"), value: "/help" },
|
|
305
|
+
new inquirer.Separator(),
|
|
306
|
+
{ name: chalk.red("/exit") + chalk.dim(" Exit chat"), value: "/exit" },
|
|
307
|
+
{ name: chalk.dim("Cancel"), value: "" },
|
|
308
|
+
],
|
|
309
|
+
pageSize: 12,
|
|
310
|
+
}]).then(function (ans) {
|
|
311
|
+
if (ans.cmd) {
|
|
312
|
+
rl.emit("line", ans.cmd);
|
|
313
|
+
} else {
|
|
314
|
+
showPrompt(rl, username, model);
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
|
|
265
320
|
// Send message
|
|
266
321
|
if (localMode) {
|
|
267
322
|
ui.renderResponse(
|
package/lib/ui.js
CHANGED
|
@@ -60,20 +60,31 @@ function getInputBoxWidth() {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
function renderInputBox(username, model, permMode) {
|
|
63
|
-
|
|
63
|
+
var w = getInputBoxWidth();
|
|
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"));
|
|
64
69
|
}
|
|
65
70
|
|
|
66
71
|
var currentPermMode = "normal";
|
|
67
72
|
function setCurrentPerm(pm) { currentPermMode = pm; }
|
|
68
73
|
|
|
69
74
|
function renderInputBoxClose() {
|
|
70
|
-
|
|
71
|
-
var
|
|
72
|
-
|
|
75
|
+
var w = getInputBoxWidth();
|
|
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"));
|
|
73
84
|
}
|
|
74
85
|
|
|
75
86
|
function renderPrompt() {
|
|
76
|
-
return chalk.bold.green("> ");
|
|
87
|
+
return chalk.green("\u2502 ") + chalk.bold.green("> ");
|
|
77
88
|
}
|
|
78
89
|
|
|
79
90
|
function renderPermissionLine(permMode) {
|