{"version":3,"sources":["../src/index.ts","../src/useChatWithPayment.ts","../src/utils.ts","../src/fetch-no-payment.ts","../src/fetch-with-payment.ts"],"sourcesContent":["export { useChatWithPayment } from './useChatWithPayment';\nexport type { default as UseChatWithPayment } from './useChatWithPayment';\nexport {\n  createX402OpenAIWithoutPayment,\n  type X402OpenAIWithoutPaymentConfig,\n} from './fetch-no-payment';\nexport { createX402OpenAI, type X402OpenAIConfig } from './fetch-with-payment';\nexport { UiStreamOnError } from './fetch-no-payment';\n","'use client';\nimport { useEffect, useRef, RefObject } from 'react';\nimport {\n  useChat,\n  type UseChatHelpers,\n  type UseChatOptions,\n  type UIMessage,\n} from '@ai-sdk/react';\nimport { ChatInit } from 'ai';\nimport { PaymentRequirementsSchema, type Signer } from 'x402/types';\nimport { createPaymentHeader } from 'x402/client';\nimport { handleX402Error } from './utils';\n\ntype UseChatWithPaymentParams<UI_MESSAGE extends UIMessage> =\n  ChatInit<UI_MESSAGE> &\n    UseChatOptions<UI_MESSAGE> & {\n      walletClient: Signer;\n      regenerateOptions?: any;\n    };\n\nasync function handlePaymentError(\n  err: Error,\n  regenerate: UseChatHelpers<UIMessage>['regenerate'],\n  regenerateOptions: any,\n  walletClientRef: RefObject<Signer | null>\n) {\n  const paymentDetails = handleX402Error(err);\n  if (!paymentDetails) {\n    return;\n  }\n  const currentWalletClient = walletClientRef.current;\n\n  const paymentRequirement = PaymentRequirementsSchema.parse(\n    paymentDetails.accepts[0]\n  );\n  const paymentHeader = await createPaymentHeader(\n    currentWalletClient as unknown as Signer,\n    paymentDetails.x402Version,\n    paymentRequirement\n  );\n  if (regenerate) {\n    await regenerate({\n      headers: { 'x-payment': paymentHeader },\n      ...regenerateOptions,\n    });\n  }\n}\n\nexport function useChatWithPayment<UI_MESSAGE extends UIMessage = UIMessage>({\n  walletClient,\n  regenerateOptions,\n  ...options\n}: UseChatWithPaymentParams<UI_MESSAGE>): UseChatHelpers<UI_MESSAGE> {\n  const walletClientRef = useRef<Signer | null>(walletClient);\n\n  useEffect(() => {\n    walletClientRef.current = walletClient;\n  }, [walletClient]);\n\n  const { regenerate, ...chat } = useChat({\n    ...options,\n    onError: async (err: Error) => {\n      if (options.onError) options.onError(err);\n      handlePaymentError(err, regenerate, regenerateOptions, walletClientRef);\n    },\n  });\n\n  return {\n    ...chat,\n    regenerate,\n  };\n}\n\nexport default useChatWithPayment;\n","import { z } from 'zod';\n\nconst evmAddress = z\n  .string()\n  .regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid EVM address');\nconst hexString = z.string().regex(/^0x[a-fA-F0-9]+$/, 'Invalid hex string');\nconst decimalString = z.string().regex(/^\\d+$/, 'Must be a decimal string');\n\nexport const X402PaymentLinkSchema = z\n  .object({\n    asset: evmAddress,\n    currency: evmAddress,\n    description: z.string().min(1),\n    discoverable: z.boolean(),\n    extra: z\n      .object({\n        name: z.string().min(1),\n        version: z.string().min(1),\n      })\n      .strict(),\n    maxAmountRequired: decimalString,\n    maxTimeoutSeconds: z.number().int().positive(),\n    mimeType: z.literal('application/json'),\n    network: z.literal('base'),\n    nonce: hexString,\n    payTo: evmAddress,\n    recipient: evmAddress,\n    resource: z.string().url(),\n    scheme: z.literal('exact'),\n    to: evmAddress,\n    type: z.string(),\n    url: z.string().url(),\n    version: z.string().min(1),\n  })\n  .strict();\n\nexport const X402PaymentDetailsSchema = z.object({\n  x402Version: z.number(),\n  error: z.string(),\n  accepts: z.array(X402PaymentLinkSchema),\n});\n\nexport type X402PaymentDetails = z.infer<typeof X402PaymentDetailsSchema>;\n\nexport function handleX402Error(error: Error): X402PaymentDetails | false {\n  try {\n    const errorMessage = error.message;\n    const parsedError = JSON.parse(errorMessage);\n    const paymentDetails = X402PaymentDetailsSchema.parse(parsedError);\n    return paymentDetails;\n  } catch (error) {\n    console.error('error: ', error);\n    return false;\n  }\n}\n","import { createOpenAI, OpenAIProvider } from '@ai-sdk/openai';\n\nfunction fetchAddPayment(\n  originalFetch: typeof fetch,\n  paymentAuthHeader: string | null | undefined,\n  echoAppId?: string\n) {\n  return async (input: RequestInfo | URL, init?: RequestInit) => {\n    const headers: Record<string, any> = { ...init?.headers };\n    if (paymentAuthHeader) {\n      headers['x-payment'] = paymentAuthHeader;\n    }\n    if (echoAppId) {\n      headers['x-echo-app-id'] = echoAppId;\n    }\n    delete headers['Authorization'];\n    delete headers['authorization'];\n    return originalFetch(input, {\n      ...init,\n      headers,\n    });\n  };\n}\n\nexport interface X402OpenAIWithoutPaymentConfig {\n  paymentAuthHeader?: string | null;\n  baseRouterUrl?: string;\n  echoAppId?: string;\n}\n\nexport function createX402OpenAIWithoutPayment({\n  paymentAuthHeader,\n  baseRouterUrl,\n  echoAppId,\n}: X402OpenAIWithoutPaymentConfig): OpenAIProvider {\n  return createOpenAI({\n    baseURL: baseRouterUrl || 'https://echo.router.merit.systems',\n    apiKey: 'placeholder_replaced_by_fetchAddPayment',\n    fetch: fetchAddPayment(fetch, paymentAuthHeader, echoAppId),\n  });\n}\n\nexport function UiStreamOnError(): (error: any) => string {\n  return error => {\n    const errorBody = error as { responseBody: string };\n    return errorBody.responseBody;\n  };\n}\n","import { createOpenAI, OpenAIProvider } from '@ai-sdk/openai';\nimport { createPaymentHeader, selectPaymentRequirements } from 'x402/client';\nimport { PaymentRequirementsSchema, Signer } from 'x402/types';\n\nexport async function getPaymentHeaderFromBody(\n  body: any,\n  walletClient: Signer\n) {\n  const { x402Version, accepts } = body as {\n    x402Version: number;\n    accepts: unknown[];\n  };\n  const parsedPaymentRequirements = accepts.map(x =>\n    PaymentRequirementsSchema.parse(x)\n  );\n\n  const selectedPaymentRequirements = selectPaymentRequirements(\n    parsedPaymentRequirements\n  );\n\n  const paymentHeader = await createPaymentHeader(\n    walletClient,\n    x402Version,\n    selectedPaymentRequirements\n  );\n  return paymentHeader;\n}\n\nfunction fetchWithX402Payment(\n  fetch: any,\n  walletClient: Signer,\n  echoAppId?: string\n): typeof fetch {\n  return async (input: URL, init?: RequestInit) => {\n    const headers: Record<string, any> = { ...init?.headers };\n\n    delete headers['Authorization'];\n    delete headers['authorization'];\n    if (echoAppId) {\n      headers['x-echo-app-id'] = echoAppId;\n    }\n    const response = await fetch(input, {\n      ...init,\n      headers,\n    });\n\n    if (response.status === 402) {\n      const paymentRequiredJson = await response.json();\n      const paymentHeader = await getPaymentHeaderFromBody(\n        paymentRequiredJson,\n        walletClient\n      );\n      headers['x-payment'] = paymentHeader;\n      const newResponse = await fetch(input, {\n        ...init,\n        headers,\n      });\n      return newResponse;\n    }\n\n    return response;\n  };\n}\n\nexport interface X402OpenAIConfig {\n  walletClient: Signer;\n  baseRouterUrl?: string;\n  echoAppId?: string;\n}\n\nexport function createX402OpenAI({\n  walletClient,\n  baseRouterUrl,\n  echoAppId,\n}: X402OpenAIConfig): OpenAIProvider {\n  return createOpenAI({\n    baseURL: baseRouterUrl || 'https://echo.router.merit.systems',\n    apiKey: 'placeholder_replaced_by_echoFetch',\n    fetch: fetchWithX402Payment(fetch, walletClient, echoAppId),\n  });\n}\n"],"mappings":"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","names":["import_react","error","import_openai","import_client","import_types","fetch"]}