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.
Files changed (3) hide show
  1. package/lib/chat.js +51 -16
  2. package/lib/ui.js +26 -37
  3. 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
- ui.renderBox(
245
- "Chat Commands",
246
- [
247
- "/exit Exit chat",
248
- "/clear Clear screen",
249
- "/status Show token usage & uptime",
250
- "/login Login from chat",
251
- "/whoami Show current user info",
252
- "/keys List API keys",
253
- "/model Switch AI model",
254
- "/settings Show/change settings",
255
- "/perm Cycle permission mode (safe/normal/god)",
256
- "/help Show this help",
257
- ].join("\n"),
258
- "cyan"
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 u = username || "user";
65
- var m = model || "auto";
66
- var pm = permMode || "normal";
67
- var hints = "/help \u2502 /settings \u2502 /model \u2502 /exit";
68
- var labelText = " " + u + " [" + m + "] ";
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
- console.log(chalk.dim("\u2570" + "\u2500".repeat(w) + "\u256f"));
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.dim("\u2502") + " " + chalk.green.bold("\u276f") + " ";
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
- console.log(
118
- boxen(rendered, {
119
- title: chalk.green.bold(" \u2728 BLUN "),
120
- titleAlignment: "left",
121
- padding: { top: 0, bottom: 0, left: 1, right: 1 },
122
- margin: { top: 0, bottom: 0, left: 1, right: 1 },
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
- boxen(chalk.red(rendered), {
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,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blun-king-cli",
3
- "version": "7.0.1",
3
+ "version": "7.0.3",
4
4
  "description": "BLUN AI Assistant - Command Line Interface",
5
5
  "bin": {
6
6
  "blun": "./bin/blun.js"