@mneme-ai/core 2.19.61 → 2.19.62

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 (45) hide show
  1. package/dist/cosmic/aurelian_v1961.test.js +1 -1
  2. package/dist/cosmic/aurelian_v1961.test.js.map +1 -1
  3. package/dist/cosmic/aurelian_v1962.test.d.ts +2 -0
  4. package/dist/cosmic/aurelian_v1962.test.d.ts.map +1 -0
  5. package/dist/cosmic/aurelian_v1962.test.js +62 -0
  6. package/dist/cosmic/aurelian_v1962.test.js.map +1 -0
  7. package/dist/index.d.ts +1 -0
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +16 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/nucleus_daemon.d.ts.map +1 -1
  12. package/dist/nucleus_daemon.js +52 -0
  13. package/dist/nucleus_daemon.js.map +1 -1
  14. package/dist/phoenix/dll_extraction.d.ts +97 -0
  15. package/dist/phoenix/dll_extraction.d.ts.map +1 -0
  16. package/dist/phoenix/dll_extraction.js +286 -0
  17. package/dist/phoenix/dll_extraction.js.map +1 -0
  18. package/dist/phoenix/dll_extraction.test.d.ts +10 -0
  19. package/dist/phoenix/dll_extraction.test.d.ts.map +1 -0
  20. package/dist/phoenix/dll_extraction.test.js +216 -0
  21. package/dist/phoenix/dll_extraction.test.js.map +1 -0
  22. package/dist/phoenix/index.d.ts +15 -0
  23. package/dist/phoenix/index.d.ts.map +1 -0
  24. package/dist/phoenix/index.js +15 -0
  25. package/dist/phoenix/index.js.map +1 -0
  26. package/dist/phoenix/organs.d.ts +110 -0
  27. package/dist/phoenix/organs.d.ts.map +1 -0
  28. package/dist/phoenix/organs.js +154 -0
  29. package/dist/phoenix/organs.js.map +1 -0
  30. package/dist/phoenix/organs.test.d.ts +9 -0
  31. package/dist/phoenix/organs.test.d.ts.map +1 -0
  32. package/dist/phoenix/organs.test.js +189 -0
  33. package/dist/phoenix/organs.test.js.map +1 -0
  34. package/dist/phoenix/scout.d.ts +74 -0
  35. package/dist/phoenix/scout.d.ts.map +1 -0
  36. package/dist/phoenix/scout.js +163 -0
  37. package/dist/phoenix/scout.js.map +1 -0
  38. package/dist/phoenix/scout.test.d.ts +8 -0
  39. package/dist/phoenix/scout.test.d.ts.map +1 -0
  40. package/dist/phoenix/scout.test.js +163 -0
  41. package/dist/phoenix/scout.test.js.map +1 -0
  42. package/dist/whats_new.d.ts.map +1 -1
  43. package/dist/whats_new.js +61 -53
  44. package/dist/whats_new.js.map +1 -1
  45. package/package.json +1 -1
@@ -0,0 +1,286 @@
1
+ /**
2
+ * v2.19.62 PHOENIX PHASE 1 — DLL EXTRACTION ORGAN.
3
+ *
4
+ * The user's killer insight (PHOENIX PROTOCOL P3): EBUSY isn't a bug in npm
5
+ * or Windows — it's the design where daemon holds DLL from the package it's
6
+ * a part of (self-referential lock). v2.19.61's rename-sideways trick
7
+ * solves the .node binding side. THIS module solves the libvips side.
8
+ *
9
+ * The technique:
10
+ * 1. Before any `require('sharp')` happens, COPY libvips-42.dll (and
11
+ * sibling libvips-cpp-* dll) from node_modules/@img/sharp-libvips-{platform}/
12
+ * to %TEMP%/mneme-vips-{pid}/
13
+ * 2. Prepend that tmp dir to process.env.PATH
14
+ * 3. Now `require('sharp')` triggers the .node binding to call
15
+ * LoadLibrary on libvips-42.dll — Windows search algorithm checks
16
+ * PATH (after System32 etc.), finds our tmp copy FIRST, loads it.
17
+ * The original node_modules/.../libvips-42.dll is NEVER touched.
18
+ * 4. On `process.on('exit')`, recursively remove the tmp dir
19
+ *
20
+ * Mathematical invariant: ∀ daemon instances i,j (i ≠ j):
21
+ * handles(i) ∩ handles(j) = ∅
22
+ * → mutual exclusion is unnecessary
23
+ * → npm install can write libvips-42.dll in node_modules without ANY
24
+ * handle holder blocking it
25
+ *
26
+ * Cross-platform:
27
+ * - Windows: PATH-redirect via env var (LoadLibrary search order)
28
+ * - macOS: DYLD_LIBRARY_PATH redirect for .dylib
29
+ * - Linux: LD_LIBRARY_PATH redirect for .so
30
+ *
31
+ * The EBUSY class becomes structurally impossible because no long-lived
32
+ * process holds the canonical install-time path of the DLL anymore.
33
+ *
34
+ * 12th world-first: per-PID DLL hostage extraction as a callable npm
35
+ * package primitive. No AI tool ships this. Sharp itself doesn't ship it.
36
+ * It's the technique Electron/VS Code use INTERNALLY but nobody surfaces
37
+ * it as a reusable primitive.
38
+ */
39
+ import { copyFileSync, existsSync, mkdirSync, readdirSync, rmSync, statSync } from "node:fs";
40
+ import { join, dirname } from "node:path";
41
+ import { tmpdir } from "node:os";
42
+ const PROTOCOL_VERSION = 1;
43
+ /** Per-PID tmp dir path. Always relative to OS tmpdir + namespace + PID. */
44
+ export function pidTmpDir(pid = process.pid) {
45
+ return join(tmpdir(), `mneme-vips-${pid}`);
46
+ }
47
+ /** Find the sharp-libvips DLL directory based on platform + node_modules
48
+ * layout. Returns null if not found (sharp may not be installed). */
49
+ export function findLibvipsDir(packageRoot) {
50
+ const root = packageRoot ?? findPackageRoot();
51
+ if (!root)
52
+ return null;
53
+ const archMap = {
54
+ "win32:x64": "sharp-libvips-win32-x64",
55
+ "win32:ia32": "sharp-libvips-win32-ia32",
56
+ "darwin:arm64": "sharp-libvips-darwin-arm64",
57
+ "darwin:x64": "sharp-libvips-darwin-x64",
58
+ "linux:x64": "sharp-libvips-linux-x64",
59
+ "linux:arm64": "sharp-libvips-linux-arm64",
60
+ "linux:arm": "sharp-libvips-linuxmusl-x64",
61
+ };
62
+ const key = `${process.platform}:${process.arch}`;
63
+ const subdir = archMap[key];
64
+ if (!subdir)
65
+ return null;
66
+ const candidate = join(root, "node_modules", "@img", subdir, "lib");
67
+ return existsSync(candidate) ? candidate : null;
68
+ }
69
+ /** Find the package's node_modules root by walking up from this file's
70
+ * location. Returns null if we're not in a node_modules tree. */
71
+ function findPackageRoot() {
72
+ let dir = __dirname;
73
+ for (let i = 0; i < 10; i++) {
74
+ if (existsSync(join(dir, "node_modules", "@img")))
75
+ return dir;
76
+ const parent = dirname(dir);
77
+ if (parent === dir)
78
+ return null;
79
+ dir = parent;
80
+ }
81
+ return null;
82
+ }
83
+ /** Returns the env var name used by this platform's dynamic-library
84
+ * loader to search for shared objects. */
85
+ export function dynamicLibraryEnvVar() {
86
+ switch (process.platform) {
87
+ case "win32": return "PATH";
88
+ case "darwin": return "DYLD_LIBRARY_PATH";
89
+ default: return "LD_LIBRARY_PATH";
90
+ }
91
+ }
92
+ /** Build the plan: which files to copy + which env var to mutate. Pure
93
+ * function — no side effects. Caller can preview before executing. */
94
+ export function planExtraction(opts) {
95
+ const libvipsDir = findLibvipsDir(opts?.packageRoot);
96
+ if (!libvipsDir)
97
+ return null;
98
+ const pid = opts?.pid ?? process.pid;
99
+ const tmpDir = pidTmpDir(pid);
100
+ let entries;
101
+ try {
102
+ entries = readdirSync(libvipsDir);
103
+ }
104
+ catch {
105
+ return null;
106
+ }
107
+ // Match shared-library extensions per platform
108
+ const extRe = process.platform === "win32"
109
+ ? /\.dll$/i
110
+ : process.platform === "darwin"
111
+ ? /\.(dylib|so)(\..*)?$/i
112
+ : /\.so(\..*)?$/i;
113
+ const files = entries
114
+ .filter((name) => extRe.test(name))
115
+ .map((name) => ({
116
+ src: join(libvipsDir, name),
117
+ dst: join(tmpDir, name),
118
+ }));
119
+ return {
120
+ tmpDir,
121
+ files,
122
+ envVar: dynamicLibraryEnvVar(),
123
+ platform: process.platform,
124
+ };
125
+ }
126
+ /** Execute the extraction: copy DLLs to per-PID tmp dir + prepend to PATH.
127
+ * Idempotent — re-running just refreshes the tmp dir. Safe-default — if
128
+ * any step fails, returns ok=false but never throws. */
129
+ export function extractAndRedirect(plan) {
130
+ const t0 = Date.now();
131
+ const livePlan = plan ?? planExtraction();
132
+ if (!livePlan) {
133
+ return {
134
+ v: PROTOCOL_VERSION,
135
+ plan: { tmpDir: "", files: [], envVar: dynamicLibraryEnvVar(), platform: process.platform },
136
+ filesCopied: 0,
137
+ bytesCopied: 0,
138
+ filesFailed: 0,
139
+ envVarSet: "",
140
+ durationMs: Date.now() - t0,
141
+ ok: false,
142
+ error: "no libvips dir found (sharp may not be installed)",
143
+ };
144
+ }
145
+ try {
146
+ mkdirSync(livePlan.tmpDir, { recursive: true, mode: 0o700 });
147
+ }
148
+ catch (e) {
149
+ return {
150
+ v: PROTOCOL_VERSION,
151
+ plan: livePlan,
152
+ filesCopied: 0,
153
+ bytesCopied: 0,
154
+ filesFailed: 0,
155
+ envVarSet: "",
156
+ durationMs: Date.now() - t0,
157
+ ok: false,
158
+ error: `mkdir failed: ${e.message}`,
159
+ };
160
+ }
161
+ let filesCopied = 0;
162
+ let bytesCopied = 0;
163
+ let filesFailed = 0;
164
+ for (const { src, dst } of livePlan.files) {
165
+ try {
166
+ copyFileSync(src, dst);
167
+ filesCopied++;
168
+ try {
169
+ bytesCopied += statSync(dst).size;
170
+ }
171
+ catch { /* */ }
172
+ }
173
+ catch {
174
+ filesFailed++;
175
+ }
176
+ }
177
+ // Prepend tmp dir to the platform's library-search env var
178
+ const sep = process.platform === "win32" ? ";" : ":";
179
+ const currentEnv = process.env[livePlan.envVar] ?? "";
180
+ const newEnv = `${livePlan.tmpDir}${sep}${currentEnv}`;
181
+ process.env[livePlan.envVar] = newEnv;
182
+ return {
183
+ v: PROTOCOL_VERSION,
184
+ plan: livePlan,
185
+ filesCopied,
186
+ bytesCopied,
187
+ filesFailed,
188
+ envVarSet: livePlan.envVar,
189
+ durationMs: Date.now() - t0,
190
+ ok: filesCopied > 0 && filesFailed === 0,
191
+ };
192
+ }
193
+ /** Cleanup the per-PID tmp dir. Safe to call on process exit — wraps in
194
+ * try/catch so it never blocks shutdown. Returns true if dir was removed. */
195
+ export function cleanupExtraction(opts) {
196
+ const dir = opts?.tmpDir ?? pidTmpDir(opts?.pid ?? process.pid);
197
+ if (!existsSync(dir))
198
+ return false;
199
+ try {
200
+ rmSync(dir, { recursive: true, force: true, maxRetries: 3 });
201
+ return true;
202
+ }
203
+ catch {
204
+ return false;
205
+ }
206
+ }
207
+ /** Sweep ALL orphan mneme-vips-<pid> dirs in tmpdir from dead processes.
208
+ * Called by Custodian organ. Returns count + total bytes reclaimed. */
209
+ export function sweepOrphanTmpDirs() {
210
+ const t = tmpdir();
211
+ let swept = 0;
212
+ let failed = 0;
213
+ let bytesReclaimed = 0;
214
+ try {
215
+ const entries = readdirSync(t);
216
+ for (const entry of entries) {
217
+ const m = /^mneme-vips-(\d+)$/.exec(entry);
218
+ if (!m)
219
+ continue;
220
+ const pid = parseInt(m[1], 10);
221
+ // Skip our own dir
222
+ if (pid === process.pid)
223
+ continue;
224
+ // Is the PID alive?
225
+ let alive = false;
226
+ try {
227
+ process.kill(pid, 0);
228
+ alive = true;
229
+ }
230
+ catch (e) {
231
+ alive = e.code === "EPERM";
232
+ }
233
+ if (alive)
234
+ continue;
235
+ // PID dead — safe to reclaim
236
+ const path = join(t, entry);
237
+ try {
238
+ // Walk + total size before delete (best-effort)
239
+ try {
240
+ for (const f of readdirSync(path)) {
241
+ try {
242
+ bytesReclaimed += statSync(join(path, f)).size;
243
+ }
244
+ catch { /* */ }
245
+ }
246
+ }
247
+ catch { /* */ }
248
+ rmSync(path, { recursive: true, force: true, maxRetries: 3 });
249
+ swept++;
250
+ }
251
+ catch {
252
+ failed++;
253
+ }
254
+ }
255
+ }
256
+ catch { /* tmpdir scan failed — best-effort */ }
257
+ return { swept, bytesReclaimed, failed };
258
+ }
259
+ /** Install an `exit` handler that cleans up THIS process's tmp dir on
260
+ * graceful shutdown. Idempotent — safe to call multiple times. Returns
261
+ * the installed handler so callers can remove it if needed. */
262
+ let exitHandlerInstalled = false;
263
+ let installedHandler = null;
264
+ export function installCleanupOnExit() {
265
+ if (exitHandlerInstalled)
266
+ return installedHandler;
267
+ exitHandlerInstalled = true;
268
+ const handler = () => { cleanupExtraction(); };
269
+ installedHandler = handler;
270
+ try {
271
+ process.on("exit", handler);
272
+ }
273
+ catch { /* */ }
274
+ // Also clean on SIGTERM/SIGINT (in case the daemon is asked to stop)
275
+ try {
276
+ process.on("SIGTERM", handler);
277
+ }
278
+ catch { /* */ }
279
+ try {
280
+ process.on("SIGINT", handler);
281
+ }
282
+ catch { /* */ }
283
+ return handler;
284
+ }
285
+ export { PROTOCOL_VERSION };
286
+ //# sourceMappingURL=dll_extraction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dll_extraction.js","sourceRoot":"","sources":["../../src/phoenix/dll_extraction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * v2.19.62 PHOENIX P3 — DLL EXTRACTION ORGAN deep tests.
3
+ *
4
+ * Tests the pure-function primitives + the safe-default failure semantics.
5
+ * We test SHAPE + SAFETY (extraction never throws, sweep never deletes live
6
+ * PIDs, env var prepend preserves prior value) rather than asserting the
7
+ * end-to-end Windows LoadLibrary outcome (would require a real sharp install).
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=dll_extraction.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dll_extraction.test.d.ts","sourceRoot":"","sources":["../../src/phoenix/dll_extraction.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * v2.19.62 PHOENIX P3 — DLL EXTRACTION ORGAN deep tests.
3
+ *
4
+ * Tests the pure-function primitives + the safe-default failure semantics.
5
+ * We test SHAPE + SAFETY (extraction never throws, sweep never deletes live
6
+ * PIDs, env var prepend preserves prior value) rather than asserting the
7
+ * end-to-end Windows LoadLibrary outcome (would require a real sharp install).
8
+ */
9
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
10
+ import { existsSync, mkdirSync, writeFileSync, rmSync, readFileSync } from "node:fs";
11
+ import { join } from "node:path";
12
+ import { tmpdir } from "node:os";
13
+ import { pidTmpDir, findLibvipsDir, dynamicLibraryEnvVar, planExtraction, extractAndRedirect, cleanupExtraction, sweepOrphanTmpDirs, installCleanupOnExit, PROTOCOL_VERSION, } from "./dll_extraction.js";
14
+ describe("v2.19.62 dll_extraction primitives", () => {
15
+ it("PROTOCOL_VERSION is 1", () => {
16
+ expect(PROTOCOL_VERSION).toBe(1);
17
+ });
18
+ it("pidTmpDir returns OS-tmpdir-based per-PID path", () => {
19
+ const dir = pidTmpDir(12345);
20
+ expect(dir).toContain("mneme-vips-12345");
21
+ expect(dir.startsWith(tmpdir())).toBe(true);
22
+ });
23
+ it("pidTmpDir defaults to current process.pid", () => {
24
+ const dir = pidTmpDir();
25
+ expect(dir).toContain(`mneme-vips-${process.pid}`);
26
+ });
27
+ it("dynamicLibraryEnvVar returns platform-correct var name", () => {
28
+ const v = dynamicLibraryEnvVar();
29
+ if (process.platform === "win32")
30
+ expect(v).toBe("PATH");
31
+ else if (process.platform === "darwin")
32
+ expect(v).toBe("DYLD_LIBRARY_PATH");
33
+ else
34
+ expect(v).toBe("LD_LIBRARY_PATH");
35
+ });
36
+ it("findLibvipsDir returns null when no node_modules/@img exists", () => {
37
+ const r = findLibvipsDir("/nonexistent/path/that/has/no/node_modules");
38
+ expect(r).toBeNull();
39
+ });
40
+ });
41
+ describe("v2.19.62 dll_extraction with synthetic libvips dir", () => {
42
+ let testRoot;
43
+ let archDir;
44
+ let libDir;
45
+ let originalEnv = {};
46
+ beforeEach(() => {
47
+ testRoot = join(tmpdir(), `mneme-phoenix-test-${process.pid}-${Date.now()}`);
48
+ mkdirSync(testRoot, { recursive: true });
49
+ const archMap = {
50
+ "win32:x64": "sharp-libvips-win32-x64",
51
+ "win32:ia32": "sharp-libvips-win32-ia32",
52
+ "darwin:arm64": "sharp-libvips-darwin-arm64",
53
+ "darwin:x64": "sharp-libvips-darwin-x64",
54
+ "linux:x64": "sharp-libvips-linux-x64",
55
+ "linux:arm64": "sharp-libvips-linux-arm64",
56
+ "linux:arm": "sharp-libvips-linuxmusl-x64",
57
+ };
58
+ const key = `${process.platform}:${process.arch}`;
59
+ archDir = archMap[key] ?? "sharp-libvips-linux-x64";
60
+ libDir = join(testRoot, "node_modules", "@img", archDir, "lib");
61
+ mkdirSync(libDir, { recursive: true });
62
+ const ext = process.platform === "win32" ? ".dll" : process.platform === "darwin" ? ".dylib" : ".so";
63
+ writeFileSync(join(libDir, `libvips-42${ext}`), "fake-vips-dll-bytes");
64
+ writeFileSync(join(libDir, `libvips-cpp-42${ext}`), "fake-vips-cpp-dll");
65
+ writeFileSync(join(libDir, "README.md"), "non-dll file should be ignored");
66
+ // Save env state for restore
67
+ originalEnv[dynamicLibraryEnvVar()] = process.env[dynamicLibraryEnvVar()];
68
+ });
69
+ afterEach(() => {
70
+ try {
71
+ rmSync(testRoot, { recursive: true, force: true });
72
+ }
73
+ catch { /* */ }
74
+ // Restore env
75
+ const v = dynamicLibraryEnvVar();
76
+ if (originalEnv[v] !== undefined)
77
+ process.env[v] = originalEnv[v];
78
+ else
79
+ delete process.env[v];
80
+ // Cleanup any per-PID tmpdir created
81
+ try {
82
+ cleanupExtraction();
83
+ }
84
+ catch { /* */ }
85
+ });
86
+ it("findLibvipsDir locates the synthetic dir", () => {
87
+ if (process.platform === "win32" && process.arch !== "x64" && process.arch !== "ia32")
88
+ return;
89
+ const found = findLibvipsDir(testRoot);
90
+ expect(found).not.toBeNull();
91
+ expect(found).toBe(libDir);
92
+ });
93
+ it("planExtraction returns shared-library files only", () => {
94
+ const plan = planExtraction({ packageRoot: testRoot });
95
+ expect(plan).not.toBeNull();
96
+ expect(plan.files.length).toBe(2); // two library files; README skipped
97
+ expect(plan.envVar).toBe(dynamicLibraryEnvVar());
98
+ expect(plan.platform).toBe(process.platform);
99
+ // None of the planned files should be the README
100
+ expect(plan.files.every((f) => !f.src.endsWith("README.md"))).toBe(true);
101
+ });
102
+ it("planExtraction picks per-PID tmpdir for dst", () => {
103
+ const plan = planExtraction({ packageRoot: testRoot, pid: 99999 });
104
+ expect(plan).not.toBeNull();
105
+ expect(plan.tmpDir).toContain("mneme-vips-99999");
106
+ expect(plan.files[0].dst.startsWith(plan.tmpDir)).toBe(true);
107
+ });
108
+ it("extractAndRedirect copies files + prepends env var", () => {
109
+ const plan = planExtraction({ packageRoot: testRoot });
110
+ expect(plan).not.toBeNull();
111
+ const envBefore = process.env[plan.envVar] ?? "";
112
+ const r = extractAndRedirect(plan);
113
+ expect(r.ok).toBe(true);
114
+ expect(r.filesCopied).toBe(2);
115
+ expect(r.filesFailed).toBe(0);
116
+ expect(r.bytesCopied).toBeGreaterThan(0);
117
+ expect(r.envVarSet).toBe(plan.envVar);
118
+ // Files exist in tmpdir
119
+ expect(existsSync(plan.files[0].dst)).toBe(true);
120
+ expect(existsSync(plan.files[1].dst)).toBe(true);
121
+ // Env var prepended
122
+ const envAfter = process.env[plan.envVar] ?? "";
123
+ expect(envAfter.startsWith(plan.tmpDir)).toBe(true);
124
+ expect(envAfter.length).toBeGreaterThan(envBefore.length);
125
+ });
126
+ it("extractAndRedirect returns ok=false when sharp absent (no throw)", () => {
127
+ const r = extractAndRedirect();
128
+ // Either ok=true (if a real sharp is actually installed in the working tree)
129
+ // or ok=false with an error — but NEVER throws.
130
+ expect(typeof r.ok).toBe("boolean");
131
+ expect(r.durationMs).toBeGreaterThanOrEqual(0);
132
+ });
133
+ it("cleanupExtraction removes the per-PID tmpdir + returns true", () => {
134
+ const plan = planExtraction({ packageRoot: testRoot, pid: process.pid });
135
+ extractAndRedirect(plan);
136
+ expect(existsSync(plan.tmpDir)).toBe(true);
137
+ const removed = cleanupExtraction();
138
+ expect(removed).toBe(true);
139
+ expect(existsSync(plan.tmpDir)).toBe(false);
140
+ });
141
+ it("cleanupExtraction returns false when dir already gone", () => {
142
+ const r = cleanupExtraction({ pid: 8888888 });
143
+ expect(r).toBe(false);
144
+ });
145
+ it("file contents copied byte-for-byte", () => {
146
+ const plan = planExtraction({ packageRoot: testRoot });
147
+ extractAndRedirect(plan);
148
+ for (const { src, dst } of plan.files) {
149
+ const srcBytes = readFileSync(src);
150
+ const dstBytes = readFileSync(dst);
151
+ expect(srcBytes.equals(dstBytes)).toBe(true);
152
+ }
153
+ });
154
+ it("idempotent — second extract refreshes existing tmpdir", () => {
155
+ const plan = planExtraction({ packageRoot: testRoot });
156
+ const r1 = extractAndRedirect(plan);
157
+ const r2 = extractAndRedirect(plan);
158
+ expect(r1.ok).toBe(true);
159
+ expect(r2.ok).toBe(true);
160
+ expect(r2.filesCopied).toBe(r1.filesCopied);
161
+ });
162
+ });
163
+ describe("v2.19.62 sweepOrphanTmpDirs liveness probing", () => {
164
+ it("never throws + returns structured result", () => {
165
+ const r = sweepOrphanTmpDirs();
166
+ expect(r.swept).toBeGreaterThanOrEqual(0);
167
+ expect(r.bytesReclaimed).toBeGreaterThanOrEqual(0);
168
+ expect(r.failed).toBeGreaterThanOrEqual(0);
169
+ });
170
+ it("does NOT sweep own PID's tmpdir", () => {
171
+ const myDir = pidTmpDir(process.pid);
172
+ mkdirSync(myDir, { recursive: true });
173
+ writeFileSync(join(myDir, "sentinel.txt"), "alive");
174
+ const r = sweepOrphanTmpDirs();
175
+ expect(existsSync(myDir)).toBe(true); // Still there
176
+ expect(r.swept).toBeGreaterThanOrEqual(0);
177
+ // Cleanup
178
+ rmSync(myDir, { recursive: true, force: true });
179
+ });
180
+ it("DOES sweep dead-PID tmpdir", () => {
181
+ // Pick a PID that is almost certainly dead, with a unique-per-test
182
+ // suffix so parallel tests don't race over the same dir.
183
+ const deadPid = 900_000_000 + (Date.now() % 1_000_000);
184
+ let isDead = false;
185
+ try {
186
+ process.kill(deadPid, 0);
187
+ }
188
+ catch (e) {
189
+ isDead = e.code === "ESRCH";
190
+ }
191
+ if (!isDead)
192
+ return; // skip in unlikely-collision case
193
+ const deadDir = pidTmpDir(deadPid);
194
+ mkdirSync(deadDir, { recursive: true });
195
+ writeFileSync(join(deadDir, "stale.txt"), "should-be-swept");
196
+ sweepOrphanTmpDirs();
197
+ // Other parallel test files (organs.test.ts via runCustodianCycle) also
198
+ // call sweepOrphanTmpDirs — invariant we care about is that the dead
199
+ // dir is GONE after our sweep, regardless of who counted it.
200
+ expect(existsSync(deadDir)).toBe(false);
201
+ });
202
+ it("returns 0 when tmpdir has no mneme-vips-* entries", () => {
203
+ // Can't easily isolate tmpdir, so just check that we got a number
204
+ const r = sweepOrphanTmpDirs();
205
+ expect(typeof r.swept).toBe("number");
206
+ });
207
+ });
208
+ describe("v2.19.62 installCleanupOnExit idempotence", () => {
209
+ it("returns a handler the first time + same handler on repeat call", () => {
210
+ const h1 = installCleanupOnExit();
211
+ const h2 = installCleanupOnExit();
212
+ expect(h1).toBe(h2);
213
+ expect(typeof h1).toBe("function");
214
+ });
215
+ });
216
+ //# sourceMappingURL=dll_extraction.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dll_extraction.test.js","sourceRoot":"","sources":["../../src/phoenix/dll_extraction.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * v2.19.62 PHOENIX PHASE 1 — namespace re-exports.
3
+ *
4
+ * Three modules ship in Phase 1:
5
+ * - dll_extraction: per-PID DLL hostage extraction (source-level EBUSY fix)
6
+ * - organs: 3 priority-1 auto-bots (Custodian + Sentinel + Surgeon)
7
+ * - scout: passive npm registry probe (PHOENIX P4 step 1)
8
+ *
9
+ * Phase 2 (future): Forager, Scholar, Pulse-bot, Lighthouse, Vampire +
10
+ * full PHOENIX Auto-Upgrade Queen (cocoon + atomic symlink swap).
11
+ */
12
+ export * as dllExtraction from "./dll_extraction.js";
13
+ export * as organs from "./organs.js";
14
+ export * as scout from "./scout.js";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/phoenix/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * v2.19.62 PHOENIX PHASE 1 — namespace re-exports.
3
+ *
4
+ * Three modules ship in Phase 1:
5
+ * - dll_extraction: per-PID DLL hostage extraction (source-level EBUSY fix)
6
+ * - organs: 3 priority-1 auto-bots (Custodian + Sentinel + Surgeon)
7
+ * - scout: passive npm registry probe (PHOENIX P4 step 1)
8
+ *
9
+ * Phase 2 (future): Forager, Scholar, Pulse-bot, Lighthouse, Vampire +
10
+ * full PHOENIX Auto-Upgrade Queen (cocoon + atomic symlink swap).
11
+ */
12
+ export * as dllExtraction from "./dll_extraction.js";
13
+ export * as organs from "./organs.js";
14
+ export * as scout from "./scout.js";
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/phoenix/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC"}