agentcash 0.9.2 → 0.9.3

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 (62) hide show
  1. package/dist/cjs/run-server.cjs +327 -317
  2. package/dist/esm/{chunk-CM6NIM6K.js → chunk-I5GPG6M6.js} +4 -2
  3. package/dist/esm/chunk-I5GPG6M6.js.map +1 -0
  4. package/dist/esm/{chunk-6FEDQ4HI.js → chunk-I64SAKMT.js} +6 -3
  5. package/dist/esm/chunk-I64SAKMT.js.map +1 -0
  6. package/dist/esm/chunk-JPUCBTWC.js +79 -0
  7. package/dist/esm/chunk-JPUCBTWC.js.map +1 -0
  8. package/dist/esm/{chunk-G3AVBW3H.js → chunk-LOKWX2HK.js} +36 -13
  9. package/dist/esm/chunk-LOKWX2HK.js.map +1 -0
  10. package/dist/esm/{chunk-PGMMXO5J.js → chunk-LUWOAFE2.js} +18 -18
  11. package/dist/esm/chunk-LUWOAFE2.js.map +1 -0
  12. package/dist/esm/{chunk-6ZASEAWN.js → chunk-RXSYAZUA.js} +2 -2
  13. package/dist/esm/{chunk-RAFN7MFS.js → chunk-UPEWVW6F.js} +22 -5
  14. package/dist/esm/chunk-UPEWVW6F.js.map +1 -0
  15. package/dist/esm/{chunk-CGFED7FU.js → chunk-X46IRIC5.js} +2 -2
  16. package/dist/esm/{chunk-ST5ITYIM.js → chunk-X6IKKHHP.js} +5 -4
  17. package/dist/esm/{chunk-ST5ITYIM.js.map → chunk-X6IKKHHP.js.map} +1 -1
  18. package/dist/esm/{chunk-G5IKWSIV.js → chunk-XADII4KF.js} +2 -2
  19. package/dist/esm/{chunk-U2I7LBH4.js → chunk-XGV3H2AG.js} +6 -3
  20. package/dist/esm/{chunk-U2I7LBH4.js.map → chunk-XGV3H2AG.js.map} +1 -1
  21. package/dist/esm/chunk-XZVPAEDA.js +7 -0
  22. package/dist/esm/{fetch-4X4N7TSG.js → fetch-WVBTB2ZC.js} +7 -7
  23. package/dist/esm/{fetch-auth-R54NXQBZ.js → fetch-auth-L43YZQKM.js} +4 -4
  24. package/dist/esm/{fund-WJNWLQWZ.js → fund-GDQGBL4O.js} +4 -4
  25. package/dist/esm/index.js +18 -18
  26. package/dist/esm/index.js.map +1 -1
  27. package/dist/esm/{install-GB7Z3Y7Y.js → install-DSGVSQUA.js} +9 -8
  28. package/dist/esm/install-DSGVSQUA.js.map +1 -0
  29. package/dist/esm/{onboard-IOSC3DTG.js → onboard-6QKPAT4E.js} +13 -9
  30. package/dist/esm/onboard-6QKPAT4E.js.map +1 -0
  31. package/dist/esm/{report-error-CSI2EPQJ.js → report-error-4S3UZ6UV.js} +3 -3
  32. package/dist/esm/{server-EM2KLQJY.js → server-6VNA4WK6.js} +2 -2
  33. package/dist/esm/{server-QT37RZYD.js → server-DXRVE6YW.js} +21 -19
  34. package/dist/esm/server-DXRVE6YW.js.map +1 -0
  35. package/dist/esm/{settings-I7MPPOB7.js → settings-XQZYE7XS.js} +6 -6
  36. package/dist/esm/{try-2XWGGAAP.js → try-WPFY4KZL.js} +5 -5
  37. package/dist/esm/{wallet-3ZWXDQNE.js → wallet-2GMS734S.js} +9 -12
  38. package/dist/esm/wallet-2GMS734S.js.map +1 -0
  39. package/package.json +4 -4
  40. package/dist/esm/chunk-6FEDQ4HI.js.map +0 -1
  41. package/dist/esm/chunk-CM6NIM6K.js.map +0 -1
  42. package/dist/esm/chunk-G3AVBW3H.js.map +0 -1
  43. package/dist/esm/chunk-GQTOWVH6.js +0 -7
  44. package/dist/esm/chunk-PGMMXO5J.js.map +0 -1
  45. package/dist/esm/chunk-RAFN7MFS.js.map +0 -1
  46. package/dist/esm/chunk-UJO2BWV6.js +0 -112
  47. package/dist/esm/chunk-UJO2BWV6.js.map +0 -1
  48. package/dist/esm/install-GB7Z3Y7Y.js.map +0 -1
  49. package/dist/esm/onboard-IOSC3DTG.js.map +0 -1
  50. package/dist/esm/server-QT37RZYD.js.map +0 -1
  51. package/dist/esm/wallet-3ZWXDQNE.js.map +0 -1
  52. /package/dist/esm/{chunk-6ZASEAWN.js.map → chunk-RXSYAZUA.js.map} +0 -0
  53. /package/dist/esm/{chunk-CGFED7FU.js.map → chunk-X46IRIC5.js.map} +0 -0
  54. /package/dist/esm/{chunk-G5IKWSIV.js.map → chunk-XADII4KF.js.map} +0 -0
  55. /package/dist/esm/{chunk-GQTOWVH6.js.map → chunk-XZVPAEDA.js.map} +0 -0
  56. /package/dist/esm/{fetch-4X4N7TSG.js.map → fetch-WVBTB2ZC.js.map} +0 -0
  57. /package/dist/esm/{fetch-auth-R54NXQBZ.js.map → fetch-auth-L43YZQKM.js.map} +0 -0
  58. /package/dist/esm/{fund-WJNWLQWZ.js.map → fund-GDQGBL4O.js.map} +0 -0
  59. /package/dist/esm/{report-error-CSI2EPQJ.js.map → report-error-4S3UZ6UV.js.map} +0 -0
  60. /package/dist/esm/{server-EM2KLQJY.js.map → server-6VNA4WK6.js.map} +0 -0
  61. /package/dist/esm/{settings-I7MPPOB7.js.map → settings-XQZYE7XS.js.map} +0 -0
  62. /package/dist/esm/{try-2XWGGAAP.js.map → try-WPFY4KZL.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/shared/settings.ts","../../src/shared/protocols/detect.ts","../../src/shared/protocols/mpp/index.ts","../../src/shared/protocols/pick.ts","../../src/shared/protocols/mpp/handle-payment.ts","../../src/shared/protocols/x402/choose-payment-requirement.ts","../../src/shared/protocols/x402/handle-payment.ts","../../src/operations/fetch-with-payment.ts"],"sourcesContent":["import z from 'zod';\nimport fs from 'fs';\n\nimport { configFile } from './fs';\n\nconst SETTINGS_FILE = configFile('settings.json');\n\nconst settingsSchema = z\n .looseObject({\n maxAmount: z.number().positive(),\n })\n .partial();\n\nexport type Settings = z.infer<typeof settingsSchema>;\n\nexport const getSettings = (): Settings => {\n if (!fs.existsSync(SETTINGS_FILE)) {\n return {};\n }\n\n const content = fs.readFileSync(SETTINGS_FILE, 'utf-8');\n const result = settingsSchema.safeParse(JSON.parse(content));\n if (!result.success) {\n return {};\n }\n return result.data;\n};\n\nexport const setSettings = (settings: Settings) => {\n const existing = getSettings();\n const newSettings = settingsSchema.parse({ ...existing, ...settings });\n fs.writeFileSync(SETTINGS_FILE, JSON.stringify(newSettings, null, 2));\n};\n","import { isMppEnabled } from '@/shared/mpp-enabled';\nimport type { PaymentProtocol } from './types';\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 *\n * MPP detection is gated behind {@link isMppEnabled} so it never surfaces\n * in agent context on the `latest` dist-tag.\n */\nexport function detectPaymentProtocols(response: Response): PaymentProtocol[] {\n const protocols: PaymentProtocol[] = [];\n if (isMppEnabled()) {\n const wwwAuth = response.headers.get('WWW-Authenticate');\n if (wwwAuth?.startsWith('Payment')) {\n protocols.push('mpp');\n }\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","import { Challenge, Receipt } from 'mppx';\nimport { Methods } from 'mppx/tempo';\nimport {\n err,\n ok,\n resultFromPromise,\n resultFromThrowable,\n} from '@agentcash/neverthrow';\n\nimport { Mppx, tempo as tempoMethod } from 'mppx/client';\n\nimport { createClient, http } from 'viem';\nimport { tempo } from 'viem/chains';\n\nimport { isMppEnabled } from '@/shared/mpp-enabled';\n\nimport type { BaseMppError } from './types';\nimport type { Wallets } from '@/wallet';\n\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, { methods: [Methods.charge] }),\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 wallets: Wallets,\n response: Response\n) => {\n if (!isMppEnabled()) {\n return mppErr(surface, {\n cause: 'mpp_disabled',\n message: 'MPP is not enabled',\n });\n }\n\n const TEMPO_RPC_URL =\n 'https://eng:acard-melody-fashion-finish@rpc.mainnet.tempo.xyz';\n\n const client = Mppx.create({\n polyfill: false,\n methods: [\n tempoMethod({\n account: wallets.evmAccount.account,\n getClient: () =>\n createClient({\n chain: tempo,\n transport: http(TEMPO_RPC_URL),\n }),\n }),\n ],\n });\n\n return mppResultFromPromise(\n surface,\n client.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","import { resultFromPromise } from '@agentcash/neverthrow';\n\nimport { safeGetMppChallenge } from '@/shared/protocols/mpp';\n\nimport { log } from '@/shared/log';\nimport { getBalance } from '@/shared/balance';\nimport { Network } from '@agentcash/networks';\n\nimport type { FetchWithPaymentOptions } from '@/operations/fetch-with-payment';\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: FetchWithPaymentOptions\n): Promise<'x402' | 'mpp'> {\n const { surface, wallets, flags } = options;\n\n // Get x402 (USDC on Base) balance\n const x402BalanceResult = await resultFromPromise(\n 'balance',\n surface,\n getBalance(\n surface,\n {\n address: wallets.evmAccount.account.address,\n network: Network.BASE,\n },\n flags\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 = 6;\n if (currency) {\n const tempoResult = await getBalance(\n surface,\n {\n address: wallets.evmAccount.account.address,\n network: Network.TEMPO,\n },\n flags\n );\n if (tempoResult.isOk()) {\n mppBalance = Number(tempoResult.value.balance ?? (0).toFixed(decimals));\n }\n }\n }\n\n log.info(`Protocol selection — x402: $${x402Balance}, mpp: $${mppBalance}`);\n return x402Balance >= mppBalance ? 'x402' : 'mpp';\n}\n","import { formatUnits } from 'viem';\n\nimport { resultFromPromise } from '@agentcash/neverthrow';\n\nimport { safeFetch } from '@/shared/neverthrow/fetch';\nimport {\n safeGetMppChallenge,\n safeCreateMppCredential,\n safeGetMppReceipt,\n mppErr,\n mppOk,\n} from '@/shared/protocols/mpp';\n\nimport type { FetchWithPaymentResult } from '@/operations/fetch-with-payment';\nimport type { HandlePaymentParams } from '../types';\nimport { Network } from '@agentcash/networks';\n\nexport async function handleMppPayment({\n response,\n clonedRequest,\n options,\n maxAmount,\n}: HandlePaymentParams) {\n const { surface, wallets, beforePayment, timeout } = options;\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 = Number(formatUnits(BigInt(challenge.request.amount), 6));\n const currency = challenge.request.currency;\n\n if (amount > maxAmount) {\n return mppErr(surface, {\n cause: 'mpp_payment_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 if (beforePayment) {\n const hookResult = await resultFromPromise(\n 'mpp',\n surface,\n beforePayment({\n protocol: 'mpp',\n amount,\n currency,\n network: Network.TEMPO,\n }),\n e => ({\n cause: 'before_payment_hook_failed' 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 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 clonedRequest.headers.set('Authorization', credential);\n\n // Retry the fetch with the credential\n return await safeFetch(surface, clonedRequest, timeout).andThen(\n paidResponse => {\n // Parse the receipt for transaction hash\n const receiptResult = safeGetMppReceipt(surface, paidResponse);\n\n return mppOk<FetchWithPaymentResult>({\n response: paidResponse,\n paymentInfo: {\n protocol: 'mpp',\n price: amount.toLocaleString('en-US', {\n style: 'currency',\n currency: 'USD',\n }),\n payment: receiptResult.isOk()\n ? {\n success: true,\n transactionHash: receiptResult.value.reference,\n }\n : null,\n },\n });\n }\n );\n}\n","import { getBalance } from '@/shared/balance';\nimport { Network, networkSchema } from '@agentcash/networks';\n\nimport type { PaymentRequirements } from '@x402/core/types';\nimport type { FetchWithPaymentOptions } from '@/operations/fetch-with-payment';\n\ninterface ChoosePaymentRequirementParams {\n paymentRequirements: PaymentRequirements[];\n options: FetchWithPaymentOptions;\n}\n\nexport const choosePaymentRequirement = async ({\n paymentRequirements,\n options,\n}: ChoosePaymentRequirementParams) => {\n const { surface, paymentNetwork, wallets, flags } = options;\n if (paymentNetwork) {\n return paymentRequirements.find(\n pr => pr.network === (paymentNetwork as string)\n );\n }\n\n const requirementsWithBalance = await Promise.all(\n paymentRequirements.map(async pr => {\n const parsedNetwork = networkSchema.safeParse(pr.network);\n if (!parsedNetwork.success) {\n return {\n balance: 0,\n requirement: pr,\n };\n }\n if (parsedNetwork.data === Network.SOLANA) {\n const balanceResult = await getBalance(\n surface,\n {\n address: wallets.svmAccount.account.address,\n network: parsedNetwork.data,\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.evmAccount.account.address,\n network: parsedNetwork.data,\n },\n flags\n );\n return {\n requirement: pr,\n balance: balanceResult.isOk() ? balanceResult.value.balance : 0,\n };\n }\n })\n );\n return requirementsWithBalance.sort((a, b) => b.balance - a.balance)[0]!\n .requirement;\n};\n","import { resultFromPromise } from '@agentcash/neverthrow';\n\nimport { choosePaymentRequirement } from './choose-payment-requirement';\n\nimport { safeFetch } from '@/shared/neverthrow/fetch';\nimport {\n safeCreatePaymentPayload,\n safeGetPaymentRequired,\n safeGetPaymentSettlement,\n x402Err,\n x402Ok,\n x402ProbeClient,\n} from '@/shared/protocols/x402';\nimport { tokenStringToNumber } from '@/shared/utils';\n\nimport type { FetchWithPaymentResult } from '@/operations/fetch-with-payment';\nimport type { HandlePaymentParams } from '../types';\nimport type { Network } from '@agentcash/networks';\n\nexport async function handleX402Payment({\n response,\n clonedRequest,\n options,\n maxAmount,\n}: HandlePaymentParams) {\n const { surface, wallets, beforePayment, timeout } = options;\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 if (amount > maxAmount) {\n return x402Err(surface, {\n cause: 'payment_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 if (beforePayment) {\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 as 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 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 // Encode payment header\n const paymentHeaders =\n x402ProbeClient.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, timeout).andThen(\n paidResponse => {\n const settlementResult = safeGetPaymentSettlement(surface, paidResponse);\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 payment: settlementResult.isOk()\n ? {\n success: settlementResult.value.success,\n transactionHash: settlementResult.value.transaction,\n }\n : null,\n },\n });\n }\n );\n}\n","import type { GlobalFlags } from '@/types';\n\nimport { fetchErr, fetchOk, safeFetch } from '@/shared/neverthrow/fetch';\n\nimport { detectPaymentProtocols } from '@/shared/protocols/detect';\nimport { pickByBalance } from '@/shared/protocols/pick';\n\nimport { handleMppPayment } from '@/shared/protocols/mpp/handle-payment';\nimport { handleX402Payment } from '@/shared/protocols/x402/handle-payment';\n\nimport { getSettings } from '@/shared/settings';\nimport { BLACKLISTED_ORIGINS } from '@/shared/origins';\n\nimport type { Wallets } from '@/wallet';\nimport type { PaymentProtocol } from '@/shared/protocols/types';\nimport type { Network } from '@agentcash/networks';\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: PaymentProtocol;\n amount: number;\n currency: string;\n network: Network;\n}) => Promise<void>;\n\nexport interface FetchWithPaymentResult {\n response: Response;\n paymentInfo: null | {\n protocol: PaymentProtocol;\n price: string;\n payment: {\n success: boolean;\n transactionHash: string;\n } | null;\n };\n}\n\n/** Default max amount (in USD/USDC) allowed without explicit opt-in. */\nexport const DEFAULT_MAX_AMOUNT = 5;\n\nexport interface FetchWithPaymentOptions {\n surface: string;\n wallets: Wallets;\n flags: GlobalFlags;\n paymentMethod?: PaymentProtocol;\n paymentNetwork?: Network;\n beforePayment?: BeforePaymentHook;\n timeout?: number;\n maxAmount?: number;\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, paymentMethod, timeout, maxAmount } = options;\n const effectiveMaxAmount =\n maxAmount ?? getSettings().maxAmount ?? DEFAULT_MAX_AMOUNT;\n\n return async (request: Request) => {\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 clonedRequest = request.clone();\n const fallbackRequest = 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 // 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) {\n const handler = getHandler(paymentMethod);\n return handler({\n response,\n clonedRequest,\n options,\n maxAmount: effectiveMaxAmount,\n });\n }\n\n // Auto: detect available protocols, pick by higher balance\n const available = detectPaymentProtocols(response);\n\n const preferred =\n available.length === 1\n ? available[0]!\n : await pickByBalance(response, options);\n\n const fallback =\n available.length > 1 ? (preferred === 'mpp' ? 'x402' : 'mpp') : null;\n\n const preferredHandler = getHandler(preferred);\n\n const result = await preferredHandler({\n response,\n clonedRequest,\n options,\n maxAmount: effectiveMaxAmount,\n });\n\n if (result.isErr() && fallback) {\n const fallbackHandler = getHandler(fallback);\n return fallbackHandler({\n response,\n clonedRequest: fallbackRequest,\n options,\n maxAmount: effectiveMaxAmount,\n });\n }\n\n return result;\n };\n}\n\nconst getHandler = (protocol: PaymentProtocol) => {\n switch (protocol) {\n case 'mpp':\n return handleMppPayment;\n case 'x402':\n return handleX402Payment;\n default:\n throw new Error(`Unknown protocol: ${protocol as string}`);\n }\n};\n"],"mappings":"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","names":["amount","response"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../internal/balance/src/index.ts","../../src/shared/balance.ts"],"sourcesContent":["import { z } from 'zod';\n\nimport {\n ethereumAddressSchema,\n EVM_CONFIGS,\n EvmNetwork,\n Network,\n networkSchema,\n solanaAddressSchema,\n} from '@agentcash/networks';\n\nconst evmNetworks = Object.keys(EVM_CONFIGS) as EvmNetwork[];\n\nexport const getSolanaBalanceInputSchema = z.object({\n address: solanaAddressSchema,\n tokenAddress: solanaAddressSchema.optional(),\n});\n\nexport const getEvmBalanceInputSchema = z.object({\n address: ethereumAddressSchema,\n tokenAddress: ethereumAddressSchema.optional(),\n});\n\nexport const getBalanceInputSchema = z.discriminatedUnion('network', [\n getSolanaBalanceInputSchema.extend({ network: z.literal(Network.SOLANA) }),\n getEvmBalanceInputSchema.extend({ network: z.enum(evmNetworks) }),\n]);\n\nexport const getBalanceOutputSchema = z.object({\n balance: z.number(),\n network: networkSchema,\n chainId: z.number(),\n});\n\nexport type GetBalanceInput = z.infer<typeof getBalanceInputSchema>;\nexport type GetSolanaBalanceInput = Extract<\n GetBalanceInput,\n { network: typeof Network.SOLANA }\n>;\nexport type GetEvmBalanceInput = Extract<\n GetBalanceInput,\n { network: EvmNetwork }\n>;\nexport type GetBalanceOutput = z.infer<typeof getBalanceOutputSchema>;\n","import { getBaseUrl } from '@/shared/utils';\nimport { safeFetchJson } from '@/shared/neverthrow/fetch';\n\nimport { getBalanceOutputSchema } from '@agentcash/balance';\n\nimport type { GetBalanceInput } from '@agentcash/balance';\nimport type { GlobalFlags } from '@/types';\n\nexport const getBalance = async (\n surface: string,\n input: GetBalanceInput,\n flags: GlobalFlags\n) => {\n return await safeFetchJson(\n surface,\n new Request(`${getBaseUrl(flags.dev)}/api/balance`, {\n method: 'POST',\n body: JSON.stringify(input),\n headers: {\n accept: 'application/json',\n },\n }),\n getBalanceOutputSchema\n );\n};\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,SAAS;AAWlB,IAAM,cAAc,OAAO,KAAK,WAAW;AAEpC,IAAM,8BAA8B,EAAE,OAAO;AAAA,EAClD,SAAS;AAAA,EACT,cAAc,oBAAoB,SAAS;AAC7C,CAAC;AAEM,IAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,SAAS;AAAA,EACT,cAAc,sBAAsB,SAAS;AAC/C,CAAC;AAEM,IAAM,wBAAwB,EAAE,mBAAmB,WAAW;AAAA,EACnE,4BAA4B,OAAO,EAAE,SAAS,EAAE,8DAAsB,EAAE,CAAC;AAAA,EACzE,yBAAyB,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,CAAC;AAClE,CAAC;AAEM,IAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,SAAS,EAAE,OAAO;AAAA,EAClB,SAAS;AAAA,EACT,SAAS,EAAE,OAAO;AACpB,CAAC;;;ACxBM,IAAM,aAAa,OACxB,SACA,OACA,UACG;AACH,SAAO,MAAM;AAAA,IACX;AAAA,IACA,IAAI,QAAQ,GAAG,WAAW,MAAM,GAAG,CAAC,gBAAgB;AAAA,MAClD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,KAAK;AAAA,MAC1B,SAAS;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,IACD;AAAA,EACF;AACF;","names":[]}
@@ -1,112 +0,0 @@
1
- import {
2
- getState
3
- } from "./chunk-6XGAIMNK.js";
4
- import {
5
- getBalance
6
- } from "./chunk-RAFN7MFS.js";
7
- import {
8
- getBaseUrl,
9
- getDepositLink
10
- } from "./chunk-OKHBFFZP.js";
11
- import {
12
- isMppEnabled
13
- } from "./chunk-GQTOWVH6.js";
14
- import {
15
- EVM_CONFIGS,
16
- SOLANA_CONFIG,
17
- chainId
18
- } from "./chunk-G3AVBW3H.js";
19
- import {
20
- ok
21
- } from "./chunk-C7KWYVS3.js";
22
-
23
- // src/operations/onboarding-cta.ts
24
- function shouldShowOnboardingCta() {
25
- return (getState().redeemedCodes?.length ?? 0) === 0;
26
- }
27
- function getOnboardingCta(address, flags) {
28
- const onboardLink = `${getBaseUrl(flags.dev)}/onboard`;
29
- const depositLink = getDepositLink(address, flags);
30
- return {
31
- onboardLink,
32
- depositLink,
33
- message: `Welcome to AgentCash. To get started, complete onboarding at ${onboardLink} and receive your reward. If you've already onboarded, deposit at ${depositLink} to fund your wallet.`
34
- };
35
- }
36
-
37
- // src/operations/wallet-info.ts
38
- async function getWalletInfo(surface, wallets, flags) {
39
- const {
40
- evmAccount: {
41
- account: { address: evmAddress }
42
- },
43
- svmAccount: {
44
- account: { address: svmAddress }
45
- }
46
- } = wallets;
47
- const [baseBalance, solanaBalance, tempoBalance] = await Promise.all([
48
- getBalance(surface, { address: evmAddress, network: "eip155:8453" /* BASE */ }, flags),
49
- getBalance(
50
- surface,
51
- { address: svmAddress, network: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp" /* SOLANA */ },
52
- flags
53
- ),
54
- isMppEnabled() ? getBalance(
55
- surface,
56
- { address: evmAddress, network: "eip155:4217" /* TEMPO */ },
57
- flags
58
- ) : Promise.resolve(
59
- ok({
60
- balance: 0,
61
- network: "eip155:4217" /* TEMPO */,
62
- chainId: chainId("eip155:4217" /* TEMPO */)
63
- })
64
- )
65
- ]);
66
- if (baseBalance.isErr()) {
67
- return baseBalance;
68
- }
69
- if (solanaBalance.isErr()) {
70
- return solanaBalance;
71
- }
72
- if (tempoBalance.isErr()) {
73
- return tempoBalance;
74
- }
75
- const totalBalance = baseBalance.value.balance + solanaBalance.value.balance + tempoBalance.value.balance;
76
- const chains = [
77
- {
78
- chain: EVM_CONFIGS["eip155:8453" /* BASE */].name,
79
- balance: baseBalance.value.balance,
80
- paymentNetworkId: "eip155:8453" /* BASE */
81
- },
82
- {
83
- chain: SOLANA_CONFIG.name,
84
- balance: solanaBalance.value.balance,
85
- paymentNetworkId: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp" /* SOLANA */
86
- }
87
- ];
88
- if (isMppEnabled()) {
89
- chains.push({
90
- chain: EVM_CONFIGS["eip155:4217" /* TEMPO */].name,
91
- balance: tempoBalance.value.balance,
92
- paymentNetworkId: "eip155:4217" /* TEMPO */
93
- });
94
- }
95
- return ok({
96
- address: evmAddress,
97
- solanaAddress: svmAddress,
98
- balance: totalBalance,
99
- chains,
100
- isNewWallet: totalBalance === 0,
101
- depositLink: getDepositLink(evmAddress, flags),
102
- solanaDepositLink: getDepositLink(svmAddress, flags),
103
- ...shouldShowOnboardingCta() ? { onboardingCta: getOnboardingCta(evmAddress, flags) } : {},
104
- ...totalBalance < 2.5 && totalBalance > 0 ? { message: "Your balance is low. Consider topping it up" } : {}
105
- });
106
- }
107
-
108
- export {
109
- getOnboardingCta,
110
- getWalletInfo
111
- };
112
- //# sourceMappingURL=chunk-UJO2BWV6.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/operations/onboarding-cta.ts","../../src/operations/wallet-info.ts"],"sourcesContent":["import { getState } from '@/shared/state';\nimport { getBaseUrl, getDepositLink } from '@/shared/utils';\n\nimport type { GlobalFlags } from '@/types';\nimport type { Address } from 'viem';\n\nexport interface OnboardingCta {\n onboardLink: string;\n depositLink: string;\n message: string;\n}\n\nexport function shouldShowOnboardingCta(): boolean {\n return (getState().redeemedCodes?.length ?? 0) === 0;\n}\n\nexport function getOnboardingCta(\n address: Address,\n flags: GlobalFlags\n): OnboardingCta {\n const onboardLink = `${getBaseUrl(flags.dev)}/onboard`;\n const depositLink = getDepositLink(address, flags);\n\n return {\n onboardLink,\n depositLink,\n message: `Welcome to AgentCash. To get started, complete onboarding at ${onboardLink} and receive your reward. If you've already onboarded, deposit at ${depositLink} to fund your wallet.`,\n };\n}\n","import { ok } from '@agentcash/neverthrow';\n\nimport { getBalance } from '@/shared/balance';\nimport { getDepositLink } from '@/shared/utils';\nimport { isMppEnabled } from '@/shared/mpp-enabled';\nimport {\n shouldShowOnboardingCta,\n getOnboardingCta,\n} from '@/operations/onboarding-cta';\n\nimport type { GlobalFlags } from '@/types';\nimport type { SolanaAddress } from '@agentcash/networks';\nimport {\n EVM_CONFIGS,\n Network,\n SOLANA_CONFIG,\n chainId,\n} from '@agentcash/networks';\nimport type { Wallets } from '@/wallet';\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 wallets: Wallets,\n flags: GlobalFlags\n) {\n const {\n evmAccount: {\n account: { address: evmAddress },\n },\n svmAccount: {\n account: { address: svmAddress },\n },\n } = wallets;\n const [baseBalance, solanaBalance, tempoBalance] = await Promise.all([\n getBalance(surface, { address: evmAddress, network: Network.BASE }, flags),\n getBalance(\n surface,\n { address: svmAddress, network: Network.SOLANA },\n flags\n ),\n isMppEnabled()\n ? getBalance(\n surface,\n { address: evmAddress, network: Network.TEMPO },\n flags\n )\n : Promise.resolve(\n ok({\n balance: 0,\n network: Network.TEMPO,\n chainId: chainId(Network.TEMPO),\n })\n ),\n ] as const);\n\n if (baseBalance.isErr()) {\n return baseBalance;\n }\n if (solanaBalance.isErr()) {\n return solanaBalance;\n }\n if (tempoBalance.isErr()) {\n return tempoBalance;\n }\n\n const totalBalance =\n baseBalance.value.balance +\n solanaBalance.value.balance +\n tempoBalance.value.balance;\n\n const chains = [\n {\n chain: EVM_CONFIGS[Network.BASE].name,\n balance: baseBalance.value.balance,\n paymentNetworkId: Network.BASE,\n },\n {\n chain: SOLANA_CONFIG.name,\n balance: solanaBalance.value.balance,\n paymentNetworkId: Network.SOLANA,\n },\n ];\n if (isMppEnabled()) {\n chains.push({\n chain: EVM_CONFIGS[Network.TEMPO].name,\n balance: tempoBalance.value.balance,\n paymentNetworkId: Network.TEMPO,\n });\n }\n\n return ok({\n address: evmAddress,\n solanaAddress: svmAddress as SolanaAddress,\n balance: totalBalance,\n chains,\n isNewWallet: totalBalance === 0,\n depositLink: getDepositLink(evmAddress, flags),\n solanaDepositLink: getDepositLink(svmAddress, flags),\n ...(shouldShowOnboardingCta()\n ? { onboardingCta: getOnboardingCta(evmAddress, flags) }\n : {}),\n ...(totalBalance < 2.5 && totalBalance > 0\n ? { message: 'Your balance is low. Consider topping it up' }\n : {}),\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAYO,SAAS,0BAAmC;AACjD,UAAQ,SAAS,EAAE,eAAe,UAAU,OAAO;AACrD;AAEO,SAAS,iBACd,SACA,OACe;AACf,QAAM,cAAc,GAAG,WAAW,MAAM,GAAG,CAAC;AAC5C,QAAM,cAAc,eAAe,SAAS,KAAK;AAEjD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS,gEAAgE,WAAW,qEAAqE,WAAW;AAAA,EACtK;AACF;;;ACLA,eAAsB,cACpB,SACA,SACA,OACA;AACA,QAAM;AAAA,IACJ,YAAY;AAAA,MACV,SAAS,EAAE,SAAS,WAAW;AAAA,IACjC;AAAA,IACA,YAAY;AAAA,MACV,SAAS,EAAE,SAAS,WAAW;AAAA,IACjC;AAAA,EACF,IAAI;AACJ,QAAM,CAAC,aAAa,eAAe,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,IACnE,WAAW,SAAS,EAAE,SAAS,YAAY,kCAAsB,GAAG,KAAK;AAAA,IACzE;AAAA,MACE;AAAA,MACA,EAAE,SAAS,YAAY,gEAAwB;AAAA,MAC/C;AAAA,IACF;AAAA,IACA,aAAa,IACT;AAAA,MACE;AAAA,MACA,EAAE,SAAS,YAAY,mCAAuB;AAAA,MAC9C;AAAA,IACF,IACA,QAAQ;AAAA,MACN,GAAG;AAAA,QACD,SAAS;AAAA,QACT;AAAA,QACA,SAAS,iCAAqB;AAAA,MAChC,CAAC;AAAA,IACH;AAAA,EACN,CAAU;AAEV,MAAI,YAAY,MAAM,GAAG;AACvB,WAAO;AAAA,EACT;AACA,MAAI,cAAc,MAAM,GAAG;AACzB,WAAO;AAAA,EACT;AACA,MAAI,aAAa,MAAM,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,eACJ,YAAY,MAAM,UAClB,cAAc,MAAM,UACpB,aAAa,MAAM;AAErB,QAAM,SAAS;AAAA,IACb;AAAA,MACE,OAAO,oCAAwB,EAAE;AAAA,MACjC,SAAS,YAAY,MAAM;AAAA,MAC3B;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO,cAAc;AAAA,MACrB,SAAS,cAAc,MAAM;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AACA,MAAI,aAAa,GAAG;AAClB,WAAO,KAAK;AAAA,MACV,OAAO,qCAAyB,EAAE;AAAA,MAClC,SAAS,aAAa,MAAM;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,GAAG;AAAA,IACR,SAAS;AAAA,IACT,eAAe;AAAA,IACf,SAAS;AAAA,IACT;AAAA,IACA,aAAa,iBAAiB;AAAA,IAC9B,aAAa,eAAe,YAAY,KAAK;AAAA,IAC7C,mBAAmB,eAAe,YAAY,KAAK;AAAA,IACnD,GAAI,wBAAwB,IACxB,EAAE,eAAe,iBAAiB,YAAY,KAAK,EAAE,IACrD,CAAC;AAAA,IACL,GAAI,eAAe,OAAO,eAAe,IACrC,EAAE,SAAS,8CAA8C,IACzD,CAAC;AAAA,EACP,CAAC;AACH;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/cli/commands/install/index.ts","../../src/cli/commands/install/1-get-client/index.ts","../../src/cli/commands/install/3-redeem-invite/index.ts","../../src/cli/commands/install/4-add-funds/index.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { intro, outro } from '@clack/prompts';\n\nimport { log } from '@/shared/log';\n\nimport { getClient } from './1-get-client';\nimport { addServer } from './2-add-server';\nimport { redeemInviteCode } from './3-redeem-invite';\nimport { addFunds } from './4-add-funds';\n\nimport type { Command, GlobalFlags } from '@/types';\nimport { getWallet } from '@/wallet';\n\nexport type InstallFlags = GlobalFlags<{\n client?: string;\n}>;\n\nexport const installMcpServer: Command<InstallFlags> = async flags => {\n intro(chalk.green.bold(`Install agentcash MCP`));\n\n const walletResult = await getWallet();\n\n if (walletResult.isErr()) {\n log.error(JSON.stringify(walletResult.error, null, 2));\n outro(chalk.bold.red('Failed to get wallet'));\n process.exit(1);\n }\n\n const client = await getClient(flags);\n\n await addServer(client, flags);\n\n const inviteRedeemed = flags.invite\n ? await redeemInviteCode(\n {\n code: flags.invite,\n address: walletResult.value.evmAccount.account.address,\n surface: 'install',\n },\n flags\n )\n : false;\n\n if (!inviteRedeemed) {\n await addFunds({\n flags,\n wallets: walletResult.value,\n isNew: walletResult.value.evmAccount.isNew,\n });\n }\n\n outro(chalk.bold.green('Your agentcash MCP server is ready to use!'));\n};\n","import z from 'zod';\n\nimport { select, log, outro } from '@clack/prompts';\n\nimport chalk from 'chalk';\n\nimport { clientMetadata, Clients } from '../clients';\n\nimport type { InstallFlags } from '..';\n\nexport const getClient = async ({ client: flagClient, yes }: InstallFlags) => {\n if (yes) {\n if (!flagClient) {\n throw new Error(\n `Client is required when yes is true. Pass --client as one of these values: ${Object.values(Clients).join(', ')}`\n );\n }\n const parsedClient = z.enum(Clients).safeParse(flagClient);\n if (!parsedClient.success) {\n throw new Error(\n `${flagClient} is not a valid client. Valid options are: ${Object.values(Clients).join(', ')}`\n );\n }\n return parsedClient.data;\n }\n const parsedClient = z.enum(Clients).safeParse(flagClient);\n if (parsedClient.success) {\n return parsedClient.data;\n }\n if (flagClient) {\n log.error(`${flagClient} is not a valid client. Please select a client`);\n }\n const client = await select({\n message: 'Where would you like to install the agentcash MCP server?',\n options: Object.values(Clients).map(client => {\n const metadata = clientMetadata[client];\n return {\n label: metadata.name,\n value: client,\n };\n }),\n maxItems: 7,\n });\n\n const parsedClientSelection = z.enum(Clients).safeParse(client);\n if (parsedClientSelection.success) {\n return parsedClientSelection.data;\n }\n outro(chalk.bold.red('No MCP client selected'));\n process.exit(0);\n};\n","import chalk from 'chalk';\nimport { log, spinner } from '@clack/prompts';\n\nimport { wait } from '@/cli/lib/wait';\n\nimport { redeemInviteCode as redeemInviteCodeLib } from '@/shared/redeem-invite';\n\nimport type { RedeemInviteProps } from '@/shared/redeem-invite';\nimport type { GlobalFlags } from '@/types';\n\nexport const redeemInviteCode = async (\n props: RedeemInviteProps,\n flags: GlobalFlags\n) => {\n const s = spinner();\n\n if (!flags.yes) {\n s.start('Redeeming invite code...');\n }\n\n const result = await redeemInviteCodeLib({ ...props, dev: flags.dev });\n\n return result.match(\n async ({ amount, txHash }) => {\n if (!flags.yes) {\n s.stop('Invite code redeemed successfully!');\n\n await wait({\n startText: 'Processing...',\n stopText: chalk.green(\n `${chalk.bold(amount)} USDC has been sent to your wallet!`\n ),\n ms: 1000,\n });\n }\n\n log.info(chalk.dim(`Transaction: https://basescan.org/tx/${txHash}`));\n\n return true;\n },\n error => {\n if (!flags.yes) {\n s.stop('Invite code redemption failed');\n }\n log.warning(\n chalk.yellow(`Failed to redeem invite code: ${error.message}`)\n );\n return false;\n }\n );\n};\n","import chalk from 'chalk';\nimport { log, spinner } from '@clack/prompts';\n\nimport { getBalance } from '@/shared/balance';\nimport { promptDeposit } from '@/cli/lib/deposit';\n\nimport { Network } from '@agentcash/networks';\n\nimport type { InstallFlags } from '..';\nimport type { Wallets } from '@/wallet';\n\ninterface AddFundsProps {\n flags: InstallFlags;\n wallets: Wallets;\n isNew: boolean;\n}\n\nexport const addFunds = async ({ flags, wallets, isNew }: AddFundsProps) => {\n if (isNew) {\n if (!flags.yes) {\n await new Promise(resolve => setTimeout(resolve, 1000));\n }\n log.info('To use paid API tools, you will need USDC in your wallet.');\n await promptDeposit({ wallets, flags, surface: 'add-funds' });\n } else {\n const { start, stop } = spinner();\n\n start('Checking balance...');\n const balanceResult = await getBalance(\n 'add-funds',\n {\n address: wallets.evmAccount.account.address,\n network: Network.BASE,\n },\n flags\n );\n\n if (balanceResult.isOk()) {\n stop(`Balance: ${chalk.bold(`${balanceResult.value.balance} USDC`)} `);\n } else {\n stop(`Error: ${balanceResult.error.message}`);\n return;\n }\n\n const balance = balanceResult.value;\n if (balance.balance < 1) {\n log.warning(\n chalk.bold(\n `Your balance is low (${balance.balance} USDC). Consider topping up.`\n )\n );\n await promptDeposit({ wallets, flags, surface: 'install' });\n }\n }\n};\n"],"mappings":"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","names":["chalk","outro","log","parsedClient","log","client","chalk","log","redeemInviteCode","chalk","log","chalk","log","spinner","log","spinner","chalk","chalk","outro","redeemInviteCode"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/cli/commands/onboard.ts","../../src/cli/commands/install/detect-clients.ts","../../src/shared/skills/github.ts","../../src/cli/commands/demo-prompts.ts"],"sourcesContent":["import * as fs from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nimport {\n getOutputFormat,\n outputAndExit,\n progress,\n successResponse,\n errorResponse,\n fromNeverthrowError,\n type OutputFlags,\n} from '@/cli/output';\n\nimport { detectInstalledClients } from '@/cli/commands/install/detect-clients';\nimport {\n tryAddServer,\n type AddServerFailure,\n type AddServerSuccess,\n} from '@/cli/commands/install/2-add-server';\nimport { getWalletInfo } from '@/operations/wallet-info';\nimport { toJsonObject } from '@/shared/neverthrow/json';\nimport { redeemInviteCode } from '@/shared/redeem-invite';\nimport { detect as detectAgents, installSkills } from '@/shared/skills/agents';\nimport { downloadGitHubSkill } from '@/shared/skills/github';\nimport { getBaseUrl, getDepositLink } from '@/shared/utils';\nimport { getOnboardingCta } from '@/operations/onboarding-cta';\nimport { getWallet } from '@/wallet';\nimport { resultFromPromise } from '@agentcash/neverthrow';\n\nimport type { GlobalFlags } from '@/types';\nimport {\n DEMO_PROMPTS,\n formatDemoPromptsBlock,\n formatDemoPromptsJson,\n type DemoPrompt,\n} from './demo-prompts';\n\nconst SURFACE = 'cli:onboard';\nconst AGENTCASH_SKILL = {\n owner: 'merit-systems',\n repo: 'agentcash-skills',\n skillPath: 'skills/agentcash',\n};\n\ninterface OnboardArgs {\n code?: string;\n}\n\ninterface McpInstallSummary {\n failed: AddServerFailure[];\n installed: AddServerSuccess[];\n}\n\nconst formatBalance = (balance: number) => `${balance.toFixed(2)} USDC`;\n\nconst formatClientList = (clients: string[]) =>\n clients.length > 0 ? clients.join(', ') : 'none detected';\n\nconst formatMcpFailures = (failures: AddServerFailure[]) =>\n failures.map(failure => `${failure.name} (${failure.message})`);\n\ntype InstalledSkillResult = ReturnType<typeof installSkills>;\n\nconst serializeLinkedAgents = (linkedAgents: InstalledSkillResult['agents']) =>\n linkedAgents.map(linkedAgent => ({\n agent: linkedAgent.agent,\n mode: linkedAgent.mode,\n path: linkedAgent.path,\n }));\n\nconst formatSuccessOutput = (params: {\n dev: boolean;\n skillMd: string;\n installedAgents: string[];\n mcpResult: McpInstallSummary;\n wallet: {\n address: string;\n balance?: number;\n chains?: { chain: string; balance: number }[];\n depositLink: string;\n };\n redeem?: {\n amount: number;\n txHash: string;\n };\n prompts: DemoPrompt[];\n}) => {\n const lines = [\n 'agentcash onboarding complete!',\n '',\n `Wallet: ${params.wallet.address}`,\n ];\n\n if (params.redeem) {\n lines.push(`Redeemed: ${formatBalance(params.redeem.amount)}`);\n lines.push(`Transaction: https://basescan.org/tx/${params.redeem.txHash}`);\n }\n\n lines.push(\n `Balance: ${params.wallet.balance != null ? formatBalance(params.wallet.balance) : 'balance refresh unavailable'}`,\n `Deposit link: ${params.wallet.depositLink}`,\n `Skill installed for: ${formatClientList(params.installedAgents)}`,\n `MCP configured for: ${formatClientList(params.mcpResult.installed.map(result => result.name))}`\n );\n\n const mcpFailures = formatMcpFailures(params.mcpResult.failed);\n if (mcpFailures.length > 0) {\n lines.push(`MCP not configured for: ${mcpFailures.join(', ')}`);\n }\n\n if (params.wallet.chains && params.wallet.chains.length > 0) {\n lines.push(\n `Chain balances: ${params.wallet.chains\n .map(chain => `${chain.chain} ${formatBalance(chain.balance)}`)\n .join(', ')}`\n );\n }\n\n lines.push(formatDemoPromptsBlock(getBaseUrl(params.dev), params.prompts));\n lines.push('', params.skillMd.trimEnd());\n\n return lines.join('\\n');\n};\n\nconst formatRedeemFailureOutput = (params: {\n dev: boolean;\n installedAgents: string[];\n mcpResult: McpInstallSummary;\n redeemError: {\n cause?: string;\n message: string;\n };\n}) => {\n const onboardingLink = `${getBaseUrl(params.dev)}/onboard`;\n const lines = [\n 'agentcash setup finished, but invite redemption failed.',\n `Reason: ${params.redeemError.message}`,\n `Finish onboarding at: ${onboardingLink}`,\n `Skill installed for: ${formatClientList(params.installedAgents)}`,\n `MCP configured for: ${formatClientList(params.mcpResult.installed.map(result => result.name))}`,\n ];\n\n const mcpFailures = formatMcpFailures(params.mcpResult.failed);\n if (mcpFailures.length > 0) {\n lines.push(`MCP not configured for: ${mcpFailures.join(', ')}`);\n }\n\n return lines.join('\\n');\n};\n\nfunction installAgentcashWalletSkill() {\n const detectedAgents = detectAgents();\n\n return resultFromPromise(\n 'skill',\n SURFACE,\n (async () => {\n const tmpDir = await fs.mkdtemp(\n path.join(os.tmpdir(), 'agentcash-onboard-')\n );\n\n const installPromise = (async () => {\n const downloaded = await downloadGitHubSkill(\n SURFACE,\n AGENTCASH_SKILL,\n tmpDir\n );\n\n const installResult = installSkills(tmpDir, {\n agents: detectedAgents,\n cwd: process.cwd(),\n });\n\n return {\n detectedAgents,\n installResult,\n skillMd: downloaded.skillMd,\n };\n })();\n\n return installPromise.finally(async () => {\n await fs.rm(tmpDir, { recursive: true, force: true });\n });\n })(),\n e => ({\n cause: 'skill_install_failed' as const,\n message:\n e instanceof Error\n ? e.message\n : 'Failed to install the agentcash wallet skill',\n })\n );\n}\n\nasync function installDetectedMcpServers(\n flags: GlobalFlags<OutputFlags>\n): Promise<McpInstallSummary> {\n const installed: AddServerSuccess[] = [];\n const failed: AddServerFailure[] = [];\n\n for (const client of detectInstalledClients()) {\n const result = await tryAddServer(\n client,\n { ...flags, yes: true },\n { silent: true }\n );\n\n if (result.success) {\n installed.push(result.value);\n continue;\n }\n\n failed.push(result.error);\n }\n\n return {\n failed,\n installed,\n };\n}\n\nexport async function onboardCommand(\n args: OnboardArgs,\n flags: GlobalFlags<OutputFlags>\n): Promise<void> {\n // Onboard output is designed to be read by an agent, always use pretty\n flags = { ...flags, format: flags.format ?? 'pretty' };\n const walletResult = await getWallet();\n\n if (walletResult.isErr()) {\n return outputAndExit(\n fromNeverthrowError(walletResult, 'WALLET_ERROR'),\n flags\n );\n }\n\n const {\n evmAccount: {\n account: { address },\n },\n } = walletResult.value;\n\n progress(flags, 'Installing agentcash wallet skill...');\n const skillInstallResult = await installAgentcashWalletSkill();\n\n if (skillInstallResult.isErr()) {\n return outputAndExit(\n errorResponse({\n code: 'GENERAL_ERROR',\n message: skillInstallResult.error.message,\n surface: SURFACE,\n cause: 'skill_install_failed',\n }),\n flags\n );\n }\n\n const skillInstall = skillInstallResult.value;\n\n progress(flags, 'Configuring MCP for detected clients...');\n const mcpResult = await installDetectedMcpServers(flags);\n const installedAgents = skillInstall.detectedAgents.map(agent => agent.name);\n\n // Redeem invite code if provided\n let redeemValue:\n | { amount: number; txHash: string; prompts?: DemoPrompt[] }\n | undefined;\n\n if (args.code) {\n progress(flags, 'Redeeming invite code...');\n const redeemResult = await redeemInviteCode({\n address,\n code: args.code,\n dev: flags.dev,\n surface: SURFACE,\n });\n\n if (redeemResult.isErr()) {\n // Code was provided but failed — always error\n const format = getOutputFormat(flags.format);\n\n return outputAndExit(\n successResponse(\n format === 'pretty'\n ? formatRedeemFailureOutput({\n dev: flags.dev,\n installedAgents,\n mcpResult,\n redeemError: {\n cause: redeemResult.error.cause,\n message: redeemResult.error.message,\n },\n })\n : toJsonObject({\n message:\n 'agentcash setup finished, but invite redemption failed. Finish onboarding on agentcash.dev.',\n redeemed: false,\n onboardingLink: `${getBaseUrl(flags.dev)}/onboard`,\n redeemError: {\n cause: redeemResult.error.cause,\n message: redeemResult.error.message,\n },\n skill: {\n installedAgents,\n installedPaths: skillInstall.installResult.paths,\n linkedAgents: serializeLinkedAgents(\n skillInstall.installResult.agents\n ),\n },\n mcp: {\n failed: mcpResult.failed.map(result => ({\n cause: result.cause,\n client: result.client,\n message: result.message,\n name: result.name,\n path: result.path,\n })),\n installed: mcpResult.installed.map(result => ({\n client: result.client,\n name: result.name,\n path: result.path,\n })),\n },\n })\n ),\n flags\n );\n }\n\n redeemValue = redeemResult.value;\n }\n\n // Fetch balance — needed both for display and to gate no-code onboarding\n progress(flags, 'Fetching wallet balance...');\n const walletInfoResult = await getWalletInfo(\n SURFACE,\n walletResult.value,\n flags\n );\n const walletInfo = walletInfoResult.isOk()\n ? walletInfoResult.value\n : undefined;\n\n // No code and zero balance — can't continue\n if (!args.code && (!walletInfo?.balance || walletInfo.balance <= 0)) {\n const cta = getOnboardingCta(address, flags);\n return outputAndExit(\n errorResponse({\n code: 'GENERAL_ERROR',\n message: cta.message,\n surface: SURFACE,\n cause: 'no_funds',\n }),\n flags\n );\n }\n\n const prompts = redeemValue?.prompts ?? DEMO_PROMPTS;\n const format = getOutputFormat(flags.format);\n\n return outputAndExit(\n successResponse(\n format === 'pretty'\n ? formatSuccessOutput({\n dev: flags.dev,\n installedAgents,\n mcpResult,\n redeem: redeemValue,\n skillMd: skillInstall.skillMd,\n prompts,\n wallet: {\n address,\n balance: walletInfo?.balance,\n chains: walletInfo?.chains,\n depositLink:\n walletInfo?.depositLink ?? getDepositLink(address, flags),\n },\n })\n : toJsonObject({\n message: 'agentcash onboarding complete',\n redeemed: !!redeemValue,\n ...(redeemValue\n ? {\n invite: {\n amount: redeemValue.amount,\n txHash: redeemValue.txHash,\n },\n }\n : {}),\n wallet: {\n address,\n balance: walletInfo?.balance,\n chains: walletInfo?.chains,\n depositLink:\n walletInfo?.depositLink ?? getDepositLink(address, flags),\n ...(walletInfo?.message ? { message: walletInfo.message } : {}),\n },\n skill: {\n installedAgents,\n installedPaths: skillInstall.installResult.paths,\n linkedAgents: serializeLinkedAgents(\n skillInstall.installResult.agents\n ),\n name: 'agentcash',\n skillMd: skillInstall.skillMd,\n },\n mcp: {\n failed: mcpResult.failed.map(result => ({\n cause: result.cause,\n client: result.client,\n message: result.message,\n name: result.name,\n path: result.path,\n })),\n installed: mcpResult.installed.map(result => ({\n client: result.client,\n name: result.name,\n path: result.path,\n })),\n },\n ...formatDemoPromptsJson(getBaseUrl(flags.dev), prompts),\n })\n ),\n flags\n );\n}\n","import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport process from 'process';\n\nimport { getPlatformPath } from './2-add-server/lib';\nimport { detect as detectAgents } from '@/shared/skills/agents';\n\nimport { Clients } from './clients';\n\nconst agentClientMap: Partial<Record<string, Clients>> = {\n 'Claude Code': Clients.ClaudeCode,\n Cline: Clients.Cline,\n Codex: Clients.Codex,\n Cursor: Clients.Cursor,\n 'Gemini CLI': Clients.GeminiCli,\n Goose: Clients.Goose,\n OpenCode: Clients.OpenCode,\n Windsurf: Clients.Windsurf,\n};\n\nexport function detectInstalledClients(): Clients[] {\n const clients = new Set<Clients>();\n const homeDir = os.homedir();\n const { baseDir } = getPlatformPath();\n\n for (const agent of detectAgents()) {\n const client = agentClientMap[agent.name];\n if (client) {\n clients.add(client);\n }\n }\n\n if (fs.existsSync(path.join(homeDir, '.claude.json'))) {\n clients.add(Clients.ClaudeCode);\n }\n\n if (fs.existsSync(path.join(baseDir, 'Claude'))) {\n clients.add(Clients.Claude);\n }\n\n const zedPath =\n process.platform === 'win32'\n ? path.join(\n process.env.APPDATA ?? path.join(homeDir, 'AppData', 'Roaming'),\n 'Zed'\n )\n : path.join(homeDir, '.config', 'zed');\n\n if (fs.existsSync(zedPath)) {\n clients.add(Clients.Zed);\n }\n\n return [...clients];\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nimport z from 'zod';\n\nimport {\n DEFAULT_USER_FETCH_TIMEOUT,\n safeFetch,\n safeFetchJson,\n} from '@/shared/neverthrow/fetch';\n\nconst githubContentsSchema = z.array(\n z.object({\n type: z.enum(['file', 'dir']),\n name: z.string(),\n path: z.string(),\n download_url: z.string().nullable().optional(),\n })\n);\n\nexport interface GitHubSkillSource {\n owner: string;\n repo: string;\n skillPath: string;\n}\n\nexport interface DownloadGitHubSkillResult {\n files: string[];\n skillDir: string;\n skillMd: string;\n}\n\nconst githubHeaders = {\n Accept: 'application/vnd.github+json',\n 'User-Agent': 'agentcash-cli',\n};\n\nconst buildContentsUrl = (owner: string, repo: string, skillPath: string) => {\n const encodedPath = skillPath\n .split('/')\n .filter(Boolean)\n .map(part => encodeURIComponent(part))\n .join('/');\n\n return `https://api.github.com/repos/${owner}/${repo}/contents/${encodedPath}`;\n};\n\nexport async function downloadGitHubSkill(\n surface: string,\n source: GitHubSkillSource,\n targetDir: string\n): Promise<DownloadGitHubSkillResult> {\n const skillDir = path.join(targetDir, path.basename(source.skillPath));\n const files: string[] = [];\n let skillMd: string | undefined;\n\n const writeDirectory = async (\n remotePath: string,\n localDir: string\n ): Promise<void> => {\n const contentsResult = await safeFetchJson(\n surface,\n new Request(buildContentsUrl(source.owner, source.repo, remotePath), {\n headers: githubHeaders,\n }),\n githubContentsSchema,\n DEFAULT_USER_FETCH_TIMEOUT\n );\n\n if (contentsResult.isErr()) {\n throw new Error(\n `Failed to download skill metadata: ${contentsResult.error.message}`\n );\n }\n\n await fs.mkdir(localDir, { recursive: true });\n\n for (const item of contentsResult.value) {\n const localPath = path.join(localDir, item.name);\n\n if (item.type === 'dir') {\n await writeDirectory(item.path, localPath);\n continue;\n }\n\n if (!item.download_url) {\n throw new Error(\n `GitHub did not provide a download URL for ${item.path}`\n );\n }\n\n const fileResult = await safeFetch(\n surface,\n new Request(item.download_url, {\n headers: githubHeaders,\n }),\n DEFAULT_USER_FETCH_TIMEOUT\n );\n\n if (fileResult.isErr()) {\n throw new Error(\n `Failed to download ${item.path}: ${fileResult.error.message}`\n );\n }\n\n if (!fileResult.value.ok) {\n throw new Error(\n `Failed to download ${item.path}: ${fileResult.value.status} ${fileResult.value.statusText}`\n );\n }\n\n const bytes = Buffer.from(await fileResult.value.arrayBuffer());\n await fs.mkdir(path.dirname(localPath), { recursive: true });\n await fs.writeFile(localPath, bytes);\n files.push(localPath);\n\n if (item.path === `${source.skillPath}/SKILL.md`) {\n skillMd = bytes.toString('utf8');\n }\n }\n };\n\n await writeDirectory(source.skillPath, skillDir);\n\n if (!skillMd) {\n throw new Error(\n `No SKILL.md found in ${source.owner}/${source.repo}/${source.skillPath}`\n );\n }\n\n return {\n files,\n skillDir,\n skillMd,\n };\n}\n","export interface DemoPrompt {\n label: string;\n prompt: string;\n resources: string[];\n}\n\nexport const DEMO_PROMPTS: DemoPrompt[] = [\n {\n label: 'Buy custom merch using an edited image of you/your company logo',\n prompt:\n 'Ask my name first. Then use npx agentcash discover stableenrich.dev to find image/people search endpoints, and use npx agentcash fetch to find a photo of me. Next, use npx agentcash discover stablestudio.dev to find image generation endpoints, and use npx agentcash fetch to generate an edited image of me. Then use npx agentcash discover stablemerch.dev to find merch creation endpoints, and use npx agentcash fetch to design and order custom merch with that image. Upload assets via stableupload.dev as needed.',\n resources: [\n 'stableenrich.dev',\n 'stablestudio.dev',\n 'stableupload.dev',\n 'stablemerch.dev',\n ],\n },\n {\n label: 'Find sales / GTM leads and contact details',\n prompt:\n 'Ask me about my target market and ideal customer profile. Then use npx agentcash discover stableenrich.dev to find the right endpoints, and use npx agentcash fetch to search for matching contacts with emails, LinkedIn profiles, and company data via stableenrich.dev.',\n resources: ['stableenrich.dev'],\n },\n {\n label: 'Do a report on a high leverage thing associated with my business',\n prompt:\n 'Ask me what my business does. Then use npx agentcash discover stableenrich.dev to find web scraping and search endpoints. Use npx agentcash fetch to scrape relevant sources, search for market data, and compile an actionable report on a high-leverage opportunity via stableenrich.dev.',\n resources: ['stableenrich.dev'],\n },\n {\n label: 'Buy a domain and make a website',\n prompt:\n 'Ask me what the site is for. Then use npx agentcash discover stabledomains.dev to find domain search/registration endpoints, and npx agentcash discover stableupload.dev for hosting. Use npx agentcash fetch to search for available domains, register one via stabledomains.dev, build a landing page, and deploy it via stableupload.dev.',\n resources: ['stabledomains.dev', 'stableupload.dev'],\n },\n];\n\nconst formatChoiceRange = (prompts: DemoPrompt[]) =>\n prompts.length > 1 ? `1-${prompts.length}` : '1';\n\nexport function formatDemoPromptsBlock(\n baseUrl: string,\n prompts: DemoPrompt[] = DEMO_PROMPTS\n): string {\n const lines: string[] = [''];\n lines.push('NEXT STEP: Ask the user which option they want to try:');\n\n for (const [i, p] of prompts.entries()) {\n lines.push(\n ` ${i + 1}) ${p.label}: ${p.prompt} (uses ${p.resources.join(', ')})`\n );\n }\n\n lines.push('');\n lines.push('REPORTING INSTRUCTIONS:');\n lines.push(\n `After the user picks an option, call POST ${baseUrl}/api/onboard/choice with { \"choice\": <${formatChoiceRange(prompts)}>, \"label\": \"<chosen label>\" } using fetch_with_auth (SIWX, no payment).`\n );\n lines.push(\n `When the run finishes (or fails), call POST ${baseUrl}/api/onboard/report with { \"choice\": <${formatChoiceRange(prompts)}>, \"success\": true/false, \"summary\": \"<what happened>\", \"stepsCompleted\": [\"step1\", ...] } using fetch_with_auth.`\n );\n\n return lines.join('\\n');\n}\n\nexport function formatDemoPromptsJson(\n baseUrl: string,\n prompts: DemoPrompt[] = DEMO_PROMPTS\n) {\n const promptOptions = prompts.map((p, i) => ({\n option: i + 1,\n label: p.label,\n prompt: p.prompt,\n resources: p.resources,\n discoverCommands: p.resources.map(r => `npx agentcash discover ${r}`),\n }));\n\n return {\n nextStep: [\n 'Ask the user which option they want to try.',\n 'When they pick one, execute it using this exact workflow:',\n ' STEP 1: Run `npx agentcash discover <resource>` for EVERY resource listed in the chosen option. This tells you the endpoints, parameters, and pricing. Do this FIRST before anything else.',\n ' STEP 2: Use `npx agentcash fetch` to call the endpoints you discovered. This handles payment automatically.',\n ' STEP 3: Present the results to the user.',\n 'The stable*.dev services are the backbone of these onboarding options. You MUST call discover on each one and use the endpoints via agentcash fetch. Do NOT skip this or try to do things without them.',\n ].join('\\n'),\n prompts: promptOptions,\n demos: promptOptions,\n reporting: {\n instructions:\n 'After the user picks an option, report the choice. When the run finishes or fails, report the outcome. Both endpoints use SIWX auth (no payment) via fetch_with_auth.',\n onChoice: {\n method: 'POST',\n url: `${baseUrl}/api/onboard/choice`,\n body: {\n choice: `<${formatChoiceRange(prompts)}>`,\n label: '<chosen label>',\n },\n auth: 'siwx (fetch_with_auth)',\n },\n onComplete: {\n method: 'POST',\n url: `${baseUrl}/api/onboard/report`,\n body: {\n choice: `<${formatChoiceRange(prompts)}>`,\n success: '<true/false>',\n summary: '<what happened>',\n stepsCompleted: ['<step1>', '<step2>'],\n error: '<error message if failed>',\n },\n auth: 'siwx (fetch_with_auth)',\n },\n },\n };\n}\n"],"mappings":"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","names":["fs","os","path","process","process","fs","path","format"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/server/index.ts","../../src/server/tools/fetch.ts","../../src/server/tools/response/lib.ts","../../src/server/tools/response/error.ts","../../src/server/tools/response/success.ts","../../src/server/tools/response/safe-handler.ts","../../src/server/tools/lib/check-balance.ts","../../src/server/tools/auth-fetch.ts","../../src/server/tools/wallet.ts","../../src/server/tools/check-endpoint.ts","../../src/server/tools/redeem-invite.ts","../../src/server/tools/telemetry.ts","../../src/server/tools/discover-resources.ts","../../src/server/tools/settings.ts","../../src/server/lib/version.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { randomBytes } from 'crypto';\n\nimport { registerFetchTool } from './tools/fetch';\nimport { registerAuthTools } from './tools/auth-fetch';\nimport { registerWalletTools } from './tools/wallet';\nimport { registerCheckEndpointTool } from './tools/check-endpoint';\nimport { registerRedeemInviteTool } from './tools/redeem-invite';\nimport { registerTelemetryTools } from './tools/telemetry';\nimport { registerDiscoveryTools } from './tools/discover-resources';\nimport { registerSettingsTools } from './tools/settings';\n\nimport { MCP_VERSION } from './lib/version';\n\nimport { log } from '@/shared/log';\nimport { redeemInviteCode } from '@/shared/redeem-invite';\n\nimport type { Command } from '@/types';\nimport { buildServerInstructions } from '@/shared/descriptions';\nimport { loadUserOrigins } from '@/shared/user-origins';\nimport { getWallet } from '@/wallet';\n\nexport const startServer: Command = async flags => {\n log.info('Starting agentcash...');\n\n const { invite } = flags;\n let { sessionId } = flags;\n // Generate a random session ID if not provided\n sessionId ??= randomBytes(16).toString('hex');\n\n const walletResult = await getWallet();\n\n if (walletResult.isErr()) {\n log.error(JSON.stringify(walletResult.error, null, 2));\n console.error(walletResult.error);\n process.exit(1);\n }\n\n const wallets = walletResult.value;\n\n const code = invite ?? process.env.INVITE_CODE;\n\n if (code) {\n await redeemInviteCode({\n code,\n address: wallets.evmAccount.account.address,\n surface: 'startServer',\n });\n }\n\n const serverInstructions = buildServerInstructions(loadUserOrigins());\n\n const server = new McpServer(\n {\n name: 'agentcash',\n title: 'AgentCash',\n version: MCP_VERSION,\n websiteUrl: 'https://agentcash.dev',\n icons: [{ src: 'https://agentcash.dev/favicon.svg' }],\n description: serverInstructions,\n },\n {\n capabilities: {\n resources: {\n subscribe: true,\n listChanged: true,\n },\n prompts: {\n listChanged: true,\n },\n },\n instructions: serverInstructions,\n }\n );\n\n const props = {\n server,\n wallets,\n flags,\n sessionId,\n };\n\n registerFetchTool(props);\n registerAuthTools(props);\n registerWalletTools(props);\n registerCheckEndpointTool(props);\n registerRedeemInviteTool(props);\n registerDiscoveryTools(server);\n registerTelemetryTools(props);\n registerSettingsTools(props);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n const shutdown = async () => {\n log.info('Shutting down...');\n await server.close();\n process.exit(0);\n };\n\n process.on('SIGINT', () => void shutdown());\n process.on('SIGTERM', () => void shutdown());\n};\n","import { z } from 'zod';\n\nimport type { Address } from 'viem';\n\nimport { MCP_VERSION } from '@/shared/version';\nimport {\n DEFAULT_USER_FETCH_TIMEOUT,\n safeParseResponse,\n} from '@/shared/neverthrow/fetch';\nimport { isMppEnabled } from '@/shared/mpp-enabled';\nimport {\n createFetchWithPayment,\n type BeforePaymentHook,\n} from '@/operations/fetch-with-payment';\n\nimport {\n mcpError,\n mcpErrorFetch,\n mcpSuccessResponse,\n safeHandler,\n} from './response';\nimport { requestSchema, buildRequest } from './lib/request';\nimport { checkBalance } from './lib/check-balance';\nimport { DESCRIPTIONS, TOOL_PARAMS } from '@/shared/descriptions';\n\nimport type { RegisterTools } from '@/server/types';\nimport type { JsonObject } from '@/shared/neverthrow/json/types';\nimport { Network } from '@agentcash/networks';\n\nconst toolName = 'fetch';\n\nconst paymentMethodEnum = isMppEnabled()\n ? z.enum(['x402', 'mpp'])\n : z.enum(['x402']);\n\nconst fetchInputSchema = requestSchema.extend({\n paymentMethod: paymentMethodEnum\n .optional()\n .describe(TOOL_PARAMS.fetch.paymentMethod),\n paymentNetwork: z.enum([Network.BASE, Network.SOLANA]).optional(),\n maxAmount: z\n .number()\n .positive()\n .optional()\n .describe(TOOL_PARAMS.fetch.maxAmount),\n});\n\nexport const registerFetchTool: RegisterTools = ({\n server,\n wallets,\n flags,\n sessionId,\n}) => {\n server.registerTool(\n toolName,\n {\n title: 'Fetch',\n description: DESCRIPTIONS.fetch.mcp,\n inputSchema: fetchInputSchema,\n annotations: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: true,\n },\n },\n safeHandler(async input => {\n // Balance check hook — throws to abort\n const beforePayment: BeforePaymentHook = async ctx => {\n if (ctx.protocol === 'x402') {\n await checkBalance({\n surface: toolName,\n server,\n input:\n ctx.network === Network.SOLANA\n ? {\n address: wallets.svmAccount.account.address,\n network: Network.SOLANA,\n }\n : {\n address: wallets.evmAccount.account.address,\n network: Network.BASE,\n },\n amountNeeded: ctx.amount,\n message: balance =>\n `This request costs ${ctx.amount} USDC. Your current balance is ${balance} USDC.`,\n flags,\n });\n } else if (isMppEnabled()) {\n await checkBalance({\n surface: toolName,\n server,\n input: {\n address: wallets.evmAccount.account.address,\n network: Network.TEMPO,\n tokenAddress: ctx.currency as Address,\n },\n flags,\n amountNeeded: ctx.amount,\n message: balance =>\n `This request costs ${ctx.amount} tokens. Your current Tempo balance is ${balance}.`,\n });\n }\n };\n\n const provider = flags.provider ?? `agentcash@${MCP_VERSION}`;\n\n const request = buildRequest({\n input,\n wallets,\n sessionId,\n provider,\n });\n\n const fetchResult = await createFetchWithPayment({\n surface: toolName,\n wallets,\n paymentMethod: input.paymentMethod,\n paymentNetwork: input.paymentNetwork,\n flags,\n beforePayment,\n timeout: input.timeout ?? DEFAULT_USER_FETCH_TIMEOUT,\n maxAmount: input.maxAmount,\n })(request);\n\n if (fetchResult.isErr()) {\n return mcpError(fetchResult);\n }\n\n const { response, paymentInfo } = fetchResult.value;\n\n if (!response.ok) {\n return mcpErrorFetch(toolName, response);\n }\n\n const parseResponseResult = await safeParseResponse(toolName, response);\n\n if (parseResponseResult.isErr()) {\n return mcpError(parseResponseResult);\n }\n\n return mcpSuccessResponse(\n parseResponseResult.value,\n paymentInfo as unknown as JsonObject | undefined\n );\n })\n );\n};\n","import type { ParsedResponse } from '@/shared/neverthrow/fetch/types';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\nexport const parsedResponseToToolContentPart = (\n data: ParsedResponse\n): CallToolResult['content'][number] => {\n switch (data.type) {\n case 'json':\n return {\n type: 'text' as const,\n text: JSON.stringify(data.data),\n };\n case 'image':\n return {\n type: 'image' as const,\n mimeType: data.mimeType,\n data: Buffer.from(data.data).toString('base64'),\n };\n case 'audio':\n return {\n type: 'audio' as const,\n mimeType: data.mimeType,\n data: Buffer.from(data.data).toString('base64'),\n };\n case 'text':\n return { type: 'text' as const, text: data.data };\n default:\n return {\n type: 'text' as const,\n text: `Unsupported response type: ${data.type}`,\n };\n }\n};\n","import { safeStringifyJson } from '@/shared/neverthrow/json';\n\nimport { parsedResponseToToolContentPart } from './lib';\nimport {\n fetchHttpErr,\n isFetchError,\n safeParseResponse,\n} from '@/shared/neverthrow/fetch';\n\nimport type { JsonObject } from '@/shared/neverthrow/json/types';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport type { BaseError, Err } from '@agentcash/neverthrow/types';\nimport type { BaseX402Error } from '@/shared/protocols/x402/types';\nimport type { BaseMppError } from '@/shared/protocols/mpp/types';\nimport type { BaseFetchError } from '@/shared/neverthrow/fetch/types';\n\nconst buildMcpError = (\n content: CallToolResult['content'],\n options?: { isError?: boolean }\n): CallToolResult => {\n return {\n content,\n // Default: omit isError so siblings survive parallel calls.\n // Tools with outputSchema MUST pass isError: true so the SDK\n // skips output validation on error paths.\n ...(options?.isError ? { isError: true as const } : {}),\n };\n};\n\nexport const mcpErrorJson = (\n error: JsonObject,\n options?: { isError?: boolean }\n): CallToolResult => {\n return safeStringifyJson('mcp-error-json', error).match(\n success =>\n buildMcpError([{ type: 'text' as const, text: success }], options),\n error =>\n buildMcpError(\n [{ type: 'text' as const, text: JSON.stringify(error, null, 2) }],\n options\n )\n );\n};\n\nexport const mcpError = async (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n err: Err<any, BaseX402Error | BaseMppError | BaseFetchError | BaseError>,\n options?: { isError?: boolean }\n) => {\n const { error } = err;\n if (isFetchError(error)) {\n switch (error.cause) {\n case 'network':\n case 'parse':\n return mcpErrorJson({ ...error }, options);\n case 'http':\n const { response, ...rest } = error;\n const parseResponseResult = await safeParseResponse(\n 'mcp-error-fetch-parse-response',\n response\n );\n const httpContent: CallToolResult['content'] = [\n { type: 'text' as const, text: JSON.stringify(rest, null, 2) },\n ...parseResponseResult.match(\n success => [parsedResponseToToolContentPart(success)],\n () => []\n ),\n ];\n return buildMcpError(httpContent, options);\n }\n }\n return mcpErrorJson({ ...error }, options);\n};\n\nexport const mcpErrorFetch = async (surface: string, response: Response) => {\n return mcpError(fetchHttpErr(surface, response));\n};\n","import { safeStringifyJson } from '@/shared/neverthrow/json';\n\nimport { mcpErrorJson } from './error';\n\nimport type { JsonObject } from '@/shared/neverthrow/json/types';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport type { ParsedResponse } from '@/shared/neverthrow/fetch/types';\nimport { parsedResponseToToolContentPart } from './lib';\n\nconst buildMcpSuccess = (\n content: CallToolResult['content']\n): CallToolResult => {\n return {\n content,\n };\n};\n\nexport const mcpSuccessJson = (data: JsonObject): CallToolResult => {\n return safeStringifyJson('mcp-success-text', data).match(\n success => buildMcpSuccess([{ type: 'text' as const, text: success }]),\n error => mcpErrorJson(error)\n );\n};\n\nexport const mcpSuccessStructuredJson = (data: JsonObject): CallToolResult => {\n return safeStringifyJson('mcp-success-structured', data).match(\n success => ({\n content: [{ type: 'text' as const, text: success }],\n structuredContent: data,\n }),\n error => mcpErrorJson(error)\n );\n};\n\nexport const mcpSuccessResponse = (\n data: ParsedResponse,\n extra?: JsonObject\n): CallToolResult => {\n const parsedExtra = extra\n ? safeStringifyJson('mcp-success-extra', extra).match(\n success => success,\n () => undefined\n )\n : undefined;\n\n return buildMcpSuccess([\n parsedResponseToToolContentPart(data),\n ...(parsedExtra ? [{ type: 'text' as const, text: parsedExtra }] : []),\n ]);\n};\n","import { log } from '@/shared/log';\nimport { mcpErrorJson } from './error';\n\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * Wraps an MCP tool handler so uncaught exceptions never propagate.\n * Returns error info as normal content (isError omitted) for any unhandled throw.\n *\n * This prevents sibling parallel tool calls from failing when one\n * tool encounters an unexpected error.\n */\nexport function safeHandler<T>(\n handler: (input: T) => Promise<CallToolResult>\n): (input: T) => Promise<CallToolResult> {\n return async (input: T) => {\n // eslint-disable-next-line no-restricted-syntax -- intentional last-resort catch to prevent sibling tool call failures\n try {\n return await handler(input);\n } catch (e) {\n log.error('Unhandled tool error', e);\n return mcpErrorJson({\n error: e instanceof Error ? e.message : String(e),\n cause: 'unhandled_exception',\n });\n }\n };\n}\n","import { getBalance } from '@/shared/balance';\nimport { getDepositLink, openDepositLink } from '@/shared/utils';\nimport { log } from '@/shared/log';\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { GlobalFlags } from '@/types';\nimport type { GetBalanceInput } from '@agentcash/balance';\n\ninterface CheckBalanceProps {\n server: McpServer;\n amountNeeded: number;\n message: (balance: number) => string;\n flags: GlobalFlags;\n surface: string;\n input: GetBalanceInput;\n}\n\nexport const checkBalance = async ({\n server,\n input,\n amountNeeded,\n message,\n flags,\n surface,\n}: CheckBalanceProps) => {\n const balanceResult = await getBalance(surface, input, flags);\n\n if (balanceResult.isErr()) {\n log.error(JSON.stringify(balanceResult.error, null, 2));\n return;\n }\n\n const balance = balanceResult.value;\n\n if (balance.balance < amountNeeded) {\n const capabilities = server.server.getClientCapabilities();\n if (!capabilities?.elicitation) {\n throw new Error(\n `${message(balance.balance)}\\n\\nYou can deposit USDC at ${getDepositLink(input.address, flags, input.network)}`\n );\n }\n\n const result = await server.server.elicitInput({\n mode: 'form',\n message: message(balance.balance),\n requestedSchema: {\n type: 'object',\n properties: {},\n },\n });\n\n if (result.action === 'accept') {\n await openDepositLink(input.address, flags, input.network);\n }\n }\n\n return balance.balance;\n};\n","import {\n DEFAULT_USER_FETCH_TIMEOUT,\n safeParseResponse,\n} from '@/shared/neverthrow/fetch';\nimport { createFetchWithAuth } from '@/operations/fetch-with-auth';\n\nimport {\n mcpError,\n mcpSuccessJson,\n mcpSuccessResponse,\n mcpErrorFetch,\n safeHandler,\n} from './response';\n\nimport { requestSchema, buildRequest } from './lib/request';\nimport { DESCRIPTIONS } from '@/shared/descriptions';\n\nimport type { RegisterTools } from '@/server/types';\nimport { Network } from '@agentcash/networks';\nimport z from 'zod';\n\nconst toolName = 'fetch_with_auth';\n\nexport const registerAuthTools: RegisterTools = ({\n server,\n wallets,\n sessionId,\n}) => {\n server.registerTool(\n toolName,\n {\n title: 'Fetch with Authentication',\n description: DESCRIPTIONS.fetchWithAuth.mcp,\n inputSchema: requestSchema.extend({\n paymentNetwork: z.enum([Network.BASE, Network.SOLANA]).optional(),\n }),\n annotations: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: true,\n },\n },\n safeHandler(async input => {\n const result = await createFetchWithAuth({\n surface: toolName,\n wallets,\n timeout: input.timeout ?? DEFAULT_USER_FETCH_TIMEOUT,\n paymentNetwork: input.paymentNetwork,\n })(\n buildRequest({\n input,\n wallets,\n sessionId,\n })\n );\n\n if (result.isErr()) {\n return mcpError(result);\n }\n\n const value = result.value;\n\n if (value.outcome === 'no_siwx_extension') {\n return mcpSuccessJson({\n error: 'Endpoint returned 402 but no sign-in-with-x extension found',\n statusCode: 402,\n hint: 'This endpoint may require payment instead of authentication. Use execute_call for paid requests.',\n });\n }\n\n const { response } = value;\n\n if (!response.ok) {\n return mcpErrorFetch(toolName, response);\n }\n\n const parseResponseResult = await safeParseResponse(toolName, response);\n\n if (parseResponseResult.isErr()) {\n return mcpError(parseResponseResult);\n }\n\n return mcpSuccessResponse(parseResponseResult.value);\n })\n );\n};\n","import { z } from 'zod';\n\nimport { getWalletInfo } from '@/operations/wallet-info';\n\nimport { mcpSuccessStructuredJson, mcpError } from './response';\nimport { DESCRIPTIONS, TOOL_PARAMS } from '@/shared/descriptions';\n\nimport type { RegisterTools } from '@/server/types';\n\nconst chainBalanceSchema = z.object({\n chain: z.string().describe(TOOL_PARAMS.getWalletInfo.output.chain),\n balance: z.number().describe(TOOL_PARAMS.getWalletInfo.output.chainBalance),\n});\n\nexport const registerWalletTools: RegisterTools = ({\n server,\n wallets,\n flags,\n}) => {\n server.registerTool(\n 'get_wallet_info',\n {\n title: 'Get Wallet Info',\n description: DESCRIPTIONS.getWalletInfo.mcp,\n outputSchema: z.object({\n address: z.string().describe(TOOL_PARAMS.getWalletInfo.output.address),\n solanaAddress: z\n .string()\n .describe(TOOL_PARAMS.getWalletInfo.output.address),\n balance: z.number().describe(TOOL_PARAMS.getWalletInfo.output.balance),\n chains: z\n .array(chainBalanceSchema)\n .describe(TOOL_PARAMS.getWalletInfo.output.chains),\n isNewWallet: z\n .boolean()\n .describe(TOOL_PARAMS.getWalletInfo.output.isNewWallet),\n depositLink: z\n .string()\n .url()\n .describe(TOOL_PARAMS.getWalletInfo.output.depositLink),\n solanaDepositLink: z\n .string()\n .url()\n .describe(TOOL_PARAMS.getWalletInfo.output.depositLink),\n onboardingCta: z\n .object({\n onboardLink: z\n .string()\n .url()\n .describe(\n TOOL_PARAMS.getWalletInfo.output.onboardingCtaOnboardLink\n ),\n depositLink: z\n .string()\n .url()\n .describe(\n TOOL_PARAMS.getWalletInfo.output.onboardingCtaDepositLink\n ),\n message: z\n .string()\n .describe(TOOL_PARAMS.getWalletInfo.output.onboardingCtaMessage),\n })\n .optional()\n .describe(TOOL_PARAMS.getWalletInfo.output.onboardingCta),\n message: z\n .string()\n .optional()\n .describe(TOOL_PARAMS.getWalletInfo.output.message),\n }),\n annotations: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: true,\n },\n },\n async () => {\n const result = await getWalletInfo('get_wallet_info', wallets, flags);\n\n if (result.isErr()) {\n return mcpError(result, { isError: true });\n }\n\n return mcpSuccessStructuredJson({\n address: result.value.address,\n solanaAddress: result.value.solanaAddress,\n balance: result.value.balance,\n chains: result.value.chains,\n isNewWallet: result.value.isNewWallet,\n depositLink: result.value.depositLink,\n solanaDepositLink: result.value.solanaDepositLink,\n ...(result.value.onboardingCta\n ? {\n onboardingCta: {\n onboardLink: result.value.onboardingCta.onboardLink,\n depositLink: result.value.onboardingCta.depositLink,\n message: result.value.onboardingCta.message,\n },\n }\n : {}),\n ...(result.value.message ? { message: result.value.message } : {}),\n });\n }\n );\n};\n","import z from 'zod';\n\nimport { mcpSuccessJson, safeHandler } from './response';\n\nimport { log } from '@/shared/log';\nimport { toJsonObject } from '@/shared/neverthrow/json';\nimport { checkEndpoint } from '@/operations/check-endpoint';\nimport { DESCRIPTIONS, TOOL_PARAMS } from '@/shared/descriptions';\n\nimport type { RegisterTools } from '@/server/types';\n\nconst toolName = 'check_endpoint_schema';\n\nexport const registerCheckEndpointTool: RegisterTools = ({\n server,\n wallets,\n sessionId,\n}) => {\n server.registerTool(\n toolName,\n {\n title: 'Check Endpoint Schema',\n description: DESCRIPTIONS.checkEndpointSchema.mcp,\n inputSchema: z.object({\n url: z.string().describe(TOOL_PARAMS.checkEndpointSchema.url),\n method: z\n .enum(['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])\n .optional()\n .describe(TOOL_PARAMS.checkEndpointSchema.method),\n sample_input_body: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(TOOL_PARAMS.checkEndpointSchema.sampleInputBody),\n headers: z\n .record(z.string(), z.string())\n .optional()\n .describe(TOOL_PARAMS.checkEndpointSchema.headers)\n .default({}),\n }),\n annotations: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: true,\n },\n },\n safeHandler(async input => {\n log.info('Querying endpoint', {\n url: input.url,\n method: input.method,\n hasSampleInputBody: !!input.sample_input_body,\n });\n\n const result = await checkEndpoint(\n toolName,\n input.url,\n input.method ? [input.method] : undefined,\n input.sample_input_body,\n {\n ...input.headers,\n 'X-Wallet-Address': wallets.evmAccount.account.address,\n ...(sessionId ? { 'X-Session-ID': sessionId } : {}),\n }\n );\n\n if (!result.found) {\n log.error('[checkEndpoint] failed', {\n surface: toolName,\n url: input.url,\n cause: result.cause,\n message: result.message,\n });\n return mcpSuccessJson({\n message: 'No endpoint schema found for this URL.',\n url: input.url,\n });\n }\n\n if (result.advisories.length === 0) {\n return mcpSuccessJson({\n message: 'No endpoint schema found for this URL.',\n url: input.url,\n });\n }\n\n const results = result.advisories.map(a => ({\n ...a,\n requiresPayment: a.authMode === 'paid' || a.authMode === 'apiKey+paid',\n }));\n\n return mcpSuccessJson(toJsonObject({ url: input.url, results }));\n })\n );\n};\n","import z from 'zod';\nimport { mcpError, mcpSuccessStructuredJson } from './response';\n\nimport { redeemInviteCode } from '@/shared/redeem-invite';\nimport { DESCRIPTIONS, TOOL_PARAMS } from '@/shared/descriptions';\n\nimport type { RegisterTools } from '@/server/types';\n\nexport const registerRedeemInviteTool: RegisterTools = ({\n server,\n wallets,\n}) => {\n server.registerTool(\n 'redeem_invite',\n {\n title: 'Redeem Invite',\n description: DESCRIPTIONS.redeemInvite.mcp,\n inputSchema: z.object({\n code: z.string().min(1).describe(TOOL_PARAMS.redeemInvite.code),\n }),\n outputSchema: z.object({\n redeemed: z.literal(true),\n amount: z.string().describe(TOOL_PARAMS.redeemInvite.output.amount),\n txHash: z.string().describe(TOOL_PARAMS.redeemInvite.output.txHash),\n }),\n annotations: {\n readOnlyHint: false, // Modifies wallet balance\n destructiveHint: false, // Additive (adds funds), not destructive\n idempotentHint: false, // Same code can't be redeemed twice - second attempt fails\n openWorldHint: true,\n },\n },\n async ({ code }) => {\n const result = await redeemInviteCode({\n code,\n address: wallets.evmAccount.account.address,\n surface: 'redeem_invite',\n dev: false,\n });\n\n if (result.isErr()) {\n return mcpError(result, { isError: true });\n }\n\n const { amount, txHash } = result.value;\n\n return mcpSuccessStructuredJson({\n redeemed: true,\n amount: `${amount} USDC`,\n txHash,\n });\n }\n );\n};\n","import z from 'zod';\n\nimport { log } from '@/shared/log';\nimport { submitErrorReport } from '@/operations/report-error';\nimport { mcpError, mcpSuccessStructuredJson } from './response';\nimport { DESCRIPTIONS, TOOL_PARAMS } from '@/shared/descriptions';\n\nimport type { RegisterTools } from '@/server/types';\n\nconst toolName = 'report_error';\n\nexport const registerTelemetryTools: RegisterTools = ({\n server,\n wallets,\n flags,\n}) => {\n server.registerTool(\n toolName,\n {\n title: 'Report Error',\n description: DESCRIPTIONS.reportError.mcp,\n inputSchema: z.object({\n tool: z.string().describe(TOOL_PARAMS.reportError.tool),\n resource: z\n .string()\n .optional()\n .describe(TOOL_PARAMS.reportError.resource),\n summary: z.string().describe(TOOL_PARAMS.reportError.summary),\n errorMessage: z.string().describe(TOOL_PARAMS.reportError.errorMessage),\n stack: z.string().optional().describe(TOOL_PARAMS.reportError.stack),\n fullReport: z\n .string()\n .optional()\n .describe(TOOL_PARAMS.reportError.fullReport),\n }),\n outputSchema: z.object({\n submitted: z.literal(true),\n reportId: z.string().describe(TOOL_PARAMS.reportError.output.reportId),\n message: z.string().describe(TOOL_PARAMS.reportError.output.message),\n }),\n annotations: {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n },\n },\n async input => {\n log.info('Submitting error report', {\n tool: input.tool,\n resource: input.resource,\n summary: input.summary,\n });\n\n const result = await submitErrorReport(\n toolName,\n {\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 },\n wallets.evmAccount.account.address,\n flags.dev\n );\n\n if (result.isErr()) {\n log.error('Failed to submit error report', result.error);\n return mcpError(result, { isError: true });\n }\n\n log.info('Error report submitted successfully', {\n reportId: result.value.reportId,\n });\n\n return mcpSuccessStructuredJson({\n submitted: result.value.submitted,\n reportId: result.value.reportId,\n message: result.value.message,\n });\n }\n );\n};\n","import { z } from 'zod';\n\nimport { resultFromPromise } from '@agentcash/neverthrow';\n\nimport { log } from '@/shared/log';\nimport { discoverResources } from '@/operations/discover';\nimport { DESCRIPTIONS, TOOL_PARAMS } from '@/shared/descriptions';\n\nimport {\n mcpError,\n mcpErrorJson,\n mcpSuccessJson,\n safeHandler,\n} from './response';\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { JsonObject } from '@/shared/neverthrow/json/types';\n\nconst toolName = 'discover_api_endpoints';\nconst OPENAPI_TRIED_PATHS = '/openapi.json, /.well-known/x402';\n\nexport function registerDiscoveryTools(server: McpServer): void {\n server.registerTool(\n toolName,\n {\n title: 'Discover API Endpoints',\n description: DESCRIPTIONS.discoverApiEndpoints.mcp,\n inputSchema: z.object({\n url: z.string().describe(TOOL_PARAMS.discoverApiEndpoints.url),\n include_guidance: z\n .boolean()\n .optional()\n .describe(TOOL_PARAMS.discoverApiEndpoints.includeGuidance),\n }),\n annotations: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: true,\n },\n },\n safeHandler(async ({ url, include_guidance }) => {\n if (!URL.canParse(url)) {\n return mcpErrorJson({\n error: 'Invalid URL',\n url,\n hint: 'Provide a fully-formed URL like https://example.com',\n });\n }\n\n log.info(`Discovering resources for: ${url}`);\n\n const discoverResult = await resultFromPromise(\n 'discover',\n toolName,\n discoverResources(toolName, url, {\n includeGuidance: include_guidance,\n }),\n e => ({\n cause: 'discover' as const,\n message: e instanceof Error ? e.message : String(e),\n })\n );\n\n if (discoverResult.isErr()) {\n return mcpError(discoverResult);\n }\n\n const result = discoverResult.value;\n\n if ('endpoints' in result) {\n return mcpSuccessJson({\n found: true,\n origin: result.origin,\n ...(result.info\n ? { info: result.info as unknown as JsonObject }\n : {}),\n guidanceAvailable: result.guidanceAvailable,\n ...(result.guidanceTokens != null\n ? { guidanceTokens: result.guidanceTokens }\n : {}),\n ...(result.guidance ? { guidance: result.guidance } : {}),\n endpoints: result.endpoints.map(\n e => ({ ...e }) as unknown as JsonObject\n ),\n } as JsonObject);\n }\n\n // Discovery failed — surface the real cause\n const origin = URL.canParse(url) ? new URL(url).origin : url;\n\n if (result.cause === 'not_found') {\n return mcpSuccessJson({\n found: false,\n origin,\n error: `No OpenAPI spec found. Tried: ${OPENAPI_TRIED_PATHS}`,\n });\n }\n\n return mcpSuccessJson({\n found: false,\n origin,\n cause: result.cause,\n error:\n result.message ?? `Failed to fetch OpenAPI spec (${result.cause})`,\n hint:\n result.cause === 'timeout'\n ? 'The server may be slow or unreachable. Try again later.'\n : result.cause === 'network'\n ? 'Could not reach the server. Check the network connection and try again.'\n : `The server returned an unparseable response. Tried: ${OPENAPI_TRIED_PATHS}`,\n });\n })\n );\n}\n","import { z } from 'zod';\n\nimport { getSettings, setSettings } from '@/shared/settings';\nimport { DEFAULT_MAX_AMOUNT } from '@/operations/fetch-with-payment';\n\nimport { mcpSuccessStructuredJson, safeHandler } from './response';\nimport { DESCRIPTIONS } from '@/shared/descriptions';\n\nimport type { RegisterTools } from '@/server/types';\n\nexport const registerSettingsTools: RegisterTools = ({ server }) => {\n server.registerTool(\n 'update_settings',\n {\n title: 'Update Settings',\n description: DESCRIPTIONS.updateSettings.mcp,\n inputSchema: z.object({\n maxAmount: z\n .number()\n .positive()\n .optional()\n .describe(\n `Maximum amount (USD) to pay per fetch request. Current default: $${DEFAULT_MAX_AMOUNT}.`\n ),\n }),\n annotations: {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n },\n safeHandler(input => {\n if (input.maxAmount !== undefined) {\n setSettings({ maxAmount: input.maxAmount });\n }\n\n const settings = getSettings();\n\n return Promise.resolve(\n mcpSuccessStructuredJson({\n maxAmount: settings.maxAmount ?? DEFAULT_MAX_AMOUNT,\n })\n );\n })\n );\n\n server.registerTool(\n 'get_settings',\n {\n title: 'Get Settings',\n description: DESCRIPTIONS.getSettings.mcp,\n annotations: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n },\n safeHandler(() => {\n const settings = getSettings();\n\n return Promise.resolve(\n mcpSuccessStructuredJson({\n maxAmount: settings.maxAmount ?? DEFAULT_MAX_AMOUNT,\n })\n );\n })\n );\n};\n","import { readFileSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { fileURLToPath } from 'url';\n\ndeclare const __MCP_VERSION__: string | undefined;\n\nfunction getVersion(): string {\n if (typeof __MCP_VERSION__ !== 'undefined') {\n return __MCP_VERSION__;\n }\n // Fallback for dev mode (tsx)\n const __dirname = dirname(fileURLToPath(import.meta.url));\n const pkg = JSON.parse(\n readFileSync(join(__dirname, '../../../package.json'), 'utf-8')\n ) as { version: string };\n return pkg.version;\n}\n\nexport const MCP_VERSION = getVersion();\n"],"mappings":"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","names":["error","z","toolName","z","z","z","toolName","z","z","z","z","toolName","z","z","toolName","z","z","z","__dirname","MCP_VERSION","MCP_VERSION"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/cli/commands/wallet.ts"],"sourcesContent":["import {\n successResponse,\n fromNeverthrowError,\n outputAndExit,\n type OutputFlags,\n} from '@/cli/output';\n\nimport { getWalletInfo } from '@/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 wallets = await getWalletOrExit(flags);\n\n const result = await getWalletInfo(SURFACE, wallets, 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 solanaAddress: wallets.svmAccount.account.address,\n balance: result.value.balance,\n chains: result.value.chains,\n isNewWallet: result.value.isNewWallet,\n depositLink: result.value.depositLink,\n solanaDepositLink: result.value.solanaDepositLink,\n ...(result.value.onboardingCta\n ? {\n onboardingCta: {\n onboardLink: result.value.onboardingCta.onboardLink,\n depositLink: result.value.onboardingCta.depositLink,\n message: result.value.onboardingCta.message,\n },\n }\n : {}),\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 {\n evmAccount: {\n account: { address },\n },\n } = await getWalletOrExit(flags);\n\n const result = await redeemInviteCode({\n code: args.code,\n address,\n surface: SURFACE,\n dev: flags.dev,\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\nexport async function walletAddressCommand(\n _args: object,\n flags: GlobalFlags<OutputFlags>\n): Promise<void> {\n const { evmAccount, svmAccount } = await getWalletOrExit(flags);\n\n return outputAndExit(\n successResponse({\n evmAddress: evmAccount.account.address,\n solanaAddress: svmAccount.account.address,\n }),\n flags\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,IAAM,UAAU;AAEhB,eAAsB,kBACpB,OACA,OACe;AACf,QAAM,UAAU,MAAM,gBAAgB,KAAK;AAE3C,QAAM,SAAS,MAAM,cAAc,SAAS,SAAS,KAAK;AAE1D,MAAI,OAAO,MAAM,GAAG;AAClB,WAAO,cAAc,oBAAoB,MAAM,GAAG,KAAK;AAAA,EACzD;AAEA,SAAO;AAAA,IACL,gBAAgB;AAAA,MACd,SAAS,OAAO,MAAM;AAAA,MACtB,eAAe,QAAQ,WAAW,QAAQ;AAAA,MAC1C,SAAS,OAAO,MAAM;AAAA,MACtB,QAAQ,OAAO,MAAM;AAAA,MACrB,aAAa,OAAO,MAAM;AAAA,MAC1B,aAAa,OAAO,MAAM;AAAA,MAC1B,mBAAmB,OAAO,MAAM;AAAA,MAChC,GAAI,OAAO,MAAM,gBACb;AAAA,QACE,eAAe;AAAA,UACb,aAAa,OAAO,MAAM,cAAc;AAAA,UACxC,aAAa,OAAO,MAAM,cAAc;AAAA,UACxC,SAAS,OAAO,MAAM,cAAc;AAAA,QACtC;AAAA,MACF,IACA,CAAC;AAAA,MACL,GAAI,OAAO,MAAM,UAAU,EAAE,SAAS,OAAO,MAAM,QAAQ,IAAI,CAAC;AAAA,IAClE,CAAC;AAAA,IACD;AAAA,EACF;AACF;AAMA,eAAsB,oBACpB,MACA,OACe;AACf,QAAM;AAAA,IACJ,YAAY;AAAA,MACV,SAAS,EAAE,QAAQ;AAAA,IACrB;AAAA,EACF,IAAI,MAAM,gBAAgB,KAAK;AAE/B,QAAM,SAAS,MAAM,iBAAiB;AAAA,IACpC,MAAM,KAAK;AAAA,IACX;AAAA,IACA,SAAS;AAAA,IACT,KAAK,MAAM;AAAA,EACb,CAAC;AAED,MAAI,OAAO,MAAM,GAAG;AAClB,WAAO,cAAc,oBAAoB,MAAM,GAAG,KAAK;AAAA,EACzD;AAEA,SAAO;AAAA,IACL,gBAAgB;AAAA,MACd,UAAU;AAAA,MACV,QAAQ,GAAG,OAAO,MAAM,MAAM;AAAA,MAC9B,QAAQ,OAAO,MAAM;AAAA,IACvB,CAAC;AAAA,IACD;AAAA,EACF;AACF;AAEA,eAAsB,qBACpB,OACA,OACe;AACf,QAAM,EAAE,YAAY,WAAW,IAAI,MAAM,gBAAgB,KAAK;AAE9D,SAAO;AAAA,IACL,gBAAgB;AAAA,MACd,YAAY,WAAW,QAAQ;AAAA,MAC/B,eAAe,WAAW,QAAQ;AAAA,IACpC,CAAC;AAAA,IACD;AAAA,EACF;AACF;","names":[]}