blun-king-cli 9.1.128 → 9.1.130
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 +4 -0
- package/README.md +4 -0
- package/bin/assistant-message-offload-policy.cjs +28 -0
- package/bin/tool-result-offload-policy.cjs +19 -0
- package/blun.mjs +52 -12
- package/package.json +1 -1
package/LIESMICH.txt
CHANGED
|
@@ -117,6 +117,10 @@ Version 9.1.127 verkürzt zusätzlich den wiederholten `ToolSearch`-Katalog. Ein
|
|
|
117
117
|
|
|
118
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
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
|
+
|
|
122
|
+
Ab BLUN King 9.1.130 verdichtet die Modellprojektion zusätzlich die erläuternden Texte älterer, abgeschlossener Werkzeugschritte. Werkzeugnamen, Kennungen, Argumente, Ergebnisse, nicht textbasierte Inhalte und die letzten 20 Nachrichten bleiben unverändert; ausstehende Werkzeugaufrufe werden niemals verdichtet. Auch der gespeicherte Rohverlauf und Exporte bleiben vollständig. In Fredriks aktueller Sitzung verkleinert dies jede weitere Modellanfrage um zusätzliche 15.011 Zeichen, also um etwa 3.753 geschätzte Token.
|
|
123
|
+
|
|
120
124
|
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.
|
|
121
125
|
|
|
122
126
|
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
|
@@ -123,6 +123,10 @@ Version 9.1.127 verkürzt zusätzlich den wiederholten `ToolSearch`-Katalog. Ein
|
|
|
123
123
|
|
|
124
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
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
|
+
|
|
128
|
+
Ab BLUN King 9.1.130 verdichtet die Modellprojektion zusätzlich die erläuternden Texte älterer, abgeschlossener Werkzeugschritte. Werkzeugnamen, Kennungen, Argumente, Ergebnisse, nicht textbasierte Inhalte und die letzten 20 Nachrichten bleiben unverändert; ausstehende Werkzeugaufrufe werden niemals verdichtet. Auch der gespeicherte Rohverlauf und Exporte bleiben vollständig. In Fredriks aktueller Sitzung verkleinert dies jede weitere Modellanfrage um zusätzliche 15.011 Zeichen, also um etwa 3.753 geschätzte Token.
|
|
129
|
+
|
|
126
130
|
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.
|
|
127
131
|
|
|
128
132
|
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.
|
|
@@ -5,6 +5,8 @@ const ASSISTANT_MESSAGE_KEEP_RECENT_MESSAGES = 20;
|
|
|
5
5
|
const ASSISTANT_MESSAGE_PREVIEW_LINES = 5;
|
|
6
6
|
const ASSISTANT_MESSAGE_PREVIEW_LINE_CHARS = 1_000;
|
|
7
7
|
const ASSISTANT_MESSAGE_OFFLOAD_MARKER = '[Assistant message offloaded]';
|
|
8
|
+
const ASSISTANT_TOOL_NARRATION_MIN_CHARS = 120;
|
|
9
|
+
const ASSISTANT_TOOL_NARRATION_MARKER = '[Earlier completed tool-step narration compacted]';
|
|
8
10
|
|
|
9
11
|
function shouldOffloadHistoricalAssistantMessage(options = {}) {
|
|
10
12
|
const historyIndex = Number(options.historyIndex);
|
|
@@ -40,12 +42,38 @@ function createAssistantMessagePreview(text) {
|
|
|
40
42
|
].join('\n');
|
|
41
43
|
}
|
|
42
44
|
|
|
45
|
+
function shouldCompactHistoricalAssistantToolNarration(options = {}) {
|
|
46
|
+
const historyIndex = Number(options.historyIndex);
|
|
47
|
+
const historyLength = Number(options.historyLength);
|
|
48
|
+
const textChars = Number(options.textChars);
|
|
49
|
+
const toolCallCount = Number(options.toolCallCount);
|
|
50
|
+
const completedToolCallCount = Number(options.completedToolCallCount);
|
|
51
|
+
if (
|
|
52
|
+
!Number.isSafeInteger(historyIndex)
|
|
53
|
+
|| !Number.isSafeInteger(historyLength)
|
|
54
|
+
|| !Number.isSafeInteger(textChars)
|
|
55
|
+
|| !Number.isSafeInteger(toolCallCount)
|
|
56
|
+
|| !Number.isSafeInteger(completedToolCallCount)
|
|
57
|
+
|| historyIndex < 0
|
|
58
|
+
|| historyLength < 0
|
|
59
|
+
|| historyIndex >= historyLength
|
|
60
|
+
|| toolCallCount <= 0
|
|
61
|
+
) return false;
|
|
62
|
+
const cutoff = Math.max(0, historyLength - ASSISTANT_MESSAGE_KEEP_RECENT_MESSAGES);
|
|
63
|
+
return historyIndex < cutoff
|
|
64
|
+
&& textChars > ASSISTANT_TOOL_NARRATION_MIN_CHARS
|
|
65
|
+
&& completedToolCallCount === toolCallCount;
|
|
66
|
+
}
|
|
67
|
+
|
|
43
68
|
module.exports = {
|
|
44
69
|
ASSISTANT_MESSAGE_KEEP_RECENT_MESSAGES,
|
|
45
70
|
ASSISTANT_MESSAGE_MAX_CHARS,
|
|
46
71
|
ASSISTANT_MESSAGE_OFFLOAD_MARKER,
|
|
47
72
|
ASSISTANT_MESSAGE_PREVIEW_LINES,
|
|
48
73
|
ASSISTANT_MESSAGE_PREVIEW_LINE_CHARS,
|
|
74
|
+
ASSISTANT_TOOL_NARRATION_MARKER,
|
|
75
|
+
ASSISTANT_TOOL_NARRATION_MIN_CHARS,
|
|
49
76
|
createAssistantMessagePreview,
|
|
77
|
+
shouldCompactHistoricalAssistantToolNarration,
|
|
50
78
|
shouldOffloadHistoricalAssistantMessage,
|
|
51
79
|
};
|
|
@@ -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,
|
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
|
-
|
|
260501
|
-
|
|
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
|
-
|
|
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));
|
|
@@ -260705,12 +260720,14 @@ function renderPersistedAssistantMessage(text, outputPath) {
|
|
|
260705
260720
|
createAssistantMessagePreview(text)
|
|
260706
260721
|
].join("\n");
|
|
260707
260722
|
}
|
|
260708
|
-
var ASSISTANT_MESSAGE_MAX_CHARS, ASSISTANT_MESSAGE_OFFLOAD_MARKER, shouldOffloadHistoricalAssistantMessage, createAssistantMessagePreview;
|
|
260723
|
+
var ASSISTANT_MESSAGE_MAX_CHARS, ASSISTANT_MESSAGE_OFFLOAD_MARKER, ASSISTANT_TOOL_NARRATION_MARKER, shouldOffloadHistoricalAssistantMessage, shouldCompactHistoricalAssistantToolNarration, createAssistantMessagePreview;
|
|
260709
260724
|
var init_assistant_message_offload = __esmMin((() => {
|
|
260710
260725
|
const policy = createRequire(import.meta.url)("./bin/assistant-message-offload-policy.cjs");
|
|
260711
260726
|
ASSISTANT_MESSAGE_MAX_CHARS = policy.ASSISTANT_MESSAGE_MAX_CHARS;
|
|
260712
260727
|
ASSISTANT_MESSAGE_OFFLOAD_MARKER = policy.ASSISTANT_MESSAGE_OFFLOAD_MARKER;
|
|
260728
|
+
ASSISTANT_TOOL_NARRATION_MARKER = policy.ASSISTANT_TOOL_NARRATION_MARKER;
|
|
260713
260729
|
shouldOffloadHistoricalAssistantMessage = policy.shouldOffloadHistoricalAssistantMessage;
|
|
260730
|
+
shouldCompactHistoricalAssistantToolNarration = policy.shouldCompactHistoricalAssistantToolNarration;
|
|
260714
260731
|
createAssistantMessagePreview = policy.createAssistantMessagePreview;
|
|
260715
260732
|
}));
|
|
260716
260733
|
var AssistantMessageOffload = class {
|
|
@@ -260764,16 +260781,39 @@ var AssistantMessageOffload = class {
|
|
|
260764
260781
|
});
|
|
260765
260782
|
}
|
|
260766
260783
|
compact(messages) {
|
|
260767
|
-
|
|
260768
|
-
|
|
260784
|
+
const completedToolCallIds = new Set(messages.filter((message) => message?.role === "tool" && message.toolCallId !== void 0).map((message) => message.toolCallId));
|
|
260785
|
+
let changed = false;
|
|
260786
|
+
const projected = messages.map((message, historyIndex) => {
|
|
260787
|
+
if (message?.role === "assistant" && message.toolCalls.length > 0) {
|
|
260788
|
+
const textParts = message.content.filter((part) => part.type === "text" && typeof part.text === "string");
|
|
260789
|
+
const textChars = textParts.reduce((sum, part) => sum + part.text.length, 0);
|
|
260790
|
+
const completedToolCallCount = message.toolCalls.filter((call) => completedToolCallIds.has(call.id)).length;
|
|
260791
|
+
if (shouldCompactHistoricalAssistantToolNarration({
|
|
260792
|
+
historyIndex,
|
|
260793
|
+
historyLength: messages.length,
|
|
260794
|
+
textChars,
|
|
260795
|
+
toolCallCount: message.toolCalls.length,
|
|
260796
|
+
completedToolCallCount
|
|
260797
|
+
})) {
|
|
260798
|
+
changed = true;
|
|
260799
|
+
return {
|
|
260800
|
+
...message,
|
|
260801
|
+
content: [{
|
|
260802
|
+
type: "text",
|
|
260803
|
+
text: ASSISTANT_TOOL_NARRATION_MARKER
|
|
260804
|
+
}, ...message.content.filter((part) => part.type !== "text")]
|
|
260805
|
+
};
|
|
260806
|
+
}
|
|
260807
|
+
return message;
|
|
260808
|
+
}
|
|
260769
260809
|
const text = persistableAssistantMessageText(message);
|
|
260770
260810
|
if (text === void 0) return message;
|
|
260771
260811
|
const replacement = this.replacements.get(assistantMessageOffloadHash(message, text));
|
|
260772
|
-
|
|
260773
|
-
|
|
260774
|
-
|
|
260775
|
-
};
|
|
260812
|
+
if (replacement === void 0) return message;
|
|
260813
|
+
changed = true;
|
|
260814
|
+
return { ...message, content: replacement.content };
|
|
260776
260815
|
});
|
|
260816
|
+
return changed ? projected : messages;
|
|
260777
260817
|
}
|
|
260778
260818
|
reset(history = this.agent.context?.history ?? []) {
|
|
260779
260819
|
const activeHashes = new Set(history.map((message) => {
|