blun-king-cli 9.1.501 → 9.1.503
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 +34 -14
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 9.1.503 - 2026-08-30
|
|
4
|
+
|
|
5
|
+
- Gives the isolated TodoList maintenance message the complete provider message shape with an explicit empty `toolCalls` array.
|
|
6
|
+
- Prevents the real BLUN provider normalization path from aborting the maintenance turn with `TypeError: message.toolCalls is not iterable`.
|
|
7
|
+
- Adds a regression that iterates the generated message exactly as the provider boundary does before accepting the Todo-only request.
|
|
8
|
+
|
|
9
|
+
## 9.1.502 - 2026-08-30
|
|
10
|
+
|
|
11
|
+
- Runs proactive TodoList maintenance against one isolated Todo-only request instead of replaying the old work-tool history into the restricted maintenance step.
|
|
12
|
+
- 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.
|
|
13
|
+
- Removes completed TodoList items from the persisted visible list immediately while retaining in-progress, pending, blocked, waiting, and aborted work.
|
|
14
|
+
|
|
3
15
|
## 9.1.501 - 2026-08-30
|
|
4
16
|
|
|
5
17
|
- Restores the ordinary work-tool catalogue immediately after a proactive TodoList-only maintenance step.
|
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.503
|
|
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.503 ergaenzt die isolierte Wartungsnachricht um das vom Anbieterpfad
|
|
69
|
+
erwartete leere toolCalls-Feld. Dadurch erreicht der Wartungsschritt das Modell,
|
|
70
|
+
statt in der Nachrichten-Normalisierung mit einem TypeError abzubrechen.
|
|
71
|
+
|
|
72
|
+
Version 9.1.502 fuehrt die automatische Todo-Pflege in einem isolierten
|
|
73
|
+
TodoList-Schritt ohne alte Datei-, Shell- oder MCP-Aufrufe aus. Erledigte Punkte
|
|
74
|
+
werden unmittelbar aus der sichtbaren und gespeicherten Liste entfernt; offene,
|
|
75
|
+
blockierte und wartende Arbeit bleibt erhalten. Dadurch waechst die Liste nicht
|
|
76
|
+
endlos und die Pflege erzeugt keinen roten Tool-not-found-Umweg.
|
|
77
|
+
|
|
68
78
|
Version 9.1.501 stellt nach der automatischen Todo-Pflege den normalen
|
|
69
79
|
Werkzeugkatalog wieder her. Dadurch bleiben Read, Bash und die weiteren fuer den
|
|
70
80
|
Arbeitszug ausgewaehlten Werkzeuge nach dem TodoList-Schritt verfuegbar.
|
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.503
|
|
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.503 ergänzt die isolierte Wartungsnachricht um das vom Anbieterpfad
|
|
85
|
+
erwartete leere `toolCalls`-Feld. Dadurch erreicht der Wartungsschritt das Modell,
|
|
86
|
+
statt in der Nachrichten-Normalisierung mit einem TypeError abzubrechen.
|
|
87
|
+
|
|
88
|
+
Version 9.1.502 führt die automatische Todo-Pflege in einem isolierten
|
|
89
|
+
TodoList-Schritt ohne alte Datei-, Shell- oder MCP-Aufrufe aus. Erledigte Punkte
|
|
90
|
+
werden unmittelbar aus der sichtbaren und gespeicherten Liste entfernt; offene,
|
|
91
|
+
blockierte und wartende Arbeit bleibt erhalten. Dadurch wächst die Liste nicht
|
|
92
|
+
endlos und die Pflege erzeugt keinen roten `Tool not found`-Umweg.
|
|
93
|
+
|
|
84
94
|
Version 9.1.501 stellt nach der automatischen Todo-Pflege den normalen
|
|
85
95
|
Werkzeugkatalog wieder her. Dadurch bleiben Read, Bash und die weiteren fuer den
|
|
86
96
|
Arbeitszug ausgewaehlten Werkzeuge nach dem TodoList-Schritt verfuegbar.
|
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,12 +262798,15 @@ 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
262811
|
if (workStepThinkingEffort === void 0) return { tools: selectedTools };
|
|
262808
262812
|
this.agent.log.info("work step thinking effort", {
|
|
@@ -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,24 @@ ${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
|
+
toolCalls: []
|
|
423290
|
+
}];
|
|
423291
|
+
}
|
|
423269
423292
|
function enforceGoalTodoPolicy(agent, context) {
|
|
423270
423293
|
if (isIdeaGoal(agent)) return;
|
|
423271
423294
|
if (TELEGRAM_DELIVERY_TOOL_RE.test(String(context.toolCall.name ?? ""))) return;
|
|
@@ -423277,6 +423300,7 @@ function enforceGoalTodoPolicy(agent, context) {
|
|
|
423277
423300
|
};
|
|
423278
423301
|
if (todos.length === 0) {
|
|
423279
423302
|
if (activeGoal === null) return;
|
|
423303
|
+
if (context.toolCall.name === "UpdateGoal" && context.args?.status === "complete" && progress.allVisibleWorkCompleted === true) return;
|
|
423280
423304
|
const firstCall = context.toolCalls[0];
|
|
423281
423305
|
if (context.toolCall.id !== firstCall?.id || context.toolCall.name !== "TodoList") return {
|
|
423282
423306
|
block: true,
|
|
@@ -423288,17 +423312,12 @@ function enforceGoalTodoPolicy(agent, context) {
|
|
|
423288
423312
|
};
|
|
423289
423313
|
progress.workCallsSinceRefresh = 0;
|
|
423290
423314
|
progress.refreshRequired = false;
|
|
423315
|
+
progress.allVisibleWorkCompleted = false;
|
|
423291
423316
|
return;
|
|
423292
423317
|
}
|
|
423293
423318
|
if (context.toolCall.name === "TodoList") {
|
|
423294
423319
|
const nextTodos = context.args?.todos;
|
|
423295
423320
|
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
423321
|
if (nextTodos.length === 0) {
|
|
423303
423322
|
if (activeGoal !== null) return {
|
|
423304
423323
|
block: true,
|
|
@@ -423316,6 +423335,7 @@ function enforceGoalTodoPolicy(agent, context) {
|
|
|
423316
423335
|
reason: "A maintained TodoList must keep exactly one item in_progress while unfinished work remains."
|
|
423317
423336
|
};
|
|
423318
423337
|
}
|
|
423338
|
+
progress.allVisibleWorkCompleted = nextTodos.length > 0 && nextTodos.every((todo) => todo?.status === "done");
|
|
423319
423339
|
if (progress.refreshRequired) {
|
|
423320
423340
|
const normalized = (value) => value.map((todo) => ({ title: String(todo?.title ?? "").trim(), status: todo?.status }));
|
|
423321
423341
|
if (JSON.stringify(normalized(nextTodos)) === JSON.stringify(normalized(todos))) return {
|