@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.
- package/dist/cosmic/aurelian_v1961.test.js +1 -1
- package/dist/cosmic/aurelian_v1961.test.js.map +1 -1
- package/dist/cosmic/aurelian_v1962.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1962.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1962.test.js +62 -0
- package/dist/cosmic/aurelian_v1962.test.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/nucleus_daemon.d.ts.map +1 -1
- package/dist/nucleus_daemon.js +52 -0
- package/dist/nucleus_daemon.js.map +1 -1
- package/dist/phoenix/dll_extraction.d.ts +97 -0
- package/dist/phoenix/dll_extraction.d.ts.map +1 -0
- package/dist/phoenix/dll_extraction.js +286 -0
- package/dist/phoenix/dll_extraction.js.map +1 -0
- package/dist/phoenix/dll_extraction.test.d.ts +10 -0
- package/dist/phoenix/dll_extraction.test.d.ts.map +1 -0
- package/dist/phoenix/dll_extraction.test.js +216 -0
- package/dist/phoenix/dll_extraction.test.js.map +1 -0
- package/dist/phoenix/index.d.ts +15 -0
- package/dist/phoenix/index.d.ts.map +1 -0
- package/dist/phoenix/index.js +15 -0
- package/dist/phoenix/index.js.map +1 -0
- package/dist/phoenix/organs.d.ts +110 -0
- package/dist/phoenix/organs.d.ts.map +1 -0
- package/dist/phoenix/organs.js +154 -0
- package/dist/phoenix/organs.js.map +1 -0
- package/dist/phoenix/organs.test.d.ts +9 -0
- package/dist/phoenix/organs.test.d.ts.map +1 -0
- package/dist/phoenix/organs.test.js +189 -0
- package/dist/phoenix/organs.test.js.map +1 -0
- package/dist/phoenix/scout.d.ts +74 -0
- package/dist/phoenix/scout.d.ts.map +1 -0
- package/dist/phoenix/scout.js +163 -0
- package/dist/phoenix/scout.js.map +1 -0
- package/dist/phoenix/scout.test.d.ts +8 -0
- package/dist/phoenix/scout.test.d.ts.map +1 -0
- package/dist/phoenix/scout.test.js +163 -0
- package/dist/phoenix/scout.test.js.map +1 -0
- package/dist/whats_new.d.ts.map +1 -1
- package/dist/whats_new.js +61 -53
- package/dist/whats_new.js.map +1 -1
- 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"}
|