blun-king-cli 9.1.129 → 9.1.131

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
@@ -119,6 +119,10 @@ Version 9.1.128 begrenzt außerdem den dauerhaften Cache nachgeladener Werkzeug-
119
119
 
120
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
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
+
124
+ Ab BLUN King 9.1.131 entfernt die Modellprojektion zwei ältere Regelkopien aus dem Systemprompt, sobald gleichwertige Regeln im Conduct-Abschnitt vorhanden sind. Betroffen sind ausschließlich die doppelten Hinweise zu Ehrlichkeit und Zugangsdaten; die vollständigen Conduct-Regeln und alle übrigen Prompt-Abschnitte bleiben unverändert. In der ausgelieferten Standardvorlage sinkt der wiederholt gesendete Prompt dadurch um 1.010 Zeichen, also um etwa 253 geschätzte Token pro Modellanfrage. Fehlt eines der Conduct-Gegenstücke, bleibt die entsprechende ältere Regel unverändert erhalten.
125
+
122
126
  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.
123
127
 
124
128
  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
@@ -125,6 +125,10 @@ Version 9.1.128 begrenzt außerdem den dauerhaften Cache nachgeladener Werkzeug-
125
125
 
126
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
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
+
130
+ Ab BLUN King 9.1.131 entfernt die Modellprojektion zwei ältere Regelkopien aus dem Systemprompt, sobald gleichwertige Regeln im Conduct-Abschnitt vorhanden sind. Betroffen sind ausschließlich die doppelten Hinweise zu Ehrlichkeit und Zugangsdaten; die vollständigen Conduct-Regeln und alle übrigen Prompt-Abschnitte bleiben unverändert. In der ausgelieferten Standardvorlage sinkt der wiederholt gesendete Prompt dadurch um 1.010 Zeichen, also um etwa 253 geschätzte Token pro Modellanfrage. Fehlt eines der Conduct-Gegenstücke, bleibt die entsprechende ältere Regel unverändert erhalten.
131
+
128
132
  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.
129
133
 
130
134
  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
  };
@@ -27,8 +27,32 @@ function boundSystemPromptDirectoryListing(value) {
27
27
  return `${kept.join('\n')}\n${SYSTEM_PROMPT_DIRECTORY_TRUNCATED_MARKER}`;
28
28
  }
29
29
 
30
+ function removeMarkdownSection(markdown, heading) {
31
+ const escapedHeading = heading.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
32
+ const sectionPattern = new RegExp(
33
+ `(?:^|\\n)## ${escapedHeading}\\r?\\n[\\s\\S]*?(?=\\r?\\n#{1,2} |$)`,
34
+ 'u',
35
+ );
36
+ return markdown.replace(sectionPattern, '');
37
+ }
38
+
39
+ function compactRepeatedConductSections(value) {
40
+ const prompt = String(value ?? '');
41
+ let compacted = prompt;
42
+
43
+ if (/^### Honesty & verification\s*$/mu.test(prompt)) {
44
+ compacted = removeMarkdownSection(compacted, 'Honesty');
45
+ }
46
+ if (/^### Secrets and credentials\s*$/mu.test(prompt)) {
47
+ compacted = removeMarkdownSection(compacted, 'Secrets and credentials');
48
+ }
49
+
50
+ return compacted;
51
+ }
52
+
30
53
  module.exports = {
31
54
  SYSTEM_PROMPT_DIRECTORY_MAX_CHARS,
32
55
  SYSTEM_PROMPT_DIRECTORY_TRUNCATED_MARKER,
33
56
  boundSystemPromptDirectoryListing,
57
+ compactRepeatedConductSections,
34
58
  };
package/blun.mjs CHANGED
@@ -21437,7 +21437,7 @@ var init_list_directory = __esmMin((() => {
21437
21437
  }));
21438
21438
  //#endregion
21439
21439
  //#region ../../packages/agent-core/src/profile/context.ts
21440
- var { boundSystemPromptDirectoryListing } = createRequire(import.meta.url)("./bin/system-prompt-context-policy.cjs");
21440
+ var { boundSystemPromptDirectoryListing, compactRepeatedConductSections } = createRequire(import.meta.url)("./bin/system-prompt-context-policy.cjs");
21441
21441
  async function prepareSystemPromptContext(kaos, brandHome, options) {
21442
21442
  const additionalDirs = normalizeAdditionalDirs(options?.additionalDirs ?? []);
21443
21443
  const [cwdListing, agentsMdResult, additionalDirsInfo] = await Promise.all([
@@ -28372,7 +28372,7 @@ function createSystemPromptRenderer(merged) {
28372
28372
  return (context) => {
28373
28373
  const vars = buildTemplateVars(context, merged.promptVars, merged.tools);
28374
28374
  try {
28375
- return renderPrompt(merged.systemPromptTemplate, vars);
28375
+ return compactRepeatedConductSections(renderPrompt(merged.systemPromptTemplate, vars));
28376
28376
  } catch (error) {
28377
28377
  throw new Error(`Failed to render system prompt for agent profile "${merged.name}": ${error instanceof Error ? error.message : String(error)}`, { cause: error });
28378
28378
  }
@@ -260720,12 +260720,14 @@ function renderPersistedAssistantMessage(text, outputPath) {
260720
260720
  createAssistantMessagePreview(text)
260721
260721
  ].join("\n");
260722
260722
  }
260723
- 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;
260724
260724
  var init_assistant_message_offload = __esmMin((() => {
260725
260725
  const policy = createRequire(import.meta.url)("./bin/assistant-message-offload-policy.cjs");
260726
260726
  ASSISTANT_MESSAGE_MAX_CHARS = policy.ASSISTANT_MESSAGE_MAX_CHARS;
260727
260727
  ASSISTANT_MESSAGE_OFFLOAD_MARKER = policy.ASSISTANT_MESSAGE_OFFLOAD_MARKER;
260728
+ ASSISTANT_TOOL_NARRATION_MARKER = policy.ASSISTANT_TOOL_NARRATION_MARKER;
260728
260729
  shouldOffloadHistoricalAssistantMessage = policy.shouldOffloadHistoricalAssistantMessage;
260730
+ shouldCompactHistoricalAssistantToolNarration = policy.shouldCompactHistoricalAssistantToolNarration;
260729
260731
  createAssistantMessagePreview = policy.createAssistantMessagePreview;
260730
260732
  }));
260731
260733
  var AssistantMessageOffload = class {
@@ -260779,16 +260781,39 @@ var AssistantMessageOffload = class {
260779
260781
  });
260780
260782
  }
260781
260783
  compact(messages) {
260782
- if (this.replacements.size === 0) return messages;
260783
- return messages.map((message) => {
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
+ }
260784
260809
  const text = persistableAssistantMessageText(message);
260785
260810
  if (text === void 0) return message;
260786
260811
  const replacement = this.replacements.get(assistantMessageOffloadHash(message, text));
260787
- return replacement === void 0 ? message : {
260788
- ...message,
260789
- content: replacement.content
260790
- };
260812
+ if (replacement === void 0) return message;
260813
+ changed = true;
260814
+ return { ...message, content: replacement.content };
260791
260815
  });
260816
+ return changed ? projected : messages;
260792
260817
  }
260793
260818
  reset(history = this.agent.context?.history ?? []) {
260794
260819
  const activeHashes = new Set(history.map((message) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blun-king-cli",
3
- "version": "9.1.129",
3
+ "version": "9.1.131",
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": {