@mneme-ai/core 2.17.0 → 2.18.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/agent_manifest.d.ts +1 -1
- package/dist/agent_manifest.d.ts.map +1 -1
- package/dist/agent_manifest.js +14 -1
- package/dist/agent_manifest.js.map +1 -1
- package/dist/arena/arena.test.d.ts +2 -0
- package/dist/arena/arena.test.d.ts.map +1 -0
- package/dist/arena/arena.test.js +107 -0
- package/dist/arena/arena.test.js.map +1 -0
- package/dist/arena/index.d.ts +114 -0
- package/dist/arena/index.d.ts.map +1 -0
- package/dist/arena/index.js +158 -0
- package/dist/arena/index.js.map +1 -0
- package/dist/cosmic/aurelian_v218.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v218.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v218.test.js +68 -0
- package/dist/cosmic/aurelian_v218.test.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/jackpot/index.d.ts +36 -0
- package/dist/jackpot/index.d.ts.map +1 -1
- package/dist/jackpot/index.js +59 -0
- package/dist/jackpot/index.js.map +1 -1
- package/dist/nexus_proactive/index.d.ts +134 -0
- package/dist/nexus_proactive/index.d.ts.map +1 -0
- package/dist/nexus_proactive/index.js +277 -0
- package/dist/nexus_proactive/index.js.map +1 -0
- package/dist/nexus_proactive/nexus_proactive.test.d.ts +2 -0
- package/dist/nexus_proactive/nexus_proactive.test.d.ts.map +1 -0
- package/dist/nexus_proactive/nexus_proactive.test.js +135 -0
- package/dist/nexus_proactive/nexus_proactive.test.js.map +1 -0
- package/dist/oracle_liability/index.d.ts +122 -0
- package/dist/oracle_liability/index.d.ts.map +1 -0
- package/dist/oracle_liability/index.js +203 -0
- package/dist/oracle_liability/index.js.map +1 -0
- package/dist/oracle_liability/oracle_liability.test.d.ts +2 -0
- package/dist/oracle_liability/oracle_liability.test.d.ts.map +1 -0
- package/dist/oracle_liability/oracle_liability.test.js +186 -0
- package/dist/oracle_liability/oracle_liability.test.js.map +1 -0
- package/dist/verified_badge/index.d.ts +78 -0
- package/dist/verified_badge/index.d.ts.map +1 -0
- package/dist/verified_badge/index.js +131 -0
- package/dist/verified_badge/index.js.map +1 -0
- package/dist/verified_badge/verified_badge.test.d.ts +2 -0
- package/dist/verified_badge/verified_badge.test.d.ts.map +1 -0
- package/dist/verified_badge/verified_badge.test.js +88 -0
- package/dist/verified_badge/verified_badge.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.18.0 — MNEME NEXUS PROACTIVE (the "Reverse MCP" — push, not pull)
|
|
3
|
+
*
|
|
4
|
+
* "Standard MCP is pull-only: an AI agent CALLS Mneme. NEXUS inverts
|
|
5
|
+
* the channel — Mneme observes the repo continuously and pushes
|
|
6
|
+
* UNREQUESTED notifications back at the AI agent the moment a fact
|
|
7
|
+
* changes that would have invalidated its last answer.
|
|
8
|
+
*
|
|
9
|
+
* Closes the 'stale-context' hallucination class entirely:
|
|
10
|
+
* AI says: 'function foo lives at src/foo.ts:42'
|
|
11
|
+
* User edits src/foo.ts → moves foo to line 80
|
|
12
|
+
* Within seconds: NEXUS emits {kind: 'stale_claim', oldFact, newFact, sig}
|
|
13
|
+
* AI MUST acknowledge before continuing.
|
|
14
|
+
*
|
|
15
|
+
* This is the closest a local-first MCP can get to the 'Ghost-in-
|
|
16
|
+
* the-Shell Developer / Async Context-Weaver / Digital Organ Harvester'
|
|
17
|
+
* architecture without breaking the MCP contract."
|
|
18
|
+
*
|
|
19
|
+
* Honest scope (what NEXUS PROACTIVE IS):
|
|
20
|
+
* 1. registerSubscription — AI agent subscribes to a fact pattern
|
|
21
|
+
* (a file path, a symbol, a stat threshold).
|
|
22
|
+
* 2. publishObservation — caller reports an observation; NEXUS diffs
|
|
23
|
+
* against subscriptions and emits notifications for stale matches.
|
|
24
|
+
* 3. drainNotifications — AI agent (or its supervisor) pulls queued
|
|
25
|
+
* notifications. Each is HMAC-signed + tamper-evident + monotonic.
|
|
26
|
+
* 4. acknowledge — AI agent confirms it has updated its mental model;
|
|
27
|
+
* ACK is recorded; un-ACKed notifications surface louder over time.
|
|
28
|
+
*
|
|
29
|
+
* Honest scope (what NEXUS PROACTIVE IS NOT):
|
|
30
|
+
* - Not a real WebSocket / push channel — MCP doesn't support that.
|
|
31
|
+
* NEXUS is a server-side queue + ACK ledger. Any MCP transport
|
|
32
|
+
* (stdio / sse / http) can drain it.
|
|
33
|
+
* - Not a global pub/sub bus — per-repo, per-subscriber. Federation
|
|
34
|
+
* belongs to v2.16 OBELISK.
|
|
35
|
+
* - Not a daemon by itself — daemon (or the AI agent) calls
|
|
36
|
+
* publishObservation; NEXUS is the diff + queue logic.
|
|
37
|
+
*
|
|
38
|
+
* Pure orchestrator. Composes onto v2.6 TRUTH KERNEL + v2.16 OBELISK
|
|
39
|
+
* + v2.16 LIVING MODEL. Zero new external deps.
|
|
40
|
+
*/
|
|
41
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
42
|
+
const PROTOCOL_VERSION = 1;
|
|
43
|
+
function canon(v) {
|
|
44
|
+
if (v === null || typeof v !== "object")
|
|
45
|
+
return JSON.stringify(v);
|
|
46
|
+
if (Array.isArray(v))
|
|
47
|
+
return "[" + v.map(canon).join(",") + "]";
|
|
48
|
+
const keys = Object.keys(v).sort();
|
|
49
|
+
return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
|
|
50
|
+
}
|
|
51
|
+
function defaultSecret() {
|
|
52
|
+
return process.env["MNEME_NEXUS_SECRET"] || `mneme-nexus-proactive-v${PROTOCOL_VERSION}`;
|
|
53
|
+
}
|
|
54
|
+
function hmac(body, secret) {
|
|
55
|
+
return createHmac("sha256", secret).update(canon(body)).digest("hex");
|
|
56
|
+
}
|
|
57
|
+
function safeEq(a, b) {
|
|
58
|
+
try {
|
|
59
|
+
return timingSafeEqual(Buffer.from(a, "hex"), Buffer.from(b, "hex"));
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Pure in-memory NEXUS instance. Real deployments persist subscriptions
|
|
67
|
+
* + queued notifications to .mneme/nexus.jsonl; this class is the
|
|
68
|
+
* arithmetic — caller chooses durability.
|
|
69
|
+
*/
|
|
70
|
+
export class NexusProactive {
|
|
71
|
+
subs = new Map();
|
|
72
|
+
queue = new Map(); // subscriber -> notifs
|
|
73
|
+
acks = new Map();
|
|
74
|
+
seq = new Map(); // subscriber -> last seq
|
|
75
|
+
secret;
|
|
76
|
+
constructor(secret) {
|
|
77
|
+
this.secret = secret ?? defaultSecret();
|
|
78
|
+
}
|
|
79
|
+
registerSubscription(input) {
|
|
80
|
+
const now = input.nowMs ?? Date.now();
|
|
81
|
+
const ttl = input.ttlSeconds ?? 60 * 60 * 24; // 24h default
|
|
82
|
+
const subId = "sub-" + createHmac("sha256", "mneme-nexus-subid")
|
|
83
|
+
.update(`${input.subscriber}|${input.kind}|${input.factKey}|${now}`)
|
|
84
|
+
.digest("hex").slice(0, 14);
|
|
85
|
+
const body = {
|
|
86
|
+
v: PROTOCOL_VERSION,
|
|
87
|
+
subId,
|
|
88
|
+
subscriber: input.subscriber,
|
|
89
|
+
kind: input.kind,
|
|
90
|
+
factKey: input.factKey,
|
|
91
|
+
knownValue: input.knownValue,
|
|
92
|
+
registeredAt: new Date(now).toISOString(),
|
|
93
|
+
expiresAt: new Date(now + ttl * 1000).toISOString(),
|
|
94
|
+
};
|
|
95
|
+
const sub = { ...body, sig: hmac(body, this.secret) };
|
|
96
|
+
this.subs.set(subId, sub);
|
|
97
|
+
return sub;
|
|
98
|
+
}
|
|
99
|
+
publishObservation(obs, nowMs) {
|
|
100
|
+
const now = nowMs ?? Date.now();
|
|
101
|
+
const observedAt = obs.observedAt ?? new Date(now).toISOString();
|
|
102
|
+
const emitted = [];
|
|
103
|
+
for (const sub of this.subs.values()) {
|
|
104
|
+
if (sub.kind !== obs.kind)
|
|
105
|
+
continue;
|
|
106
|
+
if (sub.factKey !== obs.factKey)
|
|
107
|
+
continue;
|
|
108
|
+
if (Date.parse(sub.expiresAt) < now)
|
|
109
|
+
continue;
|
|
110
|
+
if (sub.knownValue === obs.value)
|
|
111
|
+
continue; // still fresh
|
|
112
|
+
const seq = (this.seq.get(sub.subscriber) ?? 0) + 1;
|
|
113
|
+
this.seq.set(sub.subscriber, seq);
|
|
114
|
+
const severity = severityOf(sub.kind, sub.knownValue, obs.value);
|
|
115
|
+
const notifId = "n-" + createHmac("sha256", "mneme-nexus-notifid")
|
|
116
|
+
.update(`${sub.subId}|${seq}|${observedAt}`)
|
|
117
|
+
.digest("hex").slice(0, 12);
|
|
118
|
+
const body = {
|
|
119
|
+
v: PROTOCOL_VERSION,
|
|
120
|
+
notifId,
|
|
121
|
+
subId: sub.subId,
|
|
122
|
+
subscriber: sub.subscriber,
|
|
123
|
+
kind: "stale_claim",
|
|
124
|
+
factKey: sub.factKey,
|
|
125
|
+
oldValue: sub.knownValue,
|
|
126
|
+
newValue: obs.value,
|
|
127
|
+
severity,
|
|
128
|
+
emittedAt: observedAt,
|
|
129
|
+
seq,
|
|
130
|
+
message: messageFor(sub.kind, sub.factKey, sub.knownValue, obs.value, severity),
|
|
131
|
+
};
|
|
132
|
+
const notif = { ...body, sig: hmac(body, this.secret) };
|
|
133
|
+
const list = this.queue.get(sub.subscriber) ?? [];
|
|
134
|
+
list.push(notif);
|
|
135
|
+
this.queue.set(sub.subscriber, list);
|
|
136
|
+
emitted.push(notif);
|
|
137
|
+
// Update knownValue so we don't re-fire on the same change next observation.
|
|
138
|
+
// Caller is expected to re-register if they explicitly want new-value tracking.
|
|
139
|
+
this.subs.set(sub.subId, { ...sub, knownValue: obs.value });
|
|
140
|
+
}
|
|
141
|
+
return emitted;
|
|
142
|
+
}
|
|
143
|
+
drainNotifications(subscriber, nowMs) {
|
|
144
|
+
const now = nowMs ?? Date.now();
|
|
145
|
+
// Also surface expired-subscription notifications
|
|
146
|
+
const expired = [];
|
|
147
|
+
for (const sub of this.subs.values()) {
|
|
148
|
+
if (sub.subscriber !== subscriber)
|
|
149
|
+
continue;
|
|
150
|
+
if (Date.parse(sub.expiresAt) >= now)
|
|
151
|
+
continue;
|
|
152
|
+
const seq = (this.seq.get(subscriber) ?? 0) + 1;
|
|
153
|
+
this.seq.set(subscriber, seq);
|
|
154
|
+
const notifId = "n-" + createHmac("sha256", "mneme-nexus-notifid")
|
|
155
|
+
.update(`${sub.subId}|expired|${seq}`)
|
|
156
|
+
.digest("hex").slice(0, 12);
|
|
157
|
+
const body = {
|
|
158
|
+
v: PROTOCOL_VERSION,
|
|
159
|
+
notifId, subId: sub.subId, subscriber,
|
|
160
|
+
kind: "subscription_expired",
|
|
161
|
+
factKey: sub.factKey,
|
|
162
|
+
oldValue: sub.knownValue,
|
|
163
|
+
newValue: sub.knownValue,
|
|
164
|
+
severity: 2,
|
|
165
|
+
emittedAt: new Date(now).toISOString(),
|
|
166
|
+
seq,
|
|
167
|
+
message: `Subscription on '${sub.factKey}' expired without observation. Re-verify before relying on it.`,
|
|
168
|
+
};
|
|
169
|
+
expired.push({ ...body, sig: hmac(body, this.secret) });
|
|
170
|
+
this.subs.delete(sub.subId);
|
|
171
|
+
}
|
|
172
|
+
if (expired.length > 0) {
|
|
173
|
+
const list = this.queue.get(subscriber) ?? [];
|
|
174
|
+
list.push(...expired);
|
|
175
|
+
this.queue.set(subscriber, list);
|
|
176
|
+
}
|
|
177
|
+
const out = this.queue.get(subscriber) ?? [];
|
|
178
|
+
this.queue.set(subscriber, []);
|
|
179
|
+
return out;
|
|
180
|
+
}
|
|
181
|
+
acknowledge(input) {
|
|
182
|
+
const now = input.nowMs ?? Date.now();
|
|
183
|
+
const body = {
|
|
184
|
+
v: PROTOCOL_VERSION,
|
|
185
|
+
notifId: input.notifId,
|
|
186
|
+
subscriber: input.subscriber,
|
|
187
|
+
ackedAt: new Date(now).toISOString(),
|
|
188
|
+
...(input.restatement ? { restatement: input.restatement } : {}),
|
|
189
|
+
};
|
|
190
|
+
const rec = { ...body, sig: hmac(body, this.secret) };
|
|
191
|
+
this.acks.set(input.notifId, rec);
|
|
192
|
+
return rec;
|
|
193
|
+
}
|
|
194
|
+
isAcked(notifId) {
|
|
195
|
+
return this.acks.has(notifId);
|
|
196
|
+
}
|
|
197
|
+
/** Verify a notification we received from the wire. */
|
|
198
|
+
verifyNotification(n) {
|
|
199
|
+
const { sig, ...body } = n;
|
|
200
|
+
return safeEq(hmac(body, this.secret), sig);
|
|
201
|
+
}
|
|
202
|
+
/** Verify an ack receipt. */
|
|
203
|
+
verifyAck(a) {
|
|
204
|
+
const { sig, ...body } = a;
|
|
205
|
+
return safeEq(hmac(body, this.secret), sig);
|
|
206
|
+
}
|
|
207
|
+
/** Stats for pulse / dashboard. */
|
|
208
|
+
stats(subscriber) {
|
|
209
|
+
let activeSubs = 0;
|
|
210
|
+
for (const s of this.subs.values()) {
|
|
211
|
+
if (subscriber && s.subscriber !== subscriber)
|
|
212
|
+
continue;
|
|
213
|
+
activeSubs++;
|
|
214
|
+
}
|
|
215
|
+
let pendingNotifs = 0;
|
|
216
|
+
if (subscriber) {
|
|
217
|
+
pendingNotifs = (this.queue.get(subscriber) ?? []).length;
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
for (const list of this.queue.values())
|
|
221
|
+
pendingNotifs += list.length;
|
|
222
|
+
}
|
|
223
|
+
return { activeSubs, pendingNotifs, totalAcks: this.acks.size };
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
function severityOf(kind, oldV, newV) {
|
|
227
|
+
// soul_rule changes are MUST-ACK (4); symbol locations and file content
|
|
228
|
+
// are MUST-ACK (4) — these directly invalidate prior code claims.
|
|
229
|
+
// stat_threshold + vendor_score drift is informational (2-3).
|
|
230
|
+
if (kind === "soul_rule")
|
|
231
|
+
return 5;
|
|
232
|
+
if (kind === "symbol_location")
|
|
233
|
+
return 4;
|
|
234
|
+
if (kind === "file_content")
|
|
235
|
+
return 4;
|
|
236
|
+
if (kind === "vendor_score") {
|
|
237
|
+
// bigger score swing → higher severity
|
|
238
|
+
const a = Number(oldV), b = Number(newV);
|
|
239
|
+
if (Number.isFinite(a) && Number.isFinite(b)) {
|
|
240
|
+
const delta = Math.abs(a - b);
|
|
241
|
+
if (delta > 0.20)
|
|
242
|
+
return 4;
|
|
243
|
+
if (delta > 0.05)
|
|
244
|
+
return 3;
|
|
245
|
+
}
|
|
246
|
+
return 2;
|
|
247
|
+
}
|
|
248
|
+
return 3;
|
|
249
|
+
}
|
|
250
|
+
function messageFor(kind, factKey, oldV, newV, sev) {
|
|
251
|
+
const must = sev >= 4 ? "MUST ACK" : "FYI";
|
|
252
|
+
switch (kind) {
|
|
253
|
+
case "file_content":
|
|
254
|
+
return `[${must}] file '${factKey}' changed (sha differs). Refresh any claim citing it.`;
|
|
255
|
+
case "symbol_location":
|
|
256
|
+
return `[${must}] symbol '${factKey}' moved: was at ${oldV}, now at ${newV}.`;
|
|
257
|
+
case "soul_rule":
|
|
258
|
+
return `[${must}] PROJECT SOUL rule on '${factKey}' changed; re-evaluate any decision that hinged on the old wording.`;
|
|
259
|
+
case "stat_threshold":
|
|
260
|
+
return `[${must}] stat '${factKey}' crossed threshold: ${oldV} → ${newV}.`;
|
|
261
|
+
case "vendor_score":
|
|
262
|
+
return `[${must}] vendor score for '${factKey}' shifted: ${oldV} → ${newV}.`;
|
|
263
|
+
default:
|
|
264
|
+
return `[${must}] '${factKey}': ${oldV} → ${newV}.`;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
export function formatNexusLine(n) {
|
|
268
|
+
return `NEXUS 📡 · ${n.kind} · sev=${n.severity} · ${n.factKey} · ${n.oldValue} → ${n.newValue}`;
|
|
269
|
+
}
|
|
270
|
+
/** Convenience: a singleton instance for callers that want global state. */
|
|
271
|
+
let _instance = null;
|
|
272
|
+
export function defaultNexus() {
|
|
273
|
+
if (!_instance)
|
|
274
|
+
_instance = new NexusProactive();
|
|
275
|
+
return _instance;
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nexus_proactive/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nexus_proactive.test.d.ts","sourceRoot":"","sources":["../../src/nexus_proactive/nexus_proactive.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { NexusProactive, formatNexusLine } from "./index.js";
|
|
3
|
+
describe("v2.18 · MNEME NEXUS PROACTIVE — Reverse-MCP push notifier", () => {
|
|
4
|
+
it("subscription registers with sig + monotonic id", () => {
|
|
5
|
+
const n = new NexusProactive();
|
|
6
|
+
const s = n.registerSubscription({
|
|
7
|
+
subscriber: "claude-1",
|
|
8
|
+
kind: "symbol_location",
|
|
9
|
+
factKey: "calculateTotal",
|
|
10
|
+
knownValue: "src/foo.ts:42",
|
|
11
|
+
});
|
|
12
|
+
expect(s.sig).toMatch(/^[0-9a-f]{64}$/);
|
|
13
|
+
expect(s.subId).toMatch(/^sub-[0-9a-f]{14}$/);
|
|
14
|
+
expect(s.subscriber).toBe("claude-1");
|
|
15
|
+
});
|
|
16
|
+
it("publishes a stale_claim notification when fact changes", () => {
|
|
17
|
+
const n = new NexusProactive();
|
|
18
|
+
n.registerSubscription({
|
|
19
|
+
subscriber: "claude-1",
|
|
20
|
+
kind: "symbol_location",
|
|
21
|
+
factKey: "calculateTotal",
|
|
22
|
+
knownValue: "src/foo.ts:42",
|
|
23
|
+
});
|
|
24
|
+
const emitted = n.publishObservation({
|
|
25
|
+
kind: "symbol_location",
|
|
26
|
+
factKey: "calculateTotal",
|
|
27
|
+
value: "src/foo.ts:80",
|
|
28
|
+
});
|
|
29
|
+
expect(emitted.length).toBe(1);
|
|
30
|
+
expect(emitted[0].kind).toBe("stale_claim");
|
|
31
|
+
expect(emitted[0].oldValue).toBe("src/foo.ts:42");
|
|
32
|
+
expect(emitted[0].newValue).toBe("src/foo.ts:80");
|
|
33
|
+
expect(emitted[0].severity).toBe(4); // symbol_location is MUST ACK
|
|
34
|
+
expect(emitted[0].message).toContain("MUST ACK");
|
|
35
|
+
});
|
|
36
|
+
it("does NOT emit when value unchanged", () => {
|
|
37
|
+
const n = new NexusProactive();
|
|
38
|
+
n.registerSubscription({
|
|
39
|
+
subscriber: "x", kind: "file_content", factKey: "src/a.ts", knownValue: "abc",
|
|
40
|
+
});
|
|
41
|
+
const emitted = n.publishObservation({ kind: "file_content", factKey: "src/a.ts", value: "abc" });
|
|
42
|
+
expect(emitted.length).toBe(0);
|
|
43
|
+
});
|
|
44
|
+
it("does NOT cross subscribers — per-subscriber isolation", () => {
|
|
45
|
+
const n = new NexusProactive();
|
|
46
|
+
n.registerSubscription({ subscriber: "claude", kind: "file_content", factKey: "src/a.ts", knownValue: "v1" });
|
|
47
|
+
n.registerSubscription({ subscriber: "gpt", kind: "file_content", factKey: "src/b.ts", knownValue: "v1" });
|
|
48
|
+
const emitted = n.publishObservation({ kind: "file_content", factKey: "src/a.ts", value: "v2" });
|
|
49
|
+
expect(emitted.length).toBe(1);
|
|
50
|
+
expect(emitted[0].subscriber).toBe("claude");
|
|
51
|
+
const claudeQ = n.drainNotifications("claude");
|
|
52
|
+
expect(claudeQ.length).toBe(1);
|
|
53
|
+
const gptQ = n.drainNotifications("gpt");
|
|
54
|
+
expect(gptQ.length).toBe(0);
|
|
55
|
+
});
|
|
56
|
+
it("seq is monotonic per subscriber", () => {
|
|
57
|
+
const n = new NexusProactive();
|
|
58
|
+
n.registerSubscription({ subscriber: "x", kind: "file_content", factKey: "a", knownValue: "v1" });
|
|
59
|
+
n.publishObservation({ kind: "file_content", factKey: "a", value: "v2" });
|
|
60
|
+
n.publishObservation({ kind: "file_content", factKey: "a", value: "v3" });
|
|
61
|
+
n.publishObservation({ kind: "file_content", factKey: "a", value: "v4" });
|
|
62
|
+
const drained = n.drainNotifications("x");
|
|
63
|
+
expect(drained.length).toBe(3);
|
|
64
|
+
expect(drained[0].seq).toBe(1);
|
|
65
|
+
expect(drained[1].seq).toBe(2);
|
|
66
|
+
expect(drained[2].seq).toBe(3);
|
|
67
|
+
});
|
|
68
|
+
it("drain clears the queue", () => {
|
|
69
|
+
const n = new NexusProactive();
|
|
70
|
+
n.registerSubscription({ subscriber: "x", kind: "file_content", factKey: "a", knownValue: "v1" });
|
|
71
|
+
n.publishObservation({ kind: "file_content", factKey: "a", value: "v2" });
|
|
72
|
+
expect(n.drainNotifications("x").length).toBe(1);
|
|
73
|
+
expect(n.drainNotifications("x").length).toBe(0);
|
|
74
|
+
});
|
|
75
|
+
it("expired subscription emits subscription_expired on drain", () => {
|
|
76
|
+
const n = new NexusProactive();
|
|
77
|
+
const t0 = 1_000_000_000_000;
|
|
78
|
+
n.registerSubscription({ subscriber: "x", kind: "file_content", factKey: "a", knownValue: "v1", ttlSeconds: 60, nowMs: t0 });
|
|
79
|
+
const drained = n.drainNotifications("x", t0 + 120_000); // 2 minutes later
|
|
80
|
+
expect(drained.length).toBe(1);
|
|
81
|
+
expect(drained[0].kind).toBe("subscription_expired");
|
|
82
|
+
});
|
|
83
|
+
it("acknowledge records signed receipt + isAcked true", () => {
|
|
84
|
+
const n = new NexusProactive();
|
|
85
|
+
n.registerSubscription({ subscriber: "x", kind: "file_content", factKey: "a", knownValue: "v1" });
|
|
86
|
+
const emitted = n.publishObservation({ kind: "file_content", factKey: "a", value: "v2" });
|
|
87
|
+
const notif = emitted[0];
|
|
88
|
+
const ack = n.acknowledge({ notifId: notif.notifId, subscriber: "x", restatement: "got it, v2 now" });
|
|
89
|
+
expect(ack.sig).toMatch(/^[0-9a-f]{64}$/);
|
|
90
|
+
expect(ack.restatement).toBe("got it, v2 now");
|
|
91
|
+
expect(n.isAcked(notif.notifId)).toBe(true);
|
|
92
|
+
expect(n.verifyAck(ack)).toBe(true);
|
|
93
|
+
});
|
|
94
|
+
it("verifyNotification rejects tampered notifications", () => {
|
|
95
|
+
const n = new NexusProactive();
|
|
96
|
+
n.registerSubscription({ subscriber: "x", kind: "file_content", factKey: "a", knownValue: "v1" });
|
|
97
|
+
const [notif] = n.publishObservation({ kind: "file_content", factKey: "a", value: "v2" });
|
|
98
|
+
expect(n.verifyNotification(notif)).toBe(true);
|
|
99
|
+
const tampered = { ...notif, newValue: "EVIL" };
|
|
100
|
+
expect(n.verifyNotification(tampered)).toBe(false);
|
|
101
|
+
});
|
|
102
|
+
it("vendor_score severity escalates with delta", () => {
|
|
103
|
+
const n = new NexusProactive();
|
|
104
|
+
n.registerSubscription({ subscriber: "x", kind: "vendor_score", factKey: "claude", knownValue: "0.50" });
|
|
105
|
+
n.publishObservation({ kind: "vendor_score", factKey: "claude", value: "0.51" }); // tiny
|
|
106
|
+
const small = n.drainNotifications("x");
|
|
107
|
+
expect(small[0].severity).toBeLessThanOrEqual(2);
|
|
108
|
+
n.registerSubscription({ subscriber: "y", kind: "vendor_score", factKey: "claude", knownValue: "0.50" });
|
|
109
|
+
n.publishObservation({ kind: "vendor_score", factKey: "claude", value: "0.10" }); // huge swing
|
|
110
|
+
const big = n.drainNotifications("y");
|
|
111
|
+
expect(big[0].severity).toBe(4);
|
|
112
|
+
});
|
|
113
|
+
it("soul_rule changes are severity 5 (MUST ACK)", () => {
|
|
114
|
+
const n = new NexusProactive();
|
|
115
|
+
n.registerSubscription({ subscriber: "x", kind: "soul_rule", factKey: "no-friday-deploys", knownValue: "active" });
|
|
116
|
+
const [notif] = n.publishObservation({ kind: "soul_rule", factKey: "no-friday-deploys", value: "removed" });
|
|
117
|
+
expect(notif.severity).toBe(5);
|
|
118
|
+
});
|
|
119
|
+
it("stats reports active subs + pending notifs + acks", () => {
|
|
120
|
+
const n = new NexusProactive();
|
|
121
|
+
n.registerSubscription({ subscriber: "x", kind: "file_content", factKey: "a", knownValue: "v1" });
|
|
122
|
+
n.publishObservation({ kind: "file_content", factKey: "a", value: "v2" });
|
|
123
|
+
const s = n.stats("x");
|
|
124
|
+
expect(s.activeSubs).toBe(1);
|
|
125
|
+
expect(s.pendingNotifs).toBe(1);
|
|
126
|
+
expect(s.totalAcks).toBe(0);
|
|
127
|
+
});
|
|
128
|
+
it("formatNexusLine summarises", () => {
|
|
129
|
+
const n = new NexusProactive();
|
|
130
|
+
n.registerSubscription({ subscriber: "x", kind: "file_content", factKey: "a", knownValue: "v1" });
|
|
131
|
+
const [notif] = n.publishObservation({ kind: "file_content", factKey: "a", value: "v2" });
|
|
132
|
+
expect(formatNexusLine(notif)).toContain("NEXUS");
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
//# sourceMappingURL=nexus_proactive.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nexus_proactive.test.js","sourceRoot":"","sources":["../../src/nexus_proactive/nexus_proactive.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.18.0 — MNEME ORACLE (the AI you can't sue Mneme for)
|
|
3
|
+
*
|
|
4
|
+
* "Mneme issues a signed liability certificate for any AI-proposed
|
|
5
|
+
* change that passes AURELIAN AUDIT + SOUL gate + BUG PROPHET (risk
|
|
6
|
+
* < 0.20). The certificate caps Mneme's liability at the published
|
|
7
|
+
* coverage tier; corporates pay annual premium for higher tiers.
|
|
8
|
+
* Insurance + AI provenance in one primitive."
|
|
9
|
+
*
|
|
10
|
+
* Honest scope (what ORACLE IS):
|
|
11
|
+
* 1. assessRisk — pure-function risk calculation over a proposed change
|
|
12
|
+
* 2. issueCertificate — HMAC-signed liability certificate with cap +
|
|
13
|
+
* conditions + per-incident max
|
|
14
|
+
* 3. verifyClaim — given an incident, does the certificate apply? what's
|
|
15
|
+
* the payout?
|
|
16
|
+
* 4. tierPremium — annual premium calculator (defensible reference table)
|
|
17
|
+
*
|
|
18
|
+
* Honest scope (what ORACLE IS NOT):
|
|
19
|
+
* - Not real insurance — Mneme is not an insurance carrier; the data
|
|
20
|
+
* contract is what real insurers (Lloyd's syndicates, Munich Re) use
|
|
21
|
+
* to underwrite policies. ORACLE is the *trust primitive* that makes
|
|
22
|
+
* AI insurance pricing feasible.
|
|
23
|
+
* - Not a legal opinion. Real underwriting requires actuarial review.
|
|
24
|
+
* - Not unlimited — every certificate has a cap. Cheap tiers cap low.
|
|
25
|
+
*
|
|
26
|
+
* Composes onto v2.13 AURELIAN + v2.14 SOUL + v2.15.1 BUG PROPHET.
|
|
27
|
+
* Pure orchestrator + signed receipt.
|
|
28
|
+
*/
|
|
29
|
+
declare const PROTOCOL_VERSION: 1;
|
|
30
|
+
export type CoverageTier = "starter" | "team" | "business" | "enterprise" | "sovereign";
|
|
31
|
+
export interface RiskInput {
|
|
32
|
+
/** Free-form change description. */
|
|
33
|
+
description: string;
|
|
34
|
+
/** From v2.13 AURELIAN: composite axis score 0-100; >=80 = SHIP. */
|
|
35
|
+
aurelianComposite?: number;
|
|
36
|
+
/** From v2.14 PROJECT SOUL: verdict on the change. */
|
|
37
|
+
soulVerdict?: "PASS" | "WARN" | "BLOCK";
|
|
38
|
+
/** From v2.15.1 BUG PROPHET: regression risk 0-1. */
|
|
39
|
+
bugProphetRisk?: number;
|
|
40
|
+
/** From v2.14 BOUNTY: per-vendor measured falseRateLB. */
|
|
41
|
+
vendorFalseRateLB?: number;
|
|
42
|
+
/** Optional category — adjusts cap (financial change = stricter). */
|
|
43
|
+
category?: "code" | "config" | "deploy" | "data" | "financial" | "infra" | "other";
|
|
44
|
+
}
|
|
45
|
+
export interface RiskAssessment {
|
|
46
|
+
/** 0..1 — fused regression / liability risk. */
|
|
47
|
+
riskScore: number;
|
|
48
|
+
/** Human-readable label. */
|
|
49
|
+
band: "very_low" | "low" | "medium" | "high" | "very_high";
|
|
50
|
+
/** Reasons feeding into the score. */
|
|
51
|
+
reasons: string[];
|
|
52
|
+
/** Whether this change is eligible for an ORACLE certificate. */
|
|
53
|
+
insurable: boolean;
|
|
54
|
+
}
|
|
55
|
+
export declare function assessRisk(input: RiskInput): RiskAssessment;
|
|
56
|
+
export interface CertificateInput {
|
|
57
|
+
/** Subscriber identity (e.g., "acme-corp"). */
|
|
58
|
+
subscriber: string;
|
|
59
|
+
/** Coverage tier; determines premium + cap. */
|
|
60
|
+
tier: CoverageTier;
|
|
61
|
+
/** The change being insured. */
|
|
62
|
+
change: RiskInput;
|
|
63
|
+
/** Optional issuance time. */
|
|
64
|
+
issuedAt?: string;
|
|
65
|
+
/** Validity in days; defaults to 30 (per-change certs are short-lived). */
|
|
66
|
+
validityDays?: number;
|
|
67
|
+
secret?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface LiabilityCertificate {
|
|
70
|
+
v: typeof PROTOCOL_VERSION;
|
|
71
|
+
certId: string;
|
|
72
|
+
subscriber: string;
|
|
73
|
+
tier: CoverageTier;
|
|
74
|
+
/** Maximum payout for any single incident under this cert (USD). */
|
|
75
|
+
perIncidentCapUsd: number;
|
|
76
|
+
/** Aggregate cap across all certs in the policy year (USD). */
|
|
77
|
+
annualAggregateCapUsd: number;
|
|
78
|
+
/** Risk assessment that authorised the cert. */
|
|
79
|
+
risk: RiskAssessment;
|
|
80
|
+
/** Issuance / expiry. */
|
|
81
|
+
issuedAt: string;
|
|
82
|
+
validUntil: string;
|
|
83
|
+
/** Conditions that void the cert if breached. */
|
|
84
|
+
conditions: string[];
|
|
85
|
+
/** HMAC over the canonical body. */
|
|
86
|
+
sig: string;
|
|
87
|
+
}
|
|
88
|
+
export declare function issueCertificate(input: CertificateInput): {
|
|
89
|
+
issued: LiabilityCertificate | null;
|
|
90
|
+
reason?: string;
|
|
91
|
+
};
|
|
92
|
+
export declare function verifyCertificate(cert: LiabilityCertificate, secret?: string): {
|
|
93
|
+
ok: boolean;
|
|
94
|
+
expired: boolean;
|
|
95
|
+
reason?: string;
|
|
96
|
+
};
|
|
97
|
+
export interface ClaimInput {
|
|
98
|
+
cert: LiabilityCertificate;
|
|
99
|
+
/** Estimated incident loss in USD. */
|
|
100
|
+
estimatedLossUsd: number;
|
|
101
|
+
/** Brief description of what went wrong. */
|
|
102
|
+
incidentDescription: string;
|
|
103
|
+
/** Did any of the cert's conditions get violated? */
|
|
104
|
+
conditionsBreached?: string[];
|
|
105
|
+
/** Aggregate already paid out under the subscriber's policy year. */
|
|
106
|
+
aggregatePaidYtdUsd?: number;
|
|
107
|
+
secret?: string;
|
|
108
|
+
}
|
|
109
|
+
export interface ClaimDecision {
|
|
110
|
+
v: typeof PROTOCOL_VERSION;
|
|
111
|
+
certId: string;
|
|
112
|
+
decision: "approved" | "partial" | "denied";
|
|
113
|
+
payoutUsd: number;
|
|
114
|
+
reasons: string[];
|
|
115
|
+
decidedAt: string;
|
|
116
|
+
sig: string;
|
|
117
|
+
}
|
|
118
|
+
export declare function decideClaim(input: ClaimInput): ClaimDecision;
|
|
119
|
+
export declare function tierPremiumUsd(tier: CoverageTier): number;
|
|
120
|
+
export declare function formatOracleLine(c: LiabilityCertificate): string;
|
|
121
|
+
export {};
|
|
122
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/oracle_liability/index.ts"],"names":[],"mappings":"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"}
|