blun-king-cli 9.1.517 → 9.1.518

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 9.1.518 - 2026-08-31
4
+
5
+ - Keeps `Read`, `Write`, `Edit`, and `Bash` available alongside `TodoList` during proactive task-list maintenance, preserving the normal recovery path for large file changes.
6
+ - Retains automatic Todo maintenance and its bounded evidence prompt without switching the active model step to a TodoList-only tool catalogue.
7
+ - Adds a red-to-green regression gate against the 9.1.499 catalogue change and verifies recovery-tool selection without duplicate schemas.
8
+
3
9
  ## 9.1.517 - 2026-08-31
4
10
 
5
11
  - Keeps `Ctrl+S` and `Escape` queue controls available while an approval panel is open: `Ctrl+S` flushes all waiting messages, while `Escape` releases one waiting message before rejecting the approval when the queue is empty.
package/LIESMICH.txt CHANGED
@@ -9,11 +9,11 @@ Installation
9
9
  ------------
10
10
  Die geprüfte Version exakt global installieren:
11
11
 
12
- npm install -g blun-king-cli@9.1.517
12
+ npm install -g blun-king-cli@9.1.518
13
13
 
14
14
  AgentSpine 0.10.1
15
15
  -----------------
16
- Version 9.1.517 enthält weiterhin AgentSpine 0.10.1 als inhaltsadressierte Pluginfassung. Der Preflight prüft jede aktive Host-Anweisungsdatei weiterhin race-sicher und bindet SHA-256 sowie Dateiidentität an den Zug, dupliziert den bereits vom Host geladenen Volltext aber nicht im Laufzeitkontext. Die reale Probe mit einer 15.519 Byte großen `CLAUDE.md` blieb dadurch bei 5.667 injizierten Byte. Der Stand enthält außerdem den selbstheilenden Persona- und Beziehungsgraphen, die begrenzte Telegram-Mnemo-Abfrage und eine sichtbare Fünf-Sekunden-Grenze für lokale Beziehungsabfragen.
16
+ Version 9.1.518 enthält weiterhin AgentSpine 0.10.1 als inhaltsadressierte Pluginfassung. Der Preflight prüft jede aktive Host-Anweisungsdatei weiterhin race-sicher und bindet SHA-256 sowie Dateiidentität an den Zug, dupliziert den bereits vom Host geladenen Volltext aber nicht im Laufzeitkontext. Die reale Probe mit einer 15.519 Byte großen `CLAUDE.md` blieb dadurch bei 5.667 injizierten Byte. Der Stand enthält außerdem den selbstheilenden Persona- und Beziehungsgraphen, die begrenzte Telegram-Mnemo-Abfrage und eine sichtbare Fünf-Sekunden-Grenze für lokale Beziehungsabfragen.
17
17
 
18
18
  Start
19
19
  -----
package/README.md CHANGED
@@ -9,12 +9,12 @@ 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.517
12
+ npm install -g blun-king-cli@9.1.518
13
13
  ```
14
14
 
15
15
  ## AgentSpine 0.10.1
16
16
 
17
- Version 9.1.517 enthält weiterhin AgentSpine 0.10.1 als inhaltsadressierte Pluginfassung. Der Preflight prüft jede aktive Host-Anweisungsdatei weiterhin race-sicher und bindet SHA-256 sowie Dateiidentität an den Zug, dupliziert den bereits vom Host geladenen Volltext aber nicht im Laufzeitkontext. Die reale Probe mit einer 15.519 Byte großen `CLAUDE.md` blieb dadurch bei 5.667 injizierten Byte. Der Stand enthält außerdem den selbstheilenden Persona- und Beziehungsgraphen, die begrenzte Telegram-Mnemo-Abfrage und eine sichtbare Fünf-Sekunden-Grenze für lokale Beziehungsabfragen.
17
+ Version 9.1.518 enthält weiterhin AgentSpine 0.10.1 als inhaltsadressierte Pluginfassung. Der Preflight prüft jede aktive Host-Anweisungsdatei weiterhin race-sicher und bindet SHA-256 sowie Dateiidentität an den Zug, dupliziert den bereits vom Host geladenen Volltext aber nicht im Laufzeitkontext. Die reale Probe mit einer 15.519 Byte großen `CLAUDE.md` blieb dadurch bei 5.667 injizierten Byte. Der Stand enthält außerdem den selbstheilenden Persona- und Beziehungsgraphen, die begrenzte Telegram-Mnemo-Abfrage und eine sichtbare Fünf-Sekunden-Grenze für lokale Beziehungsabfragen.
18
18
 
19
19
  ## Reproduzierbares Staging und Packen
20
20
 
package/blun.mjs CHANGED
@@ -262877,11 +262877,12 @@ var init_turn = __esmMin((() => {
262877
262877
  mode: todoMaintenanceMode,
262878
262878
  workCallsSinceRefresh: this.agent.goalTodoPolicyState?.workCallsSinceRefresh ?? 0
262879
262879
  });
262880
+ const todoMaintenanceTools = goalTodoMaintenanceTools(eligibleTools, selectedTools);
262880
262881
  const todoSystemPrompt = buildGoalTodoMaintenanceSystemPrompt(this.agent, todoMaintenanceMode);
262881
262882
  const todoMessages = buildGoalTodoMaintenanceMessages(this.agent, todoMaintenanceMode);
262882
262883
  return {
262883
262884
  llm: this.agent.llmForTurn("low", todoSystemPrompt),
262884
- tools: [todoTool],
262885
+ tools: todoMaintenanceTools,
262885
262886
  buildMessages: () => todoMessages,
262886
262887
  buildMessagesStrict: () => todoMessages
262887
262888
  };
@@ -423347,6 +423348,13 @@ const IDEA_CONTRACT_MARKER = "Work as a self-directing employee:";
423347
423348
  const IDEA_ALLOWED_CHANNELS = Object.freeze([]);
423348
423349
  const GOAL_TODO_REFRESH_WORK_CALL_LIMIT = 8;
423349
423350
  const GOAL_TODO_EVIDENCE_LIMIT = 8;
423351
+ const TODO_MAINTENANCE_RECOVERY_TOOL_NAMES = new Set([
423352
+ "TodoList",
423353
+ "Read",
423354
+ "Write",
423355
+ "Edit",
423356
+ "Bash"
423357
+ ]);
423350
423358
  const IDEA_TERMINAL_TODO_STATUSES = Object.freeze([
423351
423359
  "done",
423352
423360
  "blocked",
@@ -423425,6 +423433,14 @@ function goalTodoMaintenanceMode(agent) {
423425
423433
  progress.refreshRequired = true;
423426
423434
  return "refresh";
423427
423435
  }
423436
+ function goalTodoMaintenanceTools(eligibleTools, selectedTools) {
423437
+ const seen = new Set();
423438
+ return [...selectedTools, ...eligibleTools.filter((tool) => TODO_MAINTENANCE_RECOVERY_TOOL_NAMES.has(tool.name))].filter((tool) => {
423439
+ if (seen.has(tool.name)) return false;
423440
+ seen.add(tool.name);
423441
+ return true;
423442
+ });
423443
+ }
423428
423444
  function buildGoalTodoMaintenanceSystemPrompt(agent, mode) {
423429
423445
  const todos = ideaTodos(agent);
423430
423446
  const visibleTodoList = todos.length === 0 ? "The visible TodoList is empty." : ["Current visible TodoList:", ...todos.map((todo) => `- [${String(todo?.status ?? "pending")}] ${String(todo?.title ?? "").trim()}`)].join("\n");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blun-king-cli",
3
- "version": "9.1.517",
3
+ "version": "9.1.518",
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": {
@@ -9,7 +9,7 @@
9
9
  },
10
10
  "scripts": {
11
11
  "test": "node --test test/*.test.js",
12
- "prepack": "node scripts/check-release-metadata.js && node scripts/check-todo-loop-regression.js && node scripts/check-queue-controls-regression.js && node scripts/check-approval-queue-shortcuts-regression.js && node scripts/check-telegram-bridge-watchdog.js && node scripts/check-resume-replay-regression.js && node scripts/check-session-cancel-regression.js && node scripts/check-plugin-startup-regression.js && node scripts/check-active-profile-plugin-startup.js && node scripts/check-mcp-startup-wait-budget.js",
12
+ "prepack": "node scripts/check-release-metadata.js && node scripts/check-todo-loop-regression.js && node scripts/check-todo-recovery-catalog-regression.js && node scripts/check-queue-controls-regression.js && node scripts/check-approval-queue-shortcuts-regression.js && node scripts/check-telegram-bridge-watchdog.js && node scripts/check-resume-replay-regression.js && node scripts/check-session-cancel-regression.js && node scripts/check-plugin-startup-regression.js && node scripts/check-active-profile-plugin-startup.js && node scripts/check-mcp-startup-wait-budget.js",
13
13
  "release:verify": "node scripts/check-release-metadata.js --external",
14
14
  "postinstall": "node scripts/fix-node-pty-perms.js"
15
15
  },
@@ -45,6 +45,7 @@
45
45
  "scripts/check-resume-replay-regression.js",
46
46
  "scripts/check-session-cancel-regression.js",
47
47
  "scripts/check-release-metadata.js",
48
+ "scripts/check-todo-recovery-catalog-regression.js",
48
49
  "scripts/check-todo-loop-regression.js",
49
50
  "scripts/fix-node-pty-perms.js",
50
51
  "standard-skills/",
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const fs = require('node:fs');
5
+ const path = require('node:path');
6
+
7
+ const bundlePath = process.env.BLUN_BUNDLE_UNDER_TEST
8
+ ? path.resolve(process.env.BLUN_BUNDLE_UNDER_TEST)
9
+ : path.resolve(__dirname, '..', 'blun.mjs');
10
+ const bundle = fs.readFileSync(bundlePath, 'utf8');
11
+
12
+ function assert(condition, message) {
13
+ if (!condition) throw new Error(message);
14
+ }
15
+
16
+ const namesMatch = bundle.match(
17
+ /const TODO_MAINTENANCE_RECOVERY_TOOL_NAMES = new Set\(\[([\s\S]*?)\]\);/,
18
+ );
19
+ const functionMatch = bundle.match(
20
+ /function goalTodoMaintenanceTools\(eligibleTools, selectedTools\) \{[\s\S]*?\n\}/,
21
+ );
22
+
23
+ assert(
24
+ !/proactive TodoList maintenance step[\s\S]{0,900}tools:\s*\[todoTool\]/.test(bundle),
25
+ 'TODO_RECOVERY_CATALOG_REGRESSION: proactive maintenance still switches to TodoList-only',
26
+ );
27
+ assert(namesMatch, 'TODO_RECOVERY_CATALOG_REGRESSION: recovery tool names are missing');
28
+ assert(functionMatch, 'TODO_RECOVERY_CATALOG_REGRESSION: recovery catalogue selector is missing');
29
+ assert(
30
+ /proactive TodoList maintenance step[\s\S]{0,1100}tools:\s*todoMaintenanceTools/.test(bundle),
31
+ 'TODO_RECOVERY_CATALOG_REGRESSION: proactive maintenance is not wired to the recovery catalogue',
32
+ );
33
+
34
+ const selectMaintenanceTools = Function(
35
+ `const TODO_MAINTENANCE_RECOVERY_TOOL_NAMES = new Set([${namesMatch[1]}]); return (${functionMatch[0]});`,
36
+ )();
37
+ const tools = ['TodoList', 'Read', 'Write', 'Edit', 'Bash', 'WebSearch'].map((name) => ({ name }));
38
+ const selected = [tools[5], tools[1]];
39
+ const actual = selectMaintenanceTools(tools, selected).map((tool) => tool.name);
40
+
41
+ assert(
42
+ actual.join(',') === 'WebSearch,Read,TodoList,Write,Edit,Bash',
43
+ `TODO_RECOVERY_CATALOG_REGRESSION: unexpected catalogue ${actual.join(',')}`,
44
+ );
45
+ assert(
46
+ new Set(actual).size === actual.length,
47
+ 'TODO_RECOVERY_CATALOG_REGRESSION: recovery catalogue contains duplicates',
48
+ );
49
+
50
+ process.stdout.write('todo-recovery-catalog-regression PASS\n');