@mnemopay/sdk 0.3.0 → 0.4.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 +2 -2
- package/dist/fraud-ml.d.ts +174 -0
- package/dist/fraud-ml.d.ts.map +1 -0
- package/dist/fraud-ml.js +544 -0
- package/dist/fraud-ml.js.map +1 -0
- package/dist/fraud.d.ts +212 -0
- package/dist/fraud.d.ts.map +1 -0
- package/dist/fraud.js +633 -0
- package/dist/fraud.js.map +1 -0
- package/dist/index.d.ts +19 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +111 -16
- package/dist/index.js.map +1 -1
- package/dist/langgraph/tools.d.ts +2 -2
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +59 -0
- package/dist/mcp/server.js.map +1 -1
- package/package.json +3 -3
package/dist/fraud.d.ts
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MnemoPay Fraud Guard — velocity checks, anomaly detection, risk scoring,
|
|
3
|
+
* dispute resolution, and platform fee collection.
|
|
4
|
+
*
|
|
5
|
+
* Plugs into MnemoPayLite.charge/settle/refund to enforce security rules
|
|
6
|
+
* before any money moves.
|
|
7
|
+
*/
|
|
8
|
+
import { IsolationForest, TransactionGraph, BehaviorProfile } from "./fraud-ml.js";
|
|
9
|
+
import type { CollusionSignal, BehaviorSnapshot } from "./fraud-ml.js";
|
|
10
|
+
export interface FraudConfig {
|
|
11
|
+
/** Platform fee rate on settle (0.03 = 3%). Default 0.03 */
|
|
12
|
+
platformFeeRate: number;
|
|
13
|
+
/** Max charges per minute per agent. Default 5 */
|
|
14
|
+
maxChargesPerMinute: number;
|
|
15
|
+
/** Max charges per hour per agent. Default 30 */
|
|
16
|
+
maxChargesPerHour: number;
|
|
17
|
+
/** Max charges per day per agent. Default 100 */
|
|
18
|
+
maxChargesPerDay: number;
|
|
19
|
+
/** Max daily charge volume in USD. Default 5000 */
|
|
20
|
+
maxDailyVolume: number;
|
|
21
|
+
/** Standard deviations for amount anomaly detection. Default 2.5 */
|
|
22
|
+
anomalyStdDevThreshold: number;
|
|
23
|
+
/** Minutes before settled funds can be withdrawn (hold period). Default 30 */
|
|
24
|
+
settlementHoldMinutes: number;
|
|
25
|
+
/** Minutes after settlement during which dispute can be filed. Default 1440 (24h) */
|
|
26
|
+
disputeWindowMinutes: number;
|
|
27
|
+
/** Risk score 0-1 above which transaction is blocked. Default 0.75 */
|
|
28
|
+
blockThreshold: number;
|
|
29
|
+
/** Risk score 0-1 above which transaction is flagged. Default 0.45 */
|
|
30
|
+
flagThreshold: number;
|
|
31
|
+
/** Minimum account age in minutes before charges are allowed. Default 0 */
|
|
32
|
+
minAccountAgeMinutes: number;
|
|
33
|
+
/** Max pending (unsettled) transactions at once. Default 10 */
|
|
34
|
+
maxPendingTransactions: number;
|
|
35
|
+
/** Enable IP/geo tracking (MCP server only). Default true */
|
|
36
|
+
enableGeoCheck: boolean;
|
|
37
|
+
/** Blocked country ISO codes. Default empty */
|
|
38
|
+
blockedCountries: string[];
|
|
39
|
+
/** Enable ML fraud detection (Isolation Forest, graph analysis, behavioral fingerprinting). Default false */
|
|
40
|
+
ml: boolean;
|
|
41
|
+
}
|
|
42
|
+
export declare const DEFAULT_FRAUD_CONFIG: FraudConfig;
|
|
43
|
+
export interface FraudSignal {
|
|
44
|
+
type: string;
|
|
45
|
+
severity: "low" | "medium" | "high" | "critical";
|
|
46
|
+
description: string;
|
|
47
|
+
/** Risk weight 0-1 */
|
|
48
|
+
weight: number;
|
|
49
|
+
}
|
|
50
|
+
export interface RiskAssessment {
|
|
51
|
+
/** Composite risk score 0-1 */
|
|
52
|
+
score: number;
|
|
53
|
+
/** Risk level derived from score */
|
|
54
|
+
level: "safe" | "low" | "medium" | "high" | "blocked";
|
|
55
|
+
/** Detected fraud signals */
|
|
56
|
+
signals: FraudSignal[];
|
|
57
|
+
/** Whether the action should proceed */
|
|
58
|
+
allowed: boolean;
|
|
59
|
+
/** Human-readable reason if blocked */
|
|
60
|
+
reason?: string;
|
|
61
|
+
/** Whether flagged for review (allowed but suspicious) */
|
|
62
|
+
flagged: boolean;
|
|
63
|
+
}
|
|
64
|
+
export interface Dispute {
|
|
65
|
+
id: string;
|
|
66
|
+
txId: string;
|
|
67
|
+
agentId: string;
|
|
68
|
+
reason: string;
|
|
69
|
+
status: "open" | "resolved_refunded" | "resolved_upheld" | "expired";
|
|
70
|
+
createdAt: Date;
|
|
71
|
+
resolvedAt?: Date;
|
|
72
|
+
evidence: string[];
|
|
73
|
+
}
|
|
74
|
+
export interface PlatformFeeRecord {
|
|
75
|
+
txId: string;
|
|
76
|
+
agentId: string;
|
|
77
|
+
grossAmount: number;
|
|
78
|
+
feeRate: number;
|
|
79
|
+
feeAmount: number;
|
|
80
|
+
netAmount: number;
|
|
81
|
+
createdAt: Date;
|
|
82
|
+
}
|
|
83
|
+
/** IP/geo context passed from MCP server */
|
|
84
|
+
export interface RequestContext {
|
|
85
|
+
ip?: string;
|
|
86
|
+
country?: string;
|
|
87
|
+
userAgent?: string;
|
|
88
|
+
sessionId?: string;
|
|
89
|
+
}
|
|
90
|
+
export declare class FraudGuard {
|
|
91
|
+
readonly config: FraudConfig;
|
|
92
|
+
/** Sliding window of recent charges per agent */
|
|
93
|
+
private chargeHistory;
|
|
94
|
+
/** Running stats per agent: sum, sumSq, count for online std-dev */
|
|
95
|
+
private agentStats;
|
|
96
|
+
/** Active disputes */
|
|
97
|
+
private disputes;
|
|
98
|
+
/** Platform fee ledger */
|
|
99
|
+
private feeLedger;
|
|
100
|
+
/** Total platform fees collected */
|
|
101
|
+
private _platformFeesCollected;
|
|
102
|
+
/** Known IPs per agent for consistency checks */
|
|
103
|
+
private agentIps;
|
|
104
|
+
/** Flagged agents (soft block — allowed but monitored) */
|
|
105
|
+
private flaggedAgents;
|
|
106
|
+
/** Hard-blocked agents */
|
|
107
|
+
private blockedAgents;
|
|
108
|
+
/** ML anomaly detection — only loaded when ml: true */
|
|
109
|
+
readonly isolationForest: IsolationForest | null;
|
|
110
|
+
/** Transaction graph — only loaded when ml: true */
|
|
111
|
+
readonly transactionGraph: TransactionGraph | null;
|
|
112
|
+
/** Behavioral fingerprinting — only loaded when ml: true */
|
|
113
|
+
readonly behaviorProfile: BehaviorProfile | null;
|
|
114
|
+
constructor(config?: Partial<FraudConfig>);
|
|
115
|
+
/**
|
|
116
|
+
* Assess risk for a charge attempt. Returns a RiskAssessment
|
|
117
|
+
* that includes whether the charge should proceed.
|
|
118
|
+
*/
|
|
119
|
+
assessCharge(agentId: string, amount: number, reputation: number, accountCreatedAt: Date, pendingCount: number, ctx?: RequestContext): RiskAssessment;
|
|
120
|
+
/**
|
|
121
|
+
* Record a successful charge for velocity tracking and stats.
|
|
122
|
+
* Call AFTER charge is approved.
|
|
123
|
+
*/
|
|
124
|
+
recordCharge(agentId: string, amount: number, ctx?: RequestContext): void;
|
|
125
|
+
/** Record a non-payment event (memory ops) for behavioral profiling */
|
|
126
|
+
recordEvent(agentId: string, type: "remember" | "recall" | "settle" | "refund"): void;
|
|
127
|
+
/** Record a transaction between agents for graph analysis */
|
|
128
|
+
recordTransfer(fromAgent: string, toAgent: string, amount: number, txId: string): void;
|
|
129
|
+
/** Run collusion detection across the transaction graph (requires ml: true) */
|
|
130
|
+
detectCollusion(): CollusionSignal[];
|
|
131
|
+
/** Get an agent's behavioral baseline (requires ml: true) */
|
|
132
|
+
getAgentBaseline(agentId: string): BehaviorSnapshot | undefined;
|
|
133
|
+
/**
|
|
134
|
+
* Calculate and record platform fee for a settlement.
|
|
135
|
+
* Returns { grossAmount, feeAmount, netAmount }.
|
|
136
|
+
*/
|
|
137
|
+
applyPlatformFee(txId: string, agentId: string, grossAmount: number): PlatformFeeRecord;
|
|
138
|
+
/** Total platform fees collected */
|
|
139
|
+
get platformFeesCollected(): number;
|
|
140
|
+
/** Get platform fee ledger */
|
|
141
|
+
getFeeLedger(limit?: number): PlatformFeeRecord[];
|
|
142
|
+
/**
|
|
143
|
+
* File a dispute against a settled transaction.
|
|
144
|
+
* Returns the dispute if within the dispute window.
|
|
145
|
+
*/
|
|
146
|
+
fileDispute(txId: string, agentId: string, reason: string, txCompletedAt: Date, evidence?: string[]): Dispute;
|
|
147
|
+
/**
|
|
148
|
+
* Resolve a dispute. Either refund the transaction or uphold it.
|
|
149
|
+
*/
|
|
150
|
+
resolveDispute(disputeId: string, outcome: "refund" | "uphold"): Dispute;
|
|
151
|
+
/** Get all disputes for an agent */
|
|
152
|
+
getDisputes(agentId?: string): Dispute[];
|
|
153
|
+
/** Get a specific dispute */
|
|
154
|
+
getDispute(disputeId: string): Dispute | undefined;
|
|
155
|
+
/**
|
|
156
|
+
* Check if a transaction is within the settlement hold period.
|
|
157
|
+
* Returns true if the transaction is still held and cannot be withdrawn.
|
|
158
|
+
*/
|
|
159
|
+
isWithinHoldPeriod(settledAt: Date): boolean;
|
|
160
|
+
/** Check if a transaction is still within the dispute window */
|
|
161
|
+
isWithinDisputeWindow(settledAt: Date): boolean;
|
|
162
|
+
/** Block an agent from making any charges */
|
|
163
|
+
blockAgent(agentId: string): void;
|
|
164
|
+
/** Unblock a previously blocked agent */
|
|
165
|
+
unblockAgent(agentId: string): void;
|
|
166
|
+
/** Check if an agent is blocked */
|
|
167
|
+
isBlocked(agentId: string): boolean;
|
|
168
|
+
/** Check if an agent is flagged */
|
|
169
|
+
isFlagged(agentId: string): boolean;
|
|
170
|
+
/** Get fraud stats summary */
|
|
171
|
+
stats(): {
|
|
172
|
+
totalChargesTracked: number;
|
|
173
|
+
agentsTracked: number;
|
|
174
|
+
agentsFlagged: number;
|
|
175
|
+
agentsBlocked: number;
|
|
176
|
+
openDisputes: number;
|
|
177
|
+
platformFeesCollected: number;
|
|
178
|
+
};
|
|
179
|
+
serialize(): string;
|
|
180
|
+
static deserialize(json: string, config?: Partial<FraudConfig>): FraudGuard;
|
|
181
|
+
}
|
|
182
|
+
export interface RateLimitConfig {
|
|
183
|
+
/** Max requests per window. Default 60 */
|
|
184
|
+
maxRequests: number;
|
|
185
|
+
/** Window size in milliseconds. Default 60000 (1 minute) */
|
|
186
|
+
windowMs: number;
|
|
187
|
+
/** Max requests for payment operations (charge/settle/refund). Default 10 */
|
|
188
|
+
maxPaymentRequests: number;
|
|
189
|
+
/** Payment operations window in ms. Default 60000 */
|
|
190
|
+
paymentWindowMs: number;
|
|
191
|
+
}
|
|
192
|
+
export declare const DEFAULT_RATE_LIMIT: RateLimitConfig;
|
|
193
|
+
export declare class RateLimiter {
|
|
194
|
+
private config;
|
|
195
|
+
/** IP → timestamps of recent requests */
|
|
196
|
+
private requests;
|
|
197
|
+
/** IP → timestamps of recent payment operations */
|
|
198
|
+
private paymentRequests;
|
|
199
|
+
constructor(config?: Partial<RateLimitConfig>);
|
|
200
|
+
/**
|
|
201
|
+
* Check if a request should be allowed.
|
|
202
|
+
* Returns { allowed, remaining, retryAfterMs? }
|
|
203
|
+
*/
|
|
204
|
+
check(key: string, isPayment?: boolean): {
|
|
205
|
+
allowed: boolean;
|
|
206
|
+
remaining: number;
|
|
207
|
+
retryAfterMs?: number;
|
|
208
|
+
};
|
|
209
|
+
/** Clean up old entries (call periodically) */
|
|
210
|
+
cleanup(): void;
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=fraud.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fraud.d.ts","sourceRoot":"","sources":["../src/fraud.ts"],"names":[],"mappings":"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"}
|