blun-king-cli 2.6.0 → 2.6.2

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 (2) hide show
  1. package/bin/blun.js +31 -9
  2. package/package.json +1 -1
package/bin/blun.js CHANGED
@@ -25,12 +25,9 @@ if (!fs.existsSync(SKILLS_DIR)) fs.mkdirSync(SKILLS_DIR, { recursive: true });
25
25
 
26
26
  // ── Default Config ──
27
27
  function loadConfig() {
28
- if (fs.existsSync(CONFIG_FILE)) {
29
- try { return JSON.parse(fs.readFileSync(CONFIG_FILE, "utf8")); } catch(e) {}
30
- }
31
- return {
28
+ var defaults = {
32
29
  auth: { type: "api_key", api_key: "", oauth_token: "", oauth_expires: null },
33
- api: { base_url: "http://176.9.158.30:3200", timeout: 60000 },
30
+ api: { base_url: "http://176.9.158.30:3200", timeout: 60000, key: "" },
34
31
  telegram: { enabled: false, bot_token: "", chat_id: "" },
35
32
  model: "blun-king-v100",
36
33
  workdir: process.cwd(),
@@ -38,6 +35,20 @@ function loadConfig() {
38
35
  verbose: false,
39
36
  watchdog: { enabled: false, interval: 600 }
40
37
  };
38
+ if (fs.existsSync(CONFIG_FILE)) {
39
+ try {
40
+ var saved = JSON.parse(fs.readFileSync(CONFIG_FILE, "utf8"));
41
+ // Deep merge saved over defaults
42
+ Object.keys(defaults).forEach(function(k) {
43
+ if (typeof defaults[k] === "object" && defaults[k] !== null && saved[k]) {
44
+ defaults[k] = Object.assign({}, defaults[k], saved[k]);
45
+ } else if (saved[k] !== undefined) {
46
+ defaults[k] = saved[k];
47
+ }
48
+ });
49
+ } catch(e) {}
50
+ }
51
+ return defaults;
41
52
  }
42
53
 
43
54
  function saveConfig(cfg) {
@@ -74,8 +85,9 @@ function apiCall(method, endpoint, body) {
74
85
  timeout: config.api.timeout
75
86
  };
76
87
 
77
- if (config.auth.type === "api_key" && config.auth.api_key) {
78
- options.headers["Authorization"] = "Bearer " + config.auth.api_key;
88
+ var authToken = config.api.key || config.auth.api_key;
89
+ if (authToken) {
90
+ options.headers["Authorization"] = "Bearer " + authToken;
79
91
  } else if (config.auth.type === "oauth" && config.auth.oauth_token) {
80
92
  options.headers["Authorization"] = "Bearer " + config.auth.oauth_token;
81
93
  }
@@ -495,9 +507,17 @@ async function sendChat(message) {
495
507
  chatHistory.push({ role: "user", content: message });
496
508
  chatHistory.push({ role: "assistant", content: resp.data.answer });
497
509
 
510
+ // Token tracking
511
+ var inTok = Math.ceil(message.length / 3.5);
512
+ var outTok = Math.ceil((resp.data.answer || "").length / 3.5);
513
+ sessionCost.requests++;
514
+ sessionCost.inputTokensEst += inTok;
515
+ sessionCost.outputTokensEst += outTok;
516
+
498
517
  var q = resp.data.quality || {};
518
+ var tokInfo = C.dim + (inTok + outTok) + " tok" + C.reset;
499
519
  var meta = resp.data.task_type + "/" + resp.data.role + " " + BOX.dot + " score: " + (q.score || "?") +
500
- (q.retried ? " " + BOX.dot + " retried" : "");
520
+ (q.retried ? " " + BOX.dot + " retried" : "") + " " + BOX.dot + " " + tokInfo;
501
521
  printAnswer(resp.data.answer, meta);
502
522
 
503
523
  // Auto Memory Dream Mode
@@ -2442,7 +2462,9 @@ async function main() {
2442
2462
  var permColor = isDangerous ? C.red + C.bold : permMode === "deny" ? C.red : C.yellow;
2443
2463
  var modelName = typeof config.model === "string" ? config.model : (config.model && config.model.name ? config.model.name : "default");
2444
2464
  var wdShort = config.workdir ? path.basename(config.workdir) : "~";
2445
- lines.push(permColor + " " + permIcon + " " + permLabel + C.reset + C.dim + " \u2502 " + C.reset + C.cyan + modelName + C.reset + C.dim + " \u2502 " + C.reset + C.dim + wdShort + C.reset);
2465
+ var totalTok = sessionCost.inputTokensEst + sessionCost.outputTokensEst;
2466
+ var tokStr = totalTok > 1000 ? (totalTok / 1000).toFixed(1) + "k" : String(totalTok);
2467
+ lines.push(permColor + " " + permIcon + " " + permLabel + C.reset + C.dim + " \u2502 " + C.reset + C.cyan + modelName + C.reset + C.dim + " \u2502 " + C.reset + C.dim + wdShort + C.reset + C.dim + " \u2502 " + C.reset + C.yellow + tokStr + " tok" + C.reset);
2446
2468
 
2447
2469
  // Menu
2448
2470
  if (menuVisible && menuItems.length > 0) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blun-king-cli",
3
- "version": "2.6.0",
3
+ "version": "2.6.2",
4
4
  "description": "BLUN King CLI — Premium KI Console",
5
5
  "bin": {
6
6
  "blun": "./bin/blun.js"