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 +6 -0
- package/LIESMICH.txt +2 -2
- package/README.md +2 -2
- package/blun.mjs +48 -2
- package/package.json +1 -1
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.
|
|
12
|
+
npm install -g blun-king-cli@9.1.512
|
|
13
13
|
|
|
14
14
|
AgentSpine 0.10.1
|
|
15
15
|
-----------------
|
|
16
|
-
Version 9.1.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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",
|