@mneme-ai/core 2.19.61 → 2.19.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/cosmic/aurelian_v1961.test.js +1 -1
  2. package/dist/cosmic/aurelian_v1961.test.js.map +1 -1
  3. package/dist/cosmic/aurelian_v1962.test.d.ts +2 -0
  4. package/dist/cosmic/aurelian_v1962.test.d.ts.map +1 -0
  5. package/dist/cosmic/aurelian_v1962.test.js +62 -0
  6. package/dist/cosmic/aurelian_v1962.test.js.map +1 -0
  7. package/dist/index.d.ts +1 -0
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +16 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/nucleus_daemon.d.ts.map +1 -1
  12. package/dist/nucleus_daemon.js +52 -0
  13. package/dist/nucleus_daemon.js.map +1 -1
  14. package/dist/phoenix/dll_extraction.d.ts +97 -0
  15. package/dist/phoenix/dll_extraction.d.ts.map +1 -0
  16. package/dist/phoenix/dll_extraction.js +286 -0
  17. package/dist/phoenix/dll_extraction.js.map +1 -0
  18. package/dist/phoenix/dll_extraction.test.d.ts +10 -0
  19. package/dist/phoenix/dll_extraction.test.d.ts.map +1 -0
  20. package/dist/phoenix/dll_extraction.test.js +216 -0
  21. package/dist/phoenix/dll_extraction.test.js.map +1 -0
  22. package/dist/phoenix/index.d.ts +15 -0
  23. package/dist/phoenix/index.d.ts.map +1 -0
  24. package/dist/phoenix/index.js +15 -0
  25. package/dist/phoenix/index.js.map +1 -0
  26. package/dist/phoenix/organs.d.ts +110 -0
  27. package/dist/phoenix/organs.d.ts.map +1 -0
  28. package/dist/phoenix/organs.js +154 -0
  29. package/dist/phoenix/organs.js.map +1 -0
  30. package/dist/phoenix/organs.test.d.ts +9 -0
  31. package/dist/phoenix/organs.test.d.ts.map +1 -0
  32. package/dist/phoenix/organs.test.js +189 -0
  33. package/dist/phoenix/organs.test.js.map +1 -0
  34. package/dist/phoenix/scout.d.ts +74 -0
  35. package/dist/phoenix/scout.d.ts.map +1 -0
  36. package/dist/phoenix/scout.js +163 -0
  37. package/dist/phoenix/scout.js.map +1 -0
  38. package/dist/phoenix/scout.test.d.ts +8 -0
  39. package/dist/phoenix/scout.test.d.ts.map +1 -0
  40. package/dist/phoenix/scout.test.js +163 -0
  41. package/dist/phoenix/scout.test.js.map +1 -0
  42. package/dist/whats_new.d.ts.map +1 -1
  43. package/dist/whats_new.js +61 -53
  44. package/dist/whats_new.js.map +1 -1
  45. package/package.json +1 -1
@@ -0,0 +1,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":"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"}
@@ -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"}
@@ -0,0 +1,189 @@
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
+ import { describe, it, expect } from "vitest";
9
+ import { runCustodianCycle, runSentinelCycle, runSurgeonCycle, runAllOrgans, PROTOCOL_VERSION, } from "./organs.js";
10
+ describe("v2.19.62 organs PROTOCOL_VERSION", () => {
11
+ it("is 1", () => {
12
+ expect(PROTOCOL_VERSION).toBe(1);
13
+ });
14
+ });
15
+ describe("v2.19.62 Custodian organ", () => {
16
+ it("returns structured CustodianReport", () => {
17
+ const r = runCustodianCycle();
18
+ expect(r.v).toBe(1);
19
+ expect(r.organ).toBe("custodian");
20
+ expect(typeof r.ts).toBe("string");
21
+ expect(r.tmpDirsSwept).toBeGreaterThanOrEqual(0);
22
+ expect(r.tmpBytesReclaimed).toBeGreaterThanOrEqual(0);
23
+ expect(r.globalOrphansSwept).toBeGreaterThanOrEqual(0);
24
+ expect(r.totalReclaimedBytes).toBeGreaterThanOrEqual(0);
25
+ expect(r.durationMs).toBeGreaterThanOrEqual(0);
26
+ });
27
+ it("never throws on missing ~/.mneme-global", () => {
28
+ expect(() => runCustodianCycle()).not.toThrow();
29
+ });
30
+ it("idempotent — second cycle finds nothing new", () => {
31
+ const r1 = runCustodianCycle();
32
+ const r2 = runCustodianCycle();
33
+ expect(r2.tmpDirsSwept).toBeLessThanOrEqual(r1.tmpDirsSwept + 5); // best-effort
34
+ });
35
+ });
36
+ describe("v2.19.62 Sentinel organ", () => {
37
+ it("returns healthy when no opts provided", () => {
38
+ const r = runSentinelCycle();
39
+ expect(r.organ).toBe("sentinel");
40
+ expect(r.hmacChainOk).toBe(true);
41
+ expect(r.handleCount).toBe(-1); // No counter injected
42
+ expect(r.handleBaseline).toBe(50);
43
+ expect(r.handleLeakDetected).toBe(false);
44
+ expect(r.recommendation).toBe("healthy");
45
+ });
46
+ it("detects handle leak when count > baseline×2", () => {
47
+ const r = runSentinelCycle({ handleCounter: () => 200, handleBaseline: 50 });
48
+ expect(r.handleCount).toBe(200);
49
+ expect(r.handleLeakDetected).toBe(true);
50
+ expect(r.recommendation).toBe("warn-handle-leak");
51
+ });
52
+ it("does NOT flag leak when count == baseline×2 (strict >)", () => {
53
+ const r = runSentinelCycle({ handleCounter: () => 100, handleBaseline: 50 });
54
+ expect(r.handleLeakDetected).toBe(false);
55
+ expect(r.recommendation).toBe("healthy");
56
+ });
57
+ it("escalates to critical when HMAC chain broken", () => {
58
+ const r = runSentinelCycle({
59
+ verifyHmacChain: () => ({ ok: false, brokenAt: 42 }),
60
+ });
61
+ expect(r.hmacChainOk).toBe(false);
62
+ expect(r.hmacChainBrokenAt).toBe(42);
63
+ expect(r.recommendation).toBe("critical-chain-broken");
64
+ });
65
+ it("critical chain-broken takes precedence over handle leak", () => {
66
+ const r = runSentinelCycle({
67
+ handleCounter: () => 500,
68
+ handleBaseline: 50,
69
+ verifyHmacChain: () => ({ ok: false }),
70
+ });
71
+ expect(r.recommendation).toBe("critical-chain-broken");
72
+ });
73
+ it("custom baseline respected", () => {
74
+ const r = runSentinelCycle({ handleCounter: () => 250, handleBaseline: 200 });
75
+ expect(r.handleBaseline).toBe(200);
76
+ // 250 not > 200×2=400, so no leak
77
+ expect(r.handleLeakDetected).toBe(false);
78
+ });
79
+ });
80
+ describe("v2.19.62 Surgeon organ", () => {
81
+ it("returns empty restart list when all healthy", () => {
82
+ const stats = [
83
+ { name: "indexer", p99Ms: 100, baselineMs: 90 },
84
+ { name: "embedder", p99Ms: 50, baselineMs: 40 },
85
+ ];
86
+ const r = runSurgeonCycle(stats);
87
+ expect(r.organsExamined).toBe(2);
88
+ expect(r.organsToRestart).toEqual([]);
89
+ });
90
+ it("flags organ with 3× p99 degradation", () => {
91
+ const stats = [
92
+ { name: "indexer", p99Ms: 3000, baselineMs: 1000 },
93
+ ];
94
+ const r = runSurgeonCycle(stats);
95
+ expect(r.organsToRestart.length).toBe(1);
96
+ expect(r.organsToRestart[0].name).toBe("indexer");
97
+ expect(r.organsToRestart[0].degradationFactor).toBeCloseTo(3, 1);
98
+ });
99
+ it("does NOT flag organ at 2.9× degradation (under threshold)", () => {
100
+ const stats = [
101
+ { name: "borderline", p99Ms: 2900, baselineMs: 1000 },
102
+ ];
103
+ const r = runSurgeonCycle(stats);
104
+ expect(r.organsToRestart.length).toBe(0);
105
+ });
106
+ it("custom degradationFactor respected", () => {
107
+ const stats = [
108
+ { name: "loose-threshold", p99Ms: 1500, baselineMs: 1000 },
109
+ ];
110
+ const r = runSurgeonCycle(stats, { degradationFactor: 1.4 });
111
+ expect(r.organsToRestart.length).toBe(1);
112
+ });
113
+ it("flags organ on consecutive failures even when latency healthy", () => {
114
+ const stats = [
115
+ { name: "flaky", p99Ms: 100, baselineMs: 90, consecutiveFailures: 5 },
116
+ ];
117
+ const r = runSurgeonCycle(stats);
118
+ expect(r.organsToRestart.length).toBe(1);
119
+ expect(r.organsToRestart[0].reason).toContain("consecutive failures");
120
+ });
121
+ it("custom maxConsecutiveFailures respected", () => {
122
+ const stats = [
123
+ { name: "borderline-flake", p99Ms: 100, baselineMs: 90, consecutiveFailures: 2 },
124
+ ];
125
+ const r1 = runSurgeonCycle(stats);
126
+ expect(r1.organsToRestart.length).toBe(0); // default 3
127
+ const r2 = runSurgeonCycle(stats, { maxConsecutiveFailures: 2 });
128
+ expect(r2.organsToRestart.length).toBe(1);
129
+ });
130
+ it("avoids divide-by-zero when baseline=0", () => {
131
+ const stats = [
132
+ { name: "no-baseline", p99Ms: 10000, baselineMs: 0 },
133
+ ];
134
+ expect(() => runSurgeonCycle(stats)).not.toThrow();
135
+ const r = runSurgeonCycle(stats);
136
+ // baseline=0 short-circuits the ratio check to 0, no restart unless failures hit
137
+ expect(r.organsToRestart.length).toBe(0);
138
+ });
139
+ it("handles empty stats array", () => {
140
+ const r = runSurgeonCycle([]);
141
+ expect(r.organsExamined).toBe(0);
142
+ expect(r.organsToRestart).toEqual([]);
143
+ });
144
+ it("reports include precise reason string", () => {
145
+ const stats = [
146
+ { name: "slow", p99Ms: 5000, baselineMs: 1000 },
147
+ ];
148
+ const r = runSurgeonCycle(stats);
149
+ expect(r.organsToRestart[0].reason).toContain("5000ms");
150
+ expect(r.organsToRestart[0].reason).toContain("1000ms");
151
+ expect(r.organsToRestart[0].reason).toContain("5.0x");
152
+ });
153
+ });
154
+ describe("v2.19.62 runAllOrgans composed cycle", () => {
155
+ it("returns all 3 reports in one call", () => {
156
+ const r = runAllOrgans();
157
+ expect(r.custodian.organ).toBe("custodian");
158
+ expect(r.sentinel.organ).toBe("sentinel");
159
+ expect(r.surgeon.organ).toBe("surgeon");
160
+ expect(r.durationMs).toBeGreaterThanOrEqual(0);
161
+ });
162
+ it("passes through Sentinel options", () => {
163
+ const r = runAllOrgans({
164
+ sentinel: { handleCounter: () => 999, handleBaseline: 10 },
165
+ });
166
+ expect(r.sentinel.handleCount).toBe(999);
167
+ expect(r.sentinel.handleLeakDetected).toBe(true);
168
+ });
169
+ it("passes through Surgeon stats", () => {
170
+ const r = runAllOrgans({
171
+ surgeonStats: [{ name: "x", p99Ms: 10000, baselineMs: 1000 }],
172
+ });
173
+ expect(r.surgeon.organsExamined).toBe(1);
174
+ expect(r.surgeon.organsToRestart.length).toBe(1);
175
+ });
176
+ it("composed duration is sum-or-less of individual organs", () => {
177
+ const r = runAllOrgans();
178
+ expect(r.durationMs).toBeGreaterThanOrEqual(0);
179
+ // Each sub-organ duration should be ≤ total
180
+ expect(r.custodian.durationMs).toBeLessThanOrEqual(r.durationMs + 10);
181
+ expect(r.sentinel.durationMs).toBeLessThanOrEqual(r.durationMs + 10);
182
+ expect(r.surgeon.durationMs).toBeLessThanOrEqual(r.durationMs + 10);
183
+ });
184
+ it("never throws on bad input", () => {
185
+ expect(() => runAllOrgans({ surgeonStats: [] })).not.toThrow();
186
+ expect(() => runAllOrgans({ sentinel: {} })).not.toThrow();
187
+ });
188
+ });
189
+ //# sourceMappingURL=organs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organs.test.js","sourceRoot":"","sources":["../../src/phoenix/organs.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * v2.19.62 PHOENIX PHASE 1 — SCOUT (P4 step 1: passive npm registry probe).
3
+ *
4
+ * The first step of the PHOENIX Auto-Upgrade Protocol. Scout's only job is
5
+ * to passively observe the npm registry — never to spawn npm install, never
6
+ * to mutate the filesystem, never to interrupt the daemon. Read-only by
7
+ * design so it can run on every daemon tick without amplifying load.
8
+ *
9
+ * Behavior:
10
+ * 1. Hit https://registry.npmjs.org/mneme-ai/latest (HTTP HEAD-or-GET)
11
+ * 2. Compare returned `version` to the running version (passed by caller)
12
+ * 3. Cache result for `cacheTtlMs` (default 5min) so repeated calls don't
13
+ * hammer the registry
14
+ * 4. Return verdict: up-to-date | upgrade-available | unreachable
15
+ *
16
+ * Pure observation. Caller (daemon or PHOENIX Queen in Phase 2) decides
17
+ * what to do with the verdict — start a cocoon, push an inbox alert, or
18
+ * sit on the data until conditions are right.
19
+ *
20
+ * Cache is in-memory only. Persistent state (last-checked timestamp,
21
+ * upgrade history) belongs in the daemon's heartbeat ledger, not here.
22
+ *
23
+ * Network-failure semantics: ALL failures return `unreachable` — never
24
+ * throw. The daemon must remain alive even when offline.
25
+ */
26
+ declare const PROTOCOL_VERSION = 1;
27
+ export type ScoutVerdict = "up-to-date" | "upgrade-available" | "unreachable";
28
+ export interface ScoutReport {
29
+ v: typeof PROTOCOL_VERSION;
30
+ organ: "scout";
31
+ ts: string;
32
+ verdict: ScoutVerdict;
33
+ packageName: string;
34
+ runningVersion: string;
35
+ latestVersion: string | null;
36
+ cacheHit: boolean;
37
+ cacheAgeMs: number;
38
+ durationMs: number;
39
+ reachability: {
40
+ registry: string;
41
+ httpStatus?: number;
42
+ error?: string;
43
+ };
44
+ }
45
+ export interface ScoutOptions {
46
+ packageName?: string;
47
+ registry?: string;
48
+ cacheTtlMs?: number;
49
+ timeoutMs?: number;
50
+ /** Inject a fetcher for tests. Should return the parsed registry response
51
+ * ({version: "x.y.z", ...}) or throw on failure. */
52
+ fetchLatest?: (registry: string, packageName: string, timeoutMs: number) => Promise<{
53
+ version: string;
54
+ httpStatus?: number;
55
+ }>;
56
+ /** Optional explicit clock for tests (ms since epoch). */
57
+ now?: () => number;
58
+ }
59
+ /** Compare two semver-ish strings. Returns positive when `a > b`, 0 when
60
+ * equal, negative when `a < b`. Strips leading "v" and any pre-release
61
+ * suffix after the first hyphen. Safe-default — non-numeric segments
62
+ * compared as 0. */
63
+ export declare function compareVersions(a: string, b: string): number;
64
+ /** Probe the npm registry for the latest version of a package. Returns a
65
+ * structured verdict. Never throws — failures become `unreachable` so the
66
+ * daemon loop is undisturbed. */
67
+ export declare function runScoutCycle(runningVersion: string, opts?: ScoutOptions): Promise<ScoutReport>;
68
+ /** Clear Scout's in-memory cache. Used by tests + after a successful
69
+ * upgrade so the next probe sees fresh state. */
70
+ export declare function clearScoutCache(): void;
71
+ /** Inspect current cache size (testing/debug). */
72
+ export declare function scoutCacheSize(): number;
73
+ export { PROTOCOL_VERSION };
74
+ //# sourceMappingURL=scout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scout.d.ts","sourceRoot":"","sources":["../../src/phoenix/scout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAKH,QAAA,MAAM,gBAAgB,IAAI,CAAC;AAM3B,MAAM,MAAM,YAAY,GACpB,YAAY,GACZ,mBAAmB,GACnB,aAAa,CAAC;AAElB,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;yDACqD;IACrD,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9H,0DAA0D;IAC1D,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAYD;;;qBAGqB;AACrB,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAW5D;AAuCD;;kCAEkC;AAClC,wBAAsB,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAwDrG;AAED;kDACkD;AAClD,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,kDAAkD;AAClD,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}