@mneme-ai/core 2.19.62 → 2.19.64

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 (48) 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 +3 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +28 -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/phoenix/dll_extraction.d.ts +10 -2
  21. package/dist/phoenix/dll_extraction.d.ts.map +1 -1
  22. package/dist/phoenix/dll_extraction.js +54 -12
  23. package/dist/phoenix/dll_extraction.js.map +1 -1
  24. package/dist/phoenix/dll_extraction.test.js +24 -3
  25. package/dist/phoenix/dll_extraction.test.js.map +1 -1
  26. package/dist/preinstall_trail/index.d.ts +91 -0
  27. package/dist/preinstall_trail/index.d.ts.map +1 -0
  28. package/dist/preinstall_trail/index.js +209 -0
  29. package/dist/preinstall_trail/index.js.map +1 -0
  30. package/dist/preinstall_trail/preinstall_trail.test.d.ts +11 -0
  31. package/dist/preinstall_trail/preinstall_trail.test.d.ts.map +1 -0
  32. package/dist/preinstall_trail/preinstall_trail.test.js +248 -0
  33. package/dist/preinstall_trail/preinstall_trail.test.js.map +1 -0
  34. package/dist/retrieval_lab/cross_encoder.d.ts.map +1 -1
  35. package/dist/retrieval_lab/cross_encoder.js +7 -0
  36. package/dist/retrieval_lab/cross_encoder.js.map +1 -1
  37. package/dist/wasm_chrysalis/index.d.ts +201 -0
  38. package/dist/wasm_chrysalis/index.d.ts.map +1 -0
  39. package/dist/wasm_chrysalis/index.js +445 -0
  40. package/dist/wasm_chrysalis/index.js.map +1 -0
  41. package/dist/wasm_chrysalis/wasm_chrysalis.test.d.ts +20 -0
  42. package/dist/wasm_chrysalis/wasm_chrysalis.test.d.ts.map +1 -0
  43. package/dist/wasm_chrysalis/wasm_chrysalis.test.js +348 -0
  44. package/dist/wasm_chrysalis/wasm_chrysalis.test.js.map +1 -0
  45. package/dist/whats_new.d.ts.map +1 -1
  46. package/dist/whats_new.js +8 -0
  47. package/dist/whats_new.js.map +1 -1
  48. package/package.json +1 -1
@@ -0,0 +1,91 @@
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
+ declare const PROTOCOL_VERSION = 1;
27
+ /** Steps the preinstall hook records. Add new steps here when adding
28
+ * trail logging in the preinstall script. Names must match exactly. */
29
+ export type PreinstallStep = "preinstall-start" | "flag-written" | "daemon-stop-windows" | "daemon-stop-posix" | "heartbeat-reaped" | "dll-renamed-sideways" | "dll-probe-confirmed" | "staging-swept" | "preinstall-end";
30
+ export interface TrailEntry {
31
+ v: typeof PROTOCOL_VERSION;
32
+ ts: string;
33
+ /** npm package version being installed (best-effort from env). */
34
+ version: string;
35
+ step: PreinstallStep;
36
+ ok: boolean;
37
+ details?: Record<string, unknown>;
38
+ /** Process PID that wrote this entry. */
39
+ pid: number;
40
+ /** HMAC of previous entry's sig (chains the trail). */
41
+ prevSig: string;
42
+ /** HMAC of this entry's body. */
43
+ sig: string;
44
+ }
45
+ export interface TrailVerifyResult {
46
+ v: typeof PROTOCOL_VERSION;
47
+ totalEntries: number;
48
+ chainOk: boolean;
49
+ brokenAtIndex?: number;
50
+ brokenReason?: string;
51
+ /** Did we see at least one complete install (preinstall-start → preinstall-end)? */
52
+ hasCompleteInstall: boolean;
53
+ /** Last entry's timestamp; null if trail empty. */
54
+ lastTs: string | null;
55
+ }
56
+ declare function trailPath(): string;
57
+ /** Read the last sig from the trail (genesis if empty). Used by the
58
+ * preinstall inline script and any out-of-band append. */
59
+ export declare function lastSig(): string;
60
+ /** Append an entry to the trail. Used in tests + for out-of-band writes
61
+ * (e.g. install-organ recording the install completion). The inline
62
+ * preinstall script duplicates this logic since it can't import.
63
+ * Never throws. */
64
+ export declare function appendEntry(step: PreinstallStep, ok: boolean, opts?: {
65
+ version?: string;
66
+ details?: Record<string, unknown>;
67
+ }): TrailEntry | null;
68
+ /** Read all trail entries. Returns empty array on missing/unreadable file. */
69
+ export declare function readTrail(): TrailEntry[];
70
+ /** Verify the HMAC chain of the entire trail. Returns structured result. */
71
+ export declare function verifyTrail(): TrailVerifyResult;
72
+ /** Filter entries to the most recent complete install (last block from
73
+ * preinstall-start to preinstall-end, or the tail if no end). Useful
74
+ * for the CLI install-history command. */
75
+ export declare function recentInstall(): TrailEntry[];
76
+ /** Summarize the trail: total installs, last verdict, broken-chain status. */
77
+ export interface TrailSummary {
78
+ v: typeof PROTOCOL_VERSION;
79
+ totalEntries: number;
80
+ installAttempts: number;
81
+ completedInstalls: number;
82
+ lastInstallVersion: string | null;
83
+ lastInstallOk: boolean | null;
84
+ lastInstallTs: string | null;
85
+ chainOk: boolean;
86
+ }
87
+ export declare function summarize(): TrailSummary;
88
+ /** Test-only: clear the trail. Never call in production. */
89
+ export declare function _clearTrailForTests(): void;
90
+ export { PROTOCOL_VERSION, trailPath };
91
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/preinstall_trail/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAOH,QAAA,MAAM,gBAAgB,IAAI,CAAC;AAI3B;wEACwE;AACxE,MAAM,MAAM,cAAc,GACtB,kBAAkB,GAClB,cAAc,GACd,qBAAqB,GACrB,mBAAmB,GACnB,kBAAkB,GAClB,sBAAsB,GACtB,qBAAqB,GACrB,eAAe,GACf,gBAAgB,CAAC;AAErB,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,cAAc,CAAC;IACrB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oFAAoF;IACpF,kBAAkB,EAAE,OAAO,CAAC;IAC5B,mDAAmD;IACnD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,iBAAS,SAAS,IAAI,MAAM,CAE3B;AAiBD;2DAC2D;AAC3D,wBAAgB,OAAO,IAAI,MAAM,CAWhC;AAED;;;oBAGoB;AACpB,wBAAgB,WAAW,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,UAAU,GAAG,IAAI,CAqBhJ;AAED,8EAA8E;AAC9E,wBAAgB,SAAS,IAAI,UAAU,EAAE,CAkBxC;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,IAAI,iBAAiB,CA2C/C;AAED;;2CAE2C;AAC3C,wBAAgB,aAAa,IAAI,UAAU,EAAE,CAY5C;AAED,8EAA8E;AAC9E,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,SAAS,IAAI,YAAY,CAgBxC;AAED,4DAA4D;AAC5D,wBAAgB,mBAAmB,IAAI,IAAI,CAQ1C;AAED,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC"}
@@ -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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"}