@mneme-ai/core 2.21.3 → 2.21.4

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.
@@ -0,0 +1,194 @@
1
+ /**
2
+ * v2.21.4 — TRUST CAPSULE.
3
+ *
4
+ * Discrete, single-line, tamper-evident attestation that an installed
5
+ * Mneme is what it claims to be. AI agents read ONE number (trustScore
6
+ * 0-100) instead of 30 fields. Composes on top of `verify-self`.
7
+ *
8
+ * INNOVATIONS
9
+ *
10
+ * 1. MERKLE INSTALL-ROOT — compute a single 22-char hash over every
11
+ * shipped file (.js / .cjs / .mjs / .json / .d.ts). Detects a
12
+ * single-byte tamper anywhere in the install tree, not just in
13
+ * package.json (which is all the v2.19.96 verify-self hashed).
14
+ *
15
+ * 2. TRUST SCORE (0-100) — single composed signal:
16
+ * +40 if HMAC signature of capsule verifies
17
+ * +20 if current Merkle matches the install-time snapshot
18
+ * +20 if install path lives under a sane npm prefix
19
+ * +20 if install is recent (≤ 90 days since first snapshot)
20
+ * Bands: 0-39 ABORT · 40-69 CAUTION · 70-100 TRUST. One number
21
+ * replaces "read 30 fields and decide".
22
+ *
23
+ * 3. CAPSULE URI — `mneme://attest/v1/<ver>/<merkle22>/<ts>/<sig22>`
24
+ * paste-able anywhere: pulse banner, commit message, Slack, gist.
25
+ * Receiver pastes back into `mneme verify-self --verify <uri>`
26
+ * to validate.
27
+ *
28
+ * 4. NONCE-BOUND CAPABILITY — optional caller-supplied nonce binds
29
+ * the capsule to a single session. Stops replay of a captured
30
+ * capsule into a future session.
31
+ *
32
+ * 5. OFFLINE-FIRST DRIFT — first verify-self call caches the
33
+ * Merkle to `.mneme/trust/install-merkle.json`; subsequent calls
34
+ * compare. No network. A file tampered with AFTER install
35
+ * shows up as `driftedFiles[]`.
36
+ *
37
+ * Composes onto v2.19.96 verifySelf — does not replace it.
38
+ */
39
+ export interface MerkleResult {
40
+ /** Merkle root: base64url, 22 chars. */
41
+ root: string;
42
+ /** Total file count hashed. */
43
+ fileCount: number;
44
+ /** Total bytes hashed. */
45
+ byteCount: number;
46
+ /** Per-file hash lines (sorted by relative path) — useful for diff. */
47
+ entries: Array<{
48
+ path: string;
49
+ sha: string;
50
+ size: number;
51
+ }>;
52
+ }
53
+ /** Compute the Merkle install-root over all hashable files under installRoot.
54
+ * Pure read-only. Deterministic: same install → same root, byte for byte. */
55
+ export declare function computeInstallMerkle(installRoot: string): MerkleResult;
56
+ export interface InstallSnapshot {
57
+ v: 1;
58
+ /** When the install was first observed. */
59
+ capturedAt: string;
60
+ /** Installed version at capture time. */
61
+ version: string;
62
+ /** Merkle root at capture time. */
63
+ merkle: string;
64
+ /** File count at capture time. */
65
+ fileCount: number;
66
+ }
67
+ export declare function getInstallSnapshot(repoRoot: string): InstallSnapshot | null;
68
+ /** Persist the install Merkle as the offline-first drift baseline.
69
+ * Called by `verify-self` on first run (lazy) or by postinstall (eager).
70
+ * Idempotent. */
71
+ export declare function captureInstallSnapshot(repoRoot: string, opts: {
72
+ version: string;
73
+ merkle: string;
74
+ fileCount: number;
75
+ }): InstallSnapshot;
76
+ export interface DriftReport {
77
+ drifted: boolean;
78
+ /** Files present in current Merkle but absent from snapshot. */
79
+ added: string[];
80
+ /** Files in snapshot but absent now. */
81
+ removed: string[];
82
+ /** Files in both but content changed. */
83
+ changed: string[];
84
+ }
85
+ export declare function compareToSnapshot(current: MerkleResult, snapshot: InstallSnapshot | null, snapshotEntries?: Array<{
86
+ path: string;
87
+ sha: string;
88
+ }>): DriftReport;
89
+ export interface TrustScoreInput {
90
+ signatureOk: boolean;
91
+ noDrift: boolean;
92
+ pathSane: boolean;
93
+ recent: boolean;
94
+ }
95
+ export type TrustBand = "ABORT" | "CAUTION" | "TRUST";
96
+ export interface TrustScore {
97
+ score: number;
98
+ band: TrustBand;
99
+ components: {
100
+ signature: 0 | 40;
101
+ drift: 0 | 20;
102
+ path: 0 | 20;
103
+ age: 0 | 20;
104
+ };
105
+ }
106
+ export declare function computeTrustScore(inp: TrustScoreInput): TrustScore;
107
+ export interface Capsule {
108
+ version: string;
109
+ merkle: string;
110
+ ts: number;
111
+ exp: number;
112
+ sig: string;
113
+ nonce?: string;
114
+ /** 22-char sig of the previous capsule in this chain (optional). */
115
+ prev?: string;
116
+ }
117
+ /** Default capsule TTL — 5 minutes. Short enough that replaying a
118
+ * captured capsule into a future session is physically prevented;
119
+ * long enough that humans + AI agents can paste-and-act without race
120
+ * conditions. */
121
+ export declare const DEFAULT_TTL_SECONDS = 300;
122
+ export interface BuildCapsuleOptions {
123
+ version: string;
124
+ merkle: string;
125
+ /** Caller-supplied nonce binds the capsule to a single session. */
126
+ nonce?: string;
127
+ /** Time-to-live in seconds (default 300 = 5 min). Pass 0 to mint a
128
+ * capsule with no expiry — discouraged in production. */
129
+ ttlSeconds?: number;
130
+ /** Previous capsule's sig — links this capsule into a chain. AI
131
+ * agents that see multiple capsules in one session verify they form
132
+ * a chain (no rogue capsule injection mid-session). */
133
+ prev?: string;
134
+ }
135
+ /** Build a single-line capsule URI. Pure local — uses the install-local
136
+ * HMAC key (auto-generated on first call, lives in
137
+ * `.mneme/trust/capsule.key`).
138
+ *
139
+ * Musk-style first-principles defenses:
140
+ * - TTL: capsule self-destructs after ttlSeconds (default 300).
141
+ * Replay attack window is physical, not cryptographic.
142
+ * - chain-link: optional `prev` ties this capsule to predecessor.
143
+ * Captured one capsule? Useless without the whole chain.
144
+ * - nonce: session-bound capability. */
145
+ export declare function buildCapsule(repoRoot: string, opts: BuildCapsuleOptions): {
146
+ capsule: Capsule;
147
+ uri: string;
148
+ };
149
+ export declare function parseCapsule(uri: string): Capsule | null;
150
+ export interface VerifyCapsuleOptions {
151
+ /** When true, accept capsules past their expiry (use for forensics
152
+ * on old capsules; never for production gating). */
153
+ allowExpired?: boolean;
154
+ /** Caller-known expected nonce — if set, capsule's nonce must match. */
155
+ expectedNonce?: string;
156
+ }
157
+ export declare function verifyCapsule(repoRoot: string, capsule: Capsule | string, opts?: VerifyCapsuleOptions): {
158
+ ok: boolean;
159
+ reason?: string;
160
+ };
161
+ /** Verify a sequence of capsules forms a valid chain. Each capsule's
162
+ * `prev` must equal the prior capsule's `sig`. First capsule must not
163
+ * have `prev` (or `prev` is ignored on the first link). All capsules
164
+ * must individually verify (signature + non-expired). */
165
+ export declare function verifyCapsuleChain(repoRoot: string, capsules: Array<Capsule | string>, opts?: VerifyCapsuleOptions): {
166
+ ok: boolean;
167
+ reason?: string;
168
+ brokenAt?: number;
169
+ };
170
+ export interface DeepAttestation {
171
+ ok: boolean;
172
+ version: string;
173
+ installPath: string;
174
+ merkle: string;
175
+ fileCount: number;
176
+ snapshotCaptured: boolean;
177
+ drift: DriftReport;
178
+ trustScore: TrustScore;
179
+ capsuleUri: string;
180
+ /** One line a human can paste anywhere. */
181
+ oneLine: string;
182
+ }
183
+ export interface VerifySelfDeepOptions {
184
+ /** Caller-supplied nonce to bind capsule to a session. */
185
+ nonce?: string;
186
+ /** When true, refuses to capture a snapshot if none exists yet.
187
+ * Useful for CI gating. */
188
+ noAutoCapture?: boolean;
189
+ }
190
+ /** The discrete + super-optimized verify-self. Composes Merkle install-
191
+ * root + drift + trust score + capsule URI into one call. */
192
+ export declare function verifySelfDeep(installRoot: string, repoRoot: string, version: string, opts?: VerifySelfDeepOptions): DeepAttestation;
193
+ export declare function formatDeepAttestation(a: DeepAttestation): string;
194
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/trust_capsule/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,392 @@
1
+ /**
2
+ * v2.21.4 — TRUST CAPSULE.
3
+ *
4
+ * Discrete, single-line, tamper-evident attestation that an installed
5
+ * Mneme is what it claims to be. AI agents read ONE number (trustScore
6
+ * 0-100) instead of 30 fields. Composes on top of `verify-self`.
7
+ *
8
+ * INNOVATIONS
9
+ *
10
+ * 1. MERKLE INSTALL-ROOT — compute a single 22-char hash over every
11
+ * shipped file (.js / .cjs / .mjs / .json / .d.ts). Detects a
12
+ * single-byte tamper anywhere in the install tree, not just in
13
+ * package.json (which is all the v2.19.96 verify-self hashed).
14
+ *
15
+ * 2. TRUST SCORE (0-100) — single composed signal:
16
+ * +40 if HMAC signature of capsule verifies
17
+ * +20 if current Merkle matches the install-time snapshot
18
+ * +20 if install path lives under a sane npm prefix
19
+ * +20 if install is recent (≤ 90 days since first snapshot)
20
+ * Bands: 0-39 ABORT · 40-69 CAUTION · 70-100 TRUST. One number
21
+ * replaces "read 30 fields and decide".
22
+ *
23
+ * 3. CAPSULE URI — `mneme://attest/v1/<ver>/<merkle22>/<ts>/<sig22>`
24
+ * paste-able anywhere: pulse banner, commit message, Slack, gist.
25
+ * Receiver pastes back into `mneme verify-self --verify <uri>`
26
+ * to validate.
27
+ *
28
+ * 4. NONCE-BOUND CAPABILITY — optional caller-supplied nonce binds
29
+ * the capsule to a single session. Stops replay of a captured
30
+ * capsule into a future session.
31
+ *
32
+ * 5. OFFLINE-FIRST DRIFT — first verify-self call caches the
33
+ * Merkle to `.mneme/trust/install-merkle.json`; subsequent calls
34
+ * compare. No network. A file tampered with AFTER install
35
+ * shows up as `driftedFiles[]`.
36
+ *
37
+ * Composes onto v2.19.96 verifySelf — does not replace it.
38
+ */
39
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, statSync } from "node:fs";
40
+ import { join, relative, sep } from "node:path";
41
+ import { createHash, createHmac, randomBytes } from "node:crypto";
42
+ const KEY_FILE = "capsule.key";
43
+ const SNAPSHOT_FILE = "install-merkle.json";
44
+ const TRUST_DIR_REL = join(".mneme", "trust");
45
+ const HASHABLE_EXT = new Set([".js", ".cjs", ".mjs", ".json", ".d.ts", ".ts", ".md", ".txt"]);
46
+ const SKIP_DIR = new Set(["node_modules", ".git", ".mneme", "logs", "cache", "tmp", "coverage", "dist-test"]);
47
+ const MAX_FILES = 50_000;
48
+ // ─── KEY ─────────────────────────────────────────────────────────────
49
+ function trustDir(repoRoot) {
50
+ const d = join(repoRoot, TRUST_DIR_REL);
51
+ if (!existsSync(d))
52
+ mkdirSync(d, { recursive: true });
53
+ return d;
54
+ }
55
+ function getKey(repoRoot) {
56
+ const p = join(trustDir(repoRoot), KEY_FILE);
57
+ if (existsSync(p))
58
+ return readFileSync(p, "utf8").trim();
59
+ const k = randomBytes(32).toString("base64url");
60
+ writeFileSync(p, k, "utf8");
61
+ return k;
62
+ }
63
+ function sign(payload, k) {
64
+ return createHmac("sha256", k).update(payload).digest("base64url").slice(0, 22);
65
+ }
66
+ function walk(root, dir, files) {
67
+ if (files.length > MAX_FILES)
68
+ return;
69
+ let names;
70
+ try {
71
+ names = readdirSync(dir);
72
+ }
73
+ catch {
74
+ return;
75
+ }
76
+ for (const name of names) {
77
+ if (SKIP_DIR.has(name))
78
+ continue;
79
+ const full = join(dir, name);
80
+ let st;
81
+ try {
82
+ st = statSync(full);
83
+ }
84
+ catch {
85
+ continue;
86
+ }
87
+ if (st.isDirectory())
88
+ walk(root, full, files);
89
+ else if (st.isFile()) {
90
+ const lower = name.toLowerCase();
91
+ const dot = lower.lastIndexOf(".");
92
+ if (dot === -1)
93
+ continue;
94
+ const ext = lower.endsWith(".d.ts") ? ".d.ts" : lower.slice(dot);
95
+ if (HASHABLE_EXT.has(ext))
96
+ files.push(full);
97
+ }
98
+ }
99
+ }
100
+ /** Compute the Merkle install-root over all hashable files under installRoot.
101
+ * Pure read-only. Deterministic: same install → same root, byte for byte. */
102
+ export function computeInstallMerkle(installRoot) {
103
+ const files = [];
104
+ walk(installRoot, installRoot, files);
105
+ const entries = [];
106
+ let byteCount = 0;
107
+ for (const f of files) {
108
+ let buf;
109
+ try {
110
+ buf = readFileSync(f);
111
+ }
112
+ catch {
113
+ continue;
114
+ }
115
+ const sha = createHash("sha256").update(buf).digest("base64url").slice(0, 22);
116
+ const rel = relative(installRoot, f).split(sep).join("/");
117
+ entries.push({ path: rel, sha, size: buf.length });
118
+ byteCount += buf.length;
119
+ }
120
+ entries.sort((a, b) => a.path.localeCompare(b.path));
121
+ const concat = entries.map((e) => `${e.path}\t${e.sha}`).join("\n");
122
+ const root = createHash("sha256").update(concat).digest("base64url").slice(0, 22);
123
+ return { root, fileCount: entries.length, byteCount, entries };
124
+ }
125
+ function snapshotPath(repoRoot) {
126
+ return join(trustDir(repoRoot), SNAPSHOT_FILE);
127
+ }
128
+ export function getInstallSnapshot(repoRoot) {
129
+ const p = snapshotPath(repoRoot);
130
+ if (!existsSync(p))
131
+ return null;
132
+ try {
133
+ return JSON.parse(readFileSync(p, "utf8"));
134
+ }
135
+ catch {
136
+ return null;
137
+ }
138
+ }
139
+ /** Persist the install Merkle as the offline-first drift baseline.
140
+ * Called by `verify-self` on first run (lazy) or by postinstall (eager).
141
+ * Idempotent. */
142
+ export function captureInstallSnapshot(repoRoot, opts) {
143
+ const snap = {
144
+ v: 1,
145
+ capturedAt: new Date().toISOString(),
146
+ version: opts.version,
147
+ merkle: opts.merkle,
148
+ fileCount: opts.fileCount,
149
+ };
150
+ writeFileSync(snapshotPath(repoRoot), JSON.stringify(snap, null, 2), "utf8");
151
+ return snap;
152
+ }
153
+ export function compareToSnapshot(current, snapshot, snapshotEntries) {
154
+ if (!snapshot)
155
+ return { drifted: false, added: [], removed: [], changed: [] };
156
+ // Without per-file snapshot we can only compare roots; but we expose
157
+ // a richer report if the caller hands us entries (used by tests).
158
+ if (!snapshotEntries) {
159
+ const drifted = current.root !== snapshot.merkle;
160
+ return { drifted, added: [], removed: [], changed: drifted ? ["<root-mismatch>"] : [] };
161
+ }
162
+ const cur = new Map(current.entries.map((e) => [e.path, e.sha]));
163
+ const snap = new Map(snapshotEntries.map((e) => [e.path, e.sha]));
164
+ const added = [];
165
+ const removed = [];
166
+ const changed = [];
167
+ for (const [p, sha] of cur) {
168
+ if (!snap.has(p))
169
+ added.push(p);
170
+ else if (snap.get(p) !== sha)
171
+ changed.push(p);
172
+ }
173
+ for (const [p] of snap)
174
+ if (!cur.has(p))
175
+ removed.push(p);
176
+ return { drifted: added.length + removed.length + changed.length > 0, added, removed, changed };
177
+ }
178
+ /** Standard npm prefix patterns we treat as sane. Pure substring check —
179
+ * cheap, no shell-out. */
180
+ const SANE_PATH_HINTS = [
181
+ "node_modules", // any project local install
182
+ "/usr/local", // homebrew + manual prefix
183
+ "/opt/", // /opt/homebrew + /opt/local
184
+ "AppData\\", // %APPDATA% on Windows
185
+ "AppData/", // same, forward slashes
186
+ "nvm", // any NVM variant
187
+ ".volta", // volta
188
+ ".fnm", // fnm
189
+ "scoop", // scoop
190
+ ];
191
+ function isPathSane(installPath) {
192
+ if (!installPath)
193
+ return false;
194
+ const p = installPath.toLowerCase();
195
+ return SANE_PATH_HINTS.some((h) => p.includes(h.toLowerCase()));
196
+ }
197
+ function isRecent(snapshot, maxDays = 90) {
198
+ if (!snapshot)
199
+ return true; // fresh first-run snapshot counts as recent
200
+ try {
201
+ const captured = Date.parse(snapshot.capturedAt);
202
+ if (Number.isNaN(captured))
203
+ return false;
204
+ return (Date.now() - captured) / 86_400_000 <= maxDays;
205
+ }
206
+ catch {
207
+ return false;
208
+ }
209
+ }
210
+ export function computeTrustScore(inp) {
211
+ const components = {
212
+ signature: (inp.signatureOk ? 40 : 0),
213
+ drift: (inp.noDrift ? 20 : 0),
214
+ path: (inp.pathSane ? 20 : 0),
215
+ age: (inp.recent ? 20 : 0),
216
+ };
217
+ const score = components.signature + components.drift + components.path + components.age;
218
+ const band = score < 40 ? "ABORT" : score < 70 ? "CAUTION" : "TRUST";
219
+ return { score, band, components };
220
+ }
221
+ const CAPSULE_PREFIX = "mneme://attest/v1/";
222
+ /** Default capsule TTL — 5 minutes. Short enough that replaying a
223
+ * captured capsule into a future session is physically prevented;
224
+ * long enough that humans + AI agents can paste-and-act without race
225
+ * conditions. */
226
+ export const DEFAULT_TTL_SECONDS = 300;
227
+ /** Build a single-line capsule URI. Pure local — uses the install-local
228
+ * HMAC key (auto-generated on first call, lives in
229
+ * `.mneme/trust/capsule.key`).
230
+ *
231
+ * Musk-style first-principles defenses:
232
+ * - TTL: capsule self-destructs after ttlSeconds (default 300).
233
+ * Replay attack window is physical, not cryptographic.
234
+ * - chain-link: optional `prev` ties this capsule to predecessor.
235
+ * Captured one capsule? Useless without the whole chain.
236
+ * - nonce: session-bound capability. */
237
+ export function buildCapsule(repoRoot, opts) {
238
+ const k = getKey(repoRoot);
239
+ const ts = Math.floor(Date.now() / 1000);
240
+ const ttl = opts.ttlSeconds === undefined ? DEFAULT_TTL_SECONDS : Math.max(0, opts.ttlSeconds);
241
+ const exp = ttl === 0 ? 0 : ts + ttl;
242
+ const noncePart = opts.nonce ? `|${opts.nonce}` : "";
243
+ const prevPart = opts.prev ? `|${opts.prev}` : "";
244
+ const canonical = `${opts.version}|${opts.merkle}|${ts}|${exp}${noncePart}${prevPart}`;
245
+ const sig = sign(canonical, k);
246
+ const capsule = { version: opts.version, merkle: opts.merkle, ts, exp, sig };
247
+ if (opts.nonce)
248
+ capsule.nonce = opts.nonce;
249
+ if (opts.prev)
250
+ capsule.prev = opts.prev;
251
+ const params = [];
252
+ if (opts.nonce)
253
+ params.push(`nonce=${encodeURIComponent(opts.nonce)}`);
254
+ if (opts.prev)
255
+ params.push(`prev=${encodeURIComponent(opts.prev)}`);
256
+ const queryPart = params.length ? `?${params.join("&")}` : "";
257
+ const uri = `${CAPSULE_PREFIX}${encodeURIComponent(opts.version)}/${opts.merkle}/${ts}/${exp}/${sig}${queryPart}`;
258
+ return { capsule, uri };
259
+ }
260
+ export function parseCapsule(uri) {
261
+ if (!uri.startsWith(CAPSULE_PREFIX))
262
+ return null;
263
+ const rest = uri.slice(CAPSULE_PREFIX.length);
264
+ const [pathPart, queryPart] = rest.split("?");
265
+ const segs = pathPart.split("/");
266
+ if (segs.length !== 5)
267
+ return null;
268
+ const [verEnc, merkle, tsStr, expStr, sig] = segs;
269
+ const ts = parseInt(tsStr, 10);
270
+ const exp = parseInt(expStr, 10);
271
+ if (Number.isNaN(ts) || Number.isNaN(exp) || !merkle || !sig)
272
+ return null;
273
+ const out = { version: decodeURIComponent(verEnc), merkle, ts, exp, sig };
274
+ if (queryPart) {
275
+ const params = new URLSearchParams(queryPart);
276
+ const n = params.get("nonce");
277
+ if (n)
278
+ out.nonce = n;
279
+ const p = params.get("prev");
280
+ if (p)
281
+ out.prev = p;
282
+ }
283
+ return out;
284
+ }
285
+ export function verifyCapsule(repoRoot, capsule, opts = {}) {
286
+ const c = typeof capsule === "string" ? parseCapsule(capsule) : capsule;
287
+ if (!c)
288
+ return { ok: false, reason: "malformed capsule URI" };
289
+ const k = getKey(repoRoot);
290
+ const noncePart = c.nonce ? `|${c.nonce}` : "";
291
+ const prevPart = c.prev ? `|${c.prev}` : "";
292
+ const canonical = `${c.version}|${c.merkle}|${c.ts}|${c.exp}${noncePart}${prevPart}`;
293
+ const expected = sign(canonical, k);
294
+ if (expected !== c.sig)
295
+ return { ok: false, reason: "HMAC signature mismatch — capsule was forged or signed by a different install" };
296
+ if (c.exp > 0 && !opts.allowExpired) {
297
+ const now = Math.floor(Date.now() / 1000);
298
+ if (now > c.exp)
299
+ return { ok: false, reason: `capsule expired ${now - c.exp}s ago — request a fresh one` };
300
+ }
301
+ if (opts.expectedNonce !== undefined && c.nonce !== opts.expectedNonce) {
302
+ return { ok: false, reason: "nonce mismatch — capsule was minted for a different session" };
303
+ }
304
+ return { ok: true };
305
+ }
306
+ /** Verify a sequence of capsules forms a valid chain. Each capsule's
307
+ * `prev` must equal the prior capsule's `sig`. First capsule must not
308
+ * have `prev` (or `prev` is ignored on the first link). All capsules
309
+ * must individually verify (signature + non-expired). */
310
+ export function verifyCapsuleChain(repoRoot, capsules, opts = {}) {
311
+ if (capsules.length === 0)
312
+ return { ok: false, reason: "empty chain" };
313
+ let prevSig = undefined;
314
+ for (let i = 0; i < capsules.length; i++) {
315
+ const c = typeof capsules[i] === "string" ? parseCapsule(capsules[i]) : capsules[i];
316
+ if (!c)
317
+ return { ok: false, reason: `capsule ${i} malformed`, brokenAt: i };
318
+ const v = verifyCapsule(repoRoot, c, opts);
319
+ if (!v.ok)
320
+ return { ok: false, reason: `capsule ${i}: ${v.reason}`, brokenAt: i };
321
+ if (i > 0 && c.prev !== prevSig) {
322
+ return { ok: false, reason: `capsule ${i} prev=${c.prev?.slice(0, 8) ?? "<none>"} does not match capsule ${i - 1} sig=${prevSig?.slice(0, 8)}`, brokenAt: i };
323
+ }
324
+ prevSig = c.sig;
325
+ }
326
+ return { ok: true };
327
+ }
328
+ /** The discrete + super-optimized verify-self. Composes Merkle install-
329
+ * root + drift + trust score + capsule URI into one call. */
330
+ export function verifySelfDeep(installRoot, repoRoot, version, opts = {}) {
331
+ const merkle = computeInstallMerkle(installRoot);
332
+ let snapshot = getInstallSnapshot(repoRoot);
333
+ let snapshotCaptured = false;
334
+ // Offline-first: lazy capture on first run (unless caller opted out).
335
+ if (!snapshot && !opts.noAutoCapture) {
336
+ snapshot = captureInstallSnapshot(repoRoot, { version, merkle: merkle.root, fileCount: merkle.fileCount });
337
+ snapshotCaptured = true;
338
+ }
339
+ const drift = compareToSnapshot(merkle, snapshot);
340
+ // Build capsule first so we know whether sig verifies (used in trust score).
341
+ const { uri } = buildCapsule(repoRoot, { version, merkle: merkle.root, nonce: opts.nonce });
342
+ const sigOk = verifyCapsule(repoRoot, uri).ok;
343
+ const trustScore = computeTrustScore({
344
+ signatureOk: sigOk,
345
+ noDrift: !drift.drifted,
346
+ pathSane: isPathSane(installRoot),
347
+ recent: isRecent(snapshot),
348
+ });
349
+ const oneLine = `TRUST=${trustScore.score}/100 [${trustScore.band}] · v${version} · merkle=${merkle.root} · drift=${drift.drifted ? "YES" : "no"} · ${uri}`;
350
+ return {
351
+ ok: trustScore.band !== "ABORT",
352
+ version,
353
+ installPath: installRoot,
354
+ merkle: merkle.root,
355
+ fileCount: merkle.fileCount,
356
+ snapshotCaptured,
357
+ drift,
358
+ trustScore,
359
+ capsuleUri: uri,
360
+ oneLine,
361
+ };
362
+ }
363
+ // ─── FORMATTER ───────────────────────────────────────────────────────
364
+ export function formatDeepAttestation(a) {
365
+ const badge = a.trustScore.band === "TRUST" ? "🟢"
366
+ : a.trustScore.band === "CAUTION" ? "🟡"
367
+ : "🔴";
368
+ const lines = [
369
+ `${badge} TRUST CAPSULE — ${a.trustScore.band} (${a.trustScore.score}/100)`,
370
+ ``,
371
+ ` Version: ${a.version}`,
372
+ ` Install path: ${a.installPath}`,
373
+ ` Merkle root: ${a.merkle} (${a.fileCount} files)`,
374
+ ` Snapshot: ${a.snapshotCaptured ? "captured now (first run)" : "loaded from .mneme/trust/install-merkle.json"}`,
375
+ ` Drift: ${a.drift.drifted ? `⚠ YES (added=${a.drift.added.length} removed=${a.drift.removed.length} changed=${a.drift.changed.length})` : "✓ no drift"}`,
376
+ ``,
377
+ ` Trust score components:`,
378
+ ` signature OK: ${a.trustScore.components.signature === 40 ? "✓ +40" : "✗ +0"}`,
379
+ ` no drift: ${a.trustScore.components.drift === 20 ? "✓ +20" : "✗ +0"}`,
380
+ ` path sane: ${a.trustScore.components.path === 20 ? "✓ +20" : "✗ +0"}`,
381
+ ` recent install: ${a.trustScore.components.age === 20 ? "✓ +20" : "✗ +0"}`,
382
+ ``,
383
+ ` Capsule URI (paste anywhere — pulse, commit, Slack):`,
384
+ ` ${a.capsuleUri}`,
385
+ ``,
386
+ ` One-line for AI agents:`,
387
+ ` ${a.oneLine}`,
388
+ ``,
389
+ ];
390
+ return lines.join("\n");
391
+ }
392
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/trust_capsule/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=trust_capsule.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust_capsule.test.d.ts","sourceRoot":"","sources":["../../src/trust_capsule/trust_capsule.test.ts"],"names":[],"mappings":""}