@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,401 @@
1
+ "use strict";
2
+ /**
3
+ * Merkle Tree Memory Integrity — Tamper-Evident Agent Memory
4
+ *
5
+ * Protects against MemoryGraft attacks (injecting false memories into agent
6
+ * context) by maintaining a Merkle hash tree over all memory writes.
7
+ *
8
+ * How it works:
9
+ * 1. Every memory write produces a leaf hash: SHA-256(id + content + timestamp)
10
+ * 2. Leaf hashes build a binary Merkle tree
11
+ * 3. The root hash represents the entire memory state
12
+ * 4. Any modification to any memory changes the root
13
+ * 5. Merkle proofs verify individual memories without full tree traversal
14
+ *
15
+ * Attack vectors defended:
16
+ * - MemoryGraft: Injecting fabricated memories → root changes, detected
17
+ * - Memory tampering: Modifying existing memory content → leaf hash changes
18
+ * - Memory deletion: Removing memories silently → tree structure changes
19
+ * - Replay attacks: Re-inserting old memories → duplicate leaf detection
20
+ * - Reordering attacks: Changing memory chronology → position-dependent hashing
21
+ *
22
+ * References:
23
+ * - Merkle, R. (1987). "A Digital Signature Based on a Conventional Encryption Function"
24
+ * - OWASP Agentic AI Top 10 2026: A03 — Memory Poisoning
25
+ * - MnemoPay Master Strategy, Part 2.1 — Merkle tree memory integrity
26
+ */
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.MerkleTree = void 0;
29
+ // ─── SHA-256 Hashing ────────────────────────────────────────────────────────
30
+ let _crypto;
31
+ function getHash(data) {
32
+ if (!_crypto) {
33
+ try {
34
+ _crypto = require("crypto");
35
+ }
36
+ catch {
37
+ // Browser fallback: use SubtleCrypto synchronously is not possible,
38
+ // so we use a simple non-cryptographic hash for environments without Node crypto.
39
+ // This should never happen in production (Node.js always has crypto).
40
+ throw new Error("MerkleTree requires Node.js crypto module");
41
+ }
42
+ }
43
+ return _crypto.createHash("sha256").update(data).digest("hex");
44
+ }
45
+ // ─── Merkle Tree ────────────────────────────────────────────────────────────
46
+ class MerkleTree {
47
+ leaves = [];
48
+ leafMap = new Map(); // memoryId → index
49
+ hashSet = new Set(); // duplicate detection
50
+ auditLog = [];
51
+ /** Max audit log entries to prevent unbounded growth */
52
+ static MAX_AUDIT_LOG = 1000;
53
+ /** Max leaves before requiring compaction */
54
+ static MAX_LEAVES = 100_000;
55
+ /**
56
+ * Add a memory entry to the tree.
57
+ * Returns the leaf hash.
58
+ */
59
+ /** Max content size per leaf (100KB, matching memory limit) */
60
+ static MAX_CONTENT_SIZE = 102_400;
61
+ addLeaf(memoryId, content, timestamp) {
62
+ if (!memoryId || typeof memoryId !== "string")
63
+ throw new Error("memoryId is required");
64
+ if (!content || typeof content !== "string")
65
+ throw new Error("content is required");
66
+ if (memoryId.length > 256)
67
+ throw new Error("memoryId exceeds 256 characters");
68
+ if (content.length > MerkleTree.MAX_CONTENT_SIZE)
69
+ throw new Error(`Content exceeds ${MerkleTree.MAX_CONTENT_SIZE} bytes`);
70
+ if (this.leaves.length >= MerkleTree.MAX_LEAVES) {
71
+ throw new Error(`Merkle tree leaf limit reached (${MerkleTree.MAX_LEAVES}). Compact old memories first.`);
72
+ }
73
+ // Compute leaf hash: H(index || memoryId || content || timestamp)
74
+ // Including index prevents reordering attacks
75
+ const ts = timestamp ?? new Date().toISOString();
76
+ const index = this.leaves.length;
77
+ const leafData = `${index}:${memoryId}:${content}:${ts}`;
78
+ const hash = getHash(leafData);
79
+ // Duplicate detection: same hash means identical content at same position
80
+ if (this.hashSet.has(hash)) {
81
+ throw new Error(`Duplicate leaf detected for memory ${memoryId}`);
82
+ }
83
+ // If this memoryId was already added (memory update), remove the old leaf
84
+ if (this.leafMap.has(memoryId)) {
85
+ this._removeLeafByMemoryId(memoryId);
86
+ }
87
+ const leaf = { hash, memoryId, index };
88
+ this.leaves.push(leaf);
89
+ this.leafMap.set(memoryId, this.leaves.length - 1);
90
+ this.hashSet.add(hash);
91
+ this._audit("leaf_added", memoryId);
92
+ return hash;
93
+ }
94
+ /**
95
+ * Remove a memory from the tree (when memory is forgotten).
96
+ */
97
+ removeLeaf(memoryId) {
98
+ if (!this.leafMap.has(memoryId))
99
+ return false;
100
+ this._removeLeafByMemoryId(memoryId);
101
+ this._audit("leaf_removed", memoryId);
102
+ return true;
103
+ }
104
+ _removeLeafByMemoryId(memoryId) {
105
+ const idx = this.leafMap.get(memoryId);
106
+ if (idx === undefined)
107
+ return;
108
+ const leaf = this.leaves[idx];
109
+ if (leaf) {
110
+ this.hashSet.delete(leaf.hash);
111
+ }
112
+ // Mark as removed (null-ify) rather than splicing to preserve indices
113
+ // This avoids O(n) shifts and keeps proofs stable
114
+ this.leaves[idx] = null;
115
+ this.leafMap.delete(memoryId);
116
+ }
117
+ /**
118
+ * Compute the Merkle root from all current leaves.
119
+ * Uses standard binary tree construction: H(left || right).
120
+ */
121
+ getRoot() {
122
+ const activeLeaves = this.leaves.filter(l => l !== null);
123
+ if (activeLeaves.length === 0)
124
+ return getHash("empty");
125
+ let level = activeLeaves.map(l => l.hash);
126
+ // Build tree bottom-up
127
+ while (level.length > 1) {
128
+ const nextLevel = [];
129
+ for (let i = 0; i < level.length; i += 2) {
130
+ const left = level[i];
131
+ const right = i + 1 < level.length ? level[i + 1] : left; // Duplicate last if odd
132
+ // Canonical ordering: always hash(smaller || larger) to prevent order-dependent roots
133
+ // when reconstructing from unordered sets. But for Merkle trees, positional ordering
134
+ // is correct (left child is always the lower index).
135
+ nextLevel.push(getHash(left + right));
136
+ }
137
+ level = nextLevel;
138
+ }
139
+ return level[0];
140
+ }
141
+ /**
142
+ * Generate a Merkle proof for a specific memory.
143
+ * The proof allows verifying this memory is in the tree without the full tree.
144
+ */
145
+ getProof(memoryId) {
146
+ const idx = this.leafMap.get(memoryId);
147
+ if (idx === undefined)
148
+ throw new Error(`Memory ${memoryId} not in tree`);
149
+ const leaf = this.leaves[idx];
150
+ if (!leaf)
151
+ throw new Error(`Memory ${memoryId} has been removed`);
152
+ const activeLeaves = this.leaves.filter(l => l !== null);
153
+ const activeIndex = activeLeaves.findIndex(l => l.memoryId === memoryId);
154
+ if (activeIndex === -1)
155
+ throw new Error(`Memory ${memoryId} not found in active leaves`);
156
+ // Build proof path
157
+ let level = activeLeaves.map(l => l.hash);
158
+ const path = [];
159
+ let currentIdx = activeIndex;
160
+ while (level.length > 1) {
161
+ const nextLevel = [];
162
+ for (let i = 0; i < level.length; i += 2) {
163
+ const left = level[i];
164
+ const right = i + 1 < level.length ? level[i + 1] : left;
165
+ if (i === currentIdx || i + 1 === currentIdx) {
166
+ // This pair contains our node
167
+ if (currentIdx % 2 === 0) {
168
+ // Our node is left child, sibling is right
169
+ const siblingHash = i + 1 < level.length ? level[i + 1] : level[i];
170
+ path.push({ hash: siblingHash, direction: "right" });
171
+ }
172
+ else {
173
+ // Our node is right child, sibling is left
174
+ path.push({ hash: level[i], direction: "left" });
175
+ }
176
+ }
177
+ nextLevel.push(getHash(left + right));
178
+ }
179
+ currentIdx = Math.floor(currentIdx / 2);
180
+ level = nextLevel;
181
+ }
182
+ return {
183
+ leafHash: leaf.hash,
184
+ memoryId,
185
+ path,
186
+ rootHash: this.getRoot(),
187
+ };
188
+ }
189
+ /**
190
+ * Verify a Merkle proof is valid.
191
+ * Returns true if the proof correctly links the leaf to the root.
192
+ */
193
+ static verifyProof(proof) {
194
+ if (!proof || !proof.leafHash || !proof.rootHash || !Array.isArray(proof.path)) {
195
+ return false;
196
+ }
197
+ let currentHash = proof.leafHash;
198
+ for (const step of proof.path) {
199
+ if (step.direction === "left") {
200
+ currentHash = getHash(step.hash + currentHash);
201
+ }
202
+ else {
203
+ currentHash = getHash(currentHash + step.hash);
204
+ }
205
+ }
206
+ return currentHash === proof.rootHash;
207
+ }
208
+ /**
209
+ * Verify a specific memory's content against the tree.
210
+ * Re-computes the leaf hash and checks it matches the stored hash.
211
+ */
212
+ verifyMemory(memoryId, content, timestamp) {
213
+ const idx = this.leafMap.get(memoryId);
214
+ if (idx === undefined)
215
+ return false;
216
+ const leaf = this.leaves[idx];
217
+ if (!leaf)
218
+ return false;
219
+ // Recompute the hash
220
+ const leafData = `${leaf.index}:${memoryId}:${content}:${timestamp}`;
221
+ const expectedHash = getHash(leafData);
222
+ const match = expectedHash === leaf.hash;
223
+ this._audit(match ? "verification_pass" : "verification_fail", memoryId);
224
+ return match;
225
+ }
226
+ /**
227
+ * Take a snapshot of current tree state.
228
+ * Used for periodic checkpointing and tamper detection.
229
+ */
230
+ snapshot() {
231
+ const rootHash = this.getRoot();
232
+ const leafCount = this.leaves.filter(l => l !== null).length;
233
+ const timestamp = new Date().toISOString();
234
+ const snapshotData = `${rootHash}:${leafCount}:${timestamp}`;
235
+ const snapshotHash = getHash(snapshotData);
236
+ this._audit("snapshot_created");
237
+ return { rootHash, leafCount, timestamp, snapshotHash };
238
+ }
239
+ /**
240
+ * Detect tampering by comparing current root to a previous snapshot.
241
+ * Also validates snapshot integrity (the snapshot itself wasn't tampered).
242
+ */
243
+ detectTampering(previousSnapshot) {
244
+ // First, verify the snapshot itself wasn't tampered
245
+ const expectedSnapshotHash = getHash(`${previousSnapshot.rootHash}:${previousSnapshot.leafCount}:${previousSnapshot.timestamp}`);
246
+ if (expectedSnapshotHash !== previousSnapshot.snapshotHash) {
247
+ return {
248
+ tampered: true,
249
+ failedMemories: [],
250
+ currentRoot: this.getRoot(),
251
+ expectedRoot: previousSnapshot.rootHash,
252
+ summary: "CRITICAL: The snapshot itself has been tampered with. Cannot trust any comparison.",
253
+ };
254
+ }
255
+ const currentRoot = this.getRoot();
256
+ const currentLeafCount = this.leaves.filter(l => l !== null).length;
257
+ if (currentRoot === previousSnapshot.rootHash) {
258
+ return {
259
+ tampered: false,
260
+ failedMemories: [],
261
+ currentRoot,
262
+ expectedRoot: previousSnapshot.rootHash,
263
+ summary: `Integrity verified. ${currentLeafCount} memories, root matches snapshot.`,
264
+ };
265
+ }
266
+ // Root changed — determine what changed
267
+ const leafDiff = currentLeafCount - previousSnapshot.leafCount;
268
+ let summary = `Root hash mismatch. Leaves: ${previousSnapshot.leafCount} → ${currentLeafCount} (${leafDiff >= 0 ? "+" : ""}${leafDiff}).`;
269
+ if (leafDiff > 0) {
270
+ summary += ` ${leafDiff} new memories added since snapshot.`;
271
+ }
272
+ else if (leafDiff < 0) {
273
+ summary += ` ${Math.abs(leafDiff)} memories removed since snapshot.`;
274
+ }
275
+ else {
276
+ summary += " Same leaf count but content changed — possible memory modification.";
277
+ this._audit("tamper_detected");
278
+ }
279
+ return {
280
+ tampered: true,
281
+ failedMemories: [], // Would need per-memory tracking to identify specific changes
282
+ currentRoot,
283
+ expectedRoot: previousSnapshot.rootHash,
284
+ summary,
285
+ };
286
+ }
287
+ /**
288
+ * Full tree verification: recompute root from all leaves and verify
289
+ * internal consistency (no corrupted nodes).
290
+ */
291
+ verifyTreeIntegrity() {
292
+ const activeLeaves = this.leaves.filter(l => l !== null);
293
+ const computedRoot = this.getRoot();
294
+ // Verify no hash collisions in leaf set
295
+ const uniqueHashes = new Set(activeLeaves.map(l => l.hash));
296
+ if (uniqueHashes.size !== activeLeaves.length) {
297
+ return { valid: false, leafCount: activeLeaves.length, rootHash: computedRoot };
298
+ }
299
+ // Verify leaf map consistency
300
+ for (const [memId, idx] of this.leafMap) {
301
+ const leaf = this.leaves[idx];
302
+ if (!leaf || leaf.memoryId !== memId) {
303
+ return { valid: false, leafCount: activeLeaves.length, rootHash: computedRoot };
304
+ }
305
+ }
306
+ return { valid: true, leafCount: activeLeaves.length, rootHash: computedRoot };
307
+ }
308
+ /** Number of active (non-removed) leaves */
309
+ get size() {
310
+ return this.leaves.filter(l => l !== null).length;
311
+ }
312
+ /** Get the audit log */
313
+ getAuditLog() {
314
+ return [...this.auditLog];
315
+ }
316
+ /**
317
+ * Compact the tree by removing null entries and re-indexing.
318
+ * This is a heavy operation — call during maintenance windows only.
319
+ * WARNING: This invalidates all existing proofs.
320
+ */
321
+ compact() {
322
+ const before = this.leaves.length;
323
+ const activeLeaves = this.leaves.filter(l => l !== null);
324
+ // Re-index
325
+ this.leaves = [];
326
+ this.leafMap.clear();
327
+ this.hashSet.clear();
328
+ for (let i = 0; i < activeLeaves.length; i++) {
329
+ const leaf = { ...activeLeaves[i], index: i };
330
+ this.leaves.push(leaf);
331
+ this.leafMap.set(leaf.memoryId, i);
332
+ this.hashSet.add(leaf.hash);
333
+ }
334
+ return { removed: before - activeLeaves.length, remaining: activeLeaves.length };
335
+ }
336
+ /**
337
+ * Serialize tree state for persistence.
338
+ */
339
+ serialize() {
340
+ const activeLeaves = this.leaves.filter(l => l !== null);
341
+ return {
342
+ leaves: activeLeaves,
343
+ rootHash: this.getRoot(),
344
+ };
345
+ }
346
+ /**
347
+ * Deserialize from persisted state with validation.
348
+ */
349
+ static deserialize(data) {
350
+ if (!data || !Array.isArray(data.leaves)) {
351
+ throw new Error("Invalid MerkleTree data");
352
+ }
353
+ const tree = new MerkleTree();
354
+ const seenIds = new Set();
355
+ const seenHashes = new Set();
356
+ for (const leaf of data.leaves) {
357
+ // Validate each leaf
358
+ if (!leaf.hash || typeof leaf.hash !== "string" || leaf.hash.length !== 64) {
359
+ throw new Error(`Invalid leaf hash for memory ${leaf.memoryId}`);
360
+ }
361
+ if (!leaf.memoryId || typeof leaf.memoryId !== "string") {
362
+ throw new Error("Invalid leaf memoryId");
363
+ }
364
+ if (seenIds.has(leaf.memoryId)) {
365
+ throw new Error(`Duplicate memoryId in tree: ${leaf.memoryId}`);
366
+ }
367
+ if (seenHashes.has(leaf.hash)) {
368
+ throw new Error(`Duplicate hash in tree: ${leaf.hash}`);
369
+ }
370
+ seenIds.add(leaf.memoryId);
371
+ seenHashes.add(leaf.hash);
372
+ tree.leaves.push({ ...leaf, index: tree.leaves.length });
373
+ tree.leafMap.set(leaf.memoryId, tree.leaves.length - 1);
374
+ tree.hashSet.add(leaf.hash);
375
+ }
376
+ // Verify root matches if provided
377
+ if (data.rootHash) {
378
+ const computedRoot = tree.getRoot();
379
+ if (computedRoot !== data.rootHash) {
380
+ throw new Error(`Root hash mismatch on deserialize: computed ${computedRoot}, expected ${data.rootHash}. Tree may be corrupted.`);
381
+ }
382
+ }
383
+ return tree;
384
+ }
385
+ _audit(event, memoryId) {
386
+ // Root hash is computed lazily — only include it for verification/snapshot events
387
+ // to avoid O(n) cost on every leaf add/remove
388
+ const needsRoot = event === "verification_pass" || event === "verification_fail" || event === "tamper_detected" || event === "snapshot_created";
389
+ this.auditLog.push({
390
+ event,
391
+ memoryId,
392
+ rootHash: needsRoot ? this.getRoot() : "",
393
+ timestamp: new Date().toISOString(),
394
+ });
395
+ if (this.auditLog.length > MerkleTree.MAX_AUDIT_LOG) {
396
+ this.auditLog.splice(0, this.auditLog.length - (MerkleTree.MAX_AUDIT_LOG / 2));
397
+ }
398
+ }
399
+ }
400
+ exports.MerkleTree = MerkleTree;
401
+ //# sourceMappingURL=integrity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrity.js","sourceRoot":"","sources":["../src/integrity.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAmiBnE,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAmfjD;AAID,MAAM,CAAC,OAAO,UAAU,mBAAmB,IAAI,MAAM,CAgBpD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AA4sBnE,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAmfjD;AAID,MAAM,CAAC,OAAO,UAAU,mBAAmB,IAAI,MAAM,CAgBpD"}
@@ -338,6 +338,80 @@ const TOOLS = [
338
338
  },
339
339
  },
340
340
  },
341
+ // ── Agent FICO ─────────────────────────────────────────────────────────────
342
+ {
343
+ name: "agent_fico_score",
344
+ description: "Compute the agent's FICO credit score (300-850). Uses payment history, " +
345
+ "credit utilization, account age, behavior diversity, and fraud record. " +
346
+ "Returns score, rating, fee rate, trust level, and HITL requirement.",
347
+ inputSchema: {
348
+ type: "object",
349
+ properties: {
350
+ budgetCap: {
351
+ type: "number",
352
+ minimum: 1,
353
+ description: "Agent's budget cap for utilization calculation (default: 10000)",
354
+ },
355
+ fraudFlags: { type: "number", minimum: 0, description: "Number of fraud flags (default: 0)" },
356
+ disputeCount: { type: "number", minimum: 0, description: "Total disputes filed (default: 0)" },
357
+ disputesLost: { type: "number", minimum: 0, description: "Disputes lost (default: 0)" },
358
+ warnings: { type: "number", minimum: 0, description: "Fraud warnings (default: 0)" },
359
+ },
360
+ },
361
+ },
362
+ // ── Behavioral Finance ─────────────────────────────────────────────────────
363
+ {
364
+ name: "behavioral_analysis",
365
+ description: "Run behavioral finance analysis on a proposed spending amount. " +
366
+ "Returns prospect theory value, cooling-off recommendation, and loss framing. " +
367
+ "Based on Kahneman & Tversky (1992) and Thaler & Benartzi (2004).",
368
+ inputSchema: {
369
+ type: "object",
370
+ properties: {
371
+ amount: { type: "number", description: "The spending amount to analyze" },
372
+ monthlyIncome: {
373
+ type: "number",
374
+ minimum: 1,
375
+ description: "Agent's monthly income/budget for cooling-off calculation",
376
+ },
377
+ goalName: { type: "string", description: "Savings goal name for loss framing" },
378
+ goalTarget: { type: "number", description: "Savings goal target amount" },
379
+ goalCurrent: { type: "number", description: "Current savings toward goal" },
380
+ goalMonthlySavings: { type: "number", description: "Monthly savings rate" },
381
+ },
382
+ required: ["amount"],
383
+ },
384
+ },
385
+ // ── Memory Integrity ───────────────────────────────────────────────────────
386
+ {
387
+ name: "memory_integrity_check",
388
+ description: "Check the integrity of the agent's memory store using SHA-256 Merkle trees. " +
389
+ "Detects tampering, injection, deletion, replay, and reordering attacks. " +
390
+ "Returns root hash, leaf count, and tampering status.",
391
+ inputSchema: {
392
+ type: "object",
393
+ properties: {
394
+ snapshotHash: {
395
+ type: "string",
396
+ description: "Previous snapshot hash to compare against (optional — omit for first check)",
397
+ },
398
+ },
399
+ },
400
+ },
401
+ // ── Anomaly Detection ──────────────────────────────────────────────────────
402
+ {
403
+ name: "anomaly_check",
404
+ description: "Check if a transaction amount is anomalous using EWMA streaming detection. " +
405
+ "Returns whether the value is normal, a warning, or a critical anomaly. " +
406
+ "Based on Roberts (1959) and Lucas & Saccucci (1990).",
407
+ inputSchema: {
408
+ type: "object",
409
+ properties: {
410
+ amount: { type: "number", description: "Transaction amount to check" },
411
+ },
412
+ required: ["amount"],
413
+ },
414
+ },
341
415
  ];
342
416
  // ─── Tool execution ─────────────────────────────────────────────────────────
343
417
  async function executeTool(agent, name, args) {
@@ -494,10 +568,88 @@ async function executeTool(agent, name, args) {
494
568
  (o.trackingUrl ? ` Track: ${o.trackingUrl}` : "")).join("\n");
495
569
  return `${list}\n\nSpent: $${summary.totalSpent.toFixed(2)} | Remaining: $${summary.remainingBudget.toFixed(2)} | Orders: ${summary.orderCount}`;
496
570
  }
571
+ // ── Agent FICO ─────────────────────────────────────────────────────────
572
+ case "agent_fico_score": {
573
+ const fico = new index_js_2.AgentFICO();
574
+ const txHistory = await agent.history(1000);
575
+ const profile = await agent.profile();
576
+ const result = fico.compute({
577
+ transactions: txHistory.map((tx) => ({
578
+ id: tx.id,
579
+ amount: tx.amount,
580
+ status: tx.status,
581
+ reason: tx.reason || "",
582
+ createdAt: new Date(tx.createdAt),
583
+ settledAt: tx.settledAt ? new Date(tx.settledAt) : undefined,
584
+ counterparty: tx.counterparty,
585
+ })),
586
+ createdAt: new Date(Date.now() - 86400000 * 30),
587
+ fraudFlags: args.fraudFlags ?? 0,
588
+ disputeCount: args.disputeCount ?? 0,
589
+ disputesLost: args.disputesLost ?? 0,
590
+ warnings: args.warnings ?? 0,
591
+ budgetCap: args.budgetCap ?? 10000,
592
+ memoriesCount: profile.memoriesCount ?? 0,
593
+ });
594
+ return JSON.stringify(result, null, 2);
595
+ }
596
+ // ── Behavioral Finance ─────────────────────────────────────────────────
597
+ case "behavioral_analysis": {
598
+ const behavioral = new index_js_2.BehavioralEngine();
599
+ const prospect = behavioral.prospectValue(args.amount);
600
+ const analysis = { prospect };
601
+ if (args.monthlyIncome) {
602
+ analysis.coolingOff = behavioral.coolingOff(args.amount, args.monthlyIncome);
603
+ }
604
+ if (args.goalName && args.goalTarget && args.goalCurrent !== undefined && args.goalMonthlySavings) {
605
+ analysis.lossFrame = behavioral.lossFrame(args.amount, {
606
+ name: args.goalName,
607
+ target: args.goalTarget,
608
+ current: args.goalCurrent,
609
+ monthlySavings: args.goalMonthlySavings,
610
+ });
611
+ }
612
+ return JSON.stringify(analysis, null, 2);
613
+ }
614
+ // ── Memory Integrity ─────────────────────────────────────────────────
615
+ case "memory_integrity_check": {
616
+ const tree = _merkleTree;
617
+ if (!tree || tree.size === 0) {
618
+ // Build tree from current memories
619
+ const memories = await agent.recall(50);
620
+ for (const m of memories) {
621
+ tree.addLeaf(m.id, m.content);
622
+ }
623
+ }
624
+ const snapshot = tree.snapshot();
625
+ const result = {
626
+ rootHash: snapshot.rootHash,
627
+ leafCount: snapshot.leafCount,
628
+ snapshotHash: snapshot.snapshotHash,
629
+ };
630
+ if (args.snapshotHash) {
631
+ const check = tree.detectTampering({
632
+ rootHash: args.snapshotHash,
633
+ leafCount: snapshot.leafCount,
634
+ snapshotHash: args.snapshotHash,
635
+ timestamp: new Date().toISOString(),
636
+ });
637
+ result.tampering = check;
638
+ }
639
+ return JSON.stringify(result, null, 2);
640
+ }
641
+ // ── Anomaly Detection ────────────────────────────────────────────────
642
+ case "anomaly_check": {
643
+ const result = _ewmaDetector.update(args.amount);
644
+ return JSON.stringify(result, null, 2);
645
+ }
497
646
  default:
498
647
  throw new Error(`Unknown tool: ${name}`);
499
648
  }
500
649
  }
650
+ // ── Module singletons ────────────────────────────────────────────────────────
651
+ const _merkleTree = new index_js_2.MerkleTree();
652
+ const _ewmaDetector = new index_js_2.EWMADetector(0.15, 2.5, 3.5, 10);
501
653
  // ── Commerce singleton ──────────────────────────────────────────────────────
502
654
  let _commerceEngine = null;
503
655
  async function getCommerceEngine(agent) {
@@ -510,7 +662,7 @@ async function getCommerceEngine(agent) {
510
662
  // ─── Server setup ───────────────────────────────────────────────────────────
511
663
  async function startServer() {
512
664
  const agent = createAgent();
513
- const server = new index_js_1.Server({ name: "mnemopay", version: "0.9.3" }, { capabilities: { tools: {}, resources: {}, prompts: {} } });
665
+ const server = new index_js_1.Server({ name: "mnemopay", version: "1.0.0-beta.1" }, { capabilities: { tools: {}, resources: {}, prompts: {} } });
514
666
  // ── Tools ───────────────────────────────────────────────────────────────
515
667
  server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
516
668
  tools: TOOLS,
@@ -967,7 +1119,7 @@ async function startServer() {
967
1119
  // ─── Smithery sandbox — allows tool scanning without real credentials ──────
968
1120
  function createSandboxServer() {
969
1121
  const agent = index_js_2.MnemoPay.quick("smithery-sandbox");
970
- const server = new index_js_1.Server({ name: "mnemopay", version: "0.9.3" }, { capabilities: { tools: {}, resources: {}, prompts: {} } });
1122
+ const server = new index_js_1.Server({ name: "mnemopay", version: "1.0.0-beta.1" }, { capabilities: { tools: {}, resources: {}, prompts: {} } });
971
1123
  server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({ tools: TOOLS }));
972
1124
  server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
973
1125
  const { name, arguments: args } = request.params;