@mneme-ai/core 2.17.1 → 2.19.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.
Files changed (89) hide show
  1. package/dist/agent_manifest.d.ts +1 -1
  2. package/dist/agent_manifest.d.ts.map +1 -1
  3. package/dist/agent_manifest.js +24 -1
  4. package/dist/agent_manifest.js.map +1 -1
  5. package/dist/arena/arena.test.d.ts +2 -0
  6. package/dist/arena/arena.test.d.ts.map +1 -0
  7. package/dist/arena/arena.test.js +107 -0
  8. package/dist/arena/arena.test.js.map +1 -0
  9. package/dist/arena/index.d.ts +114 -0
  10. package/dist/arena/index.d.ts.map +1 -0
  11. package/dist/arena/index.js +158 -0
  12. package/dist/arena/index.js.map +1 -0
  13. package/dist/confessional/confessional.test.d.ts +2 -0
  14. package/dist/confessional/confessional.test.d.ts.map +1 -0
  15. package/dist/confessional/confessional.test.js +136 -0
  16. package/dist/confessional/confessional.test.js.map +1 -0
  17. package/dist/confessional/index.d.ts +72 -0
  18. package/dist/confessional/index.d.ts.map +1 -0
  19. package/dist/confessional/index.js +137 -0
  20. package/dist/confessional/index.js.map +1 -0
  21. package/dist/cosmic/aurelian_v218.test.d.ts +2 -0
  22. package/dist/cosmic/aurelian_v218.test.d.ts.map +1 -0
  23. package/dist/cosmic/aurelian_v218.test.js +68 -0
  24. package/dist/cosmic/aurelian_v218.test.js.map +1 -0
  25. package/dist/cosmic/aurelian_v219.test.d.ts +2 -0
  26. package/dist/cosmic/aurelian_v219.test.d.ts.map +1 -0
  27. package/dist/cosmic/aurelian_v219.test.js +80 -0
  28. package/dist/cosmic/aurelian_v219.test.js.map +1 -0
  29. package/dist/index.d.ts +9 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +20 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/insurance_market/index.d.ts +77 -0
  34. package/dist/insurance_market/index.d.ts.map +1 -0
  35. package/dist/insurance_market/index.js +131 -0
  36. package/dist/insurance_market/index.js.map +1 -0
  37. package/dist/insurance_market/insurance_market.test.d.ts +2 -0
  38. package/dist/insurance_market/insurance_market.test.d.ts.map +1 -0
  39. package/dist/insurance_market/insurance_market.test.js +78 -0
  40. package/dist/insurance_market/insurance_market.test.js.map +1 -0
  41. package/dist/nexus_proactive/index.d.ts +134 -0
  42. package/dist/nexus_proactive/index.d.ts.map +1 -0
  43. package/dist/nexus_proactive/index.js +277 -0
  44. package/dist/nexus_proactive/index.js.map +1 -0
  45. package/dist/nexus_proactive/nexus_proactive.test.d.ts +2 -0
  46. package/dist/nexus_proactive/nexus_proactive.test.d.ts.map +1 -0
  47. package/dist/nexus_proactive/nexus_proactive.test.js +135 -0
  48. package/dist/nexus_proactive/nexus_proactive.test.js.map +1 -0
  49. package/dist/oracle_liability/index.d.ts +122 -0
  50. package/dist/oracle_liability/index.d.ts.map +1 -0
  51. package/dist/oracle_liability/index.js +203 -0
  52. package/dist/oracle_liability/index.js.map +1 -0
  53. package/dist/oracle_liability/oracle_liability.test.d.ts +2 -0
  54. package/dist/oracle_liability/oracle_liability.test.d.ts.map +1 -0
  55. package/dist/oracle_liability/oracle_liability.test.js +186 -0
  56. package/dist/oracle_liability/oracle_liability.test.js.map +1 -0
  57. package/dist/trinity_vote/index.d.ts +86 -0
  58. package/dist/trinity_vote/index.d.ts.map +1 -0
  59. package/dist/trinity_vote/index.js +173 -0
  60. package/dist/trinity_vote/index.js.map +1 -0
  61. package/dist/trinity_vote/trinity_vote.test.d.ts +2 -0
  62. package/dist/trinity_vote/trinity_vote.test.d.ts.map +1 -0
  63. package/dist/trinity_vote/trinity_vote.test.js +137 -0
  64. package/dist/trinity_vote/trinity_vote.test.js.map +1 -0
  65. package/dist/vendor_boomerang/index.d.ts +106 -0
  66. package/dist/vendor_boomerang/index.d.ts.map +1 -0
  67. package/dist/vendor_boomerang/index.js +167 -0
  68. package/dist/vendor_boomerang/index.js.map +1 -0
  69. package/dist/vendor_boomerang/vendor_boomerang.test.d.ts +2 -0
  70. package/dist/vendor_boomerang/vendor_boomerang.test.d.ts.map +1 -0
  71. package/dist/vendor_boomerang/vendor_boomerang.test.js +102 -0
  72. package/dist/vendor_boomerang/vendor_boomerang.test.js.map +1 -0
  73. package/dist/vendor_ghost/index.d.ts +93 -0
  74. package/dist/vendor_ghost/index.d.ts.map +1 -0
  75. package/dist/vendor_ghost/index.js +206 -0
  76. package/dist/vendor_ghost/index.js.map +1 -0
  77. package/dist/vendor_ghost/vendor_ghost.test.d.ts +2 -0
  78. package/dist/vendor_ghost/vendor_ghost.test.d.ts.map +1 -0
  79. package/dist/vendor_ghost/vendor_ghost.test.js +93 -0
  80. package/dist/vendor_ghost/vendor_ghost.test.js.map +1 -0
  81. package/dist/verified_badge/index.d.ts +78 -0
  82. package/dist/verified_badge/index.d.ts.map +1 -0
  83. package/dist/verified_badge/index.js +131 -0
  84. package/dist/verified_badge/index.js.map +1 -0
  85. package/dist/verified_badge/verified_badge.test.d.ts +2 -0
  86. package/dist/verified_badge/verified_badge.test.d.ts.map +1 -0
  87. package/dist/verified_badge/verified_badge.test.js +88 -0
  88. package/dist/verified_badge/verified_badge.test.js.map +1 -0
  89. package/package.json +1 -1
@@ -0,0 +1,134 @@
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
+ declare const PROTOCOL_VERSION: 1;
42
+ export type SubscriptionKind = "file_content" | "symbol_location" | "stat_threshold" | "vendor_score" | "soul_rule";
43
+ export interface Subscription {
44
+ v: typeof PROTOCOL_VERSION;
45
+ subId: string;
46
+ subscriber: string;
47
+ kind: SubscriptionKind;
48
+ /** Stable identifier for the fact (path, symbol name, metric key). */
49
+ factKey: string;
50
+ /** The value the AI is currently relying on. */
51
+ knownValue: string;
52
+ registeredAt: string;
53
+ /** TTL — subscriptions auto-expire to keep the queue bounded. */
54
+ expiresAt: string;
55
+ sig: string;
56
+ }
57
+ export interface Observation {
58
+ kind: SubscriptionKind;
59
+ factKey: string;
60
+ /** Observed value at this instant. */
61
+ value: string;
62
+ observedAt?: string;
63
+ }
64
+ export type NotificationKind = "stale_claim" | "subscription_expired" | "consensus_shift";
65
+ export interface Notification {
66
+ v: typeof PROTOCOL_VERSION;
67
+ notifId: string;
68
+ subId: string;
69
+ subscriber: string;
70
+ kind: NotificationKind;
71
+ factKey: string;
72
+ oldValue: string;
73
+ newValue: string;
74
+ /** Severity 1..5; >=4 means the AI MUST ACK before continuing. */
75
+ severity: 1 | 2 | 3 | 4 | 5;
76
+ emittedAt: string;
77
+ /** Monotonic sequence per subscriber — gap detection for missed notifications. */
78
+ seq: number;
79
+ message: string;
80
+ sig: string;
81
+ }
82
+ export interface AckRecord {
83
+ v: typeof PROTOCOL_VERSION;
84
+ notifId: string;
85
+ subscriber: string;
86
+ ackedAt: string;
87
+ /** Optional: AI's brief restated understanding so we know it really updated. */
88
+ restatement?: string;
89
+ sig: string;
90
+ }
91
+ /**
92
+ * Pure in-memory NEXUS instance. Real deployments persist subscriptions
93
+ * + queued notifications to .mneme/nexus.jsonl; this class is the
94
+ * arithmetic — caller chooses durability.
95
+ */
96
+ export declare class NexusProactive {
97
+ private subs;
98
+ private queue;
99
+ private acks;
100
+ private seq;
101
+ private secret;
102
+ constructor(secret?: string);
103
+ registerSubscription(input: {
104
+ subscriber: string;
105
+ kind: SubscriptionKind;
106
+ factKey: string;
107
+ knownValue: string;
108
+ ttlSeconds?: number;
109
+ nowMs?: number;
110
+ }): Subscription;
111
+ publishObservation(obs: Observation, nowMs?: number): Notification[];
112
+ drainNotifications(subscriber: string, nowMs?: number): Notification[];
113
+ acknowledge(input: {
114
+ notifId: string;
115
+ subscriber: string;
116
+ restatement?: string;
117
+ nowMs?: number;
118
+ }): AckRecord;
119
+ isAcked(notifId: string): boolean;
120
+ /** Verify a notification we received from the wire. */
121
+ verifyNotification(n: Notification): boolean;
122
+ /** Verify an ack receipt. */
123
+ verifyAck(a: AckRecord): boolean;
124
+ /** Stats for pulse / dashboard. */
125
+ stats(subscriber?: string): {
126
+ activeSubs: number;
127
+ pendingNotifs: number;
128
+ totalAcks: number;
129
+ };
130
+ }
131
+ export declare function formatNexusLine(n: Notification): string;
132
+ export declare function defaultNexus(): NexusProactive;
133
+ export {};
134
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nexus_proactive/index.ts"],"names":[],"mappings":"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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=nexus_proactive.test.d.ts.map
@@ -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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"}