@mneme-ai/core 2.66.0 โ 2.67.0
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 +5 -0
- package/dist/index.js.map +1 -1
- package/dist/protoplasm/auto_wrap.d.ts +33 -0
- package/dist/protoplasm/auto_wrap.d.ts.map +1 -0
- package/dist/protoplasm/auto_wrap.js +72 -0
- package/dist/protoplasm/auto_wrap.js.map +1 -0
- package/dist/protoplasm/crawl_planner.d.ts +14 -0
- package/dist/protoplasm/crawl_planner.d.ts.map +1 -0
- package/dist/protoplasm/crawl_planner.js +50 -0
- package/dist/protoplasm/crawl_planner.js.map +1 -0
- package/dist/protoplasm/findings_ledger.d.ts +19 -0
- package/dist/protoplasm/findings_ledger.d.ts.map +1 -0
- package/dist/protoplasm/findings_ledger.js +81 -0
- package/dist/protoplasm/findings_ledger.js.map +1 -0
- package/dist/protoplasm/ghost_cell.d.ts +30 -0
- package/dist/protoplasm/ghost_cell.d.ts.map +1 -0
- package/dist/protoplasm/ghost_cell.js +95 -0
- package/dist/protoplasm/ghost_cell.js.map +1 -0
- package/dist/protoplasm/immortal.test.d.ts +12 -0
- package/dist/protoplasm/immortal.test.d.ts.map +1 -0
- package/dist/protoplasm/immortal.test.js +118 -0
- package/dist/protoplasm/immortal.test.js.map +1 -0
- package/dist/protoplasm/index.d.ts +42 -0
- package/dist/protoplasm/index.d.ts.map +1 -0
- package/dist/protoplasm/index.js +42 -0
- package/dist/protoplasm/index.js.map +1 -0
- package/dist/protoplasm/orchestrator.d.ts +29 -0
- package/dist/protoplasm/orchestrator.d.ts.map +1 -0
- package/dist/protoplasm/orchestrator.js +60 -0
- package/dist/protoplasm/orchestrator.js.map +1 -0
- package/dist/protoplasm/parasite.d.ts +42 -0
- package/dist/protoplasm/parasite.d.ts.map +1 -0
- package/dist/protoplasm/parasite.js +69 -0
- package/dist/protoplasm/parasite.js.map +1 -0
- package/dist/protoplasm/phoenix_hook.d.ts +49 -0
- package/dist/protoplasm/phoenix_hook.d.ts.map +1 -0
- package/dist/protoplasm/phoenix_hook.js +64 -0
- package/dist/protoplasm/phoenix_hook.js.map +1 -0
- package/dist/protoplasm/protoplasm.test.d.ts +13 -0
- package/dist/protoplasm/protoplasm.test.d.ts.map +1 -0
- package/dist/protoplasm/protoplasm.test.js +142 -0
- package/dist/protoplasm/protoplasm.test.js.map +1 -0
- package/dist/protoplasm/quantum_probe.d.ts +21 -0
- package/dist/protoplasm/quantum_probe.d.ts.map +1 -0
- package/dist/protoplasm/quantum_probe.js +118 -0
- package/dist/protoplasm/quantum_probe.js.map +1 -0
- package/dist/protoplasm/seamless_boot.d.ts +28 -0
- package/dist/protoplasm/seamless_boot.d.ts.map +1 -0
- package/dist/protoplasm/seamless_boot.js +106 -0
- package/dist/protoplasm/seamless_boot.js.map +1 -0
- package/dist/protoplasm/super_quan_probe.d.ts +24 -0
- package/dist/protoplasm/super_quan_probe.d.ts.map +1 -0
- package/dist/protoplasm/super_quan_probe.js +132 -0
- package/dist/protoplasm/super_quan_probe.js.map +1 -0
- package/dist/protoplasm/types.d.ts +84 -0
- package/dist/protoplasm/types.d.ts.map +1 -0
- package/dist/protoplasm/types.js +9 -0
- package/dist/protoplasm/types.js.map +1 -0
- package/dist/protoplasm/wal.d.ts +46 -0
- package/dist/protoplasm/wal.d.ts.map +1 -0
- package/dist/protoplasm/wal.js +145 -0
- package/dist/protoplasm/wal.js.map +1 -0
- package/dist/protoplasm/wisdom_space.d.ts +30 -0
- package/dist/protoplasm/wisdom_space.d.ts.map +1 -0
- package/dist/protoplasm/wisdom_space.js +77 -0
- package/dist/protoplasm/wisdom_space.js.map +1 -0
- package/dist/truth_gate/claims.d.ts.map +1 -1
- package/dist/truth_gate/claims.js +18 -0
- package/dist/truth_gate/claims.js.map +1 -1
- package/dist/truth_gate/probes.d.ts.map +1 -1
- package/dist/truth_gate/probes.js +42 -0
- package/dist/truth_gate/probes.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ๐ฅ PROTOPLASM โ PHOENIX HOOK
|
|
3
|
+
*
|
|
4
|
+
* Integration with Mneme's existing PHOENIX (v1.21+) resurrection cycle
|
|
5
|
+
* and SUPERNOVA (v1.30+) escalation.
|
|
6
|
+
*
|
|
7
|
+
* What Mneme already has:
|
|
8
|
+
* - PHOENIX: when daemon dies, can be respawned by OS service / cron
|
|
9
|
+
* - SUPERNOVA: factorial backoff supervised cycles for self-heal
|
|
10
|
+
* - heartbeats/ directory in ~/.mneme-global for per-PID heartbeats
|
|
11
|
+
*
|
|
12
|
+
* What PROTOPLASM adds via this hook:
|
|
13
|
+
* - Register PROTOPLASM as a "phoenix-revivable" subsystem
|
|
14
|
+
* - Heal queue (from ghost_cell) feeds SUPERNOVA escalation
|
|
15
|
+
* - PROTOPLASM heartbeat composes into nucleus daemon heartbeat
|
|
16
|
+
*
|
|
17
|
+
* On a fresh Mneme install where PHOENIX/SUPERNOVA may not be configured,
|
|
18
|
+
* we degrade to "advisory mode": write to heal_queue.jsonl, let any
|
|
19
|
+
* supervisor that exists pick it up.
|
|
20
|
+
*/
|
|
21
|
+
import { readFileSync, writeFileSync, existsSync, appendFileSync, mkdirSync } from "node:fs";
|
|
22
|
+
import { join } from "node:path";
|
|
23
|
+
/** Drain pending heal requests from ghost_cell โ SUPERNOVA escalation. */
|
|
24
|
+
export function drainHealQueue(ctx) {
|
|
25
|
+
const queuePath = join(ctx.ledgerDir, "heal_queue.jsonl");
|
|
26
|
+
if (!existsSync(queuePath))
|
|
27
|
+
return { drained: [], remaining: 0 };
|
|
28
|
+
const lines = readFileSync(queuePath, "utf8").trim().split("\n").filter(Boolean);
|
|
29
|
+
const drained = [];
|
|
30
|
+
for (const line of lines) {
|
|
31
|
+
try {
|
|
32
|
+
drained.push(JSON.parse(line));
|
|
33
|
+
}
|
|
34
|
+
catch { /* */ }
|
|
35
|
+
}
|
|
36
|
+
// Clear queue after drain
|
|
37
|
+
writeFileSync(queuePath, "");
|
|
38
|
+
return { drained, remaining: 0 };
|
|
39
|
+
}
|
|
40
|
+
/** Register PROTOPLASM as a phoenix-revivable subsystem. */
|
|
41
|
+
export function registerWithPhoenix(ctx, spec) {
|
|
42
|
+
const registryPath = join(ctx.daemonLedgerDir ?? ctx.ledgerDir, "phoenix-revivables.jsonl");
|
|
43
|
+
try {
|
|
44
|
+
mkdirSync(join(ctx.daemonLedgerDir ?? ctx.ledgerDir), { recursive: true });
|
|
45
|
+
appendFileSync(registryPath, JSON.stringify({
|
|
46
|
+
ts: new Date().toISOString(),
|
|
47
|
+
name: spec.name,
|
|
48
|
+
description: spec.description,
|
|
49
|
+
reviveCommand: spec.reviveCommand,
|
|
50
|
+
}) + "\n");
|
|
51
|
+
return { registered: true, path: registryPath };
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return { registered: false, path: registryPath };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** Default PROTOPLASM revivable spec. */
|
|
58
|
+
export const PROTOPLASM_REVIVABLE = {
|
|
59
|
+
name: "protoplasm",
|
|
60
|
+
description: "Live atom infrastructure โ per-function super_quan probes with HMAC-chained findings ledger",
|
|
61
|
+
livenessCheck: () => existsSync(".mneme/protoplasm/heartbeat.json"),
|
|
62
|
+
reviveCommand: "mneme protoplasm report",
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=phoenix_hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phoenix_hook.js","sourceRoot":"","sources":["../../src/protoplasm/phoenix_hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAqBjC,0EAA0E;AAC1E,MAAM,UAAU,cAAc,CAAC,GAAuB;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACjE,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjF,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3E,CAAC;IACD,0BAA0B;IAC1B,aAAa,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC7B,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;AACnC,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,mBAAmB,CAAC,GAAuB,EAAE,IAAmB;IAC9E,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC;IAC5F,IAAI,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC;YAC1C,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC,GAAG,IAAI,CAAC,CAAC;QACX,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IACnD,CAAC;AACH,CAAC;AAED,yCAAyC;AACzC,MAAM,CAAC,MAAM,oBAAoB,GAAkB;IACjD,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,6FAA6F;IAC1G,aAAa,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,kCAAkC,CAAC;IACnE,aAAa,EAAE,yBAAyB;CACzC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ๐ฆ PROTOPLASM โ vitest suite
|
|
3
|
+
*
|
|
4
|
+
* Pin the 6 invariants the live-atom infrastructure must guarantee:
|
|
5
|
+
* I1. Wrapped fn behavior is identical (sync + async, throw + return)
|
|
6
|
+
* I2. Probe runs every N calls; baseline rebuilt every 50
|
|
7
|
+
* I3. HMAC chain integrity holds (tamper one row โ verifyChain fails)
|
|
8
|
+
* I4. Diagnose surfaces cascade pattern when upstream broke first
|
|
9
|
+
* I5. Crawl plan only generated when โฅ10 healthy findings recent
|
|
10
|
+
* I6. Quantum signals respect bounds (entropy โฅ 0, stability โ [0,1])
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=protoplasm.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protoplasm.test.d.ts","sourceRoot":"","sources":["../../src/protoplasm/protoplasm.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ๐ฆ PROTOPLASM โ vitest suite
|
|
3
|
+
*
|
|
4
|
+
* Pin the 6 invariants the live-atom infrastructure must guarantee:
|
|
5
|
+
* I1. Wrapped fn behavior is identical (sync + async, throw + return)
|
|
6
|
+
* I2. Probe runs every N calls; baseline rebuilt every 50
|
|
7
|
+
* I3. HMAC chain integrity holds (tamper one row โ verifyChain fails)
|
|
8
|
+
* I4. Diagnose surfaces cascade pattern when upstream broke first
|
|
9
|
+
* I5. Crawl plan only generated when โฅ10 healthy findings recent
|
|
10
|
+
* I6. Quantum signals respect bounds (entropy โฅ 0, stability โ [0,1])
|
|
11
|
+
*/
|
|
12
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
13
|
+
import { mkdtempSync, rmSync, readFileSync, writeFileSync } from "node:fs";
|
|
14
|
+
import { tmpdir } from "node:os";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { withSuperQuanProbe, clearRegistry, snapshotRegistry, appendFinding, verifyChain, diagnose, planCrawl, buildBaseline, computeQuantumSignals, DEFAULT_PROTOPLASM_CONFIG, } from "./index.js";
|
|
17
|
+
let tmpDir;
|
|
18
|
+
let cfg;
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
tmpDir = mkdtempSync(join(tmpdir(), "protoplasm-test-"));
|
|
21
|
+
cfg = { ...DEFAULT_PROTOPLASM_CONFIG, ledgerDir: tmpDir, hmacKey: "test-secret-key", crawlOnHealthyEvery: 5 };
|
|
22
|
+
clearRegistry();
|
|
23
|
+
});
|
|
24
|
+
afterEach(() => { try {
|
|
25
|
+
rmSync(tmpDir, { recursive: true, force: true });
|
|
26
|
+
}
|
|
27
|
+
catch { /* */ } });
|
|
28
|
+
describe("I1 โ wrapped fn identical behavior", () => {
|
|
29
|
+
it("sync return: identical output", () => {
|
|
30
|
+
const inner = (a, b) => a + b;
|
|
31
|
+
const wrapped = withSuperQuanProbe("test.add", inner, cfg);
|
|
32
|
+
expect(wrapped(2, 3)).toBe(5);
|
|
33
|
+
expect(wrapped(10, 20)).toBe(30);
|
|
34
|
+
});
|
|
35
|
+
it("sync throw: same exception bubbles", () => {
|
|
36
|
+
const inner = () => { throw new TypeError("nope"); };
|
|
37
|
+
const wrapped = withSuperQuanProbe("test.thrower", inner, cfg);
|
|
38
|
+
expect(() => wrapped()).toThrow(TypeError);
|
|
39
|
+
});
|
|
40
|
+
it("async resolve + reject", async () => {
|
|
41
|
+
const ok = withSuperQuanProbe("test.ok", async (x) => x * 2, cfg);
|
|
42
|
+
const bad = withSuperQuanProbe("test.bad", async () => { throw new Error("async fail"); }, cfg);
|
|
43
|
+
expect(await ok(21)).toBe(42);
|
|
44
|
+
await expect(bad()).rejects.toThrow("async fail");
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe("I3 โ HMAC chain integrity", () => {
|
|
48
|
+
const sampleFinding = (fnId, outcome) => ({
|
|
49
|
+
fnId, at: new Date().toISOString(), outcome, zScores: { duration: 0.5 },
|
|
50
|
+
quantumSignals: { outputEntropy: 1, chaosDivergence: 1, neighborCorrelation: 0, collapseStability: 1 },
|
|
51
|
+
rootCauseHints: [], evidence: "test",
|
|
52
|
+
});
|
|
53
|
+
it("append 3 findings โ chain verifies", () => {
|
|
54
|
+
const ledger = join(tmpDir, "findings.jsonl");
|
|
55
|
+
appendFinding(ledger, sampleFinding("a", "healthy"), cfg.hmacKey);
|
|
56
|
+
appendFinding(ledger, sampleFinding("b", "healthy"), cfg.hmacKey);
|
|
57
|
+
appendFinding(ledger, sampleFinding("c", "broken"), cfg.hmacKey);
|
|
58
|
+
const v = verifyChain(ledger, cfg.hmacKey);
|
|
59
|
+
expect(v.ok).toBe(true);
|
|
60
|
+
expect(v.rows).toBe(3);
|
|
61
|
+
});
|
|
62
|
+
it("tamper one row โ verifyChain detects", () => {
|
|
63
|
+
const ledger = join(tmpDir, "findings.jsonl");
|
|
64
|
+
appendFinding(ledger, sampleFinding("a", "healthy"), cfg.hmacKey);
|
|
65
|
+
appendFinding(ledger, sampleFinding("b", "healthy"), cfg.hmacKey);
|
|
66
|
+
appendFinding(ledger, sampleFinding("c", "broken"), cfg.hmacKey);
|
|
67
|
+
// Tamper: change row 2's outcome
|
|
68
|
+
const lines = readFileSync(ledger, "utf8").trim().split("\n");
|
|
69
|
+
const row1 = JSON.parse(lines[1]);
|
|
70
|
+
row1.outcome = "broken";
|
|
71
|
+
lines[1] = JSON.stringify(row1);
|
|
72
|
+
writeFileSync(ledger, lines.join("\n") + "\n");
|
|
73
|
+
const v = verifyChain(ledger, cfg.hmacKey);
|
|
74
|
+
expect(v.ok).toBe(false);
|
|
75
|
+
expect(v.brokenAt).toBe(1);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe("I4 โ wisdom_space cascade detection", () => {
|
|
79
|
+
it("finds cascade when upstream broke earlier in window", () => {
|
|
80
|
+
const baseAt = Date.now();
|
|
81
|
+
const upstreamA = {
|
|
82
|
+
fnId: "fnA", at: new Date(baseAt - 30_000).toISOString(), outcome: "broken",
|
|
83
|
+
zScores: { duration: 4 }, quantumSignals: { outputEntropy: 0, chaosDivergence: 5, neighborCorrelation: 0, collapseStability: 0.3 },
|
|
84
|
+
rootCauseHints: [], evidence: "A broke first", hmac: "h1", prev: "h0",
|
|
85
|
+
};
|
|
86
|
+
const upstreamB = { ...upstreamA, fnId: "fnB", at: new Date(baseAt - 20_000).toISOString(), evidence: "B broke too", hmac: "h2", prev: "h1" };
|
|
87
|
+
const broken = { ...upstreamA, fnId: "fnDownstream", at: new Date(baseAt).toISOString(), evidence: "I broke too", hmac: "h3", prev: "h2" };
|
|
88
|
+
const result = diagnose({ brokenFinding: broken, recentLedger: [upstreamA, upstreamB, broken] });
|
|
89
|
+
expect(result.upstreamSuspects).toContain("fnA");
|
|
90
|
+
expect(result.upstreamSuspects).toContain("fnB");
|
|
91
|
+
expect(result.confidence).toBeGreaterThan(0.7);
|
|
92
|
+
expect(result.hypothesis).toMatch(/cascade/);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
describe("I5 โ crawl plan threshold", () => {
|
|
96
|
+
it("returns null when <10 healthy findings", () => {
|
|
97
|
+
const findings = Array.from({ length: 5 }, (_, i) => ({
|
|
98
|
+
fnId: "fnX", at: new Date().toISOString(), outcome: "healthy",
|
|
99
|
+
zScores: {}, quantumSignals: { outputEntropy: 1, chaosDivergence: 1, neighborCorrelation: 0, collapseStability: 1 },
|
|
100
|
+
rootCauseHints: [], evidence: "ok", hmac: `h${i}`, prev: i === 0 ? "0".repeat(16) : `h${i - 1}`,
|
|
101
|
+
}));
|
|
102
|
+
expect(planCrawl(findings)).toBeNull();
|
|
103
|
+
});
|
|
104
|
+
it("returns plan with topics when โฅ10 healthy", () => {
|
|
105
|
+
const findings = Array.from({ length: 12 }, (_, i) => ({
|
|
106
|
+
fnId: "packages.core.src.nemesis.classifier", at: new Date().toISOString(), outcome: "healthy",
|
|
107
|
+
zScores: {}, quantumSignals: { outputEntropy: 1, chaosDivergence: 1, neighborCorrelation: 0, collapseStability: 1 },
|
|
108
|
+
rootCauseHints: [], evidence: "ok", hmac: `h${i}`, prev: i === 0 ? "0".repeat(16) : `h${i - 1}`,
|
|
109
|
+
}));
|
|
110
|
+
const plan = planCrawl(findings);
|
|
111
|
+
expect(plan).not.toBeNull();
|
|
112
|
+
expect(plan.searchTopics.length).toBeGreaterThan(0);
|
|
113
|
+
expect(plan.searchTopics.some((t) => t.includes("agent fingerprinting"))).toBe(true);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe("I6 โ quantum signal bounds", () => {
|
|
117
|
+
it("entropy โฅ 0, stability โ [0,1]", () => {
|
|
118
|
+
const snapshots = Array.from({ length: 30 }, (_, i) => ({
|
|
119
|
+
fnId: "x", ts: new Date().toISOString(), durationMs: 10 + Math.random() * 5,
|
|
120
|
+
args: { count: 1, shape: "number" },
|
|
121
|
+
output: i % 7 === 0 ? { kind: "throw", errorClass: "Error" } : { kind: "ok", shape: "number" },
|
|
122
|
+
}));
|
|
123
|
+
const baseline = buildBaseline("x", snapshots.slice(0, 20));
|
|
124
|
+
const qs = computeQuantumSignals(snapshots.slice(-10), baseline, 0.2);
|
|
125
|
+
expect(qs.outputEntropy).toBeGreaterThanOrEqual(0);
|
|
126
|
+
expect(qs.collapseStability).toBeGreaterThanOrEqual(0);
|
|
127
|
+
expect(qs.collapseStability).toBeLessThanOrEqual(1);
|
|
128
|
+
expect(qs.neighborCorrelation).toBe(0.2);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
describe("I2 โ registry tracks samples", () => {
|
|
132
|
+
it("snapshot reflects buffer growth", () => {
|
|
133
|
+
const fn = withSuperQuanProbe("test.counter", (x) => x + 1, cfg);
|
|
134
|
+
for (let i = 0; i < 30; i++)
|
|
135
|
+
fn(i);
|
|
136
|
+
const snap = snapshotRegistry().find((s) => s.fnId === "test.counter");
|
|
137
|
+
expect(snap).toBeDefined();
|
|
138
|
+
expect(snap.samples).toBe(30);
|
|
139
|
+
expect(snap.recent.length).toBe(25);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
//# sourceMappingURL=protoplasm.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protoplasm.test.js","sourceRoot":"","sources":["../../src/protoplasm/protoplasm.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ๐ฆ PROTOPLASM โ quantum_probe
|
|
3
|
+
*
|
|
4
|
+
* Statistical + quantum-inspired probe over recorded InvocationSnapshots.
|
|
5
|
+
*
|
|
6
|
+
* The "quantum-inspired" part is analogical, not literal QM:
|
|
7
|
+
* - outputEntropy: Shannon entropy of output shapes โ high = decoherence
|
|
8
|
+
* - chaosDivergence: spread of output given structured input perturbation
|
|
9
|
+
* - collapseStability: proportion of calls that resolve cleanly (no throw)
|
|
10
|
+
* - neighborCorrelation: did this function break in same window as neighbors?
|
|
11
|
+
*
|
|
12
|
+
* Why quantum-inspired metaphor: standard means/stdev miss multi-modal
|
|
13
|
+
* behavior. A function returning {success, fallback, throw} states needs
|
|
14
|
+
* a distributional signal, not just a central tendency.
|
|
15
|
+
*/
|
|
16
|
+
import type { InvocationSnapshot, FunctionBaseline, QuantumSignals, SuperQuanFinding, ProtoplasmConfig, ProbeOutcome } from "./types.js";
|
|
17
|
+
export declare function buildBaseline(fnId: string, snapshots: InvocationSnapshot[]): FunctionBaseline;
|
|
18
|
+
export declare function computeQuantumSignals(recent: InvocationSnapshot[], baseline: FunctionBaseline, neighborBrokenRate: number): QuantumSignals;
|
|
19
|
+
export declare function gradeOutcome(zScores: Record<string, number>, quantum: QuantumSignals, cfg: ProtoplasmConfig): ProbeOutcome;
|
|
20
|
+
export declare function runQuantumProbe(fnId: string, recent: InvocationSnapshot[], baseline: FunctionBaseline, cfg: ProtoplasmConfig, neighborBrokenRate?: number): Omit<SuperQuanFinding, "hmac" | "prev">;
|
|
21
|
+
//# sourceMappingURL=quantum_probe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quantum_probe.d.ts","sourceRoot":"","sources":["../../src/protoplasm/quantum_probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACb,MAAM,YAAY,CAAC;AAwBpB,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,GAAG,gBAAgB,CAoB7F;AAOD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,GAAG,cAAc,CAqB1I;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,gBAAgB,GAAG,YAAY,CAQ1H;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,kBAAkB,EAAE,EAC5B,QAAQ,EAAE,gBAAgB,EAC1B,GAAG,EAAE,gBAAgB,EACrB,kBAAkB,SAAI,GACrB,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAAC,CAoBzC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ๐ฆ PROTOPLASM โ quantum_probe
|
|
3
|
+
*
|
|
4
|
+
* Statistical + quantum-inspired probe over recorded InvocationSnapshots.
|
|
5
|
+
*
|
|
6
|
+
* The "quantum-inspired" part is analogical, not literal QM:
|
|
7
|
+
* - outputEntropy: Shannon entropy of output shapes โ high = decoherence
|
|
8
|
+
* - chaosDivergence: spread of output given structured input perturbation
|
|
9
|
+
* - collapseStability: proportion of calls that resolve cleanly (no throw)
|
|
10
|
+
* - neighborCorrelation: did this function break in same window as neighbors?
|
|
11
|
+
*
|
|
12
|
+
* Why quantum-inspired metaphor: standard means/stdev miss multi-modal
|
|
13
|
+
* behavior. A function returning {success, fallback, throw} states needs
|
|
14
|
+
* a distributional signal, not just a central tendency.
|
|
15
|
+
*/
|
|
16
|
+
/** Shannon entropy over a histogram (normalized to 1). */
|
|
17
|
+
function shannonEntropy(counts) {
|
|
18
|
+
const total = [...counts.values()].reduce((a, b) => a + b, 0);
|
|
19
|
+
if (total === 0)
|
|
20
|
+
return 0;
|
|
21
|
+
let h = 0;
|
|
22
|
+
for (const c of counts.values()) {
|
|
23
|
+
if (c === 0)
|
|
24
|
+
continue;
|
|
25
|
+
const p = c / total;
|
|
26
|
+
h -= p * Math.log2(p);
|
|
27
|
+
}
|
|
28
|
+
return h;
|
|
29
|
+
}
|
|
30
|
+
function shapeHistogram(snapshots, key) {
|
|
31
|
+
const h = new Map();
|
|
32
|
+
for (const s of snapshots) {
|
|
33
|
+
const k = key === "argShape" ? s.args.shape : (s.output.shape ?? `throw:${s.output.errorClass}`);
|
|
34
|
+
h.set(k, (h.get(k) ?? 0) + 1);
|
|
35
|
+
}
|
|
36
|
+
return h;
|
|
37
|
+
}
|
|
38
|
+
export function buildBaseline(fnId, snapshots) {
|
|
39
|
+
if (snapshots.length === 0) {
|
|
40
|
+
return { fnId, samples: 0, durationMean: 0, durationStdev: 0, errorRate: 0, argShapeEntropy: 0, outputShapeEntropy: 0, lastUpdate: new Date().toISOString() };
|
|
41
|
+
}
|
|
42
|
+
const durations = snapshots.map((s) => s.durationMs);
|
|
43
|
+
const mean = durations.reduce((a, b) => a + b, 0) / durations.length;
|
|
44
|
+
const variance = durations.reduce((a, b) => a + (b - mean) ** 2, 0) / Math.max(1, durations.length - 1);
|
|
45
|
+
const errorRate = snapshots.filter((s) => s.output.kind === "throw").length / snapshots.length;
|
|
46
|
+
const argEntropy = shannonEntropy(shapeHistogram(snapshots, "argShape"));
|
|
47
|
+
const outEntropy = shannonEntropy(shapeHistogram(snapshots, "outputShape"));
|
|
48
|
+
return {
|
|
49
|
+
fnId,
|
|
50
|
+
samples: snapshots.length,
|
|
51
|
+
durationMean: mean,
|
|
52
|
+
durationStdev: Math.sqrt(variance),
|
|
53
|
+
errorRate,
|
|
54
|
+
argShapeEntropy: argEntropy,
|
|
55
|
+
outputShapeEntropy: outEntropy,
|
|
56
|
+
lastUpdate: new Date().toISOString(),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function zScore(value, mean, stdev) {
|
|
60
|
+
if (stdev < 1e-9)
|
|
61
|
+
return Math.abs(value - mean) < 1e-9 ? 0 : Number.POSITIVE_INFINITY;
|
|
62
|
+
return (value - mean) / stdev;
|
|
63
|
+
}
|
|
64
|
+
export function computeQuantumSignals(recent, baseline, neighborBrokenRate) {
|
|
65
|
+
const outputEntropy = shannonEntropy(shapeHistogram(recent, "outputShape"));
|
|
66
|
+
const throwCount = recent.filter((s) => s.output.kind === "throw").length;
|
|
67
|
+
const collapseStability = recent.length === 0 ? 1 : 1 - throwCount / recent.length;
|
|
68
|
+
// chaosDivergence: stdev of durations among non-throw calls / baseline.stdev
|
|
69
|
+
const okDurations = recent.filter((s) => s.output.kind === "ok").map((s) => s.durationMs);
|
|
70
|
+
let chaos = 0;
|
|
71
|
+
if (okDurations.length >= 2) {
|
|
72
|
+
const m = okDurations.reduce((a, b) => a + b, 0) / okDurations.length;
|
|
73
|
+
const v = okDurations.reduce((a, b) => a + (b - m) ** 2, 0) / (okDurations.length - 1);
|
|
74
|
+
const recentStdev = Math.sqrt(v);
|
|
75
|
+
chaos = baseline.durationStdev < 1e-9 ? recentStdev : recentStdev / baseline.durationStdev;
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
outputEntropy,
|
|
79
|
+
chaosDivergence: chaos,
|
|
80
|
+
neighborCorrelation: neighborBrokenRate,
|
|
81
|
+
collapseStability,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export function gradeOutcome(zScores, quantum, cfg) {
|
|
85
|
+
const maxZ = Math.max(...Object.values(zScores).map((z) => Math.abs(z)));
|
|
86
|
+
if (maxZ > cfg.zScoreBroken)
|
|
87
|
+
return "broken";
|
|
88
|
+
if (maxZ > cfg.zScoreWarn)
|
|
89
|
+
return "warn";
|
|
90
|
+
if (quantum.collapseStability < 0.7)
|
|
91
|
+
return "broken";
|
|
92
|
+
if (quantum.outputEntropy > 4 && quantum.collapseStability < 0.85)
|
|
93
|
+
return "warn";
|
|
94
|
+
if (quantum.neighborCorrelation > 0.5 && maxZ > 1.5)
|
|
95
|
+
return "warn";
|
|
96
|
+
return "healthy";
|
|
97
|
+
}
|
|
98
|
+
export function runQuantumProbe(fnId, recent, baseline, cfg, neighborBrokenRate = 0) {
|
|
99
|
+
if (recent.length === 0) {
|
|
100
|
+
return {
|
|
101
|
+
fnId, at: new Date().toISOString(), outcome: "healthy",
|
|
102
|
+
zScores: {}, quantumSignals: { outputEntropy: 0, chaosDivergence: 0, neighborCorrelation: 0, collapseStability: 1 },
|
|
103
|
+
rootCauseHints: [], evidence: "no recent invocations to probe",
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
const recentDur = recent.map((s) => s.durationMs);
|
|
107
|
+
const recentMean = recentDur.reduce((a, b) => a + b, 0) / recentDur.length;
|
|
108
|
+
const recentErrorRate = recent.filter((s) => s.output.kind === "throw").length / recent.length;
|
|
109
|
+
const zScores = {
|
|
110
|
+
duration: zScore(recentMean, baseline.durationMean, baseline.durationStdev),
|
|
111
|
+
errorRate: baseline.errorRate < 1e-9 && recentErrorRate > 0 ? Number.POSITIVE_INFINITY : (recentErrorRate - baseline.errorRate) / Math.max(0.01, baseline.errorRate),
|
|
112
|
+
};
|
|
113
|
+
const quantum = computeQuantumSignals(recent, baseline, neighborBrokenRate);
|
|
114
|
+
const outcome = gradeOutcome(zScores, quantum, cfg);
|
|
115
|
+
const evidence = `${recent.length} recent calls ยท meanDur ${recentMean.toFixed(1)}ms (z=${zScores.duration.toFixed(2)}) ยท errRate ${(recentErrorRate * 100).toFixed(1)}% ยท entropy ${quantum.outputEntropy.toFixed(2)} ยท stability ${(quantum.collapseStability * 100).toFixed(0)}%`;
|
|
116
|
+
return { fnId, at: new Date().toISOString(), outcome, zScores, quantumSignals: quantum, rootCauseHints: [], evidence };
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=quantum_probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quantum_probe.js","sourceRoot":"","sources":["../../src/protoplasm/quantum_probe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ๐ค PROTOPLASM โ SEAMLESS BOOT
|
|
3
|
+
*
|
|
4
|
+
* Zero-config auto-init. User does nothing.
|
|
5
|
+
*
|
|
6
|
+
* Pattern: when @mneme-ai/core is imported (any CLI cmd, any MCP call,
|
|
7
|
+
* any SDK call), seamlessBoot() runs once. It:
|
|
8
|
+
* 1. Activates PARASITE context (loads WAL baselines)
|
|
9
|
+
* 2. Writes heartbeat
|
|
10
|
+
* 3. Spawns GHOST CELL (detached watchdog)
|
|
11
|
+
*
|
|
12
|
+
* Cost: ~5ms per first-import-per-process.
|
|
13
|
+
* Benefit: PROTOPLASM is alive from the very first Mneme tool call,
|
|
14
|
+
* forever, without any user action.
|
|
15
|
+
*/
|
|
16
|
+
import type { ProtoplasmConfig } from "./types.js";
|
|
17
|
+
/** Provenance of current HMAC key. Useful for telemetry / first-run UX. */
|
|
18
|
+
export declare function getKeyProvenance(): "env" | "file" | "generated";
|
|
19
|
+
/** Idempotent. Safe to call from anywhere; runs once per process. */
|
|
20
|
+
export declare function seamlessBoot(cfg?: ProtoplasmConfig): {
|
|
21
|
+
booted: boolean;
|
|
22
|
+
bootedAt: string;
|
|
23
|
+
pid: number;
|
|
24
|
+
};
|
|
25
|
+
/** For tests: reset boot flag. */
|
|
26
|
+
export declare function _resetBoot(): void;
|
|
27
|
+
export declare function isBooted(): boolean;
|
|
28
|
+
//# sourceMappingURL=seamless_boot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seamless_boot.d.ts","sourceRoot":"","sources":["../../src/protoplasm/seamless_boot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAyCnD,2EAA2E;AAC3E,wBAAgB,gBAAgB,IAAI,KAAK,GAAG,MAAM,GAAG,WAAW,CAA2B;AAE3F,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,GAAG,GAAE,gBAAmC,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAuCzH;AAED,kCAAkC;AAClC,wBAAgB,UAAU,IAAI,IAAI,CAAoC;AACtE,wBAAgB,QAAQ,IAAI,OAAO,CAAmB"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ๐ค PROTOPLASM โ SEAMLESS BOOT
|
|
3
|
+
*
|
|
4
|
+
* Zero-config auto-init. User does nothing.
|
|
5
|
+
*
|
|
6
|
+
* Pattern: when @mneme-ai/core is imported (any CLI cmd, any MCP call,
|
|
7
|
+
* any SDK call), seamlessBoot() runs once. It:
|
|
8
|
+
* 1. Activates PARASITE context (loads WAL baselines)
|
|
9
|
+
* 2. Writes heartbeat
|
|
10
|
+
* 3. Spawns GHOST CELL (detached watchdog)
|
|
11
|
+
*
|
|
12
|
+
* Cost: ~5ms per first-import-per-process.
|
|
13
|
+
* Benefit: PROTOPLASM is alive from the very first Mneme tool call,
|
|
14
|
+
* forever, without any user action.
|
|
15
|
+
*/
|
|
16
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, chmodSync, appendFileSync } from "node:fs";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
import { randomBytes } from "node:crypto";
|
|
19
|
+
import { activateParasite, parasiteTick } from "./parasite.js";
|
|
20
|
+
import { spawnGhostCell } from "./ghost_cell.js";
|
|
21
|
+
let BOOTED = false;
|
|
22
|
+
let BOOT_TS = null;
|
|
23
|
+
/** First-run HMAC key wizard:
|
|
24
|
+
* 1. env var set โ use it (caller-controlled, best)
|
|
25
|
+
* 2. .mneme/protoplasm/.key file exists โ load it (per-repo persistent)
|
|
26
|
+
* 3. neither โ generate 32-byte random key + write file with 0600 + warn
|
|
27
|
+
* Returns the key + provenance for telemetry. */
|
|
28
|
+
function ensureHmacKey(ledgerDir) {
|
|
29
|
+
const envKey = process.env.MNEME_PROTOPLASM_KEY;
|
|
30
|
+
if (envKey && envKey.length >= 16)
|
|
31
|
+
return { key: envKey, provenance: "env" };
|
|
32
|
+
try {
|
|
33
|
+
mkdirSync(ledgerDir, { recursive: true });
|
|
34
|
+
const keyPath = join(ledgerDir, ".key");
|
|
35
|
+
if (existsSync(keyPath)) {
|
|
36
|
+
const k = readFileSync(keyPath, "utf8").trim();
|
|
37
|
+
if (k.length >= 16)
|
|
38
|
+
return { key: k, provenance: "file" };
|
|
39
|
+
}
|
|
40
|
+
const fresh = randomBytes(32).toString("hex");
|
|
41
|
+
writeFileSync(keyPath, fresh, { encoding: "utf8" });
|
|
42
|
+
try {
|
|
43
|
+
chmodSync(keyPath, 0o600);
|
|
44
|
+
}
|
|
45
|
+
catch { /* windows ignores */ }
|
|
46
|
+
return { key: fresh, provenance: "generated" };
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return { key: "dev-protoplasm-fallback-INSECURE", provenance: "generated" };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const DEFAULT_LEDGER = ".mneme/protoplasm";
|
|
53
|
+
const { key: AUTO_KEY, provenance: KEY_PROVENANCE } = ensureHmacKey(DEFAULT_LEDGER);
|
|
54
|
+
const DEFAULT_BOOT_CFG = {
|
|
55
|
+
baselineSamplesMin: 5,
|
|
56
|
+
zScoreWarn: 2,
|
|
57
|
+
zScoreBroken: 3,
|
|
58
|
+
ledgerDir: DEFAULT_LEDGER,
|
|
59
|
+
hmacKey: AUTO_KEY,
|
|
60
|
+
crawlOnHealthyEvery: 50,
|
|
61
|
+
};
|
|
62
|
+
/** Provenance of current HMAC key. Useful for telemetry / first-run UX. */
|
|
63
|
+
export function getKeyProvenance() { return KEY_PROVENANCE; }
|
|
64
|
+
/** Idempotent. Safe to call from anywhere; runs once per process. */
|
|
65
|
+
export function seamlessBoot(cfg = DEFAULT_BOOT_CFG) {
|
|
66
|
+
if (BOOTED)
|
|
67
|
+
return { booted: false, bootedAt: BOOT_TS, pid: process.pid };
|
|
68
|
+
BOOTED = true;
|
|
69
|
+
BOOT_TS = new Date().toISOString();
|
|
70
|
+
try {
|
|
71
|
+
activateParasite(cfg);
|
|
72
|
+
parasiteTick(cfg);
|
|
73
|
+
spawnGhostCell({ parentPid: process.pid, ledgerDir: cfg.ledgerDir, hmacKey: cfg.hmacKey });
|
|
74
|
+
// Register process exit cleanup โ write final heartbeat so ghost knows clean exit
|
|
75
|
+
process.on("exit", () => {
|
|
76
|
+
try {
|
|
77
|
+
writeFileSync(cfg.ledgerDir + "/heartbeat.json", JSON.stringify({
|
|
78
|
+
pid: process.pid,
|
|
79
|
+
ts: new Date().toISOString(),
|
|
80
|
+
cleanExit: true,
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
catch { /* */ }
|
|
84
|
+
});
|
|
85
|
+
// Catch uncaught + unhandled โ write WAL "incident" then re-throw
|
|
86
|
+
process.on("uncaughtException", (err) => {
|
|
87
|
+
try {
|
|
88
|
+
appendFileSync(cfg.ledgerDir + "/incidents.jsonl", JSON.stringify({ ts: new Date().toISOString(), pid: process.pid, kind: "uncaughtException", message: err.message, stack: err.stack }) + "\n");
|
|
89
|
+
}
|
|
90
|
+
catch { /* */ }
|
|
91
|
+
throw err;
|
|
92
|
+
});
|
|
93
|
+
process.on("unhandledRejection", (reason) => {
|
|
94
|
+
try {
|
|
95
|
+
appendFileSync(cfg.ledgerDir + "/incidents.jsonl", JSON.stringify({ ts: new Date().toISOString(), pid: process.pid, kind: "unhandledRejection", message: String(reason?.message ?? reason) }) + "\n");
|
|
96
|
+
}
|
|
97
|
+
catch { /* */ }
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
catch { /* boot must NEVER throw โ degrades gracefully */ }
|
|
101
|
+
return { booted: true, bootedAt: BOOT_TS, pid: process.pid };
|
|
102
|
+
}
|
|
103
|
+
/** For tests: reset boot flag. */
|
|
104
|
+
export function _resetBoot() { BOOTED = false; BOOT_TS = null; }
|
|
105
|
+
export function isBooted() { return BOOTED; }
|
|
106
|
+
//# sourceMappingURL=seamless_boot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seamless_boot.js","sourceRoot":"","sources":["../../src/protoplasm/seamless_boot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ๐ฆ PROTOPLASM โ super_quan_probe decorator
|
|
3
|
+
*
|
|
4
|
+
* The "live atom" that gets embedded in every function:
|
|
5
|
+
* const wrapped = withSuperQuanProbe("module.fn", fn);
|
|
6
|
+
*
|
|
7
|
+
* On every call:
|
|
8
|
+
* - records InvocationSnapshot to in-memory rolling buffer
|
|
9
|
+
* - if buffer reaches probe interval โ run quantum probe โ emit finding
|
|
10
|
+
*
|
|
11
|
+
* Zero behavioral change to wrapped fn. Sync + async supported.
|
|
12
|
+
* Hot-path overhead target: <50ยตs per call (only timing + shape).
|
|
13
|
+
*/
|
|
14
|
+
import type { InvocationSnapshot, ProtoplasmConfig, SuperQuanFinding } from "./types.js";
|
|
15
|
+
export declare function onFinding(listener: (f: SuperQuanFinding) => void): () => void;
|
|
16
|
+
export declare function withSuperQuanProbe<F extends (...args: any[]) => any>(fnId: string, fn: F, cfg?: ProtoplasmConfig): F;
|
|
17
|
+
/** Snapshot of the registry โ for orchestrator / wisdom_space inspection. */
|
|
18
|
+
export declare function snapshotRegistry(): Array<{
|
|
19
|
+
fnId: string;
|
|
20
|
+
samples: number;
|
|
21
|
+
recent: InvocationSnapshot[];
|
|
22
|
+
}>;
|
|
23
|
+
export declare function clearRegistry(): void;
|
|
24
|
+
//# sourceMappingURL=super_quan_probe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"super_quan_probe.d.ts","sourceRoot":"","sources":["../../src/protoplasm/super_quan_probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAoB,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAmC3G,wBAAgB,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI,CAG7E;AA+BD,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,gBAAgB,GAAG,CAAC,CA+CpH;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,kBAAkB,EAAE,CAAA;CAAE,CAAC,CAEzG;AAED,wBAAgB,aAAa,IAAI,IAAI,CAAsB"}
|