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 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.501
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.501
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. Record a truthful terminal status for every finished item, keep one item in_progress while work is active, and clear items that no longer apply.";
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
- const todoSystemPrompt = buildGoalTodoMaintenanceSystemPrompt(this.agent, turnSystemPrompt ?? this.agent.effectiveSystemPrompt, todoMaintenanceMode);
262802
- return {
262803
- llm: this.agent.llmForTurn("low", todoSystemPrompt),
262804
- tools: [todoTool]
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 {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blun-king-cli",
3
- "version": "9.1.501",
3
+ "version": "9.1.503",
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": {