blun-king-cli 9.1.125 → 9.1.127

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
@@ -113,6 +113,8 @@ Version 9.1.106 erlaubt Agentenprofilen, Werkzeuge namentlich auszuschließen. K
113
113
 
114
114
  Version 9.1.109 hält nur noch die neun Werkzeuge dauerhaft in der Modellanfrage, auf die mehr als 98 Prozent von Fredriks 3.183 gemessenen Werkzeugaufrufen entfielen. Alle übrigen Werkzeuge bleiben über `ToolSearch` auffindbar und nach dem ersten Laden für den Rest der Sitzung verfügbar. Dadurch sinkt die Schemalast bei jedem normalen Modellschritt, ohne ein Werkzeug zu entfernen oder den Schnellweg für Telegram-Antworten und ausstehende Medienergebnisse zu verändern.
115
115
 
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
+
116
118
  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.
117
119
 
118
120
  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.
@@ -125,6 +127,8 @@ Ab BLUN King 9.1.122 wird die vollständige integrierte Designrichtlinie nicht m
125
127
 
126
128
  Ab BLUN King 9.1.123 entlastet die Modellprojektion zusätzlich die Argumente älterer, bereits abgeschlossener Werkzeugaufrufe. Name, Kennung und Ergebnis bleiben erhalten; nur die wiederholte Übertragung großer alter JSON-Argumente entfällt. Unbeantwortete Werkzeugaufrufe, ungültige JSON-Argumente und die neuesten 20 Nachrichten bleiben vollständig. Der gespeicherte Rohverlauf und Exporte werden nicht verändert. In Fredriks gemessener Projektion sank der Anfrageumfang dadurch von 101.459 auf 94.026 Zeichen, also um etwa 1.859 geschätzte Token je Anfrage.
127
129
 
130
+ Ab BLUN King 9.1.126 wird die laufzeitweite `Mistake.md` nicht mehr bei jedem Zug vollständig mitgesendet. King wählt deterministisch bis zu fünf Abschnitte aus, die zu den letzten vier Nutzernachrichten passen, und bevorzugt dabei wiederverwendbare Regeln, Bedingungen und Gegenproben. Die Auswahl ist auf 6.000 Zeichen begrenzt und ersetzt den vorherigen Hinweis, statt weitere Kopien anzusammeln. Die vollständige Datei, ihr Register, ihr Archiv und ihr Schreibweg bleiben unverändert. Dafür ist kein zusätzlicher Modell-, Einbettungs- oder Netzwerkaufruf nötig. In der aktuell gemessenen laufzeitweiten Datei sank die Modellsicht abhängig von der Anfrage von 13.470 Zeichen auf 2.921 bis 4.819 Zeichen.
131
+
128
132
  Verliert ein delegierter Einzelagent oder ein Mitglied eines Agentenschwarms die Provider-Verbindung, erhält es eine leere Provider-Antwort, bricht sein Stream wegen Leerlaufs ab oder meldet der Server HTTP 408/500/502/503/504, setzt BLUN King denselben Agenten anhand seines dauerhaften Verlaufs fort. Bei Einzelagenten sowie bei Schwarm-Unterbrechungen außerhalb von HTTP 429 wartet die erste Fortsetzung zwei Sekunden und die zweite fünf Sekunden; danach bleibt der ursprüngliche Fehler sichtbar. HTTP 429 behält im Schwarm seine getrennte, längere Überlastungsregel. Authentifizierungs-, Zahlungs- oder Kontingent-, Richtlinien-, Kontext-, Werkzeug- und Codefehler sowie manuelle Abbrüche lösen keine automatische Fortsetzung aus. Jeder Fortsetzungsversuch verwendet die bestehende Agenten-ID, damit bereits abgeschlossene Arbeit nicht wiederholt wird.
129
133
 
130
134
  Rein lesende Sitzungsdiagnose
package/README.md CHANGED
@@ -119,6 +119,8 @@ Version 9.1.106 erlaubt Agentenprofilen, Werkzeuge namentlich auszuschließen. K
119
119
 
120
120
  Version 9.1.109 hält nur noch die neun Werkzeuge dauerhaft in der Modellanfrage, auf die mehr als 98 Prozent von Fredriks 3.183 gemessenen Werkzeugaufrufen entfielen. Alle übrigen Werkzeuge bleiben über `ToolSearch` auffindbar und nach dem ersten Laden für den Rest der Sitzung verfügbar. Dadurch sinkt die Schemalast bei jedem normalen Modellschritt, ohne ein Werkzeug zu entfernen oder den Schnellweg für Telegram-Antworten und ausstehende Medienergebnisse zu verändern.
121
121
 
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
+
122
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.
123
125
 
124
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.
@@ -131,6 +133,8 @@ Ab BLUN King 9.1.122 wird die vollständige integrierte Designrichtlinie nicht m
131
133
 
132
134
  Ab BLUN King 9.1.123 entlastet die Modellprojektion zusätzlich die Argumente älterer, bereits abgeschlossener Werkzeugaufrufe. Name, Kennung und Ergebnis bleiben erhalten; nur die wiederholte Übertragung großer alter JSON-Argumente entfällt. Unbeantwortete Werkzeugaufrufe, ungültige JSON-Argumente und die neuesten 20 Nachrichten bleiben vollständig. Der gespeicherte Rohverlauf und Exporte werden nicht verändert. In Fredriks gemessener Projektion sank der Anfrageumfang dadurch von 101.459 auf 94.026 Zeichen, also um etwa 1.859 geschätzte Token je Anfrage.
133
135
 
136
+ Ab BLUN King 9.1.126 wird die laufzeitweite `Mistake.md` nicht mehr bei jedem Zug vollständig mitgesendet. King wählt deterministisch bis zu fünf Abschnitte aus, die zu den letzten vier Nutzernachrichten passen, und bevorzugt dabei wiederverwendbare Regeln, Bedingungen und Gegenproben. Die Auswahl ist auf 6.000 Zeichen begrenzt und ersetzt den vorherigen Hinweis, statt weitere Kopien anzusammeln. Die vollständige Datei, ihr Register, ihr Archiv und ihr Schreibweg bleiben unverändert. Dafür ist kein zusätzlicher Modell-, Einbettungs- oder Netzwerkaufruf nötig. In der aktuell gemessenen laufzeitweiten Datei sank die Modellsicht abhängig von der Anfrage von 13.470 Zeichen auf 2.921 bis 4.819 Zeichen.
137
+
134
138
  Ab BLUN King 9.1.99 werden auch direkt aufeinanderfolgende reine Textergebnisse als Stapel betrachtet. Enthalten sie zusammen mehr als 12.000 Zeichen, obwohl kein einzelnes Ergebnis diese Grenze überschreitet, speichert King so viele der größten geeigneten Ergebnisse wie nötig in privaten Dateien. In der Modellprojektion verbleiben lesbare Verweise. Der unveränderte Sitzungsrohverlauf bleibt vollständig erhalten. Gemischte Medienergebnisse, einzelne Ergebnisse unter 3.000 Zeichen und Stapel bis einschließlich 12.000 Zeichen bleiben unverändert. Beispiel: Bei zwei Suchergebnissen mit 7.000 und 6.000 Zeichen wird das größere Ergebnis privat gespeichert; Anfang, Ende, ausgelassene Zeichenzahl und `output_path` bleiben für den Agenten sichtbar.
135
139
 
136
140
  Ab BLUN King 9.1.100 beendet eine begrenzte Grep-Inhaltssuche ripgrep, sobald der Versatz, die angeforderten Zeilen und eine zusätzliche Vorschauzeile vollständig vorliegen. Die Vorschauzeile belegt, ob eine weitere Seite existiert, ohne vorher bis zu 10 MB einzulesen. Unbegrenzte Suchen, Trefferzählungen und nach Änderungszeit sortierte Dateilisten laufen weiterhin vollständig durch.
@@ -0,0 +1,152 @@
1
+ 'use strict';
2
+
3
+ const DEFAULT_MAX_CHARS = 6_000;
4
+ const DEFAULT_MAX_SECTIONS = 5;
5
+ const RECENT_USER_MESSAGES = 4;
6
+ const STOP_WORDS = new Set([
7
+ 'aber', 'alle', 'alles', 'auch', 'eine', 'einem', 'einen', 'einer', 'eines',
8
+ 'fuer', 'haben', 'hier', 'immer', 'jetzt', 'kann', 'machen', 'mehr', 'mich',
9
+ 'nicht', 'noch', 'oder', 'sein', 'sind', 'soll', 'und', 'uns', 'von', 'was',
10
+ 'wenn', 'werden', 'wie', 'with', 'that', 'this', 'from', 'have', 'into',
11
+ 'your', 'you', 'the', 'and', 'for', 'are', 'not', 'but', 'all', 'can',
12
+ ]);
13
+ const REUSABLE_HEADING = /\b(rule|regel|condition|bedingung|countercheck|gegenprobe|trigger|ausloeser|auslöser)\b/iu;
14
+
15
+ function normalizeText(value) {
16
+ return String(value || '').normalize('NFKD').replace(/\p{M}/gu, '').toLowerCase();
17
+ }
18
+
19
+ function terms(value) {
20
+ return [...new Set(normalizeText(value).match(/[\p{L}\p{N}_-]{3,}/gu) || [])]
21
+ .filter((term) => !STOP_WORDS.has(term));
22
+ }
23
+
24
+ function textFromMessage(message) {
25
+ if (typeof message?.content === 'string') return message.content.trim();
26
+ if (!Array.isArray(message?.content)) return '';
27
+ return message.content
28
+ .filter((part) => part?.type === 'text' && typeof part.text === 'string')
29
+ .map((part) => part.text.trim())
30
+ .filter(Boolean)
31
+ .join('\n');
32
+ }
33
+
34
+ function recentUserText(history, limit = RECENT_USER_MESSAGES) {
35
+ if (!Array.isArray(history)) return '';
36
+ return history
37
+ .filter((message) => message?.role === 'user')
38
+ .map(textFromMessage)
39
+ .filter(Boolean)
40
+ .slice(-Math.max(1, Number(limit) || RECENT_USER_MESSAGES))
41
+ .join('\n');
42
+ }
43
+
44
+ function splitSections(source) {
45
+ const text = String(source || '').replace(/\r\n?/gu, '\n').trim();
46
+ if (!text) return [];
47
+ const headings = [...text.matchAll(/^#{2,3}\s+.+$/gmu)];
48
+ const sections = [];
49
+ let parent = '';
50
+ const preambleEnd = headings[0]?.index ?? text.length;
51
+ const preamble = text.slice(0, preambleEnd).trim();
52
+ if (preamble) {
53
+ const separator = preamble.indexOf('\n---');
54
+ const body = separator >= 0 ? preamble.slice(separator + 4).trim() : '';
55
+ if (body) sections.push({ heading: '# Mistake.md', parent: '', body, index: -1 });
56
+ }
57
+ headings.forEach((match, index) => {
58
+ const heading = match[0].trim();
59
+ const level = heading.startsWith('### ') ? 3 : 2;
60
+ if (level === 2) parent = heading;
61
+ const start = match.index + match[0].length;
62
+ const end = headings[index + 1]?.index ?? text.length;
63
+ sections.push({
64
+ heading,
65
+ parent: level === 3 ? parent : '',
66
+ body: text.slice(start, end).trim(),
67
+ index,
68
+ });
69
+ });
70
+ return sections;
71
+ }
72
+
73
+ function scoreSection(section, queryTerms) {
74
+ const heading = normalizeText(`${section.parent} ${section.heading}`);
75
+ const body = normalizeText(section.body);
76
+ let score = REUSABLE_HEADING.test(section.heading) ? 1 : 0;
77
+ for (const term of queryTerms) {
78
+ if (heading.includes(term)) score += 6;
79
+ if (body.includes(term)) score += 4;
80
+ }
81
+ return score;
82
+ }
83
+
84
+ function compactSection(section, maxChars) {
85
+ const title = section.parent && section.parent !== section.heading
86
+ ? `${section.parent}\n${section.heading}`
87
+ : section.heading;
88
+ const full = `${title}\n${section.body}`.trim();
89
+ if (full.length <= maxChars) return full;
90
+ const marker = '\n\n[section shortened deterministically]\n\n';
91
+ const available = Math.max(0, maxChars - marker.length);
92
+ const headChars = Math.ceil(available * 0.55);
93
+ const tailChars = Math.floor(available * 0.45);
94
+ return `${full.slice(0, headChars).trimEnd()}${marker}${full.slice(-tailChars).trimStart()}`;
95
+ }
96
+
97
+ function selectRelevantMistakeContent(source, query, options = {}) {
98
+ const maxChars = Math.max(256, Number(options.maxChars) || DEFAULT_MAX_CHARS);
99
+ const maxSections = Math.max(1, Number(options.maxSections) || DEFAULT_MAX_SECTIONS);
100
+ const sourceText = String(source || '').trim();
101
+ const sections = splitSections(sourceText);
102
+ const queryTerms = terms(query);
103
+ const ranked = sections.map((section) => ({
104
+ ...section,
105
+ score: scoreSection(section, queryTerms),
106
+ }));
107
+ const hasMatch = ranked.some((section) => section.score > (REUSABLE_HEADING.test(section.heading) ? 1 : 0));
108
+ ranked.sort((left, right) => {
109
+ if (hasMatch && right.score !== left.score) return right.score - left.score;
110
+ const rightReusable = REUSABLE_HEADING.test(right.heading) ? 1 : 0;
111
+ const leftReusable = REUSABLE_HEADING.test(left.heading) ? 1 : 0;
112
+ if (rightReusable !== leftReusable) return rightReusable - leftReusable;
113
+ return right.index - left.index;
114
+ });
115
+
116
+ const header = '# Mistake.md\n\nRelevant verified lessons for the current turn.';
117
+ const selected = [];
118
+ let remaining = maxChars - header.length - 2;
119
+ const perSectionMax = Math.max(
120
+ 160,
121
+ Math.floor(remaining / Math.min(maxSections, 3)),
122
+ );
123
+ for (const section of ranked) {
124
+ if (selected.length >= maxSections || remaining < 64) break;
125
+ if (hasMatch && section.score === 0) continue;
126
+ const rendered = compactSection(section, Math.min(remaining, perSectionMax));
127
+ if (!rendered) continue;
128
+ selected.push({ ...section, rendered });
129
+ remaining -= rendered.length + 2;
130
+ }
131
+ if (selected.length === 0 && sections.length > 0) {
132
+ const fallback = sections.at(-1);
133
+ selected.push({ ...fallback, rendered: compactSection(fallback, remaining) });
134
+ }
135
+ selected.sort((left, right) => left.index - right.index);
136
+ const text = [header, ...selected.map((section) => section.rendered)].join('\n\n').slice(0, maxChars);
137
+ return {
138
+ selectedChars: text.length,
139
+ selectedSections: selected.length,
140
+ text,
141
+ totalChars: sourceText.length,
142
+ totalSections: sections.length,
143
+ };
144
+ }
145
+
146
+ module.exports = {
147
+ DEFAULT_MAX_CHARS,
148
+ DEFAULT_MAX_SECTIONS,
149
+ RECENT_USER_MESSAGES,
150
+ recentUserText,
151
+ selectRelevantMistakeContent,
152
+ };
@@ -27,6 +27,15 @@ function deferredToolNames(tools) {
27
27
  .filter(Boolean))].sort((left, right) => left.localeCompare(right));
28
28
  }
29
29
 
30
+ function deferredToolCatalog(tools) {
31
+ const names = deferredToolNames(tools);
32
+ const leaves = names.map((name) => name.split(/__|:/).at(-1) || name);
33
+ const leafCounts = new Map();
34
+ for (const leaf of leaves) leafCounts.set(leaf, (leafCounts.get(leaf) || 0) + 1);
35
+ return names.map((name, index) => leafCounts.get(leaves[index]) === 1 ? leaves[index] : name)
36
+ .sort((left, right) => left.localeCompare(right));
37
+ }
38
+
30
39
  function searchDeferredTools(tools, query) {
31
40
  const normalized = String(query || '').trim().toLowerCase();
32
41
  if (!normalized) return [];
@@ -64,7 +73,7 @@ function createDeferredToolLoader(selectedTools, deferredTools, loadedToolNames
64
73
  const name = String(tool?.name || '').trim();
65
74
  if (name && !available.has(name)) available.set(name, tool);
66
75
  }
67
- const names = deferredToolNames([...available.values()]);
76
+ const catalog = deferredToolCatalog([...available.values()]);
68
77
 
69
78
  return {
70
79
  name: DEFERRED_TOOL_LOADER_NAME,
@@ -72,7 +81,7 @@ function createDeferredToolLoader(selectedTools, deferredTools, loadedToolNames
72
81
  'Find and load deferred tool schemas into this running session.',
73
82
  'Use select:leaf_name for one known tool, plain keywords to search, or +word to require that word in the tool name.',
74
83
  'Loaded tools are available in the next step and remain loaded for this session.',
75
- `Available deferred tool names: ${names.join(', ')}`,
84
+ `Available deferred selectors: ${catalog.join(', ')}`,
76
85
  ].join('\n'),
77
86
  parameters: {
78
87
  type: 'object',
@@ -139,6 +148,7 @@ module.exports = {
139
148
  TOOL_SCHEMA_BUDGET_RATIO,
140
149
  TOOL_SCHEMA_MAX_TOKENS,
141
150
  createDeferredToolLoader,
151
+ deferredToolCatalog,
142
152
  deferredToolNames,
143
153
  toolSchemaBudgetTokens,
144
154
  };
package/blun.mjs CHANGED
@@ -231442,13 +231442,16 @@ var init_mistake_md_writer = __esmMin((() => {
231442
231442
  * Nach jedem Turn kann der Writer neue Eintraege an Mistake.md anhaengen.
231443
231443
  * Der Writer laeuft NACH dem Lesen, nie waehrend (C3).
231444
231444
  */
231445
- var MistakeMdInjector;
231445
+ function isMistakeMdReminder(message) {
231446
+ return message.origin?.kind === "injection" && message.origin.variant === "mistake_md";
231447
+ }
231448
+ var MistakeMdInjector, recentUserText, selectRelevantMistakeContent;
231446
231449
  var init_mistake_md = __esmMin((() => {
231447
231450
  init_injector();
231448
231451
  init_mistake_md_writer();
231452
+ ({ recentUserText, selectRelevantMistakeContent } = createRequire(import.meta.url)("./bin/mistake-relevance-policy.cjs"));
231449
231453
  MistakeMdInjector = class extends DynamicInjector {
231450
231454
  injectionVariant = "mistake_md";
231451
- lastHash = null;
231452
231455
  reserveChecked = false;
231453
231456
  mistakeDir;
231454
231457
  mistakeFile;
@@ -231459,12 +231462,24 @@ var init_mistake_md = __esmMin((() => {
231459
231462
  }
231460
231463
  onContextClear() {
231461
231464
  super.onContextClear();
231462
- this.lastHash = null;
231463
231465
  this.reserveChecked = false;
231464
231466
  }
231465
- onContextCompacted() {
231466
- super.onContextCompacted();
231467
- this.lastHash = null;
231467
+ async inject() {
231468
+ const injection = await this.getInjection();
231469
+ const existing = this.agent.context.history.filter(isMistakeMdReminder);
231470
+ if (!injection) {
231471
+ if (existing.length > 0) this.agent.context.removeSystemRemindersMatching(isMistakeMdReminder);
231472
+ return;
231473
+ }
231474
+ const expected = wrapSystemReminder(injection);
231475
+ if (existing.length === 1 && reminderText(existing[0]) === expected) return;
231476
+ this.agent.context.removeSystemRemindersMatching(isMistakeMdReminder);
231477
+ this.injectedAt = this.agent.context.history.length;
231478
+ this.lastInjection = injection;
231479
+ this.agent.context.appendSystemReminder(injection, {
231480
+ kind: "injection",
231481
+ variant: this.injectionVariant
231482
+ });
231468
231483
  }
231469
231484
  async getInjection() {
231470
231485
  try {
@@ -231477,16 +231492,16 @@ var init_mistake_md = __esmMin((() => {
231477
231492
  }
231478
231493
  const trimmed = content.trim();
231479
231494
  if (trimmed.length === 0) return void 0;
231480
- const hash = createHash("sha256").update(trimmed).digest("hex");
231481
- if (hash === this.lastHash) return void 0;
231482
- this.lastHash = hash;
231495
+ const query = recentUserText(this.agent.context.history);
231496
+ const selected = selectRelevantMistakeContent(trimmed, query);
231497
+ if (!selected.text) return void 0;
231483
231498
  let prefix = "";
231484
231499
  if (!this.reserveChecked) {
231485
231500
  this.reserveChecked = true;
231486
231501
  const reserveWarning = await checkReserve(this.mistakeDir);
231487
231502
  if (reserveWarning) prefix = `<!-- D2a: ${reserveWarning} -->\n\n`;
231488
231503
  }
231489
- return prefix + trimmed;
231504
+ return prefix + selected.text;
231490
231505
  });
231491
231506
  } catch {
231492
231507
  return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blun-king-cli",
3
- "version": "9.1.125",
3
+ "version": "9.1.127",
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": {