blun-king-cli 9.1.500 → 9.1.502
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 +12 -0
- package/LIESMICH.txt +11 -1
- package/README.md +11 -1
- package/blun.mjs +35 -16
- package/package.json +2 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 9.1.502 - 2026-08-30
|
|
4
|
+
|
|
5
|
+
- Runs proactive TodoList maintenance against one isolated Todo-only request instead of replaying the old work-tool history into the restricted maintenance step.
|
|
6
|
+
- Prevents the maintenance model from repeating a historical `Read`, `Bash`, or MCP call while only TodoList is exposed, eliminating the resulting red `Tool not found` detour.
|
|
7
|
+
- Removes completed TodoList items from the persisted visible list immediately while retaining in-progress, pending, blocked, waiting, and aborted work.
|
|
8
|
+
|
|
9
|
+
## 9.1.501 - 2026-08-30
|
|
10
|
+
|
|
11
|
+
- Restores the ordinary work-tool catalogue immediately after a proactive TodoList-only maintenance step.
|
|
12
|
+
- Prevents `Bash`, `Read`, and every other selected turn tool from remaining hidden after TodoList maintenance succeeds.
|
|
13
|
+
- Adds a regression check for both normal and thinking-effort work steps after the Todo-only step.
|
|
14
|
+
|
|
3
15
|
## 9.1.500 - 2026-08-30 - Golden Release
|
|
4
16
|
|
|
5
17
|
- Marks the complete cross-platform BLUN King package as the Golden Release for Windows, Linux, and macOS.
|
package/LIESMICH.txt
CHANGED
|
@@ -9,7 +9,7 @@ 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.502
|
|
13
13
|
|
|
14
14
|
Start
|
|
15
15
|
-----
|
|
@@ -65,6 +65,16 @@ geschriebenen Entwurf zu löschen. Das gilt auch bei
|
|
|
65
65
|
Autovervollständigung, Geistervorschlägen, Bash-Eingabe und einer offenen
|
|
66
66
|
Mehrzeileneingabe.
|
|
67
67
|
|
|
68
|
+
Version 9.1.502 fuehrt die automatische Todo-Pflege in einem isolierten
|
|
69
|
+
TodoList-Schritt ohne alte Datei-, Shell- oder MCP-Aufrufe aus. Erledigte Punkte
|
|
70
|
+
werden unmittelbar aus der sichtbaren und gespeicherten Liste entfernt; offene,
|
|
71
|
+
blockierte und wartende Arbeit bleibt erhalten. Dadurch waechst die Liste nicht
|
|
72
|
+
endlos und die Pflege erzeugt keinen roten Tool-not-found-Umweg.
|
|
73
|
+
|
|
74
|
+
Version 9.1.501 stellt nach der automatischen Todo-Pflege den normalen
|
|
75
|
+
Werkzeugkatalog wieder her. Dadurch bleiben Read, Bash und die weiteren fuer den
|
|
76
|
+
Arbeitszug ausgewaehlten Werkzeuge nach dem TodoList-Schritt verfuegbar.
|
|
77
|
+
|
|
68
78
|
Version 9.1.500 ist die Golden Release fuer Windows, Linux und macOS. Sie traegt
|
|
69
79
|
den vollstaendigen Funktionsstand von 9.1.499 unveraendert und wird im
|
|
70
80
|
oeffentlichen Changelog mit einer eigenen goldenen Ueberschrift gekennzeichnet.
|
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@ 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.502
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
## Reproduzierbares Staging und Packen
|
|
@@ -81,6 +81,16 @@ konkurrierenden Start zurückgewiesen und bleiben an der Spitze der
|
|
|
81
81
|
FIFO-Warteschlange. Für diesen normalen Wartestatus erscheint kein
|
|
82
82
|
`turn.agent_busy`-Fehler.
|
|
83
83
|
|
|
84
|
+
Version 9.1.502 führt die automatische Todo-Pflege in einem isolierten
|
|
85
|
+
TodoList-Schritt ohne alte Datei-, Shell- oder MCP-Aufrufe aus. Erledigte Punkte
|
|
86
|
+
werden unmittelbar aus der sichtbaren und gespeicherten Liste entfernt; offene,
|
|
87
|
+
blockierte und wartende Arbeit bleibt erhalten. Dadurch wächst die Liste nicht
|
|
88
|
+
endlos und die Pflege erzeugt keinen roten `Tool not found`-Umweg.
|
|
89
|
+
|
|
90
|
+
Version 9.1.501 stellt nach der automatischen Todo-Pflege den normalen
|
|
91
|
+
Werkzeugkatalog wieder her. Dadurch bleiben Read, Bash und die weiteren fuer den
|
|
92
|
+
Arbeitszug ausgewaehlten Werkzeuge nach dem TodoList-Schritt verfuegbar.
|
|
93
|
+
|
|
84
94
|
Version 9.1.500 ist die Golden Release fuer Windows, Linux und macOS. Sie traegt
|
|
85
95
|
den vollstaendigen Funktionsstand von 9.1.499 unveraendert und wird im
|
|
86
96
|
oeffentlichen Changelog mit einer eigenen goldenen Ueberschrift gekennzeichnet.
|
package/blun.mjs
CHANGED
|
@@ -30544,7 +30544,7 @@ var init_todo_list = __esmMin((() => {
|
|
|
30544
30544
|
init_todo_list$1();
|
|
30545
30545
|
TODO_LIST_TOOL_NAME = "TodoList";
|
|
30546
30546
|
TODO_STORE_KEY = "todo";
|
|
30547
|
-
TODO_LIST_WRITE_REMINDER = "Keep the task list aligned with the work.
|
|
30547
|
+
TODO_LIST_WRITE_REMINDER = "Keep the task list aligned with the work. Completed items disappear automatically; keep one item in_progress while work is active, and retain pending, blocked, waiting, or aborted items until they are resolved.";
|
|
30548
30548
|
TodoItemSchema = object({
|
|
30549
30549
|
title: string().min(1).describe("Short, actionable title for the todo."),
|
|
30550
30550
|
status: _enum([
|
|
@@ -30587,7 +30587,7 @@ var init_todo_list = __esmMin((() => {
|
|
|
30587
30587
|
return this.store.get("todo") ?? [];
|
|
30588
30588
|
}
|
|
30589
30589
|
setTodos(todos) {
|
|
30590
|
-
this.store.set(TODO_STORE_KEY, todos.map((todo) => ({
|
|
30590
|
+
this.store.set(TODO_STORE_KEY, todos.filter((todo) => todo.status !== "done").map((todo) => ({
|
|
30591
30591
|
title: todo.title,
|
|
30592
30592
|
status: todo.status
|
|
30593
30593
|
})));
|
|
@@ -230331,6 +230331,7 @@ var init_goal$1 = __esmMin((() => {
|
|
|
230331
230331
|
}
|
|
230332
230332
|
this.persistState(state);
|
|
230333
230333
|
this.agent.tools.updateStore(TODO_STORE_KEY, []);
|
|
230334
|
+
this.agent.goalTodoPolicyState = void 0;
|
|
230334
230335
|
this.agent.records.logRecord({
|
|
230335
230336
|
type: "goal.create",
|
|
230336
230337
|
goalId: state.goalId,
|
|
@@ -262797,20 +262798,23 @@ var init_turn = __esmMin((() => {
|
|
|
262797
262798
|
stepNumber,
|
|
262798
262799
|
mode: todoMaintenanceMode,
|
|
262799
262800
|
workCallsSinceRefresh: this.agent.goalTodoPolicyState?.workCallsSinceRefresh ?? 0
|
|
262800
|
-
|
|
262801
|
-
|
|
262802
|
-
|
|
262803
|
-
|
|
262804
|
-
|
|
262805
|
-
|
|
262801
|
+
});
|
|
262802
|
+
const todoSystemPrompt = buildGoalTodoMaintenanceSystemPrompt(this.agent, turnSystemPrompt ?? this.agent.effectiveSystemPrompt, todoMaintenanceMode);
|
|
262803
|
+
const todoMessages = buildGoalTodoMaintenanceMessages(this.agent, todoMaintenanceMode);
|
|
262804
|
+
return {
|
|
262805
|
+
llm: this.agent.llmForTurn("low", todoSystemPrompt),
|
|
262806
|
+
tools: [todoTool],
|
|
262807
|
+
buildMessages: () => todoMessages,
|
|
262808
|
+
buildMessagesStrict: () => todoMessages
|
|
262809
|
+
};
|
|
262806
262810
|
}
|
|
262807
|
-
if (workStepThinkingEffort === void 0) return;
|
|
262811
|
+
if (workStepThinkingEffort === void 0) return { tools: selectedTools };
|
|
262808
262812
|
this.agent.log.info("work step thinking effort", {
|
|
262809
262813
|
stepNumber,
|
|
262810
262814
|
previousStepToolOutcome,
|
|
262811
262815
|
thinkingEffort: workStepThinkingEffort
|
|
262812
262816
|
});
|
|
262813
|
-
return { llm: this.agent.llmForTurn(workStepThinkingEffort) };
|
|
262817
|
+
return { llm: this.agent.llmForTurn(workStepThinkingEffort), tools: selectedTools };
|
|
262814
262818
|
}
|
|
262815
262819
|
const steerEfforts = pendingSteers.map((steer) => blunTurnHasAttachment(steer.input) ? void 0 : selectThinkingEffortForBufferedSteer(blunExtractText(blunThinkingIntentInput(steer.input)), steer.origin.kind));
|
|
262816
262820
|
if (steerEfforts.some((effort) => effort === void 0)) return;
|
|
@@ -263227,6 +263231,7 @@ var init_update_goal = __esmMin((() => {
|
|
|
263227
263231
|
if (args.status === "complete") {
|
|
263228
263232
|
const completed = await goal.markComplete({}, "model");
|
|
263229
263233
|
if (completed !== null) this.agent.tools.updateStore(TODO_STORE_KEY, []);
|
|
263234
|
+
if (completed !== null) this.agent.goalTodoPolicyState = void 0;
|
|
263230
263235
|
if (completed !== null) this.agent.context.appendSystemReminder(buildGoalCompletionSummaryPrompt(completed), {
|
|
263231
263236
|
kind: "system_trigger",
|
|
263232
263237
|
name: GOAL_COMPLETION_REMINDER_NAME
|
|
@@ -423266,6 +423271,23 @@ ${visibleTodoList}
|
|
|
423266
423271
|
|
|
423267
423272
|
${basePrompt}`;
|
|
423268
423273
|
}
|
|
423274
|
+
function buildGoalTodoMaintenanceMessages(agent, mode) {
|
|
423275
|
+
const goal = agent.goal.getActiveGoal();
|
|
423276
|
+
const todos = ideaTodos(agent);
|
|
423277
|
+
const objective = String(goal?.objective ?? "Continue the current multi-step task.").trim();
|
|
423278
|
+
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");
|
|
423279
|
+
const action = mode === "initial" ? "Create the task-specific TodoList from the active objective. Keep exactly one item in_progress and every later item pending." : "Refresh the TodoList from the current verified state. Mark finished work done, keep the actual current step in_progress, and leave later work pending. Completed items disappear automatically after this call.";
|
|
423280
|
+
const request = [
|
|
423281
|
+
"Return exactly one TodoList tool call and no prose.",
|
|
423282
|
+
action,
|
|
423283
|
+
`Active objective: ${objective}`,
|
|
423284
|
+
visibleTodoList
|
|
423285
|
+
].join("\n\n");
|
|
423286
|
+
return [{
|
|
423287
|
+
role: "user",
|
|
423288
|
+
content: [{ type: "text", text: request }]
|
|
423289
|
+
}];
|
|
423290
|
+
}
|
|
423269
423291
|
function enforceGoalTodoPolicy(agent, context) {
|
|
423270
423292
|
if (isIdeaGoal(agent)) return;
|
|
423271
423293
|
if (TELEGRAM_DELIVERY_TOOL_RE.test(String(context.toolCall.name ?? ""))) return;
|
|
@@ -423277,6 +423299,7 @@ function enforceGoalTodoPolicy(agent, context) {
|
|
|
423277
423299
|
};
|
|
423278
423300
|
if (todos.length === 0) {
|
|
423279
423301
|
if (activeGoal === null) return;
|
|
423302
|
+
if (context.toolCall.name === "UpdateGoal" && context.args?.status === "complete" && progress.allVisibleWorkCompleted === true) return;
|
|
423280
423303
|
const firstCall = context.toolCalls[0];
|
|
423281
423304
|
if (context.toolCall.id !== firstCall?.id || context.toolCall.name !== "TodoList") return {
|
|
423282
423305
|
block: true,
|
|
@@ -423288,17 +423311,12 @@ function enforceGoalTodoPolicy(agent, context) {
|
|
|
423288
423311
|
};
|
|
423289
423312
|
progress.workCallsSinceRefresh = 0;
|
|
423290
423313
|
progress.refreshRequired = false;
|
|
423314
|
+
progress.allVisibleWorkCompleted = false;
|
|
423291
423315
|
return;
|
|
423292
423316
|
}
|
|
423293
423317
|
if (context.toolCall.name === "TodoList") {
|
|
423294
423318
|
const nextTodos = context.args?.todos;
|
|
423295
423319
|
if (!Array.isArray(nextTodos)) return;
|
|
423296
|
-
const normalizeTitle = (value) => String(value ?? "").trim().toLowerCase().replace(/\s+/gu, " ");
|
|
423297
|
-
const missingCompleted = todos.filter((todo, index) => todo?.status === "done" && !nextTodos.some((nextTodo) => nextTodo?.status === "done" && normalizeTitle(nextTodo.title) === normalizeTitle(todo.title)) && nextTodos[index]?.status !== "done");
|
|
423298
|
-
if (missingCompleted.length > 0) return {
|
|
423299
|
-
block: true,
|
|
423300
|
-
reason: `Completed TodoList evidence is append-only. Keep each completed item present and done. If later evidence reopens work, retain the completed item and add a separate in_progress item with the reason. Missing completed item: ${String(missingCompleted[0]?.title ?? "").trim()}`
|
|
423301
|
-
};
|
|
423302
423320
|
if (nextTodos.length === 0) {
|
|
423303
423321
|
if (activeGoal !== null) return {
|
|
423304
423322
|
block: true,
|
|
@@ -423316,6 +423334,7 @@ function enforceGoalTodoPolicy(agent, context) {
|
|
|
423316
423334
|
reason: "A maintained TodoList must keep exactly one item in_progress while unfinished work remains."
|
|
423317
423335
|
};
|
|
423318
423336
|
}
|
|
423337
|
+
progress.allVisibleWorkCompleted = nextTodos.length > 0 && nextTodos.every((todo) => todo?.status === "done");
|
|
423319
423338
|
if (progress.refreshRequired) {
|
|
423320
423339
|
const normalized = (value) => value.map((todo) => ({ title: String(todo?.title ?? "").trim(), status: todo?.status }));
|
|
423321
423340
|
if (JSON.stringify(normalized(nextTodos)) === JSON.stringify(normalized(todos))) return {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "blun-king-cli",
|
|
3
|
-
"version": "9.1.
|
|
3
|
+
"version": "9.1.502",
|
|
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": {
|
|
@@ -61,6 +61,5 @@
|
|
|
61
61
|
"dependencies": {
|
|
62
62
|
"blun-king-cli": "^9.1.62",
|
|
63
63
|
"node-addon-api": "^7.1.1"
|
|
64
|
-
}
|
|
65
|
-
"devDependencies": {}
|
|
64
|
+
}
|
|
66
65
|
}
|