@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.
- package/README.md +222 -158
- package/dist/anomaly.d.ts +242 -0
- package/dist/anomaly.d.ts.map +1 -0
- package/dist/anomaly.js +451 -0
- package/dist/anomaly.js.map +1 -0
- package/dist/behavioral.d.ts +253 -0
- package/dist/behavioral.d.ts.map +1 -0
- package/dist/behavioral.js +560 -0
- package/dist/behavioral.js.map +1 -0
- package/dist/fico.d.ts +136 -0
- package/dist/fico.d.ts.map +1 -0
- package/dist/fico.js +424 -0
- package/dist/fico.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -3
- package/dist/index.js.map +1 -1
- package/dist/integrity.d.ts +167 -0
- package/dist/integrity.d.ts.map +1 -0
- package/dist/integrity.js +401 -0
- package/dist/integrity.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +154 -2
- package/dist/mcp/server.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming Anomaly Detection — Real-Time Agent Behavior Monitoring
|
|
3
|
+
*
|
|
4
|
+
* Two complementary systems:
|
|
5
|
+
*
|
|
6
|
+
* 1. EWMA (Exponentially Weighted Moving Average) Detector
|
|
7
|
+
* - Tracks running mean and variance of any metric stream
|
|
8
|
+
* - Alerts when value exceeds k standard deviations from moving average
|
|
9
|
+
* - Formula: mu_t = alpha * x_t + (1 - alpha) * mu_{t-1}
|
|
10
|
+
* - O(1) per update, no windowing needed, no buffer overflow
|
|
11
|
+
*
|
|
12
|
+
* 2. Behavioral Fingerprint Monitor
|
|
13
|
+
* - Tracks multi-dimensional behavioral profile of each agent
|
|
14
|
+
* - Detects sudden behavioral shifts (hijacked agent, credential theft)
|
|
15
|
+
* - Uses Mahalanobis distance for multivariate anomaly scoring
|
|
16
|
+
* - Gartner 2026: behavioral fingerprinting reduces impersonation 70%
|
|
17
|
+
*
|
|
18
|
+
* 3. Canary Transaction System
|
|
19
|
+
* - Plants honeypot transactions that should never be accessed
|
|
20
|
+
* - If an agent touches a canary, it's compromised
|
|
21
|
+
* - Inspired by Snare (GitHub) canary credential framework
|
|
22
|
+
*
|
|
23
|
+
* References:
|
|
24
|
+
* - Roberts, S.W. (1959). "Control Chart Tests Based on EWMA"
|
|
25
|
+
* - Lucas & Saccucci (1990). "EWMA Control Chart Properties"
|
|
26
|
+
* - Mahalanobis (1936). "On the Generalized Distance in Statistics"
|
|
27
|
+
* - MnemoPay Master Strategy, Part 2.1 — EWMA + behavioral fingerprinting
|
|
28
|
+
*/
|
|
29
|
+
export interface EWMAState {
|
|
30
|
+
/** Running mean */
|
|
31
|
+
mean: number;
|
|
32
|
+
/** Running variance */
|
|
33
|
+
variance: number;
|
|
34
|
+
/** Running standard deviation */
|
|
35
|
+
stdDev: number;
|
|
36
|
+
/** Number of observations */
|
|
37
|
+
count: number;
|
|
38
|
+
/** Last observed value */
|
|
39
|
+
lastValue: number;
|
|
40
|
+
/** Whether the detector has enough data to be reliable */
|
|
41
|
+
warmedUp: boolean;
|
|
42
|
+
}
|
|
43
|
+
export interface EWMAAlert {
|
|
44
|
+
/** Whether this observation is anomalous */
|
|
45
|
+
anomaly: boolean;
|
|
46
|
+
/** Current value */
|
|
47
|
+
value: number;
|
|
48
|
+
/** Current mean */
|
|
49
|
+
mean: number;
|
|
50
|
+
/** Current std dev */
|
|
51
|
+
stdDev: number;
|
|
52
|
+
/** Z-score: how many std devs from mean */
|
|
53
|
+
zScore: number;
|
|
54
|
+
/** Alert severity */
|
|
55
|
+
severity: "none" | "warning" | "critical";
|
|
56
|
+
/** Timestamp */
|
|
57
|
+
timestamp: number;
|
|
58
|
+
}
|
|
59
|
+
export interface BehaviorFingerprint {
|
|
60
|
+
/** Agent ID */
|
|
61
|
+
agentId: string;
|
|
62
|
+
/** Per-feature EWMA trackers */
|
|
63
|
+
features: Record<string, EWMAState>;
|
|
64
|
+
/** Number of observations used to build fingerprint */
|
|
65
|
+
observations: number;
|
|
66
|
+
/** Whether the fingerprint is established (>= warmupPeriod observations) */
|
|
67
|
+
established: boolean;
|
|
68
|
+
/** Last observation timestamp */
|
|
69
|
+
lastObserved: number;
|
|
70
|
+
}
|
|
71
|
+
export interface HijackDetection {
|
|
72
|
+
/** Whether hijack is suspected */
|
|
73
|
+
suspected: boolean;
|
|
74
|
+
/** Overall anomaly score (0-1, higher = more anomalous) */
|
|
75
|
+
anomalyScore: number;
|
|
76
|
+
/** Number of features that are anomalous */
|
|
77
|
+
anomalousFeatures: number;
|
|
78
|
+
/** Total features tracked */
|
|
79
|
+
totalFeatures: number;
|
|
80
|
+
/** Per-feature anomaly details */
|
|
81
|
+
details: Record<string, {
|
|
82
|
+
zScore: number;
|
|
83
|
+
anomalous: boolean;
|
|
84
|
+
}>;
|
|
85
|
+
/** Severity assessment */
|
|
86
|
+
severity: "none" | "low" | "medium" | "high" | "critical";
|
|
87
|
+
/** Recommendation */
|
|
88
|
+
recommendation: string;
|
|
89
|
+
}
|
|
90
|
+
export interface CanaryTransaction {
|
|
91
|
+
/** Canary ID */
|
|
92
|
+
id: string;
|
|
93
|
+
/** Fake amount (should never be accessed) */
|
|
94
|
+
amount: number;
|
|
95
|
+
/** Canary type */
|
|
96
|
+
type: "transaction" | "memory" | "credential";
|
|
97
|
+
/** When the canary was planted */
|
|
98
|
+
plantedAt: number;
|
|
99
|
+
/** Whether the canary has been triggered */
|
|
100
|
+
triggered: boolean;
|
|
101
|
+
/** When triggered (if applicable) */
|
|
102
|
+
triggeredAt?: number;
|
|
103
|
+
/** What agent triggered it */
|
|
104
|
+
triggeredBy?: string;
|
|
105
|
+
}
|
|
106
|
+
export interface CanaryAlert {
|
|
107
|
+
/** The triggered canary */
|
|
108
|
+
canary: CanaryTransaction;
|
|
109
|
+
/** Agent that triggered it */
|
|
110
|
+
agentId: string;
|
|
111
|
+
/** Severity: always critical (canary trigger = compromise) */
|
|
112
|
+
severity: "critical";
|
|
113
|
+
/** Message */
|
|
114
|
+
message: string;
|
|
115
|
+
/** Timestamp */
|
|
116
|
+
timestamp: number;
|
|
117
|
+
}
|
|
118
|
+
export interface AnomalyConfig {
|
|
119
|
+
/** EWMA smoothing factor (0-1). Higher = more reactive. Default 0.15 */
|
|
120
|
+
alpha: number;
|
|
121
|
+
/** Z-score threshold for warning. Default 2.5 */
|
|
122
|
+
warningThreshold: number;
|
|
123
|
+
/** Z-score threshold for critical. Default 3.5 */
|
|
124
|
+
criticalThreshold: number;
|
|
125
|
+
/** Minimum observations before alerting. Default 10 */
|
|
126
|
+
warmupPeriod: number;
|
|
127
|
+
/** Features to track for behavioral fingerprinting */
|
|
128
|
+
trackedFeatures: string[];
|
|
129
|
+
/** Fraction of anomalous features to flag hijack. Default 0.4 */
|
|
130
|
+
hijackFeatureThreshold: number;
|
|
131
|
+
/** Max canaries per agent. Default 5 */
|
|
132
|
+
maxCanaries: number;
|
|
133
|
+
}
|
|
134
|
+
export declare const DEFAULT_ANOMALY_CONFIG: AnomalyConfig;
|
|
135
|
+
export declare class EWMADetector {
|
|
136
|
+
private mean;
|
|
137
|
+
private variance;
|
|
138
|
+
private count;
|
|
139
|
+
private lastValue;
|
|
140
|
+
private readonly alpha;
|
|
141
|
+
private readonly warningK;
|
|
142
|
+
private readonly criticalK;
|
|
143
|
+
private readonly warmup;
|
|
144
|
+
constructor(alpha?: number, warningK?: number, criticalK?: number, warmup?: number);
|
|
145
|
+
/**
|
|
146
|
+
* Update the detector with a new observation.
|
|
147
|
+
* Returns anomaly assessment.
|
|
148
|
+
*
|
|
149
|
+
* EWMA formulas:
|
|
150
|
+
* mu_t = alpha * x_t + (1 - alpha) * mu_{t-1}
|
|
151
|
+
* sigma_t^2 = alpha * (x_t - mu_t)^2 + (1 - alpha) * sigma_{t-1}^2
|
|
152
|
+
* Alert when: |x_t - mu_t| > k * sigma_t
|
|
153
|
+
*/
|
|
154
|
+
update(value: number): EWMAAlert;
|
|
155
|
+
private _makeAlert;
|
|
156
|
+
/** Get current state */
|
|
157
|
+
getState(): EWMAState;
|
|
158
|
+
/** Reset the detector */
|
|
159
|
+
reset(): void;
|
|
160
|
+
/** Serialize for persistence */
|
|
161
|
+
serialize(): {
|
|
162
|
+
mean: number;
|
|
163
|
+
variance: number;
|
|
164
|
+
count: number;
|
|
165
|
+
lastValue: number;
|
|
166
|
+
};
|
|
167
|
+
/** Restore from serialized state */
|
|
168
|
+
restore(state: {
|
|
169
|
+
mean: number;
|
|
170
|
+
variance: number;
|
|
171
|
+
count: number;
|
|
172
|
+
lastValue: number;
|
|
173
|
+
}): void;
|
|
174
|
+
}
|
|
175
|
+
export declare class BehaviorMonitor {
|
|
176
|
+
private fingerprints;
|
|
177
|
+
private observationCounts;
|
|
178
|
+
private lastObserved;
|
|
179
|
+
readonly config: AnomalyConfig;
|
|
180
|
+
/** Max agents to track before evicting oldest inactive. Prevents unbounded memory growth. */
|
|
181
|
+
static readonly MAX_AGENTS = 10000;
|
|
182
|
+
constructor(config?: Partial<AnomalyConfig>);
|
|
183
|
+
/**
|
|
184
|
+
* Observe agent behavior. Updates the behavioral fingerprint.
|
|
185
|
+
* Returns hijack detection result.
|
|
186
|
+
*/
|
|
187
|
+
observe(agentId: string, features: Record<string, number>): HijackDetection;
|
|
188
|
+
/**
|
|
189
|
+
* Get the behavioral fingerprint for an agent.
|
|
190
|
+
*/
|
|
191
|
+
getFingerprint(agentId: string): BehaviorFingerprint | null;
|
|
192
|
+
/**
|
|
193
|
+
* Remove an agent's fingerprint (on agent deletion).
|
|
194
|
+
*/
|
|
195
|
+
removeAgent(agentId: string): boolean;
|
|
196
|
+
/** Number of agents being monitored */
|
|
197
|
+
get agentCount(): number;
|
|
198
|
+
/** Serialize for persistence */
|
|
199
|
+
serialize(): Record<string, {
|
|
200
|
+
features: Record<string, ReturnType<EWMADetector["serialize"]>>;
|
|
201
|
+
count: number;
|
|
202
|
+
lastObserved: number;
|
|
203
|
+
}>;
|
|
204
|
+
/** Deserialize with validation */
|
|
205
|
+
static deserialize(data: Record<string, any>, config?: Partial<AnomalyConfig>): BehaviorMonitor;
|
|
206
|
+
}
|
|
207
|
+
export declare class CanarySystem {
|
|
208
|
+
private canaries;
|
|
209
|
+
private alerts;
|
|
210
|
+
private readonly maxCanaries;
|
|
211
|
+
static readonly MAX_ALERTS = 100;
|
|
212
|
+
constructor(maxCanaries?: number);
|
|
213
|
+
/**
|
|
214
|
+
* Plant a canary transaction.
|
|
215
|
+
* Returns the canary ID. Store this — never expose to the agent.
|
|
216
|
+
*/
|
|
217
|
+
plant(type?: CanaryTransaction["type"]): CanaryTransaction;
|
|
218
|
+
/**
|
|
219
|
+
* Check if an ID matches a canary. If yes, the agent is compromised.
|
|
220
|
+
* This should be called on every transaction/memory access.
|
|
221
|
+
*/
|
|
222
|
+
check(id: string, agentId: string): CanaryAlert | null;
|
|
223
|
+
/** Check if any ID in a list matches a canary */
|
|
224
|
+
checkBatch(ids: string[], agentId: string): CanaryAlert[];
|
|
225
|
+
/** Get all alerts */
|
|
226
|
+
getAlerts(): CanaryAlert[];
|
|
227
|
+
/** Get all active (untriggered) canaries */
|
|
228
|
+
getActiveCanaries(): CanaryTransaction[];
|
|
229
|
+
/** Check if a specific canary ID exists (for internal use only) */
|
|
230
|
+
isCanary(id: string): boolean;
|
|
231
|
+
/** Serialize for persistence */
|
|
232
|
+
serialize(): {
|
|
233
|
+
canaries: CanaryTransaction[];
|
|
234
|
+
alerts: CanaryAlert[];
|
|
235
|
+
};
|
|
236
|
+
/** Deserialize with validation */
|
|
237
|
+
static deserialize(data: {
|
|
238
|
+
canaries?: CanaryTransaction[];
|
|
239
|
+
alerts?: CanaryAlert[];
|
|
240
|
+
}, maxCanaries?: number): CanarySystem;
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=anomaly.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anomaly.d.ts","sourceRoot":"","sources":["../src/anomaly.ts"],"names":[],"mappings":"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"}
|