@mneme-ai/core 2.19.60 → 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.d.ts +2 -0
- package/dist/cosmic/aurelian_v1961.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1961.test.js +62 -0
- package/dist/cosmic/aurelian_v1961.test.js.map +1 -0
- 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/dll_eviction/dll_eviction.test.d.ts +14 -0
- package/dist/dll_eviction/dll_eviction.test.d.ts.map +1 -0
- package/dist/dll_eviction/dll_eviction.test.js +181 -0
- package/dist/dll_eviction/dll_eviction.test.js.map +1 -0
- package/dist/dll_eviction/index.d.ts +147 -0
- package/dist/dll_eviction/index.d.ts.map +1 -0
- package/dist/dll_eviction/index.js +288 -0
- package/dist/dll_eviction/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -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 +67 -51
- package/dist/whats_new.js.map +1 -1
- package/package.json +1 -1
|
@@ -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":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACrF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EACL,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,cAAc,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,GAAG,oBAAoB,EAAE,CAAC;QACjC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACpD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;;YACvE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,GAAG,cAAc,CAAC,4CAA4C,CAAC,CAAC;QACvE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAClE,IAAI,QAAgB,CAAC;IACrB,IAAI,OAAe,CAAC;IACpB,IAAI,MAAc,CAAC;IACnB,IAAI,WAAW,GAAuC,EAAE,CAAC;IAEzD,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,sBAAsB,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC7E,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,OAAO,GAA2B;YACtC,WAAW,EAAE,yBAAyB;YACtC,YAAY,EAAE,0BAA0B;YACxC,cAAc,EAAE,4BAA4B;YAC5C,YAAY,EAAE,0BAA0B;YACxC,WAAW,EAAE,yBAAyB;YACtC,aAAa,EAAE,2BAA2B;YAC1C,WAAW,EAAE,6BAA6B;SAC3C,CAAC;QACF,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAClD,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,yBAAyB,CAAC;QACpD,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAChE,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;QACrG,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,EAAE,CAAC,EAAE,qBAAqB,CAAC,CAAC;QACvE,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,GAAG,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC;QACzE,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,gCAAgC,CAAC,CAAC;QAC3E,6BAA6B;QAC7B,WAAW,CAAC,oBAAoB,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC;YAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3E,cAAc;QACd,MAAM,CAAC,GAAG,oBAAoB,EAAE,CAAC;QACjC,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;;YAC7D,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3B,qCAAqC;QACrC,IAAI,CAAC;YAAC,iBAAiB,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO;QAC9F,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,oCAAoC;QACxE,MAAM,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,IAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9C,iDAAiD;QACjD,MAAM,CAAC,IAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACnD,MAAM,CAAC,IAAK,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,UAAU,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,IAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAClD,MAAM,CAAC,GAAG,kBAAkB,CAAC,IAAK,CAAC,CAAC;QACpC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC;QACvC,wBAAwB;QACxB,MAAM,CAAC,UAAU,CAAC,IAAK,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,CAAC,UAAU,CAAC,IAAK,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,oBAAoB;QACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjD,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,GAAG,kBAAkB,EAAE,CAAC;QAC/B,6EAA6E;QAC7E,gDAAgD;QAChD,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACzE,kBAAkB,CAAC,IAAK,CAAC,CAAC;QAC1B,MAAM,CAAC,UAAU,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,CAAC,UAAU,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,GAAG,iBAAiB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvD,kBAAkB,CAAC,IAAK,CAAC,CAAC;QAC1B,KAAK,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,IAAK,CAAC,KAAK,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvD,MAAM,EAAE,GAAG,kBAAkB,CAAC,IAAK,CAAC,CAAC;QACrC,MAAM,EAAE,GAAG,kBAAkB,CAAC,IAAK,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;IAC5D,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAG,kBAAkB,EAAE,CAAC;QAC/B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,kBAAkB,EAAE,CAAC;QAC/B,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc;QACpD,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC1C,UAAU;QACV,MAAM,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,mEAAmE;QACnE,yDAAyD;QACzD,MAAM,OAAO,GAAG,WAAW,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;QACvD,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAAC,CAAC;QACjC,OAAO,CAAC,EAAE,CAAC;YAAC,MAAM,GAAI,CAA2B,CAAC,IAAI,KAAK,OAAO,CAAC;QAAC,CAAC;QACrE,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,kCAAkC;QACvD,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QACnC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,iBAAiB,CAAC,CAAC;QAC7D,kBAAkB,EAAE,CAAC;QACrB,wEAAwE;QACxE,qEAAqE;QACrE,6DAA6D;QAC7D,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,kEAAkE;QAClE,MAAM,CAAC,GAAG,kBAAkB,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACzD,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;QAClC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,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.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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.62 PHOENIX PHASE 1 — 3 priority-1 organ bots.
|
|
3
|
+
*
|
|
4
|
+
* From the user's PHOENIX P5 spec — these are the first 3 bots, the
|
|
5
|
+
* minimum viable swarm. The remaining 5 (Forager, Scholar, Pulse-bot,
|
|
6
|
+
* Lighthouse, Vampire) ship in future sprints.
|
|
7
|
+
*
|
|
8
|
+
* The pattern: each organ is a PURE-FUNCTION step that:
|
|
9
|
+
* 1. Reads its inputs (HMAC ledger, OS handle table, latency metrics)
|
|
10
|
+
* 2. Computes a verdict (cleanup needed? integrity breached? restart?)
|
|
11
|
+
* 3. Returns structured result (no side effects unless explicitly committed)
|
|
12
|
+
* 4. Caller (daemon loop) decides whether to act on the verdict
|
|
13
|
+
*
|
|
14
|
+
* This separation means the organs are TESTABLE without spawning real
|
|
15
|
+
* processes + composable into custom schedulers.
|
|
16
|
+
*/
|
|
17
|
+
declare const PROTOCOL_VERSION = 1;
|
|
18
|
+
export interface CustodianReport {
|
|
19
|
+
v: typeof PROTOCOL_VERSION;
|
|
20
|
+
organ: "custodian";
|
|
21
|
+
ts: string;
|
|
22
|
+
tmpDirsSwept: number;
|
|
23
|
+
tmpBytesReclaimed: number;
|
|
24
|
+
globalOrphansSwept: number;
|
|
25
|
+
totalReclaimedBytes: number;
|
|
26
|
+
durationMs: number;
|
|
27
|
+
}
|
|
28
|
+
/** Custodian cycle — sweeps stale per-PID tmp dirs + orphan .locked-* +
|
|
29
|
+
* expired vaccines + fragmented logs. Safe to call from any interval.
|
|
30
|
+
* Idempotent + non-throwing.
|
|
31
|
+
*
|
|
32
|
+
* Default period 5min per spec; the daemon's tickAllOrgans loop drives
|
|
33
|
+
* the scheduling, this function just runs one cycle. */
|
|
34
|
+
export declare function runCustodianCycle(): CustodianReport;
|
|
35
|
+
export interface SentinelReport {
|
|
36
|
+
v: typeof PROTOCOL_VERSION;
|
|
37
|
+
organ: "sentinel";
|
|
38
|
+
ts: string;
|
|
39
|
+
hmacChainOk: boolean;
|
|
40
|
+
hmacChainBrokenAt?: number;
|
|
41
|
+
handleCount: number;
|
|
42
|
+
handleBaseline: number;
|
|
43
|
+
handleLeakDetected: boolean;
|
|
44
|
+
durationMs: number;
|
|
45
|
+
recommendation: "healthy" | "warn-handle-leak" | "critical-chain-broken";
|
|
46
|
+
}
|
|
47
|
+
export interface SentinelOptions {
|
|
48
|
+
/** Function that returns current open-handle count (process-specific).
|
|
49
|
+
* Caller injects this so the organ stays platform-agnostic. */
|
|
50
|
+
handleCounter?: () => number;
|
|
51
|
+
/** Baseline handle count to compare against. Default 50. */
|
|
52
|
+
handleBaseline?: number;
|
|
53
|
+
/** HMAC chain verifier — caller passes a function that checks their
|
|
54
|
+
* existing chain (lineage / shepherd state / etc). Returns the chain
|
|
55
|
+
* result so Sentinel can include it in the report. */
|
|
56
|
+
verifyHmacChain?: () => {
|
|
57
|
+
ok: boolean;
|
|
58
|
+
brokenAt?: number;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/** Sentinel cycle — verifies HMAC chain integrity + checks for handle
|
|
62
|
+
* leaks. Pure function; no side effects. Caller decides escalation
|
|
63
|
+
* (enter quarantine, alert, etc) based on verdict. */
|
|
64
|
+
export declare function runSentinelCycle(opts?: SentinelOptions): SentinelReport;
|
|
65
|
+
export interface OrganLatencyStats {
|
|
66
|
+
/** Organ name (e.g. "indexer", "embedder", "scan"). */
|
|
67
|
+
name: string;
|
|
68
|
+
/** Recent p99 latency in ms. */
|
|
69
|
+
p99Ms: number;
|
|
70
|
+
/** Historical baseline p99 in ms. */
|
|
71
|
+
baselineMs: number;
|
|
72
|
+
/** Optional: consecutive failure count. */
|
|
73
|
+
consecutiveFailures?: number;
|
|
74
|
+
}
|
|
75
|
+
export interface SurgeonReport {
|
|
76
|
+
v: typeof PROTOCOL_VERSION;
|
|
77
|
+
organ: "surgeon";
|
|
78
|
+
ts: string;
|
|
79
|
+
organsExamined: number;
|
|
80
|
+
organsToRestart: Array<{
|
|
81
|
+
name: string;
|
|
82
|
+
reason: string;
|
|
83
|
+
degradationFactor: number;
|
|
84
|
+
}>;
|
|
85
|
+
durationMs: number;
|
|
86
|
+
}
|
|
87
|
+
/** Surgeon cycle — examines per-organ latency stats + flags organs whose
|
|
88
|
+
* p99 exceeds 3× baseline OR have 3+ consecutive failures. Returns a
|
|
89
|
+
* list of organs caller should restart. Pure verdict; caller commits. */
|
|
90
|
+
export declare function runSurgeonCycle(stats: OrganLatencyStats[], opts?: {
|
|
91
|
+
degradationFactor?: number;
|
|
92
|
+
maxConsecutiveFailures?: number;
|
|
93
|
+
}): SurgeonReport;
|
|
94
|
+
export interface AllOrgansReport {
|
|
95
|
+
v: typeof PROTOCOL_VERSION;
|
|
96
|
+
ts: string;
|
|
97
|
+
custodian: CustodianReport;
|
|
98
|
+
sentinel: SentinelReport;
|
|
99
|
+
surgeon: SurgeonReport;
|
|
100
|
+
durationMs: number;
|
|
101
|
+
}
|
|
102
|
+
/** Run all 3 priority-1 organs in one cycle. Used by daemon's tickAllOrgans
|
|
103
|
+
* loop and the mneme.phoenix.organs_tick MCP tool. */
|
|
104
|
+
export declare function runAllOrgans(opts?: {
|
|
105
|
+
sentinel?: SentinelOptions;
|
|
106
|
+
surgeonStats?: OrganLatencyStats[];
|
|
107
|
+
surgeonOpts?: Parameters<typeof runSurgeonCycle>[1];
|
|
108
|
+
}): AllOrgansReport;
|
|
109
|
+
export { PROTOCOL_VERSION };
|
|
110
|
+
//# sourceMappingURL=organs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organs.d.ts","sourceRoot":"","sources":["../../src/phoenix/organs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,QAAA,MAAM,gBAAgB,IAAI,CAAC;AAM3B,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;yDAKyD;AACzD,wBAAgB,iBAAiB,IAAI,eAAe,CAuCnD;AAMD,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,KAAK,EAAE,UAAU,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,SAAS,GAAG,kBAAkB,GAAG,uBAAuB,CAAC;CAC1E;AAED,MAAM,WAAW,eAAe;IAC9B;oEACgE;IAChE,aAAa,CAAC,EAAE,MAAM,MAAM,CAAC;IAC7B,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;2DAEuD;IACvD,eAAe,CAAC,EAAE,MAAM;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D;AAED;;uDAEuD;AACvD,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,eAAe,GAAG,cAAc,CAqBvE;AAMD,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpF,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;0EAE0E;AAC1E,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,EAAE,EAAE,IAAI,CAAC,EAAE;IAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAAC,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CA+BjJ;AAMD,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,eAAe,CAAC;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;uDACuD;AACvD,wBAAgB,YAAY,CAAC,IAAI,CAAC,EAAE;IAClC,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACnC,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;CACrD,GAAG,eAAe,CAalB;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.62 PHOENIX PHASE 1 — 3 priority-1 organ bots.
|
|
3
|
+
*
|
|
4
|
+
* From the user's PHOENIX P5 spec — these are the first 3 bots, the
|
|
5
|
+
* minimum viable swarm. The remaining 5 (Forager, Scholar, Pulse-bot,
|
|
6
|
+
* Lighthouse, Vampire) ship in future sprints.
|
|
7
|
+
*
|
|
8
|
+
* The pattern: each organ is a PURE-FUNCTION step that:
|
|
9
|
+
* 1. Reads its inputs (HMAC ledger, OS handle table, latency metrics)
|
|
10
|
+
* 2. Computes a verdict (cleanup needed? integrity breached? restart?)
|
|
11
|
+
* 3. Returns structured result (no side effects unless explicitly committed)
|
|
12
|
+
* 4. Caller (daemon loop) decides whether to act on the verdict
|
|
13
|
+
*
|
|
14
|
+
* This separation means the organs are TESTABLE without spawning real
|
|
15
|
+
* processes + composable into custom schedulers.
|
|
16
|
+
*/
|
|
17
|
+
import { sweepOrphanTmpDirs } from "./dll_extraction.js";
|
|
18
|
+
import { readdirSync, statSync, existsSync, unlinkSync } from "node:fs";
|
|
19
|
+
import { join } from "node:path";
|
|
20
|
+
import { homedir } from "node:os";
|
|
21
|
+
const PROTOCOL_VERSION = 1;
|
|
22
|
+
/** Custodian cycle — sweeps stale per-PID tmp dirs + orphan .locked-* +
|
|
23
|
+
* expired vaccines + fragmented logs. Safe to call from any interval.
|
|
24
|
+
* Idempotent + non-throwing.
|
|
25
|
+
*
|
|
26
|
+
* Default period 5min per spec; the daemon's tickAllOrgans loop drives
|
|
27
|
+
* the scheduling, this function just runs one cycle. */
|
|
28
|
+
export function runCustodianCycle() {
|
|
29
|
+
const t0 = Date.now();
|
|
30
|
+
// Sweep our own tmp dirs that belong to dead PIDs
|
|
31
|
+
const sweep = sweepOrphanTmpDirs();
|
|
32
|
+
// Sweep stale .locked-* files in ~/.mneme-global/
|
|
33
|
+
let globalOrphansSwept = 0;
|
|
34
|
+
try {
|
|
35
|
+
const organDir = join(homedir(), ".mneme-global");
|
|
36
|
+
if (existsSync(organDir)) {
|
|
37
|
+
const sweepLocked = (dir) => {
|
|
38
|
+
try {
|
|
39
|
+
for (const entry of readdirSync(dir)) {
|
|
40
|
+
const path = join(dir, entry);
|
|
41
|
+
try {
|
|
42
|
+
const st = statSync(path);
|
|
43
|
+
if (st.isDirectory()) {
|
|
44
|
+
sweepLocked(path); // recurse one level
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (/\.locked-\d+-\d+$/.test(entry)) {
|
|
48
|
+
try {
|
|
49
|
+
unlinkSync(path);
|
|
50
|
+
globalOrphansSwept++;
|
|
51
|
+
}
|
|
52
|
+
catch { /* */ }
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch { /* */ }
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch { /* */ }
|
|
59
|
+
};
|
|
60
|
+
sweepLocked(organDir);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch { /* */ }
|
|
64
|
+
return {
|
|
65
|
+
v: PROTOCOL_VERSION,
|
|
66
|
+
organ: "custodian",
|
|
67
|
+
ts: new Date().toISOString(),
|
|
68
|
+
tmpDirsSwept: sweep.swept,
|
|
69
|
+
tmpBytesReclaimed: sweep.bytesReclaimed,
|
|
70
|
+
globalOrphansSwept,
|
|
71
|
+
totalReclaimedBytes: sweep.bytesReclaimed,
|
|
72
|
+
durationMs: Date.now() - t0,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** Sentinel cycle — verifies HMAC chain integrity + checks for handle
|
|
76
|
+
* leaks. Pure function; no side effects. Caller decides escalation
|
|
77
|
+
* (enter quarantine, alert, etc) based on verdict. */
|
|
78
|
+
export function runSentinelCycle(opts) {
|
|
79
|
+
const t0 = Date.now();
|
|
80
|
+
const baseline = opts?.handleBaseline ?? 50;
|
|
81
|
+
const handleCount = opts?.handleCounter ? opts.handleCounter() : -1;
|
|
82
|
+
const handleLeakDetected = handleCount > baseline * 2;
|
|
83
|
+
const chain = opts?.verifyHmacChain ? opts.verifyHmacChain() : { ok: true };
|
|
84
|
+
let recommendation = "healthy";
|
|
85
|
+
if (!chain.ok)
|
|
86
|
+
recommendation = "critical-chain-broken";
|
|
87
|
+
else if (handleLeakDetected)
|
|
88
|
+
recommendation = "warn-handle-leak";
|
|
89
|
+
return {
|
|
90
|
+
v: PROTOCOL_VERSION,
|
|
91
|
+
organ: "sentinel",
|
|
92
|
+
ts: new Date().toISOString(),
|
|
93
|
+
hmacChainOk: chain.ok,
|
|
94
|
+
...(chain.brokenAt !== undefined ? { hmacChainBrokenAt: chain.brokenAt } : {}),
|
|
95
|
+
handleCount,
|
|
96
|
+
handleBaseline: baseline,
|
|
97
|
+
handleLeakDetected,
|
|
98
|
+
durationMs: Date.now() - t0,
|
|
99
|
+
recommendation,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/** Surgeon cycle — examines per-organ latency stats + flags organs whose
|
|
103
|
+
* p99 exceeds 3× baseline OR have 3+ consecutive failures. Returns a
|
|
104
|
+
* list of organs caller should restart. Pure verdict; caller commits. */
|
|
105
|
+
export function runSurgeonCycle(stats, opts) {
|
|
106
|
+
const t0 = Date.now();
|
|
107
|
+
const degradationFactor = opts?.degradationFactor ?? 3;
|
|
108
|
+
const maxConsecutiveFailures = opts?.maxConsecutiveFailures ?? 3;
|
|
109
|
+
const organsToRestart = [];
|
|
110
|
+
for (const stat of stats) {
|
|
111
|
+
const factor = stat.baselineMs > 0 ? stat.p99Ms / stat.baselineMs : 0;
|
|
112
|
+
if (factor >= degradationFactor) {
|
|
113
|
+
organsToRestart.push({
|
|
114
|
+
name: stat.name,
|
|
115
|
+
reason: `p99 ${stat.p99Ms}ms is ${factor.toFixed(1)}x baseline ${stat.baselineMs}ms (threshold ${degradationFactor}x)`,
|
|
116
|
+
degradationFactor: factor,
|
|
117
|
+
});
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if ((stat.consecutiveFailures ?? 0) >= maxConsecutiveFailures) {
|
|
121
|
+
organsToRestart.push({
|
|
122
|
+
name: stat.name,
|
|
123
|
+
reason: `${stat.consecutiveFailures} consecutive failures (threshold ${maxConsecutiveFailures})`,
|
|
124
|
+
degradationFactor: 0,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
v: PROTOCOL_VERSION,
|
|
130
|
+
organ: "surgeon",
|
|
131
|
+
ts: new Date().toISOString(),
|
|
132
|
+
organsExamined: stats.length,
|
|
133
|
+
organsToRestart,
|
|
134
|
+
durationMs: Date.now() - t0,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/** Run all 3 priority-1 organs in one cycle. Used by daemon's tickAllOrgans
|
|
138
|
+
* loop and the mneme.phoenix.organs_tick MCP tool. */
|
|
139
|
+
export function runAllOrgans(opts) {
|
|
140
|
+
const t0 = Date.now();
|
|
141
|
+
const custodian = runCustodianCycle();
|
|
142
|
+
const sentinel = runSentinelCycle(opts?.sentinel);
|
|
143
|
+
const surgeon = runSurgeonCycle(opts?.surgeonStats ?? [], opts?.surgeonOpts);
|
|
144
|
+
return {
|
|
145
|
+
v: PROTOCOL_VERSION,
|
|
146
|
+
ts: new Date().toISOString(),
|
|
147
|
+
custodian,
|
|
148
|
+
sentinel,
|
|
149
|
+
surgeon,
|
|
150
|
+
durationMs: Date.now() - t0,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
export { PROTOCOL_VERSION };
|
|
154
|
+
//# sourceMappingURL=organs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organs.js","sourceRoot":"","sources":["../../src/phoenix/organs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.62 PHOENIX P5 — 3 priority-1 organs deep tests.
|
|
3
|
+
*
|
|
4
|
+
* Custodian / Sentinel / Surgeon — each is a pure function returning a
|
|
5
|
+
* verdict. Tests cover: shape of reports, threshold semantics, idempotence,
|
|
6
|
+
* composability via runAllOrgans.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=organs.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organs.test.d.ts","sourceRoot":"","sources":["../../src/phoenix/organs.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|