blun-king-cli 9.1.87 → 9.1.89
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 +3 -1
- package/README.md +5 -3
- package/bin/read-continuation-policy.cjs +18 -0
- package/blun.mjs +15 -4
- package/package.json +1 -1
package/LIESMICH.txt
CHANGED
|
@@ -9,7 +9,7 @@ Installation
|
|
|
9
9
|
------------
|
|
10
10
|
Die geprüfte Version exakt global installieren:
|
|
11
11
|
|
|
12
|
-
npm install -g blun-king-cli@9.1.
|
|
12
|
+
npm install -g blun-king-cli@9.1.89
|
|
13
13
|
|
|
14
14
|
Start
|
|
15
15
|
-----
|
|
@@ -89,6 +89,8 @@ Dabei werden keine gespeicherten Nachrichten geändert oder gelöscht. Fortsetze
|
|
|
89
89
|
|
|
90
90
|
Große textbasierte Werkzeugergebnisse bleiben nicht mehr vollständig im Modellkontext. Ab 12.001 Zeichen speichert BLUN King das vollständige Ergebnis in einer privaten Datei im Sitzungsordner `tool-results`. Im Modellkontext verbleiben die ersten 1.000 und die letzten 1.000 Zeichen, die genaue Zahl der ausgelassenen Zeichen und der `output_path`. Der Agent kann das vollständige Ergebnis anschließend mit `Read` seitenweise über diesen Pfad lesen. Ergebnisse bis einschließlich 12.000 Zeichen, gemischte Medienergebnisse und bereits gekürzte Ergebnisse bleiben unverändert. Auch eine spätere Mikroverdichtung bewahrt den Dateiverweis. Beispiel: Bei einem Suchergebnis mit 30.000 Zeichen sehen folgende Modellanfragen den Anfang und das abschließende Ergebnis oder den Fehler; der vollständige Text bleibt lokal verfügbar.
|
|
91
91
|
|
|
92
|
+
Große Dateien werden weiterhin seitenweise gelesen. Erreicht `Read` seine interne Grenze von 1.000 Zeilen und enthält die Datei weitere Zeilen, nennt das Ergebnis jetzt den exakten nächsten `line_offset`. Beispiel: Ein Lesevorgang ab Zeile 2001 wird mit `line_offset=3001` fortgesetzt. Am Dateiende und bei einem bewusst kleineren Leseausschnitt erscheint kein Fortsetzungshinweis. Dadurch zieht der Agent keine Schlüsse aus einem unvollständigen Ausschnitt und liest die Datei nicht erneut ab der ersten Zeile.
|
|
93
|
+
|
|
92
94
|
Das Telemetrieereignis `tool_result_offloaded` enthält ausschließlich `tool_name`, `output_size_chars`, `output_size_bytes` und `preview_size_chars`. Es enthält weder den Inhalt noch den Speicherpfad. Beispiel: Eine Ausgabe mit 80.000 Zeichen erzeugt eine Vorschau mit 2.000 Zeichen; die Telemetrie zeigt die Größenersparnis, ohne Nutzdaten zu protokollieren.
|
|
93
95
|
|
|
94
96
|
Reguläre `Agent`-Teilaufgaben verwenden eine eigene `ContextMemory` und eine eigene `wire.jsonl` in einem getrennten Agentenverzeichnis. Der Hauptagent erhält nur die Ergebniszusammenfassung, sodass lange Teilaufgaben nicht den Hauptverlauf füllen. `TodoList` speichert Pläne weiterhin maschinenlesbar im Sitzungs-Wire; `blun handoff` übergibt sie zusammen mit prüfbaren Hashes zwischen CLI, Desktop und Web.
|
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@ Voraussetzung ist Node.js 24.15 oder neuer. Die geprüfte Version wird exakt
|
|
|
9
9
|
installiert:
|
|
10
10
|
|
|
11
11
|
```powershell
|
|
12
|
-
npm install -g blun-king-cli@9.1.
|
|
12
|
+
npm install -g blun-king-cli@9.1.89
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
## Reproduzierbares Staging und Packen
|
|
@@ -101,14 +101,16 @@ doppelten Namen bleiben unverändert.
|
|
|
101
101
|
|
|
102
102
|
## Kontextentlastung bei langen Sitzungen
|
|
103
103
|
|
|
104
|
-
King bewahrt den vollständigen Verlauf weiterhin im Sitzungs-Wire auf.
|
|
104
|
+
King bewahrt den vollständigen Verlauf weiterhin im Sitzungs-Wire auf. Bei 75 Prozent der wirksamen Verdichtungsgrenze ersetzt die Modellprojektion ältere große Werkzeugergebnisse sowie große Argumente abgeschlossener Werkzeugaufrufe durch kurze Platzhalter. Die Druckmessung verwendet die frühere Grenze aus Modellfenster und Vollverdichtungsbudget; bei einem Modellfenster von 1.048.576 Token und einer Vollverdichtung bei 256.000 Token liegt der Mikrodruckpunkt daher bei 192.000 Token. Werkzeugargumente werden nur entlastet, wenn ein zugehöriges Werkzeugergebnis vorliegt und die gespeicherten Argumente gültiges JSON sind. Die letzten 20 Nachrichten bleiben unverändert. Solange der Prefix-Cache warm ist, wird der Schnitt höchstens nach jeweils 20 weiteren Nachrichten verschoben. Nach einer Stunde ohne Modellantwort darf er sofort nachziehen.
|
|
105
105
|
|
|
106
|
-
Dabei werden keine gespeicherten Nachrichten geändert oder gelöscht. Fortsetzen, Exportieren und die sichtbare Historie behalten die ursprünglichen Werkzeugergebnisse und Werkzeugargumente. Das Telemetrieereignis `micro_compaction_finished` nennt den Auslöser, den Schnitt und die geschätzte Tokenzahl vor und nach der Entlastung. Außerdem zählt es getrennt, wie viele Werkzeugergebnisse und Werkzeugargumente entlastet wurden. Der Sitzungsinspektor summiert zusätzlich die eingesparten Argument-Token, ohne Inhalte offenzulegen. Beispiel: Ein früherer `Write`-Aufruf mit einem vollständigen Dateiinhalt bleibt im Wire erhalten; die Modellprojektion trägt nur noch einen Platzhalter, sobald für diesen `Write`-Aufruf ein zugehöriges Ergebnis vorliegt.
|
|
106
|
+
Dabei werden keine gespeicherten Nachrichten geändert oder gelöscht. Fortsetzen, Exportieren und die sichtbare Historie behalten die ursprünglichen Werkzeugergebnisse und Werkzeugargumente. Das Telemetrieereignis `micro_compaction_finished` nennt den Auslöser, den Schnitt, die verwendete Druckgrenze, das Modellfenster und die geschätzte Tokenzahl vor und nach der Entlastung. Außerdem zählt es getrennt, wie viele Werkzeugergebnisse und Werkzeugargumente entlastet wurden. Der Sitzungsinspektor summiert zusätzlich die eingesparten Argument-Token, ohne Inhalte offenzulegen. Beispiel: Ein früherer `Write`-Aufruf mit einem vollständigen Dateiinhalt bleibt im Wire erhalten; die Modellprojektion trägt nur noch einen Platzhalter, sobald für diesen `Write`-Aufruf ein zugehöriges Ergebnis vorliegt.
|
|
107
107
|
|
|
108
108
|
## Große Werkzeugausgaben und isolierte Teilagenten
|
|
109
109
|
|
|
110
110
|
Große textbasierte Werkzeugergebnisse bleiben nicht mehr vollständig im Modellkontext. Ab 12.001 Zeichen speichert BLUN King das vollständige Ergebnis in einer privaten Datei im Sitzungsordner `tool-results`. Im Modellkontext verbleiben die ersten 1.000 und die letzten 1.000 Zeichen, die genaue Zahl der ausgelassenen Zeichen und der `output_path`. Der Agent kann das vollständige Ergebnis anschließend mit `Read` seitenweise über diesen Pfad lesen. Ergebnisse bis einschließlich 12.000 Zeichen, gemischte Medienergebnisse und bereits gekürzte Ergebnisse bleiben unverändert. Auch eine spätere Mikroverdichtung bewahrt den Dateiverweis. Beispiel: Bei einem Suchergebnis mit 30.000 Zeichen sehen folgende Modellanfragen den Anfang und das abschließende Ergebnis oder den Fehler; der vollständige Text bleibt lokal verfügbar.
|
|
111
111
|
|
|
112
|
+
Große Dateien werden weiterhin seitenweise gelesen. Erreicht `Read` seine interne Grenze von 1.000 Zeilen und enthält die Datei weitere Zeilen, nennt das Ergebnis jetzt den exakten nächsten `line_offset`. Beispiel: Ein Lesevorgang ab Zeile 2001 wird mit `line_offset=3001` fortgesetzt. Am Dateiende und bei einem bewusst kleineren Leseausschnitt erscheint kein Fortsetzungshinweis. Dadurch zieht der Agent keine Schlüsse aus einem unvollständigen Ausschnitt und liest die Datei nicht erneut ab der ersten Zeile.
|
|
113
|
+
|
|
112
114
|
Das Telemetrieereignis `tool_result_offloaded` enthält ausschließlich `tool_name`, `output_size_chars`, `output_size_bytes` und `preview_size_chars`. Es enthält weder den Inhalt noch den Speicherpfad. Beispiel: Eine Ausgabe mit 80.000 Zeichen erzeugt eine Vorschau mit 2.000 Zeichen; die Telemetrie zeigt die Größenersparnis, ohne Nutzdaten zu protokollieren.
|
|
113
115
|
|
|
114
116
|
Reguläre `Agent`-Teilaufgaben verwenden eine eigene `ContextMemory` und eine eigene `wire.jsonl` in einem getrennten Agentenverzeichnis. Der Hauptagent erhält nur die Ergebniszusammenfassung, sodass lange Teilaufgaben nicht den Hauptverlauf füllen. `TodoList` speichert Pläne weiterhin maschinenlesbar im Sitzungs-Wire; `blun handoff` übergibt sie zusammen mit prüfbaren Hashes zwischen CLI, Desktop und Web.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const READ_LINE_CAP = 1000;
|
|
4
|
+
|
|
5
|
+
function readContinuationNotice(input) {
|
|
6
|
+
if (input?.maxLinesReached !== true) return undefined;
|
|
7
|
+
if (!Number.isSafeInteger(input.lineOffset) || input.lineOffset < 1) return undefined;
|
|
8
|
+
if (!Number.isSafeInteger(input.effectiveLimit) || input.effectiveLimit < READ_LINE_CAP) return undefined;
|
|
9
|
+
|
|
10
|
+
const nextLineOffset = input.lineOffset + input.effectiveLimit;
|
|
11
|
+
if (!Number.isSafeInteger(nextLineOffset)) return undefined;
|
|
12
|
+
return `Continue reading with line_offset=${String(nextLineOffset)}. Do not assume you have reached the end of the file.`;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
module.exports = {
|
|
16
|
+
READ_LINE_CAP,
|
|
17
|
+
readContinuationNotice,
|
|
18
|
+
};
|
package/blun.mjs
CHANGED
|
@@ -75950,7 +75950,9 @@ var init_micro = __esmMin((() => {
|
|
|
75950
75950
|
detect() {
|
|
75951
75951
|
const config = this.config;
|
|
75952
75952
|
const { history, lastAssistantAt } = this.agent.context;
|
|
75953
|
-
const
|
|
75953
|
+
const modelContextTokens = this.agent.config.modelCapabilities.max_context_tokens;
|
|
75954
|
+
const compactionBudgetTokens = this.agent.fullCompaction?.getCompactionBudgetTokens();
|
|
75955
|
+
const maxContextTokens = Number.isFinite(compactionBudgetTokens) && compactionBudgetTokens > 0 && (modelContextTokens <= 0 || compactionBudgetTokens < modelContextTokens) ? compactionBudgetTokens : modelContextTokens;
|
|
75954
75956
|
const contextTokens = this.agent.context.tokenCountWithPending;
|
|
75955
75957
|
const selection = selectMicroCompactionCutoff({
|
|
75956
75958
|
historyLength: history.length,
|
|
@@ -75981,6 +75983,8 @@ var init_micro = __esmMin((() => {
|
|
|
75981
75983
|
truncated_arguments_marker: config.truncatedArgumentsMarker,
|
|
75982
75984
|
min_context_usage_ratio: config.minContextUsageRatio,
|
|
75983
75985
|
context_usage_ratio: selection.contextUsageRatio,
|
|
75986
|
+
pressure_window_tokens: maxContextTokens,
|
|
75987
|
+
model_context_tokens: modelContextTokens,
|
|
75984
75988
|
truncated_tool_result_count: effect.truncatedToolResultCount,
|
|
75985
75989
|
truncated_tool_result_tokens_before: effect.truncatedToolResultTokensBefore,
|
|
75986
75990
|
truncated_tool_result_tokens_after: effect.truncatedToolResultTokensAfter,
|
|
@@ -258599,7 +258603,7 @@ function containsNulByte(text) {
|
|
|
258599
258603
|
function notReadableFileOutput(path) {
|
|
258600
258604
|
return `"${path}" is not readable as UTF-8 text. If it is an image or video, use ReadMediaFile. For other binary formats, use Bash or an MCP tool if available.`;
|
|
258601
258605
|
}
|
|
258602
|
-
var MAX_LINES$1, MAX_LINE_LENGTH, MAX_BYTES, S_IFMT$1, S_IFREG, PositiveLineOffsetSchema, TailLineOffsetSchema, ReadInputSchema, READ_DESCRIPTION, ReadTool;
|
|
258606
|
+
var MAX_LINES$1, MAX_LINE_LENGTH, MAX_BYTES, S_IFMT$1, S_IFREG, PositiveLineOffsetSchema, TailLineOffsetSchema, ReadInputSchema, READ_DESCRIPTION, ReadTool, readContinuationNotice;
|
|
258603
258607
|
var init_read = __esmMin((() => {
|
|
258604
258608
|
init_zod$1();
|
|
258605
258609
|
init_tool_access();
|
|
@@ -258610,6 +258614,7 @@ var init_read = __esmMin((() => {
|
|
|
258610
258614
|
init_rule_match();
|
|
258611
258615
|
init_line_endings();
|
|
258612
258616
|
init_read$1();
|
|
258617
|
+
({ readContinuationNotice } = createRequire(import.meta.url)("./bin/read-continuation-policy.cjs"));
|
|
258613
258618
|
MAX_LINES$1 = 1e3;
|
|
258614
258619
|
MAX_LINE_LENGTH = 2e3;
|
|
258615
258620
|
MAX_BYTES = 100 * 1024;
|
|
@@ -258736,7 +258741,9 @@ var init_read = __esmMin((() => {
|
|
|
258736
258741
|
lineEndingStyle,
|
|
258737
258742
|
startLine: selectedEntries.length > 0 ? lineOffset : 0,
|
|
258738
258743
|
totalLines: scan.totalLines,
|
|
258739
|
-
requestedLines
|
|
258744
|
+
requestedLines,
|
|
258745
|
+
lineOffset,
|
|
258746
|
+
effectiveLimit
|
|
258740
258747
|
});
|
|
258741
258748
|
}
|
|
258742
258749
|
const selectedEntries = [];
|
|
@@ -258781,7 +258788,9 @@ var init_read = __esmMin((() => {
|
|
|
258781
258788
|
lineEndingStyle,
|
|
258782
258789
|
startLine: selectedEntries.length > 0 ? lineOffset : 0,
|
|
258783
258790
|
totalLines: currentLineNo,
|
|
258784
|
-
requestedLines
|
|
258791
|
+
requestedLines,
|
|
258792
|
+
lineOffset,
|
|
258793
|
+
effectiveLimit
|
|
258785
258794
|
});
|
|
258786
258795
|
}
|
|
258787
258796
|
async readTail(safePath, displayPath, lineOffset, effectiveLimit, requestedLines) {
|
|
@@ -258896,6 +258905,8 @@ var init_read = __esmMin((() => {
|
|
|
258896
258905
|
if (input.maxLinesReached) parts.push(`Max ${String(MAX_LINES$1)} lines reached.`);
|
|
258897
258906
|
else if (input.maxBytesReached) parts.push(`Max ${String(MAX_BYTES)} bytes reached.`);
|
|
258898
258907
|
else if (lineCount < input.requestedLines) parts.push("End of file reached.");
|
|
258908
|
+
const continuationNotice = readContinuationNotice(input);
|
|
258909
|
+
if (continuationNotice !== void 0) parts.push(continuationNotice);
|
|
258899
258910
|
if (input.truncatedLineNumbers.length > 0) parts.push(`Lines [${input.truncatedLineNumbers.join(", ")}] were truncated.`);
|
|
258900
258911
|
if (input.lineEndingStyle === "mixed") parts.push("Mixed or lone carriage-return line endings are shown as \\r. Use exact \\r\\n or \\r escapes in Edit.old_string for those lines.");
|
|
258901
258912
|
return parts.join(" ");
|