blun-king-cli 9.1.511 → 9.1.512

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,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 9.1.512 - 2026-08-31
4
+
5
+ - Makes a proactive TodoList maintenance step set the same mandatory refresh state as the fallback policy gate, so an unchanged list can no longer reset the deadline and silently continue.
6
+ - Gives the isolated Todo-only request at most eight compact tool-name/outcome facts since the last accepted refresh, without replaying prompts, arguments, commands, full paths, results, or work history.
7
+ - Retains bounded evidence after a failed TodoList attempt, clears it after the accepted TodoList tool succeeds, and covers proactive enforcement, privacy, boundedness, retry, and tool restoration in the 127-test package suite.
8
+
3
9
  ## 9.1.511 - 2026-08-31
4
10
 
5
11
  - Upgrades the managed core plugin from AgentSpine 0.8.0 to the cache-distinct 0.10.1 bundle with mandatory pre-answer receipts, Must-Remember, self-healing authenticated persona and relationship graph reconciliation, and a five-second local relationship deadline.
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.511
12
+ npm install -g blun-king-cli@9.1.512
13
13
 
14
14
  AgentSpine 0.10.1
15
15
  -----------------
16
- Version 9.1.511 liefert AgentSpine 0.10.1 als neue inhaltsadressierte
16
+ Version 9.1.512 liefert AgentSpine 0.10.1 als neue inhaltsadressierte
17
17
  Pluginfassung. Der Preflight prueft weiterhin jede aktive Host-Anweisungsdatei
18
18
  race-sicher und bindet SHA-256 sowie Dateiidentitaet an den Zug, dupliziert den
19
19
  bereits vom Host geladenen Volltext aber nicht mehr in den Laufzeitkontext.
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.511
12
+ npm install -g blun-king-cli@9.1.512
13
13
  ```
14
14
 
15
15
  ## AgentSpine 0.10.1
16
16
 
17
- Version 9.1.511 liefert AgentSpine 0.10.1 als neue inhaltsadressierte
17
+ Version 9.1.512 liefert AgentSpine 0.10.1 als neue inhaltsadressierte
18
18
  Pluginfassung. Der Preflight prueft weiterhin jede aktive Host-Anweisungsdatei
19
19
  race-sicher und bindet SHA-256 sowie Dateiidentitaet an den Zug, dupliziert den
20
20
  bereits vom Host geladenen Volltext aber nicht mehr in den Laufzeitkontext.
package/blun.mjs CHANGED
@@ -262985,6 +262985,7 @@ var init_turn = __esmMin((() => {
262985
262985
  const { isError, output } = finalResult;
262986
262986
  currentStepHadTool = true;
262987
262987
  if (isError === true) currentStepHadFailure = true;
262988
+ recordGoalTodoEvidence(this.agent, ctx.toolCall.name, ctx.args, isError);
262988
262989
  directReplyTurnStop.noteToolResult(ctx.toolCall.name, isError);
262989
262990
  const event = isError === true ? "PostToolUseFailure" : "PostToolUse";
262990
262991
  this.agent.hooks?.fireAndForgetTrigger(event, {
@@ -423291,6 +423292,7 @@ async function handleGoalCommand(host, args) {
423291
423292
  const IDEA_CONTRACT_MARKER = "Work as a self-directing employee:";
423292
423293
  const IDEA_ALLOWED_CHANNELS = Object.freeze([]);
423293
423294
  const GOAL_TODO_REFRESH_WORK_CALL_LIMIT = 8;
423295
+ const GOAL_TODO_EVIDENCE_LIMIT = 8;
423294
423296
  const IDEA_TERMINAL_TODO_STATUSES = Object.freeze([
423295
423297
  "done",
423296
423298
  "blocked",
@@ -423318,6 +423320,45 @@ function validInitialIdeaPlan(value) {
423318
423320
  }
423319
423321
  return active === 1;
423320
423322
  }
423323
+ function goalTodoEvidenceTarget(args) {
423324
+ if (args === null || typeof args !== "object") return "";
423325
+ if (Array.isArray(args.requests)) return `${args.requests.length} requested files`;
423326
+ for (const key of ["file_path", "path", "old_path", "new_path"]) {
423327
+ const value = typeof args[key] === "string" ? args[key].trim() : "";
423328
+ if (value === "") continue;
423329
+ return value.replaceAll("\\", "/").split("/").filter(Boolean).at(-1)?.slice(0, 120) ?? "";
423330
+ }
423331
+ return "";
423332
+ }
423333
+ function goalTodoEvidenceLabel(toolName, args, isError) {
423334
+ const name = String(toolName ?? "tool");
423335
+ const outcome = isError === true ? "failed" : "succeeded";
423336
+ const target = goalTodoEvidenceTarget(args);
423337
+ if (target !== "") return `${name} ${outcome}: ${target}`;
423338
+ if (name === "Bash") {
423339
+ const command = typeof args?.command === "string" ? args.command : "";
423340
+ if (/\bnode\s+--check\b/iu.test(command)) return `Node syntax check ${outcome}`;
423341
+ if (/\b(?:sha256sum|Get-FileHash)\b/iu.test(command)) return `SHA-256 measurement ${outcome}`;
423342
+ if (/\b(?:rg|grep)\b/iu.test(command)) return `Shell search ${outcome}`;
423343
+ }
423344
+ return `${name} ${outcome}`;
423345
+ }
423346
+ function recordGoalTodoEvidence(agent, toolName, args, isError) {
423347
+ if (isIdeaGoal(agent) || agent.goal.getActiveGoal() === null) return;
423348
+ const name = String(toolName ?? "");
423349
+ const progress = agent.goalTodoPolicyState ??= {
423350
+ workCallsSinceRefresh: 0,
423351
+ refreshRequired: false
423352
+ };
423353
+ if (name === "TodoList") {
423354
+ if (isError !== true) progress.recentEvidence = [];
423355
+ return;
423356
+ }
423357
+ if (name === "UpdateGoal" || TELEGRAM_DELIVERY_TOOL_RE.test(name)) return;
423358
+ const recentEvidence = Array.isArray(progress.recentEvidence) ? progress.recentEvidence : [];
423359
+ recentEvidence.push(goalTodoEvidenceLabel(name, args, isError));
423360
+ progress.recentEvidence = recentEvidence.slice(-GOAL_TODO_EVIDENCE_LIMIT);
423361
+ }
423321
423362
  function goalTodoMaintenanceMode(agent) {
423322
423363
  if (isIdeaGoal(agent)) return null;
423323
423364
  const todos = ideaTodos(agent);
@@ -423326,7 +423367,9 @@ function goalTodoMaintenanceMode(agent) {
423326
423367
  workCallsSinceRefresh: 0,
423327
423368
  refreshRequired: false
423328
423369
  };
423329
- return progress.refreshRequired || progress.workCallsSinceRefresh >= GOAL_TODO_REFRESH_WORK_CALL_LIMIT ? "refresh" : null;
423370
+ if (!progress.refreshRequired && progress.workCallsSinceRefresh < GOAL_TODO_REFRESH_WORK_CALL_LIMIT) return null;
423371
+ progress.refreshRequired = true;
423372
+ return "refresh";
423330
423373
  }
423331
423374
  function buildGoalTodoMaintenanceSystemPrompt(agent, mode) {
423332
423375
  const todos = ideaTodos(agent);
@@ -423343,14 +423386,17 @@ ${visibleTodoList}
423343
423386
  function buildGoalTodoMaintenanceMessages(agent, mode) {
423344
423387
  const goal = agent.goal.getActiveGoal();
423345
423388
  const todos = ideaTodos(agent);
423389
+ const recentEvidence = Array.isArray(agent.goalTodoPolicyState?.recentEvidence) ? agent.goalTodoPolicyState.recentEvidence.slice(-GOAL_TODO_EVIDENCE_LIMIT) : [];
423346
423390
  const objective = String(goal?.objective ?? "Continue the current multi-step task.").trim();
423347
423391
  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");
423392
+ const verifiedEvidence = recentEvidence.length === 0 ? "No new work-tool evidence is available." : ["Recent bounded work-tool evidence since the last accepted TodoList:", ...recentEvidence.map((entry) => `- ${entry}`)].join("\n");
423348
423393
  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.";
423349
423394
  const request = [
423350
423395
  "Return exactly one TodoList tool call and no prose.",
423351
423396
  action,
423352
423397
  `Active objective: ${objective}`,
423353
- visibleTodoList
423398
+ visibleTodoList,
423399
+ verifiedEvidence
423354
423400
  ].join("\n\n");
423355
423401
  return [{
423356
423402
  role: "user",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blun-king-cli",
3
- "version": "9.1.511",
3
+ "version": "9.1.512",
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": {