@stellar-agent/mpp-client 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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 stellar-agent-bridge contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,10 @@
1
+ # @stellar-agent/mpp-client
2
+
3
+ Local MPP one-time charge and session-budget client support for the Testnet demo.
4
+
5
+ This package implements concrete local flows:
6
+
7
+ - one-time `402 -> policy -> Testnet payment -> retry with proof`
8
+ - session-budget `402 -> policy -> Testnet budget payment -> repeated proof requests`
9
+
10
+ Production facilitator flows are not implemented yet.
@@ -0,0 +1,142 @@
1
+ import { NetworkProfile, PaymentRequest, TestnetWallet } from "@stellar-agent/core";
2
+ import { Policy, SpendHistory, evaluatePaymentRequest } from "@stellar-agent/policy";
3
+ import { sendPayment } from "@stellar-agent/stellar";
4
+ export interface MppCharge {
5
+ protocol: "stellar-agent-local-mpp";
6
+ version: 1;
7
+ chargeId: string;
8
+ network: "testnet";
9
+ asset: string;
10
+ amount: string;
11
+ recipient: string;
12
+ resource: string;
13
+ memo?: string;
14
+ }
15
+ export interface MppPaymentProof {
16
+ protocol: "stellar-agent-local-mpp";
17
+ version: 1;
18
+ chargeId: string;
19
+ transactionHash: string;
20
+ ledger?: number;
21
+ payer: string;
22
+ recipient: string;
23
+ asset: string;
24
+ amount: string;
25
+ resource: string;
26
+ }
27
+ export interface MppPaymentResult {
28
+ firstStatus: number;
29
+ finalStatus: number;
30
+ charge: MppCharge;
31
+ policyDecision: ReturnType<typeof evaluatePaymentRequest>;
32
+ transaction?: {
33
+ hash: string;
34
+ ledger?: number;
35
+ successful: boolean;
36
+ feeCharged?: string;
37
+ };
38
+ receiptPath?: string;
39
+ responseBody?: string;
40
+ paidResourceDelivered?: boolean;
41
+ }
42
+ export interface MppSessionRequirement {
43
+ protocol: "stellar-agent-local-mpp-session";
44
+ version: 1;
45
+ sessionId: string;
46
+ network: "testnet";
47
+ asset: string;
48
+ budget: string;
49
+ pricePerRequest: string;
50
+ recipient: string;
51
+ resource: string;
52
+ memo?: string;
53
+ }
54
+ export interface MppSessionProof {
55
+ protocol: "stellar-agent-local-mpp-session";
56
+ version: 1;
57
+ sessionId: string;
58
+ transactionHash: string;
59
+ ledger?: number;
60
+ payer: string;
61
+ recipient: string;
62
+ asset: string;
63
+ budget: string;
64
+ pricePerRequest: string;
65
+ resource: string;
66
+ }
67
+ export interface MppSessionResult {
68
+ firstStatus: number;
69
+ finalStatus: number;
70
+ requestCount: number;
71
+ successfulRequests: number;
72
+ session: MppSessionRequirement;
73
+ proof?: MppSessionProof;
74
+ policyDecision: ReturnType<typeof evaluatePaymentRequest>;
75
+ transaction?: {
76
+ hash: string;
77
+ ledger?: number;
78
+ successful: boolean;
79
+ feeCharged?: string;
80
+ };
81
+ receiptPath?: string;
82
+ paidResourceDelivered?: boolean;
83
+ responses: Array<{
84
+ status: number;
85
+ body: string;
86
+ }>;
87
+ }
88
+ export declare function runMppPayment(args: {
89
+ url: string;
90
+ source: TestnetWallet;
91
+ policy: Policy;
92
+ profile: NetworkProfile;
93
+ receiptsDir: string;
94
+ eventLog: string;
95
+ command: string;
96
+ dryRun?: boolean;
97
+ spendHistory?: SpendHistory;
98
+ loadSpendHistory?: (request: PaymentRequest) => Promise<SpendHistory>;
99
+ fetchImpl?: typeof fetch;
100
+ sendPaymentImpl?: typeof sendPayment;
101
+ }): Promise<MppPaymentResult>;
102
+ export declare function runMppSession(args: {
103
+ url: string;
104
+ source: TestnetWallet;
105
+ policy: Policy;
106
+ profile: NetworkProfile;
107
+ receiptsDir: string;
108
+ eventLog: string;
109
+ command: string;
110
+ requestCount?: number;
111
+ dryRun?: boolean;
112
+ spendHistory?: SpendHistory;
113
+ loadSpendHistory?: (request: PaymentRequest) => Promise<SpendHistory>;
114
+ fetchImpl?: typeof fetch;
115
+ sendPaymentImpl?: typeof sendPayment;
116
+ }): Promise<MppSessionResult>;
117
+ export declare function parseMppCharge(response: Response): Promise<MppCharge>;
118
+ export declare function parseMppSessionRequirement(response: Response): Promise<MppSessionRequirement>;
119
+ export declare function validateCharge(value: unknown): MppCharge;
120
+ export declare function validateSessionRequirement(value: unknown): MppSessionRequirement;
121
+ export declare function startMppDemo(args: {
122
+ recipient: string;
123
+ amount?: string;
124
+ asset?: string;
125
+ port?: number;
126
+ host?: string;
127
+ }): Promise<{
128
+ url: string;
129
+ close(): Promise<void>;
130
+ }>;
131
+ export declare function startMppSessionDemo(args: {
132
+ recipient: string;
133
+ budget?: string;
134
+ pricePerRequest?: string;
135
+ asset?: string;
136
+ port?: number;
137
+ host?: string;
138
+ }): Promise<{
139
+ url: string;
140
+ close(): Promise<void>;
141
+ }>;
142
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,631 @@
1
+ import { StellarAgentError, formatStroops, makeId, parseAmount } from "@stellar-agent/core";
2
+ import { appendEvent, writeReceipt } from "@stellar-agent/ledger-logger";
3
+ import { evaluatePaymentRequest } from "@stellar-agent/policy";
4
+ import { sendPayment } from "@stellar-agent/stellar";
5
+ import { createServer } from "node:http";
6
+ export async function runMppPayment(args) {
7
+ const fetchImpl = args.fetchImpl ?? fetch;
8
+ const sendPaymentImpl = args.sendPaymentImpl ?? sendPayment;
9
+ const first = await fetchResource(fetchImpl, args.url);
10
+ if (first.status !== 402) {
11
+ return {
12
+ firstStatus: first.status,
13
+ finalStatus: first.status,
14
+ charge: syntheticCharge(args.url),
15
+ policyDecision: evaluatePaymentRequest(args.policy, {
16
+ destination: args.source.publicKey,
17
+ amount: "0.0000001",
18
+ asset: "XLM",
19
+ network: "testnet"
20
+ }),
21
+ responseBody: await first.text()
22
+ };
23
+ }
24
+ const charge = await parseMppCharge(first);
25
+ assertSameResource(charge.resource, args.url, "docs/x402-and-mpp.md#local-mpp-demo");
26
+ const request = {
27
+ source: args.source.publicKey,
28
+ destination: charge.recipient,
29
+ amount: charge.amount,
30
+ asset: charge.asset,
31
+ memo: charge.memo,
32
+ network: "testnet",
33
+ domain: new URL(args.url).host,
34
+ url: args.url
35
+ };
36
+ const history = args.loadSpendHistory ? await args.loadSpendHistory(request) : args.spendHistory;
37
+ const policyDecision = evaluatePaymentRequest(args.policy, request, history);
38
+ await appendEvent(args.eventLog, {
39
+ event: "policy_decision",
40
+ status: policyDecision.status,
41
+ command: args.command,
42
+ profile: "testnet",
43
+ data: { request, charge, policyDecision }
44
+ });
45
+ if (policyDecision.status === "denied") {
46
+ throw new StellarAgentError({
47
+ code: "POLICY_DENIED",
48
+ message: "MPP charge was denied by policy.",
49
+ hint: "Allow the target domain and price limit intentionally before paying.",
50
+ docs: "docs/x402-and-mpp.md#local-mpp-demo"
51
+ });
52
+ }
53
+ if (policyDecision.status === "requires_approval") {
54
+ throw new StellarAgentError({
55
+ code: "APPROVAL_REQUIRED",
56
+ message: "MPP charge requires approval.",
57
+ docs: "docs/x402-and-mpp.md#local-mpp-demo"
58
+ });
59
+ }
60
+ if (args.dryRun) {
61
+ return { firstStatus: 402, finalStatus: 402, charge, policyDecision };
62
+ }
63
+ const transaction = await sendPaymentImpl({
64
+ source: args.source,
65
+ destination: charge.recipient,
66
+ amount: charge.amount,
67
+ asset: charge.asset,
68
+ ...(charge.memo === undefined ? {} : { memo: charge.memo }),
69
+ profile: args.profile
70
+ });
71
+ const proof = {
72
+ protocol: "stellar-agent-local-mpp",
73
+ version: 1,
74
+ chargeId: charge.chargeId,
75
+ transactionHash: transaction.hash,
76
+ payer: args.source.publicKey,
77
+ recipient: charge.recipient,
78
+ asset: charge.asset,
79
+ amount: parseAmount(charge.amount).value,
80
+ resource: charge.resource,
81
+ ...(transaction.ledger === undefined ? {} : { ledger: transaction.ledger })
82
+ };
83
+ const paid = await fetchResource(fetchImpl, args.url, {
84
+ headers: {
85
+ "X-MPP-Payment": JSON.stringify(proof),
86
+ "X-Payment-Transaction": transaction.hash
87
+ }
88
+ });
89
+ const responseBody = await paid.text();
90
+ const paidResourceDelivered = paid.status >= 200 && paid.status < 300;
91
+ const { path: receiptPath } = await writeReceipt(args.receiptsDir, {
92
+ command: args.command,
93
+ profile: "testnet",
94
+ networkPassphrase: args.profile.networkPassphrase,
95
+ realFunds: false,
96
+ payment: {
97
+ source: args.source.publicKey,
98
+ destination: charge.recipient,
99
+ asset: charge.asset,
100
+ amount: charge.amount,
101
+ domain: new URL(args.url).host,
102
+ url: args.url,
103
+ ...(charge.memo === undefined ? {} : { memo: charge.memo })
104
+ },
105
+ policyDecision,
106
+ transaction,
107
+ ...(transaction.ledger === undefined ? {} : { ledger: { confirmedLedger: transaction.ledger } }),
108
+ eventLog: args.eventLog
109
+ });
110
+ await appendEvent(args.eventLog, {
111
+ event: "receipt_written",
112
+ status: paidResourceDelivered ? "success" : "paid_resource_failed",
113
+ command: args.command,
114
+ profile: "testnet",
115
+ data: { receiptPath, transactionHash: transaction.hash, finalStatus: paid.status, chargeId: charge.chargeId, paidResourceDelivered }
116
+ });
117
+ return {
118
+ firstStatus: 402,
119
+ finalStatus: paid.status,
120
+ charge,
121
+ policyDecision,
122
+ transaction,
123
+ receiptPath,
124
+ responseBody,
125
+ paidResourceDelivered
126
+ };
127
+ }
128
+ export async function runMppSession(args) {
129
+ const requestCount = args.requestCount ?? 2;
130
+ if (!Number.isInteger(requestCount) || requestCount < 1) {
131
+ throw new StellarAgentError({
132
+ code: "INVALID_INPUT",
133
+ message: "MPP session request count must be a positive integer.",
134
+ docs: "docs/x402-and-mpp.md#local-mpp-session-demo"
135
+ });
136
+ }
137
+ const fetchImpl = args.fetchImpl ?? fetch;
138
+ const sendPaymentImpl = args.sendPaymentImpl ?? sendPayment;
139
+ const first = await fetchResource(fetchImpl, args.url);
140
+ if (first.status !== 402) {
141
+ return {
142
+ firstStatus: first.status,
143
+ finalStatus: first.status,
144
+ requestCount,
145
+ successfulRequests: 0,
146
+ session: syntheticSession(args.url),
147
+ policyDecision: evaluatePaymentRequest(args.policy, {
148
+ destination: args.source.publicKey,
149
+ amount: "0.0000001",
150
+ asset: "XLM",
151
+ network: "testnet"
152
+ }),
153
+ responses: [{ status: first.status, body: await first.text() }]
154
+ };
155
+ }
156
+ const session = await parseMppSessionRequirement(first);
157
+ assertSameResource(session.resource, args.url, "docs/x402-and-mpp.md#local-mpp-session-demo");
158
+ const request = {
159
+ source: args.source.publicKey,
160
+ destination: session.recipient,
161
+ amount: session.budget,
162
+ asset: session.asset,
163
+ memo: session.memo,
164
+ network: "testnet",
165
+ domain: new URL(args.url).host,
166
+ url: args.url
167
+ };
168
+ const history = args.loadSpendHistory ? await args.loadSpendHistory(request) : args.spendHistory;
169
+ const policyDecision = evaluatePaymentRequest(args.policy, request, history);
170
+ await appendEvent(args.eventLog, {
171
+ event: "policy_decision",
172
+ status: policyDecision.status,
173
+ command: args.command,
174
+ profile: "testnet",
175
+ data: { request, session, policyDecision }
176
+ });
177
+ if (policyDecision.status === "denied") {
178
+ throw new StellarAgentError({
179
+ code: "POLICY_DENIED",
180
+ message: "MPP session budget was denied by policy.",
181
+ hint: "Allow the target domain and session budget intentionally before paying.",
182
+ docs: "docs/x402-and-mpp.md#local-mpp-session-demo"
183
+ });
184
+ }
185
+ if (policyDecision.status === "requires_approval") {
186
+ throw new StellarAgentError({
187
+ code: "APPROVAL_REQUIRED",
188
+ message: "MPP session budget requires approval.",
189
+ docs: "docs/x402-and-mpp.md#local-mpp-session-demo"
190
+ });
191
+ }
192
+ if (args.dryRun) {
193
+ return {
194
+ firstStatus: 402,
195
+ finalStatus: 402,
196
+ requestCount,
197
+ successfulRequests: 0,
198
+ session,
199
+ policyDecision,
200
+ responses: []
201
+ };
202
+ }
203
+ const transaction = await sendPaymentImpl({
204
+ source: args.source,
205
+ destination: session.recipient,
206
+ amount: session.budget,
207
+ asset: session.asset,
208
+ ...(session.memo === undefined ? {} : { memo: session.memo }),
209
+ profile: args.profile
210
+ });
211
+ const proof = {
212
+ protocol: "stellar-agent-local-mpp-session",
213
+ version: 1,
214
+ sessionId: session.sessionId,
215
+ transactionHash: transaction.hash,
216
+ payer: args.source.publicKey,
217
+ recipient: session.recipient,
218
+ asset: session.asset,
219
+ budget: parseAmount(session.budget).value,
220
+ pricePerRequest: parseAmount(session.pricePerRequest).value,
221
+ resource: session.resource,
222
+ ...(transaction.ledger === undefined ? {} : { ledger: transaction.ledger })
223
+ };
224
+ const responses = [];
225
+ for (let index = 0; index < requestCount; index += 1) {
226
+ const paid = await fetchResource(fetchImpl, args.url, {
227
+ headers: {
228
+ "X-MPP-Session": JSON.stringify(proof),
229
+ "X-Payment-Transaction": transaction.hash
230
+ }
231
+ });
232
+ responses.push({ status: paid.status, body: await paid.text() });
233
+ }
234
+ const finalStatus = responses.at(-1)?.status ?? 402;
235
+ const successfulRequests = responses.filter((response) => response.status >= 200 && response.status < 300).length;
236
+ const paidResourceDelivered = successfulRequests === requestCount;
237
+ const { path: receiptPath } = await writeReceipt(args.receiptsDir, {
238
+ command: args.command,
239
+ profile: "testnet",
240
+ networkPassphrase: args.profile.networkPassphrase,
241
+ realFunds: false,
242
+ payment: {
243
+ source: args.source.publicKey,
244
+ destination: session.recipient,
245
+ asset: session.asset,
246
+ amount: session.budget,
247
+ domain: new URL(args.url).host,
248
+ url: args.url,
249
+ ...(session.memo === undefined ? {} : { memo: session.memo })
250
+ },
251
+ policyDecision,
252
+ transaction,
253
+ ...(transaction.ledger === undefined ? {} : { ledger: { confirmedLedger: transaction.ledger } }),
254
+ eventLog: args.eventLog
255
+ });
256
+ await appendEvent(args.eventLog, {
257
+ event: "receipt_written",
258
+ status: paidResourceDelivered ? "success" : "paid_resource_failed",
259
+ command: args.command,
260
+ profile: "testnet",
261
+ data: {
262
+ receiptPath,
263
+ transactionHash: transaction.hash,
264
+ finalStatus,
265
+ sessionId: session.sessionId,
266
+ successfulRequests,
267
+ requestCount,
268
+ paidResourceDelivered
269
+ }
270
+ });
271
+ return {
272
+ firstStatus: 402,
273
+ finalStatus,
274
+ requestCount,
275
+ successfulRequests,
276
+ session,
277
+ proof,
278
+ policyDecision,
279
+ transaction,
280
+ receiptPath,
281
+ paidResourceDelivered,
282
+ responses
283
+ };
284
+ }
285
+ export async function parseMppCharge(response) {
286
+ const header = response.headers.get("MPP-Charge") ?? response.headers.get("X-MPP-Charge");
287
+ const parsed = header ? JSON.parse(header) : await response.json();
288
+ return validateCharge(parsed);
289
+ }
290
+ export async function parseMppSessionRequirement(response) {
291
+ const header = response.headers.get("MPP-Session") ?? response.headers.get("X-MPP-Session");
292
+ const parsed = header ? JSON.parse(header) : await response.json();
293
+ return validateSessionRequirement(parsed);
294
+ }
295
+ export function validateCharge(value) {
296
+ const candidate = value;
297
+ if (candidate.protocol !== "stellar-agent-local-mpp" ||
298
+ candidate.version !== 1 ||
299
+ candidate.network !== "testnet" ||
300
+ !candidate.chargeId ||
301
+ !candidate.recipient ||
302
+ !candidate.amount ||
303
+ !candidate.asset ||
304
+ !candidate.resource) {
305
+ throw new StellarAgentError({
306
+ code: "INVALID_INPUT",
307
+ message: "HTTP 402 response did not include a supported MPP charge.",
308
+ docs: "docs/x402-and-mpp.md#local-mpp-demo"
309
+ });
310
+ }
311
+ parseAmount(candidate.amount, candidate.asset);
312
+ return {
313
+ protocol: "stellar-agent-local-mpp",
314
+ version: 1,
315
+ chargeId: candidate.chargeId,
316
+ network: "testnet",
317
+ recipient: candidate.recipient,
318
+ amount: candidate.amount,
319
+ asset: candidate.asset,
320
+ resource: candidate.resource,
321
+ ...(candidate.memo === undefined ? {} : { memo: candidate.memo })
322
+ };
323
+ }
324
+ export function validateSessionRequirement(value) {
325
+ const candidate = value;
326
+ if (candidate.protocol !== "stellar-agent-local-mpp-session" ||
327
+ candidate.version !== 1 ||
328
+ candidate.network !== "testnet" ||
329
+ !candidate.sessionId ||
330
+ !candidate.recipient ||
331
+ !candidate.budget ||
332
+ !candidate.pricePerRequest ||
333
+ !candidate.asset ||
334
+ !candidate.resource) {
335
+ throw new StellarAgentError({
336
+ code: "INVALID_INPUT",
337
+ message: "HTTP 402 response did not include a supported MPP session requirement.",
338
+ docs: "docs/x402-and-mpp.md#local-mpp-session-demo"
339
+ });
340
+ }
341
+ const budget = parseAmount(candidate.budget, candidate.asset).value;
342
+ const pricePerRequest = parseAmount(candidate.pricePerRequest, candidate.asset).value;
343
+ if (parseAmount(budget).stroops < parseAmount(pricePerRequest).stroops) {
344
+ throw new StellarAgentError({
345
+ code: "INVALID_INPUT",
346
+ message: "MPP session budget must be at least one request price.",
347
+ docs: "docs/x402-and-mpp.md#local-mpp-session-demo"
348
+ });
349
+ }
350
+ return {
351
+ protocol: "stellar-agent-local-mpp-session",
352
+ version: 1,
353
+ sessionId: candidate.sessionId,
354
+ network: "testnet",
355
+ recipient: candidate.recipient,
356
+ budget,
357
+ pricePerRequest,
358
+ asset: candidate.asset,
359
+ resource: candidate.resource,
360
+ ...(candidate.memo === undefined ? {} : { memo: candidate.memo })
361
+ };
362
+ }
363
+ export async function startMppDemo(args) {
364
+ const host = args.host ?? "127.0.0.1";
365
+ const amount = args.amount ?? "0.0000001";
366
+ const asset = args.asset ?? "XLM";
367
+ parseAmount(amount, asset);
368
+ const chargeId = makeId("mpp_charge");
369
+ const acceptedTransactions = new Set();
370
+ const server = createServer((request, response) => {
371
+ if (request.url?.startsWith("/health")) {
372
+ writeJson(response, 200, { ok: true });
373
+ return;
374
+ }
375
+ if (!request.url?.startsWith("/mpp-report")) {
376
+ writeJson(response, 404, { ok: false, error: "not_found" });
377
+ return;
378
+ }
379
+ const proofHeader = request.headers["x-mpp-payment"];
380
+ if (!proofHeader) {
381
+ const resource = mppResource(host, server);
382
+ const charge = {
383
+ protocol: "stellar-agent-local-mpp",
384
+ version: 1,
385
+ chargeId,
386
+ network: "testnet",
387
+ asset,
388
+ amount,
389
+ recipient: args.recipient,
390
+ resource,
391
+ memo: "mpp-demo"
392
+ };
393
+ const encoded = JSON.stringify(charge);
394
+ response.setHeader("MPP-Charge", encoded);
395
+ response.setHeader("X-MPP-Charge", encoded);
396
+ writeJson(response, 402, charge);
397
+ return;
398
+ }
399
+ const proof = parseProofHeader(proofHeader);
400
+ const resource = mppResource(host, server);
401
+ if (!proof ||
402
+ proof.protocol !== "stellar-agent-local-mpp" ||
403
+ proof.version !== 1 ||
404
+ proof.chargeId !== chargeId ||
405
+ !proof.transactionHash ||
406
+ !proof.payer ||
407
+ proof.recipient !== args.recipient ||
408
+ proof.asset !== asset ||
409
+ proof.amount !== parseAmount(amount, asset).value ||
410
+ proof.resource !== resource) {
411
+ writeJson(response, 402, { ok: false, error: "invalid_mpp_payment_proof" });
412
+ return;
413
+ }
414
+ if (acceptedTransactions.has(proof.transactionHash)) {
415
+ writeJson(response, 402, { ok: false, error: "mpp_payment_proof_replayed" });
416
+ return;
417
+ }
418
+ acceptedTransactions.add(proof.transactionHash);
419
+ writeJson(response, 200, {
420
+ ok: true,
421
+ id: makeId("mpp_report"),
422
+ message: "Local MPP one-time charge content unlocked.",
423
+ paid: {
424
+ chargeId,
425
+ transactionHash: proof.transactionHash,
426
+ amount: proof.amount,
427
+ asset: proof.asset
428
+ }
429
+ });
430
+ });
431
+ await new Promise((resolve, reject) => {
432
+ server.once("error", reject);
433
+ server.listen(args.port ?? 0, host, () => resolve());
434
+ });
435
+ return {
436
+ url: `http://${host}:${addressPort(server)}/mpp-report`,
437
+ close: () => new Promise((resolve, reject) => {
438
+ server.close((error) => (error ? reject(error) : resolve()));
439
+ })
440
+ };
441
+ }
442
+ export async function startMppSessionDemo(args) {
443
+ const host = args.host ?? "127.0.0.1";
444
+ const budget = args.budget ?? "0.0000003";
445
+ const pricePerRequest = args.pricePerRequest ?? "0.0000001";
446
+ const asset = args.asset ?? "XLM";
447
+ const budgetAmount = parseAmount(budget, asset);
448
+ const requestAmount = parseAmount(pricePerRequest, asset);
449
+ if (budgetAmount.stroops < requestAmount.stroops) {
450
+ throw new StellarAgentError({
451
+ code: "INVALID_AMOUNT",
452
+ message: "MPP session budget must be at least one request price.",
453
+ docs: "docs/x402-and-mpp.md#local-mpp-session-demo"
454
+ });
455
+ }
456
+ const sessionId = makeId("mpp_session");
457
+ const sessions = new Map();
458
+ const server = createServer((request, response) => {
459
+ if (request.url?.startsWith("/health")) {
460
+ writeJson(response, 200, { ok: true });
461
+ return;
462
+ }
463
+ if (!request.url?.startsWith("/mpp-session")) {
464
+ writeJson(response, 404, { ok: false, error: "not_found" });
465
+ return;
466
+ }
467
+ const sessionHeader = request.headers["x-mpp-session"];
468
+ if (!sessionHeader) {
469
+ writeSessionRequirement(response, {
470
+ host,
471
+ server,
472
+ sessionId,
473
+ asset,
474
+ budget: budgetAmount.value,
475
+ pricePerRequest: requestAmount.value,
476
+ recipient: args.recipient
477
+ });
478
+ return;
479
+ }
480
+ const proof = parseProofHeader(sessionHeader);
481
+ if (!proof ||
482
+ proof.protocol !== "stellar-agent-local-mpp-session" ||
483
+ proof.sessionId !== sessionId ||
484
+ !proof.transactionHash ||
485
+ proof.recipient !== args.recipient ||
486
+ proof.asset !== asset ||
487
+ proof.budget !== budgetAmount.value ||
488
+ proof.pricePerRequest !== requestAmount.value ||
489
+ proof.resource !== sessionResource(host, server)) {
490
+ writeJson(response, 402, { ok: false, error: "invalid_mpp_session_proof" });
491
+ return;
492
+ }
493
+ const state = sessions.get(proof.transactionHash) ?? {
494
+ remaining: budgetAmount.stroops,
495
+ spent: 0n,
496
+ requests: 0
497
+ };
498
+ if (state.remaining < requestAmount.stroops) {
499
+ writeJson(response, 402, {
500
+ ok: false,
501
+ error: "session_budget_exhausted",
502
+ remaining: formatStroops(state.remaining),
503
+ pricePerRequest: requestAmount.value
504
+ });
505
+ return;
506
+ }
507
+ const nextState = {
508
+ remaining: state.remaining - requestAmount.stroops,
509
+ spent: state.spent + requestAmount.stroops,
510
+ requests: state.requests + 1
511
+ };
512
+ sessions.set(proof.transactionHash, nextState);
513
+ writeJson(response, 200, {
514
+ ok: true,
515
+ id: makeId("mpp_session_report"),
516
+ message: "Local MPP session content unlocked.",
517
+ session: {
518
+ sessionId,
519
+ transactionHash: proof.transactionHash,
520
+ requestNumber: nextState.requests,
521
+ spent: formatStroops(nextState.spent),
522
+ remaining: formatStroops(nextState.remaining),
523
+ asset
524
+ }
525
+ });
526
+ });
527
+ await new Promise((resolve, reject) => {
528
+ server.once("error", reject);
529
+ server.listen(args.port ?? 0, host, () => resolve());
530
+ });
531
+ return {
532
+ url: `http://${host}:${addressPort(server)}/mpp-session`,
533
+ close: () => new Promise((resolve, reject) => {
534
+ server.close((error) => (error ? reject(error) : resolve()));
535
+ })
536
+ };
537
+ }
538
+ async function fetchResource(fetchImpl, url, init) {
539
+ try {
540
+ return await fetchImpl(url, init);
541
+ }
542
+ catch (error) {
543
+ throw new StellarAgentError({
544
+ code: "MPP_RESOURCE_UNAVAILABLE",
545
+ message: "Could not fetch the MPP resource.",
546
+ hint: "Check the URL and make sure the paid API is running.",
547
+ docs: "docs/x402-and-mpp.md#local-mpp-demo",
548
+ details: String(error)
549
+ });
550
+ }
551
+ }
552
+ function syntheticCharge(url) {
553
+ return {
554
+ protocol: "stellar-agent-local-mpp",
555
+ version: 1,
556
+ chargeId: makeId("mpp_charge"),
557
+ network: "testnet",
558
+ asset: "XLM",
559
+ amount: "0.0000001",
560
+ recipient: "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF",
561
+ resource: url
562
+ };
563
+ }
564
+ function syntheticSession(url) {
565
+ return {
566
+ protocol: "stellar-agent-local-mpp-session",
567
+ version: 1,
568
+ sessionId: makeId("mpp_session"),
569
+ network: "testnet",
570
+ asset: "XLM",
571
+ budget: "0.0000003",
572
+ pricePerRequest: "0.0000001",
573
+ recipient: "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF",
574
+ resource: url
575
+ };
576
+ }
577
+ function writeSessionRequirement(response, args) {
578
+ const session = {
579
+ protocol: "stellar-agent-local-mpp-session",
580
+ version: 1,
581
+ sessionId: args.sessionId,
582
+ network: "testnet",
583
+ asset: args.asset,
584
+ budget: args.budget,
585
+ pricePerRequest: args.pricePerRequest,
586
+ recipient: args.recipient,
587
+ resource: sessionResource(args.host, args.server),
588
+ memo: "mpp-session"
589
+ };
590
+ const encoded = JSON.stringify(session);
591
+ response.setHeader("MPP-Session", encoded);
592
+ response.setHeader("X-MPP-Session", encoded);
593
+ writeJson(response, 402, session);
594
+ }
595
+ function mppResource(host, server) {
596
+ return `http://${host}:${addressPort(server)}/mpp-report`;
597
+ }
598
+ function sessionResource(host, server) {
599
+ return `http://${host}:${addressPort(server)}/mpp-session`;
600
+ }
601
+ function assertSameResource(advertisedResource, requestedUrl, docs) {
602
+ const advertised = new URL(advertisedResource);
603
+ const requested = new URL(requestedUrl);
604
+ if (advertised.origin !== requested.origin || advertised.pathname !== requested.pathname) {
605
+ throw new StellarAgentError({
606
+ code: "INVALID_INPUT",
607
+ message: "HTTP 402 payment resource does not match the requested URL.",
608
+ docs
609
+ });
610
+ }
611
+ }
612
+ function addressPort(server) {
613
+ const address = server.address();
614
+ if (!address || typeof address === "string")
615
+ return 0;
616
+ return address.port;
617
+ }
618
+ function writeJson(response, status, body) {
619
+ response.statusCode = status;
620
+ response.setHeader("content-type", "application/json");
621
+ response.end(JSON.stringify(body));
622
+ }
623
+ function parseProofHeader(header) {
624
+ try {
625
+ return JSON.parse(Array.isArray(header) ? header[0] ?? "{}" : header ?? "{}");
626
+ }
627
+ catch {
628
+ return null;
629
+ }
630
+ }
631
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@stellar-agent/mpp-client",
3
+ "version": "0.4.0",
4
+ "description": "Local Testnet MPP one-time and session-budget demo client and server helpers for Stellar Agent Bridge.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+ssh://git@github.com/someone-in-texas/Stellar-Agent.git",
10
+ "directory": "packages/mpp-client"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/someone-in-texas/Stellar-Agent/issues"
14
+ },
15
+ "homepage": "https://github.com/someone-in-texas/Stellar-Agent#readme",
16
+ "engines": {
17
+ "node": ">=22"
18
+ },
19
+ "main": "./dist/index.js",
20
+ "types": "./dist/index.d.ts",
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "import": "./dist/index.js"
25
+ }
26
+ },
27
+ "files": [
28
+ "dist"
29
+ ],
30
+ "scripts": {
31
+ "build": "tsc -b",
32
+ "test": "vitest run"
33
+ },
34
+ "dependencies": {
35
+ "@stellar-agent/core": "0.4.0",
36
+ "@stellar-agent/ledger-logger": "0.4.0",
37
+ "@stellar-agent/policy": "0.4.0",
38
+ "@stellar-agent/stellar": "0.4.0"
39
+ }
40
+ }