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 +6 -0
- package/LIESMICH.txt +2 -2
- package/README.md +2 -2
- package/blun.mjs +17 -1
- package/package.json +3 -2
- package/scripts/check-todo-recovery-catalog-regression.js +50 -0
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.
|
|
12
|
+
npm install -g blun-king-cli@9.1.518
|
|
13
13
|
|
|
14
14
|
AgentSpine 0.10.1
|
|
15
15
|
-----------------
|
|
16
|
-
Version 9.1.
|
|
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.
|
|
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.
|
|
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:
|
|
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.
|
|
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');
|