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 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.87
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.87
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. Erreicht der aktive Verlauf 75 Prozent des Modellfensters, ersetzt die Modellprojektion ältere große Werkzeugergebnisse sowie große Argumente abgeschlossener Werkzeugaufrufe durch kurze Platzhalter. 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.
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 maxContextTokens = this.agent.config.modelCapabilities.max_context_tokens;
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(" ");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blun-king-cli",
3
- "version": "9.1.87",
3
+ "version": "9.1.89",
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": {