blun-king-cli 9.1.127 → 9.1.129

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
@@ -115,6 +115,10 @@ Version 9.1.109 hält nur noch die neun Werkzeuge dauerhaft in der Modellanfrage
115
115
 
116
116
  Version 9.1.127 verkürzt zusätzlich den wiederholten `ToolSearch`-Katalog. Eindeutige zurückgestellte Werkzeuge erscheinen dort nur noch mit ihrem kurzen Selektor; nur bei gleichnamigen Werkzeugen bleibt der vollständige Name stehen. Suche, exakte Auswahl, Telegram-Anhänge und bereits geladene Werkzeuge funktionieren unverändert. Dadurch kennt King weiterhin alle verfügbaren Werkzeuge, sendet aber die langen MCP-Namensräume nicht mehr bei jedem Modellschritt erneut.
117
117
 
118
+ Version 9.1.128 begrenzt außerdem den dauerhaften Cache nachgeladener Werkzeug-Schemas auf die zwölf zuletzt ausgewählten Werkzeuge. Ein erneut ausgewähltes Werkzeug rückt ans Ende und bleibt erhalten; nur die ältesten, lange nicht verwendeten Schemas fallen aus der nächsten Modellanfrage und sind weiterhin sofort über `ToolSearch` auffindbar. Werkzeuge des laufenden Schritts bleiben vollständig verfügbar. Dadurch kann die Schemalast auch in sehr langen Sitzungen nicht ungebremst anwachsen.
119
+
120
+ Version 9.1.129 entfernt in langen Sitzungen außerdem die Vorschautexte aus älteren, bereits ausgelagerten Werkzeugergebnissen. Im aktuellen Arbeitsfenster bleiben die letzten 20 Nachrichten vollständig lesbar; ältere Verweise behalten Pfad und Größenangaben, während der vollständige Inhalt unverändert in der Originaldatei oder im privaten Archiv liegt. In Fredriks aktuellem Verlauf spart das pro Anfrage zusätzlich 8.258 Zeichen, also rund 2.065 Token.
121
+
118
122
  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.
119
123
 
120
124
  Ab BLUN King 9.1.119 enthält der bei jedem Modellschritt erneut gesendete Prompt nur noch eine kleine Auswahl häufig benötigter Skills. Alle übrigen registrierten Skills bleiben verfügbar und lassen sich über das Skill-Werkzeug anhand ihres Namens oder Zwecks suchen; der ausgewählte Skill wird anschließend bei Bedarf geladen. Dadurch sinkt die wiederholt übertragene Promptlast, ohne Skills zu löschen oder die vollständige Ansicht unter `/skills` einzuschränken.
package/README.md CHANGED
@@ -121,6 +121,10 @@ Version 9.1.109 hält nur noch die neun Werkzeuge dauerhaft in der Modellanfrage
121
121
 
122
122
  Version 9.1.127 verkürzt zusätzlich den wiederholten `ToolSearch`-Katalog. Eindeutige zurückgestellte Werkzeuge erscheinen dort nur noch mit ihrem kurzen Selektor; nur bei gleichnamigen Werkzeugen bleibt der vollständige Name stehen. Suche, exakte Auswahl, Telegram-Anhänge und bereits geladene Werkzeuge funktionieren unverändert. Dadurch kennt King weiterhin alle verfügbaren Werkzeuge, sendet aber die langen MCP-Namensräume nicht mehr bei jedem Modellschritt erneut.
123
123
 
124
+ Version 9.1.128 begrenzt außerdem den dauerhaften Cache nachgeladener Werkzeug-Schemas auf die zwölf zuletzt ausgewählten Werkzeuge. Ein erneut ausgewähltes Werkzeug rückt ans Ende und bleibt erhalten; nur die ältesten, lange nicht verwendeten Schemas fallen aus der nächsten Modellanfrage und sind weiterhin sofort über `ToolSearch` auffindbar. Werkzeuge des laufenden Schritts bleiben vollständig verfügbar. Dadurch kann die Schemalast auch in sehr langen Sitzungen nicht ungebremst anwachsen.
125
+
126
+ Version 9.1.129 entfernt in langen Sitzungen außerdem die Vorschautexte aus älteren, bereits ausgelagerten Werkzeugergebnissen. Im aktuellen Arbeitsfenster bleiben die letzten 20 Nachrichten vollständig lesbar; ältere Verweise behalten Pfad und Größenangaben, während der vollständige Inhalt unverändert in der Originaldatei oder im privaten Archiv liegt. In Fredriks aktuellem Verlauf spart das pro Anfrage zusätzlich 8.258 Zeichen, also rund 2.065 Token.
127
+
124
128
  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.
125
129
 
126
130
  Ab BLUN King 9.1.119 enthält der bei jedem Modellschritt erneut gesendete Prompt nur noch eine kleine Auswahl häufig benötigter Skills. Alle übrigen registrierten Skills bleiben verfügbar und lassen sich über das Skill-Werkzeug anhand ihres Namens oder Zwecks suchen; der ausgewählte Skill wird anschließend bei Bedarf geladen. Dadurch sinkt die wiederholt übertragene Promptlast, ohne Skills zu löschen oder die vollständige Ansicht unter `/skills` einzuschränken.
@@ -35,6 +35,24 @@ function isPersistedToolResultReference(content) {
35
35
  });
36
36
  }
37
37
 
38
+ function compactPersistedToolResultReference(content) {
39
+ if (!isPersistedToolResultReference(content)) return content;
40
+
41
+ let changed = false;
42
+ const compacted = content.map((part) => {
43
+ if (part?.type !== 'text' || typeof part.text !== 'string') return part;
44
+ const previewIndex = part.text.indexOf('\n[preview: head and tail]\n');
45
+ if (previewIndex < 0) return part;
46
+ changed = true;
47
+ return {
48
+ ...part,
49
+ text: part.text.slice(0, previewIndex).trimEnd(),
50
+ };
51
+ });
52
+
53
+ return changed ? compacted : content;
54
+ }
55
+
38
56
  function selectToolResultBatchOffloads(textLengths) {
39
57
  if (!Array.isArray(textLengths) || textLengths.length < 2) return [];
40
58
 
@@ -105,6 +123,7 @@ module.exports = {
105
123
  TOOL_RESULT_MAX_CHARS,
106
124
  TOOL_RESULT_PREVIEW_CHARS,
107
125
  TOOL_RESULT_OFFLOAD_MARKER,
126
+ compactPersistedToolResultReference,
108
127
  createToolResultPreview,
109
128
  isPersistedToolResultReference,
110
129
  selectHistoricalToolResultOffloads,
@@ -3,6 +3,7 @@
3
3
  const TOOL_SCHEMA_BUDGET_RATIO = 0.25;
4
4
  const TOOL_SCHEMA_MAX_TOKENS = 32_000;
5
5
  const DEFERRED_TOOL_LOADER_NAME = 'ToolSearch';
6
+ const MAX_PERSISTENT_DEFERRED_TOOLS = 12;
6
7
  const CORE_TOOL_NAMES = Object.freeze([
7
8
  'Bash',
8
9
  'Read',
@@ -65,6 +66,14 @@ function searchDeferredTools(tools, query) {
65
66
  }).filter(Boolean).sort((left, right) => right.score - left.score || String(left.tool.name).localeCompare(String(right.tool.name))).slice(0, 5).map((entry) => entry.tool);
66
67
  }
67
68
 
69
+ function rememberLoadedTool(loadedToolNames, name) {
70
+ loadedToolNames.delete(name);
71
+ loadedToolNames.add(name);
72
+ while (loadedToolNames.size > MAX_PERSISTENT_DEFERRED_TOOLS) {
73
+ loadedToolNames.delete(loadedToolNames.values().next().value);
74
+ }
75
+ }
76
+
68
77
  function createDeferredToolLoader(selectedTools, deferredTools, loadedToolNames = new Set()) {
69
78
  if (!Array.isArray(selectedTools)) throw new TypeError('selectedTools must be an array');
70
79
  if (!(loadedToolNames instanceof Set)) throw new TypeError('loadedToolNames must be a Set');
@@ -80,7 +89,7 @@ function createDeferredToolLoader(selectedTools, deferredTools, loadedToolNames
80
89
  description: [
81
90
  'Find and load deferred tool schemas into this running session.',
82
91
  'Use select:leaf_name for one known tool, plain keywords to search, or +word to require that word in the tool name.',
83
- 'Loaded tools are available in the next step and remain loaded for this session.',
92
+ `Loaded tools are available in the next step; the ${MAX_PERSISTENT_DEFERRED_TOOLS} most recently selected schemas remain loaded.`,
84
93
  `Available deferred selectors: ${catalog.join(', ')}`,
85
94
  ].join('\n'),
86
95
  parameters: {
@@ -129,7 +138,7 @@ function createDeferredToolLoader(selectedTools, deferredTools, loadedToolNames
129
138
  for (const tool of matches) {
130
139
  const name = String(tool.name);
131
140
  if (!selectedTools.some((candidate) => candidate?.name === name)) selectedTools.push(tool);
132
- loadedToolNames.add(name);
141
+ rememberLoadedTool(loadedToolNames, name);
133
142
  loaded.push(name);
134
143
  }
135
144
  return {
@@ -145,6 +154,7 @@ function createDeferredToolLoader(selectedTools, deferredTools, loadedToolNames
145
154
  module.exports = {
146
155
  CORE_TOOL_NAMES,
147
156
  DEFERRED_TOOL_LOADER_NAME,
157
+ MAX_PERSISTENT_DEFERRED_TOOLS,
148
158
  TOOL_SCHEMA_BUDGET_RATIO,
149
159
  TOOL_SCHEMA_MAX_TOKENS,
150
160
  createDeferredToolLoader,
package/blun.mjs CHANGED
@@ -260382,7 +260382,7 @@ function renderHistoricalToolResultReference(toolName, toolCallId, text, outputP
260382
260382
  function safeToolResultFileStem(toolName, toolCallId) {
260383
260383
  return `${toolName}-${toolCallId}`.replace(/[^a-zA-Z0-9._-]+/g, "_").replace(/^_+|_+$/g, "").slice(0, 80) || "tool-result";
260384
260384
  }
260385
- var TOOL_RESULT_MAX_CHARS, TOOL_RESULT_PREVIEW_CHARS, TOOL_RESULT_OFFLOAD_MARKER, TOOL_RESULT_HISTORICAL_KEEP_RECENT_MESSAGES, shouldOffloadToolResult, createToolResultPreview, selectToolResultBatchOffloads, selectHistoricalToolResultOffloads, buildToolResultOffloadTelemetry;
260385
+ var TOOL_RESULT_MAX_CHARS, TOOL_RESULT_PREVIEW_CHARS, TOOL_RESULT_OFFLOAD_MARKER, TOOL_RESULT_HISTORICAL_KEEP_RECENT_MESSAGES, shouldOffloadToolResult, createToolResultPreview, compactPersistedToolResultReference, selectToolResultBatchOffloads, selectHistoricalToolResultOffloads, buildToolResultOffloadTelemetry;
260386
260386
  var init_tool_result_budget = __esmMin((() => {
260387
260387
  init_dist$6();
260388
260388
  const toolResultOffloadPolicy = createRequire(import.meta.url)("./bin/tool-result-offload-policy.cjs");
@@ -260393,6 +260393,7 @@ var init_tool_result_budget = __esmMin((() => {
260393
260393
  TOOL_RESULT_HISTORICAL_KEEP_RECENT_MESSAGES = toolResultOffloadPolicy.TOOL_RESULT_HISTORICAL_KEEP_RECENT_MESSAGES;
260394
260394
  shouldOffloadToolResult = toolResultOffloadPolicy.shouldOffloadToolResult;
260395
260395
  createToolResultPreview = toolResultOffloadPolicy.createToolResultPreview;
260396
+ compactPersistedToolResultReference = toolResultOffloadPolicy.compactPersistedToolResultReference;
260396
260397
  selectToolResultBatchOffloads = toolResultOffloadPolicy.selectToolResultBatchOffloads;
260397
260398
  selectHistoricalToolResultOffloads = toolResultOffloadPolicy.selectHistoricalToolResultOffloads;
260398
260399
  }));
@@ -260497,15 +260498,29 @@ var ToolResultBatchOffload = class {
260497
260498
  });
260498
260499
  }
260499
260500
  compact(messages) {
260500
- if (this.replacements.size === 0) return messages;
260501
- return messages.map((message) => {
260501
+ const recentStart = Math.max(0, messages.length - TOOL_RESULT_HISTORICAL_KEEP_RECENT_MESSAGES);
260502
+ let changed = false;
260503
+ const projected = messages.map((message, index) => {
260502
260504
  if (message.role !== "tool" || message.toolCallId === void 0) return message;
260503
260505
  const content = this.replacements.get(message.toolCallId);
260504
- return content === void 0 ? message : {
260506
+ if (content !== void 0) {
260507
+ changed = true;
260508
+ const projectedContent = index < recentStart ? compactPersistedToolResultReference(content) : content;
260509
+ return {
260510
+ ...message,
260511
+ content: projectedContent
260512
+ };
260513
+ }
260514
+ if (index >= recentStart) return message;
260515
+ const compactedContent = compactPersistedToolResultReference(message.content);
260516
+ if (compactedContent === message.content) return message;
260517
+ changed = true;
260518
+ return {
260505
260519
  ...message,
260506
- content
260520
+ content: compactedContent
260507
260521
  };
260508
260522
  });
260523
+ return changed ? projected : messages;
260509
260524
  }
260510
260525
  reset(history = this.agent.context?.history ?? []) {
260511
260526
  const activeIds = new Set(history.filter((message) => message.role === "tool" && message.toolCallId !== void 0).map((message) => message.toolCallId));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blun-king-cli",
3
- "version": "9.1.127",
3
+ "version": "9.1.129",
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": {