blun-king-cli 9.1.85 → 9.1.87

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.85
12
+ npm install -g blun-king-cli@9.1.87
13
13
 
14
14
  Start
15
15
  -----
@@ -50,6 +50,13 @@ FIFO-Warteschlange. Für diesen normalen Wartestatus erscheint kein
50
50
 
51
51
  Zuverlässiger King-Start
52
52
  -----------------------
53
+ Bei einer ausdrücklich als wiederholbar gekennzeichneten Serverüberlastung
54
+ (HTTP 429 mit x-should-retry: true) wartet BLUN King gemäß Retry-After und
55
+ sendet dieselbe Anfrage höchstens zweimal erneut. Authentifizierungs-,
56
+ Kontingent- und andere nicht wiederholbare Fehler brechen weiterhin sofort ab.
57
+ Bleibt der Server nach den begrenzten Versuchen überlastet, erhält der Nutzer
58
+ weiterhin die klare Fehlermeldung.
59
+
53
60
  Der Windows-Hilfsprozess für private Pfade übernimmt TEMP und TMP aus der
54
61
  Benutzersitzung. Dadurch arbeitet die ACL-Prüfung auch unter einem normalen
55
62
  Benutzerkonto. Bei einem Fehler wird die tatsächliche Ursache des
@@ -80,7 +87,7 @@ Dabei werden keine gespeicherten Nachrichten geändert oder gelöscht. Fortsetze
80
87
 
81
88
  ## Große Werkzeugausgaben und isolierte Teilagenten
82
89
 
83
- 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 eine Vorschau mit 2.000 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 enthalten die folgenden Modellanfragen nur noch die Vorschau und den lesbaren Pfad; der vollständige Text bleibt lokal verfügbar.
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.
84
91
 
85
92
  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.
86
93
 
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.85
12
+ npm install -g blun-king-cli@9.1.87
13
13
  ```
14
14
 
15
15
  ## Reproduzierbares Staging und Packen
@@ -72,6 +72,11 @@ Geistervorschlägen, Bash-Eingabe und einer noch offenen Mehrzeileneingabe.
72
72
 
73
73
  ## Zuverlässiger King-Start
74
74
 
75
+ Bei einer vom Server ausdrücklich als wiederholbar gekennzeichneten
76
+ Überlastung (`HTTP 429`, `x-should-retry: true`) wartet BLUN King entsprechend
77
+ `Retry-After` und sendet dieselbe Anfrage höchstens zweimal erneut. Andere
78
+ Fehler und dauerhaft überlastete Server bleiben klar begrenzt und sichtbar.
79
+
75
80
  Der Windows-Hilfsprozess für private Pfade übernimmt `TEMP` und `TMP` aus der
76
81
  Benutzersitzung. Dadurch kann der C#-Compiler für die ACL-Prüfung auch unter
77
82
  einem normalen Benutzerkonto arbeiten. Scheitert der Unterprozess, nennt die
@@ -102,7 +107,7 @@ Dabei werden keine gespeicherten Nachrichten geändert oder gelöscht. Fortsetze
102
107
 
103
108
  ## Große Werkzeugausgaben und isolierte Teilagenten
104
109
 
105
- 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 eine Vorschau mit 2.000 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 enthalten die folgenden Modellanfragen nur noch die Vorschau und den lesbaren Pfad; der vollständige Text bleibt lokal verfügbar.
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.
106
111
 
107
112
  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.
108
113
 
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  const MAX_AUTOMATIC_RATE_LIMIT_RESUMES = 3;
4
+ const MAX_EXPLICIT_RATE_LIMIT_RETRIES = 2;
4
5
  const RATE_LIMIT_RETRY_BASE_MS = 60_000;
5
6
  const RATE_LIMIT_COMPACTION_THRESHOLD_TOKENS = 64_000;
6
7
 
@@ -8,6 +9,16 @@ function isImmediateGenerateRetryAllowed(statusCode) {
8
9
  return statusCode !== 429 && [500, 502, 503, 504].includes(statusCode);
9
10
  }
10
11
 
12
+ function resolveTransportRetryBudget(configuredMaxRetries, statusCode, shouldRetryHeader) {
13
+ if (!Number.isInteger(configuredMaxRetries) || configuredMaxRetries < 0) {
14
+ throw new Error("configuredMaxRetries must be a non-negative integer.");
15
+ }
16
+ const explicitRetry = typeof shouldRetryHeader === "string"
17
+ && shouldRetryHeader.trim().toLowerCase() === "true";
18
+ if (statusCode !== 429 || !explicitRetry) return configuredMaxRetries;
19
+ return Math.max(configuredMaxRetries, MAX_EXPLICIT_RATE_LIMIT_RETRIES);
20
+ }
21
+
11
22
  function rateLimitRetryDelayMs(retryCount) {
12
23
  if (!Number.isInteger(retryCount) || retryCount < 1) {
13
24
  throw new Error("retryCount must be a positive integer.");
@@ -26,9 +37,11 @@ function shouldCompactBeforeRateLimitResume(estimatedRequestTokens) {
26
37
 
27
38
  module.exports = {
28
39
  MAX_AUTOMATIC_RATE_LIMIT_RESUMES,
40
+ MAX_EXPLICIT_RATE_LIMIT_RETRIES,
29
41
  RATE_LIMIT_RETRY_BASE_MS,
30
42
  isImmediateGenerateRetryAllowed,
31
43
  rateLimitRetryDelayMs,
44
+ resolveTransportRetryBudget,
32
45
  shouldCompactBeforeRateLimitResume,
33
46
  shouldStopAutomaticRateLimitResume,
34
47
  };
@@ -8,6 +8,15 @@ function shouldOffloadToolResult(textLength) {
8
8
  return Number.isFinite(textLength) && textLength > TOOL_RESULT_MAX_CHARS;
9
9
  }
10
10
 
11
+ function createToolResultPreview(text) {
12
+ if (text.length <= TOOL_RESULT_PREVIEW_CHARS) return text;
13
+
14
+ const headChars = Math.ceil(TOOL_RESULT_PREVIEW_CHARS / 2);
15
+ const tailChars = TOOL_RESULT_PREVIEW_CHARS - headChars;
16
+ const omittedChars = text.length - headChars - tailChars;
17
+ return `${text.slice(0, headChars)}\n\n[... ${String(omittedChars)} characters omitted ...]\n\n${text.slice(-tailChars)}`;
18
+ }
19
+
11
20
  function isPersistedToolResultReference(content) {
12
21
  if (!Array.isArray(content)) return false;
13
22
 
@@ -23,6 +32,7 @@ module.exports = {
23
32
  TOOL_RESULT_MAX_CHARS,
24
33
  TOOL_RESULT_PREVIEW_CHARS,
25
34
  TOOL_RESULT_OFFLOAD_MARKER,
35
+ createToolResultPreview,
26
36
  isPersistedToolResultReference,
27
37
  shouldOffloadToolResult,
28
38
  };
package/blun.mjs CHANGED
@@ -1935,9 +1935,10 @@ function getRecord(value) {
1935
1935
  function getString(value) {
1936
1936
  return typeof value === "string" && value.length > 0 ? value : void 0;
1937
1937
  }
1938
- var DEFAULT_MAX_RETRIES$1, MAX_RETRY_DELAY_MS, FetchTransport, DONE;
1938
+ var DEFAULT_MAX_RETRIES$1, MAX_RETRY_DELAY_MS, resolveTransportRetryBudget, FetchTransport, DONE;
1939
1939
  var init_fetch_http_client = __esmMin((() => {
1940
1940
  init_errors$10();
1941
+ ({ resolveTransportRetryBudget } = createRequire(import.meta.url)("./bin/rate-limit-recovery-policy.cjs"));
1941
1942
  DEFAULT_MAX_RETRIES$1 = 2;
1942
1943
  MAX_RETRY_DELAY_MS = 6e4;
1943
1944
  FetchTransport = class {
@@ -1993,7 +1994,8 @@ var init_fetch_http_client = __esmMin((() => {
1993
1994
  const startedAt = performance.now();
1994
1995
  try {
1995
1996
  const response = await this.fetch(`${this.baseUrl}${pathname}`, init);
1996
- const willRetry = attempt < maxRetries && shouldRetryResponse(response);
1997
+ const retryBudget = resolveTransportRetryBudget(maxRetries, response.status, response.headers.get("x-should-retry"));
1998
+ const willRetry = attempt < retryBudget && shouldRetryResponse(response);
1997
1999
  notifyTransportAttempt(requestOptions?.onTransportAttempt, {
1998
2000
  transportAttempt: attempt + 1,
1999
2001
  ...requestBytes === void 0 ? {} : { requestBytes },
@@ -260020,13 +260022,13 @@ function renderPersistedToolResult(toolName, toolCallId, text, outputPath) {
260020
260022
  `output_path: ${outputPath}`,
260021
260023
  "next_step: Use Read with output_path to page through the full output."
260022
260024
  ];
260023
- lines.push("", "[preview]", text.slice(0, TOOL_RESULT_PREVIEW_CHARS));
260025
+ lines.push("", "[preview: head and tail]", createToolResultPreview(text));
260024
260026
  return lines.join("\n");
260025
260027
  }
260026
260028
  function safeToolResultFileStem(toolName, toolCallId) {
260027
260029
  return `${toolName}-${toolCallId}`.replace(/[^a-zA-Z0-9._-]+/g, "_").replace(/^_+|_+$/g, "").slice(0, 80) || "tool-result";
260028
260030
  }
260029
- var TOOL_RESULT_MAX_CHARS, TOOL_RESULT_PREVIEW_CHARS, TOOL_RESULT_OFFLOAD_MARKER, shouldOffloadToolResult, buildToolResultOffloadTelemetry;
260031
+ var TOOL_RESULT_MAX_CHARS, TOOL_RESULT_PREVIEW_CHARS, TOOL_RESULT_OFFLOAD_MARKER, shouldOffloadToolResult, createToolResultPreview, buildToolResultOffloadTelemetry;
260030
260032
  var init_tool_result_budget = __esmMin((() => {
260031
260033
  init_dist$6();
260032
260034
  const toolResultOffloadPolicy = createRequire(import.meta.url)("./bin/tool-result-offload-policy.cjs");
@@ -260035,6 +260037,7 @@ var init_tool_result_budget = __esmMin((() => {
260035
260037
  TOOL_RESULT_PREVIEW_CHARS = toolResultOffloadPolicy.TOOL_RESULT_PREVIEW_CHARS;
260036
260038
  TOOL_RESULT_OFFLOAD_MARKER = toolResultOffloadPolicy.TOOL_RESULT_OFFLOAD_MARKER;
260037
260039
  shouldOffloadToolResult = toolResultOffloadPolicy.shouldOffloadToolResult;
260040
+ createToolResultPreview = toolResultOffloadPolicy.createToolResultPreview;
260038
260041
  }));
260039
260042
  //#endregion
260040
260043
  //#region ../../packages/agent-core/src/agent/turn/index.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blun-king-cli",
3
- "version": "9.1.85",
3
+ "version": "9.1.87",
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": {