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.
Files changed (3) hide show
  1. package/lib/chat.js +71 -16
  2. package/lib/ui.js +16 -5
  3. 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
- ui.renderBox(
246
- "Chat Commands",
247
- [
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
- ].join("\n"),
259
- "cyan"
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
- // Claude Code style - no box, just clean space
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
- // Show permission line after input (like Claude Code)
71
- var label = permissionLabels[currentPermMode] || permissionLabels.normal;
72
- console.log(chalk.dim(" \u276f\u276f ") + chalk.dim("bypass permissions ") + label + chalk.dim(" (shift+tab to cycle)"));
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) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blun-king-cli",
3
- "version": "7.0.2",
3
+ "version": "7.0.4",
4
4
  "description": "BLUN AI Assistant - Command Line Interface",
5
5
  "bin": {
6
6
  "blun": "./bin/blun.js"