blun-king-cli 9.1.456 → 9.1.458
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/bin/cognitive-action-checkpoint.cjs +15 -2
- package/bin/outbound-claim-provenance.cjs +35 -7
- package/blun.mjs +13 -7
- package/package.json +1 -1
|
@@ -316,7 +316,18 @@ function externalReportOriginFromRuntimeSource(input) {
|
|
|
316
316
|
});
|
|
317
317
|
}
|
|
318
318
|
|
|
319
|
-
function
|
|
319
|
+
function assertExternalReportChecksumClaims(report, claimText) {
|
|
320
|
+
const claims = extractChecksumClaims(claimText);
|
|
321
|
+
if (claims.length === 0) return;
|
|
322
|
+
const reportClaims = new Set(report.claimTokens ?? []);
|
|
323
|
+
for (const claim of claims) {
|
|
324
|
+
if (!reportClaims.has(claim)) {
|
|
325
|
+
throw new TypeError(`checksum claim ${claim} is absent from the selected external report`);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
function resolveExternalReportOrigin(selectorInput, runtimeExternalReports, claimText) {
|
|
320
331
|
const selector = normalizeExternalReportSelector(selectorInput);
|
|
321
332
|
const reports = Array.isArray(runtimeExternalReports)
|
|
322
333
|
? runtimeExternalReports.map(normalizeRuntimeExternalReportSource)
|
|
@@ -327,6 +338,7 @@ function resolveExternalReportOrigin(selectorInput, runtimeExternalReports) {
|
|
|
327
338
|
if (report === undefined) {
|
|
328
339
|
throw new TypeError('externalReportSource does not match a trusted external report in the current turn');
|
|
329
340
|
}
|
|
341
|
+
assertExternalReportChecksumClaims(report, claimText);
|
|
330
342
|
return externalReportOriginFromRuntimeSource(report);
|
|
331
343
|
}
|
|
332
344
|
|
|
@@ -911,7 +923,7 @@ function assertActionCheckpointEvidenceBasis(current, input, runtimeEvidence, ru
|
|
|
911
923
|
throw new TypeError('external_report evidenceBasis cannot claim verified epistemicState');
|
|
912
924
|
}
|
|
913
925
|
if (runtimeExternalReports !== undefined) {
|
|
914
|
-
resolveExternalReportOrigin(input?.externalReportSource, runtimeExternalReports);
|
|
926
|
+
resolveExternalReportOrigin(input?.externalReportSource, runtimeExternalReports, input?.lastVerified);
|
|
915
927
|
}
|
|
916
928
|
} else if (input?.externalReportSource !== undefined) {
|
|
917
929
|
throw new TypeError('externalReportSource requires external_report evidenceBasis');
|
|
@@ -972,6 +984,7 @@ function normalizeActionCheckpoint(input, options = {}) {
|
|
|
972
984
|
checkpoint.externalReportOrigin = resolveExternalReportOrigin(
|
|
973
985
|
input.externalReportSource,
|
|
974
986
|
options.runtimeExternalReports,
|
|
987
|
+
input.lastVerified,
|
|
975
988
|
);
|
|
976
989
|
} else if (replay && input.externalReportOrigin !== undefined) {
|
|
977
990
|
checkpoint.externalReportOrigin = normalizeExternalReportOrigin(input.externalReportOrigin);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const MAX_CLAIMS = 32;
|
|
4
|
+
const MAX_CONFLICT_ORIGINS = 8;
|
|
4
5
|
const CHECKSUM_CLAIM_RE = /(?<![A-Za-z0-9])[A-Fa-f0-9]{16,128}(?![A-Za-z0-9])/gu;
|
|
5
6
|
const TELEGRAM_MESSAGE_TOOL_RE = /^mcp__[^\s]*telegram[^\s]*__(?:reply|edit_message)$/iu;
|
|
6
7
|
const REF_RE = /^[a-f0-9]{16}$/u;
|
|
@@ -56,12 +57,22 @@ function normalizedExternalReports(value) {
|
|
|
56
57
|
return reports;
|
|
57
58
|
}
|
|
58
59
|
|
|
60
|
+
function externalClaimOrigin(report) {
|
|
61
|
+
return Object.freeze({
|
|
62
|
+
reporter: report.reporter,
|
|
63
|
+
...(report.reporterRef !== undefined ? { reporterRef: report.reporterRef } : {}),
|
|
64
|
+
eventRef: report.eventRef,
|
|
65
|
+
occurredAt: report.occurredAt,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
59
69
|
function assessOutboundClaimProvenance({ text, localClaims = [], externalReports = [] } = {}) {
|
|
60
70
|
const claims = extractChecksumClaims(text);
|
|
61
71
|
const local = new Set(extractChecksumClaims(Array.isArray(localClaims) ? localClaims.join(' ') : ''));
|
|
62
72
|
const reports = normalizedExternalReports(externalReports);
|
|
63
73
|
const localMatches = [];
|
|
64
74
|
const externalMatches = [];
|
|
75
|
+
const conflicted = [];
|
|
65
76
|
const unattributed = [];
|
|
66
77
|
|
|
67
78
|
for (const value of claims) {
|
|
@@ -69,17 +80,31 @@ function assessOutboundClaimProvenance({ text, localClaims = [], externalReports
|
|
|
69
80
|
localMatches.push(value);
|
|
70
81
|
continue;
|
|
71
82
|
}
|
|
72
|
-
const
|
|
73
|
-
|
|
83
|
+
const matchingByEvent = new Map();
|
|
84
|
+
for (const report of reports) {
|
|
85
|
+
if (report.claimTokens.includes(value) && !matchingByEvent.has(report.eventRef)) {
|
|
86
|
+
matchingByEvent.set(report.eventRef, report);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const matchingReports = [...matchingByEvent.values()];
|
|
90
|
+
if (matchingReports.length === 0) {
|
|
74
91
|
unattributed.push(value);
|
|
75
92
|
continue;
|
|
76
93
|
}
|
|
94
|
+
if (matchingReports.length > 1) {
|
|
95
|
+
conflicted.push(Object.freeze({
|
|
96
|
+
value,
|
|
97
|
+
totalOrigins: matchingReports.length,
|
|
98
|
+
reports: Object.freeze(
|
|
99
|
+
matchingReports.slice(0, MAX_CONFLICT_ORIGINS).map(externalClaimOrigin),
|
|
100
|
+
),
|
|
101
|
+
}));
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const [report] = matchingReports;
|
|
77
105
|
const external = {
|
|
78
106
|
value,
|
|
79
|
-
|
|
80
|
-
...(report.reporterRef !== undefined ? { reporterRef: report.reporterRef } : {}),
|
|
81
|
-
eventRef: report.eventRef,
|
|
82
|
-
occurredAt: report.occurredAt,
|
|
107
|
+
...externalClaimOrigin(report),
|
|
83
108
|
};
|
|
84
109
|
externalMatches.push(Object.freeze(external));
|
|
85
110
|
}
|
|
@@ -87,6 +112,7 @@ function assessOutboundClaimProvenance({ text, localClaims = [], externalReports
|
|
|
87
112
|
return Object.freeze({
|
|
88
113
|
local: Object.freeze(localMatches),
|
|
89
114
|
external: Object.freeze(externalMatches),
|
|
115
|
+
conflicted: Object.freeze(conflicted),
|
|
90
116
|
unattributed: Object.freeze(unattributed),
|
|
91
117
|
});
|
|
92
118
|
}
|
|
@@ -111,7 +137,9 @@ function provenanceAdvisoryForToolCall({ toolName, toolArgs, localClaims, extern
|
|
|
111
137
|
localClaims,
|
|
112
138
|
externalReports,
|
|
113
139
|
});
|
|
114
|
-
if (assessment.external.length === 0
|
|
140
|
+
if (assessment.external.length === 0
|
|
141
|
+
&& assessment.conflicted.length === 0
|
|
142
|
+
&& assessment.unattributed.length === 0) return null;
|
|
115
143
|
return Object.freeze({ ...assessment, blocked: false });
|
|
116
144
|
}
|
|
117
145
|
|
package/blun.mjs
CHANGED
|
@@ -261955,15 +261955,21 @@ var init_turn = __esmMin((() => {
|
|
|
261955
261955
|
});
|
|
261956
261956
|
if (provenanceAdvisory === null) return;
|
|
261957
261957
|
const external = provenanceAdvisory.external.map((entry) => `${entry.value} (${entry.reporter}; ${entry.eventRef}; ${entry.occurredAt})`).join(", ") || "-";
|
|
261958
|
+
const conflicted = provenanceAdvisory.conflicted.map((entry) => `${entry.value} (${entry.reports.map((report) => `${report.reporter}; ${report.eventRef}; ${report.occurredAt}`).join(" | ")})`).join(", ") || "-";
|
|
261958
261959
|
const unattributed = provenanceAdvisory.unattributed.join(", ") || "-";
|
|
261959
261960
|
this.agent.emitEvent({
|
|
261960
261961
|
type: "warning",
|
|
261961
261962
|
code: "OUTBOUND_CLAIM_PROVENANCE",
|
|
261962
|
-
message: uiText("sessionEvent.provenance.advisory", {
|
|
261963
|
+
message: uiText("sessionEvent.provenance.advisory", {
|
|
261964
|
+
external,
|
|
261965
|
+
conflicted,
|
|
261966
|
+
unattributed
|
|
261967
|
+
}),
|
|
261963
261968
|
blocked: false,
|
|
261964
261969
|
details: {
|
|
261965
261970
|
blocked: false,
|
|
261966
261971
|
external: provenanceAdvisory.external,
|
|
261972
|
+
conflicted: provenanceAdvisory.conflicted,
|
|
261967
261973
|
unattributed: provenanceAdvisory.unattributed
|
|
261968
261974
|
}
|
|
261969
261975
|
});
|
|
@@ -506466,7 +506472,7 @@ registerUiCatalogFragment({
|
|
|
506466
506472
|
"sessionEvent.goalQueue.blockedTitle": "Goal blocked.",
|
|
506467
506473
|
"sessionEvent.goalQueue.blockedDetail": "The next queued goal will start only after this goal is complete.",
|
|
506468
506474
|
"sessionEvent.warning": "Warning: {message}",
|
|
506469
|
-
"sessionEvent.provenance.advisory": "Source check before sending; the message was not blocked. Forwarded report: {external}. Not found in this turn's tool output or a source event: {unattributed}. Forwarding is allowed, but do not present these values as your own measurement.",
|
|
506475
|
+
"sessionEvent.provenance.advisory": "Source check before sending; the message was not blocked. Forwarded report: {external}. Ambiguous source events: {conflicted}. Not found in this turn's tool output or a source event: {unattributed}. Forwarding is allowed, but do not present these values as your own measurement.",
|
|
506470
506476
|
"sessionEvent.mcp.tool.one": "{count} tool",
|
|
506471
506477
|
"sessionEvent.mcp.tool.other": "{count} tools",
|
|
506472
506478
|
"sessionEvent.mcp.connected": "MCP server \"{name}\" connected · {tools} ({transport})",
|
|
@@ -506497,7 +506503,7 @@ registerUiCatalogFragment({
|
|
|
506497
506503
|
"sessionEvent.goalQueue.blockedTitle": "Ziel blockiert.",
|
|
506498
506504
|
"sessionEvent.goalQueue.blockedDetail": "Das nächste vorgemerkte Ziel startet erst, wenn dieses Ziel abgeschlossen ist.",
|
|
506499
506505
|
"sessionEvent.warning": "Warnung: {message}",
|
|
506500
|
-
"sessionEvent.provenance.advisory": "Herkunftsprüfung vor dem Senden; die Nachricht wurde nicht blockiert. Weitergeleiteter Bericht: {external}. Weder in einer Werkzeugausgabe dieses Durchlaufs noch in einem Quellereignis gefunden: {unattributed}. Die Weitergabe ist erlaubt, diese Werte dürfen jedoch nicht als eigene Messung dargestellt werden.",
|
|
506506
|
+
"sessionEvent.provenance.advisory": "Herkunftsprüfung vor dem Senden; die Nachricht wurde nicht blockiert. Weitergeleiteter Bericht: {external}. Mehrdeutige Quellereignisse: {conflicted}. Weder in einer Werkzeugausgabe dieses Durchlaufs noch in einem Quellereignis gefunden: {unattributed}. Die Weitergabe ist erlaubt, diese Werte dürfen jedoch nicht als eigene Messung dargestellt werden.",
|
|
506501
506507
|
"sessionEvent.mcp.tool.one": "{count} Tool",
|
|
506502
506508
|
"sessionEvent.mcp.tool.other": "{count} Tools",
|
|
506503
506509
|
"sessionEvent.mcp.connected": "MCP-Server „{name}“ verbunden · {tools} ({transport})",
|
|
@@ -506528,7 +506534,7 @@ registerUiCatalogFragment({
|
|
|
506528
506534
|
"sessionEvent.goalQueue.blockedTitle": "Objetivo bloqueado.",
|
|
506529
506535
|
"sessionEvent.goalQueue.blockedDetail": "El siguiente objetivo en cola no se iniciará hasta que este objetivo se complete.",
|
|
506530
506536
|
"sessionEvent.warning": "Advertencia: {message}",
|
|
506531
|
-
"sessionEvent.provenance.advisory": "Comprobación de procedencia antes de enviar; el mensaje no se bloqueó. Informe reenviado: {external}. No se encontraron en la salida de las herramientas de este turno ni en un evento de origen: {unattributed}. Se permite reenviar estos valores, pero no presentarlos como mediciones propias.",
|
|
506537
|
+
"sessionEvent.provenance.advisory": "Comprobación de procedencia antes de enviar; el mensaje no se bloqueó. Informe reenviado: {external}. Eventos de origen ambiguos: {conflicted}. No se encontraron en la salida de las herramientas de este turno ni en un evento de origen: {unattributed}. Se permite reenviar estos valores, pero no presentarlos como mediciones propias.",
|
|
506532
506538
|
"sessionEvent.mcp.tool.one": "{count} herramienta",
|
|
506533
506539
|
"sessionEvent.mcp.tool.other": "{count} herramientas",
|
|
506534
506540
|
"sessionEvent.mcp.connected": "Servidor MCP «{name}» conectado · {tools} ({transport})",
|
|
@@ -506559,7 +506565,7 @@ registerUiCatalogFragment({
|
|
|
506559
506565
|
"sessionEvent.goalQueue.blockedTitle": "Objectif bloqué.",
|
|
506560
506566
|
"sessionEvent.goalQueue.blockedDetail": "L’objectif suivant ne démarrera qu’une fois cet objectif terminé.",
|
|
506561
506567
|
"sessionEvent.warning": "Avertissement : {message}",
|
|
506562
|
-
"sessionEvent.provenance.advisory": "Vérification de la provenance avant l’envoi ; le message n’a pas été bloqué. Rapport transmis : {external}. Valeurs introuvables dans la sortie des outils de ce tour et dans les événements source : {unattributed}. Leur transmission est autorisée, mais ne les présentez pas comme vos propres mesures.",
|
|
506568
|
+
"sessionEvent.provenance.advisory": "Vérification de la provenance avant l’envoi ; le message n’a pas été bloqué. Rapport transmis : {external}. Événements source ambigus : {conflicted}. Valeurs introuvables dans la sortie des outils de ce tour et dans les événements source : {unattributed}. Leur transmission est autorisée, mais ne les présentez pas comme vos propres mesures.",
|
|
506563
506569
|
"sessionEvent.mcp.tool.one": "{count} outil",
|
|
506564
506570
|
"sessionEvent.mcp.tool.other": "{count} outils",
|
|
506565
506571
|
"sessionEvent.mcp.connected": "Serveur MCP « {name} » connecté · {tools} ({transport})",
|
|
@@ -506590,7 +506596,7 @@ registerUiCatalogFragment({
|
|
|
506590
506596
|
"sessionEvent.goalQueue.blockedTitle": "Målet är blockerat.",
|
|
506591
506597
|
"sessionEvent.goalQueue.blockedDetail": "Nästa köade mål startar först när det här målet är slutfört.",
|
|
506592
506598
|
"sessionEvent.warning": "Varning: {message}",
|
|
506593
|
-
"sessionEvent.provenance.advisory": "Ursprungskontroll före sändning; meddelandet blockerades inte. Vidarebefordrad rapport: {external}. Hittades varken i verktygsutdata från den här körningen eller i en källhändelse: {unattributed}. Värdena får vidarebefordras, men framställ dem inte som egna mätningar.",
|
|
506599
|
+
"sessionEvent.provenance.advisory": "Ursprungskontroll före sändning; meddelandet blockerades inte. Vidarebefordrad rapport: {external}. Tvetydiga källhändelser: {conflicted}. Hittades varken i verktygsutdata från den här körningen eller i en källhändelse: {unattributed}. Värdena får vidarebefordras, men framställ dem inte som egna mätningar.",
|
|
506594
506600
|
"sessionEvent.mcp.tool.one": "{count} verktyg",
|
|
506595
506601
|
"sessionEvent.mcp.tool.other": "{count} verktyg",
|
|
506596
506602
|
"sessionEvent.mcp.connected": "MCP-servern ”{name}” är ansluten · {tools} ({transport})",
|
|
@@ -506621,7 +506627,7 @@ registerUiCatalogFragment({
|
|
|
506621
506627
|
"sessionEvent.goalQueue.blockedTitle": "Cíl je blokován.",
|
|
506622
506628
|
"sessionEvent.goalQueue.blockedDetail": "Další cíl ve frontě se spustí pouze po dokončení tohoto cíle.",
|
|
506623
506629
|
"sessionEvent.warning": "Upozornění: {message}",
|
|
506624
|
-
"sessionEvent.provenance.advisory": "Kontrola původu před odesláním; zpráva nebyla zablokována. Předaný report: {external}. Nenalezeno ve výstupu nástrojů tohoto kola ani ve zdrojové události: {unattributed}. Tyto hodnoty lze předat dál, ale neuvádějte je jako vlastní měření.",
|
|
506630
|
+
"sessionEvent.provenance.advisory": "Kontrola původu před odesláním; zpráva nebyla zablokována. Předaný report: {external}. Nejednoznačné zdrojové události: {conflicted}. Nenalezeno ve výstupu nástrojů tohoto kola ani ve zdrojové události: {unattributed}. Tyto hodnoty lze předat dál, ale neuvádějte je jako vlastní měření.",
|
|
506625
506631
|
"sessionEvent.mcp.tool.one": "Nástroje: {count}",
|
|
506626
506632
|
"sessionEvent.mcp.tool.other": "Nástroje: {count}",
|
|
506627
506633
|
"sessionEvent.mcp.connected": "Server MCP \"{name}\" připojen · {tools} ({transport})",
|