@mnemopay/sdk 0.9.3 → 1.0.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.
@@ -0,0 +1,451 @@
1
+ "use strict";
2
+ /**
3
+ * Streaming Anomaly Detection — Real-Time Agent Behavior Monitoring
4
+ *
5
+ * Two complementary systems:
6
+ *
7
+ * 1. EWMA (Exponentially Weighted Moving Average) Detector
8
+ * - Tracks running mean and variance of any metric stream
9
+ * - Alerts when value exceeds k standard deviations from moving average
10
+ * - Formula: mu_t = alpha * x_t + (1 - alpha) * mu_{t-1}
11
+ * - O(1) per update, no windowing needed, no buffer overflow
12
+ *
13
+ * 2. Behavioral Fingerprint Monitor
14
+ * - Tracks multi-dimensional behavioral profile of each agent
15
+ * - Detects sudden behavioral shifts (hijacked agent, credential theft)
16
+ * - Uses Mahalanobis distance for multivariate anomaly scoring
17
+ * - Gartner 2026: behavioral fingerprinting reduces impersonation 70%
18
+ *
19
+ * 3. Canary Transaction System
20
+ * - Plants honeypot transactions that should never be accessed
21
+ * - If an agent touches a canary, it's compromised
22
+ * - Inspired by Snare (GitHub) canary credential framework
23
+ *
24
+ * References:
25
+ * - Roberts, S.W. (1959). "Control Chart Tests Based on EWMA"
26
+ * - Lucas & Saccucci (1990). "EWMA Control Chart Properties"
27
+ * - Mahalanobis (1936). "On the Generalized Distance in Statistics"
28
+ * - MnemoPay Master Strategy, Part 2.1 — EWMA + behavioral fingerprinting
29
+ */
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.CanarySystem = exports.BehaviorMonitor = exports.EWMADetector = exports.DEFAULT_ANOMALY_CONFIG = void 0;
32
+ exports.DEFAULT_ANOMALY_CONFIG = {
33
+ alpha: 0.15,
34
+ warningThreshold: 2.5,
35
+ criticalThreshold: 3.5,
36
+ warmupPeriod: 10,
37
+ trackedFeatures: [
38
+ "amount", "hourOfDay", "timeBetweenTx", "chargesPerHour",
39
+ "avgAmount", "amountVariance", "counterpartyCount", "memoryOpsPerTx",
40
+ ],
41
+ hijackFeatureThreshold: 0.4,
42
+ maxCanaries: 5,
43
+ };
44
+ // ─── EWMA Detector ──────────────────────────────────────────────────────────
45
+ class EWMADetector {
46
+ mean = 0;
47
+ variance = 0;
48
+ count = 0;
49
+ lastValue = 0;
50
+ alpha;
51
+ warningK;
52
+ criticalK;
53
+ warmup;
54
+ constructor(alpha = 0.15, warningK = 2.5, criticalK = 3.5, warmup = 10) {
55
+ if (alpha <= 0 || alpha >= 1)
56
+ throw new Error("Alpha must be in (0, 1)");
57
+ if (warningK <= 0)
58
+ throw new Error("Warning threshold must be positive");
59
+ if (criticalK <= warningK)
60
+ throw new Error("Critical threshold must exceed warning threshold");
61
+ if (warmup < 1)
62
+ throw new Error("Warmup period must be at least 1");
63
+ this.alpha = alpha;
64
+ this.warningK = warningK;
65
+ this.criticalK = criticalK;
66
+ this.warmup = warmup;
67
+ }
68
+ /**
69
+ * Update the detector with a new observation.
70
+ * Returns anomaly assessment.
71
+ *
72
+ * EWMA formulas:
73
+ * mu_t = alpha * x_t + (1 - alpha) * mu_{t-1}
74
+ * sigma_t^2 = alpha * (x_t - mu_t)^2 + (1 - alpha) * sigma_{t-1}^2
75
+ * Alert when: |x_t - mu_t| > k * sigma_t
76
+ */
77
+ update(value) {
78
+ if (typeof value !== "number" || !Number.isFinite(value)) {
79
+ throw new Error("EWMA value must be a finite number");
80
+ }
81
+ this.count++;
82
+ this.lastValue = value;
83
+ if (this.count === 1) {
84
+ // First observation: initialize
85
+ this.mean = value;
86
+ this.variance = 0;
87
+ return this._makeAlert(value, 0, "none");
88
+ }
89
+ // Update mean (EWMA)
90
+ const prevMean = this.mean;
91
+ this.mean = this.alpha * value + (1 - this.alpha) * prevMean;
92
+ // Update variance (EWMA of squared deviations)
93
+ const deviation = value - this.mean;
94
+ this.variance = this.alpha * (deviation * deviation) + (1 - this.alpha) * this.variance;
95
+ // Z-score
96
+ const stdDev = Math.sqrt(this.variance);
97
+ const zScore = stdDev > 1e-10 ? Math.abs(value - this.mean) / stdDev : 0;
98
+ // Don't alert during warmup
99
+ if (this.count < this.warmup) {
100
+ return this._makeAlert(value, zScore, "none");
101
+ }
102
+ // Classify severity
103
+ let severity = "none";
104
+ if (zScore >= this.criticalK)
105
+ severity = "critical";
106
+ else if (zScore >= this.warningK)
107
+ severity = "warning";
108
+ return this._makeAlert(value, zScore, severity);
109
+ }
110
+ _makeAlert(value, zScore, severity) {
111
+ return {
112
+ anomaly: severity !== "none",
113
+ value,
114
+ mean: Math.round(this.mean * 10000) / 10000,
115
+ stdDev: Math.round(Math.sqrt(this.variance) * 10000) / 10000,
116
+ zScore: Math.round(zScore * 1000) / 1000,
117
+ severity,
118
+ timestamp: Date.now(),
119
+ };
120
+ }
121
+ /** Get current state */
122
+ getState() {
123
+ return {
124
+ mean: this.mean,
125
+ variance: this.variance,
126
+ stdDev: Math.sqrt(this.variance),
127
+ count: this.count,
128
+ lastValue: this.lastValue,
129
+ warmedUp: this.count >= this.warmup,
130
+ };
131
+ }
132
+ /** Reset the detector */
133
+ reset() {
134
+ this.mean = 0;
135
+ this.variance = 0;
136
+ this.count = 0;
137
+ this.lastValue = 0;
138
+ }
139
+ /** Serialize for persistence */
140
+ serialize() {
141
+ return { mean: this.mean, variance: this.variance, count: this.count, lastValue: this.lastValue };
142
+ }
143
+ /** Restore from serialized state */
144
+ restore(state) {
145
+ if (typeof state.mean !== "number" || !Number.isFinite(state.mean))
146
+ throw new Error("Invalid mean");
147
+ if (typeof state.variance !== "number" || !Number.isFinite(state.variance) || state.variance < 0)
148
+ throw new Error("Invalid variance");
149
+ if (typeof state.count !== "number" || state.count < 0)
150
+ throw new Error("Invalid count");
151
+ this.mean = state.mean;
152
+ this.variance = state.variance;
153
+ this.count = Math.floor(state.count);
154
+ this.lastValue = state.lastValue ?? 0;
155
+ }
156
+ }
157
+ exports.EWMADetector = EWMADetector;
158
+ // ─── Behavioral Fingerprint Monitor ─────────────────────────────────────────
159
+ class BehaviorMonitor {
160
+ fingerprints = new Map();
161
+ observationCounts = new Map();
162
+ lastObserved = new Map();
163
+ config;
164
+ /** Max agents to track before evicting oldest inactive. Prevents unbounded memory growth. */
165
+ static MAX_AGENTS = 10_000;
166
+ constructor(config) {
167
+ this.config = { ...exports.DEFAULT_ANOMALY_CONFIG, ...config };
168
+ }
169
+ /**
170
+ * Observe agent behavior. Updates the behavioral fingerprint.
171
+ * Returns hijack detection result.
172
+ */
173
+ observe(agentId, features) {
174
+ if (!agentId || typeof agentId !== "string")
175
+ throw new Error("agentId is required");
176
+ if (!features || typeof features !== "object")
177
+ throw new Error("features must be an object");
178
+ // Initialize fingerprint for new agents
179
+ if (!this.fingerprints.has(agentId)) {
180
+ // Evict oldest inactive agent if at capacity (prevents unbounded memory growth)
181
+ if (this.fingerprints.size >= BehaviorMonitor.MAX_AGENTS) {
182
+ let oldestId = null;
183
+ let oldestTime = Infinity;
184
+ for (const [id, time] of this.lastObserved) {
185
+ if (time < oldestTime) {
186
+ oldestTime = time;
187
+ oldestId = id;
188
+ }
189
+ }
190
+ if (oldestId)
191
+ this.removeAgent(oldestId);
192
+ }
193
+ this.fingerprints.set(agentId, new Map());
194
+ this.observationCounts.set(agentId, 0);
195
+ }
196
+ const detectors = this.fingerprints.get(agentId);
197
+ const count = (this.observationCounts.get(agentId) ?? 0) + 1;
198
+ this.observationCounts.set(agentId, count);
199
+ this.lastObserved.set(agentId, Date.now());
200
+ const details = {};
201
+ let anomalousCount = 0;
202
+ let totalFeatures = 0;
203
+ for (const feature of this.config.trackedFeatures) {
204
+ const value = features[feature];
205
+ if (value === undefined || typeof value !== "number" || !Number.isFinite(value))
206
+ continue;
207
+ totalFeatures++;
208
+ // Create detector for this feature if needed
209
+ if (!detectors.has(feature)) {
210
+ detectors.set(feature, new EWMADetector(this.config.alpha, this.config.warningThreshold, this.config.criticalThreshold, this.config.warmupPeriod));
211
+ }
212
+ const alert = detectors.get(feature).update(value);
213
+ details[feature] = { zScore: alert.zScore, anomalous: alert.anomaly };
214
+ if (alert.anomaly)
215
+ anomalousCount++;
216
+ }
217
+ // Hijack scoring: fraction of anomalous features
218
+ const anomalyScore = totalFeatures > 0 ? anomalousCount / totalFeatures : 0;
219
+ const suspected = anomalyScore >= this.config.hijackFeatureThreshold && count >= this.config.warmupPeriod;
220
+ let severity = "none";
221
+ if (suspected && anomalyScore >= 0.8)
222
+ severity = "critical";
223
+ else if (suspected && anomalyScore >= 0.6)
224
+ severity = "high";
225
+ else if (suspected)
226
+ severity = "medium";
227
+ else if (anomalousCount > 0)
228
+ severity = "low";
229
+ let recommendation;
230
+ if (severity === "critical") {
231
+ recommendation = `CRITICAL: ${anomalousCount}/${totalFeatures} behavioral features deviant. Agent ${agentId} may be compromised. Recommended: suspend transactions, require re-authentication.`;
232
+ }
233
+ else if (severity === "high") {
234
+ recommendation = `HIGH RISK: ${anomalousCount}/${totalFeatures} features anomalous. Increase monitoring. Consider HITL approval for large transactions.`;
235
+ }
236
+ else if (severity === "medium") {
237
+ recommendation = `ELEVATED: Some behavioral deviation detected. Monitor closely.`;
238
+ }
239
+ else if (severity === "low") {
240
+ recommendation = `Minor deviations detected. Within acceptable range.`;
241
+ }
242
+ else {
243
+ recommendation = `Behavior consistent with established profile.`;
244
+ }
245
+ return {
246
+ suspected,
247
+ anomalyScore: Math.round(anomalyScore * 1000) / 1000,
248
+ anomalousFeatures: anomalousCount,
249
+ totalFeatures,
250
+ details,
251
+ severity,
252
+ recommendation,
253
+ };
254
+ }
255
+ /**
256
+ * Get the behavioral fingerprint for an agent.
257
+ */
258
+ getFingerprint(agentId) {
259
+ const detectors = this.fingerprints.get(agentId);
260
+ if (!detectors)
261
+ return null;
262
+ const features = {};
263
+ for (const [name, detector] of detectors) {
264
+ features[name] = detector.getState();
265
+ }
266
+ const observations = this.observationCounts.get(agentId) ?? 0;
267
+ return {
268
+ agentId,
269
+ features,
270
+ observations,
271
+ established: observations >= this.config.warmupPeriod,
272
+ lastObserved: this.lastObserved.get(agentId) ?? 0,
273
+ };
274
+ }
275
+ /**
276
+ * Remove an agent's fingerprint (on agent deletion).
277
+ */
278
+ removeAgent(agentId) {
279
+ const existed = this.fingerprints.has(agentId);
280
+ this.fingerprints.delete(agentId);
281
+ this.observationCounts.delete(agentId);
282
+ this.lastObserved.delete(agentId);
283
+ return existed;
284
+ }
285
+ /** Number of agents being monitored */
286
+ get agentCount() {
287
+ return this.fingerprints.size;
288
+ }
289
+ /** Serialize for persistence */
290
+ serialize() {
291
+ const result = {};
292
+ for (const [agentId, detectors] of this.fingerprints) {
293
+ const features = {};
294
+ for (const [name, detector] of detectors) {
295
+ features[name] = detector.serialize();
296
+ }
297
+ result[agentId] = {
298
+ features,
299
+ count: this.observationCounts.get(agentId) ?? 0,
300
+ lastObserved: this.lastObserved.get(agentId) ?? 0,
301
+ };
302
+ }
303
+ return result;
304
+ }
305
+ /** Deserialize with validation */
306
+ static deserialize(data, config) {
307
+ const monitor = new BehaviorMonitor(config);
308
+ if (!data || typeof data !== "object")
309
+ return monitor;
310
+ for (const [agentId, agentData] of Object.entries(data)) {
311
+ if (!agentData || typeof agentData !== "object")
312
+ continue;
313
+ const detectors = new Map();
314
+ if (agentData.features && typeof agentData.features === "object") {
315
+ for (const [feature, state] of Object.entries(agentData.features)) {
316
+ try {
317
+ const detector = new EWMADetector(monitor.config.alpha, monitor.config.warningThreshold, monitor.config.criticalThreshold, monitor.config.warmupPeriod);
318
+ detector.restore(state);
319
+ detectors.set(feature, detector);
320
+ }
321
+ catch {
322
+ // Skip corrupted feature data
323
+ }
324
+ }
325
+ }
326
+ monitor.fingerprints.set(agentId, detectors);
327
+ monitor.observationCounts.set(agentId, typeof agentData.count === "number" ? agentData.count : 0);
328
+ monitor.lastObserved.set(agentId, typeof agentData.lastObserved === "number" ? agentData.lastObserved : 0);
329
+ }
330
+ return monitor;
331
+ }
332
+ }
333
+ exports.BehaviorMonitor = BehaviorMonitor;
334
+ // ─── Canary Transaction System ──────────────────────────────────────────────
335
+ class CanarySystem {
336
+ canaries = new Map();
337
+ alerts = [];
338
+ maxCanaries;
339
+ static MAX_ALERTS = 100;
340
+ constructor(maxCanaries = 5) {
341
+ if (maxCanaries < 1 || maxCanaries > 50)
342
+ throw new Error("maxCanaries must be 1-50");
343
+ this.maxCanaries = maxCanaries;
344
+ }
345
+ /**
346
+ * Plant a canary transaction.
347
+ * Returns the canary ID. Store this — never expose to the agent.
348
+ */
349
+ plant(type = "transaction") {
350
+ if (this.canaries.size >= this.maxCanaries) {
351
+ // Remove oldest untriggered canary
352
+ let oldest = null;
353
+ for (const c of this.canaries.values()) {
354
+ if (!c.triggered && (!oldest || c.plantedAt < oldest.plantedAt)) {
355
+ oldest = c;
356
+ }
357
+ }
358
+ if (oldest)
359
+ this.canaries.delete(oldest.id);
360
+ }
361
+ // Use crypto.randomUUID when available for unpredictable canary IDs
362
+ // A compromised agent that can predict canary IDs can avoid traps
363
+ let randomSuffix;
364
+ try {
365
+ randomSuffix = require("crypto").randomBytes(6).toString("hex");
366
+ }
367
+ catch {
368
+ randomSuffix = Math.random().toString(36).slice(2, 8);
369
+ }
370
+ const canary = {
371
+ id: `canary-${Date.now()}-${randomSuffix}`,
372
+ amount: Math.round((Math.random() * 99 + 1) * 100) / 100, // $1-100
373
+ type,
374
+ plantedAt: Date.now(),
375
+ triggered: false,
376
+ };
377
+ this.canaries.set(canary.id, canary);
378
+ return canary;
379
+ }
380
+ /**
381
+ * Check if an ID matches a canary. If yes, the agent is compromised.
382
+ * This should be called on every transaction/memory access.
383
+ */
384
+ check(id, agentId) {
385
+ const canary = this.canaries.get(id);
386
+ if (!canary)
387
+ return null;
388
+ // TRIGGERED — agent accessed a honeypot
389
+ canary.triggered = true;
390
+ canary.triggeredAt = Date.now();
391
+ canary.triggeredBy = agentId;
392
+ const alert = {
393
+ canary: { ...canary },
394
+ agentId,
395
+ severity: "critical",
396
+ message: `CANARY TRIGGERED: Agent ${agentId} accessed ${canary.type} canary "${canary.id}". This agent may be compromised. Canary was planted ${Math.round((Date.now() - canary.plantedAt) / 60000)} minutes ago.`,
397
+ timestamp: Date.now(),
398
+ };
399
+ this.alerts.push(alert);
400
+ if (this.alerts.length > CanarySystem.MAX_ALERTS) {
401
+ this.alerts.splice(0, this.alerts.length - CanarySystem.MAX_ALERTS);
402
+ }
403
+ return alert;
404
+ }
405
+ /** Check if any ID in a list matches a canary */
406
+ checkBatch(ids, agentId) {
407
+ const alerts = [];
408
+ for (const id of ids) {
409
+ const alert = this.check(id, agentId);
410
+ if (alert)
411
+ alerts.push(alert);
412
+ }
413
+ return alerts;
414
+ }
415
+ /** Get all alerts */
416
+ getAlerts() {
417
+ return [...this.alerts];
418
+ }
419
+ /** Get all active (untriggered) canaries */
420
+ getActiveCanaries() {
421
+ return Array.from(this.canaries.values()).filter(c => !c.triggered);
422
+ }
423
+ /** Check if a specific canary ID exists (for internal use only) */
424
+ isCanary(id) {
425
+ return this.canaries.has(id);
426
+ }
427
+ /** Serialize for persistence */
428
+ serialize() {
429
+ return {
430
+ canaries: Array.from(this.canaries.values()),
431
+ alerts: [...this.alerts],
432
+ };
433
+ }
434
+ /** Deserialize with validation */
435
+ static deserialize(data, maxCanaries) {
436
+ const system = new CanarySystem(maxCanaries);
437
+ if (Array.isArray(data.canaries)) {
438
+ for (const c of data.canaries) {
439
+ if (c.id && typeof c.amount === "number" && Number.isFinite(c.amount)) {
440
+ system.canaries.set(c.id, { ...c });
441
+ }
442
+ }
443
+ }
444
+ if (Array.isArray(data.alerts)) {
445
+ system.alerts = data.alerts.slice(-CanarySystem.MAX_ALERTS);
446
+ }
447
+ return system;
448
+ }
449
+ }
450
+ exports.CanarySystem = CanarySystem;
451
+ //# sourceMappingURL=anomaly.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anomaly.js","sourceRoot":"","sources":["../src/anomaly.ts"],"names":[],"mappings":"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"}