@mneme-ai/core 2.89.0 โ 2.91.0
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/dist/agent_manifest.d.ts.map +1 -1
- package/dist/agent_manifest.js +4 -0
- package/dist/agent_manifest.js.map +1 -1
- package/dist/gephyra/index.d.ts +12 -0
- package/dist/gephyra/index.d.ts.map +1 -1
- package/dist/gephyra/index.js +38 -0
- package/dist/gephyra/index.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -1
- package/dist/truth_gate/claims.d.ts.map +1 -1
- package/dist/truth_gate/claims.js +14 -0
- package/dist/truth_gate/claims.js.map +1 -1
- package/dist/truth_gate/probes.d.ts.map +1 -1
- package/dist/truth_gate/probes.js +94 -0
- package/dist/truth_gate/probes.js.map +1 -1
- package/dist/truth_kernel/anamnesis.d.ts +172 -0
- package/dist/truth_kernel/anamnesis.d.ts.map +1 -0
- package/dist/truth_kernel/anamnesis.js +335 -0
- package/dist/truth_kernel/anamnesis.js.map +1 -0
- package/dist/truth_kernel/anamnesis.test.d.ts +15 -0
- package/dist/truth_kernel/anamnesis.test.d.ts.map +1 -0
- package/dist/truth_kernel/anamnesis.test.js +136 -0
- package/dist/truth_kernel/anamnesis.test.js.map +1 -0
- package/dist/truth_kernel/compound.d.ts +55 -0
- package/dist/truth_kernel/compound.d.ts.map +1 -0
- package/dist/truth_kernel/compound.js +72 -0
- package/dist/truth_kernel/compound.js.map +1 -0
- package/dist/truth_kernel/gauntlet_public.d.ts +37 -0
- package/dist/truth_kernel/gauntlet_public.d.ts.map +1 -0
- package/dist/truth_kernel/gauntlet_public.js +81 -0
- package/dist/truth_kernel/gauntlet_public.js.map +1 -0
- package/dist/truth_kernel/savant_diamonds.test.d.ts +11 -0
- package/dist/truth_kernel/savant_diamonds.test.d.ts.map +1 -0
- package/dist/truth_kernel/savant_diamonds.test.js +137 -0
- package/dist/truth_kernel/savant_diamonds.test.js.map +1 -0
- package/dist/truth_kernel/symbiosis.d.ts +54 -0
- package/dist/truth_kernel/symbiosis.d.ts.map +1 -0
- package/dist/truth_kernel/symbiosis.js +98 -0
- package/dist/truth_kernel/symbiosis.js.map +1 -0
- package/dist/truth_kernel/truth_mesh.d.ts +63 -0
- package/dist/truth_kernel/truth_mesh.d.ts.map +1 -0
- package/dist/truth_kernel/truth_mesh.js +124 -0
- package/dist/truth_kernel/truth_mesh.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.90.0 โ ๐โก SAVANT SYMBIOSIS ยท the before-assert prosthesis.
|
|
3
|
+
*
|
|
4
|
+
* The whole reason a fluent LLM embeds the savant: before its answer reaches the
|
|
5
|
+
* user, it hands the draft to ALETHEIA, which fact-checks every checkable claim
|
|
6
|
+
* and hands back a REPAIRED draft โ FALSE claims corrected (with evidence),
|
|
7
|
+
* UNKNOWN claims flagged "unverified" (never silently asserted), TRUE claims kept.
|
|
8
|
+
* The savant + the generalist are complementary: fluent brain, savant memory.
|
|
9
|
+
*
|
|
10
|
+
* Exposed three ways so ANY agent โ MCP, HTTP/A2A, or in-process โ can plug in:
|
|
11
|
+
* โข in-process : repairDraft() / symbioticVerify()
|
|
12
|
+
* โข MCP : mneme.savant.repair
|
|
13
|
+
* โข HTTP/A2A : POST /savant/verify ยท POST /savant/repair (gephyra serve)
|
|
14
|
+
*
|
|
15
|
+
* Conservative by construction: only sentences that parse to a CHECKABLE claim are
|
|
16
|
+
* touched; prose is left exactly as written. Never throws.
|
|
17
|
+
*/
|
|
18
|
+
import { type AletheiaVerdict, type AletheiaOpts } from "./aletheia.js";
|
|
19
|
+
/** Does a sentence look like a CHECKABLE factual claim? Conservative: must contain
|
|
20
|
+
* a specific entity โ a number/version, an equals/comparison, or a copula tying a
|
|
21
|
+
* subject to a value. Pure questions / imperatives / vibes are skipped. */
|
|
22
|
+
export declare function isCheckableClaim(sentence: string): boolean;
|
|
23
|
+
/** Extract the checkable claims from a draft (in order). */
|
|
24
|
+
export declare function extractClaims(draft: string): string[];
|
|
25
|
+
export interface VerifiedClaim {
|
|
26
|
+
claim: string;
|
|
27
|
+
verdict: AletheiaVerdict;
|
|
28
|
+
evidence: string;
|
|
29
|
+
pTrue: number;
|
|
30
|
+
receiptId: string | null;
|
|
31
|
+
}
|
|
32
|
+
export interface RepairResult {
|
|
33
|
+
/** The repaired draft: FALSE claims annotated with the correction, UNKNOWN claims
|
|
34
|
+
* flagged, TRUE claims untouched, non-claim prose untouched. */
|
|
35
|
+
repaired: string;
|
|
36
|
+
claims: VerifiedClaim[];
|
|
37
|
+
trueCount: number;
|
|
38
|
+
falseCount: number;
|
|
39
|
+
unknownCount: number;
|
|
40
|
+
/** True if anything was corrected or flagged โ the agent SHOULD revise before sending. */
|
|
41
|
+
changed: boolean;
|
|
42
|
+
summary: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Fact-check + repair an agent's draft answer through the savant. For every
|
|
46
|
+
* checkable claim: FALSE โ keep the sentence but append a signed correction marker;
|
|
47
|
+
* UNKNOWN โ append an "unverified โ savant could not prove this" flag (never silently
|
|
48
|
+
* asserted); TRUE โ leave it. Prose that isn't a checkable claim is passed through
|
|
49
|
+
* verbatim. Never throws โ on any internal failure the original draft is returned.
|
|
50
|
+
*/
|
|
51
|
+
export declare function repairDraft(repoRoot: string, draft: string, opts?: AletheiaOpts): Promise<RepairResult>;
|
|
52
|
+
/** Single-claim before-assert hook (the minimal symbiosis call). Never throws. */
|
|
53
|
+
export declare function symbioticVerify(repoRoot: string, claim: string, opts?: AletheiaOpts): Promise<VerifiedClaim>;
|
|
54
|
+
//# sourceMappingURL=symbiosis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbiosis.d.ts","sourceRoot":"","sources":["../../src/truth_kernel/symbiosis.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAe,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAUrF;;4EAE4E;AAC5E,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAU1D;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAErD;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B;qEACiE;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,0FAA0F;IAC1F,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAqBjH;AAED,kFAAkF;AAClF,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAOtH"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.90.0 โ ๐โก SAVANT SYMBIOSIS ยท the before-assert prosthesis.
|
|
3
|
+
*
|
|
4
|
+
* The whole reason a fluent LLM embeds the savant: before its answer reaches the
|
|
5
|
+
* user, it hands the draft to ALETHEIA, which fact-checks every checkable claim
|
|
6
|
+
* and hands back a REPAIRED draft โ FALSE claims corrected (with evidence),
|
|
7
|
+
* UNKNOWN claims flagged "unverified" (never silently asserted), TRUE claims kept.
|
|
8
|
+
* The savant + the generalist are complementary: fluent brain, savant memory.
|
|
9
|
+
*
|
|
10
|
+
* Exposed three ways so ANY agent โ MCP, HTTP/A2A, or in-process โ can plug in:
|
|
11
|
+
* โข in-process : repairDraft() / symbioticVerify()
|
|
12
|
+
* โข MCP : mneme.savant.repair
|
|
13
|
+
* โข HTTP/A2A : POST /savant/verify ยท POST /savant/repair (gephyra serve)
|
|
14
|
+
*
|
|
15
|
+
* Conservative by construction: only sentences that parse to a CHECKABLE claim are
|
|
16
|
+
* touched; prose is left exactly as written. Never throws.
|
|
17
|
+
*/
|
|
18
|
+
import { assertClaim } from "./aletheia.js";
|
|
19
|
+
/** Split text into sentences (keeps the terminator). Cross-language friendly. */
|
|
20
|
+
function splitSentences(text) {
|
|
21
|
+
const t = String(text ?? "");
|
|
22
|
+
// Split on sentence terminators (. ! ? newline ยท ; ) but keep reasonable chunks.
|
|
23
|
+
const parts = t.split(/(?<=[.!?])\s+|\n+|(?<=[;ยท])\s+/).map((s) => s.trim()).filter((s) => s.length > 0);
|
|
24
|
+
return parts.length ? parts : (t.trim() ? [t.trim()] : []);
|
|
25
|
+
}
|
|
26
|
+
/** Does a sentence look like a CHECKABLE factual claim? Conservative: must contain
|
|
27
|
+
* a specific entity โ a number/version, an equals/comparison, or a copula tying a
|
|
28
|
+
* subject to a value. Pure questions / imperatives / vibes are skipped. */
|
|
29
|
+
export function isCheckableClaim(sentence) {
|
|
30
|
+
const s = String(sentence ?? "").trim();
|
|
31
|
+
if (s.length < 3)
|
|
32
|
+
return false;
|
|
33
|
+
if (/[?]\s*$/.test(s))
|
|
34
|
+
return false; // a question asserts nothing
|
|
35
|
+
const hasNumber = /\d/.test(s);
|
|
36
|
+
const hasEquals = /[=<>]|โ|โ /.test(s);
|
|
37
|
+
const hasVersion = /\bv?\d+\.\d+/.test(s);
|
|
38
|
+
const hasCopula = /\b(is|are|was|were|has|have|equals|ships?|supports?|requires?|defaults?)\b|เธเธทเธญ|เนเธเนเธ/i.test(s);
|
|
39
|
+
// Need an entity to check: a number/version/equals, OR a copula with some specific token.
|
|
40
|
+
return hasNumber || hasEquals || hasVersion || (hasCopula && /[A-Za-z0-9._/-]{2,}/.test(s));
|
|
41
|
+
}
|
|
42
|
+
/** Extract the checkable claims from a draft (in order). */
|
|
43
|
+
export function extractClaims(draft) {
|
|
44
|
+
return splitSentences(draft).filter(isCheckableClaim);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Fact-check + repair an agent's draft answer through the savant. For every
|
|
48
|
+
* checkable claim: FALSE โ keep the sentence but append a signed correction marker;
|
|
49
|
+
* UNKNOWN โ append an "unverified โ savant could not prove this" flag (never silently
|
|
50
|
+
* asserted); TRUE โ leave it. Prose that isn't a checkable claim is passed through
|
|
51
|
+
* verbatim. Never throws โ on any internal failure the original draft is returned.
|
|
52
|
+
*/
|
|
53
|
+
export async function repairDraft(repoRoot, draft, opts = {}) {
|
|
54
|
+
const original = String(draft ?? "");
|
|
55
|
+
try {
|
|
56
|
+
const sentences = splitSentences(original);
|
|
57
|
+
const claims = [];
|
|
58
|
+
let trueCount = 0, falseCount = 0, unknownCount = 0;
|
|
59
|
+
const out = [];
|
|
60
|
+
for (const sentence of sentences) {
|
|
61
|
+
if (!isCheckableClaim(sentence)) {
|
|
62
|
+
out.push(sentence);
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const r = await assertClaim(repoRoot, sentence, opts);
|
|
66
|
+
claims.push({ claim: sentence, verdict: r.verdict, evidence: r.evidence, pTrue: r.pTrue, receiptId: r.receipt?.receiptId ?? null });
|
|
67
|
+
if (r.verdict === "TRUE") {
|
|
68
|
+
trueCount++;
|
|
69
|
+
out.push(sentence);
|
|
70
|
+
}
|
|
71
|
+
else if (r.verdict === "FALSE") {
|
|
72
|
+
falseCount++;
|
|
73
|
+
out.push(`${sentence} โจโ savant: FALSE โ ${r.evidence}โฉ`);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
unknownCount++;
|
|
77
|
+
out.push(`${sentence} โจ? savant: UNVERIFIED โ could not prove; do not assert as factโฉ`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const changed = falseCount > 0 || unknownCount > 0;
|
|
81
|
+
const summary = `savant checked ${claims.length} claim(s): ${trueCount} proven ยท ${falseCount} false ยท ${unknownCount} unverified`;
|
|
82
|
+
return { repaired: out.join(" "), claims, trueCount, falseCount, unknownCount, changed, summary };
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return { repaired: original, claims: [], trueCount: 0, falseCount: 0, unknownCount: 0, changed: false, summary: "savant repair unavailable โ draft unchanged" };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/** Single-claim before-assert hook (the minimal symbiosis call). Never throws. */
|
|
89
|
+
export async function symbioticVerify(repoRoot, claim, opts = {}) {
|
|
90
|
+
try {
|
|
91
|
+
const r = await assertClaim(repoRoot, claim, opts);
|
|
92
|
+
return { claim, verdict: r.verdict, evidence: r.evidence, pTrue: r.pTrue, receiptId: r.receipt?.receiptId ?? null };
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return { claim, verdict: "UNKNOWN", evidence: "savant unavailable โ treat as UNKNOWN (never guess)", pTrue: 0.5, receiptId: null };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=symbiosis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbiosis.js","sourceRoot":"","sources":["../../src/truth_kernel/symbiosis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.90.0 โ ๐โค CROSS-AGENT TRUTH MESH ยท the multiverse truth substrate.
|
|
3
|
+
*
|
|
4
|
+
* One savant's Axiom Lattice is a private brain. The Truth Mesh lets MANY savants
|
|
5
|
+
* (across vendors, machines, agents) share PROVEN truths without a central server:
|
|
6
|
+
* each exports a SIGNED bundle of its ACTIVE truths; a peer MERGES it after
|
|
7
|
+
* verifying every signature offline โ adding non-conflicting truths, DROPPING
|
|
8
|
+
* forged/invalid ones, and SURFACING (never silently resolving) any truth that
|
|
9
|
+
* CONTRADICTS what the peer already holds. CRDT-style: commutative + idempotent
|
|
10
|
+
* (re-merging the same bundle changes nothing). Never throws.
|
|
11
|
+
*
|
|
12
|
+
* This is how the savant becomes the backbone of the AI multiverse: a tamper-evident,
|
|
13
|
+
* vendor-neutral, offline-verifiable fabric of facts that compounds as more agents join.
|
|
14
|
+
*/
|
|
15
|
+
import { type NotaryReceipt } from "../notary/index.js";
|
|
16
|
+
import type { AletheiaVerdict } from "./aletheia.js";
|
|
17
|
+
export interface MeshTruth {
|
|
18
|
+
claim: string;
|
|
19
|
+
subject: string;
|
|
20
|
+
verdict: AletheiaVerdict;
|
|
21
|
+
pTrue: number;
|
|
22
|
+
/** Per-truth signature (so a single truth is verifiable in isolation). */
|
|
23
|
+
receipt: NotaryReceipt | null;
|
|
24
|
+
}
|
|
25
|
+
export interface TruthBundle {
|
|
26
|
+
v: 1;
|
|
27
|
+
/** Who exported it (opaque agent id). */
|
|
28
|
+
agent: string;
|
|
29
|
+
truths: MeshTruth[];
|
|
30
|
+
/** Signature over the whole bundle. */
|
|
31
|
+
receipt: NotaryReceipt | null;
|
|
32
|
+
}
|
|
33
|
+
/** Export this savant's ACTIVE truths as a signed, portable bundle. Never throws. */
|
|
34
|
+
export declare function exportTruths(repoRoot: string, agent: string, opts?: {
|
|
35
|
+
issuedAt?: number;
|
|
36
|
+
}): TruthBundle;
|
|
37
|
+
export interface MergeResult {
|
|
38
|
+
/** Truths added to the local lattice. */
|
|
39
|
+
added: number;
|
|
40
|
+
/** Truths skipped because already present (idempotence). */
|
|
41
|
+
duplicate: number;
|
|
42
|
+
/** Truths dropped because their signature was missing/invalid (forgery defense). */
|
|
43
|
+
rejectedUnsigned: number;
|
|
44
|
+
/** Truths that CONTRADICT a local ACTIVE truth โ surfaced, NOT merged. */
|
|
45
|
+
conflicts: Array<{
|
|
46
|
+
claim: string;
|
|
47
|
+
verdict: AletheiaVerdict;
|
|
48
|
+
against: string;
|
|
49
|
+
}>;
|
|
50
|
+
/** True iff the incoming bundle's own signature verified. */
|
|
51
|
+
bundleVerified: boolean;
|
|
52
|
+
summary: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Merge an incoming signed bundle into the local lattice. Verifies the bundle's
|
|
56
|
+
* signature + every per-truth signature OFFLINE; an unsigned/forged truth is DROPPED.
|
|
57
|
+
* A truth that contradicts a local ACTIVE truth is SURFACED (the savant doesn't
|
|
58
|
+
* silently pick a winner). Duplicates are skipped โ idempotent + commutative. Never throws.
|
|
59
|
+
*/
|
|
60
|
+
export declare function mergeTruths(repoRoot: string, bundle: TruthBundle, opts?: {
|
|
61
|
+
issuedAt?: number;
|
|
62
|
+
}): MergeResult;
|
|
63
|
+
//# sourceMappingURL=truth_mesh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truth_mesh.d.ts","sourceRoot":"","sources":["../../src/truth_kernel/truth_mesh.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,EAA+B,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAErF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,eAAe,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,CAAC,CAAC;IACL,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,uCAAuC;IACvC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;CAC/B;AAED,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,WAAW,CAa3G;AAED,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,gBAAgB,EAAE,MAAM,CAAC;IACzB,0EAA0E;IAC1E,SAAS,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,eAAe,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/E,6DAA6D;IAC7D,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAgBD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,WAAW,CAsChH"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.90.0 โ ๐โค CROSS-AGENT TRUTH MESH ยท the multiverse truth substrate.
|
|
3
|
+
*
|
|
4
|
+
* One savant's Axiom Lattice is a private brain. The Truth Mesh lets MANY savants
|
|
5
|
+
* (across vendors, machines, agents) share PROVEN truths without a central server:
|
|
6
|
+
* each exports a SIGNED bundle of its ACTIVE truths; a peer MERGES it after
|
|
7
|
+
* verifying every signature offline โ adding non-conflicting truths, DROPPING
|
|
8
|
+
* forged/invalid ones, and SURFACING (never silently resolving) any truth that
|
|
9
|
+
* CONTRADICTS what the peer already holds. CRDT-style: commutative + idempotent
|
|
10
|
+
* (re-merging the same bundle changes nothing). Never throws.
|
|
11
|
+
*
|
|
12
|
+
* This is how the savant becomes the backbone of the AI multiverse: a tamper-evident,
|
|
13
|
+
* vendor-neutral, offline-verifiable fabric of facts that compounds as more agents join.
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { issueReceipt, verifyReceipt } from "../notary/index.js";
|
|
18
|
+
import { readLattice, recordAssertion, detectContradictions } from "./lattice.js";
|
|
19
|
+
/** Export this savant's ACTIVE truths as a signed, portable bundle. Never throws. */
|
|
20
|
+
export function exportTruths(repoRoot, agent, opts = {}) {
|
|
21
|
+
const active = readLattice(repoRoot).filter((n) => n.status === "ACTIVE" && (n.verdict === "TRUE" || n.verdict === "FALSE"));
|
|
22
|
+
const truths = active.map((n) => ({ claim: n.claim, subject: n.subject, verdict: n.verdict, pTrue: n.pTrue, receipt: n.receipt }));
|
|
23
|
+
let receipt = null;
|
|
24
|
+
try {
|
|
25
|
+
receipt = issueReceipt(repoRoot, {
|
|
26
|
+
kind: "memory-capsule",
|
|
27
|
+
subject: `truth-bundle:${String(agent ?? "anon")}:${truths.length}`,
|
|
28
|
+
payload: { engine: "aletheia-mesh", agent, truths: truths.map((t) => ({ claim: t.claim, verdict: t.verdict })) },
|
|
29
|
+
issuedAt: opts.issuedAt,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
receipt = null;
|
|
34
|
+
}
|
|
35
|
+
return { v: 1, agent: String(agent ?? "anon"), truths, receipt };
|
|
36
|
+
}
|
|
37
|
+
function meshSeenPath(repoRoot) { return join(repoRoot, ".mneme", "aletheia", "mesh-seen.json"); }
|
|
38
|
+
function loadSeen(repoRoot) {
|
|
39
|
+
try {
|
|
40
|
+
const p = meshSeenPath(repoRoot);
|
|
41
|
+
if (!existsSync(p))
|
|
42
|
+
return new Set();
|
|
43
|
+
const arr = JSON.parse(readFileSync(p, "utf8"));
|
|
44
|
+
return new Set(Array.isArray(arr) ? arr : []);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return new Set();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function saveSeen(repoRoot, seen) {
|
|
51
|
+
try {
|
|
52
|
+
mkdirSync(join(repoRoot, ".mneme", "aletheia"), { recursive: true });
|
|
53
|
+
writeFileSync(meshSeenPath(repoRoot), JSON.stringify([...seen]), "utf8");
|
|
54
|
+
}
|
|
55
|
+
catch { /* best-effort */ }
|
|
56
|
+
}
|
|
57
|
+
function truthKey(t) { return `${t.verdict}::${t.claim}`; }
|
|
58
|
+
/**
|
|
59
|
+
* Merge an incoming signed bundle into the local lattice. Verifies the bundle's
|
|
60
|
+
* signature + every per-truth signature OFFLINE; an unsigned/forged truth is DROPPED.
|
|
61
|
+
* A truth that contradicts a local ACTIVE truth is SURFACED (the savant doesn't
|
|
62
|
+
* silently pick a winner). Duplicates are skipped โ idempotent + commutative. Never throws.
|
|
63
|
+
*/
|
|
64
|
+
export function mergeTruths(repoRoot, bundle, opts = {}) {
|
|
65
|
+
let bundleVerified = false;
|
|
66
|
+
try {
|
|
67
|
+
bundleVerified = bundle.receipt ? verifyReceipt(bundle.receipt).valid : false;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
bundleVerified = false;
|
|
71
|
+
}
|
|
72
|
+
const seen = loadSeen(repoRoot);
|
|
73
|
+
let added = 0, duplicate = 0, rejectedUnsigned = 0;
|
|
74
|
+
const conflicts = [];
|
|
75
|
+
const truths = Array.isArray(bundle?.truths) ? bundle.truths : [];
|
|
76
|
+
for (const t of truths) {
|
|
77
|
+
if (!t || typeof t.claim !== "string" || (t.verdict !== "TRUE" && t.verdict !== "FALSE"))
|
|
78
|
+
continue;
|
|
79
|
+
// (1) forgery defense โ the per-truth signature must be valid AND the truth's
|
|
80
|
+
// claim/verdict must MATCH the signed payload. (Catches swapping the claim
|
|
81
|
+
// text while keeping a valid-but-unrelated signature.)
|
|
82
|
+
let sigOk = false;
|
|
83
|
+
try {
|
|
84
|
+
if (t.receipt && verifyReceipt(t.receipt).valid) {
|
|
85
|
+
const pl = (t.receipt.payload ?? {});
|
|
86
|
+
sigOk = pl.claim === t.claim && pl.verdict === t.verdict;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
sigOk = false;
|
|
91
|
+
}
|
|
92
|
+
if (!sigOk) {
|
|
93
|
+
rejectedUnsigned++;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
const key = truthKey(t);
|
|
97
|
+
if (seen.has(key)) {
|
|
98
|
+
duplicate++;
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
// (2) conflict โ surfaced, never silently merged.
|
|
102
|
+
const contra = detectContradictions(repoRoot, t.claim, t.verdict);
|
|
103
|
+
if (contra.length > 0) {
|
|
104
|
+
conflicts.push({ claim: t.claim, verdict: t.verdict, against: contra[0].existing });
|
|
105
|
+
seen.add(key);
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
// (3) duplicate-by-content already in the local lattice?
|
|
109
|
+
const already = readLattice(repoRoot).some((n) => n.status === "ACTIVE" && n.claim === t.claim && n.verdict === t.verdict);
|
|
110
|
+
if (already) {
|
|
111
|
+
duplicate++;
|
|
112
|
+
seen.add(key);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
// (4) accept โ record into the local lattice as a corroborated truth.
|
|
116
|
+
recordAssertion(repoRoot, { claim: t.claim, verdict: t.verdict, pTrue: t.pTrue, lineageSummary: ["mesh"] }, { issuedAt: opts.issuedAt });
|
|
117
|
+
added++;
|
|
118
|
+
seen.add(key);
|
|
119
|
+
}
|
|
120
|
+
saveSeen(repoRoot, seen);
|
|
121
|
+
const summary = `mesh merge from "${bundle?.agent ?? "?"}": +${added} added ยท ${duplicate} dup ยท ${rejectedUnsigned} forged-dropped ยท ${conflicts.length} conflict(s) surfaced ยท bundle ${bundleVerified ? "VERIFIED" : "UNVERIFIED"}`;
|
|
122
|
+
return { added, duplicate, rejectedUnsigned, conflicts, bundleVerified, summary };
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=truth_mesh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truth_mesh.js","sourceRoot":"","sources":["../../src/truth_kernel/truth_mesh.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAsB,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAqBlF,qFAAqF;AACrF,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,KAAa,EAAE,OAA8B,EAAE;IAC5F,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC;IAC7H,MAAM,MAAM,GAAgB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAChJ,IAAI,OAAO,GAAyB,IAAI,CAAC;IACzC,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE;YAC/B,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,gBAAgB,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE;YACnE,OAAO,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE;YAChH,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,GAAG,IAAI,CAAC;IAAC,CAAC;IAC3B,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACnE,CAAC;AAgBD,SAAS,YAAY,CAAC,QAAgB,IAAY,OAAO,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAClH,SAAS,QAAQ,CAAC,QAAgB;IAChC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,GAAG,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAa,CAAC;QAC5D,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,GAAG,EAAE,CAAC;IAAC,CAAC;AAC/B,CAAC;AACD,SAAS,QAAQ,CAAC,QAAgB,EAAE,IAAiB;IACnD,IAAI,CAAC;QAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,aAAa,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;AACrL,CAAC;AACD,SAAS,QAAQ,CAAC,CAAqC,IAAY,OAAO,GAAG,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAEvG;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,MAAmB,EAAE,OAA8B,EAAE;IACjG,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,CAAC;QAAC,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,cAAc,GAAG,KAAK,CAAC;IAAC,CAAC;IAExH,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,KAAK,GAAG,CAAC,EAAE,SAAS,GAAG,CAAC,EAAE,gBAAgB,GAAG,CAAC,CAAC;IACnD,MAAM,SAAS,GAA6B,EAAE,CAAC;IAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAElE,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC;YAAE,SAAS;QACnG,8EAA8E;QAC9E,+EAA+E;QAC/E,2DAA2D;QAC3D,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,CAAC,CAAC,OAAO,IAAI,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;gBAChD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAyC,CAAC;gBAC7E,KAAK,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC;YAC3D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YAAC,KAAK,GAAG,KAAK,CAAC;QAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,gBAAgB,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAC,SAAS,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QAC7C,kDAAkD;QAClD,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAClE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACzI,yDAAyD;QACzD,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;QAC3H,IAAI,OAAO,EAAE,CAAC;YAAC,SAAS,EAAE,CAAC;YAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACtD,sEAAsE;QACtE,eAAe,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzI,KAAK,EAAE,CAAC;QAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAEzB,MAAM,OAAO,GAAG,oBAAoB,MAAM,EAAE,KAAK,IAAI,GAAG,OAAO,KAAK,YAAY,SAAS,UAAU,gBAAgB,qBAAqB,SAAS,CAAC,MAAM,kCAAkC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;IACvO,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;AACpF,CAAC"}
|