blun-king-cli 9.1.133 → 9.1.135

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/LIESMICH.txt CHANGED
@@ -125,6 +125,8 @@ Ab BLUN King 9.1.132 wird der schlanke Basissystemprompt nach der generierten In
125
125
 
126
126
  Ab BLUN King 9.1.133 werden die projektlokale und die gemeinsame `Mistake.md` nicht mehr als zwei getrennte Promptblöcke gesendet. King wählt aus beiden Quellen höchstens fünf relevante vollständige Einträge innerhalb eines gemeinsamen Budgets von 6.000 Zeichen aus. Die vollständigen Dateien, Writer, Archive, Register, der Rohverlauf und Exporte bleiben unverändert. Die Auswahl erfolgt lokal und deterministisch und benötigt keinen zusätzlichen Modell-, Embedding- oder Netzwerkaufruf. Mit Fredriks aktuellen Dateien sinkt die wiederholte Modellsicht um 12.917 bis 16.811 Zeichen, also um etwa 3.230 bis 4.203 geschätzte Token pro Anfrage.
127
127
 
128
+ Ab BLUN King 9.1.134 begrenzt die Modellprojektion nicht adressierte Telegram-Gruppennachrichten auf eine nachvollziehbare Vorschau von 2.000 Zeichen. Anfang und Ende bleiben erhalten, eine Markierung nennt die ursprüngliche Länge. Direkt an den Agenten gerichtete Nachrichten, die sichtbare Telegram-Historie, der Rohverlauf und Exporte bleiben vollständig. In Fredriks realem Verlauf betraf die Grenze 211 von 517 verschiedenen mitgelesenen Gruppenmeldungen und hätte 102.466 wiederholt übertragene Zeichen eingespart, also rund 25.617 geschätzte Token über die gemessenen Modellanfragen.
129
+
128
130
  Ab BLUN King 9.1.131 entfernt die Modellprojektion zwei ältere Regelkopien aus dem Systemprompt, sobald gleichwertige Regeln im Conduct-Abschnitt vorhanden sind. Betroffen sind ausschließlich die doppelten Hinweise zu Ehrlichkeit und Zugangsdaten; die vollständigen Conduct-Regeln und alle übrigen Prompt-Abschnitte bleiben unverändert. In der ausgelieferten Standardvorlage sinkt der wiederholt gesendete Prompt dadurch um 1.010 Zeichen, also um etwa 253 geschätzte Token pro Modellanfrage. Fehlt eines der Conduct-Gegenstücke, bleibt die entsprechende ältere Regel unverändert erhalten.
129
131
 
130
132
  Ab BLUN King 9.1.118 bleibt der Sitzungszeitstempel im Systemprompt während einer laufenden Sitzung unverändert. Das erneute Einlesen von Verzeichnisübersicht, AGENTS.md-Dateien, Zusatzverzeichnissen und Skillinformationen kann den Prompt weiterhin ändern, wenn sich die jeweiligen Quellen tatsächlich verändert haben. Bleiben diese Quellen gleich, entwertet die Aktualisierung nach einer Verdichtung den Präfix-Cache des Anbieters nicht mehr allein durch einen neuen Zeitstempel. In Fredriks gemessener Sitzung unterschieden sich die beiden letzten Systemprompts mit jeweils 68.631 Zeichen nur in der Zeitangabe, und zwar erst nach einem gemeinsamen Präfix von 27.111 Zeichen. Der geänderte Zeitstempel verhinderte damit die Wiederverwendung der übrigen 41.512 unveränderten Zeichen aus dem Präfix-Cache.
@@ -350,6 +352,20 @@ Das kompakte BLUN-Zeichen unter der Eingabe zeigt die Markenfarben wieder in
350
352
  der richtigen Reihenfolge: Der Statuspunkt und UN verwenden die Primärfarbe,
351
353
  BL bleibt weiß. Statuswerte, Profilname und Persona bleiben unverändert.
352
354
 
355
+ Einheitliche verwaltete Node-Laufzeit
356
+ --------------------------------------
357
+
358
+ Startet BLUN unter Windows oder macOS mit einer Node.js-Version vor 24.15.0,
359
+ richtet es eine private unterstützte Laufzeit ein und startet damit neu. Ab
360
+ BLUN King 9.1.135 steht das Verzeichnis dieser verwalteten Laufzeit auch im
361
+ PATH des Ersatzprozesses und aller untergeordneten Werkzeuge an erster Stelle.
362
+
363
+ Dadurch verwenden vom Agenten gestartete node- und npm-Befehle dieselbe
364
+ unterstützte Laufzeit wie die TUI, statt auf eine ältere Systeminstallation
365
+ zurückzufallen. Die globale Node-Installation des Systems wird nicht verändert.
366
+ OAuth, gespeicherte Anmeldedaten, Sitzungen und der Updatestatus bleiben
367
+ unverändert.
368
+
353
369
  Aktualisieren
354
370
  -------------
355
371
 
package/README.md CHANGED
@@ -131,6 +131,8 @@ Ab BLUN King 9.1.132 wird der schlanke Basissystemprompt nach der generierten In
131
131
 
132
132
  Ab BLUN King 9.1.133 werden die projektlokale und die gemeinsame `Mistake.md` nicht mehr als zwei getrennte Promptblöcke gesendet. King wählt aus beiden Quellen höchstens fünf relevante vollständige Einträge innerhalb eines gemeinsamen Budgets von 6.000 Zeichen aus. Die vollständigen Dateien, Writer, Archive, Register, der Rohverlauf und Exporte bleiben unverändert. Die Auswahl erfolgt lokal und deterministisch und benötigt keinen zusätzlichen Modell-, Embedding- oder Netzwerkaufruf. Mit Fredriks aktuellen Dateien sinkt die wiederholte Modellsicht um 12.917 bis 16.811 Zeichen, also um etwa 3.230 bis 4.203 geschätzte Token pro Anfrage.
133
133
 
134
+ Ab BLUN King 9.1.134 begrenzt die Modellprojektion nicht adressierte Telegram-Gruppennachrichten auf eine nachvollziehbare Vorschau von 2.000 Zeichen. Anfang und Ende bleiben erhalten, eine Markierung nennt die ursprüngliche Länge. Direkt an den Agenten gerichtete Nachrichten, die sichtbare Telegram-Historie, der Rohverlauf und Exporte bleiben vollständig. In Fredriks realem Verlauf betraf die Grenze 211 von 517 verschiedenen mitgelesenen Gruppenmeldungen und hätte 102.466 wiederholt übertragene Zeichen eingespart, also rund 25.617 geschätzte Token über die gemessenen Modellanfragen.
135
+
134
136
  Ab BLUN King 9.1.131 entfernt die Modellprojektion zwei ältere Regelkopien aus dem Systemprompt, sobald gleichwertige Regeln im Conduct-Abschnitt vorhanden sind. Betroffen sind ausschließlich die doppelten Hinweise zu Ehrlichkeit und Zugangsdaten; die vollständigen Conduct-Regeln und alle übrigen Prompt-Abschnitte bleiben unverändert. In der ausgelieferten Standardvorlage sinkt der wiederholt gesendete Prompt dadurch um 1.010 Zeichen, also um etwa 253 geschätzte Token pro Modellanfrage. Fehlt eines der Conduct-Gegenstücke, bleibt die entsprechende ältere Regel unverändert erhalten.
135
137
 
136
138
  Ab BLUN King 9.1.118 bleibt der Sitzungszeitstempel im Systemprompt während einer laufenden Sitzung unverändert. Das erneute Einlesen von Verzeichnisübersicht, AGENTS.md-Dateien, Zusatzverzeichnissen und Skillinformationen kann den Prompt weiterhin ändern, wenn sich die jeweiligen Quellen tatsächlich verändert haben. Bleiben diese Quellen gleich, entwertet die Aktualisierung nach einer Verdichtung den Präfix-Cache des Anbieters nicht mehr allein durch einen neuen Zeitstempel. In Fredriks gemessener Sitzung unterschieden sich die beiden letzten Systemprompts mit jeweils 68.631 Zeichen nur in der Zeitangabe, und zwar erst nach einem gemeinsamen Präfix von 27.111 Zeichen. Der geänderte Zeitstempel verhinderte damit die Wiederverwendung der übrigen 41.512 unveränderten Zeichen aus dem Präfix-Cache.
@@ -360,6 +362,19 @@ der richtigen Reihenfolge: Der Statuspunkt und `UN` verwenden die Primärfarbe,
360
362
  `BL` bleibt weiß. Die Korrektur betrifft nur die Darstellung; Statuswerte,
361
363
  Profilname und Persona bleiben unverändert.
362
364
 
365
+ ## Einheitliche verwaltete Node-Laufzeit
366
+
367
+ Startet BLUN unter Windows oder macOS mit einer Node.js-Version vor 24.15.0,
368
+ richtet es eine private unterstützte Laufzeit ein und startet damit neu. Ab
369
+ BLUN King 9.1.135 steht das Verzeichnis dieser verwalteten Laufzeit auch im
370
+ `PATH` des Ersatzprozesses und aller untergeordneten Werkzeuge an erster Stelle.
371
+
372
+ Dadurch verwenden vom Agenten gestartete Befehle wie `node` und `npm` dieselbe
373
+ unterstützte Laufzeit wie die TUI, statt auf eine ältere Systeminstallation
374
+ zurückzufallen. Die globale Node-Installation des Systems wird nicht verändert.
375
+ OAuth, gespeicherte Anmeldedaten, Sitzungen und der Updatestatus bleiben
376
+ unverändert.
377
+
363
378
  ## Aktualisieren
364
379
 
365
380
  `blun update`, `king update` und die jeweilige Variante `upgrade` verwenden
@@ -310,11 +310,32 @@ function installTelegramForProfile(packageRoot, blunDir) {
310
310
  }
311
311
  }
312
312
 
313
+ function createManagedNodeEnvironment(binary, env = process.env, platform = process.platform) {
314
+ const pathImpl = platform === 'win32' ? path.win32 : path.posix;
315
+ const separator = platform === 'win32' ? path.win32.delimiter : path.posix.delimiter;
316
+ const pathKeys = Object.keys(env).filter((key) => key.toLowerCase() === 'path');
317
+ const targetKey = pathKeys[0] || (platform === 'win32' ? 'Path' : 'PATH');
318
+ const managedDirectory = pathImpl.dirname(pathImpl.resolve(binary));
319
+ const normalize = (value) => {
320
+ const resolved = pathImpl.normalize(value);
321
+ return platform === 'win32' ? resolved.toLowerCase() : resolved;
322
+ };
323
+ const managedIdentity = normalize(managedDirectory);
324
+ const existing = pathKeys.flatMap((key) => String(env[key] || '').split(separator))
325
+ .map((entry) => entry.trim())
326
+ .filter(Boolean)
327
+ .filter((entry) => normalize(entry) !== managedIdentity);
328
+ const result = { ...env };
329
+ for (const key of pathKeys) delete result[key];
330
+ result[targetKey] = [managedDirectory, ...existing].join(separator);
331
+ return result;
332
+ }
333
+
313
334
  function spawnManagedLauncher(binary, cwd) {
314
335
  return new Promise((resolve, reject) => {
315
336
  const child = spawn(binary, process.argv.slice(1), {
316
337
  cwd,
317
- env: process.env,
338
+ env: createManagedNodeEnvironment(binary, process.env, process.platform),
318
339
  stdio: 'inherit',
319
340
  windowsHide: true,
320
341
  });
@@ -590,6 +611,7 @@ async function runLauncher(options = {}) {
590
611
  }
591
612
 
592
613
  module.exports = {
614
+ createManagedNodeEnvironment,
593
615
  resolveLauncherPrivatePaths,
594
616
  runLauncher,
595
617
  shouldDetachProtectedCore,
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ const MAX_UNADDRESSED_TELEGRAM_CONTEXT_CHARS = 2000;
4
+
5
+ function trimDanglingHighSurrogate(value) {
6
+ if (value.length === 0) return value;
7
+ const last = value.charCodeAt(value.length - 1);
8
+ return last >= 0xd800 && last <= 0xdbff ? value.slice(0, -1) : value;
9
+ }
10
+
11
+ function trimLeadingLowSurrogate(value) {
12
+ if (value.length === 0) return value;
13
+ const first = value.charCodeAt(0);
14
+ return first >= 0xdc00 && first <= 0xdfff ? value.slice(1) : value;
15
+ }
16
+
17
+ function projectUnaddressedTelegramContext(
18
+ tag,
19
+ maxChars = MAX_UNADDRESSED_TELEGRAM_CONTEXT_CHARS,
20
+ ) {
21
+ if (typeof tag !== 'string') return '';
22
+ if (!Number.isInteger(maxChars) || maxChars < 1 || tag.length <= maxChars) return tag;
23
+
24
+ const marker = `\n[Telegram-Kontext gekuerzt; Original: ${tag.length} Zeichen]\n`;
25
+ if (marker.length >= maxChars) return marker.slice(0, maxChars);
26
+
27
+ const retainedChars = maxChars - marker.length;
28
+ const headChars = Math.ceil(retainedChars * 0.6);
29
+ const tailChars = retainedChars - headChars;
30
+ const head = trimDanglingHighSurrogate(tag.slice(0, headChars));
31
+ const tail = trimLeadingLowSurrogate(tag.slice(tag.length - tailChars));
32
+
33
+ return `${head}${marker}${tail}`;
34
+ }
35
+
36
+ module.exports = {
37
+ MAX_UNADDRESSED_TELEGRAM_CONTEXT_CHARS,
38
+ projectUnaddressedTelegramContext,
39
+ };
package/blun.mjs CHANGED
@@ -418052,6 +418052,7 @@ registerUiCatalogFragment({
418052
418052
  * This module is dependency-free on purpose: verify-telegram.ts drives the
418053
418053
  * real logic here with a mocked host (no TUI, no session, no Telegram).
418054
418054
  */
418055
+ var { projectUnaddressedTelegramContext } = createRequire(import.meta.url)("./bin/telegram-context-projection-policy.cjs");
418055
418056
  const MAX_BUFFERED_CONTEXT_MESSAGES = 20;
418056
418057
  const MAX_BUFFERED_CONTEXT_CHARS = 24e3;
418057
418058
  const CONTEXT_TRUNCATED_MARKER = "\n[Telegram-Kontext gekuerzt]";
@@ -418077,7 +418078,8 @@ function bufferContext(state, chatId, tag) {
418077
418078
  const buffers = state.bufferedByChat ?? /* @__PURE__ */ new Map();
418078
418079
  state.bufferedByChat = buffers;
418079
418080
  const messages = buffers.get(chatId) ?? [];
418080
- const boundedTag = tag.length <= MAX_BUFFERED_CONTEXT_CHARS ? tag : `${tag.slice(0, MAX_BUFFERED_CONTEXT_CHARS - 28)}${CONTEXT_TRUNCATED_MARKER}`;
418081
+ const projectedTag = projectUnaddressedTelegramContext(tag);
418082
+ const boundedTag = projectedTag.length <= MAX_BUFFERED_CONTEXT_CHARS ? projectedTag : `${projectedTag.slice(0, MAX_BUFFERED_CONTEXT_CHARS - 28)}${CONTEXT_TRUNCATED_MARKER}`;
418081
418083
  messages.push(boundedTag);
418082
418084
  let chars = messages.reduce((sum, message) => sum + message.length, 0);
418083
418085
  while (messages.length > MAX_BUFFERED_CONTEXT_MESSAGES || chars > MAX_BUFFERED_CONTEXT_CHARS) chars -= messages.shift()?.length ?? 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blun-king-cli",
3
- "version": "9.1.133",
3
+ "version": "9.1.135",
4
4
  "description": "BLUN CLI - your own AI agent with a Telegram channel. Get it done. With BLUN.",
5
5
  "license": "MIT",
6
6
  "bin": {