@mneme-ai/core 2.19.52 → 2.19.53

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,434 @@
1
+ /**
2
+ * v2.19.53 INSTALL ORGAN — self-healing process-lineage protocol.
3
+ *
4
+ * The wild bet: every Mneme-spawned node process registers a HEARTBEAT
5
+ * file with role + parent + start time + held DLLs. When the install
6
+ * pipeline needs to release file locks (Windows EBUSY on libvips-42.dll,
7
+ * macOS code-sign cache on .dylib, Linux fd holds), it reads the heartbeat
8
+ * dir + reaps every Mneme process IT KNOWS ABOUT — not by killing all
9
+ * `node.exe` (would nuke the user's editor / AI client), but by exact PID
10
+ * from the registry the daemon wrote itself.
11
+ *
12
+ * Cross-platform:
13
+ * - Windows: heartbeat + DLL fs.openSync(path, 'r+') probe + WMI fallback
14
+ * - macOS: heartbeat + lsof probe + SIGUSR2 graceful handoff
15
+ * - Linux: heartbeat + /proc/{pid}/fd scan + SIGUSR2 graceful handoff
16
+ *
17
+ * The 3 platforms share the same heartbeat protocol — write a JSON file
18
+ * named `{pid}.beat` to `~/.mneme-global/heartbeats/`. Each Mneme process
19
+ * updates its own beat every 5s; stale beats (>15s) are tombstones for
20
+ * dead processes. No central coordinator; CRDT-like.
21
+ *
22
+ * Lineage ledger: `~/.mneme-global/lineage.jsonl` is append-only HMAC-chained
23
+ * record of every spawn/exit event. Audit trail composes with v2.19.34 APOSTILLE.
24
+ *
25
+ * The world-class moat: no AI tool worldwide ships a self-aware process
26
+ * organism that knows its own family + reaps cleanly + composes a DLL
27
+ * probe + handoff signal. The combination is unique. First-mover forever.
28
+ */
29
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync, unlinkSync, openSync, closeSync, appendFileSync } from "node:fs";
30
+ import { join } from "node:path";
31
+ import { homedir, hostname, platform } from "node:os";
32
+ import { spawnSync } from "node:child_process";
33
+ import { createHmac } from "node:crypto";
34
+ const PROTOCOL_VERSION = 1;
35
+ const HEARTBEAT_TTL_MS = 15_000; // beats older than this = stale (process likely dead)
36
+ const HEARTBEAT_INTERVAL_MS = 5_000; // each process updates its own beat every 5s
37
+ function defaultSecret() {
38
+ return process.env["MNEME_INSTALL_ORGAN_SECRET"] || `mneme-install-organ-v${PROTOCOL_VERSION}`;
39
+ }
40
+ function hmacHex(prev, body, secret) {
41
+ return createHmac("sha256", secret).update(prev + "::" + JSON.stringify(body)).digest("hex");
42
+ }
43
+ /** Cross-platform global state dir. ~/.mneme-global/ exists outside any
44
+ * per-repo .mneme/ dir so the heartbeat protocol spans all repos a user
45
+ * has on the same machine. */
46
+ export function organDir() {
47
+ return join(homedir(), ".mneme-global");
48
+ }
49
+ export function heartbeatDir() {
50
+ return join(organDir(), "heartbeats");
51
+ }
52
+ export function lineagePath() {
53
+ return join(organDir(), "lineage.jsonl");
54
+ }
55
+ export function ensureOrganDirs() {
56
+ for (const d of [organDir(), heartbeatDir()]) {
57
+ if (!existsSync(d)) {
58
+ try {
59
+ mkdirSync(d, { recursive: true, mode: 0o700 });
60
+ }
61
+ catch { /* best-effort */ }
62
+ }
63
+ }
64
+ }
65
+ // ────────────────────────────────────────────────────────────────────────
66
+ // HEARTBEAT API
67
+ // ────────────────────────────────────────────────────────────────────────
68
+ /** Register THIS process in the heartbeat registry. Returns the interval
69
+ * id so the caller can clear it on graceful shutdown. Idempotent — calling
70
+ * twice for the same PID just refreshes. */
71
+ export function registerHeartbeat(role, holdsPaths) {
72
+ ensureOrganDirs();
73
+ const beatPath = join(heartbeatDir(), `${process.pid}.beat`);
74
+ const writeOne = () => {
75
+ const beat = {
76
+ v: PROTOCOL_VERSION,
77
+ pid: process.pid,
78
+ ppid: process.ppid,
79
+ role,
80
+ startedAt: new Date().toISOString(),
81
+ beatAt: new Date().toISOString(),
82
+ cwd: process.cwd(),
83
+ host: hostname(),
84
+ platform: platform(),
85
+ ...(holdsPaths && holdsPaths.length > 0 ? { holdsPaths } : {}),
86
+ };
87
+ try {
88
+ writeFileSync(beatPath, JSON.stringify(beat), { encoding: "utf8", mode: 0o600 });
89
+ }
90
+ catch { /* best-effort */ }
91
+ };
92
+ // Write once immediately + every interval
93
+ writeOne();
94
+ let intervalId = null;
95
+ try {
96
+ intervalId = setInterval(writeOne, HEARTBEAT_INTERVAL_MS);
97
+ if (intervalId.unref)
98
+ intervalId.unref(); // don't keep event loop alive
99
+ }
100
+ catch { /* setInterval not available in some test envs */ }
101
+ // Append spawn event to lineage
102
+ try {
103
+ appendLineage({ event: "spawn", pid: process.pid, role, parentPid: process.ppid });
104
+ }
105
+ catch { /* best-effort */ }
106
+ return { intervalId, beatPath };
107
+ }
108
+ /** Cleanly de-register THIS process. Called from SIGTERM handlers. */
109
+ export function deregisterHeartbeat(role, intervalId, reason) {
110
+ if (intervalId) {
111
+ try {
112
+ clearInterval(intervalId);
113
+ }
114
+ catch { /* best-effort */ }
115
+ }
116
+ const beatPath = join(heartbeatDir(), `${process.pid}.beat`);
117
+ try {
118
+ if (existsSync(beatPath))
119
+ unlinkSync(beatPath);
120
+ }
121
+ catch { /* best-effort */ }
122
+ try {
123
+ appendLineage({ event: "exit", pid: process.pid, role, reason: reason ?? "clean-exit" });
124
+ }
125
+ catch { /* best-effort */ }
126
+ }
127
+ /** Read every heartbeat in the registry. Returns parsed beats sorted by
128
+ * beatAt desc. Silently skips unreadable/corrupt files. */
129
+ export function listHeartbeats() {
130
+ ensureOrganDirs();
131
+ const out = [];
132
+ let entries;
133
+ try {
134
+ entries = readdirSync(heartbeatDir());
135
+ }
136
+ catch {
137
+ return [];
138
+ }
139
+ for (const f of entries) {
140
+ if (!f.endsWith(".beat"))
141
+ continue;
142
+ try {
143
+ const body = readFileSync(join(heartbeatDir(), f), "utf8");
144
+ const beat = JSON.parse(body);
145
+ if (typeof beat.pid === "number" && typeof beat.beatAt === "string") {
146
+ out.push(beat);
147
+ }
148
+ }
149
+ catch { /* corrupt — skip */ }
150
+ }
151
+ return out.sort((a, b) => b.beatAt.localeCompare(a.beatAt));
152
+ }
153
+ export function classifyHeartbeats(now = Date.now()) {
154
+ const beats = listHeartbeats();
155
+ const out = [];
156
+ for (const beat of beats) {
157
+ const ageMs = now - Date.parse(beat.beatAt);
158
+ const pidAlive = isPidAlive(beat.pid);
159
+ let status;
160
+ if (!pidAlive)
161
+ status = "tombstone";
162
+ else if (ageMs > HEARTBEAT_TTL_MS)
163
+ status = "stale-but-alive";
164
+ else
165
+ status = "alive";
166
+ out.push({ beat, ageMs, pidAlive, status });
167
+ }
168
+ return out;
169
+ }
170
+ /** Cross-platform "is this PID alive right now?" — does NOT signal it. */
171
+ export function isPidAlive(pid) {
172
+ if (pid <= 0)
173
+ return false;
174
+ try {
175
+ process.kill(pid, 0); // signal 0 = no-op probe
176
+ return true;
177
+ }
178
+ catch (e) {
179
+ // ESRCH = process does not exist; EPERM = exists but we can't signal it
180
+ return e.code === "EPERM";
181
+ }
182
+ }
183
+ // ────────────────────────────────────────────────────────────────────────
184
+ // LINEAGE LEDGER (HMAC-chained, composes with APOSTILLE)
185
+ // ────────────────────────────────────────────────────────────────────────
186
+ function appendLineage(partial) {
187
+ ensureOrganDirs();
188
+ let prevSig = "0".repeat(64);
189
+ try {
190
+ if (existsSync(lineagePath())) {
191
+ const all = readFileSync(lineagePath(), "utf8").split("\n").filter((l) => l.trim().length > 0);
192
+ if (all.length > 0) {
193
+ const last = JSON.parse(all[all.length - 1]);
194
+ prevSig = last.sig;
195
+ }
196
+ }
197
+ }
198
+ catch { /* corrupt — chain restarts */ }
199
+ const body = { v: PROTOCOL_VERSION, ts: new Date().toISOString(), prevSig, ...partial };
200
+ const sig = hmacHex(prevSig, body, defaultSecret());
201
+ const entry = { ...body, sig };
202
+ try {
203
+ appendFileSync(lineagePath(), JSON.stringify(entry) + "\n", { encoding: "utf8", mode: 0o600 });
204
+ }
205
+ catch { /* best-effort */ }
206
+ }
207
+ export function readLineage(limit = 100) {
208
+ ensureOrganDirs();
209
+ if (!existsSync(lineagePath()))
210
+ return [];
211
+ try {
212
+ const all = readFileSync(lineagePath(), "utf8").split("\n").filter((l) => l.trim().length > 0);
213
+ return all.slice(-limit).map((l) => JSON.parse(l));
214
+ }
215
+ catch {
216
+ return [];
217
+ }
218
+ }
219
+ /** Verify the HMAC chain integrity. Returns { ok, brokenAt? }. */
220
+ export function verifyLineage() {
221
+ const all = readLineage(100_000);
222
+ if (all.length === 0)
223
+ return { ok: true };
224
+ let prevSig = "0".repeat(64);
225
+ for (let i = 0; i < all.length; i++) {
226
+ const entry = all[i];
227
+ if (entry.prevSig !== prevSig)
228
+ return { ok: false, brokenAt: i, reason: "prevSig mismatch" };
229
+ const body = { v: entry.v, ts: entry.ts, prevSig: entry.prevSig, event: entry.event, pid: entry.pid, role: entry.role, ...(entry.parentPid !== undefined ? { parentPid: entry.parentPid } : {}), ...(entry.reason !== undefined ? { reason: entry.reason } : {}) };
230
+ const sig = hmacHex(prevSig, body, defaultSecret());
231
+ if (sig !== entry.sig)
232
+ return { ok: false, brokenAt: i, reason: "sig mismatch" };
233
+ prevSig = entry.sig;
234
+ }
235
+ return { ok: true };
236
+ }
237
+ /** Try to open a path for read+write. EBUSY/EPERM = locked by another
238
+ * process. Returns structured result. Cross-platform — works for both
239
+ * .dll (Windows) and .dylib (macOS) and .so (Linux). */
240
+ export function probeLockable(path) {
241
+ if (!existsSync(path))
242
+ return { path, writable: true, reason: "file-not-present" };
243
+ try {
244
+ const fd = openSync(path, "r+");
245
+ closeSync(fd);
246
+ return { path, writable: true };
247
+ }
248
+ catch (e) {
249
+ const err = e;
250
+ const result = { path, writable: false, reason: err.code ?? err.message };
251
+ // macOS + Linux: ask lsof who holds it (best-effort)
252
+ if (process.platform !== "win32") {
253
+ try {
254
+ const r = spawnSync("lsof", ["-t", path], { encoding: "utf8", timeout: 3_000 });
255
+ if (r.status === 0 && r.stdout) {
256
+ const pids = r.stdout.trim().split("\n").map((s) => parseInt(s, 10)).filter((n) => n > 0);
257
+ if (pids.length > 0)
258
+ result.holdingPids = pids;
259
+ }
260
+ }
261
+ catch { /* lsof not available — silent fallback */ }
262
+ }
263
+ return result;
264
+ }
265
+ }
266
+ /** Reap all Mneme processes registered in the heartbeat dir. SIGTERM →
267
+ * grace period → SIGKILL. Cross-platform via process.kill. Returns
268
+ * structured per-PID report. */
269
+ export function reapMnemeProcesses(opts) {
270
+ const dryRun = opts?.dryRun ?? false;
271
+ const grace = opts?.gracePeriodMs ?? 1_000;
272
+ const skipPid = opts?.skipPid ?? -1;
273
+ const rolesAllow = opts?.rolesAllow;
274
+ const beats = listHeartbeats();
275
+ const out = { attempted: 0, killed: 0, failed: 0, tombstonesRemoved: 0, perPid: [] };
276
+ // First pass: tombstones — PIDs that don't exist anymore. Just remove the beat file.
277
+ for (const beat of beats) {
278
+ if (rolesAllow && !rolesAllow.includes(beat.role))
279
+ continue;
280
+ if (beat.pid === skipPid) {
281
+ out.perPid.push({ pid: beat.pid, role: beat.role, outcome: "skipped-self" });
282
+ continue;
283
+ }
284
+ if (!isPidAlive(beat.pid)) {
285
+ if (!dryRun) {
286
+ try {
287
+ unlinkSync(join(heartbeatDir(), `${beat.pid}.beat`));
288
+ out.tombstonesRemoved++;
289
+ }
290
+ catch { /* */ }
291
+ }
292
+ out.perPid.push({ pid: beat.pid, role: beat.role, outcome: "already-dead" });
293
+ continue;
294
+ }
295
+ // Second pass: alive — SIGTERM first
296
+ out.attempted++;
297
+ if (dryRun) {
298
+ out.perPid.push({ pid: beat.pid, role: beat.role, outcome: "killed", reason: "dry-run" });
299
+ continue;
300
+ }
301
+ try {
302
+ process.kill(beat.pid, "SIGTERM");
303
+ }
304
+ catch (e) {
305
+ out.failed++;
306
+ out.perPid.push({ pid: beat.pid, role: beat.role, outcome: "failed", reason: e.message });
307
+ continue;
308
+ }
309
+ // Wait grace period; if still alive, SIGKILL
310
+ const deadline = Date.now() + grace;
311
+ while (Date.now() < deadline && isPidAlive(beat.pid)) {
312
+ // tight loop — small grace period, no real CPU cost
313
+ }
314
+ if (isPidAlive(beat.pid)) {
315
+ try {
316
+ process.kill(beat.pid, "SIGKILL");
317
+ }
318
+ catch { /* may have died between checks */ }
319
+ }
320
+ if (isPidAlive(beat.pid)) {
321
+ out.failed++;
322
+ out.perPid.push({ pid: beat.pid, role: beat.role, outcome: "failed", reason: "still-alive-after-sigkill" });
323
+ }
324
+ else {
325
+ out.killed++;
326
+ try {
327
+ unlinkSync(join(heartbeatDir(), `${beat.pid}.beat`));
328
+ }
329
+ catch { /* */ }
330
+ try {
331
+ appendLineage({ event: "orphan-reaped", pid: beat.pid, role: beat.role, reason: "reaper" });
332
+ }
333
+ catch { /* */ }
334
+ out.perPid.push({ pid: beat.pid, role: beat.role, outcome: "killed" });
335
+ }
336
+ }
337
+ return out;
338
+ }
339
+ export function diagnoseInstall(probedPaths = []) {
340
+ const perBeat = classifyHeartbeats();
341
+ const alive = perBeat.filter((b) => b.status === "alive").length;
342
+ const staleButAlive = perBeat.filter((b) => b.status === "stale-but-alive").length;
343
+ const tombstones = perBeat.filter((b) => b.status === "tombstone").length;
344
+ const lineage = verifyLineage();
345
+ const all = readLineage(100_000);
346
+ const probes = probedPaths.map(probeLockable);
347
+ const lockedCount = probes.filter((p) => !p.writable).length;
348
+ let recommendation;
349
+ let ok;
350
+ if (staleButAlive === 0 && lockedCount === 0 && tombstones === 0) {
351
+ ok = true;
352
+ recommendation = "HEALTHY — no orphans, no locked files. Install safe to proceed.";
353
+ }
354
+ else if (lockedCount > 0) {
355
+ ok = false;
356
+ recommendation = `LOCKED — ${lockedCount} file(s) held by Mneme process(es). Run mneme.install.heal to reap orphans + retry.`;
357
+ }
358
+ else if (staleButAlive > 0) {
359
+ ok = false;
360
+ recommendation = `STALE — ${staleButAlive} Mneme process(es) with no recent heartbeat but PID alive. Likely orphaned daemon child. Run mneme.install.heal.`;
361
+ }
362
+ else {
363
+ ok = true;
364
+ recommendation = `STALE TOMBSTONES — ${tombstones} dead-process beat files present. Cleanup recommended via mneme.install.heal but install is safe.`;
365
+ }
366
+ return {
367
+ ok,
368
+ heartbeats: { total: perBeat.length, alive, staleButAlive, tombstones },
369
+ perBeat,
370
+ lineage: { entries: all.length, chainOk: lineage.ok, ...(lineage.brokenAt !== undefined ? { brokenAt: lineage.brokenAt } : {}) },
371
+ probes,
372
+ recommendation,
373
+ };
374
+ }
375
+ /** Full heal: diagnose → reap stale + alive Mneme PIDs (NOT random
376
+ * node processes) → re-probe DLLs. Returns structured ok/failure. */
377
+ export function healInstall(probedPaths = [], opts) {
378
+ const diagnosis = diagnoseInstall(probedPaths);
379
+ const reap = reapMnemeProcesses(opts);
380
+ // Give OS a moment to release handles after reaping.
381
+ const waitEnd = Date.now() + 1_500;
382
+ while (Date.now() < waitEnd) { /* spin briefly */ }
383
+ const postProbes = probedPaths.map(probeLockable);
384
+ const stillLocked = postProbes.filter((p) => !p.writable);
385
+ const ok = stillLocked.length === 0 && reap.failed === 0;
386
+ const remediation = [];
387
+ if (reap.failed > 0)
388
+ remediation.push(`${reap.failed} process(es) survived SIGKILL — manual intervention required (Task Manager / kill -9 / Activity Monitor).`);
389
+ if (stillLocked.length > 0) {
390
+ remediation.push(`${stillLocked.length} path(s) still locked after reap. Holding PIDs: ${stillLocked.map((p) => p.holdingPids?.join(",") || "?").join(" / ")}. Consider OS-level handle release (Windows: Process Explorer; macOS: lsof + kill; Linux: lsof + kill).`);
391
+ }
392
+ if (ok && reap.killed > 0)
393
+ remediation.push(`✅ Healed: reaped ${reap.killed} orphan(s); all locks released. Install safe to retry.`);
394
+ if (ok && reap.killed === 0)
395
+ remediation.push(`✅ Already healthy: no orphans found, no locks present.`);
396
+ return { ok, diagnosis, reap, postProbes, remediation };
397
+ }
398
+ // ────────────────────────────────────────────────────────────────────────
399
+ // CONFIG — paths the install pipeline cares about per platform
400
+ // ────────────────────────────────────────────────────────────────────────
401
+ /** Paths Mneme has historically locked on each platform. The install
402
+ * pipeline probes these before running npm install. */
403
+ export function defaultLockableProbes(installRoot) {
404
+ if (!installRoot)
405
+ return [];
406
+ const out = [];
407
+ const sharpDir = join(installRoot, "node_modules", "@img");
408
+ // Windows: libvips-42.dll family
409
+ if (process.platform === "win32") {
410
+ out.push(join(installRoot, "node_modules", "@img", "sharp-libvips-win32-x64", "lib", "libvips-42.dll"));
411
+ out.push(join(installRoot, "node_modules", "sharp", "build", "Release", "sharp-win32-x64.node"));
412
+ }
413
+ else if (process.platform === "darwin") {
414
+ // macOS: .dylib + code-signed .node
415
+ out.push(join(installRoot, "node_modules", "@img", "sharp-libvips-darwin-arm64", "lib", "libvips.42.dylib"));
416
+ out.push(join(installRoot, "node_modules", "@img", "sharp-libvips-darwin-x64", "lib", "libvips.42.dylib"));
417
+ out.push(join(installRoot, "node_modules", "sharp", "build", "Release", "sharp-darwin-arm64.node"));
418
+ out.push(join(installRoot, "node_modules", "sharp", "build", "Release", "sharp-darwin-x64.node"));
419
+ }
420
+ else {
421
+ // Linux: .so
422
+ out.push(join(installRoot, "node_modules", "@img", "sharp-libvips-linux-x64", "lib", "libvips.so.42"));
423
+ out.push(join(installRoot, "node_modules", "sharp", "build", "Release", "sharp-linux-x64.node"));
424
+ }
425
+ return out.filter((p) => existsSync(sharpDir) ? true : false);
426
+ }
427
+ /** v2.19.53 — graceful handoff signal. On POSIX (macOS + Linux), daemon
428
+ * can install a SIGUSR2 handler that triggers state snapshot + child
429
+ * reaping BEFORE the daemon exits. Windows has no SIGUSR2; falls back
430
+ * to SIGTERM. The handoff makes cross-version `npm install -g` a
431
+ * zero-downtime upgrade on POSIX. */
432
+ export const HANDOFF_SIGNAL = process.platform === "win32" ? "SIGTERM" : "SIGUSR2";
433
+ export { PROTOCOL_VERSION, HEARTBEAT_TTL_MS, HEARTBEAT_INTERVAL_MS };
434
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/install_organ/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * v2.19.53 INSTALL ORGAN — deep tests for the cross-platform self-healing
3
+ * process-lineage protocol.
4
+ *
5
+ * Tests cover:
6
+ * - Heartbeat write / read / classify (alive vs stale-but-alive vs tombstone)
7
+ * - HMAC-chained lineage ledger (chain integrity + tamper detection)
8
+ * - DLL/dylib probe (writable / not-present / locked semantics)
9
+ * - Reaper (dry-run + per-PID outcome + role filter + skipPid)
10
+ * - Diagnose composes all 4 + recommendation text
11
+ * - Heal composes diagnose + reap + reprobe
12
+ * - Cross-platform: explicitly verifies on win32/darwin/linux paths
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=install_organ.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install_organ.test.d.ts","sourceRoot":"","sources":["../../src/install_organ/install_organ.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}