agentcash 0.3.5 → 0.3.7

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.
@@ -12,7 +12,7 @@ import {
12
12
  tokenStringToNumber,
13
13
  x402Err,
14
14
  x402Ok
15
- } from "./chunk-LDXTW6MC.js";
15
+ } from "./chunk-RP5AGYAT.js";
16
16
  import {
17
17
  fetchErr,
18
18
  fetchOk,
@@ -234,7 +234,7 @@ async function handleX402Payment(surface, response, clonedRequest, client, befor
234
234
  }
235
235
  async function handleMppPayment(surface, response, clonedRequest, options) {
236
236
  const { clients, beforePayment } = options;
237
- const mpayClient = clients.mpp;
237
+ const mppxClient = clients.mpp;
238
238
  if (clonedRequest.headers.has("Authorization")) {
239
239
  return mppErr(surface, {
240
240
  cause: "mpp_payment_already_attempted",
@@ -271,7 +271,7 @@ async function handleMppPayment(surface, response, clonedRequest, options) {
271
271
  }
272
272
  const credentialResult = await safeCreateMppCredential(
273
273
  surface,
274
- mpayClient,
274
+ mppxClient,
275
275
  response
276
276
  );
277
277
  if (credentialResult.isErr()) {
@@ -306,4 +306,4 @@ export {
306
306
  buildRequest,
307
307
  createFetchWithPayment
308
308
  };
309
- //# sourceMappingURL=chunk-NUYR6S4R.js.map
309
+ //# sourceMappingURL=chunk-7E4JDDBW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/server/tools/lib/request.ts","../../src/shared/operations/fetch-with-payment.ts"],"sourcesContent":["import z from 'zod';\n\nimport type { Address } from 'viem';\n\nexport const requestSchema = z.object({\n url: z.url().describe('The endpoint URL'),\n method: z\n .enum(['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])\n .optional()\n .describe('HTTP method. Defaults to GET for fetch operations.'),\n body: z\n .unknown()\n .optional()\n .describe('Request body for POST/PUT/PATCH methods'),\n headers: z\n .record(z.string(), z.string())\n .optional()\n .describe('Additional headers to include')\n .default({}),\n});\n\ninterface BuildRequestProps {\n input: z.infer<typeof requestSchema>;\n address?: Address;\n sessionId?: string;\n provider?: string;\n}\n\nexport const buildRequest = ({\n input,\n address,\n sessionId,\n provider,\n}: BuildRequestProps) => {\n return new Request(input.url, {\n method: input.method ?? 'GET',\n body: input.body\n ? typeof input.body === 'string'\n ? input.body\n : JSON.stringify(input.body)\n : undefined,\n headers: {\n ...(input.body ? { 'Content-Type': 'application/json' } : {}),\n ...input.headers,\n ...(address\n ? { 'X-Wallet-Address': address, 'X-Client-ID': provider }\n : {}),\n ...(sessionId ? { 'X-Session-ID': sessionId } : {}),\n },\n });\n};\n","import { formatUnits } from 'viem';\n\nimport type { x402HTTPClient } from '@x402/core/client';\nimport type { Address } from 'viem';\nimport type { GlobalFlags } from '@/types';\n\nimport { resultFromPromise } from '@agentcash/neverthrow';\n\nimport { fetchErr, fetchOk, safeFetch } from '@/shared/neverthrow/fetch';\nimport {\n safeCreatePaymentPayload,\n safeGetPaymentRequired,\n safeGetPaymentSettlement,\n x402Err,\n x402Ok,\n} from '@/shared/neverthrow/x402';\nimport {\n safeGetMppChallenge,\n safeCreateMppCredential,\n safeGetMppReceipt,\n mppErr,\n mppOk,\n} from '@/shared/neverthrow/mpp';\n\nimport { log } from '@/shared/log';\nimport { detectPaymentProtocols } from '@/shared/protocol';\nimport { tokenStringToNumber } from '@/shared/token';\nimport { getBalance } from '@/shared/balance';\nimport { getTempoBalance } from '@/shared/tempo-balance';\n\n/**\n * Hook called before a payment is executed.\n * Throw to abort. Return to proceed.\n * Matches existing checkBalance/checkTempoBalance throw-to-abort behavior.\n */\nexport type BeforePaymentHook = (ctx: {\n protocol: 'x402' | 'mpp';\n amount: number;\n currency: string;\n network: string;\n}) => Promise<void>;\n\nexport interface PaymentClients {\n x402: x402HTTPClient;\n mpp: { createCredential: (response: Response) => Promise<string> };\n}\n\nexport interface PaymentInfo {\n protocol: 'x402' | 'mpp';\n price?: string;\n payment?: {\n success: boolean;\n transactionHash?: string;\n };\n}\n\nexport interface FetchWithPaymentResult {\n response: Response;\n paymentInfo: PaymentInfo | null;\n}\n\nexport interface FetchWithPaymentOptions {\n surface: string;\n clients: PaymentClients;\n paymentMethod: 'x402' | 'mpp' | 'auto';\n account: { address: Address };\n flags: GlobalFlags;\n beforePayment?: BeforePaymentHook;\n}\n\n/**\n * Create a fetch function with automatic dual-protocol payment handling.\n *\n * 1. Makes initial request\n * 2. If 402 response, detects protocol(s)\n * 3. Calls beforePayment hook (for balance checks)\n * 4. Creates payment credential/payload\n * 5. Retries request with payment headers\n */\nexport function createFetchWithPayment(options: FetchWithPaymentOptions) {\n const { surface, clients, paymentMethod, beforePayment } = options;\n\n return async (request: Request) => {\n const clonedRequest = request.clone();\n const fallbackRequest = request.clone();\n\n const probeResult = await safeFetch(surface, request);\n\n if (probeResult.isErr()) {\n return fetchErr(surface, probeResult.error);\n }\n\n // Not a 402 response — return as-is\n if (probeResult.value.status !== 402) {\n return probeResult.andThen(response =>\n fetchOk<FetchWithPaymentResult>({ response, paymentInfo: null })\n );\n }\n\n const response = probeResult.value;\n\n // User explicitly chose a protocol — use that, no fallback\n if (paymentMethod !== 'auto') {\n if (paymentMethod === 'mpp') {\n return handleMppPayment(surface, response, clonedRequest, options);\n }\n return handleX402Payment(\n surface,\n response,\n clonedRequest,\n clients.x402,\n beforePayment\n );\n }\n\n // Auto: detect available protocols, pick by higher balance\n const available = detectPaymentProtocols(response);\n\n let preferred: 'x402' | 'mpp';\n\n if (available.length === 1) {\n preferred = available[0]!;\n } else {\n // Both protocols available — pick by balance\n preferred = await pickByBalance(surface, response, options);\n }\n\n const fallback =\n available.length > 1 ? (preferred === 'mpp' ? 'x402' : 'mpp') : null;\n\n const result =\n preferred === 'mpp'\n ? await handleMppPayment(surface, response, clonedRequest, options)\n : await handleX402Payment(\n surface,\n response,\n clonedRequest,\n clients.x402,\n beforePayment\n );\n\n if (result.isErr() && fallback) {\n // Preferred failed — try fallback with a fresh request clone\n return fallback === 'mpp'\n ? handleMppPayment(surface, response, fallbackRequest, options)\n : handleX402Payment(\n surface,\n response,\n fallbackRequest,\n clients.x402,\n beforePayment\n );\n }\n\n return result;\n };\n}\n\n/**\n * Pick the preferred protocol by comparing wallet balances.\n * Falls back to 'mpp' if both balances fail to fetch.\n */\nasync function pickByBalance(\n surface: string,\n response: Response,\n options: FetchWithPaymentOptions\n): Promise<'x402' | 'mpp'> {\n const { account, flags } = options;\n\n // Get x402 (USDC on Base) balance\n const x402BalanceResult = await resultFromPromise(\n 'balance',\n surface,\n getBalance({\n address: account.address,\n flags,\n surface,\n }).then(r => (r.isOk() ? r.value.balance : 0)),\n () => ({\n cause: 'x402_balance' as const,\n message: 'Failed to get x402 balance',\n })\n );\n\n if (x402BalanceResult.isErr()) {\n log.debug('Balance comparison failed, defaulting to mpp');\n return 'mpp';\n }\n\n const x402Balance = x402BalanceResult.value;\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 as\n | string\n | undefined;\n const decimals =\n (challengeResult.value.request.decimals as number | undefined) ?? 6;\n if (currency) {\n const tempoResult = await resultFromPromise(\n 'tempo',\n surface,\n getTempoBalance({\n address: account.address,\n tokenAddress: currency as Address,\n }),\n () => ({\n cause: 'tempo_balance' as const,\n message: 'Tempo balance check failed',\n })\n );\n if (tempoResult.isOk()) {\n mppBalance = Number(formatUnits(tempoResult.value.balance, decimals));\n }\n }\n }\n\n log.info(`Protocol selection — x402: $${x402Balance}, mpp: $${mppBalance}`);\n return x402Balance >= mppBalance ? 'x402' : 'mpp';\n}\n\nasync function handleX402Payment(\n surface: string,\n response: Response,\n clonedRequest: Request,\n client: x402HTTPClient,\n beforePayment?: BeforePaymentHook\n) {\n const paymentRequiredResult = await safeGetPaymentRequired(\n surface,\n client,\n response\n );\n\n if (paymentRequiredResult.isErr()) {\n return paymentRequiredResult;\n }\n\n const paymentRequired = paymentRequiredResult.value;\n\n // Call beforePayment hook (e.g. balance check) before signing\n if (beforePayment) {\n const accept = paymentRequired.accepts[0];\n if (accept) {\n const amount = tokenStringToNumber(accept.amount);\n const hookResult = await resultFromPromise(\n 'x402',\n surface,\n beforePayment({\n protocol: 'x402',\n amount,\n currency: 'USDC',\n network: accept.network,\n }),\n e => ({\n cause: 'payment_already_attempted' as const,\n message:\n e instanceof Error ? e.message : 'Before-payment hook failed',\n })\n );\n if (hookResult.isErr()) {\n return x402Err(surface, hookResult.error);\n }\n }\n }\n\n const paymentPayloadResult = await safeCreatePaymentPayload(\n surface,\n client,\n paymentRequired\n );\n\n if (paymentPayloadResult.isErr()) {\n return paymentPayloadResult;\n }\n\n const paymentPayload = paymentPayloadResult.value;\n\n // Encode payment header\n const paymentHeaders = client.encodePaymentSignatureHeader(paymentPayload);\n\n // Check if this is already a retry to prevent infinite loops\n if (\n clonedRequest.headers.has('PAYMENT-SIGNATURE') ||\n clonedRequest.headers.has('X-PAYMENT')\n ) {\n return x402Err(surface, {\n cause: 'payment_already_attempted',\n message: 'Payment already attempted',\n });\n }\n\n // Add payment headers to cloned request\n for (const [key, value] of Object.entries(paymentHeaders)) {\n clonedRequest.headers.set(key, value);\n }\n clonedRequest.headers.set(\n 'Access-Control-Expose-Headers',\n 'PAYMENT-RESPONSE,X-PAYMENT-RESPONSE'\n );\n\n // Retry the request with payment\n return await safeFetch(surface, clonedRequest).andThen(paidResponse => {\n const settlementResult = safeGetPaymentSettlement(\n surface,\n client,\n paidResponse\n );\n\n return x402Ok<FetchWithPaymentResult>({\n response: paidResponse,\n paymentInfo: {\n protocol: 'x402',\n price: tokenStringToNumber(\n paymentPayload.accepted.amount\n ).toLocaleString('en-US', {\n style: 'currency',\n currency: 'USD',\n }),\n ...(settlementResult.isOk()\n ? {\n payment: {\n success: settlementResult.value.success,\n transactionHash: settlementResult.value.transaction,\n },\n }\n : {}),\n },\n });\n });\n}\n\nasync function handleMppPayment(\n surface: string,\n response: Response,\n clonedRequest: Request,\n options: FetchWithPaymentOptions\n) {\n const { clients, beforePayment } = options;\n const mppxClient = clients.mpp;\n\n // Prevent retry loops\n if (clonedRequest.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 // Extract payment info from challenge request\n const amount = challenge.request.amount as string | undefined;\n const decimals = (challenge.request.decimals as number | undefined) ?? 6;\n const currency = challenge.request.currency as string | undefined;\n\n // Call beforePayment hook (e.g. balance check)\n if (beforePayment && amount && currency) {\n const numericAmount = Number(formatUnits(BigInt(amount), decimals));\n const hookResult = await resultFromPromise(\n 'mpp',\n surface,\n beforePayment({\n protocol: 'mpp',\n amount: numericAmount,\n currency,\n network: `tempo:${challenge.method}`,\n }),\n e => ({\n cause: 'mpp_payment_already_attempted' as const,\n message: e instanceof Error ? e.message : 'Before-payment hook failed',\n })\n );\n if (hookResult.isErr()) {\n return mppErr(surface, hookResult.error);\n }\n }\n\n // Create credential (signs transaction on Tempo)\n const credentialResult = await safeCreateMppCredential(\n surface,\n mppxClient,\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 clonedRequest.headers.set('Authorization', credential);\n\n // Retry the fetch with the credential\n return await safeFetch(surface, clonedRequest).andThen(paidResponse => {\n // Parse the receipt for transaction hash\n const receiptResult = safeGetMppReceipt(surface, paidResponse);\n\n const priceDisplay = amount\n ? Number(formatUnits(BigInt(amount), decimals)).toLocaleString('en-US', {\n style: 'currency',\n currency: 'USD',\n })\n : undefined;\n\n return mppOk<FetchWithPaymentResult>({\n response: paidResponse,\n paymentInfo: {\n protocol: 'mpp',\n ...(priceDisplay ? { price: priceDisplay } : {}),\n ...(receiptResult.isOk()\n ? {\n payment: {\n success: true,\n transactionHash: receiptResult.value.reference,\n },\n }\n : {}),\n },\n });\n });\n}\n"],"mappings":"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","names":["response"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getWalletInfo,
3
3
  submitErrorReport
4
- } from "./chunk-LDXTW6MC.js";
4
+ } from "./chunk-RP5AGYAT.js";
5
5
 
6
6
  // src/shared/operations/index.ts
7
7
  async function getWalletInfo2(surface, address, flags) {
@@ -19,4 +19,4 @@ export {
19
19
  getWalletInfo2 as getWalletInfo,
20
20
  submitErrorReport2 as submitErrorReport
21
21
  };
22
- //# sourceMappingURL=chunk-V5JYDONS.js.map
22
+ //# sourceMappingURL=chunk-ED4QVIZH.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  MCP_VERSION
3
- } from "./chunk-LXLFCKRE.js";
3
+ } from "./chunk-SBLBP4FH.js";
4
4
  import {
5
5
  err,
6
6
  getBalance,
@@ -73,7 +73,7 @@ var safeCreateSIWxPayload = (surface, serverInfo, signer) => {
73
73
  };
74
74
 
75
75
  // src/shared/neverthrow/mpp/index.ts
76
- import { Challenge, Receipt } from "mpay";
76
+ import { Challenge, Receipt } from "mppx";
77
77
  var errorType2 = "mpp";
78
78
  var mppOk = (value) => ok(value);
79
79
  var mppErr = (surface, error) => err(errorType2, surface, error);
@@ -89,10 +89,10 @@ var safeGetMppChallenge = (surface, response) => {
89
89
  })
90
90
  );
91
91
  };
92
- var safeCreateMppCredential = (surface, mpayClient, response) => {
92
+ var safeCreateMppCredential = (surface, mppxClient, response) => {
93
93
  return mppResultFromPromise(
94
94
  surface,
95
- mpayClient.createCredential(response),
95
+ mppxClient.createCredential(response),
96
96
  (error) => ({
97
97
  cause: "create_mpp_credential",
98
98
  message: error instanceof Error ? error.message : "Failed to create MPP credential"
@@ -250,8 +250,10 @@ async function getEndpointSchema(endpointUrl, method) {
250
250
  }
251
251
  const operation = pathEntry[httpMethod];
252
252
  if (!operation) {
253
- const resolved2 = resolveRefs(spec, pathEntry, /* @__PURE__ */ new Set());
254
- return { path, ...resolved2 };
253
+ log.debug(
254
+ `No OpenAPI operation found for ${httpMethod.toUpperCase()} ${path}`
255
+ );
256
+ return null;
255
257
  }
256
258
  const resolved = resolveRefs(spec, operation, /* @__PURE__ */ new Set());
257
259
  return { path, method: httpMethod, ...resolved };
@@ -288,6 +290,38 @@ async function getOriginIndex(origin) {
288
290
  indexCache.set(origin, endpoints);
289
291
  return endpoints;
290
292
  }
293
+ var OPENAPI_HTTP_METHODS = /* @__PURE__ */ new Set([
294
+ "get",
295
+ "post",
296
+ "put",
297
+ "delete",
298
+ "patch",
299
+ "head",
300
+ "options",
301
+ "trace"
302
+ ]);
303
+ async function getSpecMethods(endpointUrl) {
304
+ if (!URL.canParse(endpointUrl)) return null;
305
+ const origin = new URL(endpointUrl).origin;
306
+ const spec = await fetchOpenApiSpec(origin);
307
+ if (!spec?.paths) return null;
308
+ const paths = spec.paths;
309
+ const path = extractPath(endpointUrl, origin);
310
+ let pathEntry = paths[path];
311
+ if (!pathEntry) {
312
+ for (const [specPath, specEntry] of Object.entries(paths)) {
313
+ if (specEntry == null || typeof specEntry !== "object") continue;
314
+ const pattern = specPath.replace(/\{[^}]+\}/g, "[^/]+");
315
+ const regex = new RegExp(`^${pattern}$`);
316
+ if (regex.test(path)) {
317
+ pathEntry = specEntry;
318
+ break;
319
+ }
320
+ }
321
+ }
322
+ if (!pathEntry) return null;
323
+ return Object.keys(pathEntry).filter((k) => OPENAPI_HTTP_METHODS.has(k)).map((k) => k.toUpperCase());
324
+ }
291
325
  function getIndexEntry(origin, path, method) {
292
326
  const entries = indexCache.get(origin);
293
327
  if (!entries) return void 0;
@@ -340,9 +374,24 @@ async function checkEndpoint({
340
374
  methods,
341
375
  body,
342
376
  headers = {},
343
- includeMethodErrors = false
377
+ includeMethodErrors = false,
378
+ probeAllMethods = false
344
379
  }) {
345
- const methodsToCheck = methods ?? [...SUPPORTED_METHODS];
380
+ let methodsToCheck;
381
+ if (methods) {
382
+ methodsToCheck = methods;
383
+ } else if (probeAllMethods) {
384
+ methodsToCheck = [...SUPPORTED_METHODS];
385
+ } else {
386
+ const specMethods = await getSpecMethods(url);
387
+ if (specMethods?.length) {
388
+ methodsToCheck = specMethods.filter(
389
+ (m) => SUPPORTED_METHODS.includes(m)
390
+ );
391
+ } else {
392
+ methodsToCheck = [...SUPPORTED_METHODS];
393
+ }
394
+ }
346
395
  log.info("Checking endpoint", { url, methods: methodsToCheck });
347
396
  const results = await Promise.all(
348
397
  methodsToCheck.map(
@@ -507,6 +556,7 @@ async function fetchLlmsTxt(surface, origin) {
507
556
  new Request(llmsTxtUrl, { headers: { Accept: "text/plain" } })
508
557
  );
509
558
  if (result.isErr()) return null;
559
+ if (!result.value.ok) return null;
510
560
  const parseResult = await safeParseResponse(surface, result.value);
511
561
  if (parseResult.isErr() || parseResult.value.type !== "text") return null;
512
562
  return parseResult.value.data;
@@ -548,33 +598,11 @@ async function discoverResources(surface, url) {
548
598
  import { formatUnits as formatUnits2 } from "viem";
549
599
 
550
600
  // src/shared/tempo.ts
551
- import { createPublicClient, defineChain, http } from "viem";
552
- var TEMPO_CHAIN_ID = Number(process.env.TEMPO_CHAIN_ID ?? 42431);
553
- var TEMPO_RPC_URL = process.env.TEMPO_RPC_URL ?? "https://tempo-moderato.g.alchemy.com/v2/GCnF4KF-qMTaDYNxAOMSC";
554
- var TEMPO_CHAIN_NAME = process.env.TEMPO_CHAIN_NAME ?? "Tempo";
555
- var TEMPO_TOKEN_ADDRESS = process.env.TEMPO_TOKEN_ADDRESS ?? "0x20c0000000000000000000000000000000000001";
556
- function getTempoChainId() {
557
- return TEMPO_CHAIN_ID;
558
- }
559
- function getTempoRpcUrl() {
560
- return TEMPO_RPC_URL;
561
- }
562
- function getTempoChainName() {
563
- return TEMPO_CHAIN_NAME;
564
- }
565
- function getTempoTokenAddress() {
566
- return TEMPO_TOKEN_ADDRESS;
567
- }
568
- var tempoChain = defineChain({
569
- id: TEMPO_CHAIN_ID,
570
- name: TEMPO_CHAIN_NAME,
571
- nativeCurrency: { name: "TEMPO", symbol: "TEMPO", decimals: 18 },
572
- rpcUrls: {
573
- default: { http: [TEMPO_RPC_URL] }
574
- }
575
- });
601
+ var TEMPO_RPC_URL = "https://eng:acard-melody-fashion-finish@rpc.mainnet.tempo.xyz";
602
+ var TEMPO_TOKEN_ADDRESS = "0x20c0000000000000000000000000000000000000";
576
603
 
577
604
  // src/shared/tempo-balance.ts
605
+ import { tempo } from "viem/chains";
578
606
  var MPPSCAN_BASE = "https://mppscan.com";
579
607
  async function getTempoBalance({
580
608
  address,
@@ -590,8 +618,8 @@ async function getTempoBalance({
590
618
  }
591
619
  const data = await res.json();
592
620
  return {
593
- chainId: getTempoChainId(),
594
- chainName: getTempoChainName(),
621
+ chainId: tempo.id,
622
+ chainName: tempo.name,
595
623
  balance: BigInt(data.balance),
596
624
  tokenAddress
597
625
  };
@@ -601,7 +629,7 @@ async function getTempoBalance({
601
629
  async function getWalletInfo(surface, address, flags) {
602
630
  const [balanceResult, tempoResult] = await Promise.all([
603
631
  getBalance({ address, flags, surface }),
604
- getTempoBalance({ address, tokenAddress: getTempoTokenAddress() }).then((r) => Number(formatUnits2(r.balance, 6))).catch((e) => {
632
+ getTempoBalance({ address, tokenAddress: TEMPO_TOKEN_ADDRESS }).then((r) => Number(formatUnits2(r.balance, 6))).catch((e) => {
605
633
  log.info(`Failed to fetch Tempo balance: ${e}`);
606
634
  return null;
607
635
  })
@@ -664,8 +692,7 @@ async function submitErrorReport(surface, input, address, dev) {
664
692
  }
665
693
 
666
694
  export {
667
- getTempoChainId,
668
- getTempoRpcUrl,
695
+ TEMPO_RPC_URL,
669
696
  x402Ok,
670
697
  x402Err,
671
698
  safeGetPaymentRequired,
@@ -680,7 +707,6 @@ export {
680
707
  detectPaymentProtocols,
681
708
  tokenStringToNumber,
682
709
  getTempoBalance,
683
- getOriginIndex,
684
710
  getInputSchema,
685
711
  getSiwxExtension,
686
712
  SUPPORTED_METHODS,
@@ -689,4 +715,4 @@ export {
689
715
  getWalletInfo,
690
716
  submitErrorReport
691
717
  };
692
- //# sourceMappingURL=chunk-LDXTW6MC.js.map
718
+ //# sourceMappingURL=chunk-RP5AGYAT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/shared/operations/check-endpoint.ts","../../src/shared/neverthrow/x402/index.ts","../../src/shared/neverthrow/mpp/index.ts","../../src/shared/protocol.ts","../../src/shared/openapi-cache.ts","../../src/shared/token.ts","../../src/server/lib/x402-extensions.ts","../../src/shared/operations/discover.ts","../../src/shared/operations/wallet-info.ts","../../src/shared/tempo.ts","../../src/shared/tempo-balance.ts","../../src/shared/operations/report-error.ts"],"sourcesContent":["import { resultFromPromise } from '@agentcash/neverthrow';\nimport { x402Client, x402HTTPClient } from '@x402/core/client';\n\nimport { log } from '@/shared/log';\nimport { safeFetch } from '@/shared/neverthrow/fetch';\nimport { safeGetPaymentRequired } from '@/shared/neverthrow/x402';\nimport { safeGetMppChallenge } from '@/shared/neverthrow/mpp';\nimport { detectPaymentProtocols } from '@/shared/protocol';\nimport {\n getEndpointSchema,\n getIndexEntry,\n getSpecMethods,\n} from '@/shared/openapi-cache';\nimport { tokenStringToNumber } from '@/shared/token';\nimport { getInputSchema } from '@/server/lib/x402-extensions';\n\nimport type { JsonObject } from '@/shared/neverthrow/json/types';\nimport type { PaymentProtocol } from '@/shared/protocol';\n\n// ─── Public types ────────────────────────────────────────────────\n\nexport const SUPPORTED_METHODS = [\n 'GET',\n 'POST',\n 'PUT',\n 'DELETE',\n 'PATCH',\n] as const;\n\nexport type SupportedMethod = (typeof SUPPORTED_METHODS)[number];\n\n/** A single method's probe outcome (only 402 or 2xx responses are kept). */\nexport interface ProbeMethodResult {\n method: SupportedMethod;\n source: 'openapi' | 'probe';\n requiresPayment: boolean;\n statusCode?: number;\n protocols?: PaymentProtocol[];\n paymentMethods?: JsonObject[];\n schema?: JsonObject;\n estimatedPrice?: string;\n summary?: string;\n}\n\nexport interface CheckEndpointResult {\n url: string;\n results: ProbeMethodResult[];\n}\n\nexport interface CheckEndpointOptions {\n surface: string;\n url: string;\n /** Methods to probe. Defaults to spec-defined methods, or all if no spec / probeAllMethods is set. */\n methods?: SupportedMethod[];\n body?: unknown;\n headers?: Record<string, string>;\n /** When true, include 404/405 responses in results. Useful when a specific method is targeted. */\n includeMethodErrors?: boolean;\n /** When true, probe all HTTP methods regardless of what the OpenAPI spec declares. */\n probeAllMethods?: boolean;\n}\n\n// ─── Public entry point ──────────────────────────────────────────\n\n/**\n * Probe an endpoint across one or more HTTP methods in parallel.\n * Returns only the methods that responded with 402 or 2xx.\n * Does not make any payment.\n */\nexport async function checkEndpoint({\n surface,\n url,\n methods,\n body,\n headers = {},\n includeMethodErrors = false,\n probeAllMethods = false,\n}: CheckEndpointOptions): Promise<CheckEndpointResult> {\n let methodsToCheck: SupportedMethod[];\n if (methods) {\n methodsToCheck = methods;\n } else if (probeAllMethods) {\n methodsToCheck = [...SUPPORTED_METHODS];\n } else {\n const specMethods = await getSpecMethods(url);\n if (specMethods?.length) {\n methodsToCheck = specMethods.filter((m): m is SupportedMethod =>\n SUPPORTED_METHODS.includes(m as SupportedMethod)\n );\n } else {\n methodsToCheck = [...SUPPORTED_METHODS];\n }\n }\n\n log.info('Checking endpoint', { url, methods: methodsToCheck });\n\n const results = await Promise.all(\n methodsToCheck.map(method =>\n probeMethod({ surface, method, url, body, headers, includeMethodErrors })\n )\n );\n\n return {\n url,\n results: results.filter((r): r is ProbeMethodResult => r !== null),\n };\n}\n\n// ─── Per-method probe (private) ──────────────────────────────────\n\ninterface ProbeMethodOptions {\n surface: string;\n method: SupportedMethod;\n url: string;\n body?: unknown;\n headers: Record<string, string>;\n includeMethodErrors: boolean;\n}\n\nasync function probeMethod({\n surface,\n method,\n url,\n body,\n headers,\n includeMethodErrors,\n}: ProbeMethodOptions): Promise<ProbeMethodResult | null> {\n // ── Cache-first: try OpenAPI spec ──\n const cachedSchemaResult = await resultFromPromise(\n 'openapi',\n surface,\n getEndpointSchema(url, method),\n e => ({\n cause: 'cache_lookup' as const,\n message: e instanceof Error ? e.message : String(e),\n })\n );\n\n if (cachedSchemaResult.isOk() && cachedSchemaResult.value) {\n const cachedSchema = cachedSchemaResult.value;\n const origin = new URL(url).origin;\n const path = new URL(url).pathname || '/';\n const indexEntry = getIndexEntry(origin, path, method);\n\n return {\n method,\n source: 'openapi',\n requiresPayment: true,\n schema: cachedSchema,\n ...(indexEntry?.price ? { estimatedPrice: indexEntry.price } : {}),\n ...(indexEntry?.protocols\n ? { protocols: indexEntry.protocols as PaymentProtocol[] }\n : {}),\n ...(indexEntry?.summary ? { summary: indexEntry.summary } : {}),\n };\n }\n\n if (cachedSchemaResult.isErr()) {\n log.debug(\n `Cache lookup failed for ${method} ${url}, falling back to 402 probe`\n );\n }\n\n // ── Fallback: 402 probe ──\n const request = buildProbeRequest(url, method, body, headers);\n const responseResult = await safeFetch(surface, request);\n\n if (responseResult.isErr()) {\n log.debug(`${method} ${url} probe failed`, responseResult.error);\n return null;\n }\n\n const response = responseResult.value;\n\n // Non-402 error\n if (!response.ok && response.status !== 402) {\n if (\n includeMethodErrors &&\n (response.status === 404 || response.status === 405)\n ) {\n return {\n method,\n source: 'probe',\n requiresPayment: false,\n statusCode: response.status,\n };\n }\n log.debug(`${method} ${url} returned ${response.status} — skipping`);\n return null;\n }\n\n // 2xx success — include (no payment required)\n if (response.status !== 402) {\n return {\n method,\n source: 'probe',\n requiresPayment: false,\n statusCode: response.status,\n };\n }\n\n // 402 — extract payment details\n const protocols = detectPaymentProtocols(response);\n const paymentMethods: JsonObject[] = [];\n\n if (protocols.includes('mpp')) {\n const challengeResult = safeGetMppChallenge(surface, response);\n\n if (challengeResult.isOk()) {\n const challenge = challengeResult.value;\n\n const currency = challenge.request.currency as string | undefined;\n const amount = challenge.request.amount as string | undefined;\n const decimals = (challenge.request.decimals as number | undefined) ?? 6;\n\n // Try to enrich with OpenAPI schema\n let schema: JsonObject | undefined;\n const endpointSchemaResult = await resultFromPromise(\n 'openapi',\n surface,\n getEndpointSchema(url, method),\n e => ({\n cause: 'schema_fetch' as const,\n message: e instanceof Error ? e.message : String(e),\n })\n );\n if (endpointSchemaResult.isOk() && endpointSchemaResult.value) {\n schema = endpointSchemaResult.value;\n } else if (endpointSchemaResult.isErr()) {\n log.debug(`Failed to fetch OpenAPI schema for: ${url}`);\n }\n\n paymentMethods.push({\n protocol: 'mpp',\n method: challenge.method,\n intent: challenge.intent,\n realm: challenge.realm,\n ...(challenge.description\n ? { description: challenge.description }\n : {}),\n ...(amount ? { price: tokenStringToNumber(amount, decimals) } : {}),\n ...(currency ? { currency } : {}),\n ...(schema ? { schema } : {}),\n network: `tempo:${challenge.method}`,\n } as unknown as JsonObject);\n }\n }\n\n if (protocols.includes('x402')) {\n const client = new x402HTTPClient(new x402Client());\n\n const paymentRequiredResult = await safeGetPaymentRequired(\n surface,\n client,\n response\n );\n\n if (paymentRequiredResult.isOk()) {\n const { resource, extensions, accepts } = paymentRequiredResult.value;\n\n for (const accept of accepts) {\n paymentMethods.push({\n protocol: 'x402',\n ...resource,\n schema: getInputSchema(extensions) as JsonObject,\n price: tokenStringToNumber(accept.amount),\n network: accept.network,\n asset: accept.asset,\n } as unknown as JsonObject);\n }\n }\n }\n\n return {\n method,\n source: 'probe',\n requiresPayment: true,\n statusCode: response.status,\n protocols,\n paymentMethods,\n };\n}\n\n// ─── Request builder (private) ───────────────────────────────────\n\nfunction buildProbeRequest(\n url: string,\n method: string,\n body: unknown,\n headers: Record<string, string>\n): Request {\n const supportsBody = ['POST', 'PUT', 'PATCH'].includes(method);\n const requestBody =\n supportsBody && body\n ? typeof body === 'string'\n ? body\n : JSON.stringify(body)\n : undefined;\n\n return new Request(url, {\n method,\n body: requestBody,\n headers: {\n ...(requestBody ? { 'Content-Type': 'application/json' } : {}),\n ...headers,\n },\n });\n}\n","import {\n err,\n ok,\n resultFromPromise,\n resultFromThrowable,\n} from '@agentcash/neverthrow';\nimport { createSIWxPayload } from '@x402/extensions/sign-in-with-x';\n\nimport type { BaseX402Error } from './types';\nimport type { x402HTTPClient } from '@x402/core/http';\nimport type { PaymentRequired } from '@x402/core/types';\nimport type { CompleteSIWxInfo } from '@x402/extensions/sign-in-with-x';\nimport type { PrivateKeyAccount } from 'viem';\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 safeGetPaymentRequired = (\n surface: string,\n client: x402HTTPClient,\n response: Response\n) => {\n return x402ResultFromPromise(\n surface,\n response.json().then(\n json =>\n client.getPaymentRequiredResponse(\n name => response.headers.get(name),\n json\n ),\n () =>\n client.getPaymentRequiredResponse(name => response.headers.get(name))\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 safeCreatePaymentPayload = (\n surface: string,\n client: x402HTTPClient,\n paymentRequired: PaymentRequired\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 client: x402HTTPClient,\n response: Response\n) => {\n return x402ResultFromThrowable(\n surface,\n () => client.getPaymentSettleResponse(name => response.headers.get(name)),\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 signer: PrivateKeyAccount\n) => {\n return x402ResultFromPromise(\n surface,\n createSIWxPayload(serverInfo, signer),\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 { Challenge, Receipt } from 'mppx';\nimport {\n err,\n ok,\n resultFromPromise,\n resultFromThrowable,\n} from '@agentcash/neverthrow';\n\nimport type { BaseMppError } from './types';\nconst errorType = 'mpp';\n\nexport const mppOk = <T>(value: T) => ok(value);\nexport const mppErr = (surface: string, error: BaseMppError) =>\n err(errorType, surface, error);\n\nconst mppResultFromPromise = <T>(\n surface: string,\n promise: Promise<T>,\n error: (e: unknown) => BaseMppError\n) => resultFromPromise(errorType, surface, promise, error);\n\nconst mppResultFromThrowable = <T>(\n surface: string,\n fn: () => T,\n error: (e: unknown) => BaseMppError\n) => resultFromThrowable(errorType, surface, fn, error);\n\nexport const safeGetMppChallenge = (surface: string, response: Response) => {\n return mppResultFromThrowable(\n surface,\n () => Challenge.fromResponse(response),\n error => ({\n cause: 'parse_mpp_challenge',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to parse MPP challenge from response',\n })\n );\n};\n\nexport const safeCreateMppCredential = (\n surface: string,\n mppxClient: { createCredential: (response: Response) => Promise<string> },\n response: Response\n) => {\n return mppResultFromPromise(\n surface,\n mppxClient.createCredential(response),\n error => ({\n cause: 'create_mpp_credential',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to create MPP credential',\n })\n );\n};\n\nexport const safeGetMppReceipt = (surface: string, response: Response) => {\n return mppResultFromThrowable(\n surface,\n () => Receipt.fromResponse(response),\n error => ({\n cause: 'parse_mpp_receipt',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to parse MPP receipt from response',\n })\n );\n};\n","export type PaymentProtocol = 'x402' | 'mpp';\n\n/**\n * Detects all payment protocols present in a 402 response.\n * MPP responses include a `WWW-Authenticate` header starting with \"Payment\".\n * x402 responses include a `payment-required` header.\n * If neither is explicitly detected, defaults to x402.\n */\nexport function detectPaymentProtocols(response: Response): PaymentProtocol[] {\n const protocols: PaymentProtocol[] = [];\n const wwwAuth = response.headers.get('WWW-Authenticate');\n if (wwwAuth?.startsWith('Payment')) {\n protocols.push('mpp');\n }\n const paymentRequired = response.headers.get('payment-required');\n if (paymentRequired) {\n protocols.push('x402');\n }\n // If we couldn't detect either explicitly, default to x402\n if (protocols.length === 0) {\n protocols.push('x402');\n }\n return protocols;\n}\n\n/**\n * Convenience: returns the first/preferred protocol from a 402 response.\n * Useful when a single protocol must be chosen (e.g. for payment).\n */\nexport function detectPaymentProtocol(response: Response): PaymentProtocol {\n return detectPaymentProtocols(response)[0]!;\n}\n","import { resultFromPromise } from '@agentcash/neverthrow';\n\nimport { safeFetch } from './neverthrow/fetch';\nimport { log } from './log';\n\nimport type { JsonObject, JsonValue } from './neverthrow/json/types';\n\nexport interface EndpointSummary {\n path: string; // \"/api/apollo/people/search\"\n method: string; // \"POST\"\n summary: string; // \"Search for people by name, email, or domain\"\n price?: string; // \"$0.02\" — from x-payment-info, advisory only\n protocols?: string[]; // [\"x402\", \"mpp\"] — from x-payment-info\n}\n\n/**\n * In-memory cache for OpenAPI specs per origin.\n * Populated during discovery or on-demand when check_endpoint needs schema info.\n */\nconst specCache = new Map<string, JsonObject>();\n\n/**\n * Fetch and cache an OpenAPI spec for an origin.\n * Tries multiple well-known locations in order.\n */\nexport async function fetchOpenApiSpec(\n origin: string\n): Promise<JsonObject | null> {\n const cached = specCache.get(origin);\n if (cached) return cached;\n\n const uniqueUrls = [\n `${origin}/openapi.json`,\n `${origin}/.well-known/openapi.json`,\n `${origin}/.well-known/x402`,\n `${origin}/.well-known/mpp`,\n ];\n\n for (const url of uniqueUrls) {\n log.debug(`Fetching OpenAPI spec from: ${url}`);\n const fetchResult = await safeFetch(\n 'fetchOpenApiSpec',\n new Request(url, { headers: { Accept: 'application/json' } })\n );\n\n if (fetchResult.isErr()) {\n log.debug(`Failed to fetch OpenAPI spec from: ${url}`);\n continue;\n }\n\n const response = fetchResult.value;\n if (!response.ok) continue;\n\n const jsonResult = await resultFromPromise(\n 'json',\n 'fetchOpenApiSpec',\n response.json() as Promise<JsonObject>,\n () => ({\n cause: 'parse' as const,\n message: `Failed to parse JSON from: ${url}`,\n })\n );\n\n if (jsonResult.isErr()) {\n log.debug(`Failed to fetch OpenAPI spec from: ${url}`);\n continue;\n }\n\n const spec = jsonResult.value;\n\n // Basic validation - must have paths\n if (spec && typeof spec === 'object' && spec.paths) {\n specCache.set(origin, spec);\n log.info(`Cached OpenAPI spec for origin: ${origin}`);\n return spec;\n }\n }\n\n log.debug(`No OpenAPI spec found for origin: ${origin}`);\n return null;\n}\n\n/**\n * Resolve a JSON $ref pointer within the spec.\n * Only supports local refs: \"#/components/schemas/Foo\"\n */\nfunction resolveRef(\n spec: JsonObject,\n ref: string,\n seen: Set<string>\n): JsonValue | undefined {\n if (!ref.startsWith('#/')) return undefined;\n if (seen.has(ref)) return { $circular: ref } as unknown as JsonValue;\n seen.add(ref);\n\n const parts = ref.slice(2).split('/');\n let current: JsonValue = spec;\n\n for (const part of parts) {\n if (\n current == null ||\n typeof current !== 'object' ||\n Array.isArray(current)\n )\n return undefined;\n const next: JsonValue | undefined = current[part];\n if (next === undefined) return undefined;\n current = next;\n }\n\n if (\n current != null &&\n typeof current === 'object' &&\n !Array.isArray(current)\n ) {\n return resolveRefs(spec, current, seen);\n }\n return current;\n}\n\n/**\n * Recursively resolve all $ref pointers in a JSON object.\n * Keeps it shallow enough to avoid context bloat - max depth 4.\n */\nfunction resolveRefs(\n spec: JsonObject,\n obj: JsonObject,\n seen: Set<string>,\n depth = 0\n): JsonObject {\n if (depth > 4) return obj;\n\n const result: JsonObject = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (key === '$ref' && typeof value === 'string') {\n const resolved = resolveRef(spec, value, seen);\n if (\n resolved != null &&\n typeof resolved === 'object' &&\n !Array.isArray(resolved)\n ) {\n Object.assign(result, resolved);\n } else {\n result[key] = value;\n }\n } else if (\n value != null &&\n typeof value === 'object' &&\n !Array.isArray(value)\n ) {\n result[key] = resolveRefs(spec, value, seen, depth + 1);\n } else if (Array.isArray(value)) {\n result[key] = value.map(item => {\n if (item != null && typeof item === 'object' && !Array.isArray(item)) {\n return resolveRefs(spec, item, seen, depth + 1);\n }\n return item;\n });\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Normalize a URL path for matching against OpenAPI spec paths.\n * e.g. \"https://example.com/api/foo\" -> \"/api/foo\"\n */\nfunction extractPath(url: string, origin: string): string {\n if (url.startsWith(origin)) {\n return url.slice(origin.length) || '/';\n }\n return URL.canParse(url) ? new URL(url).pathname : url;\n}\n\n/**\n * Extract the schema for a specific endpoint from the OpenAPI spec.\n * Returns the operation object with resolved $refs, or null if not found.\n */\nexport async function getEndpointSchema(\n endpointUrl: string,\n method?: string\n): Promise<JsonObject | null> {\n if (!URL.canParse(endpointUrl)) return null;\n const origin = new URL(endpointUrl).origin;\n\n const spec = await fetchOpenApiSpec(origin);\n if (!spec) return null;\n\n const paths = spec.paths as JsonObject | undefined;\n if (!paths) return null;\n\n const path = extractPath(endpointUrl, origin);\n const httpMethod = (method ?? 'post').toLowerCase();\n\n // Try exact match first, then try path patterns\n let pathEntry = paths[path] as JsonObject | undefined;\n\n if (!pathEntry) {\n // Try matching against parameterized paths like /api/foo/{id}\n for (const [specPath, specEntry] of Object.entries(paths)) {\n if (specEntry == null || typeof specEntry !== 'object') continue;\n\n const pattern = specPath.replace(/\\{[^}]+\\}/g, '[^/]+');\n const regex = new RegExp(`^${pattern}$`);\n if (regex.test(path)) {\n pathEntry = specEntry as JsonObject;\n break;\n }\n }\n }\n\n if (!pathEntry) {\n log.debug(`No OpenAPI path entry found for: ${path}`);\n return null;\n }\n\n const operation = pathEntry[httpMethod] as JsonObject | undefined;\n if (!operation) {\n log.debug(\n `No OpenAPI operation found for ${httpMethod.toUpperCase()} ${path}`\n );\n return null;\n }\n\n const resolved = resolveRefs(spec, operation, new Set());\n return { path, method: httpMethod, ...resolved };\n}\n\n// ── Lightweight Endpoint Index ──\n\nconst indexCache = new Map<string, EndpointSummary[]>();\n\n/**\n * Lazily build a lightweight index for an origin.\n * Fetches the OpenAPI spec if not cached, then extracts\n * path + method + summary + x-payment-info for each operation.\n */\nexport async function getOriginIndex(\n origin: string\n): Promise<EndpointSummary[] | null> {\n const cached = indexCache.get(origin);\n if (cached) return cached;\n\n const spec = await fetchOpenApiSpec(origin);\n if (!spec?.paths) return null;\n\n const endpoints: EndpointSummary[] = [];\n for (const [path, methods] of Object.entries(\n spec.paths as Record<string, JsonObject>\n )) {\n for (const [method, operation] of Object.entries(methods)) {\n if (typeof operation === 'object' && operation !== null) {\n const op = operation as Record<string, unknown>;\n const paymentInfo = op['x-payment-info'] as\n | Record<string, unknown>\n | undefined;\n const entry: EndpointSummary = {\n path,\n method: method.toUpperCase(),\n summary: (op.summary as string) || (op.description as string) || '',\n };\n if (paymentInfo?.price != null) {\n entry.price = `$${paymentInfo.price as number}`;\n }\n if (Array.isArray(paymentInfo?.protocols)) {\n entry.protocols = paymentInfo.protocols as string[];\n }\n endpoints.push(entry);\n }\n }\n }\n\n indexCache.set(origin, endpoints);\n return endpoints;\n}\n\n/** HTTP methods that represent operations in an OpenAPI path entry. */\nconst OPENAPI_HTTP_METHODS = new Set([\n 'get',\n 'post',\n 'put',\n 'delete',\n 'patch',\n 'head',\n 'options',\n 'trace',\n]);\n\n/**\n * Return the HTTP methods defined in the OpenAPI spec for a given endpoint URL.\n * Returns null if no spec or path entry is available (caller should fall back to probing all methods).\n */\nexport async function getSpecMethods(\n endpointUrl: string\n): Promise<string[] | null> {\n if (!URL.canParse(endpointUrl)) return null;\n const origin = new URL(endpointUrl).origin;\n\n const spec = await fetchOpenApiSpec(origin);\n if (!spec?.paths) return null;\n\n const paths = spec.paths as JsonObject;\n const path = extractPath(endpointUrl, origin);\n\n let pathEntry = paths[path] as JsonObject | undefined;\n\n if (!pathEntry) {\n for (const [specPath, specEntry] of Object.entries(paths)) {\n if (specEntry == null || typeof specEntry !== 'object') continue;\n const pattern = specPath.replace(/\\{[^}]+\\}/g, '[^/]+');\n const regex = new RegExp(`^${pattern}$`);\n if (regex.test(path)) {\n pathEntry = specEntry as JsonObject;\n break;\n }\n }\n }\n\n if (!pathEntry) return null;\n\n return Object.keys(pathEntry)\n .filter(k => OPENAPI_HTTP_METHODS.has(k))\n .map(k => k.toUpperCase());\n}\n\n/**\n * Look up a single endpoint entry from the lightweight index cache.\n * Returns the matching EndpointSummary (with pricing hints) or undefined.\n * Synchronous — only checks what's already cached.\n */\nexport function getIndexEntry(\n origin: string,\n path: string,\n method: string\n): EndpointSummary | undefined {\n const entries = indexCache.get(origin);\n if (!entries) return undefined;\n\n const m = method.toUpperCase();\n return entries.find(e => e.path === path && e.method === m);\n}\n","import { formatUnits } from 'viem';\n\nexport const tokenStringToNumber = (amount: string, decimals = 6) => {\n return Number(formatUnits(BigInt(amount), decimals));\n};\n","import type { PaymentRequired } from '@x402/core/types';\nimport type { DiscoveryExtension } from '@x402/extensions/bazaar';\nimport type {\n CompleteSIWxInfo,\n SIWxExtensionInfo,\n SupportedChain,\n} from '@x402/extensions/sign-in-with-x';\n\nconst getBazaarExtension = (extensions: PaymentRequired['extensions']) => {\n const { bazaar } = extensions ?? {};\n\n if (!bazaar) {\n return undefined;\n }\n\n return bazaar as DiscoveryExtension;\n};\n\nexport const getInputSchema = (extensions: PaymentRequired['extensions']) =>\n getBazaarExtension(extensions)?.schema.properties.input;\n\nexport const getSiwxExtension = (\n extensions: PaymentRequired['extensions']\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 // Pick the first EVM chain from supportedChains, falling back to defaults\n const chain = siwx.supportedChains?.find(c =>\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","import { log } from '@/shared/log';\nimport { safeFetch, safeParseResponse } from '@/shared/neverthrow/fetch';\nimport { fetchOpenApiSpec, getOriginIndex } from '@/shared/openapi-cache';\n\nimport type { EndpointSummary } from '@/shared/openapi-cache';\n\nexport interface DiscoveryResult {\n origin: string;\n source: 'openapi';\n endpoints: EndpointSummary[];\n instructions?: string;\n}\n\n/**\n * Fetch llms.txt instructions from an origin (best-effort).\n */\nasync function fetchLlmsTxt(\n surface: string,\n origin: string\n): Promise<string | null> {\n const llmsTxtUrl = `${origin}/llms.txt`;\n log.debug(`Fetching llms.txt from: ${llmsTxtUrl}`);\n\n const result = await safeFetch(\n surface,\n new Request(llmsTxtUrl, { headers: { Accept: 'text/plain' } })\n );\n\n if (result.isErr()) return null;\n\n if (!result.value.ok) return null;\n\n const parseResult = await safeParseResponse(surface, result.value);\n if (parseResult.isErr() || parseResult.value.type !== 'text') return null;\n\n return parseResult.value.data;\n}\n\n/**\n * Discover payment-protected resources on an origin.\n * Fetches OpenAPI spec, builds endpoint index, and fetches llms.txt instructions.\n *\n * Returns DiscoveryResult on success, null if no spec/endpoints found.\n */\nexport async function discoverResources(\n surface: string,\n url: string\n): Promise<DiscoveryResult | null> {\n const origin = URL.canParse(url) ? new URL(url).origin : url;\n\n log.info(`Discovering resources for origin: ${origin}`);\n\n // Fetch OpenAPI spec and llms.txt in parallel\n const [spec, instructions] = await Promise.all([\n fetchOpenApiSpec(origin),\n fetchLlmsTxt(surface, origin),\n ]);\n\n if (!spec?.paths) {\n log.debug(\n `No OpenAPI spec found for ${origin}. Tried: /openapi.json, /.well-known/openapi.json, /.well-known/x402, /.well-known/mpp`\n );\n return null;\n }\n\n // Build the lightweight endpoint index\n const endpoints = await getOriginIndex(origin);\n\n if (!endpoints || endpoints.length === 0) {\n log.debug(`OpenAPI spec found for ${origin} but no endpoints extracted`);\n return null;\n }\n\n log.info(`Found ${endpoints.length} endpoints for: ${origin}`);\n\n return {\n origin,\n source: 'openapi',\n endpoints: endpoints.map(({ path, method, summary, price, protocols }) => ({\n path,\n method,\n summary,\n ...(price ? { price } : {}),\n ...(protocols ? { protocols } : {}),\n })),\n ...(instructions ? { instructions } : {}),\n };\n}\n","import { formatUnits } from 'viem';\n\nimport { ok } from '@agentcash/neverthrow';\n\nimport { getBalance } from '@/shared/balance';\nimport { getDepositLink } from '@/shared/utils';\nimport { TEMPO_TOKEN_ADDRESS } from '@/shared/tempo';\nimport { getTempoBalance } from '@/shared/tempo-balance';\nimport { log } from '@/shared/log';\n\nimport type { GlobalFlags } from '@/types';\nimport type { Address } from 'viem';\n\ninterface ChainBalance {\n chain: string;\n balance: number;\n}\n\nexport interface WalletInfoResult {\n address: Address;\n balance: number;\n chains: ChainBalance[];\n isNewWallet: boolean;\n depositLink: string;\n message?: string;\n}\n\n/**\n * Get wallet info including balance and deposit link.\n * Returns summed balance across Base and Tempo, with per-chain breakdown.\n */\nexport async function getWalletInfo(\n surface: string,\n address: Address,\n flags: GlobalFlags\n) {\n const [balanceResult, tempoResult] = await Promise.all([\n getBalance({ address, flags, surface }),\n getTempoBalance({ address, tokenAddress: TEMPO_TOKEN_ADDRESS })\n .then(r => Number(formatUnits(r.balance, 6)))\n .catch(e => {\n log.info(`Failed to fetch Tempo balance: ${e}`);\n return null;\n }),\n ]);\n\n if (balanceResult.isErr()) {\n return balanceResult;\n }\n\n const baseBalance = balanceResult.value.balance;\n const tempoBalance = tempoResult ?? 0;\n const totalBalance = baseBalance + tempoBalance;\n\n const chains: ChainBalance[] = [\n { chain: 'Base', balance: baseBalance },\n { chain: 'Tempo', balance: tempoBalance },\n ];\n\n return ok<WalletInfoResult>({\n address,\n balance: totalBalance,\n chains,\n isNewWallet: totalBalance === 0,\n depositLink: getDepositLink(address, flags),\n ...(totalBalance < 2.5 && totalBalance > 0\n ? { message: 'Your balance is low. Consider topping it up' }\n : {}),\n });\n}\n","import type { Address } from 'viem';\n\n/** Authenticated RPC for Tempo Mainnet */\nexport const TEMPO_RPC_URL =\n 'https://eng:acard-melody-fashion-finish@rpc.mainnet.tempo.xyz';\n\n/** pathUSD token on Tempo Mainnet */\nexport const TEMPO_TOKEN_ADDRESS: Address =\n '0x20c0000000000000000000000000000000000000';\n","import { tempo } from 'viem/chains';\n\nimport type { Address } from 'viem';\n\nconst MPPSCAN_BASE = 'https://mppscan.com';\n\ninterface GetTempoBalanceResult {\n chainId: number;\n chainName: string;\n balance: bigint;\n tokenAddress: Address;\n}\n\nexport async function getTempoBalance({\n address,\n tokenAddress,\n}: {\n address: Address;\n tokenAddress: Address;\n}): Promise<GetTempoBalanceResult> {\n const url = `${MPPSCAN_BASE}/api/balance/${address}`;\n\n const res = await fetch(url, {\n method: 'GET',\n headers: { accept: 'application/json' },\n });\n\n if (!res.ok) {\n throw new Error(`mppscan balance request failed: ${res.status}`);\n }\n\n const data = (await res.json()) as { balance: string };\n\n return {\n chainId: tempo.id,\n chainName: tempo.name,\n balance: BigInt(data.balance),\n tokenAddress,\n };\n}\n","import { z } from 'zod';\nimport { ok } from '@agentcash/neverthrow';\n\nimport { safeFetchJson } from '@/shared/neverthrow/fetch';\nimport { getBaseUrl } from '@/shared/utils';\nimport { MCP_VERSION } from '@/shared/version';\n\nimport type { Address } from 'viem';\n\n/**\n * Error report input\n */\ninterface ErrorReportInput {\n tool: string;\n summary: string;\n errorMessage: string;\n resource?: string;\n stack?: string;\n fullReport?: string;\n}\n\n/**\n * Error report result\n */\nexport interface ErrorReportResult {\n submitted: true;\n reportId: string;\n message: string;\n}\n\n/**\n * Submit an error report to agentcash telemetry.\n */\nexport async function submitErrorReport(\n surface: string,\n input: ErrorReportInput,\n address: Address,\n dev: boolean\n) {\n const telemetryResult = await safeFetchJson(\n surface,\n new Request(`${getBaseUrl(dev)}/api/telemetry`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n tool: input.tool,\n summary: input.summary,\n errorMessage: input.errorMessage,\n resource: input.resource,\n stack: input.stack,\n fullReport: input.fullReport,\n walletAddress: address,\n mcpVersion: MCP_VERSION,\n reportedAt: new Date().toISOString(),\n }),\n }),\n z.object({\n reportId: z.string(),\n })\n );\n\n if (telemetryResult.isErr()) {\n return telemetryResult;\n }\n\n const { reportId } = telemetryResult.value;\n\n return ok<ErrorReportResult>({\n submitted: true,\n reportId,\n message:\n 'Error report submitted successfully. The agentcash team will investigate.',\n });\n}\n"],"mappings":"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","names":["errorType","formatUnits","formatUnits"]}
@@ -4,7 +4,7 @@ import { dirname, join } from "path";
4
4
  import { fileURLToPath } from "url";
5
5
  function getVersion() {
6
6
  if (true) {
7
- return "0.3.5";
7
+ return "0.3.7";
8
8
  }
9
9
  const __dirname2 = dirname(fileURLToPath(import.meta.url));
10
10
  const pkg = JSON.parse(
@@ -19,4 +19,4 @@ export {
19
19
  MCP_VERSION,
20
20
  DIST_TAG
21
21
  };
22
- //# sourceMappingURL=chunk-LXLFCKRE.js.map
22
+ //# sourceMappingURL=chunk-SBLBP4FH.js.map
@@ -2,16 +2,15 @@ import {
2
2
  buildRequest,
3
3
  createFetchWithPayment,
4
4
  requestSchema
5
- } from "./chunk-NUYR6S4R.js";
5
+ } from "./chunk-7E4JDDBW.js";
6
6
  import {
7
+ TEMPO_RPC_URL,
7
8
  checkEndpoint,
8
9
  discoverResources,
9
- getTempoChainId,
10
- getTempoRpcUrl,
11
10
  getWalletInfo,
12
11
  submitErrorReport
13
- } from "./chunk-LDXTW6MC.js";
14
- import "./chunk-LXLFCKRE.js";
12
+ } from "./chunk-RP5AGYAT.js";
13
+ import "./chunk-SBLBP4FH.js";
15
14
  import {
16
15
  DEFAULT_NETWORK,
17
16
  getWallet,
@@ -28,7 +27,9 @@ import "./chunk-ISR6DJ53.js";
28
27
  import { randomBytes } from "crypto";
29
28
  import { x402Client, x402HTTPClient } from "@x402/core/client";
30
29
  import { ExactEvmScheme } from "@x402/evm/exact/client";
31
- import { Mpay, tempo } from "mpay/client";
30
+ import { Mppx, tempo as tempoMethod } from "mppx/client";
31
+ import { createClient, http } from "viem";
32
+ import { tempo } from "viem/chains";
32
33
 
33
34
  // src/cli/output/types.ts
34
35
  var errorCodeToExitCode = {
@@ -262,11 +263,12 @@ async function fetchCommand(args, flags) {
262
263
  ]
263
264
  });
264
265
  const x402HttpClient = new x402HTTPClient(coreClient);
265
- const mpayClient = Mpay.create({
266
+ const mppxClient = Mppx.create({
267
+ polyfill: false,
266
268
  methods: [
267
- tempo({
269
+ tempoMethod({
268
270
  account,
269
- rpcUrl: { [getTempoChainId()]: getTempoRpcUrl() }
271
+ getClient: () => createClient({ chain: tempo, transport: http(TEMPO_RPC_URL) })
270
272
  })
271
273
  ]
272
274
  });
@@ -280,7 +282,7 @@ async function fetchCommand(args, flags) {
280
282
  });
281
283
  const fetchResult = await createFetchWithPayment({
282
284
  surface: SURFACE,
283
- clients: { x402: x402HttpClient, mpp: mpayClient },
285
+ clients: { x402: x402HttpClient, mpp: mppxClient },
284
286
  paymentMethod,
285
287
  account,
286
288
  flags
@@ -452,7 +454,7 @@ async function reportErrorCommand(args, flags) {
452
454
 
453
455
  // src/cli/commands/server.ts
454
456
  async function serverCommand(flags) {
455
- const { startServer } = await import("./server-SCEZADBF.js");
457
+ const { startServer } = await import("./server-BEKXJWYB.js");
456
458
  await startServer(flags);
457
459
  }
458
460
  export {
@@ -464,4 +466,4 @@ export {
464
466
  walletInfoCommand,
465
467
  walletRedeemCommand
466
468
  };
467
- //# sourceMappingURL=commands-N2AA3RBV.js.map
469
+ //# sourceMappingURL=commands-JXKV7VMY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/commands/fetch.ts","../../src/cli/output/types.ts","../../src/cli/output/format.ts","../../src/cli/output/response.ts","../../src/cli/commands/lib/get-wallet-or-exit.ts","../../src/cli/commands/lib/parse-request-input.ts","../../src/cli/commands/check.ts","../../src/cli/commands/discover.ts","../../src/cli/commands/wallet.ts","../../src/cli/commands/report-error.ts","../../src/cli/commands/server.ts"],"sourcesContent":["import { randomBytes } from 'crypto';\n\nimport { x402Client, x402HTTPClient } from '@x402/core/client';\nimport { ExactEvmScheme } from '@x402/evm/exact/client';\nimport { Mppx, tempo as tempoMethod } from 'mppx/client';\nimport { createClient, http } from 'viem';\nimport { tempo } from 'viem/chains';\n\nimport {\n successResponse,\n errorResponse,\n fromNeverthrowError,\n outputAndExit,\n type OutputFlags,\n} from '@/cli/output';\n\nimport { buildRequest } from '@/server/tools/lib/request';\nimport { DEFAULT_NETWORK } from '@/shared/networks';\nimport { TEMPO_RPC_URL } from '@/shared/tempo';\nimport { safeParseResponse } from '@/shared/neverthrow/fetch';\nimport { createFetchWithPayment } from '@/shared/operations/fetch-with-payment';\nimport { getWalletOrExit, parseRequestInput } from './lib';\n\nimport type { GlobalFlags } from '@/types';\nimport type { JsonObject } from '@/shared/neverthrow/json/types';\n\nconst SURFACE = 'cli:fetch';\n\ninterface FetchArgs {\n url: string;\n method?: string;\n body?: string;\n headers?: string;\n paymentMethod?: string;\n}\n\nexport async function fetchCommand(\n args: FetchArgs,\n flags: GlobalFlags<OutputFlags>\n): Promise<void> {\n const { account } = await getWalletOrExit(flags);\n const sessionId = randomBytes(16).toString('hex');\n\n const input = parseRequestInput(SURFACE, args, flags);\n\n // Set up x402 client\n const coreClient = x402Client.fromConfig({\n schemes: [\n { network: DEFAULT_NETWORK, client: new ExactEvmScheme(account) },\n ],\n });\n const x402HttpClient = new x402HTTPClient(coreClient);\n\n // Set up MPP client (polyfill: false — we handle 402 retries ourselves)\n const mppxClient = Mppx.create({\n polyfill: false,\n methods: [\n tempoMethod({\n account,\n getClient: () =>\n createClient({ chain: tempo, transport: http(TEMPO_RPC_URL) }),\n }),\n ],\n });\n\n const provider = flags.provider ?? account.address;\n const paymentMethod = (args.paymentMethod ?? 'auto') as\n | 'x402'\n | 'mpp'\n | 'auto';\n\n const request = buildRequest({\n input,\n address: account.address,\n sessionId,\n provider,\n });\n\n const fetchResult = await createFetchWithPayment({\n surface: SURFACE,\n clients: { x402: x402HttpClient, mpp: mppxClient },\n paymentMethod,\n account,\n flags,\n })(request);\n\n if (fetchResult.isErr()) {\n return outputAndExit(fromNeverthrowError(fetchResult), flags);\n }\n\n const { response, paymentInfo } = fetchResult.value;\n\n if (!response.ok) {\n const parseResult = await safeParseResponse(SURFACE, response);\n const details: JsonObject = { statusCode: response.status };\n if (parseResult.isOk()) {\n const { type } = parseResult.value;\n if (type === 'json') {\n details.body = parseResult.value.data;\n } else if (type === 'text') {\n details.body = parseResult.value.data;\n } else {\n details.bodyType = type;\n }\n }\n return outputAndExit(\n errorResponse({\n code: 'HTTP_ERROR',\n message: `HTTP ${response.status}: ${response.statusText}`,\n surface: SURFACE,\n cause: 'http',\n details,\n }),\n flags\n );\n }\n\n const parseResponseResult = await safeParseResponse(SURFACE, response);\n if (parseResponseResult.isErr()) {\n return outputAndExit(fromNeverthrowError(parseResponseResult), flags);\n }\n\n // Build response data\n const data =\n parseResponseResult.value.type === 'json'\n ? parseResponseResult.value.data\n : parseResponseResult.value.type === 'text'\n ? parseResponseResult.value.data\n : { type: parseResponseResult.value.type };\n\n // Build metadata from paymentInfo\n const metadata = paymentInfo\n ? {\n protocol: paymentInfo.protocol,\n ...(paymentInfo.price ? { price: paymentInfo.price } : {}),\n ...(paymentInfo.payment ? { payment: paymentInfo.payment } : {}),\n }\n : undefined;\n\n outputAndExit(successResponse(data, metadata), flags);\n}\n","import type { JsonObject } from '@/shared/neverthrow/json/types';\n\n/**\n * Exit codes for CLI commands\n * Allows agents to programmatically determine error types\n */\nexport enum ExitCode {\n Success = 0,\n GeneralError = 1,\n InsufficientBalance = 2,\n NetworkError = 3,\n PaymentFailed = 4,\n InvalidInput = 5,\n}\n\n/**\n * Error codes for structured error responses\n */\nexport type ErrorCode =\n | 'GENERAL_ERROR'\n | 'INSUFFICIENT_BALANCE'\n | 'NETWORK_ERROR'\n | 'PAYMENT_FAILED'\n | 'INVALID_INPUT'\n | 'WALLET_ERROR'\n | 'PARSE_ERROR'\n | 'HTTP_ERROR'\n | 'X402_ERROR';\n\n/**\n * Maps error codes to exit codes\n */\nexport const errorCodeToExitCode: Record<ErrorCode, ExitCode> = {\n GENERAL_ERROR: ExitCode.GeneralError,\n INSUFFICIENT_BALANCE: ExitCode.InsufficientBalance,\n NETWORK_ERROR: ExitCode.NetworkError,\n PAYMENT_FAILED: ExitCode.PaymentFailed,\n INVALID_INPUT: ExitCode.InvalidInput,\n WALLET_ERROR: ExitCode.GeneralError,\n PARSE_ERROR: ExitCode.InvalidInput,\n HTTP_ERROR: ExitCode.NetworkError,\n X402_ERROR: ExitCode.PaymentFailed,\n};\n\n/**\n * Payment metadata included in successful paid responses\n */\nexport interface PaymentMetadata {\n success: boolean;\n transactionHash?: string;\n}\n\n/**\n * Metadata included in CLI responses\n */\nexport interface ResponseMetadata {\n price?: string;\n payment?: PaymentMetadata;\n}\n\n/**\n * Successful CLI response\n */\nexport interface CliSuccessResponse {\n success: true;\n data: JsonObject | string;\n metadata?: ResponseMetadata;\n}\n\n/**\n * Error details in CLI response\n */\nexport interface CliErrorDetails {\n code: ErrorCode;\n message: string;\n surface?: string;\n cause?: string;\n details?: JsonObject;\n}\n\n/**\n * Failed CLI response\n */\nexport interface CliErrorResponse {\n success: false;\n error: CliErrorDetails;\n}\n\n/**\n * Union type for all CLI responses\n */\nexport type CliResponse = CliSuccessResponse | CliErrorResponse;\n\n/**\n * Output format options\n */\nexport type OutputFormat = 'json' | 'pretty';\n","import type { OutputFormat } from './types';\n\n/**\n * Detect if stdout is a TTY (interactive terminal)\n */\nfunction isTTY(): boolean {\n return process.stdout.isTTY ?? false;\n}\n\n/**\n * Determine output format based on flags and environment\n * - Explicit --format flag takes precedence\n * - Non-TTY (piped) defaults to json\n * - TTY (interactive) defaults to pretty\n */\nexport function getOutputFormat(formatFlag?: string): OutputFormat {\n if (formatFlag === 'json' || formatFlag === 'pretty') {\n return formatFlag;\n }\n return isTTY() ? 'pretty' : 'json';\n}\n\n/**\n * Check if quiet mode is enabled (suppress stderr)\n */\nexport function isQuiet(quietFlag?: boolean): boolean {\n return quietFlag ?? false;\n}\n","import chalk from 'chalk';\n\nimport { getOutputFormat, isQuiet } from './format';\nimport {\n ExitCode,\n errorCodeToExitCode,\n type CliErrorDetails,\n type CliErrorResponse,\n type CliResponse,\n type CliSuccessResponse,\n type ErrorCode,\n type OutputFormat,\n type ResponseMetadata,\n} from './types';\n\nimport type { JsonObject } from '@/shared/neverthrow/json/types';\nimport type { BaseError, Err } from '@agentcash/neverthrow/types';\n\n/**\n * Output flags that can be passed to commands\n */\nexport interface OutputFlags {\n format?: string;\n quiet?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Create a success response\n */\nexport function successResponse(\n data: JsonObject | string,\n metadata?: ResponseMetadata\n): CliSuccessResponse {\n return {\n success: true,\n data,\n ...(metadata ? { metadata } : {}),\n };\n}\n\n/**\n * Create an error response\n */\nexport function errorResponse(error: CliErrorDetails): CliErrorResponse {\n return {\n success: false,\n error,\n };\n}\n\n/**\n * Convert a neverthrow error to a CLI error response\n */\nexport function fromNeverthrowError(\n err: Err<unknown, BaseError<string>>,\n codeOverride?: ErrorCode\n): CliErrorResponse {\n const { error } = err;\n const code = codeOverride ?? mapCauseToErrorCode(error.cause);\n\n return errorResponse({\n code,\n message: error.message,\n surface: error.surface,\n cause: error.cause,\n });\n}\n\n/**\n * Map error cause to error code\n */\nfunction mapCauseToErrorCode(cause: string): ErrorCode {\n switch (cause) {\n case 'network':\n return 'NETWORK_ERROR';\n case 'http':\n return 'HTTP_ERROR';\n case 'parse':\n return 'PARSE_ERROR';\n case 'insufficient_balance':\n return 'INSUFFICIENT_BALANCE';\n case 'payment_failed':\n case 'payment_already_attempted':\n return 'PAYMENT_FAILED';\n case 'invalid_input':\n case 'validation':\n return 'INVALID_INPUT';\n case 'wallet':\n case 'file_not_readable':\n return 'WALLET_ERROR';\n default:\n return 'GENERAL_ERROR';\n }\n}\n\n/**\n * Format response as JSON string\n */\nfunction formatJson(response: CliResponse): string {\n return JSON.stringify(response, null, 2);\n}\n\n/**\n * Format response as pretty output for TTY\n */\nfunction formatPretty(response: CliResponse): string {\n if (response.success) {\n const lines: string[] = [];\n\n // Data\n if (typeof response.data === 'string') {\n lines.push(response.data);\n } else {\n lines.push(JSON.stringify(response.data, null, 2));\n }\n\n // Metadata\n if (response.metadata) {\n lines.push('');\n if (response.metadata.price) {\n lines.push(chalk.dim(`Price: ${response.metadata.price}`));\n }\n if (response.metadata.payment) {\n const { success, transactionHash } = response.metadata.payment;\n lines.push(\n chalk.dim(\n `Payment: ${success ? chalk.green('✓') : chalk.red('✗')}${transactionHash ? ` (${transactionHash.slice(0, 10)}...)` : ''}`\n )\n );\n }\n }\n\n return lines.join('\\n');\n } else {\n const { error } = response;\n const lines = [\n chalk.red(`Error: ${error.message}`),\n chalk.dim(`Code: ${error.code}`),\n ];\n\n if (error.surface) {\n lines.push(chalk.dim(`Surface: ${error.surface}`));\n }\n if (error.cause) {\n lines.push(chalk.dim(`Cause: ${error.cause}`));\n }\n\n return lines.join('\\n');\n }\n}\n\n/**\n * Output a response to stdout and exit with appropriate code\n */\nexport function outputAndExit(\n response: CliResponse,\n flags: OutputFlags = {}\n): never {\n const format = getOutputFormat(flags.format);\n const quiet = isQuiet(flags.quiet);\n\n output(response, format, quiet);\n\n const exitCode = response.success\n ? ExitCode.Success\n : errorCodeToExitCode[response.error.code];\n\n process.exit(exitCode);\n}\n\n/**\n * Output a response to stdout without exiting\n */\nfunction output(\n response: CliResponse,\n format: OutputFormat = 'json',\n quiet = false\n): void {\n const formatted =\n format === 'json' ? formatJson(response) : formatPretty(response);\n\n // Always output to stdout (machine-readable)\n console.log(formatted);\n\n // Optionally suppress stderr output\n if (!quiet && !response.success && format === 'pretty') {\n // Additional debug info could go to stderr\n }\n}\n","import {\n fromNeverthrowError,\n outputAndExit,\n type OutputFlags,\n} from '@/cli/output';\nimport { getWallet } from '@/shared/wallet';\n\nimport type { GlobalFlags } from '@/types';\nimport type { PrivateKeyAccount } from 'viem/accounts';\n\ninterface WalletInfo {\n account: PrivateKeyAccount;\n}\n\n/**\n * Get wallet or exit with error.\n * This function always returns a valid wallet - if getting the wallet fails,\n * it exits the process with an appropriate error.\n */\nexport async function getWalletOrExit(\n flags: GlobalFlags<OutputFlags>\n): Promise<WalletInfo> {\n const walletResult = await getWallet();\n\n if (walletResult.isErr()) {\n outputAndExit(fromNeverthrowError(walletResult, 'WALLET_ERROR'), flags);\n }\n\n return walletResult.value;\n}\n","import type { z } from 'zod';\n\nimport { errorResponse, outputAndExit, type OutputFlags } from '@/cli/output';\nimport { requestSchema } from '@/server/tools/lib/request';\nimport { safeParseJson } from '@/shared/neverthrow/json';\n\nimport type { GlobalFlags } from '@/types';\n\ninterface RawRequestArgs {\n url: string;\n method?: string;\n body?: string;\n headers?: string;\n}\n\ntype RequestInput = z.infer<typeof requestSchema>;\n\n/**\n * Parse and validate CLI request arguments into a typed RequestInput.\n * Exits with error response if parsing fails.\n */\nexport function parseRequestInput(\n surface: string,\n args: RawRequestArgs,\n flags: GlobalFlags<OutputFlags>\n): RequestInput {\n // Parse body JSON if provided\n let parsedBody: unknown;\n if (args.body) {\n const bodyResult = safeParseJson(surface, args.body);\n if (bodyResult.isErr()) {\n outputAndExit(\n errorResponse({\n code: 'INVALID_INPUT',\n message: `Invalid JSON body: ${args.body}`,\n surface,\n cause: 'invalid_json',\n }),\n flags\n );\n }\n parsedBody = bodyResult.value;\n }\n\n // Parse headers JSON if provided\n let parsedHeaders: Record<string, string> | undefined;\n if (args.headers) {\n const headersResult = safeParseJson(surface, args.headers);\n if (headersResult.isErr()) {\n outputAndExit(\n errorResponse({\n code: 'INVALID_INPUT',\n message: `Invalid JSON headers: ${args.headers}`,\n surface,\n cause: 'invalid_json',\n }),\n flags\n );\n }\n\n // Validate headers is an object with string values\n const headersValue = headersResult.value;\n if (\n typeof headersValue !== 'object' ||\n headersValue === null ||\n Array.isArray(headersValue)\n ) {\n outputAndExit(\n errorResponse({\n code: 'INVALID_INPUT',\n message: 'Headers must be an object',\n surface,\n cause: 'invalid_headers',\n }),\n flags\n );\n }\n\n // Validate all values are strings\n const headers: Record<string, string> = {};\n for (const [key, value] of Object.entries(headersValue)) {\n if (typeof value !== 'string') {\n outputAndExit(\n errorResponse({\n code: 'INVALID_INPUT',\n message: `Header \"${key}\" must be a string, got ${typeof value}`,\n surface,\n cause: 'invalid_headers',\n }),\n flags\n );\n }\n headers[key] = value;\n }\n parsedHeaders = headers;\n }\n\n // Validate full request input\n const inputResult = requestSchema.safeParse({\n url: args.url,\n method: args.method,\n body: parsedBody,\n headers: parsedHeaders ?? {},\n });\n\n if (!inputResult.success) {\n outputAndExit(\n errorResponse({\n code: 'INVALID_INPUT',\n message: inputResult.error.message,\n surface,\n cause: 'validation',\n }),\n flags\n );\n }\n\n return inputResult.data;\n}\n","import { randomBytes } from 'crypto';\n\nimport { successResponse, outputAndExit, type OutputFlags } from '@/cli/output';\n\nimport { checkEndpoint } from '@/shared/operations/check-endpoint';\nimport { toJsonObject } from '@/shared/neverthrow/json';\nimport { getWalletOrExit, parseRequestInput } from './lib';\n\nimport type { GlobalFlags } from '@/types';\n\nconst SURFACE = 'cli:check';\n\ninterface CheckArgs {\n url: string;\n method?: string;\n body?: string;\n headers?: string;\n}\n\nexport async function checkCommand(\n args: CheckArgs,\n flags: GlobalFlags<OutputFlags>\n): Promise<void> {\n const { account } = await getWalletOrExit(flags);\n const sessionId = randomBytes(16).toString('hex');\n\n const input = parseRequestInput(SURFACE, args, flags);\n\n const result = await checkEndpoint({\n surface: SURFACE,\n url: input.url,\n methods: input.method ? [input.method] : undefined,\n body: input.body,\n headers: {\n ...(input.headers ?? {}),\n 'X-Wallet-Address': account.address,\n 'X-Session-ID': sessionId,\n },\n includeMethodErrors: !!input.method,\n });\n\n return outputAndExit(successResponse(toJsonObject(result)), flags);\n}\n","import {\n successResponse,\n errorResponse,\n outputAndExit,\n type OutputFlags,\n} from '@/cli/output';\n\nimport { discoverResources } from '@/shared/operations/discover';\n\nimport type { GlobalFlags } from '@/types';\n\ninterface DiscoverArgs {\n url: string;\n}\n\nexport async function discoverCommand(\n args: DiscoverArgs,\n flags: GlobalFlags<OutputFlags>\n): Promise<void> {\n const result = await discoverResources('cli:discover', args.url);\n\n if (result) {\n return outputAndExit(\n successResponse({\n found: true,\n origin: result.origin,\n source: result.source,\n endpoints: result.endpoints.map(e => ({ ...e })),\n ...(result.instructions ? { instructions: result.instructions } : {}),\n }),\n flags\n );\n }\n\n const origin = URL.canParse(args.url) ? new URL(args.url).origin : args.url;\n return outputAndExit(\n errorResponse({\n code: 'GENERAL_ERROR',\n message: `No OpenAPI spec found for ${origin}. Tried: /openapi.json, /.well-known/openapi.json, /.well-known/x402, /.well-known/mpp`,\n surface: 'cli:discover',\n cause: 'not_found',\n details: { origin },\n }),\n flags\n );\n}\n","import {\n successResponse,\n fromNeverthrowError,\n outputAndExit,\n type OutputFlags,\n} from '@/cli/output';\n\nimport { getWalletInfo } from '@/shared/operations/wallet-info';\nimport { redeemInviteCode } from '@/shared/redeem-invite';\nimport { getWalletOrExit } from './lib';\n\nimport type { GlobalFlags } from '@/types';\n\nconst SURFACE = 'cli:wallet';\n\nexport async function walletInfoCommand(\n _args: object,\n flags: GlobalFlags<OutputFlags>\n): Promise<void> {\n const { account } = await getWalletOrExit(flags);\n\n const result = await getWalletInfo(SURFACE, account.address, flags);\n\n if (result.isErr()) {\n return outputAndExit(fromNeverthrowError(result), flags);\n }\n\n return outputAndExit(\n successResponse({\n address: result.value.address,\n balance: result.value.balance,\n chains: result.value.chains.map(c => ({\n chain: c.chain,\n balance: c.balance,\n })),\n isNewWallet: result.value.isNewWallet,\n depositLink: result.value.depositLink,\n ...(result.value.message ? { message: result.value.message } : {}),\n }),\n flags\n );\n}\n\ninterface WalletRedeemArgs {\n code: string;\n}\n\nexport async function walletRedeemCommand(\n args: WalletRedeemArgs,\n flags: GlobalFlags<OutputFlags>\n): Promise<void> {\n const { account } = await getWalletOrExit(flags);\n\n const result = await redeemInviteCode({\n code: args.code,\n dev: flags.dev,\n address: account.address,\n surface: SURFACE,\n });\n\n if (result.isErr()) {\n return outputAndExit(fromNeverthrowError(result), flags);\n }\n\n return outputAndExit(\n successResponse({\n redeemed: true,\n amount: `${result.value.amount} USDC`,\n txHash: result.value.txHash,\n }),\n flags\n );\n}\n","import {\n successResponse,\n fromNeverthrowError,\n outputAndExit,\n type OutputFlags,\n} from '@/cli/output';\n\nimport { submitErrorReport } from '@/shared/operations/report-error';\nimport { getWalletOrExit } from './lib';\n\nimport type { GlobalFlags } from '@/types';\n\nconst SURFACE = 'cli:report-error';\n\ninterface ReportErrorArgs {\n tool: string;\n summary: string;\n errorMessage: string;\n resource?: string;\n stack?: string;\n fullReport?: string;\n}\n\nexport async function reportErrorCommand(\n args: ReportErrorArgs,\n flags: GlobalFlags<OutputFlags>\n): Promise<void> {\n const { account } = await getWalletOrExit(flags);\n\n const result = await submitErrorReport(\n SURFACE,\n {\n tool: args.tool,\n summary: args.summary,\n errorMessage: args.errorMessage,\n resource: args.resource,\n stack: args.stack,\n fullReport: args.fullReport,\n },\n account.address,\n flags.dev\n );\n\n if (result.isErr()) {\n return outputAndExit(fromNeverthrowError(result), flags);\n }\n\n return outputAndExit(\n successResponse({\n submitted: result.value.submitted,\n reportId: result.value.reportId,\n message: result.value.message,\n }),\n flags\n );\n}\n","import type { GlobalFlags } from '@/types';\n\n/**\n * Start the MCP server\n * This is a wrapper that imports and calls the existing server implementation\n */\nexport async function serverCommand(flags: GlobalFlags): Promise<void> {\n const { startServer } = await import('@/server');\n await startServer(flags);\n}\n"],"mappings":"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","names":["randomBytes","SURFACE","randomBytes","SURFACE","SURFACE"]}