@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/dist/fico.d.ts ADDED
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Agent FICO — Credit Score for AI Agents
3
+ *
4
+ * Mirrors human FICO (300-850 range) but adapted for agent behavior.
5
+ * Five components weighted identically to FICO's public methodology:
6
+ *
7
+ * 1. Payment History (35%) — on-time settlements, disputes, late payments
8
+ * 2. Credit Utilization (20%) — spend vs budget cap, sweet spot 10-30%
9
+ * 3. History Length (15%) — account age weighted by activity density
10
+ * 4. Behavior Diversity (15%) — counterparties, categories, amount range
11
+ * 5. Fraud Record (15%) — fraud flags, disputes lost, warnings
12
+ *
13
+ * Score is deterministic given inputs. No randomness, no hidden state.
14
+ * All parameters are from published FICO methodology + agent-specific adaptations.
15
+ *
16
+ * References:
17
+ * - FICO Score Open Access: myfico.com/credit-education
18
+ * - Fair Isaac Corporation, "Understanding FICO Scores" (2024)
19
+ * - MnemoPay Master Strategy, Part 3.3 (April 2026)
20
+ */
21
+ export interface FICOTransaction {
22
+ id: string;
23
+ amount: number;
24
+ status: "pending" | "completed" | "refunded" | "disputed" | "expired";
25
+ createdAt: Date;
26
+ completedAt?: Date;
27
+ counterpartyId?: string;
28
+ reason: string;
29
+ riskScore?: number;
30
+ }
31
+ export interface FICOInput {
32
+ /** All transactions for this agent */
33
+ transactions: FICOTransaction[];
34
+ /** Account creation timestamp */
35
+ createdAt: Date;
36
+ /** Total confirmed fraud flags */
37
+ fraudFlags: number;
38
+ /** Total dispute count (regardless of outcome) */
39
+ disputeCount: number;
40
+ /** Disputes resolved against this agent */
41
+ disputesLost: number;
42
+ /** Warnings issued by fraud system */
43
+ warnings: number;
44
+ /** Budget cap per period (for utilization). Default $5000 */
45
+ budgetCap?: number;
46
+ /** Budget period in days. Default 30 */
47
+ budgetPeriodDays?: number;
48
+ /** Memory count (used for diversity scoring) */
49
+ memoriesCount?: number;
50
+ }
51
+ export interface FICOComponent {
52
+ /** Raw component score 0-100 */
53
+ score: number;
54
+ /** Weight applied to this component */
55
+ weight: number;
56
+ /** Weighted contribution to final score */
57
+ weighted: number;
58
+ /** Factors that contributed to this score */
59
+ factors: string[];
60
+ }
61
+ export interface FICOResult {
62
+ /** Final FICO score 300-850 */
63
+ score: number;
64
+ /** Rating: exceptional | very_good | good | fair | poor */
65
+ rating: "exceptional" | "very_good" | "good" | "fair" | "poor";
66
+ /** Trust level for platform decisions */
67
+ trustLevel: "full" | "high" | "standard" | "reduced" | "minimal";
68
+ /** Recommended fee rate based on score */
69
+ feeRate: number;
70
+ /** Whether HITL (human-in-the-loop) approval is recommended */
71
+ requiresHITL: boolean;
72
+ /** Breakdown of all five components */
73
+ components: {
74
+ paymentHistory: FICOComponent;
75
+ creditUtilization: FICOComponent;
76
+ historyLength: FICOComponent;
77
+ behaviorDiversity: FICOComponent;
78
+ fraudRecord: FICOComponent;
79
+ };
80
+ /** Number of transactions used for scoring */
81
+ transactionCount: number;
82
+ /** Whether this score is considered stable (50+ transactions) */
83
+ stable: boolean;
84
+ /** Score confidence 0-1 (increases with more data) */
85
+ confidence: number;
86
+ /** ISO timestamp */
87
+ generatedAt: string;
88
+ }
89
+ export interface FICOConfig {
90
+ /** Weight for payment history. Default 0.35 */
91
+ w1: number;
92
+ /** Weight for credit utilization. Default 0.20 */
93
+ w2: number;
94
+ /** Weight for history length. Default 0.15 */
95
+ w3: number;
96
+ /** Weight for behavior diversity. Default 0.15 */
97
+ w4: number;
98
+ /** Weight for fraud record. Default 0.15 */
99
+ w5: number;
100
+ /** Minimum transactions for stable score. Default 50 */
101
+ minStableTransactions: number;
102
+ /** Days for full history length score. Default 365 */
103
+ fullHistoryDays: number;
104
+ /** Recency half-life in days for payment history. Default 90 */
105
+ recencyHalfLifeDays: number;
106
+ /** Max expected unique counterparties for diversity. Default 20 */
107
+ maxExpectedCounterparties: number;
108
+ /** Max expected unique categories for diversity. Default 10 */
109
+ maxExpectedCategories: number;
110
+ }
111
+ export declare const DEFAULT_FICO_CONFIG: FICOConfig;
112
+ export declare class AgentFICO {
113
+ readonly config: FICOConfig;
114
+ constructor(config?: Partial<FICOConfig>);
115
+ /**
116
+ * Compute Agent FICO score from transaction history and agent metadata.
117
+ * Deterministic: same inputs always produce the same score.
118
+ */
119
+ compute(input: FICOInput): FICOResult;
120
+ private _computePaymentHistory;
121
+ private _computeCreditUtilization;
122
+ private _computeHistoryLength;
123
+ private _computeBehaviorDiversity;
124
+ private _computeFraudRecord;
125
+ private _validateInput;
126
+ /**
127
+ * Serialize FICO result for storage/transmission.
128
+ * Strips non-essential data to reduce payload.
129
+ */
130
+ static serialize(result: FICOResult): string;
131
+ /**
132
+ * Deserialize with validation — never trust stored scores.
133
+ */
134
+ static deserialize(json: string): FICOResult;
135
+ }
136
+ //# sourceMappingURL=fico.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fico.d.ts","sourceRoot":"","sources":["../src/fico.ts"],"names":[],"mappings":"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"}
package/dist/fico.js ADDED
@@ -0,0 +1,424 @@
1
+ "use strict";
2
+ /**
3
+ * Agent FICO — Credit Score for AI Agents
4
+ *
5
+ * Mirrors human FICO (300-850 range) but adapted for agent behavior.
6
+ * Five components weighted identically to FICO's public methodology:
7
+ *
8
+ * 1. Payment History (35%) — on-time settlements, disputes, late payments
9
+ * 2. Credit Utilization (20%) — spend vs budget cap, sweet spot 10-30%
10
+ * 3. History Length (15%) — account age weighted by activity density
11
+ * 4. Behavior Diversity (15%) — counterparties, categories, amount range
12
+ * 5. Fraud Record (15%) — fraud flags, disputes lost, warnings
13
+ *
14
+ * Score is deterministic given inputs. No randomness, no hidden state.
15
+ * All parameters are from published FICO methodology + agent-specific adaptations.
16
+ *
17
+ * References:
18
+ * - FICO Score Open Access: myfico.com/credit-education
19
+ * - Fair Isaac Corporation, "Understanding FICO Scores" (2024)
20
+ * - MnemoPay Master Strategy, Part 3.3 (April 2026)
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.AgentFICO = exports.DEFAULT_FICO_CONFIG = void 0;
24
+ exports.DEFAULT_FICO_CONFIG = {
25
+ w1: 0.35,
26
+ w2: 0.20,
27
+ w3: 0.15,
28
+ w4: 0.15,
29
+ w5: 0.15,
30
+ minStableTransactions: 50,
31
+ fullHistoryDays: 365,
32
+ recencyHalfLifeDays: 90,
33
+ maxExpectedCounterparties: 20,
34
+ maxExpectedCategories: 10,
35
+ };
36
+ // ─── Score Interpretation ───────────────────────────────────────────────────
37
+ const SCORE_TIERS = [
38
+ { min: 800, rating: "exceptional", trustLevel: "full", feeRate: 0.010, hitl: false },
39
+ { min: 740, rating: "very_good", trustLevel: "high", feeRate: 0.013, hitl: false },
40
+ { min: 670, rating: "good", trustLevel: "standard", feeRate: 0.015, hitl: false },
41
+ { min: 580, rating: "fair", trustLevel: "reduced", feeRate: 0.019, hitl: false },
42
+ { min: 300, rating: "poor", trustLevel: "minimal", feeRate: 0.025, hitl: true },
43
+ ];
44
+ function interpretScore(score) {
45
+ const clamped = Math.max(300, Math.min(850, score));
46
+ for (const tier of SCORE_TIERS) {
47
+ if (clamped >= tier.min) {
48
+ return { rating: tier.rating, trustLevel: tier.trustLevel, feeRate: tier.feeRate, requiresHITL: tier.hitl };
49
+ }
50
+ }
51
+ // Fallback (should never reach)
52
+ return { rating: "poor", trustLevel: "minimal", feeRate: 0.025, requiresHITL: true };
53
+ }
54
+ // ─── Agent FICO Engine ──────────────────────────────────────────────────────
55
+ class AgentFICO {
56
+ config;
57
+ constructor(config) {
58
+ this.config = { ...exports.DEFAULT_FICO_CONFIG, ...config };
59
+ // Validate weights sum to 1.0 (within floating point tolerance)
60
+ const weightSum = this.config.w1 + this.config.w2 + this.config.w3 + this.config.w4 + this.config.w5;
61
+ if (Math.abs(weightSum - 1.0) > 0.001) {
62
+ throw new Error(`FICO weights must sum to 1.0, got ${weightSum.toFixed(4)}`);
63
+ }
64
+ // Validate all weights are positive
65
+ if (this.config.w1 <= 0 || this.config.w2 <= 0 || this.config.w3 <= 0 || this.config.w4 <= 0 || this.config.w5 <= 0) {
66
+ throw new Error("All FICO weights must be positive");
67
+ }
68
+ }
69
+ /**
70
+ * Compute Agent FICO score from transaction history and agent metadata.
71
+ * Deterministic: same inputs always produce the same score.
72
+ */
73
+ compute(input) {
74
+ // Input validation — reject garbage, clamp edge cases
75
+ this._validateInput(input);
76
+ const now = Date.now();
77
+ const txs = input.transactions;
78
+ // 1. Payment History (35%)
79
+ const paymentHistory = this._computePaymentHistory(txs, now);
80
+ // 2. Credit Utilization (20%)
81
+ const creditUtilization = this._computeCreditUtilization(txs, input.budgetCap ?? 5000, input.budgetPeriodDays ?? 30, now);
82
+ // 3. History Length (15%)
83
+ const historyLength = this._computeHistoryLength(input.createdAt, txs, now);
84
+ // 4. Behavior Diversity (15%)
85
+ const behaviorDiversity = this._computeBehaviorDiversity(txs, input.memoriesCount ?? 0);
86
+ // 5. Fraud Record (15%)
87
+ const fraudRecord = this._computeFraudRecord(input.fraudFlags, input.disputeCount, input.disputesLost, input.warnings);
88
+ // Weighted composite: 0-100 scale
89
+ const composite = paymentHistory.score * this.config.w1 +
90
+ creditUtilization.score * this.config.w2 +
91
+ historyLength.score * this.config.w3 +
92
+ behaviorDiversity.score * this.config.w4 +
93
+ fraudRecord.score * this.config.w5;
94
+ // Map 0-100 to 300-850 range
95
+ // 0 → 300, 100 → 850
96
+ const rawScore = 300 + (composite / 100) * 550;
97
+ const score = Math.round(Math.max(300, Math.min(850, rawScore)));
98
+ const interpretation = interpretScore(score);
99
+ const totalTx = txs.length;
100
+ const stable = totalTx >= this.config.minStableTransactions;
101
+ // Confidence: logarithmic growth, reaches 0.9 at minStableTransactions
102
+ const confidence = totalTx === 0 ? 0 : Math.min(1, Math.log(1 + totalTx) / Math.log(1 + this.config.minStableTransactions * 2));
103
+ return {
104
+ score,
105
+ ...interpretation,
106
+ components: {
107
+ paymentHistory: { ...paymentHistory, weight: this.config.w1, weighted: Math.round(paymentHistory.score * this.config.w1 * 100) / 100 },
108
+ creditUtilization: { ...creditUtilization, weight: this.config.w2, weighted: Math.round(creditUtilization.score * this.config.w2 * 100) / 100 },
109
+ historyLength: { ...historyLength, weight: this.config.w3, weighted: Math.round(historyLength.score * this.config.w3 * 100) / 100 },
110
+ behaviorDiversity: { ...behaviorDiversity, weight: this.config.w4, weighted: Math.round(behaviorDiversity.score * this.config.w4 * 100) / 100 },
111
+ fraudRecord: { ...fraudRecord, weight: this.config.w5, weighted: Math.round(fraudRecord.score * this.config.w5 * 100) / 100 },
112
+ },
113
+ transactionCount: totalTx,
114
+ stable,
115
+ confidence: Math.round(confidence * 1000) / 1000,
116
+ generatedAt: new Date().toISOString(),
117
+ };
118
+ }
119
+ // ── Component 1: Payment History (35%) ──────────────────────────────────
120
+ _computePaymentHistory(txs, now) {
121
+ const factors = [];
122
+ if (txs.length === 0) {
123
+ factors.push("No transaction history");
124
+ return { score: 50, factors }; // Neutral starting point
125
+ }
126
+ const completed = txs.filter(t => t.status === "completed");
127
+ const refunded = txs.filter(t => t.status === "refunded");
128
+ const disputed = txs.filter(t => t.status === "disputed");
129
+ const expired = txs.filter(t => t.status === "expired");
130
+ // Base: success rate (completed / total non-pending)
131
+ const nonPending = txs.filter(t => t.status !== "pending");
132
+ const successRate = nonPending.length > 0 ? completed.length / nonPending.length : 0;
133
+ let score = successRate * 100;
134
+ // Recency weighting: recent transactions matter 2x
135
+ // Exponential decay: weight = 2^(-days / halfLife)
136
+ const halfLife = this.config.recencyHalfLifeDays;
137
+ let recentSuccessWeighted = 0;
138
+ let recentTotalWeighted = 0;
139
+ for (const tx of nonPending) {
140
+ const daysAgo = (now - tx.createdAt.getTime()) / 86_400_000;
141
+ const weight = Math.pow(2, -daysAgo / halfLife);
142
+ recentTotalWeighted += weight;
143
+ if (tx.status === "completed")
144
+ recentSuccessWeighted += weight;
145
+ }
146
+ if (recentTotalWeighted > 0) {
147
+ const recentRate = recentSuccessWeighted / recentTotalWeighted;
148
+ // Blend: 60% recency-weighted, 40% lifetime
149
+ score = (recentRate * 60 + successRate * 40);
150
+ }
151
+ // Penalties
152
+ if (disputed.length > 0) {
153
+ const penalty = Math.min(30, disputed.length * 10);
154
+ score -= penalty;
155
+ factors.push(`${disputed.length} disputed transaction(s) (-${penalty})`);
156
+ }
157
+ if (refunded.length > 0 && nonPending.length > 0) {
158
+ const refundRate = refunded.length / nonPending.length;
159
+ if (refundRate > 0.1) {
160
+ const penalty = Math.min(20, Math.round(refundRate * 40));
161
+ score -= penalty;
162
+ factors.push(`High refund rate ${(refundRate * 100).toFixed(0)}% (-${penalty})`);
163
+ }
164
+ }
165
+ if (expired.length > 0) {
166
+ const penalty = Math.min(15, expired.length * 5);
167
+ score -= penalty;
168
+ factors.push(`${expired.length} expired transaction(s) (-${penalty})`);
169
+ }
170
+ // Bonus for consistent long-term success
171
+ if (completed.length >= 100 && successRate >= 0.95) {
172
+ score = Math.min(100, score + 5);
173
+ factors.push("Excellent long-term track record (+5)");
174
+ }
175
+ if (factors.length === 0) {
176
+ factors.push(`${completed.length}/${nonPending.length} successful (${(successRate * 100).toFixed(0)}%)`);
177
+ }
178
+ return { score: clamp(score), factors };
179
+ }
180
+ // ── Component 2: Credit Utilization (20%) ───────────────────────────────
181
+ _computeCreditUtilization(txs, budgetCap, periodDays, now) {
182
+ const factors = [];
183
+ if (txs.length === 0) {
184
+ factors.push("No spending history");
185
+ return { score: 100, factors }; // No spending = perfect utilization
186
+ }
187
+ // Calculate spend in current period
188
+ const periodStart = now - periodDays * 86_400_000;
189
+ const recentTxs = txs.filter(t => t.createdAt.getTime() >= periodStart && (t.status === "completed" || t.status === "pending"));
190
+ const totalSpend = recentTxs.reduce((sum, t) => sum + Math.abs(t.amount), 0);
191
+ const utilization = budgetCap > 0 ? totalSpend / budgetCap : 0;
192
+ // FICO-like utilization curve:
193
+ // 0-10%: 100 (excellent)
194
+ // 10-30%: 90-100 (sweet spot)
195
+ // 30-50%: 70-90 (okay)
196
+ // 50-75%: 40-70 (concerning)
197
+ // 75-100%: 10-40 (bad)
198
+ // >100%: 0-10 (over limit)
199
+ let score;
200
+ if (utilization <= 0.10) {
201
+ score = 100;
202
+ factors.push(`Very low utilization (${(utilization * 100).toFixed(0)}%)`);
203
+ }
204
+ else if (utilization <= 0.30) {
205
+ score = 90 + (0.30 - utilization) / 0.20 * 10;
206
+ factors.push(`Healthy utilization (${(utilization * 100).toFixed(0)}%)`);
207
+ }
208
+ else if (utilization <= 0.50) {
209
+ score = 70 + (0.50 - utilization) / 0.20 * 20;
210
+ factors.push(`Moderate utilization (${(utilization * 100).toFixed(0)}%)`);
211
+ }
212
+ else if (utilization <= 0.75) {
213
+ score = 40 + (0.75 - utilization) / 0.25 * 30;
214
+ factors.push(`High utilization (${(utilization * 100).toFixed(0)}%)`);
215
+ }
216
+ else if (utilization <= 1.0) {
217
+ score = 10 + (1.0 - utilization) / 0.25 * 30;
218
+ factors.push(`Near-limit utilization (${(utilization * 100).toFixed(0)}%)`);
219
+ }
220
+ else {
221
+ score = Math.max(0, 10 - (utilization - 1.0) * 20);
222
+ factors.push(`Over budget (${(utilization * 100).toFixed(0)}%)`);
223
+ }
224
+ return { score: clamp(score), factors };
225
+ }
226
+ // ── Component 3: History Length (15%) ────────────────────────────────────
227
+ _computeHistoryLength(createdAt, txs, now) {
228
+ const factors = [];
229
+ const ageDays = (now - createdAt.getTime()) / 86_400_000;
230
+ if (ageDays <= 0) {
231
+ factors.push("Brand new account");
232
+ return { score: 0, factors };
233
+ }
234
+ // Base: linear to fullHistoryDays, then full marks
235
+ const ageScore = Math.min(100, (ageDays / this.config.fullHistoryDays) * 100);
236
+ // Activity density: active days / total days
237
+ // An account that exists for 365 days but only transacted on 10 days
238
+ // is less trustworthy than one active 200 out of 365 days
239
+ const activeDays = new Set();
240
+ for (const tx of txs) {
241
+ const day = new Date(tx.createdAt).toISOString().slice(0, 10);
242
+ activeDays.add(day);
243
+ }
244
+ const density = Math.min(1, activeDays.size / Math.max(1, ageDays));
245
+ // Blend: 70% age + 30% density
246
+ const score = ageScore * 0.7 + (density * 100) * 0.3;
247
+ if (ageDays < 7)
248
+ factors.push(`Account is ${Math.floor(ageDays)} day(s) old`);
249
+ else if (ageDays < 30)
250
+ factors.push(`Account is ${Math.floor(ageDays / 7)} week(s) old`);
251
+ else
252
+ factors.push(`Account is ${Math.floor(ageDays / 30)} month(s) old`);
253
+ factors.push(`Activity density: ${(density * 100).toFixed(0)}% (${activeDays.size} active days)`);
254
+ return { score: clamp(score), factors };
255
+ }
256
+ // ── Component 4: Behavior Diversity (15%) ───────────────────────────────
257
+ _computeBehaviorDiversity(txs, memoriesCount) {
258
+ const factors = [];
259
+ if (txs.length === 0) {
260
+ factors.push("No transaction data");
261
+ return { score: 0, factors };
262
+ }
263
+ // A: Unique counterparties
264
+ const counterparties = new Set();
265
+ for (const tx of txs) {
266
+ if (tx.counterpartyId)
267
+ counterparties.add(tx.counterpartyId);
268
+ }
269
+ const cpScore = Math.min(1, counterparties.size / this.config.maxExpectedCounterparties);
270
+ // B: Unique categories (extracted from reason field)
271
+ const categories = new Set();
272
+ for (const tx of txs) {
273
+ // Extract category from reason: first word or key phrase
274
+ const cat = extractCategory(tx.reason);
275
+ if (cat)
276
+ categories.add(cat);
277
+ }
278
+ const catScore = Math.min(1, categories.size / this.config.maxExpectedCategories);
279
+ // C: Amount range diversity (coefficient of variation)
280
+ const amounts = txs.filter(t => t.amount > 0).map(t => t.amount);
281
+ let amountDiversity = 0;
282
+ if (amounts.length >= 2) {
283
+ const mean = amounts.reduce((a, b) => a + b, 0) / amounts.length;
284
+ if (mean > 0) {
285
+ const variance = amounts.reduce((sum, a) => sum + (a - mean) ** 2, 0) / amounts.length;
286
+ const cv = Math.sqrt(variance) / mean;
287
+ // CV of 0.5-1.5 is healthy diversity. Below = too uniform. Above = erratic.
288
+ amountDiversity = cv <= 1.5 ? Math.min(1, cv / 0.8) : Math.max(0, 1 - (cv - 1.5) / 2);
289
+ }
290
+ }
291
+ // D: Memory richness (agents with more memories are more established)
292
+ const memScore = Math.min(1, memoriesCount / 100);
293
+ // Weighted blend of all diversity factors
294
+ const score = (cpScore * 30 + catScore * 25 + amountDiversity * 25 + memScore * 20);
295
+ factors.push(`${counterparties.size} unique counterparties`);
296
+ factors.push(`${categories.size} transaction categories`);
297
+ if (amounts.length >= 2)
298
+ factors.push(`Amount range: $${Math.min(...amounts).toFixed(2)}-$${Math.max(...amounts).toFixed(2)}`);
299
+ factors.push(`${memoriesCount} memories stored`);
300
+ return { score: clamp(score), factors };
301
+ }
302
+ // ── Component 5: Fraud Record (15%) ─────────────────────────────────────
303
+ _computeFraudRecord(fraudFlags, disputeCount, disputesLost, warnings) {
304
+ const factors = [];
305
+ // Start at 100, deduct for each negative event
306
+ // Confirmed fraud = heavy permanent penalty
307
+ // Lost disputes = moderate penalty
308
+ // All disputes (even won) = small penalty (frequent disputes are a signal)
309
+ // Warnings = minor penalty
310
+ let score = 100;
311
+ if (fraudFlags > 0) {
312
+ const penalty = Math.min(80, fraudFlags * 25);
313
+ score -= penalty;
314
+ factors.push(`${fraudFlags} confirmed fraud flag(s) (-${penalty})`);
315
+ }
316
+ if (disputesLost > 0) {
317
+ const penalty = Math.min(40, disputesLost * 15);
318
+ score -= penalty;
319
+ factors.push(`${disputesLost} dispute(s) lost (-${penalty})`);
320
+ }
321
+ if (disputeCount > disputesLost) {
322
+ const wonOrPending = disputeCount - disputesLost;
323
+ const penalty = Math.min(10, wonOrPending * 3);
324
+ score -= penalty;
325
+ factors.push(`${wonOrPending} other dispute(s) (-${penalty})`);
326
+ }
327
+ if (warnings > 0) {
328
+ const penalty = Math.min(15, warnings * 5);
329
+ score -= penalty;
330
+ factors.push(`${warnings} warning(s) (-${penalty})`);
331
+ }
332
+ if (factors.length === 0) {
333
+ factors.push("Clean record");
334
+ }
335
+ return { score: clamp(score), factors };
336
+ }
337
+ // ── Input Validation ────────────────────────────────────────────────────
338
+ _validateInput(input) {
339
+ if (!input || typeof input !== "object") {
340
+ throw new Error("FICOInput is required");
341
+ }
342
+ if (!Array.isArray(input.transactions)) {
343
+ throw new Error("FICOInput.transactions must be an array");
344
+ }
345
+ if (!(input.createdAt instanceof Date) || isNaN(input.createdAt.getTime())) {
346
+ throw new Error("FICOInput.createdAt must be a valid Date");
347
+ }
348
+ if (typeof input.fraudFlags !== "number" || !Number.isFinite(input.fraudFlags) || input.fraudFlags < 0) {
349
+ throw new Error("FICOInput.fraudFlags must be a non-negative number");
350
+ }
351
+ if (typeof input.disputeCount !== "number" || !Number.isFinite(input.disputeCount) || input.disputeCount < 0) {
352
+ throw new Error("FICOInput.disputeCount must be a non-negative number");
353
+ }
354
+ if (typeof input.disputesLost !== "number" || !Number.isFinite(input.disputesLost) || input.disputesLost < 0) {
355
+ throw new Error("FICOInput.disputesLost must be a non-negative number");
356
+ }
357
+ if (input.disputesLost > input.disputeCount) {
358
+ throw new Error("FICOInput.disputesLost cannot exceed disputeCount");
359
+ }
360
+ if (typeof input.warnings !== "number" || !Number.isFinite(input.warnings) || input.warnings < 0) {
361
+ throw new Error("FICOInput.warnings must be a non-negative number");
362
+ }
363
+ if (input.budgetCap !== undefined && (typeof input.budgetCap !== "number" || !Number.isFinite(input.budgetCap) || input.budgetCap <= 0)) {
364
+ throw new Error("FICOInput.budgetCap must be a positive number");
365
+ }
366
+ // Validate individual transactions
367
+ for (const tx of input.transactions) {
368
+ if (typeof tx.amount !== "number" || !Number.isFinite(tx.amount)) {
369
+ throw new Error(`Transaction ${tx.id}: amount must be a finite number`);
370
+ }
371
+ if (!(tx.createdAt instanceof Date) || isNaN(tx.createdAt.getTime())) {
372
+ throw new Error(`Transaction ${tx.id}: createdAt must be a valid Date`);
373
+ }
374
+ }
375
+ }
376
+ /**
377
+ * Serialize FICO result for storage/transmission.
378
+ * Strips non-essential data to reduce payload.
379
+ */
380
+ static serialize(result) {
381
+ return JSON.stringify(result);
382
+ }
383
+ /**
384
+ * Deserialize with validation — never trust stored scores.
385
+ */
386
+ static deserialize(json) {
387
+ const data = JSON.parse(json);
388
+ if (typeof data.score !== "number" || data.score < 300 || data.score > 850) {
389
+ throw new Error("Invalid FICO score: must be 300-850");
390
+ }
391
+ // Re-clamp all component scores on load (defense in depth)
392
+ for (const key of ["paymentHistory", "creditUtilization", "historyLength", "behaviorDiversity", "fraudRecord"]) {
393
+ if (data.components?.[key]) {
394
+ data.components[key].score = clamp(data.components[key].score);
395
+ }
396
+ }
397
+ return data;
398
+ }
399
+ }
400
+ exports.AgentFICO = AgentFICO;
401
+ // ─── Helpers ────────────────────────────────────────────────────────────────
402
+ function clamp(score) {
403
+ return Math.max(0, Math.min(100, Math.round(score * 100) / 100));
404
+ }
405
+ function extractCategory(reason) {
406
+ if (!reason || typeof reason !== "string")
407
+ return "unknown";
408
+ // Normalize and extract first meaningful word
409
+ const lower = reason.toLowerCase().trim();
410
+ // Common transaction categories
411
+ const CATEGORIES = [
412
+ "purchase", "subscription", "service", "api", "compute", "storage",
413
+ "transfer", "fee", "refund", "payment", "invoice", "tip", "donation",
414
+ "license", "hosting", "data", "analysis", "research", "test",
415
+ ];
416
+ for (const cat of CATEGORIES) {
417
+ if (lower.includes(cat))
418
+ return cat;
419
+ }
420
+ // Fallback: first word
421
+ const firstWord = lower.split(/\s+/)[0]?.replace(/[^a-z]/g, "");
422
+ return firstWord || "unknown";
423
+ }
424
+ //# sourceMappingURL=fico.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fico.js","sourceRoot":"","sources":["../src/fico.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -346,5 +346,13 @@ export { CommerceEngine, MockCommerceProvider } from "./commerce.js";
346
346
  export type { ShoppingMandate, ProductResult, PurchaseOrder, CommerceProvider, SearchOptions, ApprovalCallback } from "./commerce.js";
347
347
  export { AdaptiveEngine, DEFAULT_ADAPTIVE_CONFIG } from "./adaptive.js";
348
348
  export type { AdaptiveConfig, AgentInsight, BusinessMetrics, AdaptationRecord, AdaptiveEvent, AdaptiveEventType } from "./adaptive.js";
349
+ export { AgentFICO, DEFAULT_FICO_CONFIG } from "./fico.js";
350
+ export type { FICOInput, FICOResult, FICOComponent, FICOConfig, FICOTransaction } from "./fico.js";
351
+ export { MerkleTree } from "./integrity.js";
352
+ export type { MerkleLeaf, MerkleProof, IntegritySnapshot, TamperResult, IntegrityAuditEntry } from "./integrity.js";
353
+ export { BehavioralEngine, DEFAULT_BEHAVIORAL_CONFIG } from "./behavioral.js";
354
+ export type { BehavioralConfig, ProspectValue, CoolingOffResult, CommitmentResult, LossFrame, ReframedExpense, RegretEntry, RegretPrediction, OverconfidenceResult, AssetMetrics, HerdAlert, FinancialGoal, EndowedProgress, TradeEntry } from "./behavioral.js";
355
+ export { EWMADetector, BehaviorMonitor, CanarySystem, DEFAULT_ANOMALY_CONFIG } from "./anomaly.js";
356
+ export type { EWMAState, EWMAAlert, BehaviorFingerprint, HijackDetection, CanaryTransaction, CanaryAlert, AnomalyConfig } from "./anomaly.js";
349
357
  export { default as createSandboxServer } from "./mcp/server.js";
350
358
  //# sourceMappingURL=index.d.ts.map