agentcash 0.14.4 → 0.15.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.
Files changed (93) hide show
  1. package/dist/cjs/run-server.cjs +40656 -17083
  2. package/dist/esm/{add-skill-MO4YPAYM.js → add-skill-5HFBHQTQ.js} +10 -10
  3. package/dist/esm/{bridge-Q4YWH4WW.js → bridge-BOLVXKCD.js} +7 -7
  4. package/dist/esm/{check-3GPSLBNI.js → check-FEWY37RD.js} +7 -7
  5. package/dist/esm/{chunk-JKK2XT7N.js → chunk-2C7X7XIG.js} +3 -3
  6. package/dist/esm/{chunk-UCADMHNP.js → chunk-2E4ZDG2M.js} +2 -2
  7. package/dist/esm/{chunk-YUPRVVFP.js → chunk-4MCPQDKM.js} +3 -3
  8. package/dist/esm/{chunk-JX2XE6FD.js → chunk-4TIYIVZF.js} +1 -1
  9. package/dist/esm/chunk-4TIYIVZF.js.map +1 -0
  10. package/dist/esm/{chunk-CUZFVI2X.js → chunk-5MITNOWT.js} +2 -2
  11. package/dist/esm/{chunk-MSNAPI5G.js → chunk-BIO4Y27B.js} +3 -3
  12. package/dist/esm/{chunk-BNFMFAEF.js → chunk-C7B6LEPE.js} +3 -3
  13. package/dist/esm/{chunk-KJCWPVQE.js → chunk-EM6OE6WL.js} +3 -3
  14. package/dist/esm/chunk-FBGNOXFP.js +102 -0
  15. package/dist/esm/chunk-FBGNOXFP.js.map +1 -0
  16. package/dist/esm/{chunk-JVMJVMWB.js → chunk-HNDMHX4B.js} +207 -83
  17. package/dist/esm/chunk-HNDMHX4B.js.map +1 -0
  18. package/dist/esm/{chunk-NPJV7AMV.js → chunk-HTGTKVXB.js} +6 -2
  19. package/dist/esm/chunk-HTGTKVXB.js.map +1 -0
  20. package/dist/esm/{chunk-L4U6AJW3.js → chunk-K3WB4R2P.js} +3 -2
  21. package/dist/esm/{chunk-L4U6AJW3.js.map → chunk-K3WB4R2P.js.map} +1 -1
  22. package/dist/esm/{chunk-2OKYUR7B.js → chunk-MKA2PTOE.js} +5 -7
  23. package/dist/esm/chunk-MKA2PTOE.js.map +1 -0
  24. package/dist/esm/{chunk-ONGJJBKT.js → chunk-MZPHS3IS.js} +4 -4
  25. package/dist/esm/{chunk-2SZ6MZS3.js → chunk-O57QVTLM.js} +2 -2
  26. package/dist/esm/{chunk-BFOYXXLG.js → chunk-RAS5DZPQ.js} +15 -1
  27. package/dist/esm/chunk-RAS5DZPQ.js.map +1 -0
  28. package/dist/esm/{chunk-7KT6UCTT.js → chunk-SLTRGQ7W.js} +8 -3
  29. package/dist/esm/{chunk-7KT6UCTT.js.map → chunk-SLTRGQ7W.js.map} +1 -1
  30. package/dist/esm/chunk-TX7S7QGG.js +146 -0
  31. package/dist/esm/chunk-TX7S7QGG.js.map +1 -0
  32. package/dist/esm/{chunk-QOMU3YLK.js → chunk-ULB5PPKW.js} +2 -2
  33. package/dist/esm/{chunk-WRNDLZ3K.js → chunk-VGKAPM5S.js} +3 -3
  34. package/dist/esm/{chunk-3PYQIEMA.js → chunk-W37JKCLN.js} +41 -3
  35. package/dist/esm/chunk-W37JKCLN.js.map +1 -0
  36. package/dist/esm/{chunk-TTAO2EJK.js → chunk-YPFBBTA2.js} +1 -1
  37. package/dist/esm/chunk-YPFBBTA2.js.map +1 -0
  38. package/dist/esm/{discover-TE2BZJMA.js → discover-TXEJNB5A.js} +5 -5
  39. package/dist/esm/{fetch-ZAECKP5C.js → fetch-QAVIWIRX.js} +12 -11
  40. package/dist/esm/{fetch-ZAECKP5C.js.map → fetch-QAVIWIRX.js.map} +1 -1
  41. package/dist/esm/{fund-HHL4QEU5.js → fund-FCOUEG7T.js} +5 -5
  42. package/dist/esm/index.js +70 -34
  43. package/dist/esm/index.js.map +1 -1
  44. package/dist/esm/{install-EOF353SY.js → install-NJJZYBZU.js} +8 -8
  45. package/dist/esm/{onboard-EMUCEMFN.js → onboard-TYB4QZE4.js} +12 -12
  46. package/dist/esm/{origins-MBWKIWLR.js → origins-EVVF3N4G.js} +6 -6
  47. package/dist/esm/{register-NSQPYCWI.js → register-T6M2US4B.js} +62 -21
  48. package/dist/esm/register-T6M2US4B.js.map +1 -0
  49. package/dist/esm/{report-error-7RCKDM2N.js → report-error-BR7ETMF7.js} +5 -5
  50. package/dist/esm/{search-SYBTWXON.js → search-KIPT62MB.js} +11 -10
  51. package/dist/esm/{search-SYBTWXON.js.map → search-KIPT62MB.js.map} +1 -1
  52. package/dist/esm/{server-NHOKDQHU.js → server-MO3YMDHB.js} +83 -18
  53. package/dist/esm/server-MO3YMDHB.js.map +1 -0
  54. package/dist/esm/{server-ZIKTGUST.js → server-WJH536CN.js} +2 -2
  55. package/dist/esm/sessions-NUOSJC6M.js +74 -0
  56. package/dist/esm/sessions-NUOSJC6M.js.map +1 -0
  57. package/dist/esm/{settings-RLSKK5RM.js → settings-SBL7WIBQ.js} +2 -2
  58. package/dist/esm/{try-MXWZSHRS.js → try-2P5ZRXRT.js} +9 -9
  59. package/dist/esm/{wallet-QOS3FPSF.js → wallet-PY4ZDHNZ.js} +12 -12
  60. package/package.json +8 -8
  61. package/dist/esm/chunk-2OKYUR7B.js.map +0 -1
  62. package/dist/esm/chunk-3PYQIEMA.js.map +0 -1
  63. package/dist/esm/chunk-BFOYXXLG.js.map +0 -1
  64. package/dist/esm/chunk-JVMJVMWB.js.map +0 -1
  65. package/dist/esm/chunk-JX2XE6FD.js.map +0 -1
  66. package/dist/esm/chunk-NPJV7AMV.js.map +0 -1
  67. package/dist/esm/chunk-TTAO2EJK.js.map +0 -1
  68. package/dist/esm/register-NSQPYCWI.js.map +0 -1
  69. package/dist/esm/server-NHOKDQHU.js.map +0 -1
  70. /package/dist/esm/{add-skill-MO4YPAYM.js.map → add-skill-5HFBHQTQ.js.map} +0 -0
  71. /package/dist/esm/{bridge-Q4YWH4WW.js.map → bridge-BOLVXKCD.js.map} +0 -0
  72. /package/dist/esm/{check-3GPSLBNI.js.map → check-FEWY37RD.js.map} +0 -0
  73. /package/dist/esm/{chunk-JKK2XT7N.js.map → chunk-2C7X7XIG.js.map} +0 -0
  74. /package/dist/esm/{chunk-UCADMHNP.js.map → chunk-2E4ZDG2M.js.map} +0 -0
  75. /package/dist/esm/{chunk-YUPRVVFP.js.map → chunk-4MCPQDKM.js.map} +0 -0
  76. /package/dist/esm/{chunk-CUZFVI2X.js.map → chunk-5MITNOWT.js.map} +0 -0
  77. /package/dist/esm/{chunk-MSNAPI5G.js.map → chunk-BIO4Y27B.js.map} +0 -0
  78. /package/dist/esm/{chunk-BNFMFAEF.js.map → chunk-C7B6LEPE.js.map} +0 -0
  79. /package/dist/esm/{chunk-KJCWPVQE.js.map → chunk-EM6OE6WL.js.map} +0 -0
  80. /package/dist/esm/{chunk-ONGJJBKT.js.map → chunk-MZPHS3IS.js.map} +0 -0
  81. /package/dist/esm/{chunk-2SZ6MZS3.js.map → chunk-O57QVTLM.js.map} +0 -0
  82. /package/dist/esm/{chunk-QOMU3YLK.js.map → chunk-ULB5PPKW.js.map} +0 -0
  83. /package/dist/esm/{chunk-WRNDLZ3K.js.map → chunk-VGKAPM5S.js.map} +0 -0
  84. /package/dist/esm/{discover-TE2BZJMA.js.map → discover-TXEJNB5A.js.map} +0 -0
  85. /package/dist/esm/{fund-HHL4QEU5.js.map → fund-FCOUEG7T.js.map} +0 -0
  86. /package/dist/esm/{install-EOF353SY.js.map → install-NJJZYBZU.js.map} +0 -0
  87. /package/dist/esm/{onboard-EMUCEMFN.js.map → onboard-TYB4QZE4.js.map} +0 -0
  88. /package/dist/esm/{origins-MBWKIWLR.js.map → origins-EVVF3N4G.js.map} +0 -0
  89. /package/dist/esm/{report-error-7RCKDM2N.js.map → report-error-BR7ETMF7.js.map} +0 -0
  90. /package/dist/esm/{server-ZIKTGUST.js.map → server-WJH536CN.js.map} +0 -0
  91. /package/dist/esm/{settings-RLSKK5RM.js.map → settings-SBL7WIBQ.js.map} +0 -0
  92. /package/dist/esm/{try-MXWZSHRS.js.map → try-2P5ZRXRT.js.map} +0 -0
  93. /package/dist/esm/{wallet-QOS3FPSF.js.map → wallet-PY4ZDHNZ.js.map} +0 -0
@@ -1,23 +1,34 @@
1
+ import {
2
+ assertTempoUsdc,
3
+ createTempoClient,
4
+ mppErr,
5
+ mppOk,
6
+ mppResultFromPromise,
7
+ safeCreateMppCredential,
8
+ safeGetMppChallenge,
9
+ safeGetMppReceipt,
10
+ sessionRequestFailedErr
11
+ } from "./chunk-FBGNOXFP.js";
1
12
  import {
2
13
  DEFAULT_MAX_AMOUNT,
3
14
  getSettings
4
- } from "./chunk-JX2XE6FD.js";
15
+ } from "./chunk-4TIYIVZF.js";
5
16
  import {
6
17
  buildRequest
7
18
  } from "./chunk-IKPLMFAK.js";
8
19
  import {
9
20
  getBalance
10
- } from "./chunk-KJCWPVQE.js";
21
+ } from "./chunk-EM6OE6WL.js";
11
22
  import {
12
23
  fetchErr,
13
24
  fetchOk,
14
- safeFetch
15
- } from "./chunk-BFOYXXLG.js";
25
+ safeFetch,
26
+ safeReadResponseText
27
+ } from "./chunk-RAS5DZPQ.js";
16
28
  import {
17
- EVM_CONFIGS,
18
29
  caip2ToNetwork,
19
30
  networkToCaip2
20
- } from "./chunk-NPJV7AMV.js";
31
+ } from "./chunk-HTGTKVXB.js";
21
32
  import {
22
33
  formatUsd,
23
34
  getDepositLink,
@@ -28,7 +39,7 @@ import {
28
39
  } from "./chunk-QZCSZB7E.js";
29
40
  import {
30
41
  BLACKLISTED_ORIGINS
31
- } from "./chunk-TTAO2EJK.js";
42
+ } from "./chunk-YPFBBTA2.js";
32
43
  import {
33
44
  err,
34
45
  ok,
@@ -379,62 +390,7 @@ function detectPaymentProtocols(response) {
379
390
  }
380
391
 
381
392
  // src/shared/protocols/mpp/handle-payment.ts
382
- import { formatUnits } from "viem";
383
-
384
- // src/shared/protocols/mpp/index.ts
385
- import { Challenge, Receipt } from "mppx";
386
- import { Methods } from "mppx/tempo";
387
- import { Mppx, tempo as tempoMethod } from "mppx/client";
388
- import { createClient, http as http2 } from "viem";
389
- import { tempo } from "viem/chains";
390
- var errorType2 = "mpp";
391
- var mppOk = (value) => ok(value);
392
- var mppErr = (surface, error) => err(errorType2, surface, error);
393
- var mppResultFromPromise = (surface, promise, error) => resultFromPromise(errorType2, surface, promise, error);
394
- var mppResultFromThrowable = (surface, fn, error) => resultFromThrowable(errorType2, surface, fn, error);
395
- var safeGetMppChallenge = (surface, response) => {
396
- return mppResultFromThrowable(
397
- surface,
398
- () => Challenge.fromResponse(response, { methods: [Methods.charge] }),
399
- (error) => ({
400
- cause: "parse_mpp_challenge",
401
- message: error instanceof Error ? error.message : "Failed to parse MPP challenge from response"
402
- })
403
- );
404
- };
405
- var safeCreateMppCredential = (surface, wallets, response) => {
406
- const TEMPO_RPC_URL = "https://eng:acard-melody-fashion-finish@rpc.mainnet.tempo.xyz";
407
- const client = Mppx.create({
408
- polyfill: false,
409
- methods: [
410
- tempoMethod({
411
- account: wallets.evm,
412
- getClient: () => createClient({
413
- chain: tempo,
414
- transport: http2(TEMPO_RPC_URL)
415
- })
416
- })
417
- ]
418
- });
419
- return mppResultFromPromise(
420
- surface,
421
- client.createCredential(response),
422
- (error) => ({
423
- cause: "create_mpp_credential",
424
- message: error instanceof Error ? error.message : "Failed to create MPP credential"
425
- })
426
- );
427
- };
428
- var safeGetMppReceipt = (surface, response) => {
429
- return mppResultFromThrowable(
430
- surface,
431
- () => Receipt.fromResponse(response),
432
- (error) => ({
433
- cause: "parse_mpp_receipt",
434
- message: error instanceof Error ? error.message : "Failed to parse MPP receipt from response"
435
- })
436
- );
437
- };
393
+ import { formatUnits as formatUnits2 } from "viem";
438
394
 
439
395
  // src/shared/protocols/before-payment.ts
440
396
  var beforePayment = async (props) => {
@@ -473,12 +429,176 @@ var insufficientBalanceErrorMessage = (props, balance) => {
473
429
  ].join("\n");
474
430
  };
475
431
 
432
+ // src/shared/protocols/mpp/session/handle-session-payment.ts
433
+ import { formatUnits } from "viem";
434
+ import { tempo as tempoClient } from "mppx/client";
435
+
436
+ // src/shared/protocols/mpp/session/run-request-session.ts
437
+ async function runRequestSession(surface, sm, url, init, channelId) {
438
+ const fetchInit = {
439
+ ...init,
440
+ ...channelId ? { context: { channelId } } : {}
441
+ };
442
+ const fetchResult = await mppResultFromPromise(
443
+ surface,
444
+ sm.fetch(url, fetchInit),
445
+ (e) => sessionRequestFailedErr(e)
446
+ );
447
+ if (fetchResult.isErr()) return fetchResult;
448
+ const paymentResponse = fetchResult.value;
449
+ if (paymentResponse.status === 402) {
450
+ const body = await safeReadResponseText(surface, paymentResponse).unwrapOr(
451
+ ""
452
+ );
453
+ const detail = body ? `: ${body}` : "";
454
+ return mppErr(surface, {
455
+ cause: "mpp_payment_rejected",
456
+ message: `MPP session payment was rejected by the server (402)${detail}`
457
+ });
458
+ }
459
+ return mppOk({
460
+ response: paymentResponse,
461
+ receipt: paymentResponse.receipt
462
+ });
463
+ }
464
+
465
+ // src/shared/protocols/mpp/session/run-streaming-session.ts
466
+ var MAX_BUFFERED_BYTES = 50 * 1024 * 1024;
467
+ async function runStreamingSession(surface, sm, url, init, channelId) {
468
+ let latestReceipt = null;
469
+ const { signal, ...rest } = init;
470
+ const sseResult = await sm.sse(url, {
471
+ ...rest,
472
+ ...signal ? { signal } : {},
473
+ ...channelId ? { context: { channelId } } : {},
474
+ onReceipt: (receipt) => {
475
+ latestReceipt = receipt;
476
+ }
477
+ });
478
+ const chunks = [];
479
+ let bytes = 0;
480
+ for await (const chunk of sseResult) {
481
+ bytes += chunk.length;
482
+ chunks.push(chunk);
483
+ if (bytes > MAX_BUFFERED_BYTES) {
484
+ return mppErr(surface, {
485
+ cause: "mpp_session_response_too_large",
486
+ message: `Streaming response exceeded the ${MAX_BUFFERED_BYTES}-byte buffering cap (got ${bytes} bytes).`
487
+ });
488
+ }
489
+ }
490
+ const response = new Response(chunks.join("\n"), {
491
+ status: 200,
492
+ headers: {
493
+ "Content-Type": "text/plain",
494
+ "Cache-Control": "private"
495
+ }
496
+ });
497
+ return mppOk({ response, receipt: latestReceipt });
498
+ }
499
+
500
+ // src/shared/protocols/mpp/session/utils.ts
501
+ var USDC_DECIMALS = 6;
502
+ var DEFAULT_TICK_BUDGET = 10;
503
+ function resolveDepositUsd(suggestedDeposit, tickCostUsd, options) {
504
+ const maxAmount = options.params.maxAmount ?? getSettings().maxAmount ?? DEFAULT_MAX_AMOUNT;
505
+ const desired = suggestedDeposit !== void 0 ? tokenStringToNumber(suggestedDeposit, USDC_DECIMALS) : tickCostUsd * DEFAULT_TICK_BUDGET;
506
+ return Math.min(desired, maxAmount);
507
+ }
508
+ function formatDepositCap(depositUsd) {
509
+ if (!Number.isFinite(depositUsd) || depositUsd <= 0) {
510
+ return "0";
511
+ }
512
+ return depositUsd.toFixed(USDC_DECIMALS);
513
+ }
514
+ async function bufferRequestForReplay(request) {
515
+ const init = {
516
+ method: request.method,
517
+ headers: new Headers(request.headers),
518
+ credentials: request.credentials,
519
+ redirect: request.redirect,
520
+ referrer: request.referrer === "" ? void 0 : request.referrer,
521
+ integrity: request.integrity || void 0,
522
+ signal: request.signal
523
+ };
524
+ const hasBody = request.method !== "GET" && request.method !== "HEAD" && request.body !== null;
525
+ if (hasBody) {
526
+ init.body = await request.arrayBuffer();
527
+ }
528
+ return init;
529
+ }
530
+
531
+ // src/shared/protocols/mpp/session/handle-session-payment.ts
532
+ async function handleMppSessionPayment(challenge, { request, options }) {
533
+ const { surface, wallets } = options;
534
+ const tickCostAtomic = BigInt(challenge.request.amount);
535
+ const tickCostUsd = Number(formatUnits(tickCostAtomic, USDC_DECIMALS));
536
+ const tokenAddress = challenge.request.currency;
537
+ const tokenCheck = assertTempoUsdc(surface, tokenAddress);
538
+ if (tokenCheck.isErr()) return tokenCheck;
539
+ const depositUsd = resolveDepositUsd(
540
+ challenge.request.suggestedDeposit,
541
+ tickCostUsd,
542
+ options
543
+ );
544
+ const beforePaymentResult = await beforePayment({
545
+ options,
546
+ balanceInput: {
547
+ address: wallets.evm.address,
548
+ network: "tempo" /* TEMPO */,
549
+ tokenAddress
550
+ },
551
+ amount: depositUsd,
552
+ protocol: "mpp" /* MPP */
553
+ });
554
+ if (beforePaymentResult.isErr()) return beforePaymentResult;
555
+ const replayInitResult = await mppResultFromPromise(
556
+ surface,
557
+ bufferRequestForReplay(request),
558
+ (e) => sessionRequestFailedErr(
559
+ e,
560
+ "Failed to buffer request body for session replay"
561
+ )
562
+ );
563
+ if (replayInitResult.isErr()) return replayInitResult;
564
+ const sm = tempoClient.session({
565
+ account: wallets.evm,
566
+ client: createTempoClient(),
567
+ maxDeposit: formatDepositCap(depositUsd),
568
+ decimals: USDC_DECIMALS
569
+ });
570
+ const isStreaming = challenge.meta?.streaming === "true" || options.params.stream === true;
571
+ const reuseChannelId = options.params.channelId;
572
+ const sessionResult = isStreaming ? await runStreamingSession(
573
+ surface,
574
+ sm,
575
+ request.url,
576
+ replayInitResult.value,
577
+ reuseChannelId
578
+ ) : await runRequestSession(
579
+ surface,
580
+ sm,
581
+ request.url,
582
+ replayInitResult.value,
583
+ reuseChannelId
584
+ );
585
+ if (sessionResult.isErr()) return sessionResult;
586
+ const { response: finalResponse, receipt } = sessionResult.value;
587
+ const price = receipt ? formatUsd(tokenStringToNumber(receipt.spent, USDC_DECIMALS)) : `from ${formatUsd(tickCostUsd)}/tick`;
588
+ return mppOk({
589
+ response: finalResponse,
590
+ paymentInfo: {
591
+ protocol: "mpp" /* MPP */,
592
+ network: "tempo" /* TEMPO */,
593
+ price,
594
+ payment: receipt ? { success: true, channelId: receipt.channelId } : null
595
+ }
596
+ });
597
+ }
598
+
476
599
  // src/shared/protocols/mpp/handle-payment.ts
477
- async function handleMppPayment({
478
- response,
479
- request,
480
- options
481
- }) {
600
+ async function handleMppPayment(params) {
601
+ const { response, request, options } = params;
482
602
  const { surface, wallets } = options;
483
603
  const { timeout } = options.params;
484
604
  if (request.headers.has("Authorization")) {
@@ -492,14 +612,14 @@ async function handleMppPayment({
492
612
  return challengeResult;
493
613
  }
494
614
  const challenge = challengeResult.value;
495
- const amount = Number(formatUnits(BigInt(challenge.request.amount), 6));
615
+ if (challenge.intent === "session") {
616
+ return handleMppSessionPayment(challenge, params);
617
+ }
618
+ const amount = Number(formatUnits2(BigInt(challenge.request.amount), 6));
496
619
  const tokenAddress = challenge.request.currency;
497
- const expectedToken = EVM_CONFIGS["tempo" /* TEMPO */].usdcAddress.toLowerCase();
498
- if (tokenAddress.toLowerCase() !== expectedToken) {
499
- return mppErr(surface, {
500
- cause: "unsupported_token",
501
- message: `Endpoint requires payment in token ${tokenAddress} on Tempo, but agentcash only supports ${EVM_CONFIGS["tempo" /* TEMPO */].usdcAddress}. The endpoint may be configured for a different token (e.g. PathUSD vs USDC).`
502
- });
620
+ const tokenCheck = assertTempoUsdc(surface, tokenAddress);
621
+ if (tokenCheck.isErr()) {
622
+ return tokenCheck;
503
623
  }
504
624
  const beforePaymentResult = await beforePayment({
505
625
  options,
@@ -530,7 +650,7 @@ async function handleMppPayment({
530
650
  }
531
651
  const paidResponse = paidFetchResult.value;
532
652
  if (paidResponse.status === 402) {
533
- const body = await paidResponse.clone().text().catch(() => "");
653
+ const body = await safeReadResponseText(surface, paidResponse).unwrapOr("");
534
654
  const detail = body ? `: ${body}` : "";
535
655
  return mppErr(surface, {
536
656
  cause: "mpp_payment_rejected",
@@ -753,10 +873,14 @@ async function handleX402Payment({
753
873
  return paidResult;
754
874
  }
755
875
  const paidResponse = paidResult.value;
756
- const permit2Error = await detectPermit2AllowanceError(paidResponse, {
757
- walletAddress: wallets.evm.address,
758
- scheme: paymentPayload.accepted.scheme
759
- });
876
+ const permit2Error = await detectPermit2AllowanceError(
877
+ surface,
878
+ paidResponse,
879
+ {
880
+ walletAddress: wallets.evm.address,
881
+ scheme: paymentPayload.accepted.scheme
882
+ }
883
+ );
760
884
  if (permit2Error) {
761
885
  return x402Err(surface, permit2Error);
762
886
  }
@@ -779,11 +903,11 @@ async function handleX402Payment({
779
903
  }
780
904
  });
781
905
  }
782
- async function detectPermit2AllowanceError(response, context) {
906
+ async function detectPermit2AllowanceError(surface, response, context) {
783
907
  if (response.ok) {
784
908
  return null;
785
909
  }
786
- const body = await response.clone().text().catch(() => "");
910
+ const body = await safeReadResponseText(surface, response).unwrapOr("");
787
911
  if (!isPermit2AllowanceFailureBody(body)) {
788
912
  return null;
789
913
  }
@@ -875,4 +999,4 @@ async function executeFetch(input, options) {
875
999
  export {
876
1000
  executeFetch
877
1001
  };
878
- //# sourceMappingURL=chunk-JVMJVMWB.js.map
1002
+ //# sourceMappingURL=chunk-HNDMHX4B.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/operations/fetch/auth.ts","../../src/shared/protocols/x402/index.ts","../../src/shared/protocols/x402/patched-exact-svm-scheme.ts","../../src/shared/protocols/x402/policies.ts","../../src/shared/protocols/detect.ts","../../src/shared/protocols/mpp/handle-payment.ts","../../src/shared/protocols/before-payment.ts","../../src/shared/protocols/mpp/session/handle-session-payment.ts","../../src/shared/protocols/mpp/session/run-request-session.ts","../../src/shared/protocols/mpp/session/run-streaming-session.ts","../../src/shared/protocols/mpp/session/utils.ts","../../src/shared/protocols/pick.ts","../../src/shared/protocols/x402/choose-payment-requirement.ts","../../src/shared/protocols/x402/handle-payment.ts","../../src/operations/fetch/payment.ts","../../src/operations/fetch/index.ts"],"sourcesContent":["import { encodeSIWxHeader } from '@x402/extensions/sign-in-with-x';\n\nimport { fetchOk, safeFetch } from '@/shared/neverthrow/fetch';\nimport {\n getSiwxExtension,\n safeCreateSIWxPayload,\n safeGetPaymentRequired,\n} from '@/shared/protocols/x402';\n\nimport type { ExecuteFetchOptions } from './types';\n\nexport async function attemptSiwxAuth(\n response: Response,\n authRetryRequest: Request,\n paymentRetryRequest: Request,\n options: ExecuteFetchOptions\n) {\n const { surface, wallets } = options;\n const { timeout, paymentNetwork } = options.params;\n\n if (!response.headers.has('payment-required')) {\n return fetchOk({\n response,\n paymentRetryRequest,\n });\n }\n\n const paymentRequiredResult = await safeGetPaymentRequired(surface, response);\n\n if (paymentRequiredResult.isErr()) {\n return paymentRequiredResult;\n }\n\n const siwxExtension = getSiwxExtension(\n paymentRequiredResult.value.extensions,\n paymentNetwork\n );\n\n if (!siwxExtension) {\n return fetchOk({\n response,\n paymentRetryRequest,\n });\n }\n\n const payloadResult = await safeCreateSIWxPayload(\n surface,\n siwxExtension,\n wallets\n );\n\n if (payloadResult.isErr()) {\n return payloadResult;\n }\n\n const siwxHeader = encodeSIWxHeader(payloadResult.value);\n authRetryRequest.headers.set('SIGN-IN-WITH-X', siwxHeader);\n paymentRetryRequest.headers.set('SIGN-IN-WITH-X', siwxHeader);\n\n return (await safeFetch(surface, authRetryRequest, timeout)).andThen(\n authResponse =>\n fetchOk({\n response: authResponse,\n paymentRetryRequest,\n })\n );\n}\n","import {\n err,\n ok,\n resultFromPromise,\n resultFromThrowable,\n} from '@agentcash/neverthrow';\n\nimport type { SelectPaymentRequirements } from '@x402/core/client';\nimport { x402Client, x402HTTPClient } from '@x402/core/client';\n\nimport { toClientEvmSigner } from '@x402/evm';\nimport { toClientSvmSigner } from '@x402/svm';\n\nimport { ExactEvmScheme } from '@x402/evm/exact/client';\nimport { UptoEvmScheme } from '@x402/evm/upto/client';\nimport { PatchedExactSvmScheme } from './patched-exact-svm-scheme';\nimport { capUptoDeadline } from './policies';\n\nimport { createSIWxPayload } from '@x402/extensions/sign-in-with-x';\n\nimport type { BaseX402Error } from './types';\nimport type { PaymentRequired } from '@x402/core/types';\nimport type {\n CompleteSIWxInfo,\n SIWxExtensionInfo,\n SolanaSigner,\n SupportedChain,\n} from '@x402/extensions/sign-in-with-x';\nimport type { Wallets } from '@/wallet';\nimport { Network, networkToCaip2 } from '@agentcash/networks';\nimport type { Network as PaymentNetwork } from '@agentcash/networks';\nimport { createPublicClient, http } from 'viem';\nimport { base } from 'viem/chains';\n\nconst errorType = 'x402';\n\nexport const x402Ok = <T>(value: T) => ok(value);\nexport const x402Err = (cause: string, error: BaseX402Error) =>\n err(errorType, cause, error);\n\nconst x402ResultFromPromise = <T>(\n surface: string,\n promise: Promise<T>,\n error: (e: unknown) => BaseX402Error\n) => resultFromPromise(errorType, surface, promise, error);\n\nconst x402ResultFromThrowable = <T>(\n surface: string,\n fn: () => T,\n error: (e: unknown) => BaseX402Error\n) => resultFromThrowable(errorType, surface, fn, error);\n\nexport const x402ProbeClient = new x402HTTPClient(new x402Client());\n\nexport const safeGetPaymentRequired = (surface: string, response: Response) => {\n return x402ResultFromPromise(\n surface,\n response.json().then(\n json =>\n x402ProbeClient.getPaymentRequiredResponse(\n name => response.headers.get(name),\n json\n ),\n () =>\n x402ProbeClient.getPaymentRequiredResponse(name =>\n response.headers.get(name)\n )\n ),\n error => ({\n cause: 'parse_payment_required',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to parse payment required',\n })\n );\n};\n\nexport const getSiwxExtension = (\n extensions: PaymentRequired['extensions'],\n paymentNetwork?: PaymentNetwork\n): CompleteSIWxInfo | undefined => {\n const siwx = extensions?.['sign-in-with-x'] as\n | { info?: SIWxExtensionInfo; supportedChains?: SupportedChain[] }\n | undefined;\n\n if (!siwx?.info) {\n return undefined;\n }\n\n const chain = siwx.supportedChains?.find(c =>\n paymentNetwork\n ? c.chainId === networkToCaip2(paymentNetwork)\n : c.chainId.startsWith('eip155:')\n );\n\n return {\n ...siwx.info,\n chainId: chain?.chainId ?? 'eip155:8453',\n type: chain?.type ?? 'eip191',\n signatureScheme: chain?.signatureScheme,\n };\n};\n\nexport const safeCreatePaymentPayload = (\n surface: string,\n wallets: Wallets,\n paymentRequired: PaymentRequired,\n paymentRequirementsSelector?: SelectPaymentRequirements\n) => {\n const client = new x402HTTPClient(\n x402Client.fromConfig({\n schemes: [\n {\n network: networkToCaip2(Network.BASE),\n client: new ExactEvmScheme(\n toClientEvmSigner(\n wallets.evm,\n createPublicClient({\n chain: base,\n transport: http(),\n })\n )\n ),\n },\n {\n network: networkToCaip2(Network.BASE),\n client: new UptoEvmScheme(\n toClientEvmSigner(\n wallets.evm,\n createPublicClient({\n chain: base,\n transport: http(),\n })\n )\n ),\n },\n {\n network: networkToCaip2(Network.SOLANA),\n client: new PatchedExactSvmScheme(toClientSvmSigner(wallets.svm)),\n },\n ],\n policies: [capUptoDeadline],\n paymentRequirementsSelector,\n })\n );\n return x402ResultFromPromise(\n surface,\n client.createPaymentPayload(paymentRequired),\n error => ({\n cause: 'create_payment_payload',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to create payment payload',\n })\n );\n};\n\nexport const safeGetPaymentSettlement = (\n surface: string,\n response: Response\n) => {\n return x402ResultFromThrowable(\n surface,\n () =>\n x402ProbeClient.getPaymentSettleResponse(name =>\n response.headers.get(name)\n ),\n error => ({\n cause: 'get_payment_settlement',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to get payment settlement',\n })\n );\n};\n\nexport const safeCreateSIWxPayload = (\n surface: string,\n serverInfo: CompleteSIWxInfo,\n wallets: Wallets\n) => {\n return x402ResultFromPromise(\n surface,\n createSIWxPayload(\n serverInfo,\n serverInfo.chainId.startsWith('eip155:')\n ? wallets.evm\n : (wallets.svm as unknown as SolanaSigner)\n ),\n error => ({\n cause: 'create_siwx_payload',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to create SIWX payload',\n })\n );\n};\n","import {\n getSetComputeUnitLimitInstruction,\n setTransactionMessageComputeUnitPrice,\n} from '@solana-program/compute-budget';\nimport { TOKEN_PROGRAM_ADDRESS } from '@solana-program/token';\nimport {\n fetchMint,\n findAssociatedTokenPda,\n getTransferCheckedInstruction,\n TOKEN_2022_PROGRAM_ADDRESS,\n} from '@solana-program/token-2022';\nimport {\n appendTransactionMessageInstructions,\n createTransactionMessage,\n getBase64EncodedWireTransaction,\n partiallySignTransactionMessageWithSigners,\n pipe,\n prependTransactionMessageInstruction,\n setTransactionMessageFeePayer,\n setTransactionMessageLifetimeUsingBlockhash,\n type Address,\n} from '@solana/kit';\n\nimport type {\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkClient,\n} from '@x402/core/types';\nimport {\n DEFAULT_COMPUTE_UNIT_LIMIT,\n DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS,\n createRpcClient,\n type ClientSvmConfig,\n type ClientSvmSigner,\n type ExactSvmPayloadV2,\n} from '@x402/svm';\n\ntype BlockhashLifetime = Parameters<\n typeof setTransactionMessageLifetimeUsingBlockhash\n>[0];\n\ninterface PatchedPaymentExtra {\n feePayer?: Address;\n recentBlockhash?:\n | string\n | Partial<{\n blockhash: string;\n lastValidBlockHeight: bigint | number | string;\n }>;\n lastValidBlockHeight?: bigint | number | string;\n}\n\nfunction parseLastValidBlockHeight(\n value: bigint | number | string | undefined\n): bigint | undefined {\n if (typeof value === 'bigint') {\n return value;\n }\n\n if (typeof value === 'number' && Number.isFinite(value)) {\n return BigInt(value);\n }\n\n if (typeof value === 'string' && value.length > 0) {\n return BigInt(value);\n }\n\n return undefined;\n}\n\nfunction asBlockhash(blockhash: string): BlockhashLifetime['blockhash'] {\n return blockhash as BlockhashLifetime['blockhash'];\n}\n\n/**\n * Local compatibility patch for Coinbase ExactSvmScheme.\n *\n * Changes from upstream:\n * - omits the trailing memo instruction\n * - prefers paymentRequirements.extra.recentBlockhash when provided\n */\nexport class PatchedExactSvmScheme implements SchemeNetworkClient {\n readonly scheme = 'exact';\n\n constructor(\n private readonly signer: ClientSvmSigner,\n private readonly config?: ClientSvmConfig\n ) {}\n\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements\n ): Promise<Pick<PaymentPayload, 'x402Version' | 'payload'>> {\n const rpc = createRpcClient(\n paymentRequirements.network,\n this.config?.rpcUrl\n );\n\n const tokenMint = await fetchMint(\n rpc,\n paymentRequirements.asset as Address\n );\n const tokenProgramAddress = tokenMint.programAddress;\n\n if (\n tokenProgramAddress.toString() !== TOKEN_PROGRAM_ADDRESS.toString() &&\n tokenProgramAddress.toString() !== TOKEN_2022_PROGRAM_ADDRESS.toString()\n ) {\n throw new Error('Asset was not created by a known token program');\n }\n\n const [sourceATA] = await findAssociatedTokenPda({\n mint: paymentRequirements.asset as Address,\n owner: this.signer.address,\n tokenProgram: tokenProgramAddress,\n });\n\n const [destinationATA] = await findAssociatedTokenPda({\n mint: paymentRequirements.asset as Address,\n owner: paymentRequirements.payTo as Address,\n tokenProgram: tokenProgramAddress,\n });\n\n const transferIx = getTransferCheckedInstruction(\n {\n source: sourceATA,\n mint: paymentRequirements.asset as Address,\n destination: destinationATA,\n authority: this.signer,\n amount: BigInt(paymentRequirements.amount),\n decimals: tokenMint.data.decimals,\n },\n { programAddress: tokenProgramAddress }\n );\n\n const extra = paymentRequirements.extra as PatchedPaymentExtra;\n const feePayer = extra.feePayer;\n\n if (!feePayer) {\n throw new Error(\n 'feePayer is required in paymentRequirements.extra for SVM transactions'\n );\n }\n\n const latestBlockhash = await this.resolveBlockhashLifetime(rpc, extra);\n\n const tx = pipe(\n createTransactionMessage({ version: 0 }),\n tx =>\n setTransactionMessageComputeUnitPrice(\n DEFAULT_COMPUTE_UNIT_PRICE_MICROLAMPORTS,\n tx\n ),\n tx => setTransactionMessageFeePayer(feePayer, tx),\n tx =>\n prependTransactionMessageInstruction(\n getSetComputeUnitLimitInstruction({\n units: DEFAULT_COMPUTE_UNIT_LIMIT,\n }),\n tx\n ),\n tx => appendTransactionMessageInstructions([transferIx], tx),\n tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx)\n );\n\n const signedTransaction =\n await partiallySignTransactionMessageWithSigners(tx);\n const base64EncodedWireTransaction =\n getBase64EncodedWireTransaction(signedTransaction);\n\n const payload: ExactSvmPayloadV2 = {\n transaction: base64EncodedWireTransaction,\n };\n\n return {\n x402Version,\n payload,\n };\n }\n\n private async resolveBlockhashLifetime(\n rpc: ReturnType<typeof createRpcClient>,\n extra: PatchedPaymentExtra\n ): Promise<BlockhashLifetime> {\n const providedLastValidBlockHeight = parseLastValidBlockHeight(\n extra.lastValidBlockHeight\n );\n\n if (typeof extra.recentBlockhash === 'string') {\n if (providedLastValidBlockHeight !== undefined) {\n return {\n blockhash: asBlockhash(extra.recentBlockhash),\n lastValidBlockHeight: providedLastValidBlockHeight,\n };\n }\n\n const { value } = await rpc.getLatestBlockhash().send();\n return {\n blockhash: asBlockhash(extra.recentBlockhash),\n lastValidBlockHeight: value.lastValidBlockHeight,\n };\n }\n\n if (\n extra.recentBlockhash &&\n typeof extra.recentBlockhash === 'object' &&\n typeof extra.recentBlockhash.blockhash === 'string'\n ) {\n const lastValidBlockHeight =\n parseLastValidBlockHeight(extra.recentBlockhash.lastValidBlockHeight) ??\n providedLastValidBlockHeight;\n\n if (lastValidBlockHeight !== undefined) {\n return {\n blockhash: asBlockhash(extra.recentBlockhash.blockhash),\n lastValidBlockHeight,\n };\n }\n\n const { value } = await rpc.getLatestBlockhash().send();\n return {\n blockhash: asBlockhash(extra.recentBlockhash.blockhash),\n lastValidBlockHeight: value.lastValidBlockHeight,\n };\n }\n\n return (await rpc.getLatestBlockhash().send()).value;\n }\n}\n","import type { PaymentPolicy } from '@x402/core/client';\n\n/**\n * Maximum deadline (in seconds) we accept for `upto` payment requirements.\n *\n * The `upto` Permit2 signature is bound by `paymentRequirements.maxTimeoutSeconds`,\n * which the SDK passes straight through from the merchant's 402 response with no\n * upper bound. Within that window, the (merchant + facilitator) pair can settle\n * for any amount in `[0, cap]` — and the only on-chain check is the deadline.\n *\n * A long deadline therefore extends the window of facilitator-discretion settlement\n * at the signed cap. 7 days lets a long-running agent keep working without\n * re-signing, but bounds the trust window if a merchant declares an unreasonably\n * large `maxTimeoutSeconds` (accidentally or otherwise).\n *\n * `exact` requirements are unaffected: their amount is fixed in the signature, so\n * a long validity window is just an annoyance, not a discretion surface.\n */\nexport const MAX_UPTO_DEADLINE_SECONDS = 7 * 24 * 60 * 60; // 7 days\n\n/**\n * Caps `maxTimeoutSeconds` on `upto` requirements at {@link MAX_UPTO_DEADLINE_SECONDS}.\n * Leaves `exact` and any other scheme untouched. Pass to `x402Client.fromConfig({ policies })`.\n */\nexport const capUptoDeadline: PaymentPolicy = (_x402Version, requirements) =>\n requirements.map(r =>\n r.scheme === 'upto' && r.maxTimeoutSeconds > MAX_UPTO_DEADLINE_SECONDS\n ? { ...r, maxTimeoutSeconds: MAX_UPTO_DEADLINE_SECONDS }\n : r\n );\n","import { PaymentProtocol } from './types';\n\nexport function detectPaymentProtocols(response: Response): PaymentProtocol[] {\n const protocols: PaymentProtocol[] = [];\n\n const wwwAuth = response.headers.get('WWW-Authenticate');\n if (wwwAuth?.startsWith('Payment')) {\n protocols.push(PaymentProtocol.MPP);\n }\n\n const paymentRequired = response.headers.get('payment-required');\n if (paymentRequired) {\n protocols.push(PaymentProtocol.X402);\n }\n // If we couldn't detect either explicitly, default to x402\n if (protocols.length === 0) {\n protocols.push(PaymentProtocol.X402);\n }\n return protocols;\n}\n","import type { Address } from 'viem';\nimport { formatUnits } from 'viem';\n\nimport { safeFetch, safeReadResponseText } from '@/shared/neverthrow/fetch';\nimport {\n assertTempoUsdc,\n safeGetMppChallenge,\n safeCreateMppCredential,\n safeGetMppReceipt,\n mppErr,\n mppOk,\n} from '@/shared/protocols/mpp';\n\nimport { PaymentProtocol } from '../types';\nimport { Network } from '@agentcash/networks';\nimport { formatUsd } from '@/shared/utils';\n\nimport type { ExecuteFetchResult } from '@/operations/fetch/types';\nimport type { HandlePaymentParams } from '@/shared/protocols/types';\nimport { beforePayment } from '../before-payment';\nimport { handleMppSessionPayment } from './session/handle-session-payment';\n\nexport async function handleMppPayment(params: HandlePaymentParams) {\n const { response, request, options } = params;\n const { surface, wallets } = options;\n const { timeout } = options.params;\n\n // Prevent retry loops\n if (request.headers.has('Authorization')) {\n return mppErr(surface, {\n cause: 'mpp_payment_already_attempted',\n message: 'MPP payment already attempted',\n });\n }\n\n // Parse the challenge from the WWW-Authenticate header\n const challengeResult = safeGetMppChallenge(surface, response);\n\n if (challengeResult.isErr()) {\n return challengeResult;\n }\n\n const challenge = challengeResult.value;\n\n if (challenge.intent === 'session') {\n return handleMppSessionPayment(challenge, params);\n }\n\n const amount = Number(formatUnits(BigInt(challenge.request.amount), 6));\n const tokenAddress = challenge.request.currency as Address;\n\n const tokenCheck = assertTempoUsdc(surface, tokenAddress);\n if (tokenCheck.isErr()) {\n return tokenCheck;\n }\n\n const beforePaymentResult = await beforePayment({\n options,\n balanceInput: {\n address: wallets.evm.address,\n network: Network.TEMPO,\n tokenAddress,\n },\n amount,\n protocol: PaymentProtocol.MPP,\n });\n\n if (beforePaymentResult.isErr()) {\n return beforePaymentResult;\n }\n\n const credentialResult = await safeCreateMppCredential(\n surface,\n wallets,\n response\n );\n\n if (credentialResult.isErr()) {\n return credentialResult;\n }\n\n const credential = credentialResult.value;\n\n // Set Authorization header on cloned request\n request.headers.set('Authorization', credential);\n\n // Retry the fetch with the credential\n const paidFetchResult = await safeFetch(surface, request, timeout);\n if (paidFetchResult.isErr()) {\n return paidFetchResult;\n }\n\n const paidResponse = paidFetchResult.value;\n\n // If the server still returns 402, the payment was rejected\n if (paidResponse.status === 402) {\n const body = await safeReadResponseText(surface, paidResponse).unwrapOr('');\n const detail = body ? `: ${body}` : '';\n return mppErr(surface, {\n cause: 'mpp_payment_rejected',\n message: `MPP payment was rejected by the server (402)${detail}`,\n });\n }\n\n // Parse the receipt for transaction hash\n const receiptResult = safeGetMppReceipt(surface, paidResponse);\n\n return mppOk<ExecuteFetchResult>({\n response: paidResponse,\n paymentInfo: {\n protocol: PaymentProtocol.MPP,\n network: Network.TEMPO,\n price: formatUsd(amount),\n payment: receiptResult.isOk()\n ? {\n success: true,\n transactionHash: receiptResult.value.reference,\n }\n : null,\n },\n });\n}\n","import { err, ok } from '@agentcash/neverthrow';\n\nimport { getBalance } from '../balance';\nimport { getDepositLink } from '../utils';\nimport { getSettings } from '../settings';\n\nimport { DEFAULT_MAX_AMOUNT } from '@/operations/fetch/types';\n\nimport type { GetBalanceInput } from '@agentcash/balance';\nimport type { ExecuteFetchOptions } from '@/operations/fetch/types';\nimport type { PaymentProtocol } from './types';\n\ninterface BeforePaymentProps {\n options: ExecuteFetchOptions;\n balanceInput: GetBalanceInput;\n protocol: PaymentProtocol;\n amount: number;\n}\n\nexport const beforePayment = async (props: BeforePaymentProps) => {\n const { options, balanceInput, amount } = props;\n const maxAmount =\n options.params.maxAmount ?? getSettings().maxAmount ?? DEFAULT_MAX_AMOUNT;\n if (amount > maxAmount) {\n return err('before_payment', options.surface, {\n cause: 'amount_exceeds_max_amount' as const,\n message: `Endpoint requested $${amount} which exceeds the maximum allowed amount of $${maxAmount}. Pass a higher maxAmount on this call, or use update_settings to raise the default permanently.`,\n });\n }\n\n const balanceResult = await getBalance(\n options.surface,\n balanceInput,\n options.flags\n );\n\n if (balanceResult.isErr()) {\n return balanceResult;\n }\n\n const balance = balanceResult.value.balance;\n\n if (balance < amount) {\n return err('before_payment', options.surface, {\n cause: 'insufficient_balance' as const,\n message: insufficientBalanceErrorMessage(props, balance),\n });\n }\n\n return ok(true);\n};\n\nconst insufficientBalanceErrorMessage = (\n props: BeforePaymentProps,\n balance: number\n) => {\n const { options, balanceInput, amount } = props;\n return [\n `You are attempting to use an endpoint via ${props.protocol} that costs ${amount} USDC on ${balanceInput.network}.`,\n `Your current balance is ${balance} USDC.`,\n `You can bridge between accounts or deposit at ${getDepositLink(balanceInput.address, options.flags, balanceInput.network)} to top up your balance.`,\n `Before bridging, you can check the users account with npx agentcash@latest accounts or if you are within the MCP, you can use the list_accounts tool.`,\n ].join('\\n');\n};\n","import type { Address } from 'viem';\nimport { formatUnits } from 'viem';\n\nimport { tempo as tempoClient } from 'mppx/client';\n\nimport { Network } from '@agentcash/networks';\n\nimport type { ExecuteFetchResult } from '@/operations/fetch/types';\nimport { formatUsd, tokenStringToNumber } from '@/shared/utils';\n\nimport { beforePayment } from '../../before-payment';\nimport type { HandlePaymentParams } from '../../types';\nimport { PaymentProtocol } from '../../types';\nimport {\n assertTempoUsdc,\n createTempoClient,\n mppOk,\n mppResultFromPromise,\n sessionRequestFailedErr,\n} from '../index';\nimport { runRequestSession } from './run-request-session';\nimport { runStreamingSession } from './run-streaming-session';\nimport type { SessionChallenge } from './types';\nimport {\n USDC_DECIMALS,\n bufferRequestForReplay,\n formatDepositCap,\n resolveDepositUsd,\n} from './utils';\n\nexport async function handleMppSessionPayment(\n challenge: SessionChallenge,\n { request, options }: HandlePaymentParams\n) {\n const { surface, wallets } = options;\n\n const tickCostAtomic = BigInt(challenge.request.amount);\n const tickCostUsd = Number(formatUnits(tickCostAtomic, USDC_DECIMALS));\n const tokenAddress = challenge.request.currency as Address;\n\n const tokenCheck = assertTempoUsdc(surface, tokenAddress);\n if (tokenCheck.isErr()) return tokenCheck;\n\n const depositUsd = resolveDepositUsd(\n challenge.request.suggestedDeposit,\n tickCostUsd,\n options\n );\n\n const beforePaymentResult = await beforePayment({\n options,\n balanceInput: {\n address: wallets.evm.address,\n network: Network.TEMPO,\n tokenAddress,\n },\n amount: depositUsd,\n protocol: PaymentProtocol.MPP,\n });\n if (beforePaymentResult.isErr()) return beforePaymentResult;\n\n const replayInitResult = await mppResultFromPromise(\n surface,\n bufferRequestForReplay(request),\n e =>\n sessionRequestFailedErr(\n e,\n 'Failed to buffer request body for session replay'\n )\n );\n if (replayInitResult.isErr()) return replayInitResult;\n\n const sm = tempoClient.session({\n account: wallets.evm,\n client: createTempoClient(),\n maxDeposit: formatDepositCap(depositUsd),\n decimals: USDC_DECIMALS,\n });\n\n const isStreaming =\n challenge.meta?.streaming === 'true' || options.params.stream === true;\n\n const reuseChannelId = options.params.channelId;\n\n const sessionResult = isStreaming\n ? await runStreamingSession(\n surface,\n sm,\n request.url,\n replayInitResult.value,\n reuseChannelId\n )\n : await runRequestSession(\n surface,\n sm,\n request.url,\n replayInitResult.value,\n reuseChannelId\n );\n if (sessionResult.isErr()) return sessionResult;\n\n const { response: finalResponse, receipt } = sessionResult.value;\n\n const price = receipt\n ? formatUsd(tokenStringToNumber(receipt.spent, USDC_DECIMALS))\n : `from ${formatUsd(tickCostUsd)}/tick`;\n\n return mppOk<ExecuteFetchResult>({\n response: finalResponse,\n paymentInfo: {\n protocol: PaymentProtocol.MPP,\n network: Network.TEMPO,\n price,\n payment: receipt ? { success: true, channelId: receipt.channelId } : null,\n },\n });\n}\n","import { safeReadResponseText } from '@/shared/neverthrow/fetch';\n\nimport {\n mppErr,\n mppOk,\n mppResultFromPromise,\n sessionRequestFailedErr,\n} from '../index';\nimport type { SessionManager, SessionOutcome } from './types';\n\nexport async function runRequestSession(\n surface: string,\n sm: SessionManager,\n url: string,\n init: RequestInit,\n channelId?: string\n) {\n const fetchInit: RequestInit & { context?: { channelId?: string } } = {\n ...init,\n ...(channelId ? { context: { channelId } } : {}),\n };\n const fetchResult = await mppResultFromPromise(\n surface,\n sm.fetch(url, fetchInit),\n e => sessionRequestFailedErr(e)\n );\n if (fetchResult.isErr()) return fetchResult;\n\n const paymentResponse = fetchResult.value;\n\n if (paymentResponse.status === 402) {\n const body = await safeReadResponseText(surface, paymentResponse).unwrapOr(\n ''\n );\n const detail = body ? `: ${body}` : '';\n return mppErr(surface, {\n cause: 'mpp_payment_rejected',\n message: `MPP session payment was rejected by the server (402)${detail}`,\n });\n }\n\n return mppOk<SessionOutcome>({\n response: paymentResponse,\n receipt: paymentResponse.receipt,\n });\n}\n","import { mppErr, mppOk } from '../index';\nimport type { SessionManager, SessionOutcome, SessionReceipt } from './types';\n\nconst MAX_BUFFERED_BYTES = 50 * 1024 * 1024;\n\nexport async function runStreamingSession(\n surface: string,\n sm: SessionManager,\n url: string,\n init: RequestInit,\n channelId?: string\n) {\n let latestReceipt: SessionReceipt | null = null;\n\n const { signal, ...rest } = init;\n const sseResult = await sm.sse(url, {\n ...rest,\n ...(signal ? { signal } : {}),\n ...(channelId ? { context: { channelId } } : {}),\n onReceipt: receipt => {\n latestReceipt = receipt;\n },\n });\n\n const chunks: string[] = [];\n let bytes = 0;\n for await (const chunk of sseResult) {\n bytes += chunk.length;\n chunks.push(chunk);\n if (bytes > MAX_BUFFERED_BYTES) {\n return mppErr(surface, {\n cause: 'mpp_session_response_too_large',\n message: `Streaming response exceeded the ${MAX_BUFFERED_BYTES}-byte buffering cap (got ${bytes} bytes).`,\n });\n }\n }\n\n // mppx's `sm.sse()` yields the `data:` payloads of `message` events\n // (voucher/receipt events are consumed internally), so join with `\\n`\n // to keep object-yielding streams valid NDJSON.\n const response = new Response(chunks.join('\\n'), {\n status: 200,\n headers: {\n 'Content-Type': 'text/plain',\n 'Cache-Control': 'private',\n },\n });\n\n return mppOk<SessionOutcome>({ response, receipt: latestReceipt });\n}\n","import {\n DEFAULT_MAX_AMOUNT,\n type ExecuteFetchOptions,\n} from '@/operations/fetch/types';\nimport { getSettings } from '@/shared/settings';\nimport { tokenStringToNumber } from '@/shared/utils';\n\nexport const USDC_DECIMALS = 6;\nconst DEFAULT_TICK_BUDGET = 10;\n\nexport function resolveDepositUsd(\n suggestedDeposit: string | undefined,\n tickCostUsd: number,\n options: ExecuteFetchOptions\n): number {\n const maxAmount =\n options.params.maxAmount ?? getSettings().maxAmount ?? DEFAULT_MAX_AMOUNT;\n const desired =\n suggestedDeposit !== undefined\n ? tokenStringToNumber(suggestedDeposit, USDC_DECIMALS)\n : tickCostUsd * DEFAULT_TICK_BUDGET;\n return Math.min(desired, maxAmount);\n}\n\n// toFixed rather than toString so very small deposits don't serialize in\n// scientific notation, which viem's parseUnits rejects.\nexport function formatDepositCap(depositUsd: number): string {\n if (!Number.isFinite(depositUsd) || depositUsd <= 0) {\n return '0';\n }\n return depositUsd.toFixed(USDC_DECIMALS);\n}\n\nexport async function bufferRequestForReplay(\n request: Request\n): Promise<RequestInit> {\n const init: RequestInit = {\n method: request.method,\n headers: new Headers(request.headers),\n credentials: request.credentials,\n redirect: request.redirect,\n referrer: request.referrer === '' ? undefined : request.referrer,\n integrity: request.integrity || undefined,\n signal: request.signal,\n };\n\n const hasBody =\n request.method !== 'GET' &&\n request.method !== 'HEAD' &&\n request.body !== null;\n\n if (hasBody) {\n init.body = await request.arrayBuffer();\n }\n\n return init;\n}\n","import { safeGetMppChallenge } from '@/shared/protocols/mpp';\n\nimport { log } from '@/shared/log';\nimport { getBalance } from '@/shared/balance';\nimport { Network } from '@agentcash/networks';\n\nimport { PaymentProtocol } from './types';\n\nimport type { ExecuteFetchOptions } from '@/operations/fetch/types';\n\n/**\n * Pick the preferred protocol by comparing wallet balances.\n * Falls back to 'mpp' if both balances fail to fetch.\n */\nexport async function pickByBalance(\n response: Response,\n options: ExecuteFetchOptions\n): Promise<PaymentProtocol> {\n const { surface, wallets, flags } = options;\n\n // Get x402 (USDC on Base and Solana) balances in parallel\n const x402Balances = await Promise.all([\n getBalance(\n surface,\n {\n address: wallets.evm.address,\n network: Network.BASE,\n },\n flags\n ),\n getBalance(\n surface,\n {\n address: wallets.svm.address,\n network: Network.SOLANA,\n },\n flags\n ),\n ]);\n\n const x402Balance = x402Balances.reduce(\n (acc, balance) => acc + (balance.isOk() ? balance.value.balance : 0),\n 0\n );\n\n // Get MPP (Tempo) balance — need token address from the challenge\n let mppBalance = 0;\n const challengeResult = safeGetMppChallenge(surface, response);\n if (challengeResult.isOk()) {\n const currency = challengeResult.value.request.currency;\n if (currency) {\n const tempoResult = await getBalance(\n surface,\n {\n address: wallets.evm.address,\n network: Network.TEMPO,\n },\n flags\n );\n if (tempoResult.isOk()) {\n mppBalance = tempoResult.value.balance ?? 0;\n }\n }\n }\n\n log.info(`Protocol selection — x402: $${x402Balance}, mpp: $${mppBalance}`);\n return x402Balance >= mppBalance ? PaymentProtocol.X402 : PaymentProtocol.MPP;\n}\n","import { getBalance } from '@/shared/balance';\nimport { caip2ToNetwork, Network, networkToCaip2 } from '@agentcash/networks';\n\nimport type { PaymentRequirements } from '@x402/core/types';\nimport type { ExecuteFetchOptions } from '@/operations/fetch/types';\n\ninterface ChoosePaymentRequirementParams {\n paymentRequirements: PaymentRequirements[];\n options: ExecuteFetchOptions;\n}\n\n// Prefer `upto` over `exact` when a server offers both on the same network.\n// `upto` authorizes a maximum via Permit2 and settles for actual usage, which\n// matches usage-priced endpoints (e.g. per-token LLM inference) better than\n// `exact`, which charges the upper bound regardless. Servers that surface\n// both schemes — like Surplus Intelligence — explicitly recommend preferring\n// `upto`. Falls back to the first match when `upto` isn't offered.\nexport const preferUpto = (\n requirements: PaymentRequirements[]\n): PaymentRequirements | undefined => {\n return requirements.find(pr => pr.scheme === 'upto') ?? requirements[0];\n};\n\nexport const choosePaymentRequirement = async ({\n paymentRequirements,\n options,\n}: ChoosePaymentRequirementParams) => {\n const { surface, wallets, flags } = options;\n const { paymentNetwork } = options.params;\n if (paymentNetwork) {\n const caip2 = networkToCaip2(paymentNetwork);\n return preferUpto(paymentRequirements.filter(pr => pr.network === caip2));\n }\n\n const requirementsWithBalance = await Promise.all(\n paymentRequirements.map(async pr => {\n const network = caip2ToNetwork(pr.network);\n if (network === null) {\n return {\n balance: 0,\n requirement: pr,\n };\n }\n if (network === Network.SOLANA) {\n const balanceResult = await getBalance(\n surface,\n {\n address: wallets.svm.address,\n network,\n },\n flags\n );\n return {\n requirement: pr,\n balance: balanceResult.isOk() ? balanceResult.value.balance : 0,\n };\n } else {\n const balanceResult = await getBalance(\n surface,\n {\n address: wallets.evm.address,\n network,\n },\n flags\n );\n return {\n requirement: pr,\n balance: balanceResult.isOk() ? balanceResult.value.balance : 0,\n };\n }\n })\n );\n const bestNetwork = requirementsWithBalance.sort(\n (a, b) => b.balance - a.balance\n )[0]!.requirement.network;\n return preferUpto(\n paymentRequirements.filter(pr => pr.network === bestNetwork)\n );\n};\n","import { caip2ToNetwork, Network } from '@agentcash/networks';\n\nimport { choosePaymentRequirement } from './choose-payment-requirement';\n\nimport { safeFetch, safeReadResponseText } from '@/shared/neverthrow/fetch';\nimport {\n safeCreatePaymentPayload,\n safeGetPaymentRequired,\n safeGetPaymentSettlement,\n x402Err,\n x402Ok,\n x402ProbeClient,\n} from '@/shared/protocols/x402';\nimport { tokenStringToNumber, formatUsd } from '@/shared/utils';\n\nimport { beforePayment } from '../before-payment';\n\nimport { PaymentProtocol } from '../types';\n\nimport type { ExecuteFetchResult } from '@/operations/fetch/types';\nimport type { HandlePaymentParams } from '../types';\nimport type { BaseX402Error } from './types';\n\nexport const isPermit2AllowanceFailureBody = (body: string): boolean =>\n body.includes('permit2') && body.includes('allowance_required');\n\nexport const buildPermit2AllowanceErrorMessage = (params: {\n walletAddress: string;\n scheme: string;\n}): string => {\n const { walletAddress, scheme } = params;\n return [\n `Payment failed: this endpoint's \\`${scheme}\\` scheme settles via the Permit2 contract, but your agentcash wallet (${walletAddress}) has not approved Permit2 to spend USDC.`,\n '',\n 'The clean fix is server-side. The merchant should adopt the EIP-2612 gas-sponsoring extension — agentcash will then auto-sign an off-chain permit on each call and the facilitator pays the approval gas, with no setup required from the user. See https://docs.x402.org/extensions/eip2612-gas-sponsoring',\n '',\n `Until the merchant adopts that extension, you can do a one-time \\`USDC.approve(0x000000000022D473030F116dDEE9F6B43aC78BA3, MAX_UINT256)\\` on Base from this wallet (requires a small amount of ETH for gas, ~$0.01–0.10). After that, all future Permit2-based payments from this wallet work without further on-chain transactions.`,\n ].join('\\n');\n};\n\nexport async function handleX402Payment({\n response,\n request,\n options,\n}: HandlePaymentParams) {\n const { surface, wallets } = options;\n const { timeout } = options.params;\n\n const paymentRequiredResult = await safeGetPaymentRequired(surface, response);\n\n if (paymentRequiredResult.isErr()) {\n return paymentRequiredResult;\n }\n\n const paymentRequired = paymentRequiredResult.value;\n\n if (paymentRequired.x402Version === 1) {\n return x402Err(surface, {\n cause: 'parse_payment_required' as const,\n message:\n 'This endpoint uses the x402 v1 format, which is not supported by agentcash. Only x402 v2 servers (with an `accepts` array in the Payment-Required header) are supported.',\n });\n }\n\n if (!paymentRequired.accepts || !Array.isArray(paymentRequired.accepts)) {\n return x402Err(surface, {\n cause: 'parse_payment_required' as const,\n message:\n 'This endpoint has a missing or malformed accepts array in the Payment-Required header.',\n });\n }\n\n // Check amount against maxAmount before any payment logic\n const accept = await choosePaymentRequirement({\n options,\n paymentRequirements: paymentRequired.accepts,\n });\n\n if (accept) {\n const amount = tokenStringToNumber(accept.amount);\n\n const typedNetwork = caip2ToNetwork(accept.network)!;\n if (!typedNetwork) {\n return x402Err(surface, {\n cause: 'parse_payment_required' as const,\n message: `Invalid network: ${accept.network}`,\n });\n }\n\n const beforePaymentResult = await beforePayment({\n options,\n balanceInput:\n typedNetwork === Network.SOLANA\n ? {\n address: wallets.svm.address,\n network: Network.SOLANA,\n }\n : {\n address: wallets.evm.address,\n network: typedNetwork,\n },\n amount,\n protocol: PaymentProtocol.X402,\n });\n\n if (beforePaymentResult.isErr()) {\n return beforePaymentResult;\n }\n }\n\n const paymentPayloadResult = await safeCreatePaymentPayload(\n surface,\n wallets,\n paymentRequired,\n accept ? () => accept : undefined\n );\n\n if (paymentPayloadResult.isErr()) {\n return paymentPayloadResult;\n }\n\n const paymentPayload = paymentPayloadResult.value;\n\n const paymentHeaders =\n x402ProbeClient.encodePaymentSignatureHeader(paymentPayload);\n\n if (\n request.headers.has('PAYMENT-SIGNATURE') ||\n request.headers.has('X-PAYMENT')\n ) {\n return x402Err(surface, {\n cause: 'payment_already_attempted',\n message: 'Payment already attempted',\n });\n }\n\n for (const [key, value] of Object.entries(paymentHeaders)) {\n request.headers.set(key, value);\n }\n request.headers.set(\n 'Access-Control-Expose-Headers',\n 'PAYMENT-RESPONSE,X-PAYMENT-RESPONSE'\n );\n\n const paidResult = await safeFetch(surface, request, timeout);\n if (paidResult.isErr()) {\n return paidResult;\n }\n const paidResponse = paidResult.value;\n\n const permit2Error = await detectPermit2AllowanceError(\n surface,\n paidResponse,\n {\n walletAddress: wallets.evm.address,\n scheme: paymentPayload.accepted.scheme,\n }\n );\n if (permit2Error) {\n return x402Err(surface, permit2Error);\n }\n\n const settlementResult = safeGetPaymentSettlement(surface, paidResponse);\n\n const settlement = settlementResult.isOk() ? settlementResult.value : null;\n\n const maxAmount = tokenStringToNumber(paymentPayload.accepted.amount);\n const settledAmount = settlement?.amount\n ? tokenStringToNumber(settlement.amount)\n : null;\n const isUpTo = paymentPayload.accepted.scheme === 'upto';\n\n const price =\n settledAmount != null\n ? formatUsd(settledAmount)\n : isUpTo\n ? `up to ${formatUsd(maxAmount)}`\n : formatUsd(maxAmount);\n\n return x402Ok<ExecuteFetchResult>({\n response: paidResponse,\n paymentInfo: {\n protocol: PaymentProtocol.X402,\n network: caip2ToNetwork(paymentPayload.accepted.network)!,\n price,\n payment: settlement\n ? {\n success: settlement.success,\n transactionHash: settlement.transaction,\n }\n : null,\n },\n });\n}\n\nasync function detectPermit2AllowanceError(\n surface: string,\n response: Response,\n context: { walletAddress: string; scheme: string }\n): Promise<BaseX402Error | null> {\n if (response.ok) {\n return null;\n }\n const body = await safeReadResponseText(surface, response).unwrapOr('');\n if (!isPermit2AllowanceFailureBody(body)) {\n return null;\n }\n return {\n cause: 'permit2_allowance_required',\n message: buildPermit2AllowanceErrorMessage(context),\n };\n}\n","import { detectPaymentProtocols } from '@/shared/protocols/detect';\nimport { handleMppPayment } from '@/shared/protocols/mpp/handle-payment';\nimport { pickByBalance } from '@/shared/protocols/pick';\nimport { PaymentProtocol } from '@/shared/protocols/types';\nimport { handleX402Payment } from '@/shared/protocols/x402/handle-payment';\n\nimport type { ExecuteFetchOptions } from './types';\n\nexport async function executePayment(\n response: Response,\n request: Request,\n options: ExecuteFetchOptions\n) {\n const { paymentProtocol } = options.params;\n\n const params = {\n response,\n request,\n options,\n };\n\n if (paymentProtocol) {\n return handlerMap[paymentProtocol](params);\n }\n\n const available = detectPaymentProtocols(response);\n const preferred =\n available.length === 1\n ? available[0]!\n : await pickByBalance(response, options);\n const fallback =\n available.length > 1\n ? preferred === PaymentProtocol.MPP\n ? PaymentProtocol.X402\n : PaymentProtocol.MPP\n : null;\n\n const fallbackRetryRequest = fallback ? request.clone() : null;\n const result = await handlerMap[preferred](params);\n\n if (result.isErr() && fallback && fallbackRetryRequest) {\n return handlerMap[fallback]({\n ...params,\n request: fallbackRetryRequest,\n });\n }\n\n return result;\n}\n\nconst handlerMap = {\n [PaymentProtocol.MPP]: handleMppPayment,\n [PaymentProtocol.X402]: handleX402Payment,\n};\n","import { fetchErr, fetchOk, safeFetch } from '@/shared/neverthrow/fetch';\nimport { BLACKLISTED_ORIGINS } from '@/shared/origins';\n\nimport { attemptSiwxAuth } from './auth';\nimport { executePayment } from './payment';\n\nimport type { ExecuteFetchOptions } from './types';\nimport { buildRequest } from '@/shared/request/build';\nimport type { RequestInput } from '@/shared/request/types';\n\n/**\n * Executes a request with automatic SIWX authentication and payment handling.\n *\n * 1. Probe the endpoint\n * 2. If 402 with SIWX challenge, retry with SIGN-IN-WITH-X\n * 3. If still 402, execute payment\n */\nexport async function executeFetch(\n input: RequestInput,\n options: ExecuteFetchOptions\n) {\n const request = buildRequest(input, options);\n\n const { surface } = options;\n const { timeout } = options.params;\n\n const blocked = BLACKLISTED_ORIGINS.find(origin =>\n request.url.startsWith(origin)\n );\n if (blocked) {\n return fetchErr(surface, {\n cause: 'network',\n message: `${blocked} is no longer available. This origin has been deprecated.`,\n });\n }\n\n const authRetryRequest = request.clone();\n const paymentRetryRequest = request.clone();\n\n const probeResult = await safeFetch(surface, request, timeout);\n\n if (probeResult.isErr()) {\n return fetchErr(surface, probeResult.error);\n }\n\n const initialResponse = probeResult.value;\n if (initialResponse.status !== 402) {\n return fetchOk({\n response: initialResponse,\n paymentInfo: null,\n });\n }\n\n const authResult = await attemptSiwxAuth(\n initialResponse,\n authRetryRequest,\n paymentRetryRequest,\n options\n );\n\n if (authResult.isErr()) {\n return authResult;\n }\n\n const latestResponse = authResult.value.response;\n if (latestResponse.status !== 402) {\n return fetchOk({\n response: latestResponse,\n paymentInfo: null,\n });\n }\n\n return executePayment(\n latestResponse,\n authResult.value.paymentRetryRequest,\n options\n );\n}\n"],"mappings":"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","names":["tx","formatUnits","formatUnits"]}
@@ -8,6 +8,9 @@ var Network = /* @__PURE__ */ ((Network2) => {
8
8
 
9
9
  // ../../internal/networks/src/configs.ts
10
10
  import { base, tempo } from "viem/chains";
11
+ var TEMPO_RPC_URL_FALLBACK = "https://eng:acard-melody-fashion-finish@rpc.mainnet.tempo.xyz";
12
+ var tempoRpcEnvOverride = typeof process !== "undefined" ? process.env?.TEMPO_RPC_URL : void 0;
13
+ var tempoRpcUrl = tempoRpcEnvOverride ?? TEMPO_RPC_URL_FALLBACK;
11
14
  var EVM_CONFIGS = {
12
15
  ["base" /* BASE */]: {
13
16
  chain: base,
@@ -21,7 +24,8 @@ var EVM_CONFIGS = {
21
24
  }),
22
25
  name: "Tempo",
23
26
  caip2: "eip155:4217",
24
- usdcAddress: "0x20c000000000000000000000b9537d11c60e8b50"
27
+ usdcAddress: "0x20c000000000000000000000b9537d11c60e8b50",
28
+ rpcUrl: tempoRpcUrl
25
29
  }
26
30
  };
27
31
  var chainId = (network) => EVM_CONFIGS[network].chain.id;
@@ -107,4 +111,4 @@ export {
107
111
  typedAddressSchema,
108
112
  usdc
109
113
  };
110
- //# sourceMappingURL=chunk-NPJV7AMV.js.map
114
+ //# sourceMappingURL=chunk-HTGTKVXB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../internal/networks/src/types.ts","../../../../internal/networks/src/configs.ts","../../../../internal/networks/src/schemas.ts","../../../../internal/networks/src/tokens.ts"],"sourcesContent":["import type { Chain, Address as EvmAddress } from 'viem';\nimport type { Address as SolanaAddress } from '@solana/kit';\nimport type { typedAddressSchema } from './schemas';\nimport type z from 'zod';\n\nexport type EthereumAddress = EvmAddress;\nexport { SolanaAddress };\nexport type MixedAddress = EthereumAddress | SolanaAddress;\n\nexport enum Network {\n BASE = 'base',\n TEMPO = 'tempo',\n SOLANA = 'solana',\n}\n\nexport type EvmNetwork = Exclude<Network, Network.SOLANA>;\n\nexport interface BaseNetworkConfig {\n caip2: `${string}:${string}`;\n name: string;\n}\n\nexport interface EvmNetworkConfig extends BaseNetworkConfig {\n chain: Chain;\n usdcAddress: EthereumAddress;\n rpcUrl?: string;\n}\n\nexport interface SolanaNetworkConfig extends BaseNetworkConfig {\n usdcAddress: SolanaAddress;\n}\n\nexport interface NetworkToken {\n symbol: string;\n name: string;\n icon: string;\n address: MixedAddress;\n decimals: number;\n network: Network;\n}\n\nexport type TypedNetworkAddress = z.infer<typeof typedAddressSchema>;\n","import { base, tempo } from 'viem/chains';\n\nimport { Network } from './types';\n\nimport type {\n EvmNetworkConfig,\n EvmNetwork,\n SolanaAddress,\n SolanaNetworkConfig,\n BaseNetworkConfig,\n} from './types';\n\n// Tempo's default RPC requires basic-auth credentials, so we override with\n// a shared engineering credential. Set TEMPO_RPC_URL to use a private RPC.\nconst TEMPO_RPC_URL_FALLBACK =\n 'https://eng:acard-melody-fashion-finish@rpc.mainnet.tempo.xyz';\nconst tempoRpcEnvOverride =\n typeof process !== 'undefined' ? process.env?.TEMPO_RPC_URL : undefined;\nconst tempoRpcUrl = tempoRpcEnvOverride ?? TEMPO_RPC_URL_FALLBACK;\n\nexport const EVM_CONFIGS: Record<EvmNetwork, EvmNetworkConfig> = {\n [Network.BASE]: {\n chain: base,\n name: 'Base',\n caip2: 'eip155:8453',\n usdcAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n },\n [Network.TEMPO]: {\n chain: tempo.extend({\n feeToken: '0x20c000000000000000000000b9537d11c60e8b50',\n }),\n name: 'Tempo',\n caip2: 'eip155:4217',\n usdcAddress: '0x20c000000000000000000000b9537d11c60e8b50',\n rpcUrl: tempoRpcUrl,\n },\n};\n\nexport const chainId = (network: EvmNetwork) => EVM_CONFIGS[network].chain.id;\n\nexport const SOLANA_CONFIG: SolanaNetworkConfig = {\n name: 'Solana',\n caip2: 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',\n usdcAddress: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v' as SolanaAddress,\n};\n\nexport const ALL_NETWORK_CONFIGS: Record<Network, BaseNetworkConfig> = {\n ...EVM_CONFIGS,\n [Network.SOLANA]: SOLANA_CONFIG,\n};\n\nexport const networkToCaip2 = (network: Network) => {\n if (network === Network.SOLANA) {\n return SOLANA_CONFIG.caip2;\n }\n return EVM_CONFIGS[network].caip2;\n};\n\nexport const TX_EXPLORER_URLS: Record<Network, string> = {\n [Network.BASE]: 'https://basescan.org/tx/',\n [Network.TEMPO]: 'https://testnet.tempo.xyz/tx/',\n [Network.SOLANA]: 'https://solscan.io/tx/',\n};\n\nexport const getTxExplorerUrl = (\n txHash: string,\n network: Network = Network.BASE\n) => `${TX_EXPLORER_URLS[network]}${txHash}`;\n\nexport const caip2ToNetwork = (caip2: `${string}:${string}`) => {\n if (caip2 === SOLANA_CONFIG.caip2) {\n return Network.SOLANA;\n }\n const evmNetwork = Object.entries(EVM_CONFIGS).find(\n ([, config]) => config.caip2 === caip2\n )?.[0];\n if (evmNetwork) {\n return evmNetwork as EvmNetwork;\n }\n return null;\n};\n","import z from 'zod';\n\nimport { Network } from './types';\n\nimport { isAddress } from 'viem';\nimport { isAddress as isSolanaAddress } from '@solana/kit';\n\nimport type { MixedAddress, SolanaAddress, EvmNetwork } from './types';\nimport { EVM_CONFIGS } from './configs';\n\nexport const networkSchema = z.enum(Network);\nexport const optionalNetworkSchema = networkSchema.optional();\n\nexport const evmNetworkSchema = z.enum(\n Object.keys(EVM_CONFIGS) as EvmNetwork[]\n);\n\nexport const ethereumAddressSchema = z\n .string()\n .refine(isAddress, 'Invalid EVM address');\n\nexport const solanaAddressSchema: z.ZodType<SolanaAddress, string> = z\n .string()\n .refine(isSolanaAddress, 'Invalid Solana address');\n\nexport const mixedAddressSchema: z.ZodType<MixedAddress, string> = z\n .union([ethereumAddressSchema, solanaAddressSchema])\n .transform(address => address as MixedAddress);\n\nexport const typedAddressSchema = z.discriminatedUnion('network', [\n z.object({\n address: ethereumAddressSchema,\n network: evmNetworkSchema,\n }),\n z.object({\n address: solanaAddressSchema,\n network: z.literal(Network.SOLANA),\n }),\n]);\n","import { EVM_CONFIGS, SOLANA_CONFIG } from './configs';\nimport { Network } from './types';\n\nimport type { NetworkToken } from './types';\n\nexport const usdc = (network: Network): NetworkToken => ({\n symbol: 'USDC',\n name: 'USD Coin',\n icon: '/usdc.png',\n decimals: 6,\n network,\n address:\n network === Network.SOLANA\n ? SOLANA_CONFIG.usdcAddress\n : EVM_CONFIGS[network].usdcAddress,\n});\n"],"mappings":";AASO,IAAK,UAAL,kBAAKA,aAAL;AACL,EAAAA,SAAA,UAAO;AACP,EAAAA,SAAA,WAAQ;AACR,EAAAA,SAAA,YAAS;AAHC,SAAAA;AAAA,GAAA;;;ACTZ,SAAS,MAAM,aAAa;AAc5B,IAAM,yBACJ;AACF,IAAM,sBACJ,OAAO,YAAY,cAAc,QAAQ,KAAK,gBAAgB;AAChE,IAAM,cAAc,uBAAuB;AAEpC,IAAM,cAAoD;AAAA,EAC/D,kBAAa,GAAG;AAAA,IACd,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA,oBAAc,GAAG;AAAA,IACf,OAAO,MAAM,OAAO;AAAA,MAClB,UAAU;AAAA,IACZ,CAAC;AAAA,IACD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,EACV;AACF;AAEO,IAAM,UAAU,CAAC,YAAwB,YAAY,OAAO,EAAE,MAAM;AAEpE,IAAM,gBAAqC;AAAA,EAChD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AACf;AAEO,IAAM,sBAA0D;AAAA,EACrE,GAAG;AAAA,EACH,sBAAe,GAAG;AACpB;AAEO,IAAM,iBAAiB,CAAC,YAAqB;AAClD,MAAI,mCAA4B;AAC9B,WAAO,cAAc;AAAA,EACvB;AACA,SAAO,YAAY,OAAO,EAAE;AAC9B;AAEO,IAAM,mBAA4C;AAAA,EACvD,kBAAa,GAAG;AAAA,EAChB,oBAAc,GAAG;AAAA,EACjB,sBAAe,GAAG;AACpB;AAEO,IAAM,mBAAmB,CAC9B,QACA,gCACG,GAAG,iBAAiB,OAAO,CAAC,GAAG,MAAM;AAEnC,IAAM,iBAAiB,CAAC,UAAiC;AAC9D,MAAI,UAAU,cAAc,OAAO;AACjC;AAAA,EACF;AACA,QAAM,aAAa,OAAO,QAAQ,WAAW,EAAE;AAAA,IAC7C,CAAC,CAAC,EAAE,MAAM,MAAM,OAAO,UAAU;AAAA,EACnC,IAAI,CAAC;AACL,MAAI,YAAY;AACd,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AChFA,OAAO,OAAO;AAId,SAAS,iBAAiB;AAC1B,SAAS,aAAa,uBAAuB;AAKtC,IAAM,gBAAgB,EAAE,KAAK,OAAO;AACpC,IAAM,wBAAwB,cAAc,SAAS;AAErD,IAAM,mBAAmB,EAAE;AAAA,EAChC,OAAO,KAAK,WAAW;AACzB;AAEO,IAAM,wBAAwB,EAClC,OAAO,EACP,OAAO,WAAW,qBAAqB;AAEnC,IAAM,sBAAwD,EAClE,OAAO,EACP,OAAO,iBAAiB,wBAAwB;AAE5C,IAAM,qBAAsD,EAChE,MAAM,CAAC,uBAAuB,mBAAmB,CAAC,EAClD,UAAU,aAAW,OAAuB;AAExC,IAAM,qBAAqB,EAAE,mBAAmB,WAAW;AAAA,EAChE,EAAE,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAAA,EACD,EAAE,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS,EAAE,6BAAsB;AAAA,EACnC,CAAC;AACH,CAAC;;;ACjCM,IAAM,OAAO,CAAC,aAAoC;AAAA,EACvD,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV;AAAA,EACA,SACE,oCACI,cAAc,cACd,YAAY,OAAO,EAAE;AAC7B;","names":["Network"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  TOOL_PARAMS
3
- } from "./chunk-3PYQIEMA.js";
3
+ } from "./chunk-W37JKCLN.js";
4
4
  import {
5
5
  zodUrl
6
6
  } from "./chunk-FB5CMO3J.js";
@@ -83,6 +83,7 @@ async function fetchScanEndpoints(origin, dev) {
83
83
  found: true,
84
84
  origin: data.data.origin,
85
85
  source: "scan",
86
+ trustTier: "unverified",
86
87
  info: {
87
88
  title: data.data.title,
88
89
  description: data.data.description
@@ -106,4 +107,4 @@ export {
106
107
  discoverResourcesSchema,
107
108
  discoverResources
108
109
  };
109
- //# sourceMappingURL=chunk-L4U6AJW3.js.map
110
+ //# sourceMappingURL=chunk-K3WB4R2P.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/operations/discover.ts"],"sourcesContent":["import {\n discoverOriginSchema,\n GuidanceMode,\n type HttpMethod,\n type AuthMode,\n} from '@agentcash/discovery';\n\nimport { log } from '@/shared/log';\nimport z from 'zod';\nimport { TOOL_PARAMS } from '@/shared/descriptions';\nimport { zodUrl } from '@/shared/url';\nimport { getBaseUrl } from '@/shared/utils';\nimport type { GlobalFlags } from '@/types';\n\nexport const discoverResourcesSchema = z.object({\n url: zodUrl.describe(TOOL_PARAMS.discoverApiEndpoints.url),\n includeGuidance: z\n .boolean()\n .optional()\n .describe(TOOL_PARAMS.discoverApiEndpoints.includeGuidance),\n});\n\nexport type DiscoverResourcesInput = z.input<typeof discoverResourcesSchema>;\n\n/**\n * Discover payment-protected resources on an origin.\n * Fetches OpenAPI spec, builds endpoint index, and fetches guidance.\n *\n * Returns DiscoverOriginSchemaSuccess on success, DiscoverOriginSchemaNotFound with cause on failure.\n */\nexport interface DiscoverOptions {\n flags?: GlobalFlags;\n}\n\nexport async function discoverResources(\n surface: string,\n args: DiscoverResourcesInput,\n options?: DiscoverOptions\n) {\n const parsedArgs = discoverResourcesSchema.safeParse(args);\n if (!parsedArgs.success) {\n return {\n found: false as const,\n cause: 'invalid_input' as const,\n message: parsedArgs.error.message,\n };\n }\n\n const { url, includeGuidance } = parsedArgs.data;\n\n const guidance =\n includeGuidance === true\n ? GuidanceMode.Always\n : includeGuidance === false\n ? GuidanceMode.Never\n : GuidanceMode.Auto;\n\n const result = await discoverOriginSchema({ target: url, guidance });\n\n if (result.found) {\n return {\n ...result,\n endpoints: result.endpoints.map(e => ({ ...e })),\n };\n }\n\n // Fallback: check agentcash server for scan-derived endpoints\n const scanResult = await fetchScanEndpoints(\n url,\n options?.flags?.dev ?? false\n );\n if (scanResult) {\n log.info(\n `[discoverResources] scan fallback found ${scanResult.endpoints.length} endpoints for ${url}`\n );\n return scanResult;\n }\n\n log.error(`[discoverResources] failed`, {\n surface,\n url,\n cause: result.cause,\n message: result.message,\n });\n return result;\n}\n\nconst scanEndpointSchema = z.object({\n method: z.string(),\n path: z.string(),\n summary: z.string().optional().default(''),\n authMode: z.string().optional(),\n price: z.string().optional(),\n});\n\nconst scanResponseSchema = z.object({\n origin: z.string(),\n title: z.string().optional().default(''),\n description: z.string().optional().default(''),\n endpoints: z.array(scanEndpointSchema),\n});\n\nasync function fetchScanEndpoints(origin: string, dev: boolean) {\n const baseUrl = getBaseUrl(dev);\n const url = `${baseUrl}/api/discover/scan?origin=${encodeURIComponent(origin)}`;\n\n return fetch(url, {\n signal: AbortSignal.timeout(5_000),\n })\n .then(async res => {\n if (!res.ok) return null;\n\n const data = scanResponseSchema.safeParse(await res.json());\n if (!data.success || data.data.endpoints.length === 0) return null;\n\n return {\n found: true as const,\n origin: data.data.origin,\n source: 'scan' as const,\n info: {\n title: data.data.title,\n description: data.data.description,\n },\n endpoints: data.data.endpoints.map(e => ({\n path: e.path,\n method: (e.method || 'GET').toUpperCase() as HttpMethod,\n summary: e.summary,\n authMode: (e.authMode as AuthMode) ?? undefined,\n protocols: ['x402' as const],\n price: e.price,\n })),\n guidanceAvailable: false,\n guidanceTokens: 0,\n guidance: undefined,\n };\n })\n .catch(() => null);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/operations/discover.ts"],"sourcesContent":["import {\n discoverOriginSchema,\n GuidanceMode,\n type HttpMethod,\n type AuthMode,\n} from '@agentcash/discovery';\n\nimport { log } from '@/shared/log';\nimport z from 'zod';\nimport { TOOL_PARAMS } from '@/shared/descriptions';\nimport { zodUrl } from '@/shared/url';\nimport { getBaseUrl } from '@/shared/utils';\nimport type { GlobalFlags } from '@/types';\n\nexport const discoverResourcesSchema = z.object({\n url: zodUrl.describe(TOOL_PARAMS.discoverApiEndpoints.url),\n includeGuidance: z\n .boolean()\n .optional()\n .describe(TOOL_PARAMS.discoverApiEndpoints.includeGuidance),\n});\n\nexport type DiscoverResourcesInput = z.input<typeof discoverResourcesSchema>;\n\n/**\n * Discover payment-protected resources on an origin.\n * Fetches OpenAPI spec, builds endpoint index, and fetches guidance.\n *\n * Returns DiscoverOriginSchemaSuccess on success, DiscoverOriginSchemaNotFound with cause on failure.\n */\nexport interface DiscoverOptions {\n flags?: GlobalFlags;\n}\n\nexport async function discoverResources(\n surface: string,\n args: DiscoverResourcesInput,\n options?: DiscoverOptions\n) {\n const parsedArgs = discoverResourcesSchema.safeParse(args);\n if (!parsedArgs.success) {\n return {\n found: false as const,\n cause: 'invalid_input' as const,\n message: parsedArgs.error.message,\n };\n }\n\n const { url, includeGuidance } = parsedArgs.data;\n\n const guidance =\n includeGuidance === true\n ? GuidanceMode.Always\n : includeGuidance === false\n ? GuidanceMode.Never\n : GuidanceMode.Auto;\n\n const result = await discoverOriginSchema({ target: url, guidance });\n\n if (result.found) {\n return {\n ...result,\n endpoints: result.endpoints.map(e => ({ ...e })),\n };\n }\n\n // Fallback: check agentcash server for scan-derived endpoints\n const scanResult = await fetchScanEndpoints(\n url,\n options?.flags?.dev ?? false\n );\n if (scanResult) {\n log.info(\n `[discoverResources] scan fallback found ${scanResult.endpoints.length} endpoints for ${url}`\n );\n return scanResult;\n }\n\n log.error(`[discoverResources] failed`, {\n surface,\n url,\n cause: result.cause,\n message: result.message,\n });\n return result;\n}\n\nconst scanEndpointSchema = z.object({\n method: z.string(),\n path: z.string(),\n summary: z.string().optional().default(''),\n authMode: z.string().optional(),\n price: z.string().optional(),\n});\n\nconst scanResponseSchema = z.object({\n origin: z.string(),\n title: z.string().optional().default(''),\n description: z.string().optional().default(''),\n endpoints: z.array(scanEndpointSchema),\n});\n\nasync function fetchScanEndpoints(origin: string, dev: boolean) {\n const baseUrl = getBaseUrl(dev);\n const url = `${baseUrl}/api/discover/scan?origin=${encodeURIComponent(origin)}`;\n\n return fetch(url, {\n signal: AbortSignal.timeout(5_000),\n })\n .then(async res => {\n if (!res.ok) return null;\n\n const data = scanResponseSchema.safeParse(await res.json());\n if (!data.success || data.data.endpoints.length === 0) return null;\n\n return {\n found: true as const,\n origin: data.data.origin,\n source: 'scan' as const,\n trustTier: 'unverified' as const,\n info: {\n title: data.data.title,\n description: data.data.description,\n },\n endpoints: data.data.endpoints.map(e => ({\n path: e.path,\n method: (e.method || 'GET').toUpperCase() as HttpMethod,\n summary: e.summary,\n authMode: (e.authMode as AuthMode) ?? undefined,\n protocols: ['x402' as const],\n price: e.price,\n })),\n guidanceAvailable: false,\n guidanceTokens: 0,\n guidance: undefined,\n };\n })\n .catch(() => null);\n}\n"],"mappings":"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","names":[]}
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  TOOL_PARAMS
3
- } from "./chunk-3PYQIEMA.js";
3
+ } from "./chunk-W37JKCLN.js";
4
4
  import {
5
5
  safeFetchJson
6
- } from "./chunk-BFOYXXLG.js";
6
+ } from "./chunk-RAS5DZPQ.js";
7
7
  import {
8
8
  EVM_CONFIGS,
9
9
  chainId,
@@ -11,7 +11,7 @@ import {
11
11
  solanaAddressSchema,
12
12
  typedAddressSchema,
13
13
  usdc
14
- } from "./chunk-NPJV7AMV.js";
14
+ } from "./chunk-HTGTKVXB.js";
15
15
  import {
16
16
  getBaseUrl
17
17
  } from "./chunk-U6FRXL3X.js";
@@ -526,9 +526,7 @@ var bridge = async (args, wallets) => {
526
526
  createWalletClient({
527
527
  account: wallets.evm,
528
528
  chain: EVM_CONFIGS[from].chain,
529
- transport: http(
530
- from === "tempo" /* TEMPO */ ? "https://eng:acard-melody-fashion-finish@rpc.mainnet.tempo.xyz" : void 0
531
- )
529
+ transport: http(EVM_CONFIGS[from].rpcUrl)
532
530
  })
533
531
  );
534
532
  return executeResult.map(
@@ -541,4 +539,4 @@ export {
541
539
  bridgeSchema,
542
540
  bridge
543
541
  };
544
- //# sourceMappingURL=chunk-2OKYUR7B.js.map
542
+ //# sourceMappingURL=chunk-MKA2PTOE.js.map