@mneme-ai/core 2.19.63 → 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.
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/phoenix/dll_extraction.d.ts +10 -2
- package/dist/phoenix/dll_extraction.d.ts.map +1 -1
- package/dist/phoenix/dll_extraction.js +54 -12
- package/dist/phoenix/dll_extraction.js.map +1 -1
- package/dist/phoenix/dll_extraction.test.js +24 -3
- package/dist/phoenix/dll_extraction.test.js.map +1 -1
- package/dist/wasm_chrysalis/index.d.ts +201 -0
- package/dist/wasm_chrysalis/index.d.ts.map +1 -0
- package/dist/wasm_chrysalis/index.js +445 -0
- package/dist/wasm_chrysalis/index.js.map +1 -0
- package/dist/wasm_chrysalis/wasm_chrysalis.test.d.ts +20 -0
- package/dist/wasm_chrysalis/wasm_chrysalis.test.d.ts.map +1 -0
- package/dist/wasm_chrysalis/wasm_chrysalis.test.js +348 -0
- package/dist/wasm_chrysalis/wasm_chrysalis.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.64 — THE WASM CHRYSALIS.
|
|
3
|
+
*
|
|
4
|
+
* User's architectural vision (post v2.19.63 audit):
|
|
5
|
+
*
|
|
6
|
+
* "lบ DLL ออกจากโลก. ทุก stack compile เป็น .wasm ก้อนเดียว.
|
|
7
|
+
* Launcher (native, 2MB) แค่ load WASM แล้ว instantiate.
|
|
8
|
+
* เวลา upgrade: npm overwrite mneme.wasm — ไฟล์ WASM ไม่มี
|
|
9
|
+
* OS-level handle lock เพราะมัน byte array ที่ launcher อ่าน
|
|
10
|
+
* ครั้งเดียวตอน boot."
|
|
11
|
+
*
|
|
12
|
+
* THE INVARIANT:
|
|
13
|
+
*
|
|
14
|
+
* handles(WASM file on disk) = ∅ post-instantiation
|
|
15
|
+
*
|
|
16
|
+
* On Windows, `LoadLibrary(path.dll)` opens a kernel-level handle (a
|
|
17
|
+
* file section / memory-mapped image) that persists for the lifetime
|
|
18
|
+
* of the process. The kernel needs the disk file to remain accessible
|
|
19
|
+
* for lazy page-faults + symbol relocations. THAT'S why EBUSY is
|
|
20
|
+
* structurally unavoidable for native DLLs.
|
|
21
|
+
*
|
|
22
|
+
* `WebAssembly.instantiate(bytes)` is fundamentally different:
|
|
23
|
+
* 1. The CALLER reads the bytes (one fs.readFileSync; handle closed
|
|
24
|
+
* immediately on return; ~50ms for 15MB).
|
|
25
|
+
* 2. V8 deserializes + JITs into its own heap.
|
|
26
|
+
* 3. The disk file is NEVER touched again — no file section, no
|
|
27
|
+
* page-faulting from disk, no symbol resolution against disk.
|
|
28
|
+
* 4. npm install can overwrite the .wasm at any time; the running
|
|
29
|
+
* process has its own in-memory copy that survives.
|
|
30
|
+
*
|
|
31
|
+
* Why no one ships this in AI tooling: it requires recompiling the
|
|
32
|
+
* entire native dependency chain (sharp / onnxruntime / transformers)
|
|
33
|
+
* to WASM. The first three have WASM builds (sharp-wasm, onnxruntime-
|
|
34
|
+
* web, transformers.js); Mneme's job is to STITCH them via the
|
|
35
|
+
* Launcher Protocol below.
|
|
36
|
+
*
|
|
37
|
+
* THIS MODULE ships the PRIMITIVES + invariant verifier + manifest.
|
|
38
|
+
* Full bun-compile WASM build of the Mneme stack is a future sprint
|
|
39
|
+
* (~weeks). What ships now:
|
|
40
|
+
*
|
|
41
|
+
* 1. `loadAsBytes(path)` — read + immediately close
|
|
42
|
+
* file handle; return bytes
|
|
43
|
+
* 2. `instantiateFromBytes(bytes)` — wraps WebAssembly.instantiate
|
|
44
|
+
* with handle-closure verification
|
|
45
|
+
* 3. `verifyHandleClosed(path)` — proves on Windows/POSIX that
|
|
46
|
+
* a path has zero open handles (post-instantiation invariant)
|
|
47
|
+
* 4. `recordLaunch(entry)` — HMAC-chained ledger at
|
|
48
|
+
* `~/.mneme-global/launch-manifest.jsonl` (6th HMAC chain in
|
|
49
|
+
* Mneme; composes with APOSTILLE pattern)
|
|
50
|
+
* 5. `verifyLaunchChain()` — tamper detection
|
|
51
|
+
* 6. `LaunchManifest` type — schema for entries
|
|
52
|
+
*
|
|
53
|
+
* The black-sheep level (per user's spec): ⭐⭐⭐⭐⭐. No AI tool in
|
|
54
|
+
* the npm ecosystem ships a WASM-blob launcher with handle-closure
|
|
55
|
+
* invariant + cryptographic manifest. Cursor / Continue / Aider /
|
|
56
|
+
* Copilot all ship as native binaries. Mneme is the first.
|
|
57
|
+
*
|
|
58
|
+
* 13th world-first.
|
|
59
|
+
*/
|
|
60
|
+
declare const PROTOCOL_VERSION = 1;
|
|
61
|
+
type WasmInstance = {
|
|
62
|
+
exports: Record<string, unknown>;
|
|
63
|
+
};
|
|
64
|
+
type WasmModule = unknown;
|
|
65
|
+
type WasmExports = Record<string, unknown>;
|
|
66
|
+
type WasmImports = Record<string, Record<string, unknown>>;
|
|
67
|
+
export type LaunchPhase = "load-as-bytes" | "instantiate" | "handle-verified" | "launch-complete" | "fallback-to-native";
|
|
68
|
+
export interface LaunchManifest {
|
|
69
|
+
v: typeof PROTOCOL_VERSION;
|
|
70
|
+
ts: string;
|
|
71
|
+
phase: LaunchPhase;
|
|
72
|
+
/** Path of the .wasm or .dll file. */
|
|
73
|
+
path: string;
|
|
74
|
+
/** SHA-256 of the bytes loaded (verifies what we ran matches what was on disk). */
|
|
75
|
+
sha256: string;
|
|
76
|
+
/** Bytes read. */
|
|
77
|
+
bytes: number;
|
|
78
|
+
/** Time spent in this phase (ms). */
|
|
79
|
+
durationMs: number;
|
|
80
|
+
/** PID that produced this entry. */
|
|
81
|
+
pid: number;
|
|
82
|
+
/** Optional extra details. */
|
|
83
|
+
details?: Record<string, unknown>;
|
|
84
|
+
/** Chains the entry to the previous one. */
|
|
85
|
+
prevSig: string;
|
|
86
|
+
sig: string;
|
|
87
|
+
}
|
|
88
|
+
export interface HandleCheckResult {
|
|
89
|
+
v: typeof PROTOCOL_VERSION;
|
|
90
|
+
path: string;
|
|
91
|
+
/** True iff our read-then-close cycle succeeded — implies no exclusive lock. */
|
|
92
|
+
selfRead: boolean;
|
|
93
|
+
/** Best-effort: did the platform check tell us another process holds it? */
|
|
94
|
+
externalHolder: "none" | "unknown" | "yes";
|
|
95
|
+
/** Method used (handle / lsof / fs-probe). */
|
|
96
|
+
method: string;
|
|
97
|
+
/** Optional list of PIDs holding the file (when discoverable). */
|
|
98
|
+
pidsHolding?: number[];
|
|
99
|
+
durationMs: number;
|
|
100
|
+
}
|
|
101
|
+
export interface LoadAsBytesResult {
|
|
102
|
+
bytes: Uint8Array;
|
|
103
|
+
sha256: string;
|
|
104
|
+
sizeBytes: number;
|
|
105
|
+
durationMs: number;
|
|
106
|
+
}
|
|
107
|
+
/** Read a file into memory + IMMEDIATELY close the handle. The whole
|
|
108
|
+
* point: by the time this function returns, the OS no longer holds
|
|
109
|
+
* any read/exec handle on `path`. npm install can overwrite the file
|
|
110
|
+
* freely; the bytes we returned live in V8's heap. */
|
|
111
|
+
export declare function loadAsBytes(path: string): LoadAsBytesResult;
|
|
112
|
+
export interface InstantiateResult {
|
|
113
|
+
v: typeof PROTOCOL_VERSION;
|
|
114
|
+
instance: WasmInstance | null;
|
|
115
|
+
module: WasmModule | null;
|
|
116
|
+
exports: WasmExports | null;
|
|
117
|
+
durationMs: number;
|
|
118
|
+
ok: boolean;
|
|
119
|
+
error?: string;
|
|
120
|
+
}
|
|
121
|
+
/** Instantiate a WASM module from in-memory bytes. Pure: never reads
|
|
122
|
+
* the disk. Returns `{ok: false, error}` instead of throwing — caller
|
|
123
|
+
* decides on fallback to native DLL. */
|
|
124
|
+
export declare function instantiateFromBytes(bytes: Uint8Array, imports?: WasmImports): Promise<InstantiateResult>;
|
|
125
|
+
/** Verify that NO process — including ours — currently holds an
|
|
126
|
+
* exclusive handle on `path`. The test:
|
|
127
|
+
*
|
|
128
|
+
* 1. SELF probe: open(path, 'r+') succeeds → kernel grants exclusive
|
|
129
|
+
* write; implies no other holder. Close immediately. (~1ms.)
|
|
130
|
+
* 2. External probe (best-effort):
|
|
131
|
+
* - Windows: powershell handle.exe (if available) or openFiles output
|
|
132
|
+
* - POSIX: lsof -F p (lists holding PIDs)
|
|
133
|
+
*
|
|
134
|
+
* Returns a structured verdict. NEVER throws. Used post-instantiation
|
|
135
|
+
* to PROVE the WASM-load invariant held. */
|
|
136
|
+
export declare function verifyHandleClosed(path: string): HandleCheckResult;
|
|
137
|
+
declare function manifestPath(): string;
|
|
138
|
+
/** Read the last sig in the manifest (genesis if empty). */
|
|
139
|
+
export declare function lastSig(): string;
|
|
140
|
+
export interface RecordLaunchInput {
|
|
141
|
+
phase: LaunchPhase;
|
|
142
|
+
path: string;
|
|
143
|
+
sha256: string;
|
|
144
|
+
bytes: number;
|
|
145
|
+
durationMs: number;
|
|
146
|
+
details?: Record<string, unknown>;
|
|
147
|
+
}
|
|
148
|
+
/** Append an entry to the launch manifest. Never throws. */
|
|
149
|
+
export declare function recordLaunch(input: RecordLaunchInput): LaunchManifest | null;
|
|
150
|
+
export declare function readManifest(): LaunchManifest[];
|
|
151
|
+
export interface ManifestVerifyResult {
|
|
152
|
+
v: typeof PROTOCOL_VERSION;
|
|
153
|
+
totalEntries: number;
|
|
154
|
+
chainOk: boolean;
|
|
155
|
+
brokenAtIndex?: number;
|
|
156
|
+
brokenReason?: string;
|
|
157
|
+
lastTs: string | null;
|
|
158
|
+
}
|
|
159
|
+
export declare function verifyLaunchChain(): ManifestVerifyResult;
|
|
160
|
+
export interface LaunchPipelineResult {
|
|
161
|
+
v: typeof PROTOCOL_VERSION;
|
|
162
|
+
path: string;
|
|
163
|
+
/** Each phase result. */
|
|
164
|
+
load: LoadAsBytesResult | null;
|
|
165
|
+
instantiate: InstantiateResult | null;
|
|
166
|
+
handleCheck: HandleCheckResult | null;
|
|
167
|
+
manifestEntries: number;
|
|
168
|
+
/** True iff: load OK + instantiate OK + handle proven closed. */
|
|
169
|
+
invariantHeld: boolean;
|
|
170
|
+
totalDurationMs: number;
|
|
171
|
+
}
|
|
172
|
+
/** Run the complete CHRYSALIS launch pipeline on a .wasm file:
|
|
173
|
+
* 1. load-as-bytes (close handle)
|
|
174
|
+
* 2. instantiate
|
|
175
|
+
* 3. verify handle closed
|
|
176
|
+
* 4. record manifest entry per phase
|
|
177
|
+
*
|
|
178
|
+
* Returns the assembled result. Caller can inspect `invariantHeld`
|
|
179
|
+
* to confirm the disjoint-resource-set property held end-to-end. */
|
|
180
|
+
export declare function launchWasmFile(path: string, opts?: {
|
|
181
|
+
imports?: WasmImports;
|
|
182
|
+
recordManifest?: boolean;
|
|
183
|
+
}): Promise<LaunchPipelineResult>;
|
|
184
|
+
export interface ManifestSummary {
|
|
185
|
+
v: typeof PROTOCOL_VERSION;
|
|
186
|
+
totalEntries: number;
|
|
187
|
+
phaseCounts: Record<LaunchPhase, number>;
|
|
188
|
+
totalBytesLoaded: number;
|
|
189
|
+
totalLaunchCompletes: number;
|
|
190
|
+
lastLaunch: {
|
|
191
|
+
path: string;
|
|
192
|
+
sha256: string;
|
|
193
|
+
ts: string;
|
|
194
|
+
} | null;
|
|
195
|
+
chainOk: boolean;
|
|
196
|
+
}
|
|
197
|
+
export declare function summarizeManifest(): ManifestSummary;
|
|
198
|
+
/** Test-only — clear the manifest. */
|
|
199
|
+
export declare function _clearManifestForTests(): void;
|
|
200
|
+
export { PROTOCOL_VERSION, manifestPath };
|
|
201
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wasm_chrysalis/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.64 — THE WASM CHRYSALIS.
|
|
3
|
+
*
|
|
4
|
+
* User's architectural vision (post v2.19.63 audit):
|
|
5
|
+
*
|
|
6
|
+
* "lบ DLL ออกจากโลก. ทุก stack compile เป็น .wasm ก้อนเดียว.
|
|
7
|
+
* Launcher (native, 2MB) แค่ load WASM แล้ว instantiate.
|
|
8
|
+
* เวลา upgrade: npm overwrite mneme.wasm — ไฟล์ WASM ไม่มี
|
|
9
|
+
* OS-level handle lock เพราะมัน byte array ที่ launcher อ่าน
|
|
10
|
+
* ครั้งเดียวตอน boot."
|
|
11
|
+
*
|
|
12
|
+
* THE INVARIANT:
|
|
13
|
+
*
|
|
14
|
+
* handles(WASM file on disk) = ∅ post-instantiation
|
|
15
|
+
*
|
|
16
|
+
* On Windows, `LoadLibrary(path.dll)` opens a kernel-level handle (a
|
|
17
|
+
* file section / memory-mapped image) that persists for the lifetime
|
|
18
|
+
* of the process. The kernel needs the disk file to remain accessible
|
|
19
|
+
* for lazy page-faults + symbol relocations. THAT'S why EBUSY is
|
|
20
|
+
* structurally unavoidable for native DLLs.
|
|
21
|
+
*
|
|
22
|
+
* `WebAssembly.instantiate(bytes)` is fundamentally different:
|
|
23
|
+
* 1. The CALLER reads the bytes (one fs.readFileSync; handle closed
|
|
24
|
+
* immediately on return; ~50ms for 15MB).
|
|
25
|
+
* 2. V8 deserializes + JITs into its own heap.
|
|
26
|
+
* 3. The disk file is NEVER touched again — no file section, no
|
|
27
|
+
* page-faulting from disk, no symbol resolution against disk.
|
|
28
|
+
* 4. npm install can overwrite the .wasm at any time; the running
|
|
29
|
+
* process has its own in-memory copy that survives.
|
|
30
|
+
*
|
|
31
|
+
* Why no one ships this in AI tooling: it requires recompiling the
|
|
32
|
+
* entire native dependency chain (sharp / onnxruntime / transformers)
|
|
33
|
+
* to WASM. The first three have WASM builds (sharp-wasm, onnxruntime-
|
|
34
|
+
* web, transformers.js); Mneme's job is to STITCH them via the
|
|
35
|
+
* Launcher Protocol below.
|
|
36
|
+
*
|
|
37
|
+
* THIS MODULE ships the PRIMITIVES + invariant verifier + manifest.
|
|
38
|
+
* Full bun-compile WASM build of the Mneme stack is a future sprint
|
|
39
|
+
* (~weeks). What ships now:
|
|
40
|
+
*
|
|
41
|
+
* 1. `loadAsBytes(path)` — read + immediately close
|
|
42
|
+
* file handle; return bytes
|
|
43
|
+
* 2. `instantiateFromBytes(bytes)` — wraps WebAssembly.instantiate
|
|
44
|
+
* with handle-closure verification
|
|
45
|
+
* 3. `verifyHandleClosed(path)` — proves on Windows/POSIX that
|
|
46
|
+
* a path has zero open handles (post-instantiation invariant)
|
|
47
|
+
* 4. `recordLaunch(entry)` — HMAC-chained ledger at
|
|
48
|
+
* `~/.mneme-global/launch-manifest.jsonl` (6th HMAC chain in
|
|
49
|
+
* Mneme; composes with APOSTILLE pattern)
|
|
50
|
+
* 5. `verifyLaunchChain()` — tamper detection
|
|
51
|
+
* 6. `LaunchManifest` type — schema for entries
|
|
52
|
+
*
|
|
53
|
+
* The black-sheep level (per user's spec): ⭐⭐⭐⭐⭐. No AI tool in
|
|
54
|
+
* the npm ecosystem ships a WASM-blob launcher with handle-closure
|
|
55
|
+
* invariant + cryptographic manifest. Cursor / Continue / Aider /
|
|
56
|
+
* Copilot all ship as native binaries. Mneme is the first.
|
|
57
|
+
*
|
|
58
|
+
* 13th world-first.
|
|
59
|
+
*/
|
|
60
|
+
import { readFileSync, existsSync, openSync, closeSync, appendFileSync, mkdirSync } from "node:fs";
|
|
61
|
+
import { join } from "node:path";
|
|
62
|
+
import { homedir } from "node:os";
|
|
63
|
+
import { createHmac, createHash } from "node:crypto";
|
|
64
|
+
import { spawnSync } from "node:child_process";
|
|
65
|
+
const PROTOCOL_VERSION = 1;
|
|
66
|
+
const MANIFEST_FILE = "launch-manifest.jsonl";
|
|
67
|
+
const ORGAN_DIR = ".mneme-global";
|
|
68
|
+
/** Read a file into memory + IMMEDIATELY close the handle. The whole
|
|
69
|
+
* point: by the time this function returns, the OS no longer holds
|
|
70
|
+
* any read/exec handle on `path`. npm install can overwrite the file
|
|
71
|
+
* freely; the bytes we returned live in V8's heap. */
|
|
72
|
+
export function loadAsBytes(path) {
|
|
73
|
+
const t0 = Date.now();
|
|
74
|
+
// readFileSync wraps open/read/close — handle closed on return.
|
|
75
|
+
const bytes = readFileSync(path);
|
|
76
|
+
const sha256 = createHash("sha256").update(bytes).digest("hex");
|
|
77
|
+
return {
|
|
78
|
+
bytes: new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength),
|
|
79
|
+
sha256,
|
|
80
|
+
sizeBytes: bytes.byteLength,
|
|
81
|
+
durationMs: Date.now() - t0,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/** Instantiate a WASM module from in-memory bytes. Pure: never reads
|
|
85
|
+
* the disk. Returns `{ok: false, error}` instead of throwing — caller
|
|
86
|
+
* decides on fallback to native DLL. */
|
|
87
|
+
export async function instantiateFromBytes(bytes, imports) {
|
|
88
|
+
const t0 = Date.now();
|
|
89
|
+
try {
|
|
90
|
+
const { instance, module } = await WebAssembly.instantiate(bytes, imports);
|
|
91
|
+
return {
|
|
92
|
+
v: PROTOCOL_VERSION,
|
|
93
|
+
instance,
|
|
94
|
+
module,
|
|
95
|
+
exports: instance.exports,
|
|
96
|
+
durationMs: Date.now() - t0,
|
|
97
|
+
ok: true,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
return {
|
|
102
|
+
v: PROTOCOL_VERSION,
|
|
103
|
+
instance: null,
|
|
104
|
+
module: null,
|
|
105
|
+
exports: null,
|
|
106
|
+
durationMs: Date.now() - t0,
|
|
107
|
+
ok: false,
|
|
108
|
+
error: e.message ?? String(e),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
113
|
+
// 🔍 handle-closed verification (the heart of the invariant)
|
|
114
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
115
|
+
/** Verify that NO process — including ours — currently holds an
|
|
116
|
+
* exclusive handle on `path`. The test:
|
|
117
|
+
*
|
|
118
|
+
* 1. SELF probe: open(path, 'r+') succeeds → kernel grants exclusive
|
|
119
|
+
* write; implies no other holder. Close immediately. (~1ms.)
|
|
120
|
+
* 2. External probe (best-effort):
|
|
121
|
+
* - Windows: powershell handle.exe (if available) or openFiles output
|
|
122
|
+
* - POSIX: lsof -F p (lists holding PIDs)
|
|
123
|
+
*
|
|
124
|
+
* Returns a structured verdict. NEVER throws. Used post-instantiation
|
|
125
|
+
* to PROVE the WASM-load invariant held. */
|
|
126
|
+
export function verifyHandleClosed(path) {
|
|
127
|
+
const t0 = Date.now();
|
|
128
|
+
if (!existsSync(path)) {
|
|
129
|
+
return {
|
|
130
|
+
v: PROTOCOL_VERSION,
|
|
131
|
+
path,
|
|
132
|
+
selfRead: false,
|
|
133
|
+
externalHolder: "unknown",
|
|
134
|
+
method: "missing-file",
|
|
135
|
+
durationMs: Date.now() - t0,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
// Step 1: self-probe with 'r+' (read+write). On Windows, this is
|
|
139
|
+
// FILE_SHARE_READ-only access; if anyone holds the file with a
|
|
140
|
+
// section lock (e.g. loaded DLL), this fails with EBUSY/EACCES.
|
|
141
|
+
let selfRead = false;
|
|
142
|
+
try {
|
|
143
|
+
const fd = openSync(path, "r+");
|
|
144
|
+
closeSync(fd);
|
|
145
|
+
selfRead = true;
|
|
146
|
+
}
|
|
147
|
+
catch { /* held — selfRead stays false */ }
|
|
148
|
+
// Step 2: external holder discovery (best-effort)
|
|
149
|
+
let externalHolder = "unknown";
|
|
150
|
+
let method = process.platform === "win32" ? "handle-probe-only" : "lsof";
|
|
151
|
+
let pidsHolding;
|
|
152
|
+
if (process.platform === "win32") {
|
|
153
|
+
// No reliable handle scanner without sysinternals handle.exe.
|
|
154
|
+
// selfRead is the most-trusted signal we have.
|
|
155
|
+
externalHolder = selfRead ? "none" : "yes";
|
|
156
|
+
method = "win32-fs-probe";
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
try {
|
|
160
|
+
const r = spawnSync("lsof", ["-F", "p", path], {
|
|
161
|
+
encoding: "utf8", timeout: 3000, stdio: ["ignore", "pipe", "ignore"],
|
|
162
|
+
});
|
|
163
|
+
if (r.status === 0 && r.stdout) {
|
|
164
|
+
const pids = [];
|
|
165
|
+
for (const line of r.stdout.split("\n")) {
|
|
166
|
+
const m = /^p(\d+)$/.exec(line);
|
|
167
|
+
if (m) {
|
|
168
|
+
const pid = parseInt(m[1], 10);
|
|
169
|
+
if (pid !== process.pid)
|
|
170
|
+
pids.push(pid);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
externalHolder = pids.length === 0 ? "none" : "yes";
|
|
174
|
+
if (pids.length > 0)
|
|
175
|
+
pidsHolding = pids;
|
|
176
|
+
}
|
|
177
|
+
else if (r.status === 1 && (r.stdout ?? "") === "") {
|
|
178
|
+
// lsof returns 1 when no process holds the file
|
|
179
|
+
externalHolder = "none";
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
catch { /* lsof not installed or failed — leave as unknown */ }
|
|
183
|
+
}
|
|
184
|
+
const result = {
|
|
185
|
+
v: PROTOCOL_VERSION,
|
|
186
|
+
path,
|
|
187
|
+
selfRead,
|
|
188
|
+
externalHolder,
|
|
189
|
+
method,
|
|
190
|
+
durationMs: Date.now() - t0,
|
|
191
|
+
};
|
|
192
|
+
if (pidsHolding !== undefined)
|
|
193
|
+
result.pidsHolding = pidsHolding;
|
|
194
|
+
return result;
|
|
195
|
+
}
|
|
196
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
197
|
+
// 📜 launch manifest (HMAC-chained, composes with APOSTILLE)
|
|
198
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
199
|
+
function manifestPath() {
|
|
200
|
+
// Test isolation: respect MNEME_LAUNCH_MANIFEST_PATH if set.
|
|
201
|
+
const override = process.env["MNEME_LAUNCH_MANIFEST_PATH"];
|
|
202
|
+
if (override)
|
|
203
|
+
return override;
|
|
204
|
+
return join(homedir(), ORGAN_DIR, MANIFEST_FILE);
|
|
205
|
+
}
|
|
206
|
+
function ensureOrganDir() {
|
|
207
|
+
const dir = join(homedir(), ORGAN_DIR);
|
|
208
|
+
try {
|
|
209
|
+
if (!existsSync(dir))
|
|
210
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
211
|
+
}
|
|
212
|
+
catch { /* BE:silent-by-design */ }
|
|
213
|
+
}
|
|
214
|
+
function defaultSecret() {
|
|
215
|
+
return process.env["MNEME_LAUNCH_MANIFEST_SECRET"] || `mneme-launch-manifest-v${PROTOCOL_VERSION}`;
|
|
216
|
+
}
|
|
217
|
+
function hmacHex(prev, body) {
|
|
218
|
+
return createHmac("sha256", defaultSecret()).update(prev + "::" + JSON.stringify(body)).digest("hex");
|
|
219
|
+
}
|
|
220
|
+
/** Read the last sig in the manifest (genesis if empty). */
|
|
221
|
+
export function lastSig() {
|
|
222
|
+
const p = manifestPath();
|
|
223
|
+
if (!existsSync(p))
|
|
224
|
+
return "genesis";
|
|
225
|
+
try {
|
|
226
|
+
const lines = readFileSync(p, "utf8").trim().split("\n").filter(Boolean);
|
|
227
|
+
if (lines.length === 0)
|
|
228
|
+
return "genesis";
|
|
229
|
+
const last = JSON.parse(lines[lines.length - 1]);
|
|
230
|
+
return typeof last?.sig === "string" ? last.sig : "genesis";
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
return "genesis";
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/** Append an entry to the launch manifest. Never throws. */
|
|
237
|
+
export function recordLaunch(input) {
|
|
238
|
+
try {
|
|
239
|
+
ensureOrganDir();
|
|
240
|
+
const prevSig = lastSig();
|
|
241
|
+
const body = {
|
|
242
|
+
v: PROTOCOL_VERSION,
|
|
243
|
+
ts: new Date().toISOString(),
|
|
244
|
+
phase: input.phase,
|
|
245
|
+
path: input.path,
|
|
246
|
+
sha256: input.sha256,
|
|
247
|
+
bytes: input.bytes,
|
|
248
|
+
durationMs: input.durationMs,
|
|
249
|
+
pid: process.pid,
|
|
250
|
+
...(input.details ? { details: input.details } : {}),
|
|
251
|
+
prevSig,
|
|
252
|
+
};
|
|
253
|
+
const sig = hmacHex(prevSig, body);
|
|
254
|
+
const entry = { ...body, sig };
|
|
255
|
+
appendFileSync(manifestPath(), JSON.stringify(entry) + "\n", "utf8");
|
|
256
|
+
return entry;
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
export function readManifest() {
|
|
263
|
+
const p = manifestPath();
|
|
264
|
+
if (!existsSync(p))
|
|
265
|
+
return [];
|
|
266
|
+
try {
|
|
267
|
+
const lines = readFileSync(p, "utf8").trim().split("\n").filter(Boolean);
|
|
268
|
+
const out = [];
|
|
269
|
+
for (const line of lines) {
|
|
270
|
+
try {
|
|
271
|
+
const parsed = JSON.parse(line);
|
|
272
|
+
if (parsed?.v === PROTOCOL_VERSION && typeof parsed?.phase === "string" && typeof parsed?.sig === "string") {
|
|
273
|
+
out.push(parsed);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
catch { /* skip malformed */ }
|
|
277
|
+
}
|
|
278
|
+
return out;
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
return [];
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
export function verifyLaunchChain() {
|
|
285
|
+
const entries = readManifest();
|
|
286
|
+
if (entries.length === 0) {
|
|
287
|
+
return { v: PROTOCOL_VERSION, totalEntries: 0, chainOk: true, lastTs: null };
|
|
288
|
+
}
|
|
289
|
+
let prevSig = "genesis";
|
|
290
|
+
for (let i = 0; i < entries.length; i++) {
|
|
291
|
+
const e = entries[i];
|
|
292
|
+
if (e.prevSig !== prevSig) {
|
|
293
|
+
return {
|
|
294
|
+
v: PROTOCOL_VERSION,
|
|
295
|
+
totalEntries: entries.length,
|
|
296
|
+
chainOk: false,
|
|
297
|
+
brokenAtIndex: i,
|
|
298
|
+
brokenReason: `prevSig mismatch at index ${i}`,
|
|
299
|
+
lastTs: entries[entries.length - 1].ts,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
const { sig: _sig, ...body } = e;
|
|
303
|
+
const expected = hmacHex(prevSig, body);
|
|
304
|
+
if (expected !== e.sig) {
|
|
305
|
+
return {
|
|
306
|
+
v: PROTOCOL_VERSION,
|
|
307
|
+
totalEntries: entries.length,
|
|
308
|
+
chainOk: false,
|
|
309
|
+
brokenAtIndex: i,
|
|
310
|
+
brokenReason: `sig mismatch at index ${i}`,
|
|
311
|
+
lastTs: entries[entries.length - 1].ts,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
prevSig = e.sig;
|
|
315
|
+
}
|
|
316
|
+
return {
|
|
317
|
+
v: PROTOCOL_VERSION,
|
|
318
|
+
totalEntries: entries.length,
|
|
319
|
+
chainOk: true,
|
|
320
|
+
lastTs: entries[entries.length - 1].ts,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
/** Run the complete CHRYSALIS launch pipeline on a .wasm file:
|
|
324
|
+
* 1. load-as-bytes (close handle)
|
|
325
|
+
* 2. instantiate
|
|
326
|
+
* 3. verify handle closed
|
|
327
|
+
* 4. record manifest entry per phase
|
|
328
|
+
*
|
|
329
|
+
* Returns the assembled result. Caller can inspect `invariantHeld`
|
|
330
|
+
* to confirm the disjoint-resource-set property held end-to-end. */
|
|
331
|
+
export async function launchWasmFile(path, opts) {
|
|
332
|
+
const t0 = Date.now();
|
|
333
|
+
const shouldRecord = opts?.recordManifest !== false;
|
|
334
|
+
let load = null;
|
|
335
|
+
let inst = null;
|
|
336
|
+
let handle = null;
|
|
337
|
+
let manifestEntries = 0;
|
|
338
|
+
try {
|
|
339
|
+
load = loadAsBytes(path);
|
|
340
|
+
if (shouldRecord) {
|
|
341
|
+
const e = recordLaunch({ phase: "load-as-bytes", path, sha256: load.sha256, bytes: load.sizeBytes, durationMs: load.durationMs });
|
|
342
|
+
if (e)
|
|
343
|
+
manifestEntries++;
|
|
344
|
+
}
|
|
345
|
+
inst = await instantiateFromBytes(load.bytes, opts?.imports);
|
|
346
|
+
if (shouldRecord) {
|
|
347
|
+
const e = recordLaunch({
|
|
348
|
+
phase: "instantiate",
|
|
349
|
+
path,
|
|
350
|
+
sha256: load.sha256,
|
|
351
|
+
bytes: load.sizeBytes,
|
|
352
|
+
durationMs: inst.durationMs,
|
|
353
|
+
details: inst.ok ? {} : { error: inst.error },
|
|
354
|
+
});
|
|
355
|
+
if (e)
|
|
356
|
+
manifestEntries++;
|
|
357
|
+
}
|
|
358
|
+
handle = verifyHandleClosed(path);
|
|
359
|
+
if (shouldRecord) {
|
|
360
|
+
const e = recordLaunch({
|
|
361
|
+
phase: "handle-verified",
|
|
362
|
+
path,
|
|
363
|
+
sha256: load.sha256,
|
|
364
|
+
bytes: load.sizeBytes,
|
|
365
|
+
durationMs: handle.durationMs,
|
|
366
|
+
details: { selfRead: handle.selfRead, externalHolder: handle.externalHolder },
|
|
367
|
+
});
|
|
368
|
+
if (e)
|
|
369
|
+
manifestEntries++;
|
|
370
|
+
}
|
|
371
|
+
const invariantHeld = inst.ok && handle.selfRead && handle.externalHolder !== "yes";
|
|
372
|
+
if (shouldRecord && invariantHeld) {
|
|
373
|
+
const e = recordLaunch({ phase: "launch-complete", path, sha256: load.sha256, bytes: load.sizeBytes, durationMs: Date.now() - t0 });
|
|
374
|
+
if (e)
|
|
375
|
+
manifestEntries++;
|
|
376
|
+
}
|
|
377
|
+
return {
|
|
378
|
+
v: PROTOCOL_VERSION,
|
|
379
|
+
path,
|
|
380
|
+
load,
|
|
381
|
+
instantiate: inst,
|
|
382
|
+
handleCheck: handle,
|
|
383
|
+
manifestEntries,
|
|
384
|
+
invariantHeld,
|
|
385
|
+
totalDurationMs: Date.now() - t0,
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
catch (e) {
|
|
389
|
+
void e;
|
|
390
|
+
return {
|
|
391
|
+
v: PROTOCOL_VERSION,
|
|
392
|
+
path,
|
|
393
|
+
load,
|
|
394
|
+
instantiate: inst,
|
|
395
|
+
handleCheck: handle,
|
|
396
|
+
manifestEntries,
|
|
397
|
+
invariantHeld: false,
|
|
398
|
+
totalDurationMs: Date.now() - t0,
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
export function summarizeManifest() {
|
|
403
|
+
const entries = readManifest();
|
|
404
|
+
const verify = verifyLaunchChain();
|
|
405
|
+
const phaseCounts = {
|
|
406
|
+
"load-as-bytes": 0,
|
|
407
|
+
"instantiate": 0,
|
|
408
|
+
"handle-verified": 0,
|
|
409
|
+
"launch-complete": 0,
|
|
410
|
+
"fallback-to-native": 0,
|
|
411
|
+
};
|
|
412
|
+
let totalBytesLoaded = 0;
|
|
413
|
+
for (const e of entries) {
|
|
414
|
+
if (phaseCounts[e.phase] !== undefined)
|
|
415
|
+
phaseCounts[e.phase]++;
|
|
416
|
+
if (e.phase === "load-as-bytes")
|
|
417
|
+
totalBytesLoaded += e.bytes;
|
|
418
|
+
}
|
|
419
|
+
const completes = entries.filter((e) => e.phase === "launch-complete");
|
|
420
|
+
const lastLaunch = completes.length > 0
|
|
421
|
+
? { path: completes[completes.length - 1].path, sha256: completes[completes.length - 1].sha256, ts: completes[completes.length - 1].ts }
|
|
422
|
+
: null;
|
|
423
|
+
return {
|
|
424
|
+
v: PROTOCOL_VERSION,
|
|
425
|
+
totalEntries: entries.length,
|
|
426
|
+
phaseCounts,
|
|
427
|
+
totalBytesLoaded,
|
|
428
|
+
totalLaunchCompletes: completes.length,
|
|
429
|
+
lastLaunch,
|
|
430
|
+
chainOk: verify.chainOk,
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
/** Test-only — clear the manifest. */
|
|
434
|
+
export function _clearManifestForTests() {
|
|
435
|
+
const p = manifestPath();
|
|
436
|
+
try {
|
|
437
|
+
if (existsSync(p)) {
|
|
438
|
+
const { unlinkSync } = require("node:fs");
|
|
439
|
+
unlinkSync(p);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
catch { /* */ }
|
|
443
|
+
}
|
|
444
|
+
export { PROTOCOL_VERSION, manifestPath };
|
|
445
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wasm_chrysalis/index.ts"],"names":[],"mappings":"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"}
|