@mneme-ai/core 2.19.83 → 2.19.84
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/agent_manifest.d.ts +1 -1
- package/dist/agent_manifest.d.ts.map +1 -1
- package/dist/agent_manifest.js +8 -1
- package/dist/agent_manifest.js.map +1 -1
- package/dist/diaspora/diaspora.test.js +34 -1
- package/dist/diaspora/diaspora.test.js.map +1 -1
- package/dist/diaspora/http_bridge.d.ts +18 -0
- package/dist/diaspora/http_bridge.d.ts.map +1 -1
- package/dist/diaspora/http_bridge.js +19 -2
- package/dist/diaspora/http_bridge.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/permeate/userscript_generator.d.ts.map +1 -1
- package/dist/permeate/userscript_generator.js +26 -0
- package/dist/permeate/userscript_generator.js.map +1 -1
- package/dist/world_pulse/index.d.ts +105 -0
- package/dist/world_pulse/index.d.ts.map +1 -0
- package/dist/world_pulse/index.js +240 -0
- package/dist/world_pulse/index.js.map +1 -0
- package/dist/world_pulse/world_pulse.test.d.ts +12 -0
- package/dist/world_pulse/world_pulse.test.d.ts.map +1 -0
- package/dist/world_pulse/world_pulse.test.js +177 -0
- package/dist/world_pulse/world_pulse.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.84 — World AI Pulse deep tests.
|
|
3
|
+
*
|
|
4
|
+
* Pins the load-bearing invariants:
|
|
5
|
+
* - record/read round-trip
|
|
6
|
+
* - HMAC chain holds across N events; detects tampering
|
|
7
|
+
* - aggregate window slicing + per-vendor + per-region buckets
|
|
8
|
+
* - synthetic stream is realistic-shaped + seedable / deterministic
|
|
9
|
+
* - private fields stay private (NEVER stores sentence text)
|
|
10
|
+
*/
|
|
11
|
+
import { describe, it, expect } from "vitest";
|
|
12
|
+
import { mkdtempSync, readFileSync, writeFileSync, rmSync } from "node:fs";
|
|
13
|
+
import { tmpdir } from "node:os";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
import { recordPulseEvent, readPulseEvents, aggregatePulse, verifyPulseChain, synthesizePulseEvents, } from "./index.js";
|
|
16
|
+
function makeRepo() {
|
|
17
|
+
return mkdtempSync(join(tmpdir(), "mneme-pulse-"));
|
|
18
|
+
}
|
|
19
|
+
describe("world_pulse · record + read", () => {
|
|
20
|
+
it("round-trips an event with HMAC chain hash", () => {
|
|
21
|
+
const r = makeRepo();
|
|
22
|
+
try {
|
|
23
|
+
const e = recordPulseEvent(r, { vendor: "claude-ai", color: "green", regionTimezone: "Asia/Bangkok" });
|
|
24
|
+
expect(e.chainHash).toMatch(/^[A-Za-z0-9_-]{22}$/);
|
|
25
|
+
const back = readPulseEvents(r);
|
|
26
|
+
expect(back.length).toBe(1);
|
|
27
|
+
expect(back[0].vendor).toBe("claude-ai");
|
|
28
|
+
expect(back[0].color).toBe("green");
|
|
29
|
+
expect(back[0].regionTimezone).toBe("Asia/Bangkok");
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
rmSync(r, { recursive: true, force: true });
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
it("normalises bad input WITHOUT throwing (fire-and-forget contract)", () => {
|
|
36
|
+
const r = makeRepo();
|
|
37
|
+
try {
|
|
38
|
+
// Vendor not a string → "unknown". Color invalid → grey. Confidence > 1 → clamped.
|
|
39
|
+
const e = recordPulseEvent(r, { vendor: 12345, color: "purple", confidence: 9.9 });
|
|
40
|
+
expect(e.vendor).toBe("unknown");
|
|
41
|
+
expect(e.color).toBe("grey");
|
|
42
|
+
expect(e.confidence).toBe(1);
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
rmSync(r, { recursive: true, force: true });
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
it("limit + sinceTs filters work", () => {
|
|
49
|
+
const r = makeRepo();
|
|
50
|
+
try {
|
|
51
|
+
const t0 = Date.now() - 10_000;
|
|
52
|
+
recordPulseEvent(r, { vendor: "a", color: "green", ts: t0 });
|
|
53
|
+
recordPulseEvent(r, { vendor: "b", color: "red", ts: t0 + 2000 });
|
|
54
|
+
recordPulseEvent(r, { vendor: "c", color: "yellow", ts: t0 + 4000 });
|
|
55
|
+
const recent = readPulseEvents(r, { sinceTs: t0 + 3000 });
|
|
56
|
+
expect(recent.length).toBe(1);
|
|
57
|
+
expect(recent[0].vendor).toBe("c");
|
|
58
|
+
const lim = readPulseEvents(r, { limit: 2 });
|
|
59
|
+
expect(lim.length).toBe(2); // newest first → c then b
|
|
60
|
+
expect(lim[0].vendor).toBe("c");
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
rmSync(r, { recursive: true, force: true });
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe("world_pulse · HMAC chain integrity", () => {
|
|
68
|
+
it("verifyPulseChain reports intact on a clean chain", () => {
|
|
69
|
+
const r = makeRepo();
|
|
70
|
+
try {
|
|
71
|
+
for (let i = 0; i < 5; i++)
|
|
72
|
+
recordPulseEvent(r, { vendor: `v${i}`, color: "green" });
|
|
73
|
+
const v = verifyPulseChain(r);
|
|
74
|
+
expect(v.intact).toBe(true);
|
|
75
|
+
expect(v.firstBrokenIndex).toBe(-1);
|
|
76
|
+
expect(v.checked).toBe(5);
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
rmSync(r, { recursive: true, force: true });
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
it("verifyPulseChain detects tampering (mutated chainHash)", () => {
|
|
83
|
+
const r = makeRepo();
|
|
84
|
+
try {
|
|
85
|
+
recordPulseEvent(r, { vendor: "a", color: "green" });
|
|
86
|
+
recordPulseEvent(r, { vendor: "b", color: "red" });
|
|
87
|
+
recordPulseEvent(r, { vendor: "c", color: "yellow" });
|
|
88
|
+
// Tamper: rewrite line 2's chainHash to something fake.
|
|
89
|
+
const path = join(r, ".mneme", "pulse.jsonl");
|
|
90
|
+
const lines = readFileSync(path, "utf8").trim().split("\n");
|
|
91
|
+
const evil = { ...JSON.parse(lines[1]), chainHash: "XXXXXXXXXXXXXXXXXXXXXX" };
|
|
92
|
+
lines[1] = JSON.stringify(evil);
|
|
93
|
+
writeFileSync(path, lines.join("\n") + "\n", "utf8");
|
|
94
|
+
const v = verifyPulseChain(r);
|
|
95
|
+
expect(v.intact).toBe(false);
|
|
96
|
+
expect(v.firstBrokenIndex).toBeGreaterThanOrEqual(0);
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
rmSync(r, { recursive: true, force: true });
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
describe("world_pulse · aggregate", () => {
|
|
104
|
+
it("windows correctly + bucketises by color / vendor / region", () => {
|
|
105
|
+
const r = makeRepo();
|
|
106
|
+
try {
|
|
107
|
+
const now = Date.now();
|
|
108
|
+
recordPulseEvent(r, { vendor: "claude-ai", color: "green", ts: now - 10_000, regionTimezone: "Asia/Bangkok" });
|
|
109
|
+
recordPulseEvent(r, { vendor: "claude-ai", color: "red", ts: now - 5_000, regionTimezone: "Asia/Bangkok" });
|
|
110
|
+
recordPulseEvent(r, { vendor: "chatgpt", color: "yellow", ts: now - 1_000, regionTimezone: "Europe/London" });
|
|
111
|
+
// Outside the 1-hour window
|
|
112
|
+
recordPulseEvent(r, { vendor: "gemini", color: "green", ts: now - 4 * 3600_000, regionTimezone: "Asia/Tokyo" });
|
|
113
|
+
const events = readPulseEvents(r);
|
|
114
|
+
const agg = aggregatePulse(events, { windowHours: 1 });
|
|
115
|
+
expect(agg.total).toBe(3);
|
|
116
|
+
expect(agg.byColor.green).toBe(1);
|
|
117
|
+
expect(agg.byColor.red).toBe(1);
|
|
118
|
+
expect(agg.byColor.yellow).toBe(1);
|
|
119
|
+
expect(agg.byVendor["claude-ai"].total).toBe(2);
|
|
120
|
+
expect(agg.byVendor["chatgpt"].total).toBe(1);
|
|
121
|
+
expect(agg.byVendor["gemini"]).toBeUndefined();
|
|
122
|
+
expect(agg.byRegion["Asia/Bangkok"]).toBe(2);
|
|
123
|
+
expect(agg.byRegion["Europe/London"]).toBe(1);
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
rmSync(r, { recursive: true, force: true });
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
describe("world_pulse · synthesizePulseEvents", () => {
|
|
131
|
+
it("emits the requested count + realistic shape", () => {
|
|
132
|
+
const stream = synthesizePulseEvents({ count: 100, spanMinutes: 60, seed: 1 });
|
|
133
|
+
expect(stream.length).toBe(100);
|
|
134
|
+
const colors = new Set(stream.map((e) => e.color));
|
|
135
|
+
expect(colors.has("green")).toBe(true);
|
|
136
|
+
// With 100 events + realistic weights we should see at least one red.
|
|
137
|
+
expect(stream.some((e) => e.color === "red")).toBe(true);
|
|
138
|
+
// All events fall inside the requested span (or close to "now").
|
|
139
|
+
const now = Date.now();
|
|
140
|
+
for (const e of stream) {
|
|
141
|
+
expect(now - e.ts).toBeGreaterThanOrEqual(0);
|
|
142
|
+
expect(now - e.ts).toBeLessThan(70 * 60_000);
|
|
143
|
+
}
|
|
144
|
+
// All vendors are the known 6.
|
|
145
|
+
const allowedVendors = new Set(["claude-ai", "chatgpt", "gemini", "copilot", "deepseek", "qwen"]);
|
|
146
|
+
for (const e of stream)
|
|
147
|
+
expect(allowedVendors.has(e.vendor)).toBe(true);
|
|
148
|
+
});
|
|
149
|
+
it("deterministic when seed is fixed", () => {
|
|
150
|
+
const a = synthesizePulseEvents({ count: 30, seed: 7 });
|
|
151
|
+
const b = synthesizePulseEvents({ count: 30, seed: 7 });
|
|
152
|
+
expect(a.map((e) => `${e.ts}|${e.vendor}|${e.color}`).join(","))
|
|
153
|
+
.toBe(b.map((e) => `${e.ts}|${e.vendor}|${e.color}`).join(","));
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
describe("world_pulse · privacy invariant", () => {
|
|
157
|
+
it("the PulseEvent shape has NO sentence-text field — privacy by design", () => {
|
|
158
|
+
const r = makeRepo();
|
|
159
|
+
try {
|
|
160
|
+
// Defensive: even if a caller tries to smuggle a `sentence` field
|
|
161
|
+
// through Partial<PulseEvent>, the recorder strips it.
|
|
162
|
+
const evil = { vendor: "x", color: "green", regionTimezone: "Asia/Bangkok", sentence: "secret claim text" };
|
|
163
|
+
const e = recordPulseEvent(r, evil);
|
|
164
|
+
const raw = readFileSync(join(r, ".mneme", "pulse.jsonl"), "utf8");
|
|
165
|
+
expect(raw).not.toContain("secret claim text");
|
|
166
|
+
expect(raw).not.toContain("sentence");
|
|
167
|
+
// Verify the recorded object only contains the documented fields.
|
|
168
|
+
const allowed = new Set(["ts", "vendor", "color", "regionTimezone", "topicHash", "chainHash", "confidence"]);
|
|
169
|
+
for (const key of Object.keys(e))
|
|
170
|
+
expect(allowed.has(key)).toBe(true);
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
rmSync(r, { recursive: true, force: true });
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
//# sourceMappingURL=world_pulse.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"world_pulse.test.js","sourceRoot":"","sources":["../../src/world_pulse/world_pulse.test.ts"],"names":[],"mappings":"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"}
|