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 +16 -0
- package/README.md +15 -0
- package/bin/launcher-runtime.js +23 -1
- package/bin/telegram-context-projection-policy.cjs +39 -0
- package/blun.mjs +3 -1
- package/package.json +1 -1
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
|
package/bin/launcher-runtime.js
CHANGED
|
@@ -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
|
|
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;
|