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 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.500
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.500
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. 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,20 +262798,23 @@ 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
- 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.500",
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
  }