diff --git a/.gitignore b/.gitignore index b53e49e68..b459cb07d 100644 --- a/.gitignore +++ b/.gitignore @@ -116,3 +116,4 @@ storybook-static .claude .turbo +tsx-0/ diff --git a/packages/app/server/src/providers/OpenAIAudioProvider.ts b/packages/app/server/src/providers/OpenAIAudioProvider.ts new file mode 100644 index 000000000..471e5862e --- /dev/null +++ b/packages/app/server/src/providers/OpenAIAudioProvider.ts @@ -0,0 +1,93 @@ +import { Decimal } from '@prisma/client/runtime/library'; +import { Transaction } from '../types'; +import { BaseProvider } from './BaseProvider'; +import { ProviderType } from './ProviderType'; +import logger from '../logger'; +import OpenAI from 'openai'; + +export class OpenAIAudioProvider extends BaseProvider { + private client: OpenAI; + + constructor(stream: boolean, model: string) { + super(stream, model); + const apiKey = this.getApiKey(); + if (!apiKey) { + throw new Error('OpenAI API key is required for audio provider'); + } + this.client = new OpenAI({ apiKey }); + } + + getType(): ProviderType { + return ProviderType.OPENAI_AUDIO; + } + + getBaseUrl(): string { + return this.OPENAI_BASE_URL; + } + + getApiKey(): string | undefined { + return process.env.OPENAI_API_KEY; + } + + async handleBody(data: string): Promise { + try { + const audioResponse = JSON.parse(data) as { + text: string; + duration?: number; + language?: string; + }; + + const durationSeconds = audioResponse.duration || 0; + const durationMinutes = durationSeconds / 60; + const costPerMinute = 0.006; + const totalCost = new Decimal(durationMinutes * costPerMinute); + + const transaction: Transaction = { + metadata: { + providerId: 'openai-audio', + provider: 'openai', + model: this.getModel(), + durationSeconds, + generateAudio: false + }, + rawTransactionCost: totalCost, + status: 'success', + }; + + logger.info('Audio transcription transaction:', { + model: this.getModel(), + cost: totalCost.toNumber(), + durationMinutes, + userId: this.getUserId(), + }); + + return transaction; + } catch (error) { + logger.error('Error processing audio response:', error); + throw error; + } + } + + override supportsStream(): boolean { + // OpenAI supports streaming for audio with verbose_json response format + return true; + } + + override ensureStreamUsage( + reqBody: Record, + reqPath: string + ): Record { + return reqBody; + } + + override transformRequestBody( + reqBody: Record, + reqPath: string + ): Record { + // Force verbose_json format to get duration field for cost calculation + return { + ...reqBody, + response_format: 'verbose_json' + }; + } +} \ No newline at end of file diff --git a/packages/app/server/src/providers/ProviderFactory.ts b/packages/app/server/src/providers/ProviderFactory.ts index ffa6e96ca..59503ea1f 100644 --- a/packages/app/server/src/providers/ProviderFactory.ts +++ b/packages/app/server/src/providers/ProviderFactory.ts @@ -3,6 +3,7 @@ import { ALL_SUPPORTED_IMAGE_MODELS, ALL_SUPPORTED_MODELS, ALL_SUPPORTED_VIDEO_MODELS, + ALL_SUPPORTED_AUDIO_MODELS, } from '../services/AccountingService'; import type { EchoControlService } from '../services/EchoControlService'; import { AnthropicGPTProvider } from './AnthropicGPTProvider'; @@ -17,6 +18,7 @@ import { PROXY_PASSTHROUGH_ONLY_MODEL as GeminiVeoProxyPassthroughOnlyModel, } from './GeminiVeoProvider'; import { GPTProvider } from './GPTProvider'; +import { OpenAIAudioProvider } from './OpenAIAudioProvider'; import { OpenAIImageProvider } from './OpenAIImageProvider'; import { OpenAIResponsesProvider } from './OpenAIResponsesProvider'; import { OpenRouterProvider } from './OpenRouterProvider'; @@ -97,6 +99,19 @@ const createVideoModelToProviderMapping = (): Record => { return mapping; }; + +const createAudioModelToProviderMapping = (): Record => { + const mapping: Record = {}; + + for (const modelConfig of ALL_SUPPORTED_AUDIO_MODELS) { + if (modelConfig.provider === 'OpenAI') { + mapping[modelConfig.model_id] = ProviderType.OPENAI_AUDIO; + } + } + + return mapping; +}; + /** * Model-to-provider mapping loaded from model_prices_and_context_window.json * This replaces the previous hardcoded mapping and automatically includes all @@ -111,6 +126,9 @@ export const IMAGE_MODEL_TO_PROVIDER: Record = export const VIDEO_MODEL_TO_PROVIDER: Record = createVideoModelToProviderMapping(); +export const AUDIO_MODEL_TO_PROVIDER: Record = + createAudioModelToProviderMapping(); + export const getProvider = ( model: string, stream: boolean, @@ -129,6 +147,11 @@ export const getProvider = ( type = videoType; } + const audioType = AUDIO_MODEL_TO_PROVIDER[model]; + if (audioType) { + type = audioType; + } + if (model === GeminiVeoProxyPassthroughOnlyModel) { type = ProviderType.GEMINI_VEO; } @@ -151,6 +174,11 @@ export const getProvider = ( type = ProviderType.OPENAI_IMAGES; } + // Check if this is an audio transcription or translation endpoint + if (completionPath.includes('audio/transcriptions') || completionPath.includes('audio/translations')) { + type = ProviderType.OPENAI_AUDIO; + } + // We select for Anthropic Native if the completionPath includes "messages" // The OpenAI Format does not hit /v1/messages, it hits /v1/chat/completions // but the anthropic native format hits /v1/messages @@ -190,6 +218,8 @@ export const getProvider = ( return new OpenAIVideoProvider(stream, model); case ProviderType.GROQ: return new GroqProvider(stream, model); + case ProviderType.OPENAI_AUDIO: + return new OpenAIAudioProvider(stream, model); case ProviderType.XAI: return new XAIProvider(stream, model); default: diff --git a/packages/app/server/src/providers/ProviderType.ts b/packages/app/server/src/providers/ProviderType.ts index b2514ac80..eaf1364e6 100644 --- a/packages/app/server/src/providers/ProviderType.ts +++ b/packages/app/server/src/providers/ProviderType.ts @@ -11,5 +11,6 @@ export enum ProviderType { OPENAI_IMAGES = 'OPENAI_IMAGES', OPENAI_VIDEOS = 'OPENAI_VIDEOS', GROQ = 'GROQ', + OPENAI_AUDIO = 'OPENAI_AUDIO', XAI = 'XAI', } diff --git a/packages/app/server/src/services/AccountingService.ts b/packages/app/server/src/services/AccountingService.ts index 02e51e14e..e408d28c8 100644 --- a/packages/app/server/src/services/AccountingService.ts +++ b/packages/app/server/src/services/AccountingService.ts @@ -5,10 +5,12 @@ import { OpenRouterModels, GroqModels, OpenAIImageModels, + OpenAIAudioModels, SupportedOpenAIResponseToolPricing, SupportedModel, SupportedImageModel, SupportedVideoModel, + SupportedAudioModel, XAIModels, } from '@merit-systems/echo-typescript-sdk'; @@ -42,6 +44,10 @@ export const ALL_SUPPORTED_VIDEO_MODELS: SupportedVideoModel[] = [ ...OpenAIVideoModels, ]; +export const ALL_SUPPORTED_AUDIO_MODELS: SupportedAudioModel[] = [ + ...OpenAIAudioModels, +]; + // Create a lookup map for O(1) model price retrieval const MODEL_PRICE_MAP = new Map(); ALL_SUPPORTED_MODELS.forEach(model => { @@ -60,6 +66,12 @@ ALL_SUPPORTED_VIDEO_MODELS.forEach(model => { VIDEO_MODEL_MAP.set(model.model_id, model); }); +// Create a separate map for audio models +const AUDIO_MODEL_MAP = new Map(); +ALL_SUPPORTED_AUDIO_MODELS.forEach(model => { + AUDIO_MODEL_MAP.set(model.model_id, model); +}); + export const getModelPrice = (model: string) => { const supportedModel = MODEL_PRICE_MAP.get(model); @@ -114,6 +126,10 @@ export const isValidVideoModel = (model: string) => { return VIDEO_MODEL_MAP.has(model); }; +export const isValidAudioModel = (model: string) => { + return AUDIO_MODEL_MAP.has(model); +}; + export const getCostPerToken = ( model: string, inputTokens: number, diff --git a/packages/app/server/src/services/EchoControlService.ts b/packages/app/server/src/services/EchoControlService.ts index dca4e6558..8cbe67626 100644 --- a/packages/app/server/src/services/EchoControlService.ts +++ b/packages/app/server/src/services/EchoControlService.ts @@ -32,7 +32,7 @@ export class EchoControlService { constructor(db: PrismaClient, apiKey: string) { // Check if the generated Prisma client exists - const generatedPrismaPath = join(__dirname, 'generated', 'prisma'); + const generatedPrismaPath = join(__dirname, '..', 'generated', 'prisma'); if (!existsSync(generatedPrismaPath)) { throw new Error( `Generated Prisma client not found at ${generatedPrismaPath}. ` + diff --git a/packages/app/server/src/services/PricingService.ts b/packages/app/server/src/services/PricingService.ts index 74a13f80e..9fea2740d 100644 --- a/packages/app/server/src/services/PricingService.ts +++ b/packages/app/server/src/services/PricingService.ts @@ -5,6 +5,7 @@ import { getVideoModelPrice, isValidImageModel, isValidVideoModel, + isValidAudioModel, calculateToolCost, getImageModelPrice, } from './AccountingService'; @@ -26,8 +27,11 @@ export function getRequestMaxCost( provider: BaseProvider, isPassthroughProxyRoute: boolean ): Decimal { - // Need to switch between language/image/video for different pricing models. - if (isValidVideoModel(provider.getModel())) { + if (isValidAudioModel(provider.getModel())) { + const fileSizeBytes = Number(req.originalContentLength) || 1024 * 1024; + const estimatedMinutes = Math.max(1, fileSizeBytes / (1024 * 1024)); + return new Decimal(estimatedMinutes * 0.006); + } else if (isValidVideoModel(provider.getModel())) { const videoModelWithPricing = getVideoModelPrice(provider.getModel()); if (!videoModelWithPricing) { throw new UnknownModelError( diff --git a/packages/app/server/src/services/ProviderInitializationService.ts b/packages/app/server/src/services/ProviderInitializationService.ts index 1a1448ebf..bb3bba6b7 100644 --- a/packages/app/server/src/services/ProviderInitializationService.ts +++ b/packages/app/server/src/services/ProviderInitializationService.ts @@ -11,6 +11,7 @@ import { isValidImageModel, isValidModel, isValidVideoModel, + isValidAudioModel, } from './AccountingService'; import { extractIsStream, extractModelName } from './RequestDataService'; @@ -67,7 +68,8 @@ export async function initializeProvider( !model || (!isValidModel(model) && !isValidImageModel(model) && - !isValidVideoModel(model)) + !isValidVideoModel(model) && + !isValidAudioModel(model)) ) { logger.warn(`Invalid model: ${model}`); // if auth or x402 header, return 422 diff --git a/packages/sdk/examples/next/src/app/components/audio.tsx b/packages/sdk/examples/next/src/app/components/audio.tsx new file mode 100644 index 000000000..abe6348a4 --- /dev/null +++ b/packages/sdk/examples/next/src/app/components/audio.tsx @@ -0,0 +1,258 @@ +'use client'; + +import { useState, useRef } from 'react'; + +export default function AudioTranscription() { + const [transcription, setTranscription] = useState(''); + const [isRecording, setIsRecording] = useState(false); + const [loading, setLoading] = useState(false); + const [selectedFile, setSelectedFile] = useState(null); + const [model, setModel] = useState<'whisper-1' | 'whisper-large-v3'>('whisper-1'); + const [mode, setMode] = useState<'transcribe' | 'translate'>('transcribe'); + + const mediaRecorderRef = useRef(null); + const audioChunksRef = useRef([]); + const fileInputRef = useRef(null); + + // Start recording + const startRecording = async () => { + try { + const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); + const mediaRecorder = new MediaRecorder(stream); + mediaRecorderRef.current = mediaRecorder; + audioChunksRef.current = []; + + mediaRecorder.ondataavailable = (event) => { + if (event.data.size > 0) { + audioChunksRef.current.push(event.data); + } + }; + + mediaRecorder.onstop = () => { + const audioBlob = new Blob(audioChunksRef.current, { type: 'audio/wav' }); + const audioFile = new File([audioBlob], 'recording.wav', { type: 'audio/wav' }); + setSelectedFile(audioFile); + }; + + mediaRecorder.start(); + setIsRecording(true); + } catch (error) { + console.error('Error starting recording:', error); + alert('Error accessing microphone. Please ensure you have granted permission.'); + } + }; + + // Stop recording + const stopRecording = () => { + if (mediaRecorderRef.current && isRecording) { + mediaRecorderRef.current.stop(); + mediaRecorderRef.current.stream.getTracks().forEach(track => track.stop()); + setIsRecording(false); + } + }; + + // Handle file selection + const handleFileSelect = (event: React.ChangeEvent) => { + const file = event.target.files?.[0]; + if (file) { + // Check if it's an audio file + if (file.type.startsWith('audio/')) { + setSelectedFile(file); + } else { + alert('Please select an audio file'); + event.target.value = ''; + } + } + }; + + // Transcribe or translate audio + const processAudio = async () => { + if (!selectedFile) return; + + setLoading(true); + setTranscription(''); + + try { + const formData = new FormData(); + formData.append('file', selectedFile); + formData.append('model', model); + formData.append('response_format', 'text'); + + // Use the Next.js API proxy route + const endpoint = mode === 'transcribe' + ? '/api/echo/v1/audio/transcriptions' + : '/api/echo/v1/audio/translations'; + + const response = await fetch(endpoint, { + method: 'POST', + body: formData, + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const result = await response.text(); + setTranscription(result); + } catch (error) { + console.error('Audio processing error:', error); + setTranscription('Error processing audio. Please try again.'); + } finally { + setLoading(false); + } + }; + + // Clear everything + const clearAll = () => { + setTranscription(''); + setSelectedFile(null); + if (fileInputRef.current) { + fileInputRef.current.value = ''; + } + }; + + return ( +
+ {/* Controls */} +
+ {/* Model Selection */} +
+ + +
+ + {/* Mode Selection */} +
+ + +
+
+ + {/* Audio Input Options */} +
+

Audio Input

+ + {/* Recording Controls */} +
+ + + {isRecording && ( +
+
+ Recording... +
+ )} +
+ + {/* File Upload */} +
+ + +
+ + {/* Selected File Info */} + {selectedFile && ( +
+

+ Selected file: {selectedFile.name} +

+

+ Size: {(selectedFile.size / 1024 / 1024).toFixed(2)} MB +

+
+ )} +
+ + {/* Process Button */} +
+ + + {(selectedFile || transcription) && ( + + )} +
+ + {/* Results */} + {transcription && ( +
+

+ {mode === 'transcribe' ? 'Transcription' : 'Translation'} Result +

+
+

{transcription}

+
+ +
+ )} + + {/* Info */} +
+

• Supported formats: MP3, WAV, M4A, OGG, and other common audio formats

+

• Maximum file size: 25 MB

+

• Cost: $0.006 per minute of audio

+
+
+ ); +} \ No newline at end of file diff --git a/packages/sdk/examples/next/src/app/components/tabs-container.tsx b/packages/sdk/examples/next/src/app/components/tabs-container.tsx index 61f9a855a..313e16195 100644 --- a/packages/sdk/examples/next/src/app/components/tabs-container.tsx +++ b/packages/sdk/examples/next/src/app/components/tabs-container.tsx @@ -4,9 +4,10 @@ import { useState } from 'react'; import Chat from './chat'; import ImageGenerator from './image'; +import AudioTranscription from './audio'; export default function TabsContainer() { - const [activeTab, setActiveTab] = useState<'chat' | 'image'>('chat'); + const [activeTab, setActiveTab] = useState<'chat' | 'image' | 'audio'>('chat'); return (
@@ -32,6 +33,16 @@ export default function TabsContainer() { > Image Generation +
{/* Tab Content (kept mounted to preserve state) */} @@ -48,6 +59,12 @@ export default function TabsContainer() { +
+

+ AI Audio Transcription +

+ +
); diff --git a/packages/sdk/examples/vite/src/App.tsx b/packages/sdk/examples/vite/src/App.tsx index 32a250020..5e6a78107 100644 --- a/packages/sdk/examples/vite/src/App.tsx +++ b/packages/sdk/examples/vite/src/App.tsx @@ -7,9 +7,10 @@ import { import { useState } from 'react'; import { ChatInterface } from './components/ChatInterface'; import { ImageGeneration } from './components/ImageGeneration'; +import { AudioTranscription } from './components/AudioTranscription'; import UseChatInterface from './components/UseChatInterface'; -type Tab = 'chat' | 'images' | 'use-chat'; +type Tab = 'chat' | 'images' | 'audio' | 'use-chat'; function Dashboard() { const { user, balance, error, isLoading } = useEcho(); @@ -128,6 +129,16 @@ function Dashboard() { > 🎨 Image Generation + + + {isRecording && ( +
+
+ Recording... +
+ )} + + + {/* File Upload */} +
+ + +
+ + {/* Selected File Info */} + {selectedFile && ( +
+

+ Selected file: {selectedFile.name} +

+

+ Size: {(selectedFile.size / 1024 / 1024).toFixed(2)} MB +

+
+ )} + + + {/* Process Button */} +
+ + + {(selectedFile || transcription) && ( + + )} +
+ + {/* Results */} + {transcription && ( +
+

+ {mode === 'transcribe' ? 'Transcription' : 'Translation'} Result +

+
+

{transcription}

+
+ +
+ )} + + {/* Info */} +
+

• Supported formats: MP3, WAV, M4A, OGG, and other common audio formats

+

• Maximum file size: 25 MB

+

• Cost: $0.006 per minute of audio

+
+ + ); +} \ No newline at end of file diff --git a/packages/sdk/ts/src/index.ts b/packages/sdk/ts/src/index.ts index 521a30f93..fe1a25a9d 100644 --- a/packages/sdk/ts/src/index.ts +++ b/packages/sdk/ts/src/index.ts @@ -18,6 +18,7 @@ export type { SupportedToolType, SupportedModel, SupportedImageModel, + SupportedAudioModel, ImageGenerationQuality, ImageDimensions, WebSearchModel, @@ -57,3 +58,5 @@ export { VertexAIVideoModels } from './supported-models/video/vertex-ai'; export type { VertexAIVideoModel } from './supported-models/video/vertex-ai'; export { OpenAIVideoModels } from './supported-models/video/open-ai'; export type { OpenAIVideoModel } from './supported-models/video/open-ai'; +export { OpenAIAudioModels } from './supported-models/audio/openai'; +export type { OpenAIAudioModel } from './supported-models/audio/openai'; diff --git a/packages/sdk/ts/src/resources/models.ts b/packages/sdk/ts/src/resources/models.ts index ee4064d98..f0c96cef0 100644 --- a/packages/sdk/ts/src/resources/models.ts +++ b/packages/sdk/ts/src/resources/models.ts @@ -6,9 +6,11 @@ import { GeminiModels, OpenRouterModels, OpenAIImageModels, + OpenAIAudioModels, SupportedModel, SupportedImageModel, SupportedVideoModel, + SupportedAudioModel, GeminiVideoModels, } from '../supported-models'; @@ -38,4 +40,8 @@ export class ModelsResource extends BaseResource { async listSupportedVideoModels(): Promise { return GeminiVideoModels; } + + async listSupportedAudioModels(): Promise { + return OpenAIAudioModels; + } } diff --git a/packages/sdk/ts/src/supported-models/audio/openai.ts b/packages/sdk/ts/src/supported-models/audio/openai.ts new file mode 100644 index 000000000..afadf3450 --- /dev/null +++ b/packages/sdk/ts/src/supported-models/audio/openai.ts @@ -0,0 +1,16 @@ +import { SupportedAudioModel } from '../types'; + +export type OpenAIAudioModel = 'whisper-1' | 'whisper-large-v3'; + +export const OpenAIAudioModels: SupportedAudioModel[] = [ + { + model_id: 'whisper-1', + cost_per_minute: 0.006, + provider: 'OpenAI', + }, + { + model_id: 'whisper-large-v3', + cost_per_minute: 0.006, + provider: 'OpenAI', + }, +]; \ No newline at end of file diff --git a/packages/sdk/ts/src/supported-models/index.ts b/packages/sdk/ts/src/supported-models/index.ts index 3f641501d..cb9dc63eb 100644 --- a/packages/sdk/ts/src/supported-models/index.ts +++ b/packages/sdk/ts/src/supported-models/index.ts @@ -8,3 +8,4 @@ export * from './image/openai'; export * from './responses/openai'; export * from './video/gemini'; export * from './video/vertex-ai'; +export * from './audio/openai'; diff --git a/packages/sdk/ts/src/supported-models/types.ts b/packages/sdk/ts/src/supported-models/types.ts index 715f37664..2c836dbbb 100644 --- a/packages/sdk/ts/src/supported-models/types.ts +++ b/packages/sdk/ts/src/supported-models/types.ts @@ -84,3 +84,9 @@ export interface SupportedVideoModel { cost_per_second_without_audio: number; provider: string; } + +export interface SupportedAudioModel { + model_id: string; + cost_per_minute: number; + provider: string; +} diff --git a/packages/tests/provider-smoke/.env.example b/packages/tests/provider-smoke/.env.example new file mode 100644 index 000000000..aba64495d --- /dev/null +++ b/packages/tests/provider-smoke/.env.example @@ -0,0 +1,3 @@ +ECHO_API_KEY=your_echo_api_key_here +ECHO_APP_ID=your_echo_app_id_here +ECHO_DATA_SERVER_URL=https://echo.router.merit.systems diff --git a/packages/tests/provider-smoke/openai-audio-transcription.test.ts b/packages/tests/provider-smoke/openai-audio-transcription.test.ts new file mode 100644 index 000000000..7273bad69 --- /dev/null +++ b/packages/tests/provider-smoke/openai-audio-transcription.test.ts @@ -0,0 +1,53 @@ +import { describe, expect, it, beforeAll } from 'vitest'; +import fs from 'fs'; +import path from 'path'; +import { experimental_transcribe as transcribe } from 'ai'; +import { + OpenAIAudioModels, + createEchoOpenAI, +} from '@merit-systems/echo-typescript-sdk'; +import { + ECHO_APP_ID, + assertEnv, + baseRouterUrl, + getApiErrorDetails, + getToken, +} from './test-helpers'; + +beforeAll(assertEnv); + +describe.concurrent('OpenAI Audio Transcription', () => { + const testAudioPath = path.join(__dirname, 'test-audio', 'sample.wav'); + + beforeAll(() => { + if (!fs.existsSync(testAudioPath)) { + throw new Error(`Test audio file not found: ${testAudioPath}`); + } + }); + + const openai = createEchoOpenAI( + { appId: ECHO_APP_ID!, baseRouterUrl }, + getToken + ); + + // Test transcriptions for all audio models + for (const { model_id } of OpenAIAudioModels) { + it(`${model_id} transcription`, async () => { + try { + const audioFile = fs.readFileSync(testAudioPath); + + const { text } = await transcribe({ + model: openai.transcription(model_id), + audio: audioFile, + }); + + expect(text).toBeDefined(); + expect(typeof text).toBe('string'); + expect(text.length).toBeGreaterThan(0); + } catch (err) { + const details = getApiErrorDetails(err); + throw new Error(`[transcription] ${model_id} failed: ${details}`); + } + }); + } +}); \ No newline at end of file diff --git a/packages/tests/provider-smoke/test-audio/sample.wav b/packages/tests/provider-smoke/test-audio/sample.wav new file mode 100644 index 000000000..7f4aaabdf Binary files /dev/null and b/packages/tests/provider-smoke/test-audio/sample.wav differ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c92b4dd4e..eee1fb497 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -67,7 +67,7 @@ importers: version: 2.10.0(@prisma/client@6.16.0(prisma@6.16.0(magicast@0.3.5)(typescript@5.9.2))(typescript@5.9.2)) '@coinbase/x402': specifier: ^0.6.4 - version: 0.6.5(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.10)(@vercel/blob@0.25.1)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.6.5(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.10)(@vercel/blob@0.25.1)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10) '@hookform/resolvers': specifier: ^5.2.1 version: 5.2.1(react-hook-form@7.62.0(react@19.1.1)) @@ -416,7 +416,7 @@ importers: version: 1.34.0(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10) '@coinbase/x402': specifier: ^0.6.5 - version: 0.6.5(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.6.5(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@e2b/code-interpreter': specifier: ^2.0.1 version: 2.0.1 @@ -506,7 +506,7 @@ importers: version: 2.7.0 openai: specifier: ^6.2.0 - version: 6.2.0(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.11) + version: 6.2.0(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.11) prisma: specifier: 6.16.0 version: 6.16.0(magicast@0.3.5)(typescript@5.9.2) @@ -527,7 +527,7 @@ importers: version: 3.17.0 x402-express: specifier: ^0.6.5 - version: 0.6.5(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.6.5(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) zod: specifier: ^4.1.11 version: 4.1.11 @@ -7688,8 +7688,8 @@ packages: resolution: {integrity: sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==} engines: {node: '>= 0.12'} - form-data@4.0.3: - resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} format@0.2.2: @@ -12670,11 +12670,11 @@ snapshots: - utf-8-validate - zod - '@coinbase/x402@0.6.5(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.10)(@vercel/blob@0.25.1)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@coinbase/x402@0.6.5(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.10)(@vercel/blob@0.25.1)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: '@coinbase/cdp-sdk': 1.34.0(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10) viem: 2.33.3(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - x402: 0.6.5(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.10)(@vercel/blob@0.25.1)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + x402: 0.6.5(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.10)(@vercel/blob@0.25.1)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10) zod: 3.25.76 transitivePeerDependencies: - '@azure/app-configuration' @@ -12710,11 +12710,11 @@ snapshots: - utf-8-validate - ws - '@coinbase/x402@0.6.5(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@coinbase/x402@0.6.5(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@coinbase/cdp-sdk': 1.34.0(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10) viem: 2.33.3(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - x402: 0.6.5(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + x402: 0.6.5(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) zod: 3.25.76 transitivePeerDependencies: - '@azure/app-configuration' @@ -17429,10 +17429,6 @@ snapshots: '@socket.io/component-emitter@3.1.2': {} - '@solana-program/compute-budget@0.8.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': - dependencies: - '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@solana-program/compute-budget@0.8.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': dependencies: '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) @@ -17441,13 +17437,9 @@ snapshots: dependencies: '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@solana-program/compute-budget@0.8.0(@solana/kit@2.3.0(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': + '@solana-program/compute-budget@0.8.0(@solana/kit@2.3.0(typescript@5.9.2))': dependencies: - '@solana/kit': 2.3.0(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - - '@solana-program/token-2022@0.4.2(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': - dependencies: - '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/kit': 2.3.0(typescript@5.9.2) '@solana-program/token-2022@0.4.2(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2))': dependencies: @@ -17459,13 +17451,9 @@ snapshots: '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@solana/sysvars': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana-program/token-2022@0.4.2(@solana/kit@2.3.0(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': - dependencies: - '@solana/kit': 2.3.0(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - - '@solana-program/token@0.5.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': + '@solana-program/token-2022@0.4.2(@solana/kit@2.3.0(typescript@5.9.2))': dependencies: - '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/kit': 2.3.0(typescript@5.9.2) '@solana-program/token@0.5.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': dependencies: @@ -17475,9 +17463,9 @@ snapshots: dependencies: '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@solana-program/token@0.5.1(@solana/kit@2.3.0(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': + '@solana-program/token@0.5.1(@solana/kit@2.3.0(typescript@5.9.2))': dependencies: - '@solana/kit': 2.3.0(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/kit': 2.3.0(typescript@5.9.2) '@solana/accounts@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': dependencies: @@ -17634,31 +17622,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': - dependencies: - '@solana/accounts': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/codecs': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/errors': 2.3.0(typescript@5.9.2) - '@solana/functional': 2.3.0(typescript@5.9.2) - '@solana/instructions': 2.3.0(typescript@5.9.2) - '@solana/keys': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/programs': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/rpc': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/rpc-parsed-types': 2.3.0(typescript@5.9.2) - '@solana/rpc-spec-types': 2.3.0(typescript@5.9.2) - '@solana/rpc-subscriptions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/signers': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/sysvars': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/transaction-confirmation': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@solana/transaction-messages': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/transactions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - ws - '@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/accounts': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) @@ -17709,7 +17672,7 @@ snapshots: - fastestsmallesttextencoderdecoder - ws - '@solana/kit@2.3.0(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@solana/kit@2.3.0(typescript@5.9.2)': dependencies: '@solana/accounts': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) @@ -17722,11 +17685,11 @@ snapshots: '@solana/rpc': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) '@solana/rpc-parsed-types': 2.3.0(typescript@5.9.2) '@solana/rpc-spec-types': 2.3.0(typescript@5.9.2) - '@solana/rpc-subscriptions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/rpc-subscriptions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) '@solana/signers': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) '@solana/sysvars': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/transaction-confirmation': 2.3.0(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/transaction-confirmation': 2.3.0(typescript@5.9.2) '@solana/transaction-messages': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) '@solana/transactions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) typescript: 5.9.2 @@ -17816,15 +17779,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc-subscriptions-channel-websocket@2.3.0(typescript@5.9.2)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': - dependencies: - '@solana/errors': 2.3.0(typescript@5.9.2) - '@solana/functional': 2.3.0(typescript@5.9.2) - '@solana/rpc-subscriptions-spec': 2.3.0(typescript@5.9.2) - '@solana/subscribable': 2.3.0(typescript@5.9.2) - typescript: 5.9.2 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@solana/rpc-subscriptions-channel-websocket@2.3.0(typescript@5.9.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/errors': 2.3.0(typescript@5.9.2) @@ -17851,24 +17805,6 @@ snapshots: '@solana/subscribable': 2.3.0(typescript@5.9.2) typescript: 5.9.2 - '@solana/rpc-subscriptions@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': - dependencies: - '@solana/errors': 2.3.0(typescript@5.9.2) - '@solana/fast-stable-stringify': 2.3.0(typescript@5.9.2) - '@solana/functional': 2.3.0(typescript@5.9.2) - '@solana/promises': 2.3.0(typescript@5.9.2) - '@solana/rpc-spec-types': 2.3.0(typescript@5.9.2) - '@solana/rpc-subscriptions-api': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/rpc-subscriptions-channel-websocket': 2.3.0(typescript@5.9.2)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@solana/rpc-subscriptions-spec': 2.3.0(typescript@5.9.2) - '@solana/rpc-transformers': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/subscribable': 2.3.0(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - ws - '@solana/rpc-subscriptions@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/errors': 2.3.0(typescript@5.9.2) @@ -18011,23 +17947,6 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/transaction-confirmation@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))': - dependencies: - '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/errors': 2.3.0(typescript@5.9.2) - '@solana/keys': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/promises': 2.3.0(typescript@5.9.2) - '@solana/rpc': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/rpc-subscriptions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/transaction-messages': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/transactions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - ws - '@solana/transaction-confirmation@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) @@ -18062,7 +17981,7 @@ snapshots: - fastestsmallesttextencoderdecoder - ws - '@solana/transaction-confirmation@2.3.0(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + '@solana/transaction-confirmation@2.3.0(typescript@5.9.2)': dependencies: '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) '@solana/codecs-strings': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) @@ -18070,7 +17989,7 @@ snapshots: '@solana/keys': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) '@solana/promises': 2.3.0(typescript@5.9.2) '@solana/rpc': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) - '@solana/rpc-subscriptions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/rpc-subscriptions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@solana/rpc-types': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) '@solana/transaction-messages': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) '@solana/transactions': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) @@ -18688,7 +18607,7 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: '@types/node': 20.19.16 - form-data: 4.0.3 + form-data: 4.0.4 '@types/node@12.20.55': {} @@ -18774,7 +18693,7 @@ snapshots: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 '@types/node': 20.19.16 - form-data: 4.0.3 + form-data: 4.0.4 '@types/supertest@6.0.3': dependencies: @@ -20843,7 +20762,7 @@ snapshots: axios@1.10.0: dependencies: follow-redirects: 1.15.9 - form-data: 4.0.3 + form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -22638,7 +22557,7 @@ snapshots: mime-types: 2.1.35 safe-buffer: 5.2.1 - form-data@4.0.3: + form-data@4.0.4: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -25050,9 +24969,9 @@ snapshots: ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) zod: 4.1.11 - openai@6.2.0(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.11): + openai@6.2.0(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.11): optionalDependencies: - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) zod: 4.1.11 openapi-fetch@0.13.8: @@ -26889,7 +26808,7 @@ snapshots: cookiejar: 2.1.4 debug: 4.4.1 fast-safe-stringify: 2.1.1 - form-data: 4.0.3 + form-data: 4.0.4 formidable: 2.1.5 methods: 1.1.2 mime: 2.6.0 @@ -28332,13 +28251,13 @@ snapshots: bufferutil: 4.0.9 utf-8-validate: 5.0.10 - x402-express@0.6.5(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + x402-express@0.6.5(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: '@coinbase/cdp-sdk': 1.34.0(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10) - '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) express: 4.21.2 viem: 2.33.3(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - x402: 0.6.5(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + x402: 0.6.5(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) zod: 3.25.76 transitivePeerDependencies: - '@azure/app-configuration' @@ -28581,14 +28500,14 @@ snapshots: - utf-8-validate - ws - x402@0.6.5(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.10)(@vercel/blob@0.25.1)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + x402@0.6.5(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.10)(@vercel/blob@0.25.1)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10): dependencies: '@scure/base': 1.2.6 - '@solana-program/compute-budget': 0.8.0(@solana/kit@2.3.0(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10))) - '@solana-program/token': 0.5.1(@solana/kit@2.3.0(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10))) - '@solana-program/token-2022': 0.4.2(@solana/kit@2.3.0(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10))) - '@solana/kit': 2.3.0(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@solana/transaction-confirmation': 2.3.0(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana-program/compute-budget': 0.8.0(@solana/kit@2.3.0(typescript@5.9.2)) + '@solana-program/token': 0.5.1(@solana/kit@2.3.0(typescript@5.9.2)) + '@solana-program/token-2022': 0.4.2(@solana/kit@2.3.0(typescript@5.9.2)) + '@solana/kit': 2.3.0(typescript@5.9.2) + '@solana/transaction-confirmation': 2.3.0(typescript@5.9.2) viem: 2.33.3(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) wagmi: 2.17.5(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.10)(@vercel/blob@0.25.1)(bufferutil@4.0.9)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.33.3(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@3.25.76) zod: 3.25.76 @@ -28625,14 +28544,14 @@ snapshots: - utf-8-validate - ws - x402@0.6.5(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + x402@0.6.5(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: '@scure/base': 1.2.6 - '@solana-program/compute-budget': 0.8.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))) - '@solana-program/token': 0.5.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))) - '@solana-program/token-2022': 0.4.2(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10))) - '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@solana/transaction-confirmation': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana-program/compute-budget': 0.8.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10))) + '@solana-program/token': 0.5.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10))) + '@solana-program/token-2022': 0.4.2(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)) + '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/transaction-confirmation': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) viem: 2.33.3(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) wagmi: 2.17.5(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.33.3(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@3.25.76) zod: 3.25.76