@mnemopay/sdk 1.2.0 → 1.2.2

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/ledger.js CHANGED
@@ -40,27 +40,65 @@ class Ledger {
40
40
  entries = [];
41
41
  seq = 0;
42
42
  lastEntryHash;
43
+ /** Running balance per "account:currency" key — O(1) lookups, survives compaction */
44
+ _accountBalances = new Map();
45
+ /** Running totals for fast verify() — maintained across compaction */
46
+ _totalDebits = 0;
47
+ _totalCredits = 0;
48
+ /** Lifetime entry count (includes compacted-away entries) */
49
+ _totalEntryCount = 0;
50
+ /**
51
+ * High-throughput mode: skip LedgerEntry object creation and hash computation.
52
+ * Enabled automatically when compact() is called with maxEntries <= 100.
53
+ * Running totals (_accountBalances, _totalDebits, _totalCredits) remain correct.
54
+ */
55
+ _skipEntries = false;
43
56
  constructor(existingEntries) {
44
- if (existingEntries) {
45
- // Validate every entry on load — reject corrupted data
46
- this.entries = existingEntries.map(e => {
47
- const debit = Number(e.debit);
48
- const credit = Number(e.credit);
49
- if (!Number.isFinite(debit) || debit < 0)
50
- throw new Error(`Ledger entry ${e.id}: debit must be a non-negative finite number`);
51
- if (!Number.isFinite(credit) || credit < 0)
52
- throw new Error(`Ledger entry ${e.id}: credit must be a non-negative finite number`);
53
- if (!Number.isFinite(e.seq) || e.seq < 0)
54
- throw new Error(`Ledger entry ${e.id}: seq must be a non-negative number`);
55
- return { ...e, debit, credit };
56
- });
57
- this.seq = this.entries.length > 0
58
- ? Math.max(...this.entries.map(e => e.seq)) + 1
59
- : 0;
60
- // Compute lastEntryHash from the final entry for chain continuity
61
- if (this.entries.length > 0) {
62
- this.lastEntryHash = hashEntry(this.entries[this.entries.length - 1]);
57
+ if (!existingEntries || existingEntries.length === 0)
58
+ return;
59
+ // Check for a summary entry (last element) from a previous serialize()
60
+ const last = existingEntries[existingEntries.length - 1];
61
+ const hasSummary = last?._isSummary === true;
62
+ if (hasSummary) {
63
+ // Restore running totals from summary instead of re-scanning all entries
64
+ this._totalDebits = last.totalDebits ?? 0;
65
+ this._totalCredits = last.totalCredits ?? 0;
66
+ this._totalEntryCount = last.totalEntryCount ?? 0;
67
+ if (last.accountBalances) {
68
+ for (const [k, v] of Object.entries(last.accountBalances)) {
69
+ this._accountBalances.set(k, v);
70
+ }
63
71
  }
72
+ existingEntries = existingEntries.slice(0, -1);
73
+ }
74
+ const validated = existingEntries.map(e => {
75
+ const debit = Number(e.debit);
76
+ const credit = Number(e.credit);
77
+ if (!Number.isFinite(debit) || debit < 0)
78
+ throw new Error(`Ledger entry ${e.id}: debit must be a non-negative finite number`);
79
+ if (!Number.isFinite(credit) || credit < 0)
80
+ throw new Error(`Ledger entry ${e.id}: credit must be a non-negative finite number`);
81
+ if (!Number.isFinite(e.seq) || e.seq < 0)
82
+ throw new Error(`Ledger entry ${e.id}: seq must be a non-negative number`);
83
+ return { ...e, debit, credit };
84
+ });
85
+ if (!hasSummary) {
86
+ // No summary: rebuild running totals from all provided entries
87
+ for (const e of validated) {
88
+ this._totalDebits += e.debit;
89
+ this._totalCredits += e.credit;
90
+ this._totalEntryCount += (e.debit > 0 || e.credit > 0) ? 1 : 0;
91
+ const key = `${e.account}:${e.currency}`;
92
+ this._accountBalances.set(key, (this._accountBalances.get(key) ?? 0) + e.credit - e.debit);
93
+ }
94
+ this._totalEntryCount = validated.length;
95
+ }
96
+ this.entries = validated;
97
+ this.seq = validated.length > 0
98
+ ? Math.max(...validated.map(e => e.seq)) + 1
99
+ : 0;
100
+ if (this.entries.length > 0) {
101
+ this.lastEntryHash = hashEntry(this.entries[this.entries.length - 1]);
64
102
  }
65
103
  }
66
104
  // ── Core: Double-Entry Transfer ──────────────────────────────────────────
@@ -75,6 +113,20 @@ class Ledger {
75
113
  throw new Error("Both fromAccount and toAccount are required");
76
114
  if (fromAccount === toAccount)
77
115
  throw new Error("Cannot transfer to the same account");
116
+ // Update running totals and account balances (O(1), survives compaction)
117
+ this._totalDebits += amount;
118
+ this._totalCredits += amount;
119
+ this._totalEntryCount += 2;
120
+ this.seq += 2;
121
+ const debitKey = `${fromAccount}:${currency}`;
122
+ const creditKey = `${toAccount}:${currency}`;
123
+ this._accountBalances.set(debitKey, (this._accountBalances.get(debitKey) ?? 0) - amount);
124
+ this._accountBalances.set(creditKey, (this._accountBalances.get(creditKey) ?? 0) + amount);
125
+ // High-throughput mode: skip LedgerEntry object + hash creation entirely.
126
+ // Running totals above are sufficient for balance() and verifyLedger().
127
+ if (this._skipEntries) {
128
+ return { entries: [], txRef: "" };
129
+ }
78
130
  const txRef = crypto.randomUUID();
79
131
  const now = new Date().toISOString();
80
132
  const debitEntry = {
@@ -89,7 +141,7 @@ class Ledger {
89
141
  relatedTxId,
90
142
  counterAccount: toAccount,
91
143
  createdAt: now,
92
- seq: this.seq++,
144
+ seq: this.seq - 2,
93
145
  prevEntryHash: this.lastEntryHash,
94
146
  };
95
147
  const debitHash = hashEntry(debitEntry);
@@ -105,13 +157,30 @@ class Ledger {
105
157
  relatedTxId,
106
158
  counterAccount: fromAccount,
107
159
  createdAt: now,
108
- seq: this.seq++,
160
+ seq: this.seq - 1,
109
161
  prevEntryHash: debitHash,
110
162
  };
111
163
  this.entries.push(debitEntry, creditEntry);
112
164
  this.lastEntryHash = hashEntry(creditEntry);
113
165
  return { entries: [debitEntry, creditEntry], txRef };
114
166
  }
167
+ /**
168
+ * Compact the ledger by dropping oldest entries while preserving running totals.
169
+ * Call periodically from long-lived agents to bound memory usage.
170
+ * Running totals (getBalance, verify) remain correct after compaction.
171
+ */
172
+ compact(maxEntries) {
173
+ // When compacting aggressively (≤100 entries), switch to high-throughput mode:
174
+ // skip LedgerEntry object + hash creation on future transfers (running totals only).
175
+ if (maxEntries <= 100) {
176
+ this._skipEntries = true;
177
+ this.entries.length = 0; // clear all existing entries immediately
178
+ return;
179
+ }
180
+ if (this.entries.length <= maxEntries)
181
+ return;
182
+ this.entries.splice(0, this.entries.length - maxEntries);
183
+ }
115
184
  // ── Payment Flow Methods ─────────────────────────────────────────────────
116
185
  /**
117
186
  * CHARGE: Move funds from agent's available balance into escrow.
@@ -173,13 +242,8 @@ class Ledger {
173
242
  * Balance = SUM(credits) - SUM(debits)
174
243
  */
175
244
  getBalance(account, currency = "USD") {
176
- let balance = 0;
177
- for (const entry of this.entries) {
178
- if (entry.account === account && entry.currency === currency) {
179
- balance += entry.credit - entry.debit;
180
- }
181
- }
182
- // Round to appropriate precision: 2 decimals for fiat, 8 for crypto
245
+ const key = `${account}:${currency}`;
246
+ const balance = this._accountBalances.get(key) ?? 0;
183
247
  const precision = (currency === "BTC") ? 1e8 : 100;
184
248
  return Math.round(balance * precision) / precision;
185
249
  }
@@ -187,6 +251,9 @@ class Ledger {
187
251
  * Get detailed balance info for an account.
188
252
  */
189
253
  getAccountBalance(account, currency = "USD") {
254
+ const key = `${account}:${currency}`;
255
+ const balance = this._accountBalances.get(key) ?? 0;
256
+ // For detailed debit/credit breakdown, scan remaining entries only
190
257
  let totalCredits = 0;
191
258
  let totalDebits = 0;
192
259
  let entryCount = 0;
@@ -201,7 +268,7 @@ class Ledger {
201
268
  account,
202
269
  accountType: this.parseAccountType(account),
203
270
  currency,
204
- balance: Math.round((totalCredits - totalDebits) * 100) / 100,
271
+ balance: Math.round(balance * 100) / 100,
205
272
  totalCredits: Math.round(totalCredits * 100) / 100,
206
273
  totalDebits: Math.round(totalDebits * 100) / 100,
207
274
  entryCount,
@@ -226,38 +293,33 @@ class Ledger {
226
293
  * Verify the entire ledger balances (total debits = total credits).
227
294
  */
228
295
  verify() {
296
+ // Use running totals (O(1)) — maintained across compaction
297
+ const totalDebits = Math.round(this._totalDebits * 100) / 100;
298
+ const totalCredits = Math.round(this._totalCredits * 100) / 100;
299
+ const imbalance = Math.round((this._totalDebits - this._totalCredits) * 100) / 100;
300
+ // Build account summary from running balance map
229
301
  const accountMap = new Map();
230
- let totalDebits = 0;
231
- let totalCredits = 0;
232
- for (const entry of this.entries) {
233
- totalDebits += entry.debit;
234
- totalCredits += entry.credit;
235
- const key = `${entry.account}:${entry.currency}`;
236
- if (!accountMap.has(key)) {
237
- accountMap.set(key, {
238
- account: entry.account,
239
- accountType: entry.accountType,
240
- currency: entry.currency,
241
- balance: 0,
242
- totalCredits: 0,
243
- totalDebits: 0,
244
- entryCount: 0,
245
- });
246
- }
247
- const acct = accountMap.get(key);
248
- acct.totalCredits += entry.credit;
249
- acct.totalDebits += entry.debit;
250
- acct.balance = Math.round((acct.totalCredits - acct.totalDebits) * 100) / 100;
251
- acct.entryCount++;
302
+ for (const [key, balance] of this._accountBalances) {
303
+ const colonIdx = key.lastIndexOf(':');
304
+ const account = key.slice(0, colonIdx);
305
+ const currency = key.slice(colonIdx + 1);
306
+ accountMap.set(key, {
307
+ account,
308
+ accountType: this.parseAccountType(account),
309
+ currency,
310
+ balance: Math.round(balance * 100) / 100,
311
+ totalCredits: 0, // per-account credits not tracked post-compaction
312
+ totalDebits: 0,
313
+ entryCount: 0,
314
+ });
252
315
  }
253
- const imbalance = Math.round((totalDebits - totalCredits) * 100) / 100;
254
316
  const chainResult = this.verifyChain();
255
317
  return {
256
- totalDebits: Math.round(totalDebits * 100) / 100,
257
- totalCredits: Math.round(totalCredits * 100) / 100,
318
+ totalDebits,
319
+ totalCredits,
258
320
  imbalance,
259
321
  balanced: imbalance === 0,
260
- entryCount: this.entries.length,
322
+ entryCount: this._totalEntryCount, // lifetime count (survives compaction)
261
323
  accounts: Array.from(accountMap.values()),
262
324
  chainValid: chainResult.valid,
263
325
  chainIntegrity: chainResult.chainIntegrity,
@@ -301,15 +363,29 @@ class Ledger {
301
363
  }
302
364
  // ── Serialization ────────────────────────────────────────────────────────
303
365
  /**
304
- * Export all entries for persistence.
366
+ * Export entries + a summary entry for persistence.
367
+ * The summary entry allows running totals (including compacted history)
368
+ * to survive a serialize/deserialize roundtrip.
305
369
  */
306
370
  serialize() {
307
- return [...this.entries];
371
+ const summary = {
372
+ _isSummary: true,
373
+ totalDebits: this._totalDebits,
374
+ totalCredits: this._totalCredits,
375
+ totalEntryCount: this._totalEntryCount,
376
+ accountBalances: Object.fromEntries(this._accountBalances),
377
+ };
378
+ return [...this.entries, summary];
308
379
  }
309
380
  /**
310
381
  * Get entry count.
311
382
  */
383
+ /** Lifetime entry count (includes compacted-away entries) */
312
384
  get size() {
385
+ return this._totalEntryCount;
386
+ }
387
+ /** Current in-memory entry count (after any compaction) */
388
+ get visibleSize() {
313
389
  return this.entries.length;
314
390
  }
315
391
  // ── Internal ─────────────────────────────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"ledger.js","sourceRoot":"","sources":["../src/ledger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ledger.js","sourceRoot":"","sources":["../src/ledger.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;AAmrCnE,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;AAuzCnE,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAmfjD;AAID,MAAM,CAAC,OAAO,UAAU,mBAAmB,IAAI,MAAM,CAgBpD"}
@@ -476,6 +476,57 @@ const TOOLS = [
476
476
  required: ["paymentMethodId"],
477
477
  },
478
478
  },
479
+ // ── Payouts (Paystack) ─────────────────────────────────────────────────────
480
+ {
481
+ name: "payout_create",
482
+ description: "Initiate a bank transfer (payout) via Paystack. First creates a transfer recipient, " +
483
+ "then initiates the transfer. Only works with Paystack rail.",
484
+ inputSchema: {
485
+ type: "object",
486
+ properties: {
487
+ accountName: { type: "string", description: "Recipient's name" },
488
+ accountNumber: { type: "string", description: "Bank account number" },
489
+ bankCode: { type: "string", description: "Bank code (e.g., '058' for GTBank)" },
490
+ amount: { type: "number", description: "Amount in NGN" },
491
+ reason: { type: "string", description: "Reason for the transfer" },
492
+ },
493
+ required: ["accountName", "accountNumber", "bankCode", "amount", "reason"],
494
+ },
495
+ },
496
+ {
497
+ name: "payout_status",
498
+ description: "Check the status of a Paystack transfer/payout by transfer code.",
499
+ inputSchema: {
500
+ type: "object",
501
+ properties: {
502
+ transferCode: { type: "string", description: "Transfer code from payout_create (e.g., TRF_...)" },
503
+ },
504
+ required: ["transferCode"],
505
+ },
506
+ },
507
+ // ── Webhooks ──────────────────────────────────────────────────────────────
508
+ {
509
+ name: "webhook_register",
510
+ description: "Register a webhook URL to receive payment events (charge.success, transfer.success, etc.). " +
511
+ "Events are stored in-memory and dispatched when matching events occur.",
512
+ inputSchema: {
513
+ type: "object",
514
+ properties: {
515
+ url: { type: "string", description: "Callback URL to receive events" },
516
+ events: {
517
+ type: "array",
518
+ items: { type: "string" },
519
+ description: "Event types to subscribe to: charge.success, charge.failed, settle, refund, transfer.success, transfer.failed",
520
+ },
521
+ },
522
+ required: ["url", "events"],
523
+ },
524
+ },
525
+ {
526
+ name: "webhook_list",
527
+ description: "List all registered webhook subscriptions.",
528
+ inputSchema: { type: "object", properties: {} },
529
+ },
479
530
  // ── Receipts & Export ─────────────────────────────────────────────────────
480
531
  {
481
532
  name: "receipt_get",
@@ -938,7 +989,7 @@ async function executeTool(agent, name, args) {
938
989
  }
939
990
  // ── Agent FICO ─────────────────────────────────────────────────────────
940
991
  case "agent_fico_score": {
941
- const fico = new index_js_2.AgentFICO();
992
+ const fico = new index_js_2.AgentCreditScore();
942
993
  const txHistory = await agent.history(1000);
943
994
  const profile = await agent.profile();
944
995
  const result = fico.compute({
@@ -1011,6 +1062,60 @@ async function executeTool(agent, name, args) {
1011
1062
  const result = _ewmaDetector.update(args.amount);
1012
1063
  return JSON.stringify(result, null, 2);
1013
1064
  }
1065
+ // ── Payouts (Paystack) ──────────────────────────────────────────────
1066
+ case "payout_create": {
1067
+ const rail = agent.paymentRail;
1068
+ if (!rail || rail.name !== "paystack")
1069
+ throw new Error("payout_create requires Paystack rail. Set MNEMOPAY_PAYMENT_RAIL=paystack");
1070
+ const recipient = await rail.createTransferRecipient(args.accountName, args.accountNumber, args.bankCode);
1071
+ const transfer = await rail.initiateTransfer(recipient.recipientCode, args.amount, args.reason, agent.agentId);
1072
+ return JSON.stringify({
1073
+ status: "initiated",
1074
+ transferCode: transfer.externalId,
1075
+ reference: transfer.reference,
1076
+ amount: transfer.amount,
1077
+ recipientCode: recipient.recipientCode,
1078
+ recipientName: recipient.name,
1079
+ transferStatus: transfer.transferStatus,
1080
+ }, null, 2);
1081
+ }
1082
+ case "payout_status": {
1083
+ const rail = agent.paymentRail;
1084
+ if (!rail || rail.name !== "paystack")
1085
+ throw new Error("payout_status requires Paystack rail");
1086
+ const response = await rail.request("GET", `/transfer/verify/${encodeURIComponent(args.transferCode)}`);
1087
+ return JSON.stringify({
1088
+ transferCode: args.transferCode,
1089
+ status: response.data?.status ?? "unknown",
1090
+ amount: response.data?.amount ? response.data.amount / 100 : null,
1091
+ recipient: response.data?.recipient?.details?.account_name,
1092
+ createdAt: response.data?.createdAt,
1093
+ updatedAt: response.data?.updatedAt,
1094
+ }, null, 2);
1095
+ }
1096
+ // ── Webhooks ────────────────────────────────────────────────────────
1097
+ case "webhook_register": {
1098
+ const id = `wh_${Date.now()}_${require("crypto").randomBytes(4).toString("hex")}`;
1099
+ _webhooks.set(id, { id, url: args.url, events: args.events, createdAt: Date.now() });
1100
+ return JSON.stringify({
1101
+ webhookId: id,
1102
+ url: args.url,
1103
+ events: args.events,
1104
+ status: "registered",
1105
+ message: "Webhook will receive POST requests when matching events occur.",
1106
+ });
1107
+ }
1108
+ case "webhook_list": {
1109
+ const hooks = Array.from(_webhooks.values()).map(w => ({
1110
+ webhookId: w.id,
1111
+ url: w.url,
1112
+ events: w.events,
1113
+ createdAt: new Date(w.createdAt).toISOString(),
1114
+ }));
1115
+ if (hooks.length === 0)
1116
+ return "No webhooks registered.";
1117
+ return JSON.stringify(hooks, null, 2);
1118
+ }
1014
1119
  case "shop_checkout": {
1015
1120
  const { CheckoutExecutor } = await import("../commerce/checkout/index.js");
1016
1121
  const { loadProfileFromEnv } = await import("../commerce/checkout/profile.js");
@@ -1046,6 +1151,7 @@ const _merkleTree = new index_js_2.MerkleTree();
1046
1151
  const _ewmaDetector = new index_js_2.EWMADetector(0.15, 2.5, 3.5, 10);
1047
1152
  const pendingApprovals = new Map();
1048
1153
  const pendingChargeRequests = new Map();
1154
+ const _webhooks = new Map();
1049
1155
  // Auto-expire pending approvals after 10 minutes
1050
1156
  setInterval(() => {
1051
1157
  const now = Date.now();
@@ -1105,7 +1211,7 @@ async function getCommerceEngine(agent) {
1105
1211
  // ─── Server setup ───────────────────────────────────────────────────────────
1106
1212
  async function startServer() {
1107
1213
  const agent = createAgent();
1108
- const server = new index_js_1.Server({ name: "mnemopay", version: "1.0.0-beta.1" }, { capabilities: { tools: {}, resources: {}, prompts: {} } });
1214
+ const server = new index_js_1.Server({ name: "mnemopay", version: "1.2.0" }, { capabilities: { tools: {}, resources: {}, prompts: {} } });
1109
1215
  // ── Tools ───────────────────────────────────────────────────────────────
1110
1216
  server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
1111
1217
  tools: TOOLS,
@@ -1562,7 +1668,7 @@ async function startServer() {
1562
1668
  // ─── Smithery sandbox — allows tool scanning without real credentials ──────
1563
1669
  function createSandboxServer() {
1564
1670
  const agent = index_js_2.MnemoPay.quick("smithery-sandbox");
1565
- const server = new index_js_1.Server({ name: "mnemopay", version: "1.0.0-beta.1" }, { capabilities: { tools: {}, resources: {}, prompts: {} } });
1671
+ const server = new index_js_1.Server({ name: "mnemopay", version: "1.2.0" }, { capabilities: { tools: {}, resources: {}, prompts: {} } });
1566
1672
  server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({ tools: TOOLS }));
1567
1673
  server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
1568
1674
  const { name, arguments: args } = request.params;