@mneme-ai/core 2.19.62 → 2.19.63

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.
Files changed (34) hide show
  1. package/dist/cosmic/aurelian_v1963.test.d.ts +2 -0
  2. package/dist/cosmic/aurelian_v1963.test.d.ts.map +1 -0
  3. package/dist/cosmic/aurelian_v1963.test.js +62 -0
  4. package/dist/cosmic/aurelian_v1963.test.js.map +1 -0
  5. package/dist/doctor/doctor.test.d.ts +9 -0
  6. package/dist/doctor/doctor.test.d.ts.map +1 -0
  7. package/dist/doctor/doctor.test.js +168 -0
  8. package/dist/doctor/doctor.test.js.map +1 -0
  9. package/dist/doctor/index.d.ts +71 -0
  10. package/dist/doctor/index.d.ts.map +1 -0
  11. package/dist/doctor/index.js +244 -0
  12. package/dist/doctor/index.js.map +1 -0
  13. package/dist/index.d.ts +2 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +17 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/nucleus_daemon.d.ts.map +1 -1
  18. package/dist/nucleus_daemon.js +14 -0
  19. package/dist/nucleus_daemon.js.map +1 -1
  20. package/dist/preinstall_trail/index.d.ts +91 -0
  21. package/dist/preinstall_trail/index.d.ts.map +1 -0
  22. package/dist/preinstall_trail/index.js +209 -0
  23. package/dist/preinstall_trail/index.js.map +1 -0
  24. package/dist/preinstall_trail/preinstall_trail.test.d.ts +11 -0
  25. package/dist/preinstall_trail/preinstall_trail.test.d.ts.map +1 -0
  26. package/dist/preinstall_trail/preinstall_trail.test.js +248 -0
  27. package/dist/preinstall_trail/preinstall_trail.test.js.map +1 -0
  28. package/dist/retrieval_lab/cross_encoder.d.ts.map +1 -1
  29. package/dist/retrieval_lab/cross_encoder.js +7 -0
  30. package/dist/retrieval_lab/cross_encoder.js.map +1 -1
  31. package/dist/whats_new.d.ts.map +1 -1
  32. package/dist/whats_new.js +8 -0
  33. package/dist/whats_new.js.map +1 -1
  34. package/package.json +1 -1
@@ -0,0 +1,209 @@
1
+ /**
2
+ * v2.19.63 PHOENIX HARDENING — PREINSTALL TRAIL.
3
+ *
4
+ * The forensic proof v2.19.62 (and every prior release) lacked: did
5
+ * the preinstall hook actually RUN? Did it kill the daemon? Did rename-
6
+ * sideways succeed?
7
+ *
8
+ * v2.19.62 install path "passed" only because the daemon happened to
9
+ * die from an unrelated watchdog. The user correctly called out:
10
+ * "ไม่มีหลักฐานว่า preinstall hook ทำงานจริง". This module fixes that.
11
+ *
12
+ * Design:
13
+ * 1. preinstall (inline node -e in package.json) appends entries to
14
+ * `~/.mneme-global/preinstall-trail.jsonl` at each step
15
+ * 2. Each entry is HMAC-chained {v, ts, version, step, ok, details?,
16
+ * prevSig, sig} — tamper-detectable
17
+ * 3. This module reads + verifies the chain
18
+ * 4. CLI `mneme install-history` prints recent entries
19
+ * 5. MCP `mneme.install.trail` exposes it to AI agents
20
+ * 6. Sentinel organ verifies the chain (composes with v2.19.62 P5)
21
+ *
22
+ * No file refs inside the package — preinstall stays inline per ritual
23
+ * phase 3.6 (chicken-and-egg safe). This module reads what preinstall
24
+ * wrote, but preinstall itself never imports this code.
25
+ */
26
+ import { existsSync, readFileSync, appendFileSync, mkdirSync } from "node:fs";
27
+ import { join } from "node:path";
28
+ import { homedir } from "node:os";
29
+ import { createHmac } from "node:crypto";
30
+ const PROTOCOL_VERSION = 1;
31
+ const TRAIL_FILE = "preinstall-trail.jsonl";
32
+ const ORGAN_DIR = ".mneme-global";
33
+ function trailPath() {
34
+ return join(homedir(), ORGAN_DIR, TRAIL_FILE);
35
+ }
36
+ function ensureOrganDir() {
37
+ const dir = join(homedir(), ORGAN_DIR);
38
+ try {
39
+ if (!existsSync(dir))
40
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
41
+ }
42
+ catch { /* BE:silent-by-design */ }
43
+ }
44
+ function defaultSecret() {
45
+ return process.env["MNEME_PREINSTALL_TRAIL_SECRET"] || `mneme-preinstall-trail-v${PROTOCOL_VERSION}`;
46
+ }
47
+ function hmacHex(prev, body) {
48
+ return createHmac("sha256", defaultSecret()).update(prev + "::" + JSON.stringify(body)).digest("hex");
49
+ }
50
+ /** Read the last sig from the trail (genesis if empty). Used by the
51
+ * preinstall inline script and any out-of-band append. */
52
+ export function lastSig() {
53
+ const path = trailPath();
54
+ if (!existsSync(path))
55
+ return "genesis";
56
+ try {
57
+ const lines = readFileSync(path, "utf8").trim().split("\n").filter(Boolean);
58
+ if (lines.length === 0)
59
+ return "genesis";
60
+ const last = JSON.parse(lines[lines.length - 1]);
61
+ return typeof last?.sig === "string" ? last.sig : "genesis";
62
+ }
63
+ catch {
64
+ return "genesis";
65
+ }
66
+ }
67
+ /** Append an entry to the trail. Used in tests + for out-of-band writes
68
+ * (e.g. install-organ recording the install completion). The inline
69
+ * preinstall script duplicates this logic since it can't import.
70
+ * Never throws. */
71
+ export function appendEntry(step, ok, opts) {
72
+ try {
73
+ ensureOrganDir();
74
+ const prevSig = lastSig();
75
+ const body = {
76
+ v: PROTOCOL_VERSION,
77
+ ts: new Date().toISOString(),
78
+ version: opts?.version ?? process.env["npm_package_version"] ?? "unknown",
79
+ step,
80
+ ok,
81
+ ...(opts?.details ? { details: opts.details } : {}),
82
+ pid: process.pid,
83
+ prevSig,
84
+ };
85
+ const sig = hmacHex(prevSig, body);
86
+ const entry = { ...body, sig };
87
+ appendFileSync(trailPath(), JSON.stringify(entry) + "\n", "utf8");
88
+ return entry;
89
+ }
90
+ catch {
91
+ return null;
92
+ }
93
+ }
94
+ /** Read all trail entries. Returns empty array on missing/unreadable file. */
95
+ export function readTrail() {
96
+ const path = trailPath();
97
+ if (!existsSync(path))
98
+ return [];
99
+ try {
100
+ const lines = readFileSync(path, "utf8").trim().split("\n").filter(Boolean);
101
+ const out = [];
102
+ for (const line of lines) {
103
+ try {
104
+ const parsed = JSON.parse(line);
105
+ if (parsed?.v === PROTOCOL_VERSION && typeof parsed.step === "string" && typeof parsed.sig === "string") {
106
+ out.push(parsed);
107
+ }
108
+ }
109
+ catch { /* skip malformed line */ }
110
+ }
111
+ return out;
112
+ }
113
+ catch {
114
+ return [];
115
+ }
116
+ }
117
+ /** Verify the HMAC chain of the entire trail. Returns structured result. */
118
+ export function verifyTrail() {
119
+ const entries = readTrail();
120
+ if (entries.length === 0) {
121
+ return { v: PROTOCOL_VERSION, totalEntries: 0, chainOk: true, hasCompleteInstall: false, lastTs: null };
122
+ }
123
+ let prevSig = "genesis";
124
+ for (let i = 0; i < entries.length; i++) {
125
+ const e = entries[i];
126
+ if (e.prevSig !== prevSig) {
127
+ return {
128
+ v: PROTOCOL_VERSION,
129
+ totalEntries: entries.length,
130
+ chainOk: false,
131
+ brokenAtIndex: i,
132
+ brokenReason: `prevSig mismatch at index ${i}: expected ${prevSig.slice(0, 12)}…, got ${e.prevSig.slice(0, 12)}…`,
133
+ hasCompleteInstall: false,
134
+ lastTs: entries[entries.length - 1].ts,
135
+ };
136
+ }
137
+ const { sig: _sig, ...body } = e;
138
+ const expectedSig = hmacHex(prevSig, body);
139
+ if (expectedSig !== e.sig) {
140
+ return {
141
+ v: PROTOCOL_VERSION,
142
+ totalEntries: entries.length,
143
+ chainOk: false,
144
+ brokenAtIndex: i,
145
+ brokenReason: `sig mismatch at index ${i}: expected ${expectedSig.slice(0, 12)}…, got ${e.sig.slice(0, 12)}…`,
146
+ hasCompleteInstall: false,
147
+ lastTs: entries[entries.length - 1].ts,
148
+ };
149
+ }
150
+ prevSig = e.sig;
151
+ }
152
+ const hasCompleteInstall = entries.some((e) => e.step === "preinstall-start") &&
153
+ entries.some((e) => e.step === "preinstall-end");
154
+ return {
155
+ v: PROTOCOL_VERSION,
156
+ totalEntries: entries.length,
157
+ chainOk: true,
158
+ hasCompleteInstall,
159
+ lastTs: entries[entries.length - 1].ts,
160
+ };
161
+ }
162
+ /** Filter entries to the most recent complete install (last block from
163
+ * preinstall-start to preinstall-end, or the tail if no end). Useful
164
+ * for the CLI install-history command. */
165
+ export function recentInstall() {
166
+ const entries = readTrail();
167
+ if (entries.length === 0)
168
+ return [];
169
+ let startIdx = -1;
170
+ for (let i = entries.length - 1; i >= 0; i--) {
171
+ if (entries[i].step === "preinstall-start") {
172
+ startIdx = i;
173
+ break;
174
+ }
175
+ }
176
+ if (startIdx === -1)
177
+ return entries.slice(-10); // No start found, return tail
178
+ return entries.slice(startIdx);
179
+ }
180
+ export function summarize() {
181
+ const entries = readTrail();
182
+ const verify = verifyTrail();
183
+ const starts = entries.filter((e) => e.step === "preinstall-start");
184
+ const ends = entries.filter((e) => e.step === "preinstall-end");
185
+ const lastEnd = ends.length > 0 ? ends[ends.length - 1] : null;
186
+ return {
187
+ v: PROTOCOL_VERSION,
188
+ totalEntries: entries.length,
189
+ installAttempts: starts.length,
190
+ completedInstalls: ends.length,
191
+ lastInstallVersion: lastEnd?.version ?? null,
192
+ lastInstallOk: lastEnd?.ok ?? null,
193
+ lastInstallTs: lastEnd?.ts ?? null,
194
+ chainOk: verify.chainOk,
195
+ };
196
+ }
197
+ /** Test-only: clear the trail. Never call in production. */
198
+ export function _clearTrailForTests() {
199
+ const path = trailPath();
200
+ try {
201
+ if (existsSync(path)) {
202
+ const { unlinkSync } = require("node:fs");
203
+ unlinkSync(path);
204
+ }
205
+ }
206
+ catch { /* */ }
207
+ }
208
+ export { PROTOCOL_VERSION, trailPath };
209
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/preinstall_trail/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * v2.19.63 PHOENIX HARDENING — PREINSTALL TRAIL deep tests.
3
+ *
4
+ * Tests cover HMAC chain semantics: tamper detection, genesis handling,
5
+ * step-name validation, complete-install detection, summarize shape.
6
+ *
7
+ * We isolate via HOME override per-test so we don't touch the real
8
+ * ~/.mneme-global trail.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=preinstall_trail.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preinstall_trail.test.d.ts","sourceRoot":"","sources":["../../src/preinstall_trail/preinstall_trail.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,248 @@
1
+ /**
2
+ * v2.19.63 PHOENIX HARDENING — PREINSTALL TRAIL deep tests.
3
+ *
4
+ * Tests cover HMAC chain semantics: tamper detection, genesis handling,
5
+ * step-name validation, complete-install detection, summarize shape.
6
+ *
7
+ * We isolate via HOME override per-test so we don't touch the real
8
+ * ~/.mneme-global trail.
9
+ */
10
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
11
+ import { existsSync, rmSync, mkdtempSync, readFileSync, writeFileSync } from "node:fs";
12
+ import { tmpdir } from "node:os";
13
+ import { join } from "node:path";
14
+ import { appendEntry, readTrail, verifyTrail, recentInstall, summarize, lastSig, PROTOCOL_VERSION, trailPath, } from "./index.js";
15
+ let savedHome;
16
+ let sandboxHome;
17
+ function setSandboxHome() {
18
+ sandboxHome = mkdtempSync(join(tmpdir(), "mneme-trail-test-"));
19
+ savedHome = process.env["HOME"] ?? process.env["USERPROFILE"];
20
+ process.env["HOME"] = sandboxHome;
21
+ process.env["USERPROFILE"] = sandboxHome;
22
+ }
23
+ function restoreHome() {
24
+ try {
25
+ rmSync(sandboxHome, { recursive: true, force: true });
26
+ }
27
+ catch { /* */ }
28
+ if (savedHome !== undefined) {
29
+ process.env["HOME"] = savedHome;
30
+ process.env["USERPROFILE"] = savedHome;
31
+ }
32
+ else {
33
+ delete process.env["HOME"];
34
+ delete process.env["USERPROFILE"];
35
+ }
36
+ }
37
+ describe("v2.19.63 preinstall_trail PROTOCOL_VERSION", () => {
38
+ it("is 1", () => {
39
+ expect(PROTOCOL_VERSION).toBe(1);
40
+ });
41
+ });
42
+ describe("v2.19.63 preinstall_trail append + read", () => {
43
+ beforeEach(() => setSandboxHome());
44
+ afterEach(() => restoreHome());
45
+ it("appendEntry writes a valid entry that survives roundtrip", () => {
46
+ const e = appendEntry("preinstall-start", true, { version: "2.19.63" });
47
+ expect(e).not.toBeNull();
48
+ expect(e.step).toBe("preinstall-start");
49
+ expect(e.ok).toBe(true);
50
+ expect(e.version).toBe("2.19.63");
51
+ expect(typeof e.sig).toBe("string");
52
+ expect(e.prevSig).toBe("genesis"); // First entry chains to genesis
53
+ });
54
+ it("trail file is created at predictable path", () => {
55
+ appendEntry("preinstall-start", true);
56
+ expect(existsSync(trailPath())).toBe(true);
57
+ });
58
+ it("readTrail returns appended entries in order", () => {
59
+ appendEntry("preinstall-start", true);
60
+ appendEntry("flag-written", true);
61
+ appendEntry("preinstall-end", true);
62
+ const entries = readTrail();
63
+ expect(entries.length).toBe(3);
64
+ expect(entries.map((e) => e.step)).toEqual(["preinstall-start", "flag-written", "preinstall-end"]);
65
+ });
66
+ it("lastSig returns previous entry's sig after append", () => {
67
+ expect(lastSig()).toBe("genesis");
68
+ const e1 = appendEntry("preinstall-start", true);
69
+ expect(lastSig()).toBe(e1.sig);
70
+ });
71
+ it("readTrail returns [] on missing trail file", () => {
72
+ expect(readTrail()).toEqual([]);
73
+ });
74
+ it("malformed lines are skipped without breaking the rest", () => {
75
+ appendEntry("preinstall-start", true);
76
+ // Inject a garbage line
77
+ writeFileSync(trailPath(), readFileSync(trailPath(), "utf8") + "not-json-at-all\n", "utf8");
78
+ appendEntry("preinstall-end", true);
79
+ const entries = readTrail();
80
+ expect(entries.length).toBe(2); // garbage skipped
81
+ expect(entries[1].step).toBe("preinstall-end");
82
+ });
83
+ });
84
+ describe("v2.19.63 preinstall_trail HMAC chain verify", () => {
85
+ beforeEach(() => setSandboxHome());
86
+ afterEach(() => restoreHome());
87
+ it("verifyTrail returns chainOk=true on clean trail", () => {
88
+ appendEntry("preinstall-start", true);
89
+ appendEntry("flag-written", true);
90
+ appendEntry("preinstall-end", true);
91
+ const v = verifyTrail();
92
+ expect(v.chainOk).toBe(true);
93
+ expect(v.totalEntries).toBe(3);
94
+ expect(v.brokenAtIndex).toBeUndefined();
95
+ });
96
+ it("verifyTrail returns chainOk=true on empty trail", () => {
97
+ const v = verifyTrail();
98
+ expect(v.chainOk).toBe(true);
99
+ expect(v.totalEntries).toBe(0);
100
+ expect(v.lastTs).toBeNull();
101
+ });
102
+ it("detects tampered ok field", () => {
103
+ appendEntry("preinstall-start", true);
104
+ appendEntry("flag-written", true);
105
+ // Tamper with the second entry's ok field
106
+ const lines = readFileSync(trailPath(), "utf8").trim().split("\n");
107
+ const e2 = JSON.parse(lines[1]);
108
+ e2.ok = false; // Tamper
109
+ lines[1] = JSON.stringify(e2);
110
+ writeFileSync(trailPath(), lines.join("\n") + "\n", "utf8");
111
+ const v = verifyTrail();
112
+ expect(v.chainOk).toBe(false);
113
+ expect(v.brokenAtIndex).toBe(1);
114
+ expect(v.brokenReason).toContain("sig mismatch");
115
+ });
116
+ it("detects broken prevSig chain", () => {
117
+ appendEntry("preinstall-start", true);
118
+ appendEntry("flag-written", true);
119
+ appendEntry("preinstall-end", true);
120
+ // Tamper with the third entry's prevSig
121
+ const lines = readFileSync(trailPath(), "utf8").trim().split("\n");
122
+ const e3 = JSON.parse(lines[2]);
123
+ e3.prevSig = "fake-prev-sig";
124
+ lines[2] = JSON.stringify(e3);
125
+ writeFileSync(trailPath(), lines.join("\n") + "\n", "utf8");
126
+ const v = verifyTrail();
127
+ expect(v.chainOk).toBe(false);
128
+ expect(v.brokenAtIndex).toBe(2);
129
+ expect(v.brokenReason).toContain("prevSig mismatch");
130
+ });
131
+ it("hasCompleteInstall true only when start AND end present", () => {
132
+ appendEntry("preinstall-start", true);
133
+ expect(verifyTrail().hasCompleteInstall).toBe(false);
134
+ appendEntry("flag-written", true);
135
+ expect(verifyTrail().hasCompleteInstall).toBe(false);
136
+ appendEntry("preinstall-end", true);
137
+ expect(verifyTrail().hasCompleteInstall).toBe(true);
138
+ });
139
+ });
140
+ describe("v2.19.63 preinstall_trail recentInstall", () => {
141
+ beforeEach(() => setSandboxHome());
142
+ afterEach(() => restoreHome());
143
+ it("returns empty on empty trail", () => {
144
+ expect(recentInstall()).toEqual([]);
145
+ });
146
+ it("returns the most-recent block from last preinstall-start", () => {
147
+ // Install attempt 1 (complete)
148
+ appendEntry("preinstall-start", true, { version: "2.19.61" });
149
+ appendEntry("flag-written", true);
150
+ appendEntry("preinstall-end", true);
151
+ // Install attempt 2 (in progress)
152
+ appendEntry("preinstall-start", true, { version: "2.19.63" });
153
+ appendEntry("flag-written", true);
154
+ const recent = recentInstall();
155
+ expect(recent.length).toBe(2);
156
+ expect(recent[0].step).toBe("preinstall-start");
157
+ expect(recent[0].version).toBe("2.19.63");
158
+ });
159
+ it("returns tail of last 10 if no preinstall-start present", () => {
160
+ // (Synthetic case: trail has entries but no start — orphan entries)
161
+ appendEntry("dll-renamed-sideways", true);
162
+ appendEntry("staging-swept", true);
163
+ const recent = recentInstall();
164
+ expect(recent.length).toBe(2);
165
+ });
166
+ });
167
+ describe("v2.19.63 preinstall_trail summarize", () => {
168
+ beforeEach(() => setSandboxHome());
169
+ afterEach(() => restoreHome());
170
+ it("counts attempts vs completions", () => {
171
+ appendEntry("preinstall-start", true, { version: "a" });
172
+ appendEntry("preinstall-end", true, { version: "a" });
173
+ appendEntry("preinstall-start", true, { version: "b" });
174
+ // Note: no preinstall-end for "b" — incomplete
175
+ const s = summarize();
176
+ expect(s.installAttempts).toBe(2);
177
+ expect(s.completedInstalls).toBe(1);
178
+ expect(s.chainOk).toBe(true);
179
+ });
180
+ it("reports last install's version + ok", () => {
181
+ appendEntry("preinstall-start", true, { version: "2.19.62" });
182
+ appendEntry("preinstall-end", true, { version: "2.19.62" });
183
+ const s = summarize();
184
+ expect(s.lastInstallVersion).toBe("2.19.62");
185
+ expect(s.lastInstallOk).toBe(true);
186
+ expect(s.lastInstallTs).not.toBeNull();
187
+ });
188
+ it("returns shape with null fields on empty trail", () => {
189
+ const s = summarize();
190
+ expect(s.installAttempts).toBe(0);
191
+ expect(s.completedInstalls).toBe(0);
192
+ expect(s.lastInstallVersion).toBeNull();
193
+ expect(s.chainOk).toBe(true);
194
+ });
195
+ });
196
+ describe("v2.19.63 preinstall_trail roundtrip with real preinstall script", () => {
197
+ it("entries written by the inline preinstall script verify cleanly via direct file read", async () => {
198
+ // We can't use HOME-override here because on Windows os.homedir() may
199
+ // cache or fall back to OS profile API. Instead we run the subprocess
200
+ // with HOME=sandbox, then directly inspect the trail file at the
201
+ // sandbox path (bypassing trailPath()'s homedir() lookup).
202
+ const { execSync } = await import("node:child_process");
203
+ const { readFileSync, existsSync, mkdtempSync, rmSync, writeFileSync } = await import("node:fs");
204
+ const { tmpdir } = await import("node:os");
205
+ const { join } = await import("node:path");
206
+ const { createHmac } = await import("node:crypto");
207
+ const sandbox = mkdtempSync(join(tmpdir(), "mneme-trail-rt-"));
208
+ try {
209
+ const pkg = JSON.parse(readFileSync("packages/cli/package.json", "utf8"));
210
+ const preinstall = pkg.scripts.preinstall;
211
+ const m = preinstall.match(/^node -e (.*)$/s);
212
+ expect(m).not.toBeNull();
213
+ const script = JSON.parse(m[1]);
214
+ const env = { ...process.env, HOME: sandbox, USERPROFILE: sandbox, HOMEDRIVE: "", HOMEPATH: "", npm_package_version: "2.19.63-rt" };
215
+ // Write script to temp file (avoids shell escape mangling of \n on Windows cmd.exe)
216
+ const scriptFile = join(sandbox, "preinstall-script.js");
217
+ writeFileSync(scriptFile, script, "utf8");
218
+ execSync(`node "${scriptFile}"`, { env, stdio: "pipe", timeout: 30000 });
219
+ // Read the trail at the sandbox path directly
220
+ const trailFile = join(sandbox, ".mneme-global", "preinstall-trail.jsonl");
221
+ expect(existsSync(trailFile)).toBe(true);
222
+ const lines = readFileSync(trailFile, "utf8").trim().split("\n").filter(Boolean);
223
+ expect(lines.length).toBeGreaterThan(0);
224
+ // Verify HMAC chain matches our module's algorithm
225
+ let prevSig = "genesis";
226
+ const secret = "mneme-preinstall-trail-v1"; // Default secret used by inline script
227
+ for (let i = 0; i < lines.length; i++) {
228
+ const e = JSON.parse(lines[i]);
229
+ expect(e.prevSig).toBe(prevSig);
230
+ const { sig, ...body } = e;
231
+ const expected = createHmac("sha256", secret).update(prevSig + "::" + JSON.stringify(body)).digest("hex");
232
+ expect(sig).toBe(expected);
233
+ prevSig = sig;
234
+ }
235
+ // Check we have a complete install (start → end)
236
+ const steps = lines.map((l) => JSON.parse(l).step);
237
+ expect(steps).toContain("preinstall-start");
238
+ expect(steps).toContain("preinstall-end");
239
+ }
240
+ finally {
241
+ try {
242
+ rmSync(sandbox, { recursive: true, force: true });
243
+ }
244
+ catch { /* */ }
245
+ }
246
+ });
247
+ });
248
+ //# sourceMappingURL=preinstall_trail.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preinstall_trail.test.js","sourceRoot":"","sources":["../../src/preinstall_trail/preinstall_trail.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cross_encoder.d.ts","sourceRoot":"","sources":["../../src/retrieval_lab/cross_encoder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,UAAU,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,iBAAiB,CAAC;IAC9B,kDAAkD;IAClD,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,WAAW,EAAE,OAAO,CAAC;IACrB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAoCD,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,wBAAwB,CAAC,CA6DnC;AAED;8DAC8D;AAC9D,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAG3D"}
1
+ {"version":3,"file":"cross_encoder.d.ts","sourceRoot":"","sources":["../../src/retrieval_lab/cross_encoder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,UAAU,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,iBAAiB,CAAC;IAC9B,kDAAkD;IAClD,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,WAAW,EAAE,OAAO,CAAC;IACrB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA0CD,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,wBAAwB,CAAC,CA6DnC;AAED;8DAC8D;AAC9D,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAG3D"}
@@ -20,6 +20,13 @@ async function loadPipeline(modelId) {
20
20
  if (Date.now() - lastLoadFailedAt < LOAD_RETRY_COOLDOWN_MS)
21
21
  return null;
22
22
  try {
23
+ // v2.19.63 PHOENIX P3 defense-in-depth — fire DLL extraction before
24
+ // transformers loads sharp/libvips. Idempotent + non-throwing.
25
+ try {
26
+ const { extractAndRedirect } = await import("../phoenix/dll_extraction.js");
27
+ extractAndRedirect();
28
+ }
29
+ catch { /* BE:silent-by-design */ }
23
30
  const transformers = (await import("@huggingface/transformers"));
24
31
  // The text-classification pipeline with a cross-encoder model emits
25
32
  // a single relevance logit per pair. We score candidates by the logit.
@@ -1 +1 @@
1
- {"version":3,"file":"cross_encoder.js","sourceRoot":"","sources":["../../src/retrieval_lab/cross_encoder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cross_encoder.js","sourceRoot":"","sources":["../../src/retrieval_lab/cross_encoder.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"whats_new.d.ts","sourceRoot":"","sources":["../src/whats_new.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;oCAEoC;AACpC,eAAO,MAAM,UAAU,EAAE,iBAAiB,EAqrBzC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB;kCAC8B;IAC9B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,gEAAgE;IAChE,cAAc,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;CACjB;AAoBD;sEACsE;AACtE,wBAAgB,WAAW,CAAC,IAAI,GAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAA2B,GAAG,cAAc,CAkB5I;AAED;yEACyE;AACzE,wBAAgB,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwB3E"}
1
+ {"version":3,"file":"whats_new.d.ts","sourceRoot":"","sources":["../src/whats_new.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;oCAEoC;AACpC,eAAO,MAAM,UAAU,EAAE,iBAAiB,EA8rBzC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB;kCAC8B;IAC9B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,gEAAgE;IAChE,cAAc,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;CACjB;AAoBD;sEACsE;AACtE,wBAAgB,WAAW,CAAC,IAAI,GAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAA2B,GAAG,cAAc,CAkB5I;AAED;yEACyE;AACzE,wBAAgB,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwB3E"}
package/dist/whats_new.js CHANGED
@@ -20,6 +20,14 @@ import { fileURLToPath } from "node:url";
20
20
  * user-visible behavior. Keep `body` plain English so the AI can quote
21
21
  * it verbatim to non-engineers. */
22
22
  export const HIGHLIGHTS = [
23
+ {
24
+ version: "2.19.63",
25
+ date: "2026-05-19",
26
+ headline: "PHOENIX HARDENING -- 4 fixes for the bug classes user caught after v2.19.62 install. (1) AUTO-FIRE DLL extraction at daemon boot (missing wiring v2.19.62 forgot). (2) PREINSTALL TRAIL HMAC-chained ledger -- PROVES preinstall ran. (3) DOCTOR organ -- detects user's REAL dual-install bug (nvm4w + nvm-windows). (4) LATEST-LAG gate in publish-all.mjs -- blocks publish-complete until npm @latest CDN propagates. Plus 4 new MCP tools (783 -> 787). 53 new deep tests + 6922/6922 contract pass.",
27
+ body: "User audit post-v2.19.62 caught 3 bug classes I missed: (A) 'EBUSY didn't fire only because daemon died from unrelated HCI watchdog -- not because P3 wiring worked'. (B) Dual install location: C:\\nvm4w\\nodejs\\node_modules\\mneme-ai + C:\\Users\\X\\AppData\\Local\\nvm\\v22.22.1\\node_modules\\mneme-ai both at 2.19.61 -- PATH shim ambiguity. (C) npm view says 2.19.62 but npm install @latest resolves to 2.19.61 (CDN replication lag 5-15min). v2.19.63 closes all 4 gaps. **FIX #1 AUTO-FIRE DLL extraction at daemon boot** (packages/core/src/nucleus_daemon.ts): runDaemonLoop now calls extractAndRedirect() + installCleanupOnExit() BEFORE any code path can transitively require sharp. Defense-in-depth at every dynamic-import site (packages/embeddings/src/bundled.ts + packages/core/src/retrieval_lab/cross_encoder.ts) -- idempotent calls. v2.19.62 shipped P3 as MCP tool only; daemon never auto-fired. v2.19.63 wires the missing trigger. **FIX #2 PREINSTALL TRAIL HMAC-CHAINED LEDGER** (packages/core/src/preinstall_trail/index.ts): inline preinstall script rewritten to write ~/.mneme-global/preinstall-trail.jsonl per step (preinstall-start / flag-written / daemon-stop-{windows,posix} / heartbeat-reaped / dll-renamed-sideways / staging-swept / preinstall-end). Each entry HMAC-SHA256 chained (5th HMAC chain composing with v2.19.34 APOSTILLE). verifyTrail() detects sig + prevSig tampering. AI agents + CI now have PROOF preinstall ran. Plus preinstall enumerates multi-prefix DLL paths (nvm4w + nvm-windows + AppData/Roaming/npm + dirname(process.execPath)) instead of only one. 19 deep tests including end-to-end roundtrip executing real package.json preinstall in sandbox. **FIX #3 DOCTOR ORGAN** (packages/core/src/doctor/index.ts): discoverNpmPrefixes() enumerates 8+ candidate paths across all known Node version managers (NVM4W + nvm-windows + Volta + fnm + scoop + system Node + npm config get prefix). findInstallsUnderPrefix() handles both flat npm + nested per-version-of-Node trees. findActiveOnPath() walks PATH for the active shim. Pure observation -- NEVER mutates filesystem (canary-file invariant tested). Returns exact rm/Remove-Item commands per stale install. The doctor IS detecting user's exact dual-install bug right now. 15 deep tests. **FIX #4 LATEST-LAG GATE** (scripts/publish-all.mjs Step 4): retry-loop npm view mneme-ai@latest version with 10s -> 60s backoff up to 10min until @latest resolves to TARGET_VERSION. Plus end-to-end install via @latest in clean tmp dir + version-match check. Warns but does not fail (tag IS published; CDN slow). Honest output: 'Workaround for users: npm install -g mneme-ai@<exact-version>'. **4 NEW MCP TOOLS** (packages/mcp/src/tools/_v1963_hardening.ts): mneme.install.trail (read recent/all trail entries + summary) + mneme.install.trail_verify (HMAC chain integrity) + mneme.doctor.scan (dual-install detection + recommendations) + mneme.phoenix.extract_status (PROVES P3 active by reading process env for per-PID mneme-vips-{pid} entry). MEASURED: 53 new deep tests + 6922/6922 MCP contract pass clean. AURELIAN 3/3 SHIP. 5 packages published atomically via publish-all.mjs (with new LATEST-LAG gate active). Total MCP tools 783 -> 787 (+4). **HONEST ACCOUNTABILITY**: my v2.19.62 'EBUSY structurally impossible' claim was unverified in production. User correctly proved the install path passed by accident. v2.19.63 closes the forensic loop + wires the missing trigger. Pattern: claiming a fix works requires evidence the fix actually FIRED, not just that the bug didn't recur in one observation.",
28
+ suggestedAction: "AI agents: post-install, call mneme.install.trail to PROVE preinstall ran. If user reports version drift, call mneme.doctor.scan to detect dual-install conflicts. To verify P3 is active in a daemon process, call mneme.phoenix.extract_status from MCP (must run inside the daemon, not a fresh CLI subprocess). When recommending upgrade, prefer `npm install -g mneme-ai@<exact-version>` over `@latest` for the first ~15min after a release (CDN lag).",
29
+ tags: ["phoenix-hardening", "auto-fire-dll-extraction", "preinstall-trail-hmac", "doctor-organ", "dual-install-detection", "latest-lag-gate", "4-new-mcp-tools", "forensic-proof-install", "honest-accountability"],
30
+ },
23
31
  {
24
32
  version: "2.19.62",
25
33
  date: "2026-05-19",