@routstr/sdk 0.1.7 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/index.js +140 -44
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +140 -44
- package/dist/client/index.mjs.map +1 -1
- package/dist/discovery/index.d.mts +2 -1
- package/dist/discovery/index.d.ts +2 -1
- package/dist/discovery/index.js +9 -1
- package/dist/discovery/index.js.map +1 -1
- package/dist/discovery/index.mjs +9 -1
- package/dist/discovery/index.mjs.map +1 -1
- package/dist/index.d.mts +4 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.js +344 -178
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +344 -178
- package/dist/index.mjs.map +1 -1
- package/dist/storage/index.d.mts +52 -1
- package/dist/storage/index.d.ts +52 -1
- package/dist/storage/index.js +192 -131
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/index.mjs +192 -131
- package/dist/storage/index.mjs.map +1 -1
- package/dist/wallet/index.d.mts +7 -1
- package/dist/wallet/index.d.ts +7 -1
- package/dist/wallet/index.js +110 -41
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/index.mjs +110 -41
- package/dist/wallet/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../core/errors.ts","../discovery/ModelManager.ts","../discovery/MintDiscovery.ts","../wallet/AuditLogger.ts","../wallet/tokenUtils.ts","../wallet/CashuSpender.ts","../wallet/BalanceManager.ts","../client/StreamProcessor.ts","../utils/torUtils.ts","../client/ProviderManager.ts","../client/RoutstrClient.ts","../storage/drivers/localStorage.ts","../storage/drivers/memory.ts","../storage/drivers/sqlite.ts","../storage/drivers/indexedDB.ts","../storage/keys.ts","../storage/store.ts","../storage/index.ts","../routeRequests.ts"],"names":["RelayPool","EventStore","onlyEvents","tap","event","mintUrl","spendResult","getDecodedToken","createStore","isBun"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Custom error classes for the Routstr SDK\n * Provides specific error types for different failure modes\n */\n\n/**\n * Error thrown when balance is insufficient for an operation\n */\nexport class InsufficientBalanceError extends Error {\n constructor(\n public required: number,\n public available: number,\n public maxMintBalance: number = 0,\n public maxMintUrl: string = \"\"\n ) {\n super(\n `Insufficient balance: need ${required} sats, have ${available} sats available. ` +\n (maxMintBalance > 0\n ? `Largest mint balance: ${maxMintBalance} sats from ${maxMintUrl}`\n : \"\")\n );\n this.name = \"InsufficientBalanceError\";\n }\n}\n\n/**\n * Error thrown when a provider returns an error response\n */\nexport class ProviderError extends Error {\n constructor(\n public baseUrl: string,\n public statusCode: number,\n message: string,\n public requestId?: string\n ) {\n super(\n `Provider ${baseUrl} returned ${statusCode}: ${message}` +\n (requestId ? ` (Request ID: ${requestId})` : \"\")\n );\n this.name = \"ProviderError\";\n }\n}\n\n/**\n * Error thrown when a mint is unreachable\n */\nexport class MintUnreachableError extends Error {\n constructor(public mintUrl: string) {\n super(\n `Your mint ${mintUrl} is unreachable or is blocking your IP. Please try again later or switch mints.`\n );\n this.name = \"MintUnreachableError\";\n }\n}\n\n/**\n * Error thrown when a token operation fails\n */\nexport class TokenOperationError extends Error {\n constructor(\n message: string,\n public operation: \"send\" | \"receive\" | \"refund\",\n public mintUrl?: string\n ) {\n super(message);\n this.name = \"TokenOperationError\";\n }\n}\n\n/**\n * Error thrown when provider failover fails\n */\nexport class FailoverError extends Error {\n constructor(\n public originalProvider: string,\n public failedProviders: string[],\n message?: string\n ) {\n super(\n message ||\n `All providers failed. Original: ${originalProvider}, Failed: ${failedProviders.join(\", \")}`\n );\n this.name = \"FailoverError\";\n }\n}\n\n/**\n * Error thrown when streaming response processing fails\n */\nexport class StreamingError extends Error {\n constructor(\n message: string,\n public finishReason?: string,\n public accumulatedContent?: string\n ) {\n super(message);\n this.name = \"StreamingError\";\n }\n}\n\n/**\n * Error thrown when model is not found on a provider\n */\nexport class ModelNotFoundError extends Error {\n constructor(public modelId: string, public baseUrl: string) {\n super(`Model '${modelId}' not found on provider ${baseUrl}`);\n this.name = \"ModelNotFoundError\";\n }\n}\n\n/**\n * Error thrown when provider bootstrap fails\n */\nexport class ProviderBootstrapError extends Error {\n constructor(\n public failedProviders: string[],\n message?: string\n ) {\n super(\n message || `Failed to bootstrap providers. Tried: ${failedProviders.join(\", \")}`\n );\n this.name = \"ProviderBootstrapError\";\n }\n}\n\n/**\n * Error thrown when no providers are available\n */\nexport class NoProvidersAvailableError extends Error {\n constructor() {\n super(\"No providers are available for model discovery\");\n this.name = \"NoProvidersAvailableError\";\n }\n}\n\n/**\n * Error thrown when mint discovery fails\n */\nexport class MintDiscoveryError extends Error {\n constructor(\n public baseUrl: string,\n message?: string\n ) {\n super(message || `Failed to discover mints from provider ${baseUrl}`);\n this.name = \"MintDiscoveryError\";\n }\n}\n","/**\n * ModelManager class for discovering, fetching, and managing models from providers\n * Core responsibility: fetching models from providers, caching them, and selecting the best option\n * (lowest cost) across multiple providers\n */\n\nimport type { Model } from \"../core/types\";\nimport type { DiscoveryAdapter, ProviderInfo } from \"./interfaces\";\nimport {\n NoProvidersAvailableError,\n ProviderBootstrapError,\n} from \"../core/errors\";\nimport { onlyEvents, RelayPool } from \"applesauce-relay\";\nimport { EventStore } from \"applesauce-core\";\nimport { tap } from \"rxjs\";\n\n/**\n * Configuration for ModelManager\n */\nexport interface ModelManagerConfig {\n /** URL to fetch provider directory from */\n providerDirectoryUrl?: string;\n /** Additional provider base URLs to include */\n includeProviderUrls?: string[];\n /** Provider base URLs to exclude */\n excludeProviderUrls?: string[];\n /** Cache TTL in milliseconds (default: 21 minutes) */\n cacheTTL?: number;\n}\n\n/**\n * ModelManager handles all model discovery and caching logic\n * Abstracts away storage details via DiscoveryAdapter\n */\nexport class ModelManager {\n private readonly cacheTTL: number;\n private readonly providerDirectoryUrl: string;\n private readonly includeProviderUrls: string[];\n private readonly excludeProviderUrls: string[];\n\n constructor(\n private adapter: DiscoveryAdapter,\n config: ModelManagerConfig = {}\n ) {\n this.providerDirectoryUrl =\n config.providerDirectoryUrl || \"https://api.routstr.com/v1/providers/\";\n this.cacheTTL = config.cacheTTL || 210 * 60 * 1000; // 21 minutes\n this.includeProviderUrls = config.includeProviderUrls || [];\n this.excludeProviderUrls = config.excludeProviderUrls || [];\n }\n\n /**\n * Get the list of bootstrapped provider base URLs\n * @returns Array of provider base URLs\n */\n getBaseUrls(): string[] {\n return this.adapter.getBaseUrlsList();\n }\n\n static async init(\n adapter: DiscoveryAdapter,\n config: ModelManagerConfig = {},\n options: { torMode?: boolean; forceRefresh?: boolean } = {}\n ): Promise<ModelManager> {\n const manager = new ModelManager(adapter, config);\n const torMode = options.torMode ?? false;\n const forceRefresh = options.forceRefresh ?? false;\n const providers = await manager.bootstrapProviders(torMode, forceRefresh);\n await manager.fetchModels(providers, forceRefresh);\n return manager;\n }\n\n /**\n * Bootstrap provider list from the provider directory\n * First tries to fetch from Nostr (kind 30421), falls back to HTTP\n * @param torMode Whether running in Tor context\n * @param forceRefresh Ignore provider cache and refresh provider sources\n * @returns Array of provider base URLs\n * @throws ProviderBootstrapError if all providers fail to fetch\n */\n async bootstrapProviders(\n torMode: boolean = false,\n forceRefresh: boolean = false\n ): Promise<string[]> {\n // First try cache\n if (!forceRefresh) {\n const cachedUrls = this.adapter.getBaseUrlsList();\n if (cachedUrls.length > 0) {\n const lastUpdate = this.adapter.getBaseUrlsLastUpdate();\n const cacheValid =\n lastUpdate && Date.now() - lastUpdate <= this.cacheTTL;\n if (cacheValid) {\n await this.fetchRoutstr21Models(forceRefresh);\n return this.filterBaseUrlsForTor(cachedUrls, torMode);\n }\n }\n }\n\n // Try Nostr first (kind 38421)\n try {\n const nostrProviders = await this.bootstrapFromNostr(38421, torMode);\n if (nostrProviders.length > 0) {\n const filtered = this.filterBaseUrlsForTor(nostrProviders, torMode);\n this.adapter.setBaseUrlsList(filtered);\n this.adapter.setBaseUrlsLastUpdate(Date.now());\n await this.fetchRoutstr21Models(forceRefresh);\n return filtered;\n }\n } catch (e) {\n console.warn(\"Nostr bootstrap failed, falling back to HTTP:\", e);\n }\n\n // Fall back to HTTP\n return this.bootstrapFromHttp(torMode, forceRefresh);\n }\n\n /**\n * Bootstrap providers from Nostr network (kind 30421)\n * @param kind The Nostr kind to fetch\n * @param torMode Whether running in Tor context\n * @returns Array of provider base URLs\n */\n private async bootstrapFromNostr(\n kind: number,\n torMode: boolean\n ): Promise<string[]> {\n const DEFAULT_RELAYS = [\n \"wss://relay.primal.net\",\n \"wss://nos.lol\",\n \"wss://relay.routstr.com\",\n ];\n\n const pool = new RelayPool();\n const localEventStore = new EventStore();\n\n const timeoutMs = 5000;\n\n await new Promise<void>((resolve) => {\n pool\n .req(DEFAULT_RELAYS, {\n kinds: [kind],\n limit: 100,\n })\n .pipe(\n onlyEvents(),\n tap((event) => {\n localEventStore.add(event);\n })\n )\n .subscribe({\n complete: () => {\n resolve();\n },\n });\n\n setTimeout(() => {\n resolve();\n }, timeoutMs);\n });\n\n const timeline = localEventStore.getTimeline({ kinds: [kind] });\n\n const bases = new Set<string>();\n\n for (const event of timeline) {\n const eventUrls: string[] = [];\n\n for (const tag of event.tags) {\n if (tag[0] === \"u\" && typeof tag[1] === \"string\") {\n eventUrls.push(tag[1]);\n }\n }\n\n if (eventUrls.length > 0) {\n for (const url of eventUrls) {\n const normalized = this.normalizeUrl(url);\n if (!torMode || normalized.includes(\".onion\")) {\n bases.add(normalized);\n }\n }\n continue;\n }\n\n try {\n const content = JSON.parse(event.content);\n const providers = Array.isArray(content)\n ? content\n : content.providers || [];\n\n for (const p of providers) {\n const endpoints = this.getProviderEndpoints(p, torMode);\n for (const endpoint of endpoints) {\n bases.add(endpoint);\n }\n }\n } catch {\n try {\n const providers = JSON.parse(event.content);\n if (Array.isArray(providers)) {\n for (const p of providers) {\n const endpoints = this.getProviderEndpoints(p, torMode);\n for (const endpoint of endpoints) {\n bases.add(endpoint);\n }\n }\n }\n } catch {\n console.warn(\n \"[NostrBootstrap] Failed to parse Nostr event content:\",\n event.id\n );\n }\n }\n }\n\n // Add additional configured providers\n for (const url of this.includeProviderUrls) {\n const normalized = this.normalizeUrl(url);\n if (!torMode || normalized.includes(\".onion\")) {\n bases.add(normalized);\n }\n }\n\n const excluded = new Set(\n this.excludeProviderUrls.map((url) => this.normalizeUrl(url))\n );\n\n const result = Array.from(bases).filter((base) => !excluded.has(base));\n\n return result;\n }\n\n /**\n * Bootstrap providers from HTTP endpoint\n * @param torMode Whether running in Tor context\n * @param forceRefresh Ignore routstr21 cache and fetch fresh data\n * @returns Array of provider base URLs\n */\n private async bootstrapFromHttp(\n torMode: boolean,\n forceRefresh: boolean = false\n ): Promise<string[]> {\n try {\n const res = await fetch(this.providerDirectoryUrl);\n if (!res.ok) {\n throw new Error(`Failed to fetch providers: ${res.status}`);\n }\n\n const data = await res.json();\n const providers = Array.isArray(data?.providers) ? data.providers : [];\n\n const bases = new Set<string>();\n for (const p of providers) {\n const endpoints = this.getProviderEndpoints(p, torMode);\n for (const endpoint of endpoints) {\n bases.add(endpoint);\n }\n }\n\n for (const url of this.includeProviderUrls) {\n const normalized = this.normalizeUrl(url);\n if (!torMode || normalized.includes(\".onion\")) {\n bases.add(normalized);\n }\n }\n\n const excluded = new Set(\n this.excludeProviderUrls.map((url) => this.normalizeUrl(url))\n );\n\n const list = Array.from(bases).filter((base) => !excluded.has(base));\n\n if (list.length > 0) {\n this.adapter.setBaseUrlsList(list);\n this.adapter.setBaseUrlsLastUpdate(Date.now());\n await this.fetchRoutstr21Models(forceRefresh);\n }\n\n return list;\n } catch (e) {\n console.error(\"Failed to bootstrap providers\", e);\n throw new ProviderBootstrapError([], `Provider bootstrap failed: ${e}`);\n }\n }\n\n /**\n * Fetch models from all providers and select best-priced options\n * Uses cache if available and not expired\n * @param baseUrls List of provider base URLs to fetch from\n * @param forceRefresh Ignore cache and fetch fresh data\n * @returns Array of unique models with best prices selected\n */\n async fetchModels(\n baseUrls: string[],\n forceRefresh: boolean = false\n ): Promise<Model[]> {\n if (baseUrls.length === 0) {\n throw new NoProvidersAvailableError();\n }\n\n const bestById = new Map<string, { model: Model; base: string }>();\n const modelsFromAllProviders: Record<string, Model[]> = {};\n const disabledProviders = this.adapter.getDisabledProviders();\n\n // Helper to estimate minimum cost for a model\n const estimateMinCost = (m: Model): number => {\n return m?.sats_pricing?.completion ?? 0;\n };\n\n // Fetch from all providers in parallel\n const fetchPromises = baseUrls.map(async (url) => {\n const base = url.endsWith(\"/\") ? url : `${url}/`;\n try {\n // Check cache if not forcing refresh\n let list: Model[];\n\n if (!forceRefresh) {\n const lastUpdate = this.adapter.getProviderLastUpdate(base);\n const cacheValid =\n lastUpdate && Date.now() - lastUpdate <= this.cacheTTL;\n\n if (cacheValid) {\n const cachedModels = this.adapter.getCachedModels();\n const cachedList = cachedModels[base] || [];\n list = cachedList;\n } else {\n // Cache expired or doesn't exist, fetch fresh\n list = await this.fetchModelsFromProvider(base);\n }\n } else {\n // Force refresh\n list = await this.fetchModelsFromProvider(base);\n }\n\n modelsFromAllProviders[base] = list;\n this.adapter.setProviderLastUpdate(base, Date.now());\n\n // Update best-priced models if provider not disabled\n if (!disabledProviders.includes(base)) {\n for (const m of list) {\n const existing = bestById.get(m.id);\n\n // Skip models without sats pricing\n if (!m.sats_pricing) continue;\n\n if (!existing) {\n bestById.set(m.id, { model: m, base });\n continue;\n }\n\n // Replace if this provider has lower cost\n const currentCost = estimateMinCost(m);\n const existingCost = estimateMinCost(existing.model);\n if (currentCost < existingCost && m.sats_pricing) {\n bestById.set(m.id, { model: m, base });\n }\n }\n }\n\n return { success: true, base, list };\n } catch (error) {\n if (this.isProviderDownError(error)) {\n console.warn(`Provider ${base} is down right now.`);\n } else {\n console.warn(`Failed to fetch models from ${base}:`, error);\n }\n this.adapter.setProviderLastUpdate(base, Date.now());\n return { success: false, base };\n }\n });\n\n // Wait for all to complete\n await Promise.allSettled(fetchPromises);\n\n // Cache all provider results\n const existingCache = this.adapter.getCachedModels();\n this.adapter.setCachedModels({\n ...existingCache,\n ...modelsFromAllProviders,\n });\n\n // Return combined models array\n return Array.from(bestById.values()).map((v) => v.model);\n }\n\n /**\n * Fetch models from a single provider\n * @param baseUrl Provider base URL\n * @returns Array of models from provider\n */\n private async fetchModelsFromProvider(baseUrl: string): Promise<Model[]> {\n const res = await fetch(`${baseUrl}v1/models`);\n if (!res.ok) {\n throw new Error(`Failed to fetch models: ${res.status}`);\n }\n\n const json = await res.json();\n const list = Array.isArray(json?.data)\n ? json.data.map((m: Model) => ({\n ...m,\n id: m.id.split(\"/\").pop() || m.id,\n }))\n : [];\n\n return list;\n }\n\n private isProviderDownError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const msg = error.message.toLowerCase();\n if (msg.includes(\"fetch failed\")) return true;\n if (msg.includes(\"502\")) return true;\n if (msg.includes(\"503\")) return true;\n if (msg.includes(\"504\")) return true;\n const cause = error.cause as { code?: string } | undefined;\n return cause?.code === \"ENOTFOUND\";\n }\n\n /**\n * Get all cached models from all providers\n * @returns Record mapping baseUrl -> models\n */\n getAllCachedModels(): Record<string, Model[]> {\n return this.adapter.getCachedModels();\n }\n\n /**\n * Clear cache for a specific provider\n * @param baseUrl Provider base URL\n */\n clearProviderCache(baseUrl: string): void {\n const base = baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n const cached = this.adapter.getCachedModels();\n delete cached[base];\n this.adapter.setCachedModels(cached);\n this.adapter.setProviderLastUpdate(base, 0);\n }\n\n /**\n * Clear all model caches\n */\n clearAllCache(): void {\n this.adapter.setCachedModels({});\n }\n\n /**\n * Filter base URLs based on Tor context\n * @param baseUrls Provider URLs to filter\n * @param torMode Whether in Tor context\n * @returns Filtered URLs appropriate for Tor mode\n */\n filterBaseUrlsForTor(baseUrls: string[], torMode: boolean): string[] {\n if (!torMode) {\n // In normal mode, exclude onion URLs\n return baseUrls.filter((url) => !url.includes(\".onion\"));\n }\n // In Tor mode, only include onion URLs\n return baseUrls.filter((url) => url.includes(\".onion\"));\n }\n\n /**\n * Get provider endpoints from provider info\n * @param provider Provider object from directory\n * @param torMode Whether in Tor context\n * @returns Array of endpoint URLs\n */\n private getProviderEndpoints(provider: any, torMode: boolean): string[] {\n const endpoints: string[] = [];\n\n if (torMode && provider.onion_url) {\n endpoints.push(this.normalizeUrl(provider.onion_url));\n } else if (provider.endpoint_url) {\n endpoints.push(this.normalizeUrl(provider.endpoint_url));\n }\n\n return endpoints;\n }\n\n /**\n * Normalize provider URL with trailing slash\n * @param url URL to normalize\n * @returns Normalized URL\n */\n private normalizeUrl(url: string): string {\n if (!url.startsWith(\"http\")) {\n url = `https://${url}`;\n }\n return url.endsWith(\"/\") ? url : `${url}/`;\n }\n\n /**\n * Fetch routstr21 models from Nostr network (kind 38423)\n * Uses cache if available and not expired\n * @returns Array of model IDs or empty array if not found\n */\n async fetchRoutstr21Models(forceRefresh: boolean = false): Promise<string[]> {\n // Check cache first\n const cachedModels = this.adapter.getRoutstr21Models();\n if (!forceRefresh && cachedModels.length > 0) {\n const lastUpdate = this.adapter.getRoutstr21ModelsLastUpdate();\n const cacheValid = lastUpdate && Date.now() - lastUpdate <= this.cacheTTL;\n if (cacheValid) {\n return cachedModels;\n }\n }\n\n const DEFAULT_RELAYS = [\n \"wss://relay.primal.net\",\n \"wss://nos.lol\",\n \"wss://relay.routstr.com\",\n ];\n\n const pool = new RelayPool();\n const localEventStore = new EventStore();\n\n const timeoutMs = 5000;\n\n await new Promise<void>((resolve) => {\n pool\n .req(DEFAULT_RELAYS, {\n kinds: [38423],\n \"#d\": [\"routstr-21-models\"],\n limit: 1,\n authors: [\n \"4ad6fa2d16e2a9b576c863b4cf7404a70d4dc320c0c447d10ad6ff58993eacc8\",\n ],\n })\n .pipe(\n onlyEvents(),\n tap((event) => {\n localEventStore.add(event);\n })\n )\n .subscribe({\n complete: () => {\n resolve();\n },\n });\n\n setTimeout(() => {\n resolve();\n }, timeoutMs);\n });\n\n const timeline = localEventStore.getTimeline({ kinds: [38423] });\n\n if (timeline.length === 0) {\n return cachedModels.length > 0 ? cachedModels : [];\n }\n\n const event = timeline[0];\n\n try {\n const content = JSON.parse(event.content);\n const models = Array.isArray(content?.models) ? content.models : [];\n this.adapter.setRoutstr21Models(models);\n this.adapter.setRoutstr21ModelsLastUpdate(Date.now());\n return models;\n } catch {\n console.warn(\n \"[Routstr21Models] Failed to parse Nostr event content:\",\n event.id\n );\n return cachedModels.length > 0 ? cachedModels : [];\n }\n }\n}\n","/**\n * MintDiscovery class for discovering mints and provider info\n * Core responsibility: fetching mint information from providers and caching it\n */\n\nimport type { DiscoveryAdapter, ProviderInfo } from \"./interfaces\";\n\n/**\n * Configuration for MintDiscovery\n */\nexport interface MintDiscoveryConfig {\n /** Cache TTL in milliseconds (default: 21 minutes) */\n cacheTTL?: number;\n}\n\n/**\n * MintDiscovery handles mint and provider info discovery\n * Abstracts away storage details via DiscoveryAdapter\n */\nexport class MintDiscovery {\n private readonly cacheTTL: number;\n\n constructor(\n private adapter: DiscoveryAdapter,\n config: MintDiscoveryConfig = {}\n ) {\n this.cacheTTL = config.cacheTTL || 21 * 60 * 1000; // 21 minutes\n }\n\n /**\n * Fetch mints from all providers via their /v1/info endpoints\n * Caches mints and full provider info for later access\n * @param baseUrls List of provider base URLs to fetch from\n * @returns Object with mints and provider info from all providers\n */\n async discoverMints(\n baseUrls: string[],\n options: { forceRefresh?: boolean } = {}\n ): Promise<{\n mintsFromProviders: Record<string, string[]>;\n infoFromProviders: Record<string, ProviderInfo>;\n }> {\n if (baseUrls.length === 0) {\n return { mintsFromProviders: {}, infoFromProviders: {} };\n }\n\n const mintsFromAllProviders: Record<string, string[]> = {};\n const infoFromAllProviders: Record<string, ProviderInfo> = {};\n const forceRefresh = options.forceRefresh ?? false;\n\n // Fetch info from each provider\n const fetchPromises = baseUrls.map(async (url) => {\n const base = url.endsWith(\"/\") ? url : `${url}/`;\n try {\n if (!forceRefresh) {\n const lastUpdate = this.adapter.getProviderLastUpdate(base);\n const cacheValid =\n lastUpdate && Date.now() - lastUpdate <= this.cacheTTL;\n if (cacheValid) {\n const cachedMints = this.adapter.getCachedMints()[base] || [];\n const cachedInfo = this.adapter.getCachedProviderInfo()[base];\n mintsFromAllProviders[base] = cachedMints;\n if (cachedInfo) {\n infoFromAllProviders[base] = cachedInfo;\n }\n return {\n success: true,\n base,\n mints: cachedMints,\n info: cachedInfo,\n };\n }\n }\n\n const res = await fetch(`${base}v1/info`);\n if (!res.ok) {\n throw new Error(`Failed to fetch info: ${res.status}`);\n }\n\n const json = await res.json();\n\n // Extract mints array from response\n const mints: string[] = Array.isArray(json?.mints) ? json.mints : [];\n\n // Normalize mint URLs (remove trailing slashes for consistency)\n const normalizedMints = mints.map((mint) =>\n mint.endsWith(\"/\") ? mint.slice(0, -1) : mint\n );\n\n // Save provider mints and full info\n mintsFromAllProviders[base] = normalizedMints;\n infoFromAllProviders[base] = json;\n this.adapter.setProviderLastUpdate(base, Date.now());\n\n return { success: true, base, mints: normalizedMints, info: json };\n } catch (error) {\n this.adapter.setProviderLastUpdate(base, Date.now());\n if (this.isProviderDownError(error)) {\n console.warn(`Provider ${base} is down right now.`);\n } else {\n console.warn(`Failed to fetch mints from ${base}:`, error);\n }\n return { success: false, base, mints: [], info: null };\n }\n });\n\n // Wait for all to complete (but allow individual failures)\n const results = await Promise.allSettled(fetchPromises);\n\n // Handle results\n for (const result of results) {\n if (result.status === \"fulfilled\") {\n const { base, mints, info } = result.value;\n mintsFromAllProviders[base] = mints;\n if (info) {\n infoFromAllProviders[base] = info;\n }\n } else {\n // Log but don't throw - continue with partial results\n console.error(\"Mint discovery error:\", result.reason);\n }\n }\n\n // Cache all results\n try {\n this.adapter.setCachedMints(mintsFromAllProviders);\n this.adapter.setCachedProviderInfo(infoFromAllProviders);\n } catch (error) {\n console.error(\"Error caching mint discovery results:\", error);\n }\n\n return {\n mintsFromProviders: mintsFromAllProviders,\n infoFromProviders: infoFromAllProviders,\n };\n }\n\n /**\n * Get cached mints from all providers\n * @returns Record mapping baseUrl -> mint URLs\n */\n getCachedMints(): Record<string, string[]> {\n return this.adapter.getCachedMints();\n }\n\n /**\n * Get cached provider info from all providers\n * @returns Record mapping baseUrl -> provider info\n */\n getCachedProviderInfo(): Record<string, ProviderInfo> {\n return this.adapter.getCachedProviderInfo();\n }\n\n /**\n * Get mints for a specific provider\n * @param baseUrl Provider base URL\n * @returns Array of mint URLs for the provider\n */\n getProviderMints(baseUrl: string): string[] {\n const normalized = baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n const allMints = this.getCachedMints();\n return allMints[normalized] || [];\n }\n\n /**\n * Get info for a specific provider\n * @param baseUrl Provider base URL\n * @returns Provider info object or null if not found\n */\n getProviderInfo(baseUrl: string): ProviderInfo | null {\n const normalized = baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n const allInfo = this.getCachedProviderInfo();\n return allInfo[normalized] || null;\n }\n\n /**\n * Clear mint cache for a specific provider\n * @param baseUrl Provider base URL\n */\n clearProviderMintCache(baseUrl: string): void {\n const normalized = baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n\n const mints = this.getCachedMints();\n delete mints[normalized];\n this.adapter.setCachedMints(mints);\n\n const info = this.getCachedProviderInfo();\n delete info[normalized];\n this.adapter.setCachedProviderInfo(info);\n }\n\n /**\n * Clear all mint caches\n */\n clearAllCache(): void {\n this.adapter.setCachedMints({});\n this.adapter.setCachedProviderInfo({});\n }\n\n private isProviderDownError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const msg = error.message.toLowerCase();\n if (msg.includes(\"fetch failed\")) return true;\n if (msg.includes(\"502\")) return true;\n if (msg.includes(\"503\")) return true;\n if (msg.includes(\"504\")) return true;\n const cause = error.cause as { code?: string } | undefined;\n if (cause?.code === \"ENOTFOUND\") return true;\n return false;\n }\n}\n","/**\n * AuditLogger - Transaction audit logging utility\n * Writes JSON-formatted transaction logs to audit.log\n */\n\nexport interface AuditLogEntry {\n timestamp: string;\n action: \"spend\" | \"topup\" | \"refund\" | \"receive\" | \"balance_check\";\n totalBalance: number;\n providerBalances: Record<string, number>;\n mintBalances: Record<string, number>;\n amount?: number;\n mintUrl?: string;\n baseUrl?: string;\n status: \"success\" | \"failed\";\n details?: string;\n}\n\nexport class AuditLogger {\n private static instance: AuditLogger | null = null;\n\n static getInstance(): AuditLogger {\n if (!AuditLogger.instance) {\n AuditLogger.instance = new AuditLogger();\n }\n return AuditLogger.instance;\n }\n\n async log(entry: Omit<AuditLogEntry, \"timestamp\">): Promise<void> {\n const fullEntry: AuditLogEntry = {\n ...entry,\n timestamp: new Date().toISOString(),\n };\n\n const logLine = JSON.stringify(fullEntry) + \"\\n\";\n\n if (typeof window === \"undefined\") {\n try {\n const fs = await import(\"fs\");\n const path = await import(\"path\");\n const logPath = path.join(process.cwd(), \"audit.log\");\n fs.appendFileSync(logPath, logLine);\n } catch (error) {\n console.error(\"[AuditLogger] Failed to write to file:\", error);\n }\n } else {\n console.log(\"[AUDIT]\", logLine.trim());\n }\n }\n\n async logBalanceSnapshot(\n action: AuditLogEntry[\"action\"],\n amounts: {\n totalBalance: number;\n providerBalances: Record<string, number>;\n mintBalances: Record<string, number>;\n },\n options?: {\n amount?: number;\n mintUrl?: string;\n baseUrl?: string;\n status?: \"success\" | \"failed\";\n details?: string;\n }\n ): Promise<void> {\n await this.log({\n action,\n totalBalance: amounts.totalBalance,\n providerBalances: amounts.providerBalances,\n mintBalances: amounts.mintBalances,\n amount: options?.amount,\n mintUrl: options?.mintUrl,\n baseUrl: options?.baseUrl,\n status: options?.status ?? \"success\",\n details: options?.details,\n });\n }\n}\n\nexport const auditLogger = AuditLogger.getInstance();\n","import type { MintSelection } from \"../core/types\";\n\nexport function isNetworkErrorMessage(message: string): boolean {\n return (\n message.includes(\"NetworkError when attempting to fetch resource\") ||\n message.includes(\"Failed to fetch\") ||\n message.includes(\"Load failed\")\n );\n}\n\nexport function getBalanceInSats(\n balance: number,\n unit: \"sat\" | \"msat\" | string | undefined\n): number {\n return unit === \"msat\" ? balance / 1000 : balance;\n}\n\nexport function getTotalMintBalanceInSats(\n balances: Record<string, number>,\n units: Record<string, \"sat\" | \"msat\">\n): number {\n let total = 0;\n for (const mintUrl in balances) {\n total += getBalanceInSats(balances[mintUrl], units[mintUrl]);\n }\n return total;\n}\n\nexport function selectMintWithBalance(\n balances: Record<string, number>,\n units: Record<string, string>,\n amount: number,\n excludeMints: string[] = []\n): MintSelection {\n for (const mintUrl in balances) {\n if (excludeMints.includes(mintUrl)) {\n continue;\n }\n\n const balanceInSats = getBalanceInSats(balances[mintUrl], units[mintUrl]);\n if (balanceInSats >= amount) {\n return { selectedMintUrl: mintUrl, selectedMintBalance: balanceInSats };\n }\n }\n\n return { selectedMintUrl: null, selectedMintBalance: 0 };\n}\n","/**\n * CashuSpender - Core spending logic for Cashu tokens\n *\n * Handles:\n * - Mint selection with sufficient balance\n * - Provider mint compatibility checks\n * - Retry logic with alternate mints\n * - Critical section management (busy state)\n *\n * Extracted from hooks/useCashuWithXYZ.ts\n */\n\nimport type { WalletAdapter, StorageAdapter } from \"./interfaces\";\nimport type { SpendResult } from \"../core/types\";\nimport { InsufficientBalanceError } from \"../core/errors\";\nimport { BalanceManager } from \"./BalanceManager\";\nimport { auditLogger } from \"./AuditLogger\";\nimport { getBalanceInSats, isNetworkErrorMessage } from \"./tokenUtils\";\n\n/**\n * Options for spending cashu tokens\n */\nexport interface SpendOptions {\n /** The mint URL to send from (can be overridden if insufficient balance) */\n mintUrl: string;\n\n /** The amount to spend in sats */\n amount: number;\n\n /** The provider base URL (for token storage and provider mint checks) */\n baseUrl: string;\n\n /** Whether to reuse an existing token if available */\n reuseToken?: boolean;\n\n /** Optional P2PK public key */\n p2pkPubkey?: string;\n\n /** Array of mint URLs to exclude (for retry logic) */\n excludeMints?: string[];\n\n /** Current retry count (for internal recursion) */\n retryCount?: number;\n\n /** Specific provider baseUrls to refund (if not provided, refunds all except current) */\n refundBaseUrls?: string[];\n}\n\ntype DebugLevel = \"DEBUG\" | \"WARN\" | \"ERROR\";\n\n/**\n * CashuSpender manages the spending of Cashu tokens\n */\nexport class CashuSpender {\n private _isBusy = false;\n private debugLevel: DebugLevel = \"WARN\";\n\n constructor(\n private walletAdapter: WalletAdapter,\n private storageAdapter: StorageAdapter,\n private _providerRegistry?: unknown,\n private balanceManager?: BalanceManager\n ) {}\n\n async receiveToken(token: string): Promise<{\n success: boolean;\n amount: number;\n unit: \"sat\" | \"msat\";\n message?: string;\n }> {\n const result = await this.walletAdapter.receiveToken(token);\n\n if (!result.success && result.message?.includes(\"Failed to fetch mint\")) {\n const cachedTokens = this.storageAdapter.getCachedReceiveTokens();\n const existingIndex = cachedTokens.findIndex((t) => t.token === token);\n if (existingIndex === -1) {\n this.storageAdapter.setCachedReceiveTokens([\n ...cachedTokens,\n {\n token,\n amount: result.amount,\n unit: result.unit,\n createdAt: Date.now(),\n },\n ]);\n }\n }\n\n return result;\n }\n\n private async _getBalanceState(): Promise<{\n totalBalance: number;\n providerBalances: Record<string, number>;\n mintBalances: Record<string, number>;\n }> {\n const mintBalances = await this.walletAdapter.getBalances();\n const units = this.walletAdapter.getMintUnits();\n\n let totalMintBalance = 0;\n const normalizedMintBalances: Record<string, number> = {};\n for (const url in mintBalances) {\n const balance = mintBalances[url];\n const unit = units[url];\n const balanceInSats = getBalanceInSats(balance, unit);\n normalizedMintBalances[url] = balanceInSats;\n totalMintBalance += balanceInSats;\n }\n\n const pendingDistribution =\n this.storageAdapter.getCachedTokenDistribution();\n const providerBalances: Record<string, number> = {};\n let totalProviderBalance = 0;\n for (const pending of pendingDistribution) {\n providerBalances[pending.baseUrl] = pending.amount;\n totalProviderBalance += pending.amount;\n }\n\n const apiKeys = this.storageAdapter.getAllApiKeys();\n for (const apiKey of apiKeys) {\n if (!providerBalances[apiKey.baseUrl]) {\n providerBalances[apiKey.baseUrl] = apiKey.balance;\n totalProviderBalance += apiKey.balance;\n }\n }\n\n return {\n totalBalance: totalMintBalance + totalProviderBalance,\n providerBalances,\n mintBalances: normalizedMintBalances,\n };\n }\n\n private async _logTransaction(\n action: \"spend\" | \"topup\" | \"refund\" | \"receive\" | \"balance_check\",\n options?: {\n amount?: number;\n mintUrl?: string;\n baseUrl?: string;\n status?: \"success\" | \"failed\";\n details?: string;\n }\n ): Promise<void> {\n const balanceState = await this._getBalanceState();\n await auditLogger.logBalanceSnapshot(action, balanceState, options);\n }\n\n /**\n * Check if the spender is currently in a critical operation\n */\n get isBusy(): boolean {\n return this._isBusy;\n }\n\n getDebugLevel(): DebugLevel {\n return this.debugLevel;\n }\n\n setDebugLevel(level: DebugLevel): void {\n this.debugLevel = level;\n }\n\n private _log(level: \"DEBUG\" | \"WARN\" | \"ERROR\", ...args: unknown[]): void {\n const levelPriority: Record<DebugLevel, number> = {\n DEBUG: 0,\n WARN: 1,\n ERROR: 2,\n };\n\n if (levelPriority[level] >= levelPriority[this.debugLevel]) {\n switch (level) {\n case \"DEBUG\":\n console.log(...args);\n break;\n case \"WARN\":\n console.warn(...args);\n break;\n case \"ERROR\":\n console.error(...args);\n break;\n }\n }\n }\n\n /**\n * Spend Cashu tokens with automatic mint selection and retry logic\n * Throws errors on failure instead of returning failed SpendResult\n */\n async spend(options: SpendOptions): Promise<SpendResult> {\n const {\n mintUrl,\n amount,\n baseUrl,\n reuseToken = false,\n p2pkPubkey,\n excludeMints = [],\n retryCount = 0,\n } = options;\n\n this._isBusy = true;\n\n try {\n const result = await this._spendInternal({\n mintUrl,\n amount,\n baseUrl,\n reuseToken,\n p2pkPubkey,\n excludeMints,\n retryCount,\n });\n\n if (result.status === \"failed\" || !result.token) {\n const errorMsg =\n result.error || `Insufficient balance. Need ${amount} sats.`;\n\n if (this._isNetworkError(errorMsg)) {\n throw new Error(\n `Your mint ${mintUrl} is unreachable or is blocking your IP. Please try again later or switch mints.`\n );\n }\n\n if (result.errorDetails) {\n throw new InsufficientBalanceError(\n result.errorDetails.required,\n result.errorDetails.available,\n result.errorDetails.maxMintBalance,\n result.errorDetails.maxMintUrl\n );\n }\n\n throw new Error(errorMsg);\n }\n\n return result;\n } finally {\n this._isBusy = false;\n }\n }\n\n /**\n * Check if error message indicates a network error\n */\n private _isNetworkError(message: string): boolean {\n return (\n isNetworkErrorMessage(message) ||\n (message.includes(\"Your mint\") && message.includes(\"unreachable\"))\n );\n }\n\n /**\n * Internal spending logic\n */\n private async _spendInternal(options: SpendOptions): Promise<SpendResult> {\n let {\n mintUrl,\n amount,\n baseUrl,\n reuseToken,\n p2pkPubkey,\n excludeMints,\n retryCount,\n } = options;\n\n this._log(\n \"DEBUG\",\n `[CashuSpender] _spendInternal: amount=${amount}, mintUrl=${mintUrl}, baseUrl=${baseUrl}, reuseToken=${reuseToken}`\n );\n\n // Validate amount\n let adjustedAmount = Math.ceil(amount);\n if (!adjustedAmount || isNaN(adjustedAmount)) {\n this._log(\n \"ERROR\",\n `[CashuSpender] _spendInternal: Invalid amount: ${amount}`\n );\n return {\n token: null,\n status: \"failed\",\n balance: 0,\n error: \"Please enter a valid amount\",\n };\n }\n\n // Try to get existing token for reuse\n if (reuseToken && baseUrl) {\n this._log(\n \"DEBUG\",\n `[CashuSpender] _spendInternal: Attempting to reuse token for ${baseUrl}`\n );\n const existingResult = await this._tryReuseToken(\n baseUrl,\n adjustedAmount,\n mintUrl\n );\n if (existingResult) {\n this._log(\n \"DEBUG\",\n `[CashuSpender] _spendInternal: Successfully reused token, balance: ${existingResult.balance}`\n );\n return existingResult;\n }\n this._log(\n \"DEBUG\",\n `[CashuSpender] _spendInternal: Could not reuse token, will create new token`\n );\n }\n\n // Get current balances\n const balances = await this.walletAdapter.getBalances();\n const units = this.walletAdapter.getMintUnits();\n\n // Calculate total available balance\n let totalBalance = 0;\n for (const url in balances) {\n const balance = balances[url];\n const unit = units[url];\n const balanceInSats = getBalanceInSats(balance, unit);\n totalBalance += balanceInSats;\n }\n\n // Check pending tokens\n const pendingDistribution =\n this.storageAdapter.getCachedTokenDistribution();\n const totalPending = pendingDistribution.reduce(\n (sum, item) => sum + item.amount,\n 0\n );\n\n this._log(\n \"DEBUG\",\n `[CashuSpender] _spendInternal: totalBalance=${totalBalance}, totalPending=${totalPending}, adjustedAmount=${adjustedAmount}`\n );\n\n const totalAvailableBalance = totalBalance + totalPending;\n\n // Check total balance\n if (totalAvailableBalance < adjustedAmount) {\n this._log(\n \"ERROR\",\n `[CashuSpender] _spendInternal: Insufficient balance, have=${totalAvailableBalance}, need=${adjustedAmount}`\n );\n return this._createInsufficientBalanceError(\n adjustedAmount,\n balances,\n units,\n totalAvailableBalance\n );\n }\n\n let token: string | null = null;\n let selectedMintUrl: string | undefined;\n let spentAmount = adjustedAmount;\n\n if (this.balanceManager) {\n const tokenResult = await this.balanceManager.createProviderToken({\n mintUrl,\n baseUrl,\n amount: adjustedAmount,\n p2pkPubkey,\n excludeMints,\n retryCount,\n });\n\n if (!tokenResult.success || !tokenResult.token) {\n if ((tokenResult.error || \"\").includes(\"Insufficient balance\")) {\n return this._createInsufficientBalanceError(\n adjustedAmount,\n balances,\n units,\n totalAvailableBalance\n );\n }\n\n return {\n token: null,\n status: \"failed\",\n balance: 0,\n error: tokenResult.error || \"Failed to create token\",\n };\n }\n\n token = tokenResult.token;\n selectedMintUrl = tokenResult.selectedMintUrl;\n spentAmount = tokenResult.amountSpent || adjustedAmount;\n } else {\n try {\n token = await this.walletAdapter.sendToken(\n mintUrl,\n adjustedAmount,\n p2pkPubkey\n );\n selectedMintUrl = mintUrl;\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n return {\n token: null,\n status: \"failed\",\n balance: 0,\n error: `Error generating token: ${errorMsg}`,\n };\n }\n }\n\n // Store token and return\n if (token && baseUrl) {\n this.storageAdapter.setToken(baseUrl, token);\n }\n\n this._logTransaction(\"spend\", {\n amount: spentAmount,\n mintUrl: selectedMintUrl || mintUrl,\n baseUrl,\n status: \"success\",\n });\n\n this._log(\n \"DEBUG\",\n `[CashuSpender] _spendInternal: Successfully spent ${spentAmount}, returning token with balance=${spentAmount}`\n );\n\n return {\n token,\n status: \"success\",\n balance: spentAmount,\n unit:\n (selectedMintUrl ? units[selectedMintUrl] : units[mintUrl]) || \"sat\",\n };\n }\n\n /**\n * Try to reuse an existing token\n */\n private async _tryReuseToken(\n baseUrl: string,\n amount: number,\n mintUrl: string\n ): Promise<SpendResult | null> {\n const storedToken = this.storageAdapter.getToken(baseUrl);\n if (!storedToken) return null;\n\n // Get pending distribution to check balance\n const pendingDistribution =\n this.storageAdapter.getCachedTokenDistribution();\n const balanceForBaseUrl =\n pendingDistribution.find((b) => b.baseUrl === baseUrl)?.amount || 0;\n\n this._log(\"DEBUG\", \"RESUINGDSR GSODGNSD\", balanceForBaseUrl, amount);\n\n if (balanceForBaseUrl > amount) {\n const units = this.walletAdapter.getMintUnits();\n const unit = units[mintUrl] || \"sat\";\n return {\n token: storedToken,\n status: \"success\",\n balance: balanceForBaseUrl,\n unit,\n };\n }\n\n // Token exists but insufficient balance - attempt topup\n if (this.balanceManager) {\n const topUpAmount = Math.ceil(amount * 1.2 - balanceForBaseUrl);\n const topUpResult = await this.balanceManager.topUp({\n mintUrl,\n baseUrl,\n amount: topUpAmount,\n });\n this._log(\"DEBUG\", \"TOPUP \", topUpResult);\n\n if (topUpResult.success && topUpResult.toppedUpAmount) {\n const newBalance = balanceForBaseUrl + topUpResult.toppedUpAmount;\n const units = this.walletAdapter.getMintUnits();\n const unit = units[mintUrl] || \"sat\";\n\n this._logTransaction(\"topup\", {\n amount: topUpResult.toppedUpAmount,\n mintUrl,\n baseUrl,\n status: \"success\",\n });\n\n return {\n token: storedToken,\n status: \"success\",\n balance: newBalance,\n unit,\n };\n }\n\n const providerBalance = await this._getProviderTokenBalance(\n baseUrl,\n storedToken\n );\n this._log(\"DEBUG\", providerBalance);\n if (providerBalance <= 0) {\n this.storageAdapter.removeToken(baseUrl);\n }\n }\n\n return null;\n }\n\n /**\n * Refund specific providers without retrying spend\n */\n async refundProviders(\n baseUrls: string[],\n mintUrl: string,\n refundApiKeys: boolean = false\n ): Promise<{ baseUrl: string; success: boolean }[]> {\n const results: { baseUrl: string; success: boolean }[] = [];\n\n const pendingDistribution =\n this.storageAdapter.getCachedTokenDistribution();\n\n const toRefund = pendingDistribution.filter((p) =>\n baseUrls.includes(p.baseUrl)\n );\n\n const refundResults = await Promise.allSettled(\n toRefund.map(async (pending) => {\n const token = this.storageAdapter.getToken(pending.baseUrl);\n this._log(\"DEBUG\", token, this.balanceManager);\n if (!token || !this.balanceManager) {\n return { baseUrl: pending.baseUrl, success: false };\n }\n\n const tokenBalance = await this.balanceManager.getTokenBalance(\n token,\n pending.baseUrl\n );\n\n if (tokenBalance.reserved > 0) {\n return { baseUrl: pending.baseUrl, success: false };\n }\n\n const result = await this.balanceManager.refund({\n mintUrl,\n baseUrl: pending.baseUrl,\n token,\n });\n this._log(\"DEBUG\", result);\n\n if (result.success) {\n this.storageAdapter.removeToken(pending.baseUrl);\n }\n\n return { baseUrl: pending.baseUrl, success: result.success };\n })\n );\n\n results.push(\n ...refundResults.map((r) =>\n r.status === \"fulfilled\" ? r.value : { baseUrl: \"\", success: false }\n )\n );\n\n if (refundApiKeys) {\n const apiKeyDistribution = this.storageAdapter.getApiKeyDistribution();\n const apiKeysToRefund = apiKeyDistribution.filter((p) =>\n baseUrls.includes(p.baseUrl)\n );\n\n for (const apiKeyEntry of apiKeysToRefund) {\n const apiKeyEntryFull = this.storageAdapter.getApiKey(\n apiKeyEntry.baseUrl\n );\n if (apiKeyEntryFull && this.balanceManager) {\n const refundResult = await this.balanceManager.refundApiKey({\n mintUrl,\n baseUrl: apiKeyEntry.baseUrl,\n apiKey: apiKeyEntryFull.key,\n });\n\n if (refundResult.success) {\n this.storageAdapter.updateApiKeyBalance(apiKeyEntry.baseUrl, 0);\n }\n\n results.push({\n baseUrl: apiKeyEntry.baseUrl,\n success: refundResult.success,\n });\n } else {\n results.push({\n baseUrl: apiKeyEntry.baseUrl,\n success: false,\n });\n }\n }\n }\n\n return results;\n }\n\n /**\n * Create an insufficient balance error result\n */\n private _createInsufficientBalanceError(\n required: number,\n balances: Record<string, number>,\n units: Record<string, string>,\n availableBalance?: number\n ): SpendResult {\n let maxBalance = 0;\n let maxMintUrl = \"\";\n\n for (const mintUrl in balances) {\n const balance = balances[mintUrl];\n const unit = units[mintUrl];\n const balanceInSats = getBalanceInSats(balance, unit);\n\n if (balanceInSats > maxBalance) {\n maxBalance = balanceInSats;\n maxMintUrl = mintUrl;\n }\n }\n\n const error = new InsufficientBalanceError(\n required,\n availableBalance ?? maxBalance,\n maxBalance,\n maxMintUrl\n );\n\n return {\n token: null,\n status: \"failed\",\n balance: 0,\n error: error.message,\n errorDetails: {\n required,\n available: availableBalance ?? maxBalance,\n maxMintBalance: maxBalance,\n maxMintUrl,\n },\n };\n }\n\n private async _getProviderTokenBalance(\n baseUrl: string,\n token: string\n ): Promise<number> {\n try {\n const response = await fetch(`${baseUrl}v1/wallet/info`, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (response.ok) {\n const data = await response.json();\n return data.balance / 1000;\n }\n } catch {\n return 0;\n }\n return 0;\n }\n}\n","/**\n * BalanceManager - Handles refunding and topping up tokens from providers\n *\n * Handles:\n * - Fetching refund tokens from provider API\n * - Receiving/storing refunded tokens\n * - Topping up API key balances with cashu tokens\n * - Error handling for various refund/topup failure modes\n *\n * Extracted from utils/cashuUtils.ts\n */\n\nimport type {\n WalletAdapter,\n StorageAdapter,\n ProviderRegistry,\n} from \"./interfaces\";\nimport type { RefundResult, TopUpResult } from \"../core/types\";\nimport { InsufficientBalanceError } from \"../core/errors\";\nimport { CashuSpender } from \"./CashuSpender\";\nimport {\n getBalanceInSats,\n isNetworkErrorMessage,\n selectMintWithBalance,\n} from \"./tokenUtils\";\n\n/**\n * Options for refunding tokens\n */\nexport interface RefundOptions {\n /** The mint URL (for NIP-60 wallet operations) */\n mintUrl: string;\n\n /** The provider base URL */\n baseUrl: string;\n\n /** Optional specific token to refund (if not provided, uses stored token) */\n token?: string;\n}\n\n/**\n * Options for refunding API key balance\n */\nexport interface RefundApiKeyOptions {\n /** The mint URL (for NIP-60 wallet operations) */\n mintUrl: string;\n\n /** The provider base URL */\n baseUrl: string;\n\n /** The API key to use for authentication */\n apiKey: string;\n}\n\n/**\n * Options for topping up API key balance\n */\nexport interface TopUpOptions {\n /** The mint URL to spend from */\n mintUrl: string;\n\n /** The provider base URL */\n baseUrl: string;\n\n /** Amount to top up in sats */\n amount: number;\n\n /** Optional specific API key to top up (if not provided, uses stored token) */\n token?: string;\n}\n\nexport interface CreateProviderTokenOptions {\n mintUrl: string;\n baseUrl: string;\n amount: number;\n p2pkPubkey?: string;\n excludeMints?: string[];\n retryCount?: number;\n}\n\nexport interface ProviderTokenResult {\n success: boolean;\n token?: string;\n error?: string;\n selectedMintUrl?: string;\n amountSpent?: number;\n}\n\n/**\n * BalanceManager handles token refunds and topups from providers\n */\nexport class BalanceManager {\n private cashuSpender: CashuSpender;\n\n constructor(\n private walletAdapter: WalletAdapter,\n private storageAdapter: StorageAdapter,\n private providerRegistry?: ProviderRegistry,\n cashuSpender?: CashuSpender\n ) {\n if (cashuSpender) {\n this.cashuSpender = cashuSpender;\n } else {\n this.cashuSpender = new CashuSpender(\n walletAdapter,\n storageAdapter,\n providerRegistry,\n this\n );\n }\n }\n\n /**\n * Unified refund - handles both NIP-60 and legacy wallet refunds\n */\n async refund(options: RefundOptions): Promise<RefundResult> {\n const { mintUrl, baseUrl, token: providedToken } = options;\n\n const storedToken = providedToken || this.storageAdapter.getToken(baseUrl);\n\n if (!storedToken) {\n console.log(\"[BalanceManager] No token to refund, returning early\");\n return { success: true, message: \"No API key to refund\" };\n }\n\n let fetchResult:\n | { success: boolean; token?: string; requestId?: string; error?: string }\n | undefined;\n\n try {\n // Fetch refund token from provider\n fetchResult = await this._fetchRefundToken(baseUrl, storedToken);\n\n if (!fetchResult.success) {\n return {\n success: false,\n message: fetchResult.error || \"Refund failed\",\n requestId: fetchResult.requestId,\n };\n }\n\n if (!fetchResult.token) {\n return {\n success: false,\n message: \"No token received from refund\",\n requestId: fetchResult.requestId,\n };\n }\n\n // Check if this is a \"no balance to refund\" case\n if (fetchResult.error === \"No balance to refund\") {\n console.log(\n \"[BalanceManager] No balance to refund, removing stored token\"\n );\n this.storageAdapter.removeToken(baseUrl);\n return { success: true, message: \"No balance to refund\" };\n }\n\n // Receive the refunded token\n const receiveResult = await this.cashuSpender.receiveToken(\n fetchResult.token\n );\n const totalAmountMsat =\n receiveResult.unit === \"msat\"\n ? receiveResult.amount\n : receiveResult.amount * 1000;\n\n // Remove the stored token if we used it from storage\n if (!providedToken) {\n this.storageAdapter.removeToken(baseUrl);\n }\n\n return {\n success: receiveResult.success,\n refundedAmount: totalAmountMsat,\n requestId: fetchResult.requestId,\n };\n } catch (error) {\n console.error(\"[BalanceManager] Refund error\", error);\n return this._handleRefundError(error, mintUrl, fetchResult?.requestId);\n }\n }\n\n /**\n * Refund API key balance - convert remaining API key balance to cashu token\n */\n async refundApiKey(options: RefundApiKeyOptions): Promise<RefundResult> {\n const { mintUrl, baseUrl, apiKey } = options;\n\n if (!apiKey) {\n return { success: false, message: \"No API key to refund\" };\n }\n\n let fetchResult:\n | { success: boolean; token?: string; requestId?: string; error?: string }\n | undefined;\n\n try {\n fetchResult = await this._fetchRefundTokenWithApiKey(baseUrl, apiKey);\n\n if (!fetchResult.success) {\n return {\n success: false,\n message: fetchResult.error || \"API key refund failed\",\n requestId: fetchResult.requestId,\n };\n }\n\n if (!fetchResult.token) {\n return {\n success: false,\n message: \"No token received from API key refund\",\n requestId: fetchResult.requestId,\n };\n }\n\n if (fetchResult.error === \"No balance to refund\") {\n return { success: false, message: \"No balance to refund\" };\n }\n\n const receiveResult = await this.cashuSpender.receiveToken(\n fetchResult.token\n );\n const totalAmountMsat =\n receiveResult.unit === \"msat\"\n ? receiveResult.amount\n : receiveResult.amount * 1000;\n\n if (receiveResult.success) {\n this.storageAdapter.removeApiKey(baseUrl); // TODO: remove this after all nodes upgrade to 0.4.0\n }\n\n return {\n success: receiveResult.success,\n refundedAmount: totalAmountMsat,\n requestId: fetchResult.requestId,\n };\n } catch (error) {\n console.error(\"[BalanceManager] API key refund error\", error);\n return this._handleRefundError(error, mintUrl, fetchResult?.requestId);\n }\n }\n\n /**\n * Fetch refund token from provider API using API key authentication\n */\n private async _fetchRefundTokenWithApiKey(\n baseUrl: string,\n apiKey: string\n ): Promise<{\n success: boolean;\n token?: string;\n requestId?: string;\n error?: string;\n }> {\n if (!baseUrl) {\n return {\n success: false,\n error: \"No base URL configured\",\n };\n }\n\n const normalizedBaseUrl = baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n const url = `${normalizedBaseUrl}v1/wallet/refund`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n controller.abort();\n }, 60000);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const requestId =\n response.headers.get(\"x-routstr-request-id\") || undefined;\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n requestId,\n error: `API key refund failed: ${\n errorData?.detail || response.statusText\n }`,\n };\n }\n\n const data = await response.json();\n return {\n success: true,\n token: data.token,\n requestId,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n console.error(\n \"[BalanceManager._fetchRefundTokenWithApiKey] Fetch error\",\n error\n );\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n return {\n success: false,\n error: \"Request timed out after 1 minute\",\n };\n }\n return {\n success: false,\n error: error.message,\n };\n }\n\n return {\n success: false,\n error: \"Unknown error occurred during API key refund request\",\n };\n }\n }\n\n /**\n * Top up API key balance with a cashu token\n */\n async topUp(options: TopUpOptions): Promise<TopUpResult> {\n const { mintUrl, baseUrl, amount, token: providedToken } = options;\n\n if (!amount || amount <= 0) {\n return { success: false, message: \"Invalid top up amount\" };\n }\n\n const storedToken = providedToken || this.storageAdapter.getToken(baseUrl);\n if (!storedToken) {\n return { success: false, message: \"No API key available for top up\" };\n }\n\n let cashuToken: string | null = null;\n let requestId: string | undefined;\n\n try {\n const tokenResult = await this.createProviderToken({\n mintUrl,\n baseUrl,\n amount,\n });\n\n if (!tokenResult.success || !tokenResult.token) {\n return {\n success: false,\n message: tokenResult.error || \"Unable to create top up token\",\n };\n }\n\n cashuToken = tokenResult.token;\n\n const topUpResult = await this._postTopUp(\n baseUrl,\n storedToken,\n cashuToken\n );\n requestId = topUpResult.requestId;\n console.log(topUpResult);\n\n if (!topUpResult.success) {\n await this._recoverFailedTopUp(cashuToken);\n return {\n success: false,\n message: topUpResult.error || \"Top up failed\",\n requestId,\n recoveredToken: true,\n };\n }\n\n return {\n success: true,\n toppedUpAmount: amount,\n requestId,\n };\n } catch (error) {\n if (cashuToken) {\n await this._recoverFailedTopUp(cashuToken);\n }\n\n return this._handleTopUpError(error, mintUrl, requestId);\n }\n }\n\n async createProviderToken(\n options: CreateProviderTokenOptions\n ): Promise<ProviderTokenResult> {\n const {\n mintUrl,\n baseUrl,\n amount,\n retryCount = 0,\n excludeMints = [],\n p2pkPubkey,\n } = options;\n\n const adjustedAmount = Math.ceil(amount);\n if (!adjustedAmount || isNaN(adjustedAmount)) {\n return { success: false, error: \"Invalid top up amount\" };\n }\n\n const balances = await this.walletAdapter.getBalances();\n const units = this.walletAdapter.getMintUnits();\n\n let totalMintBalance = 0;\n for (const url in balances) {\n const unit = units[url];\n const balanceInSats = getBalanceInSats(balances[url], unit);\n totalMintBalance += balanceInSats;\n }\n\n const pendingDistribution =\n this.storageAdapter.getCachedTokenDistribution();\n const refundablePending = pendingDistribution\n .filter((entry) => entry.baseUrl !== baseUrl)\n .reduce((sum, entry) => sum + entry.amount, 0);\n\n if (\n totalMintBalance < adjustedAmount &&\n totalMintBalance + refundablePending >= adjustedAmount &&\n retryCount < 1\n ) {\n await this._refundOtherProvidersForTopUp(baseUrl, mintUrl);\n return this.createProviderToken({\n ...options,\n retryCount: retryCount + 1,\n });\n }\n\n const providerMints =\n baseUrl && this.providerRegistry\n ? this.providerRegistry.getProviderMints(baseUrl)\n : [];\n\n let requiredAmount = adjustedAmount;\n const supportedMintsOnly = providerMints.length > 0;\n\n let candidates = this._selectCandidateMints({\n balances,\n units,\n amount: requiredAmount,\n preferredMintUrl: mintUrl,\n excludeMints,\n allowedMints: supportedMintsOnly ? providerMints : undefined,\n });\n\n if (candidates.length === 0 && supportedMintsOnly) {\n requiredAmount += 2;\n candidates = this._selectCandidateMints({\n balances,\n units,\n amount: requiredAmount,\n preferredMintUrl: mintUrl,\n excludeMints,\n });\n }\n\n if (candidates.length === 0) {\n let maxBalance = 0;\n let maxMintUrl = \"\";\n for (const mintUrl in balances) {\n const balance = balances[mintUrl];\n const unit = units[mintUrl];\n const balanceInSats = getBalanceInSats(balance, unit);\n if (balanceInSats > maxBalance) {\n maxBalance = balanceInSats;\n maxMintUrl = mintUrl;\n }\n }\n\n const error = new InsufficientBalanceError(\n adjustedAmount,\n totalMintBalance,\n maxBalance,\n maxMintUrl\n );\n\n return { success: false, error: error.message };\n }\n\n let lastError: string | undefined;\n for (const candidateMint of candidates) {\n try {\n const token = await this.walletAdapter.sendToken(\n candidateMint,\n requiredAmount,\n p2pkPubkey\n );\n return {\n success: true,\n token,\n selectedMintUrl: candidateMint,\n amountSpent: requiredAmount,\n };\n } catch (error) {\n if (error instanceof Error) {\n lastError = error.message;\n\n if (isNetworkErrorMessage(error.message)) {\n continue;\n }\n }\n\n return {\n success: false,\n error: lastError || \"Failed to create top up token\",\n };\n }\n }\n\n return {\n success: false,\n error:\n lastError || \"All candidate mints failed while creating top up token\",\n };\n }\n\n private _selectCandidateMints(options: {\n balances: Record<string, number>;\n units: Record<string, \"sat\" | \"msat\">;\n amount: number;\n preferredMintUrl: string;\n excludeMints: string[];\n allowedMints?: string[];\n }): string[] {\n const {\n balances,\n units,\n amount,\n preferredMintUrl,\n excludeMints,\n allowedMints,\n } = options;\n\n const candidates: string[] = [];\n\n const { selectedMintUrl: firstMint } = selectMintWithBalance(\n balances,\n units,\n amount,\n excludeMints\n );\n\n if (\n firstMint &&\n (!allowedMints ||\n allowedMints.length === 0 ||\n allowedMints.includes(firstMint))\n ) {\n candidates.push(firstMint);\n }\n\n const canUseMint = (mint: string): boolean => {\n if (excludeMints.includes(mint)) return false;\n if (\n allowedMints &&\n allowedMints.length > 0 &&\n !allowedMints.includes(mint)\n ) {\n return false;\n }\n const rawBalance = balances[mint] || 0;\n const unit = units[mint];\n const balanceInSats = getBalanceInSats(rawBalance, unit);\n return balanceInSats >= amount;\n };\n\n if (\n preferredMintUrl &&\n canUseMint(preferredMintUrl) &&\n !candidates.includes(preferredMintUrl)\n ) {\n candidates.push(preferredMintUrl);\n }\n\n for (const mint in balances) {\n if (mint === preferredMintUrl || candidates.includes(mint)) continue;\n if (canUseMint(mint)) {\n candidates.push(mint);\n }\n }\n\n return candidates;\n }\n\n private async _refundOtherProvidersForTopUp(\n baseUrl: string,\n mintUrl: string\n ): Promise<void> {\n const pendingDistribution =\n this.storageAdapter.getCachedTokenDistribution();\n\n const toRefund = pendingDistribution.filter(\n (pending) => pending.baseUrl !== baseUrl\n );\n\n const refundResults = await Promise.allSettled(\n toRefund.map(async (pending) => {\n const token = this.storageAdapter.getToken(pending.baseUrl);\n if (!token) {\n return { baseUrl: pending.baseUrl, success: false };\n }\n\n const tokenBalance = await this.getTokenBalance(token, pending.baseUrl);\n if (tokenBalance.reserved > 0) {\n return { baseUrl: pending.baseUrl, success: false };\n }\n\n const result = await this.refund({\n mintUrl,\n baseUrl: pending.baseUrl,\n token,\n });\n\n return { baseUrl: pending.baseUrl, success: result.success };\n })\n );\n\n for (const result of refundResults) {\n if (result.status === \"fulfilled\" && result.value.success) {\n this.storageAdapter.removeToken(result.value.baseUrl);\n }\n }\n }\n\n /**\n * Fetch refund token from provider API\n */\n private async _fetchRefundToken(\n baseUrl: string,\n storedToken: string\n ): Promise<{\n success: boolean;\n token?: string;\n requestId?: string;\n error?: string;\n }> {\n if (!baseUrl) {\n return {\n success: false,\n error: \"No base URL configured\",\n };\n }\n\n const normalizedBaseUrl = baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n\n const url = `${normalizedBaseUrl}v1/wallet/refund`;\n\n // Create an AbortController for timeout handling\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n controller.abort();\n }, 60000); // 1 minute timeout\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${storedToken}`,\n \"Content-Type\": \"application/json\",\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const requestId =\n response.headers.get(\"x-routstr-request-id\") || undefined;\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n\n if (\n response.status === 400 &&\n errorData?.detail === \"No balance to refund\"\n ) {\n this.storageAdapter.removeToken(baseUrl);\n return {\n success: false,\n requestId,\n error: \"No balance to refund\",\n };\n }\n\n return {\n success: false,\n requestId,\n error: `Refund request failed with status ${response.status}: ${\n errorData?.detail || response.statusText\n }`,\n };\n }\n\n const data = await response.json();\n console.log(\"refund rsule\", data);\n return {\n success: true,\n token: data.token,\n requestId,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n console.error(\"[BalanceManager._fetchRefundToken] Fetch error\", error);\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n return {\n success: false,\n error: \"Request timed out after 1 minute\",\n };\n }\n return {\n success: false,\n error: error.message,\n };\n }\n\n return {\n success: false,\n error: \"Unknown error occurred during refund request\",\n };\n }\n }\n\n /**\n * Post topup request to provider API\n */\n private async _postTopUp(\n baseUrl: string,\n storedToken: string,\n cashuToken: string\n ): Promise<{\n success: boolean;\n requestId?: string;\n error?: string;\n }> {\n if (!baseUrl) {\n return {\n success: false,\n error: \"No base URL configured\",\n };\n }\n\n const normalizedBaseUrl = baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n const url = `${normalizedBaseUrl}v1/wallet/topup?cashu_token=${encodeURIComponent(\n cashuToken\n )}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n controller.abort();\n }, 60000);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${storedToken}`,\n \"Content-Type\": \"application/json\",\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const requestId =\n response.headers.get(\"x-routstr-request-id\") || undefined;\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n requestId,\n error:\n errorData?.detail || `Top up failed with status ${response.status}`,\n };\n }\n\n return { success: true, requestId };\n } catch (error) {\n clearTimeout(timeoutId);\n console.error(\"[BalanceManager._postTopUp] Fetch error\", error);\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n return {\n success: false,\n error: \"Request timed out after 1 minute\",\n };\n }\n return {\n success: false,\n error: error.message,\n };\n }\n\n return {\n success: false,\n error: \"Unknown error occurred during top up request\",\n };\n }\n }\n\n /**\n * Attempt to receive token back after failed top up\n */\n private async _recoverFailedTopUp(cashuToken: string): Promise<void> {\n try {\n await this.cashuSpender.receiveToken(cashuToken);\n } catch (error) {\n console.error(\n \"[BalanceManager._recoverFailedTopUp] Failed to recover token\",\n error\n );\n }\n }\n\n /**\n * Handle refund errors with specific error types\n */\n private _handleRefundError(\n error: unknown,\n mintUrl: string,\n requestId?: string\n ): RefundResult {\n if (error instanceof Error) {\n // Network errors\n if (isNetworkErrorMessage(error.message)) {\n return {\n success: false,\n message: `Failed to connect to the mint: ${mintUrl}`,\n requestId,\n };\n }\n\n // Wallet not found error\n if (error.message.includes(\"Wallet not found\")) {\n return {\n success: false,\n message: `Wallet couldn't be loaded. Please save this refunded cashu token manually.`,\n requestId,\n };\n }\n\n return {\n success: false,\n message: error.message,\n requestId,\n };\n }\n\n return {\n success: false,\n message: \"Refund failed\",\n requestId,\n };\n }\n\n /**\n * Get token balance from provider\n */\n async getTokenBalance(\n token: string,\n baseUrl: string\n ): Promise<{\n amount: number;\n reserved: number;\n unit: \"sat\" | \"msat\";\n apiKey: string;\n isInvalidApiKey?: boolean;\n }> {\n try {\n const response = await fetch(`${baseUrl}v1/wallet/info`, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (response.ok) {\n const data = await response.json();\n console.log(\"TOKENA FASJDFAS\", data);\n return {\n amount: data.balance,\n reserved: data.reserved ?? 0,\n unit: \"msat\",\n apiKey: data.api_key,\n };\n } else {\n console.log(response.status);\n const data = await response.json();\n console.log(\"FAILED \", data);\n\n // Check for invalid/expired API key error (proofs already spent)\n const isInvalidApiKey =\n response.status === 401 &&\n data?.code === \"invalid_api_key\" &&\n data?.message?.includes(\"proofs already spent\");\n\n return {\n amount: -1,\n reserved: data.reserved ?? 0,\n unit: \"msat\",\n apiKey: data.api_key,\n isInvalidApiKey,\n };\n }\n } catch (error) {\n console.error(\"ERRORR IN RESTPONSE\", error);\n // Fall through to default\n }\n\n return { amount: -1, reserved: 0, unit: \"sat\", apiKey: \"\" };\n }\n\n /**\n * Handle topup errors with specific error types\n */\n private _handleTopUpError(\n error: unknown,\n mintUrl: string,\n requestId?: string\n ): TopUpResult {\n if (error instanceof Error) {\n if (isNetworkErrorMessage(error.message)) {\n return {\n success: false,\n message: `Failed to connect to the mint: ${mintUrl}`,\n requestId,\n };\n }\n\n if (error.message.includes(\"Wallet not found\")) {\n return {\n success: false,\n message:\n \"Wallet couldn't be loaded. The cashu token was recovered locally.\",\n requestId,\n };\n }\n\n return {\n success: false,\n message: error.message,\n requestId,\n };\n }\n\n return {\n success: false,\n message: \"Top up failed\",\n requestId,\n };\n }\n}\n","/**\n * StreamProcessor - Handles SSE streaming response parsing\n *\n * Handles:\n * - Line buffering for large payloads\n * - Content extraction from delta chunks\n * - Thinking/reasoning block extraction\n * - Image data merging and deduplication\n * - Usage statistics extraction\n * - Citations and annotations\n *\n * Extracted from utils/apiUtils.ts processStreamingResponse\n */\n\nimport type { StreamingResult, ImageData, AnnotationData } from \"../core/types\";\n\n/**\n * Callbacks for streaming updates\n */\nexport interface StreamCallbacks {\n /** Called when new content arrives */\n onContent: (content: string) => void;\n /** Called when thinking content arrives */\n onThinking: (thinking: string) => void;\n}\n\n/**\n * StreamProcessor parses SSE streaming responses\n */\nexport class StreamProcessor {\n private accumulatedContent = \"\";\n private accumulatedThinking = \"\";\n private accumulatedImages: ImageData[] = [];\n private isInThinking = false;\n private isInContent = false;\n\n /**\n * Process a streaming response\n */\n async process(\n response: Response,\n callbacks: StreamCallbacks,\n modelId?: string\n ): Promise<StreamingResult> {\n if (!response.body) {\n throw new Error(\"Response body is not available\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n\n // Reset state\n this.accumulatedContent = \"\";\n this.accumulatedThinking = \"\";\n this.accumulatedImages = [];\n this.isInThinking = false;\n this.isInContent = false;\n\n // Result accumulators\n let usage: StreamingResult[\"usage\"];\n let model: string | undefined;\n let finish_reason: string | undefined;\n let citations: string[] | undefined;\n let annotations: AnnotationData[] | undefined;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n buffer += chunk;\n\n // Process complete lines\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\"; // Keep incomplete line in buffer\n\n for (const line of lines) {\n const parsed = this._parseLine(line);\n if (!parsed) continue;\n\n // Handle content delta\n if (parsed.content) {\n this._handleContent(parsed.content, callbacks, modelId);\n }\n\n // Handle reasoning/thinking\n if (parsed.reasoning) {\n this._handleThinking(parsed.reasoning, callbacks);\n }\n\n // Extract metadata\n if (parsed.usage) {\n usage = parsed.usage;\n }\n if (parsed.model) {\n model = parsed.model;\n }\n if (parsed.finish_reason) {\n finish_reason = parsed.finish_reason;\n }\n if (parsed.citations) {\n citations = parsed.citations;\n }\n if (parsed.annotations) {\n annotations = parsed.annotations;\n }\n\n // Handle images\n if (parsed.images) {\n this._mergeImages(parsed.images);\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n return {\n content: this.accumulatedContent,\n thinking: this.accumulatedThinking || undefined,\n images: this.accumulatedImages.length > 0 ? this.accumulatedImages : undefined,\n usage,\n model,\n finish_reason,\n citations,\n annotations,\n };\n }\n\n /**\n * Parse a single SSE line\n */\n private _parseLine(line: string): {\n content?: string;\n reasoning?: string;\n usage?: StreamingResult[\"usage\"];\n model?: string;\n finish_reason?: string;\n citations?: string[];\n annotations?: AnnotationData[];\n images?: ImageData[];\n } | null {\n if (!line.trim()) return null;\n\n // SSE data lines start with \"data: \"\n if (!line.startsWith(\"data: \")) {\n // Show \"Generating...\" for non-data lines if no content yet\n return null;\n }\n\n const jsonData = line.slice(6);\n\n if (jsonData === \"[DONE]\") {\n return null;\n }\n\n try {\n const parsed = JSON.parse(jsonData);\n const result: ReturnType<typeof this._parseLine> = {};\n\n // Extract content delta\n if (parsed.choices?.[0]?.delta?.content) {\n result.content = parsed.choices[0].delta.content;\n }\n\n // Extract reasoning (OpenRouter style)\n if (parsed.choices?.[0]?.delta?.reasoning) {\n result.reasoning = parsed.choices[0].delta.reasoning;\n }\n\n // Extract usage (usually in final chunk)\n if (parsed.usage) {\n result.usage = {\n total_tokens: parsed.usage.total_tokens,\n prompt_tokens: parsed.usage.prompt_tokens,\n completion_tokens: parsed.usage.completion_tokens,\n };\n }\n\n // Extract model info\n if (parsed.model) {\n result.model = parsed.model;\n }\n\n // Extract citations\n if (parsed.citations) {\n result.citations = parsed.citations;\n }\n\n // Extract annotations\n if (parsed.annotations) {\n result.annotations = parsed.annotations;\n }\n\n // Extract finish reason\n if (parsed.choices?.[0]?.finish_reason) {\n result.finish_reason = parsed.choices[0].finish_reason;\n }\n\n // Extract images (from message or delta)\n const images =\n parsed.choices?.[0]?.message?.images ||\n parsed.choices?.[0]?.delta?.images;\n if (images && Array.isArray(images)) {\n result.images = images;\n }\n\n return result;\n } catch {\n // Swallow parse errors for streaming chunks\n return null;\n }\n }\n\n /**\n * Handle content delta with thinking support\n */\n private _handleContent(\n content: string,\n callbacks: StreamCallbacks,\n modelId?: string\n ): void {\n // If we were in thinking mode and now got content, close thinking tag\n if (this.isInThinking && !this.isInContent) {\n this.accumulatedThinking += \"</thinking>\";\n callbacks.onThinking(this.accumulatedThinking);\n this.isInThinking = false;\n this.isInContent = true;\n }\n\n // For models that use <thinking> tags inline\n if (modelId) {\n this._extractThinkingFromContent(content, callbacks);\n } else {\n this.accumulatedContent += content;\n }\n\n callbacks.onContent(this.accumulatedContent);\n }\n\n /**\n * Handle thinking/reasoning content\n */\n private _handleThinking(reasoning: string, callbacks: StreamCallbacks): void {\n if (!this.isInThinking) {\n this.accumulatedThinking += \"<thinking> \";\n this.isInThinking = true;\n }\n this.accumulatedThinking += reasoning;\n callbacks.onThinking(this.accumulatedThinking);\n }\n\n /**\n * Extract thinking blocks from content (for models with inline thinking)\n */\n private _extractThinkingFromContent(\n content: string,\n callbacks: StreamCallbacks\n ): void {\n // Simple extraction - models that wrap thinking in <thinking> tags\n const parts = content.split(/(<thinking>|<\\/thinking>)/);\n\n for (const part of parts) {\n if (part === \"<thinking>\") {\n this.isInThinking = true;\n if (!this.accumulatedThinking.includes(\"<thinking>\")) {\n this.accumulatedThinking += \"<thinking> \";\n }\n } else if (part === \"</thinking>\") {\n this.isInThinking = false;\n this.accumulatedThinking += \"</thinking>\";\n } else if (this.isInThinking) {\n this.accumulatedThinking += part;\n } else {\n this.accumulatedContent += part;\n }\n }\n }\n\n /**\n * Merge images into accumulated array, avoiding duplicates\n */\n private _mergeImages(newImages: ImageData[]): void {\n for (const img of newImages) {\n const newUrl = img.image_url?.url;\n const existingIndex = this.accumulatedImages.findIndex((existing) => {\n const existingUrl = existing.image_url?.url;\n if (newUrl && existingUrl) {\n return existingUrl === newUrl;\n }\n if (img.index !== undefined && existing.index !== undefined) {\n return existing.index === img.index;\n }\n return false;\n });\n\n if (existingIndex === -1) {\n this.accumulatedImages.push(img);\n } else {\n this.accumulatedImages[existingIndex] = img;\n }\n }\n }\n}\n","export type ProviderDirectoryEntry = {\n endpoint_url?: string | null;\n endpoint_urls?: string[] | null;\n onion_url?: string | null;\n onion_urls?: string[] | null;\n name?: string | null;\n};\n\nconst TOR_ONION_SUFFIX = \".onion\";\n\nexport const isTorContext = (): boolean => {\n if (typeof window === \"undefined\") return false;\n const hostname = window.location.hostname.toLowerCase();\n return hostname.endsWith(TOR_ONION_SUFFIX);\n};\n\nexport const isOnionUrl = (url: string): boolean => {\n if (!url) return false;\n const trimmed = url.trim().toLowerCase();\n if (!trimmed) return false;\n try {\n const candidate = trimmed.startsWith(\"http\")\n ? trimmed\n : `http://${trimmed}`;\n return new URL(candidate).hostname.endsWith(TOR_ONION_SUFFIX);\n } catch {\n return trimmed.includes(TOR_ONION_SUFFIX);\n }\n};\n\nconst shouldAllowHttp = (url: string, torMode: boolean): boolean => {\n if (!url.startsWith(\"http://\")) return true;\n if (url.includes(\"localhost\") || url.includes(\"127.0.0.1\")) return true;\n return torMode && isOnionUrl(url);\n};\n\nexport const normalizeProviderUrl = (\n url?: string | null,\n torMode: boolean = false\n): string | null => {\n if (!url || typeof url !== \"string\") return null;\n const trimmed = url.trim();\n if (!trimmed) return null;\n if (/^https?:\\/\\//i.test(trimmed)) {\n return trimmed.endsWith(\"/\") ? trimmed : `${trimmed}/`;\n }\n const useHttpForOnion = torMode && isOnionUrl(trimmed);\n const withProto = `${useHttpForOnion ? \"http\" : \"https\"}://${trimmed}`;\n return withProto.endsWith(\"/\") ? withProto : `${withProto}/`;\n};\n\nconst dedupePreserveOrder = (urls: string[]): string[] => {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const url of urls) {\n if (!seen.has(url)) {\n seen.add(url);\n out.push(url);\n }\n }\n return out;\n};\n\nexport const getProviderEndpoints = (\n provider: ProviderDirectoryEntry,\n torMode: boolean\n): string[] => {\n const rawUrls: (string | null | undefined)[] = [\n provider.endpoint_url,\n ...(Array.isArray(provider.endpoint_urls) ? provider.endpoint_urls : []),\n provider.onion_url,\n ...(Array.isArray(provider.onion_urls) ? provider.onion_urls : []),\n ];\n\n const normalized = rawUrls\n .map((value) => normalizeProviderUrl(value, torMode))\n .filter((value): value is string => Boolean(value));\n\n const unique = dedupePreserveOrder(normalized).filter((value) =>\n shouldAllowHttp(value, torMode)\n );\n\n if (unique.length === 0) return [];\n\n const onion = unique.filter((value) => isOnionUrl(value));\n const clearnet = unique.filter((value) => !isOnionUrl(value));\n\n if (torMode) {\n return onion.length > 0 ? onion : clearnet;\n }\n\n return clearnet;\n};\n\nexport const filterBaseUrlsForTor = (\n baseUrls: string[],\n torMode: boolean\n): string[] => {\n if (!Array.isArray(baseUrls)) return [];\n\n const normalized = baseUrls\n .map((value) => normalizeProviderUrl(value, torMode))\n .filter((value): value is string => Boolean(value));\n\n const filtered = normalized.filter((value) =>\n torMode ? true : !isOnionUrl(value)\n );\n\n return dedupePreserveOrder(\n filtered.filter((value) => shouldAllowHttp(value, torMode))\n );\n};\n","/**\n * ProviderManager - Handles provider selection and failover logic\n *\n * Handles:\n * - Finding the best provider for a model based on price\n * - Provider failover when errors occur\n * - Tracking failed providers to avoid retry loops\n * - Provider version compatibility\n *\n * Extracted from utils/apiUtils.ts findNextBestProvider and related logic\n */\n\nimport type { ProviderRegistry } from \"../wallet/interfaces\";\nimport type { Model } from \"../core/types\";\nimport { isOnionUrl, isTorContext } from \"../utils/torUtils\";\n\nexport interface ModelProviderPrice {\n baseUrl: string;\n model: Model;\n promptPerMillion: number;\n completionPerMillion: number;\n totalPerMillion: number;\n}\n\n/**\n * Extract image resolution (width, height) from a base64 data URL without DOM.\n * Supports PNG and JPEG. Returns null if format unsupported or parsing fails.\n */\nfunction getImageResolutionFromDataUrl(\n dataUrl: string\n): { width: number; height: number } | null {\n try {\n if (typeof dataUrl !== \"string\" || !dataUrl.startsWith(\"data:\"))\n return null;\n\n const commaIdx = dataUrl.indexOf(\",\");\n if (commaIdx === -1) return null;\n\n const meta = dataUrl.slice(5, commaIdx); // e.g. \"image/png;base64\"\n const base64 = dataUrl.slice(commaIdx + 1);\n\n // Decode base64 to binary\n const binary =\n typeof atob === \"function\"\n ? atob(base64)\n : Buffer.from(base64, \"base64\").toString(\"binary\");\n\n const len = binary.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) bytes[i] = binary.charCodeAt(i);\n\n const isPNG = meta.includes(\"image/png\");\n const isJPEG = meta.includes(\"image/jpeg\") || meta.includes(\"image/jpg\");\n\n // PNG: width/height are 4-byte big-endian at offsets 16 and 20\n if (isPNG) {\n // Validate PNG signature\n const sig = [137, 80, 78, 71, 13, 10, 26, 10];\n for (let i = 0; i < sig.length; i++) {\n if (bytes[i] !== sig[i]) return null;\n }\n const view = new DataView(\n bytes.buffer,\n bytes.byteOffset,\n bytes.byteLength\n );\n const width = view.getUint32(16, false);\n const height = view.getUint32(20, false);\n if (width > 0 && height > 0) return { width, height };\n return null;\n }\n\n // JPEG: parse markers to SOF0/SOF2 for dimensions\n if (isJPEG) {\n let offset = 0;\n // JPEG SOI 0xFFD8\n if (bytes[offset++] !== 0xff || bytes[offset++] !== 0xd8) return null;\n\n while (offset < bytes.length) {\n // Find marker\n while (offset < bytes.length && bytes[offset] !== 0xff) offset++;\n if (offset + 1 >= bytes.length) break;\n\n // Skip fill bytes 0xFF\n while (bytes[offset] === 0xff) offset++;\n const marker = bytes[offset++];\n\n // Standalone markers without length\n if (marker === 0xd8 || marker === 0xd9) continue; // SOI/EOI\n\n if (offset + 1 >= bytes.length) break;\n const length = (bytes[offset] << 8) | bytes[offset + 1];\n offset += 2;\n\n // SOF0 (0xC0) or SOF2 (0xC2) contain dimensions\n if (marker === 0xc0 || marker === 0xc2) {\n if (length < 7 || offset + length - 2 > bytes.length) return null;\n const precision = bytes[offset];\n const height = (bytes[offset + 1] << 8) | bytes[offset + 2];\n const width = (bytes[offset + 3] << 8) | bytes[offset + 4];\n if (precision > 0 && width > 0 && height > 0)\n return { width, height };\n return null;\n } else {\n // Skip this segment\n offset += length - 2;\n }\n }\n return null;\n }\n\n // Unsupported formats (e.g., webp/gif) - skip for now\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Calculate image tokens based on OpenAI's vision pricing.\n *\n * For low detail: 85 tokens\n * For high detail/auto: 85 base tokens + 170 tokens per 512px tile\n */\nfunction calculateImageTokens(\n width: number,\n height: number,\n detail: \"low\" | \"high\" | \"auto\" = \"auto\"\n): number {\n if (detail === \"low\") return 85;\n\n let w = width;\n let h = height;\n\n // Clamp longest side to 2048 while preserving aspect ratio\n if (w > 2048 || h > 2048) {\n const aspectRatio = w / h;\n if (w > h) {\n w = 2048;\n h = Math.floor(w / aspectRatio);\n } else {\n h = 2048;\n w = Math.floor(h * aspectRatio);\n }\n }\n\n // Then clamp longest side to 768 while preserving aspect ratio\n if (w > 768 || h > 768) {\n const aspectRatio = w / h;\n if (w > h) {\n w = 768;\n h = Math.floor(w / aspectRatio);\n } else {\n h = 768;\n w = Math.floor(h * aspectRatio);\n }\n }\n\n // Number of 512px tiles, ceil division using (x + 511) // 512\n const tilesWidth = Math.floor((w + 511) / 512);\n const tilesHeight = Math.floor((h + 511) / 512);\n const numTiles = tilesWidth * tilesHeight;\n\n return 85 + 170 * numTiles;\n}\n\n/**\n * Candidate provider for failover\n */\ninterface CandidateProvider {\n baseUrl: string;\n model: Model;\n cost: number;\n}\n\n/**\n * ProviderManager handles provider selection and failover\n */\nfunction isInsecureHttpUrl(url: string): boolean {\n return url.startsWith(\"http://\");\n}\n\nexport class ProviderManager {\n private failedProviders = new Set<string>();\n\n constructor(private providerRegistry: ProviderRegistry) {}\n\n /**\n * Reset the failed providers list\n */\n resetFailedProviders(): void {\n this.failedProviders.clear();\n }\n\n /**\n * Mark a provider as failed\n */\n markFailed(baseUrl: string): void {\n this.failedProviders.add(baseUrl);\n }\n\n /**\n * Check if a provider has failed\n */\n hasFailed(baseUrl: string): boolean {\n return this.failedProviders.has(baseUrl);\n }\n\n /**\n * Find the next best provider for a model\n * @param modelId The model ID to find a provider for\n * @param currentBaseUrl The current provider to exclude\n * @returns The best provider URL or null if none available\n */\n findNextBestProvider(modelId: string, currentBaseUrl: string): string | null {\n try {\n const torMode = isTorContext();\n const disabledProviders = new Set(\n this.providerRegistry.getDisabledProviders()\n );\n\n // Get all providers with their models\n const allProviders = this.providerRegistry.getAllProvidersModels();\n\n // Find all candidate providers\n const candidates: CandidateProvider[] = [];\n\n for (const [baseUrl, models] of Object.entries(allProviders)) {\n // Skip current, failed, and disabled providers\n if (\n baseUrl === currentBaseUrl ||\n this.failedProviders.has(baseUrl) ||\n disabledProviders.has(baseUrl)\n ) {\n continue;\n }\n\n // Skip onion URLs and insecure http URLs if not in Tor mode\n if (!torMode && (isOnionUrl(baseUrl) || isInsecureHttpUrl(baseUrl))) {\n continue;\n }\n\n // Find the model in this provider's list\n const model = models.find((m: Model) => m.id === modelId);\n if (!model) continue;\n\n // Calculate cost (using completion price as the metric)\n const cost = model.sats_pricing?.completion ?? 0;\n candidates.push({ baseUrl, model, cost });\n }\n\n // Sort by price (lowest first)\n candidates.sort((a, b) => a.cost - b.cost);\n\n return candidates.length > 0 ? candidates[0].baseUrl : null;\n } catch (error) {\n console.error(\"Error finding next best provider:\", error);\n return null;\n }\n }\n\n /**\n * Find the best model for a provider\n * Useful when switching providers and need to find equivalent model\n */\n async getModelForProvider(\n baseUrl: string,\n modelId: string\n ): Promise<Model | null> {\n // Get models for this provider\n const models = this.providerRegistry.getModelsForProvider(baseUrl);\n\n // First try exact match\n const exactMatch = models.find((m) => m.id === modelId);\n if (exactMatch) return exactMatch;\n\n // Try matching by ID suffix (for backward compatibility with v0.1.x providers)\n const providerInfo = await this.providerRegistry.getProviderInfo(baseUrl);\n if (providerInfo?.version && /^0\\.1\\./.test(providerInfo.version)) {\n const suffix = modelId.split(\"/\").pop();\n const suffixMatch = models.find((m) => m.id === suffix);\n if (suffixMatch) return suffixMatch;\n }\n\n return null;\n }\n\n /**\n * Get all available providers for a model\n * Returns sorted list by price\n */\n getAllProvidersForModel(modelId: string): Array<{\n baseUrl: string;\n model: Model;\n cost: number;\n }> {\n const candidates: CandidateProvider[] = [];\n const allProviders = this.providerRegistry.getAllProvidersModels();\n const disabledProviders = new Set(\n this.providerRegistry.getDisabledProviders()\n );\n const torMode = isTorContext();\n\n for (const [baseUrl, models] of Object.entries(allProviders)) {\n if (disabledProviders.has(baseUrl)) continue;\n if (!torMode && (isOnionUrl(baseUrl) || isInsecureHttpUrl(baseUrl)))\n continue;\n\n const model = models.find((m: Model) => m.id === modelId);\n if (!model) continue;\n\n const cost = model.sats_pricing?.completion ?? 0;\n candidates.push({ baseUrl, model, cost });\n }\n\n return candidates.sort((a, b) => a.cost - b.cost);\n }\n\n /**\n * Get providers for a model sorted by prompt+completion pricing\n */\n getProviderPriceRankingForModel(\n modelId: string,\n options: { torMode?: boolean; includeDisabled?: boolean } = {}\n ): ModelProviderPrice[] {\n const normalizedId = this.normalizeModelId(modelId);\n const includeDisabled = options.includeDisabled ?? false;\n const torMode = options.torMode ?? false;\n const disabledProviders = new Set(\n this.providerRegistry.getDisabledProviders()\n );\n const allModels = this.providerRegistry.getAllProvidersModels();\n const results: ModelProviderPrice[] = [];\n\n for (const [baseUrl, models] of Object.entries(allModels)) {\n if (!includeDisabled && disabledProviders.has(baseUrl)) continue;\n if (torMode && !baseUrl.includes(\".onion\")) continue;\n if (\n !torMode &&\n (baseUrl.includes(\".onion\") || isInsecureHttpUrl(baseUrl))\n )\n continue;\n\n const match = models.find(\n (model) => this.normalizeModelId(model.id) === normalizedId\n );\n if (!match?.sats_pricing) continue;\n\n const prompt = match.sats_pricing.prompt;\n const completion = match.sats_pricing.completion;\n if (typeof prompt !== \"number\" || typeof completion !== \"number\") {\n continue;\n }\n\n const promptPerMillion = prompt * 1_000_000;\n const completionPerMillion = completion * 1_000_000;\n const totalPerMillion = promptPerMillion + completionPerMillion;\n\n results.push({\n baseUrl,\n model: match,\n promptPerMillion,\n completionPerMillion,\n totalPerMillion,\n });\n }\n\n return results.sort((a, b) => {\n if (a.totalPerMillion !== b.totalPerMillion) {\n return a.totalPerMillion - b.totalPerMillion;\n }\n return a.baseUrl.localeCompare(b.baseUrl);\n });\n }\n\n /**\n * Get best-priced provider for a specific model\n */\n getBestProviderForModel(\n modelId: string,\n options: { torMode?: boolean; includeDisabled?: boolean } = {}\n ): string | null {\n const ranking = this.getProviderPriceRankingForModel(modelId, options);\n return ranking[0]?.baseUrl ?? null;\n }\n\n private normalizeModelId(modelId: string): string {\n return modelId.includes(\"/\")\n ? modelId.split(\"/\").pop() || modelId\n : modelId;\n }\n\n /**\n * Check if a provider accepts a specific mint\n */\n providerAcceptsMint(baseUrl: string, mintUrl: string): boolean {\n const providerMints = this.providerRegistry.getProviderMints(baseUrl);\n if (providerMints.length === 0) {\n // If no mints specified, provider accepts all\n return true;\n }\n return providerMints.includes(mintUrl);\n }\n\n /**\n * Get required sats for a model based on message history\n * Simple estimation based on typical usage\n */\n getRequiredSatsForModel(\n model: Model,\n apiMessages: any[],\n maxTokens?: number\n ): number {\n try {\n let imageTokens = 0;\n if (apiMessages) {\n for (const msg of apiMessages as any[]) {\n const content = (msg as any)?.content;\n if (Array.isArray(content)) {\n for (const part of content) {\n const isImage =\n part && typeof part === \"object\" && part.type === \"image_url\";\n const url: string | undefined = isImage\n ? typeof part.image_url === \"string\"\n ? part.image_url\n : part.image_url?.url\n : undefined;\n\n // Expecting a base64 data URL for local image inputs\n if (url && typeof url === \"string\" && url.startsWith(\"data:\")) {\n const res = getImageResolutionFromDataUrl(url);\n if (res) {\n const tokensFromImage = calculateImageTokens(\n res.width,\n res.height\n );\n // const patchSize = 32;\n // const patchesW = Math.floor((res.width + patchSize - 1) / patchSize);\n // const patchesH = Math.floor((res.height + patchSize - 1) / patchSize);\n // const tokensFromImage = patchesW * patchesH;\n imageTokens += tokensFromImage;\n console.log(\"IMAGE INPUT RESOLUTION\", {\n width: res.width,\n height: res.height,\n tokensFromImage,\n });\n } else {\n console.log(\n \"IMAGE INPUT RESOLUTION\",\n \"unknown (unsupported format or parse failure)\"\n );\n }\n }\n }\n }\n }\n }\n // Remove image_url parts from apiMessages when estimating text token count\n const apiMessagesNoImages = apiMessages // SWITCH AFTER NODE UPDAATES\n ? (apiMessages as any[]).map((m: any) => {\n if (Array.isArray(m?.content)) {\n const filtered = m.content.filter(\n (p: any) =>\n !(p && typeof p === \"object\" && p.type === \"image_url\")\n );\n return { ...m, content: filtered };\n }\n return m;\n })\n : undefined;\n\n const approximateTokens = apiMessagesNoImages // SWITCH AFTER NODE UPDAATES\n ? Math.ceil(JSON.stringify(apiMessagesNoImages, null, 2).length / 2.84)\n : 10000; // Assumed tokens for minimum balance calculation\n\n const totalInputTokens = approximateTokens + imageTokens;\n\n const sp: any = model?.sats_pricing as any;\n\n if (!sp) return 0;\n\n // If we don't have max_completion_cost, fall back to max_cost\n if (!sp.max_completion_cost) {\n return sp.max_cost ?? 50;\n }\n\n // Calculate based on token usage (similar to getTokenAmountForModel in apiUtils.ts)\n const promptCosts = (sp.prompt || 0) * totalInputTokens;\n let completionCost = sp.max_completion_cost;\n if (maxTokens !== undefined && sp.completion) {\n completionCost = sp.completion * maxTokens;\n }\n const totalEstimatedCosts = (promptCosts + completionCost) * 1.05;\n // return totalEstimatedCosts > sp.max_cost ? sp.max_cost : totalEstimatedCosts; // in some image input calculations, this cost balloons up. Now includes image tokens via 32px patches.\n return totalEstimatedCosts; // Backend has a bug here.it's calculating image tokens wrong. gotta switch to different logic once its fixed\n } catch (e) {\n console.error(e);\n return 0;\n }\n }\n}\n","/**\n * RoutstrClient - Main API client for Routstr\n *\n * Orchestrates:\n * - Token spending via CashuSpender\n * - API requests with authentication\n * - Streaming response processing\n * - Provider failover via ProviderManager\n * - Error handling and refunds\n *\n * Extracted from utils/apiUtils.ts\n */\n\nimport type { Message, TransactionHistory } from \"../core/types\";\nimport type { Model } from \"../core/types\";\nimport type {\n WalletAdapter,\n StorageAdapter,\n ProviderRegistry,\n StreamingCallbacks,\n} from \"../wallet/interfaces\";\nimport { CashuSpender } from \"../wallet/CashuSpender\";\nimport { BalanceManager } from \"../wallet/BalanceManager\";\nimport { StreamProcessor } from \"./StreamProcessor\";\nimport { ProviderManager } from \"./ProviderManager\";\nimport type { StreamingResult } from \"../core/types\";\nimport {\n ProviderError,\n FailoverError,\n InsufficientBalanceError,\n} from \"../core/errors\";\n\n/**\n * Options for fetching AI response\n */\nexport interface FetchOptions {\n messageHistory: Message[];\n selectedModel: Model;\n baseUrl: string;\n mintUrl: string;\n balance: number;\n transactionHistory: TransactionHistory[];\n maxTokens?: number;\n headers?: Record<string, string>;\n}\n\n/**\n * RoutstrClient is the main SDK entry point\n */\nexport type AlertLevel = \"max\" | \"min\";\nexport type RoutstrClientMode = \"xcashu\" | \"lazyrefund\" | \"apikeys\";\nexport type DebugLevel = \"DEBUG\" | \"WARN\" | \"ERROR\";\n\nconst TOPUP_MARGIN = 1.2;\n\nexport interface RouteRequestParams {\n path: string;\n method: string;\n body?: unknown;\n headers?: Record<string, string>;\n baseUrl: string;\n mintUrl: string;\n modelId?: string;\n}\n\nexport class RoutstrClient {\n private cashuSpender: CashuSpender;\n private balanceManager: BalanceManager;\n private streamProcessor: StreamProcessor;\n private providerManager: ProviderManager;\n private alertLevel: AlertLevel;\n private mode: RoutstrClientMode;\n private debugLevel: DebugLevel = \"WARN\";\n\n constructor(\n private walletAdapter: WalletAdapter,\n private storageAdapter: StorageAdapter,\n private providerRegistry: ProviderRegistry,\n alertLevel: AlertLevel,\n mode: RoutstrClientMode = \"xcashu\"\n ) {\n this.balanceManager = new BalanceManager(\n walletAdapter,\n storageAdapter,\n providerRegistry\n );\n this.cashuSpender = new CashuSpender(\n walletAdapter,\n storageAdapter,\n providerRegistry,\n this.balanceManager\n );\n this.streamProcessor = new StreamProcessor();\n this.providerManager = new ProviderManager(providerRegistry);\n this.alertLevel = alertLevel;\n this.mode = mode;\n }\n\n /**\n * Get the current client mode\n */\n getMode(): RoutstrClientMode {\n return this.mode;\n }\n\n getDebugLevel(): DebugLevel {\n return this.debugLevel;\n }\n\n setDebugLevel(level: DebugLevel): void {\n this.debugLevel = level;\n }\n\n private _log(level: \"DEBUG\" | \"WARN\" | \"ERROR\", ...args: unknown[]): void {\n const levelPriority: Record<DebugLevel, number> = {\n DEBUG: 0,\n WARN: 1,\n ERROR: 2,\n };\n\n if (levelPriority[level] >= levelPriority[this.debugLevel]) {\n switch (level) {\n case \"DEBUG\":\n console.log(...args);\n break;\n case \"WARN\":\n console.warn(...args);\n break;\n case \"ERROR\":\n console.error(...args);\n break;\n }\n }\n }\n\n /**\n * Get the CashuSpender instance\n */\n getCashuSpender(): CashuSpender {\n return this.cashuSpender;\n }\n\n /**\n * Get the BalanceManager instance\n */\n getBalanceManager(): BalanceManager {\n return this.balanceManager;\n }\n\n /**\n * Get the ProviderManager instance\n */\n getProviderManager(): ProviderManager {\n return this.providerManager;\n }\n\n /**\n * Check if the client is currently busy (in critical section)\n */\n get isBusy(): boolean {\n return this.cashuSpender.isBusy;\n }\n\n /**\n * Route an API request to the upstream provider\n *\n * This is a simpler alternative to fetchAIResponse that just proxies\n * the request upstream without the streaming callback machinery.\n * Useful for daemon-style routing where you just need to forward\n * requests and get responses back.\n */\n async routeRequest(params: RouteRequestParams): Promise<Response> {\n const {\n path,\n method,\n body,\n headers = {},\n baseUrl,\n mintUrl,\n modelId,\n } = params;\n\n await this._checkBalance();\n\n let requiredSats = 1;\n let selectedModel: Model | undefined;\n if (modelId) {\n const providerModel = await this.providerManager.getModelForProvider(\n baseUrl,\n modelId\n );\n selectedModel = providerModel ?? undefined;\n if (selectedModel) {\n requiredSats = this.providerManager.getRequiredSatsForModel(\n selectedModel,\n []\n );\n }\n }\n\n const { token, tokenBalance, tokenBalanceUnit } = await this._spendToken({\n mintUrl,\n amount: requiredSats,\n baseUrl,\n });\n this._log(\"DEBUG\", token, baseUrl);\n\n let requestBody = body;\n if (body && typeof body === \"object\") {\n const bodyObj = body as Record<string, unknown>;\n if (!bodyObj.stream) {\n requestBody = { ...bodyObj, stream: false };\n }\n }\n\n const baseHeaders = this._buildBaseHeaders(headers);\n const requestHeaders = this._withAuthHeader(baseHeaders, token);\n\n const response = await this._makeRequest({\n path,\n method,\n body: method === \"GET\" ? undefined : requestBody,\n baseUrl,\n mintUrl,\n token,\n requiredSats,\n headers: requestHeaders,\n baseHeaders,\n selectedModel,\n });\n\n const tokenBalanceInSats =\n tokenBalanceUnit === \"msat\" ? tokenBalance / 1000 : tokenBalance;\n const baseUrlUsed = (response as any).baseUrl || baseUrl;\n const tokenUsed = (response as any).token || token;\n const satsSpent = await this._handlePostResponseBalanceUpdate({\n token: tokenUsed,\n baseUrl: baseUrlUsed,\n initialTokenBalance: tokenBalanceInSats,\n response,\n });\n\n return response;\n }\n\n /**\n * Fetch AI response with streaming\n */\n async fetchAIResponse(\n options: FetchOptions,\n callbacks: StreamingCallbacks\n ): Promise<void> {\n const {\n messageHistory,\n selectedModel,\n baseUrl,\n mintUrl,\n balance,\n transactionHistory,\n maxTokens,\n headers,\n } = options;\n\n // Convert messages for API\n const apiMessages = await this._convertMessages(messageHistory);\n\n // Calculate required amount\n const requiredSats = this.providerManager.getRequiredSatsForModel(\n selectedModel,\n apiMessages,\n maxTokens\n );\n\n try {\n // Check balance first\n await this._checkBalance();\n\n // Spend tokens\n callbacks.onPaymentProcessing?.(true);\n\n const spendResult = await this._spendToken({\n mintUrl,\n amount: requiredSats,\n baseUrl,\n });\n\n let token = spendResult.token;\n let tokenBalance = spendResult.tokenBalance;\n let tokenBalanceUnit = spendResult.tokenBalanceUnit;\n\n const tokenBalanceInSats =\n tokenBalanceUnit === \"msat\" ? tokenBalance / 1000 : tokenBalance;\n\n callbacks.onTokenCreated?.(this._getPendingCashuTokenAmount());\n\n const baseHeaders = this._buildBaseHeaders(headers);\n const requestHeaders = this._withAuthHeader(baseHeaders, token);\n\n // Reset failed providers for new request\n this.providerManager.resetFailedProviders();\n\n // Get provider info for version compatibility\n const providerInfo = await this.providerRegistry.getProviderInfo(baseUrl);\n const providerVersion = providerInfo?.version ?? \"\";\n\n // Handle v0.1.x providers (only send leaf ID)\n let modelIdForRequest = selectedModel.id;\n if (/^0\\.1\\./.test(providerVersion)) {\n const newModel = await this.providerManager.getModelForProvider(\n baseUrl,\n selectedModel.id\n );\n modelIdForRequest = newModel?.id ?? selectedModel.id;\n }\n\n const body: any = {\n model: modelIdForRequest,\n messages: apiMessages,\n stream: true,\n };\n\n if (maxTokens !== undefined) {\n body.max_tokens = maxTokens;\n }\n\n // Only add tools for OpenAI models\n if (selectedModel?.name?.startsWith(\"OpenAI:\")) {\n body.tools = [{ type: \"web_search\" }];\n }\n\n // Make API request\n const response = await this._makeRequest({\n path: \"/v1/chat/completions\",\n method: \"POST\",\n body,\n selectedModel,\n baseUrl,\n mintUrl,\n token,\n requiredSats,\n maxTokens,\n headers: requestHeaders,\n baseHeaders,\n });\n\n if (!response.body) {\n throw new Error(\"Response body is not available\");\n }\n\n // Process streaming response\n if (response.status === 200) {\n const baseUrlUsed = (response as any).baseUrl || baseUrl;\n\n const streamingResult = await this.streamProcessor.process(\n response,\n {\n onContent: callbacks.onStreamingUpdate,\n onThinking: callbacks.onThinkingUpdate,\n },\n selectedModel.id\n );\n\n // Handle finish reason\n if (streamingResult.finish_reason === \"content_filter\") {\n callbacks.onMessageAppend({\n role: \"assistant\",\n content: \"Your request was denied due to content filtering.\",\n });\n } else if (\n streamingResult.content ||\n (streamingResult.images && streamingResult.images.length > 0)\n ) {\n // Create assistant message\n const message = await this._createAssistantMessage(streamingResult);\n callbacks.onMessageAppend(message);\n } else {\n // No content received\n callbacks.onMessageAppend({\n role: \"system\",\n content: \"The provider did not respond to this request.\",\n });\n }\n\n // Clear streaming\n callbacks.onStreamingUpdate(\"\");\n callbacks.onThinkingUpdate(\"\");\n\n // Handle post-response refund (skip for xcashu mode - refund is in response)\n const isApikeysEstimate = this.mode === \"apikeys\";\n let satsSpent = await this._handlePostResponseBalanceUpdate({\n token,\n baseUrl: baseUrlUsed,\n initialTokenBalance: tokenBalanceInSats,\n fallbackSatsSpent: isApikeysEstimate\n ? this._getEstimatedCosts(selectedModel, streamingResult)\n : undefined,\n response,\n });\n const estimatedCosts = this._getEstimatedCosts(\n selectedModel,\n streamingResult\n );\n const onLastMessageSatsUpdate = callbacks.onLastMessageSatsUpdate as\n | ((satsSpent: number, estimatedCosts: number) => void)\n | undefined;\n onLastMessageSatsUpdate?.(satsSpent, estimatedCosts);\n } else {\n throw new Error(`${response.status} ${response.statusText}`);\n }\n } catch (error) {\n this._handleError(error, callbacks);\n } finally {\n callbacks.onPaymentProcessing?.(false);\n }\n }\n\n /**\n * Make the API request with failover support\n */\n private async _makeRequest(params: {\n path: string;\n method: string;\n body?: unknown;\n selectedModel?: Model;\n baseUrl: string;\n mintUrl: string;\n token: string;\n requiredSats: number;\n maxTokens?: number;\n headers: Record<string, string>;\n baseHeaders: Record<string, string>;\n retryCount?: number;\n }): Promise<Response> {\n const { path, method, body, baseUrl, token, headers } = params;\n\n try {\n const url = `${baseUrl.replace(/\\/$/, \"\")}${path}`;\n if (this.mode === \"xcashu\") this._log(\"DEBUG\", \"HEADERS,\", headers);\n this._log(\"DEBUG\", \"HEADERS,\", headers);\n const response = await fetch(url, {\n method,\n headers,\n body:\n body === undefined || method === \"GET\"\n ? undefined\n : JSON.stringify(body),\n });\n if (this.mode === \"xcashu\") this._log(\"DEBUG\", \"response,\", response);\n this._log(\"DEBUG\", \"response,\", response);\n\n (response as any).baseUrl = baseUrl;\n (response as any).token = token;\n\n if (!response.ok) {\n const requestId =\n response.headers.get(\"x-routstr-request-id\") || undefined;\n let bodyText: string | undefined;\n try {\n bodyText = await response.text();\n } catch (e) {\n bodyText = undefined;\n }\n return await this._handleErrorResponse(\n params,\n token,\n response.status,\n requestId,\n this.mode === \"xcashu\"\n ? (response.headers.get(\"x-cashu\") ?? undefined)\n : undefined,\n bodyText,\n params.retryCount ?? 0\n );\n }\n\n return response;\n } catch (error: any) {\n // Handle network errors with failover\n if (this._isNetworkError(error?.message || \"\")) {\n return await this._handleErrorResponse(\n params,\n token,\n -1, // just for Network Error to skip all statuses\n undefined,\n undefined,\n undefined,\n params.retryCount ?? 0\n );\n // return await this._handleNetworkError(error, params);\n }\n throw error;\n }\n }\n\n /**\n * Handle error responses with failover\n */\n private async _handleErrorResponse(\n params: {\n path: string;\n method: string;\n body?: unknown;\n selectedModel?: Model;\n baseUrl: string;\n mintUrl: string;\n token: string;\n requiredSats: number;\n maxTokens?: number;\n headers: Record<string, string>;\n baseHeaders: Record<string, string>;\n },\n token: string,\n status: number,\n requestId?: string,\n xCashuRefundToken?: string,\n responseBody?: string,\n retryCount: number = 0\n ): Promise<Response> {\n const MAX_RETRIES_PER_PROVIDER = 2;\n const { path, method, body, selectedModel, baseUrl, mintUrl } = params;\n let tryNextProvider: boolean = false;\n\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: status=${status}, baseUrl=${baseUrl}, mode=${this.mode}, token preview=${token}, requestId=${requestId}`\n );\n\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Attempting to receive/restore token for ${baseUrl}`\n );\n if (params.token.startsWith(\"cashu\")) {\n const tryReceiveTokenResult = await this.cashuSpender.receiveToken(\n params.token\n );\n if (tryReceiveTokenResult.success) {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Token restored successfully, amount=${tryReceiveTokenResult.amount}`\n );\n tryNextProvider = true;\n if (this.mode === \"lazyrefund\")\n this.storageAdapter.removeToken(baseUrl);\n } else {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Failed to receive token. `\n );\n }\n }\n\n if (this.mode === \"xcashu\") {\n if (xCashuRefundToken) {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Attempting to receive xcashu refund token, preview=${xCashuRefundToken.substring(0, 20)}...`\n );\n try {\n const receiveResult =\n await this.cashuSpender.receiveToken(xCashuRefundToken);\n if (receiveResult.success) {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: xcashu refund received, amount=${receiveResult.amount}`\n );\n tryNextProvider = true;\n } else\n throw new ProviderError(\n baseUrl,\n status,\n \"xcashu refund failed\",\n requestId\n );\n } catch (error) {\n this._log(\"ERROR\", \"[xcashu] Failed to receive refund token:\", error);\n throw new ProviderError(\n baseUrl,\n status,\n \"[xcashu] Failed to receive refund token\",\n requestId\n );\n }\n } else {\n if (!tryNextProvider)\n throw new ProviderError(\n baseUrl,\n status,\n \"[xcashu] Failed to receive refund token\",\n requestId\n );\n }\n }\n\n if (\n status === 402 &&\n !tryNextProvider &&\n (this.mode === \"apikeys\" || this.mode === \"lazyrefund\")\n ) {\n const topupResult = await this.balanceManager.topUp({\n mintUrl,\n baseUrl,\n amount: params.requiredSats * TOPUP_MARGIN,\n token: params.token,\n });\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Topup result for ${baseUrl}: success=${topupResult.success}, message=${topupResult.message}`\n );\n\n if (!topupResult.success) {\n const message = topupResult.message || \"\";\n if (message.includes(\"Insufficient balance\")) {\n const needMatch = message.match(/need (\\d+)/);\n const haveMatch = message.match(/have (\\d+)/);\n const required = needMatch\n ? parseInt(needMatch[1], 10)\n : params.requiredSats;\n const available = haveMatch ? parseInt(haveMatch[1], 10) : 0;\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Insufficient balance, need=${required}, have=${available}`\n );\n throw new InsufficientBalanceError(required, available);\n } else {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Topup failed with non-insufficient-balance error, will try next provider`\n );\n tryNextProvider = true;\n }\n } else {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Topup successful, will retry with new token`\n );\n }\n if (!tryNextProvider) {\n if (retryCount < MAX_RETRIES_PER_PROVIDER) {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Retrying 402 (attempt ${retryCount + 1}/${MAX_RETRIES_PER_PROVIDER})`\n );\n return this._makeRequest({\n ...params,\n token: params.token,\n headers: this._withAuthHeader(params.baseHeaders, params.token),\n retryCount: retryCount + 1,\n });\n } else {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: 402 retry limit reached (${retryCount}/${MAX_RETRIES_PER_PROVIDER}), failing over to next provider`\n );\n tryNextProvider = true;\n }\n }\n }\n\n const isInsufficientBalance413 =\n status === 413 && responseBody?.includes(\"Insufficient balance\");\n\n if (\n isInsufficientBalance413 &&\n !tryNextProvider &&\n this.mode === \"apikeys\"\n ) {\n let retryToken = params.token;\n\n try {\n const latestBalanceInfo = await this.balanceManager.getTokenBalance(\n params.token,\n baseUrl\n );\n\n // Handle invalid/expired API key - delete and fail over\n if (latestBalanceInfo.isInvalidApiKey) {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Invalid API key (proofs already spent), removing for ${baseUrl}`\n );\n this.storageAdapter.removeApiKey(baseUrl);\n tryNextProvider = true;\n } else {\n const latestTokenBalance =\n latestBalanceInfo.unit === \"msat\"\n ? latestBalanceInfo.amount / 1000\n : latestBalanceInfo.amount;\n\n if (latestBalanceInfo.apiKey) {\n const storedApiKeyEntry = this.storageAdapter.getApiKey(baseUrl);\n if (storedApiKeyEntry?.key !== latestBalanceInfo.apiKey) {\n if (storedApiKeyEntry) {\n this.storageAdapter.removeApiKey(baseUrl);\n }\n this.storageAdapter.setApiKey(baseUrl, latestBalanceInfo.apiKey);\n }\n retryToken = latestBalanceInfo.apiKey;\n }\n\n if (latestTokenBalance >= 0) {\n this.storageAdapter.updateApiKeyBalance(baseUrl, latestTokenBalance);\n }\n }\n } catch (error) {\n this._log(\n \"WARN\",\n `[RoutstrClient] _handleErrorResponse: Failed to refresh API key after 413 insufficient balance for ${baseUrl}`,\n error\n );\n }\n\n if (retryCount < MAX_RETRIES_PER_PROVIDER) {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Retrying 413 (attempt ${retryCount + 1}/${MAX_RETRIES_PER_PROVIDER})`\n );\n return this._makeRequest({\n ...params,\n token: retryToken,\n headers: this._withAuthHeader(params.baseHeaders, retryToken),\n retryCount: retryCount + 1,\n });\n } else {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: 413 retry limit reached (${retryCount}/${MAX_RETRIES_PER_PROVIDER}), failing over to next provider`\n );\n tryNextProvider = true;\n }\n }\n\n if (\n (status === 401 ||\n status === 403 ||\n status === 413 ||\n status === 400 ||\n status === 500 ||\n status === 502 ||\n status === 503 ||\n status === 504 ||\n status === 521) &&\n !tryNextProvider\n ) {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Status ${status} (auth/server error), attempting refund for ${baseUrl}, mode=${this.mode}`\n );\n if (this.mode === \"lazyrefund\") {\n try {\n // Refund current token\n const refundResult = await this.balanceManager.refund({\n mintUrl,\n baseUrl,\n token: params.token,\n });\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Lazyrefund result: success=${refundResult.success}`\n );\n if (refundResult.success) this.storageAdapter.removeToken(baseUrl);\n else\n throw new ProviderError(\n baseUrl,\n status,\n \"refund failed\",\n requestId\n );\n } catch (error) {\n throw new ProviderError(\n baseUrl,\n status,\n \"Failed to refund token\",\n requestId\n );\n }\n } else if (this.mode === \"apikeys\") {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Attempting API key refund for ${baseUrl}, key preview=${token}`\n );\n const initialBalance = await this.balanceManager.getTokenBalance(\n token,\n baseUrl\n );\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Initial API key balance: ${initialBalance.amount}`\n );\n const refundResult = await this.balanceManager.refundApiKey({\n mintUrl,\n baseUrl,\n apiKey: token,\n });\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: API key refund result: success=${refundResult.success}, message=${refundResult.message}`\n );\n if (!refundResult.success && initialBalance.amount > 0) {\n throw new ProviderError(\n baseUrl,\n status,\n refundResult.message ?? \"Unknown error\"\n );\n }\n }\n }\n\n this.providerManager.markFailed(baseUrl);\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Marked provider ${baseUrl} as failed`\n );\n\n if (!selectedModel) {\n throw new ProviderError(\n baseUrl,\n status,\n \"Funny, no selected model. HMM. \"\n );\n }\n\n const nextProvider = this.providerManager.findNextBestProvider(\n selectedModel.id,\n baseUrl\n );\n\n if (nextProvider) {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Failing over to next provider: ${nextProvider}, model: ${selectedModel.id}`\n );\n // Get new model for this provider\n const newModel =\n (await this.providerManager.getModelForProvider(\n nextProvider,\n selectedModel.id\n )) ?? selectedModel;\n\n const messagesForPricing = Array.isArray(\n (body as { messages?: unknown })?.messages\n )\n ? ((body as { messages?: unknown }).messages as any[])\n : [];\n\n const newRequiredSats = this.providerManager.getRequiredSatsForModel(\n newModel,\n messagesForPricing,\n params.maxTokens\n );\n\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Creating new token for failover provider ${nextProvider}, required sats: ${newRequiredSats}`\n );\n const spendResult = await this._spendToken({\n mintUrl,\n amount: newRequiredSats,\n baseUrl: nextProvider,\n });\n\n // Retry with new provider (reset retry count)\n return this._makeRequest({\n ...params,\n path,\n method,\n body,\n baseUrl: nextProvider,\n selectedModel: newModel,\n token: spendResult.token!,\n requiredSats: newRequiredSats,\n headers: this._withAuthHeader(params.baseHeaders, spendResult.token!),\n retryCount: 0,\n });\n }\n\n // No more providers to try\n throw new FailoverError(baseUrl, Array.from(this.providerManager as any));\n }\n\n /**\n * Handle post-response balance update for all modes\n */\n private async _handlePostResponseBalanceUpdate(params: {\n token: string;\n baseUrl: string;\n initialTokenBalance: number;\n fallbackSatsSpent?: number;\n response?: Response;\n }): Promise<number> {\n const { token, baseUrl, initialTokenBalance, fallbackSatsSpent, response } =\n params;\n\n let satsSpent: number = initialTokenBalance;\n\n if (this.mode === \"xcashu\" && response) {\n const refundToken = response.headers.get(\"x-cashu\") ?? undefined;\n if (refundToken) {\n try {\n const receiveResult =\n await this.cashuSpender.receiveToken(refundToken);\n satsSpent =\n initialTokenBalance -\n receiveResult.amount * (receiveResult.unit == \"sat\" ? 1 : 1000);\n } catch (error) {\n this._log(\"ERROR\", \"[xcashu] Failed to receive refund token:\", error);\n }\n }\n } else if (this.mode === \"lazyrefund\") {\n const latestBalanceInfo = await this.balanceManager.getTokenBalance(\n token,\n baseUrl\n );\n const latestTokenBalance =\n latestBalanceInfo.unit === \"msat\"\n ? latestBalanceInfo.amount / 1000\n : latestBalanceInfo.amount;\n this.storageAdapter.updateTokenBalance(baseUrl, latestTokenBalance);\n satsSpent = initialTokenBalance - latestTokenBalance;\n } else if (this.mode === \"apikeys\") {\n try {\n const latestBalanceInfo = await this.balanceManager.getTokenBalance(\n token,\n baseUrl\n );\n this._log(\n \"DEBUG\",\n \"LATEST Balance\",\n latestBalanceInfo.amount,\n latestBalanceInfo.reserved,\n latestBalanceInfo.apiKey,\n baseUrl\n );\n const latestTokenBalance =\n latestBalanceInfo.unit === \"msat\"\n ? latestBalanceInfo.amount / 1000\n : latestBalanceInfo.amount;\n\n const storedApiKeyEntry = this.storageAdapter.getApiKey(baseUrl);\n if (\n storedApiKeyEntry?.key.startsWith(\"cashu\") &&\n latestBalanceInfo.apiKey\n ) {\n this.storageAdapter.removeApiKey(baseUrl);\n this.storageAdapter.setApiKey(baseUrl, latestBalanceInfo.apiKey);\n }\n this.storageAdapter.updateApiKeyBalance(baseUrl, latestTokenBalance);\n\n satsSpent = initialTokenBalance - latestTokenBalance;\n } catch (e) {\n this._log(\"WARN\", \"Could not get updated API key balance:\", e);\n satsSpent = fallbackSatsSpent ?? initialTokenBalance;\n }\n }\n\n return satsSpent;\n }\n\n /**\n * Convert messages for API format\n */\n private async _convertMessages(messages: Message[]): Promise<any[]> {\n return Promise.all(\n messages\n .filter((m) => m.role !== \"system\")\n .map(async (m) => ({\n role: m.role,\n content: typeof m.content === \"string\" ? m.content : m.content,\n }))\n );\n }\n\n /**\n * Create assistant message from streaming result\n */\n private async _createAssistantMessage(\n result: StreamingResult\n ): Promise<Message> {\n if (result.images && result.images.length > 0) {\n // Multimodal message with images\n const content: any[] = [];\n\n if (result.content) {\n content.push({\n type: \"text\",\n text: result.content,\n thinking: result.thinking,\n citations: result.citations,\n annotations: result.annotations,\n });\n }\n\n for (const img of result.images) {\n content.push({\n type: \"image_url\",\n image_url: {\n url: img.image_url.url,\n },\n });\n }\n\n return {\n role: \"assistant\",\n content,\n };\n }\n\n // Simple text message\n return {\n role: \"assistant\",\n content: result.content || \"\",\n };\n }\n\n /**\n * Create a child key for a parent API key via the provider's API\n * POST /v1/balance/child-key\n */\n private async _createChildKey(\n baseUrl: string,\n parentApiKey: string,\n options?: {\n count?: number;\n balanceLimit?: number;\n balanceLimitReset?: string;\n validityDate?: number;\n }\n ): Promise<{\n childKey: string;\n balance: number;\n balanceLimit?: number;\n validityDate?: number;\n }> {\n const response = await fetch(`${baseUrl}v1/balance/child-key`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${parentApiKey}`,\n },\n body: JSON.stringify({\n count: options?.count ?? 1,\n balance_limit: options?.balanceLimit,\n balance_limit_reset: options?.balanceLimitReset,\n validity_date: options?.validityDate,\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to create child key: ${response.status} ${await response.text()}`\n );\n }\n\n const data = await response.json();\n\n return {\n childKey: data.api_keys?.[0],\n balance: data.balance ?? 0,\n balanceLimit: data.balance_limit,\n validityDate: data.validity_date,\n };\n }\n\n /**\n * Calculate estimated costs from usage\n */\n private _getEstimatedCosts(\n selectedModel: Model,\n streamingResult: StreamingResult\n ): number {\n let estimatedCosts = 0;\n if (streamingResult.usage) {\n const { completion_tokens, prompt_tokens } = streamingResult.usage;\n if (completion_tokens !== undefined && prompt_tokens !== undefined) {\n estimatedCosts =\n (selectedModel.sats_pricing?.completion ?? 0) * completion_tokens +\n (selectedModel.sats_pricing?.prompt ?? 0) * prompt_tokens;\n }\n }\n return estimatedCosts;\n }\n\n /**\n * Get pending cashu token amount\n */\n private _getPendingCashuTokenAmount(): number {\n const distribution = this.storageAdapter.getCachedTokenDistribution();\n return distribution.reduce((total, item) => total + item.amount, 0);\n }\n\n /**\n * Check if error message indicates a network error\n */\n private _isNetworkError(message: string): boolean {\n return (\n message.includes(\"NetworkError when attempting to fetch resource\") ||\n message.includes(\"Failed to fetch\") ||\n message.includes(\"Load failed\")\n );\n }\n\n /**\n * Handle errors and notify callbacks\n */\n private _handleError(error: unknown, callbacks: StreamingCallbacks): void {\n this._log(\"ERROR\", \"[RoutstrClient] _handleError: Error occurred\", error);\n\n if (error instanceof Error) {\n const isStreamError =\n error.message.includes(\"Error in input stream\") ||\n error.message.includes(\"Load failed\");\n const modifiedErrorMsg = isStreamError\n ? \"AI stream was cut off, turn on Keep Active or please try again\"\n : error.message;\n\n this._log(\n \"ERROR\",\n `[RoutstrClient] _handleError: Error type=${error.constructor.name}, message=${modifiedErrorMsg}, isStreamError=${isStreamError}`\n );\n\n callbacks.onMessageAppend({\n role: \"system\",\n content:\n \"Uncaught Error: \" +\n modifiedErrorMsg +\n (this.alertLevel === \"max\" ? \" | \" + error.stack : \"\"),\n });\n } else {\n callbacks.onMessageAppend({\n role: \"system\",\n content: \"Unknown Error: Please tag Routstr on Nostr and/or retry.\",\n });\n }\n }\n\n /**\n * Check wallet balance and throw if insufficient\n */\n private async _checkBalance(): Promise<void> {\n const balances = await this.walletAdapter.getBalances();\n const totalBalance = Object.values(balances).reduce((sum, v) => sum + v, 0);\n\n if (totalBalance <= 0) {\n throw new InsufficientBalanceError(1, 0);\n }\n }\n\n /**\n * Spend a token using CashuSpender with standardized error handling\n */\n private async _spendToken(params: {\n mintUrl: string;\n amount: number;\n baseUrl: string;\n }): Promise<{\n token: string;\n tokenBalance: number;\n tokenBalanceUnit: \"sat\" | \"msat\";\n }> {\n const { mintUrl, amount, baseUrl } = params;\n\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _spendToken: mode=${this.mode}, amount=${amount}, baseUrl=${baseUrl}, mintUrl=${mintUrl}`\n );\n\n if (this.mode === \"apikeys\") {\n let parentApiKey = this.storageAdapter.getApiKey(baseUrl);\n if (!parentApiKey) {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _spendToken: No existing API key for ${baseUrl}, creating new one via Cashu`\n );\n const spendResult = await this.cashuSpender.spend({\n mintUrl: mintUrl,\n amount: amount * TOPUP_MARGIN,\n baseUrl: \"\",\n reuseToken: false,\n });\n\n if (!spendResult.token) {\n this._log(\n \"ERROR\",\n `[RoutstrClient] _spendToken: Failed to create Cashu token for API key creation, error:`,\n spendResult.error\n );\n throw new Error(\n `[RoutstrClient] _spendToken: Failed to create Cashu token for API key creation, error: ${spendResult.error}`\n );\n } else {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _spendToken: Cashu token created, token preview: ${spendResult.token}`\n );\n }\n\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _spendToken: Created API key for ${baseUrl}, key preview: ${spendResult.token}, balance: ${spendResult.balance}`\n );\n\n try {\n this.storageAdapter.setApiKey(baseUrl, spendResult.token);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"ApiKey already exists\")\n ) {\n const tryReceiveTokenResult = await this.cashuSpender.receiveToken(\n spendResult.token\n );\n if (tryReceiveTokenResult.success) {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Token restored successfully, amount=${tryReceiveTokenResult.amount}`\n );\n } else {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Token restore failed or not needed`\n );\n }\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _spendToken: API key already exists for ${baseUrl}, using existing key`\n );\n } else {\n throw error;\n }\n }\n parentApiKey = this.storageAdapter.getApiKey(baseUrl);\n } else {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _spendToken: Using existing API key for ${baseUrl}, key preview: ${parentApiKey.key}`\n );\n }\n\n let tokenBalance = 0;\n let tokenBalanceUnit: \"sat\" | \"msat\" = \"sat\";\n\n const apiKeyDistribution = this.storageAdapter.getApiKeyDistribution();\n const distributionForBaseUrl = apiKeyDistribution.find(\n (d) => d.baseUrl === baseUrl\n );\n if (distributionForBaseUrl) {\n tokenBalance = distributionForBaseUrl.amount;\n }\n\n if (tokenBalance === 0 && parentApiKey) {\n try {\n const balanceInfo = await this.balanceManager.getTokenBalance(\n parentApiKey.key,\n baseUrl\n );\n tokenBalance = balanceInfo.amount;\n tokenBalanceUnit = balanceInfo.unit;\n } catch (e) {\n this._log(\"WARN\", \"Could not get initial API key balance:\", e);\n }\n }\n\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _spendToken: Returning token with balance=${tokenBalance} ${tokenBalanceUnit}`\n );\n\n return {\n token: parentApiKey?.key ?? \"\",\n tokenBalance,\n tokenBalanceUnit,\n };\n }\n\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _spendToken: Calling CashuSpender.spend for amount=${amount}, mintUrl=${mintUrl}, mode=${this.mode}`\n );\n const spendResult = await this.cashuSpender.spend({\n mintUrl,\n amount,\n baseUrl: this.mode === \"lazyrefund\" ? baseUrl : \"\",\n reuseToken: this.mode === \"lazyrefund\",\n });\n\n if (!spendResult.token) {\n this._log(\n \"ERROR\",\n `[RoutstrClient] _spendToken: CashuSpender.spend failed, error:`,\n spendResult.error\n );\n } else {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _spendToken: Cashu token created, token preview: ${spendResult.token}, balance: ${spendResult.balance} ${spendResult.unit ?? \"sat\"}`\n );\n }\n\n return {\n token: spendResult.token!,\n tokenBalance: spendResult.balance,\n tokenBalanceUnit: spendResult.unit ?? \"sat\",\n };\n }\n\n /**\n * Build request headers with common defaults and dev mock controls\n */\n private _buildBaseHeaders(\n additionalHeaders: Record<string, string> = {},\n token?: string\n ): Record<string, string> {\n const headers: Record<string, string> = {\n ...additionalHeaders,\n \"Content-Type\": \"application/json\",\n };\n\n return headers;\n }\n\n /**\n * Attach auth headers using the active client mode\n */\n private _withAuthHeader(\n headers: Record<string, string>,\n token: string\n ): Record<string, string> {\n const nextHeaders = { ...headers };\n\n if (this.mode === \"xcashu\") {\n nextHeaders[\"X-Cashu\"] = token;\n } else {\n nextHeaders[\"Authorization\"] = `Bearer ${token}`;\n }\n\n return nextHeaders;\n }\n}\n","import type { StorageDriver } from \"../types\";\n\nconst canUseLocalStorage = (): boolean => {\n return (\n typeof window !== \"undefined\" && typeof window.localStorage !== \"undefined\"\n );\n};\n\nconst isQuotaExceeded = (error: unknown): boolean => {\n const e = error as { name?: string; code?: number } | null;\n return (\n !!e &&\n (e?.name === \"QuotaExceededError\" || e?.code === 22 || e?.code === 1014)\n );\n};\n\nconst NON_CRITICAL_KEYS = new Set<string>([\"modelsFromAllProviders\"]);\n\nexport const localStorageDriver: StorageDriver = {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n if (!canUseLocalStorage()) return defaultValue;\n try {\n const item = window.localStorage.getItem(key);\n if (item === null) return defaultValue;\n try {\n return JSON.parse(item) as T;\n } catch (parseError) {\n if (typeof defaultValue === \"string\") {\n return item as T;\n }\n throw parseError;\n }\n } catch (error) {\n console.error(`Error retrieving item with key \"${key}\":`, error);\n if (canUseLocalStorage()) {\n try {\n window.localStorage.removeItem(key);\n } catch (removeError) {\n console.error(\n `Error removing corrupted item with key \"${key}\":`,\n removeError\n );\n }\n }\n return defaultValue;\n }\n },\n async setItem<T>(key: string, value: T): Promise<void> {\n if (!canUseLocalStorage()) return;\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n if (isQuotaExceeded(error)) {\n if (NON_CRITICAL_KEYS.has(key)) {\n console.warn(\n `Storage quota exceeded; skipping non-critical key \"${key}\".`\n );\n return;\n }\n try {\n window.localStorage.removeItem(\"modelsFromAllProviders\");\n } catch {}\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n return;\n } catch (retryError) {\n console.warn(\n `Storage quota exceeded; unable to persist key \"${key}\" after cleanup attempt.`,\n retryError\n );\n return;\n }\n }\n console.error(`Error storing item with key \"${key}\":`, error);\n }\n },\n async removeItem(key: string): Promise<void> {\n if (!canUseLocalStorage()) return;\n try {\n window.localStorage.removeItem(key);\n } catch (error) {\n console.error(`Error removing item with key \"${key}\":`, error);\n }\n },\n};\n","import type { StorageDriver } from \"../types\";\n\nexport const createMemoryDriver = (\n seed?: Record<string, string>\n): StorageDriver => {\n const store = new Map<string, string>();\n\n if (seed) {\n for (const [key, value] of Object.entries(seed)) {\n store.set(key, value);\n }\n }\n\n return {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n const item = store.get(key);\n if (item === undefined) return defaultValue;\n try {\n return JSON.parse(item) as T;\n } catch (parseError) {\n if (typeof defaultValue === \"string\") {\n return item as T;\n }\n throw parseError;\n }\n },\n async setItem<T>(key: string, value: T): Promise<void> {\n store.set(key, JSON.stringify(value));\n },\n async removeItem(key: string): Promise<void> {\n store.delete(key);\n },\n };\n};\n","import type { StorageDriver } from \"../types\";\n\ntype BetterSqlite3Database = {\n prepare: (sql: string) => {\n run: (...params: any[]) => { changes: number };\n get: (...params: any[]) => any;\n };\n exec: (sql: string) => void;\n close?: () => void;\n};\n\nexport interface SqliteDriverOptions {\n dbPath?: string;\n tableName?: string;\n}\n\nconst isBun = (): boolean => {\n return typeof process.versions.bun !== \"undefined\";\n};\n\nconst createDatabase = (dbPath: string): BetterSqlite3Database => {\n if (isBun()) {\n throw new Error(\n \"SQLite driver not supported in Bun. Use createMemoryDriver() instead.\"\n );\n }\n\n let Database: any = null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n Database = require(\"better-sqlite3\");\n } catch (error) {\n throw new Error(\n `better-sqlite3 is required for sqlite storage. Install it to use sqlite storage. (${error})`\n );\n }\n return new Database(dbPath);\n};\n\nexport const createSqliteDriver = (\n options: SqliteDriverOptions = {}\n): StorageDriver => {\n const dbPath = options.dbPath || \"routstr.sqlite\";\n const tableName = options.tableName || \"sdk_storage\";\n\n const db = createDatabase(dbPath);\n db.exec(\n `CREATE TABLE IF NOT EXISTS ${tableName} (key TEXT PRIMARY KEY, value TEXT NOT NULL)`\n );\n\n const selectStmt = db.prepare(`SELECT value FROM ${tableName} WHERE key = ?`);\n const upsertStmt = db.prepare(\n `INSERT INTO ${tableName} (key, value) VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value`\n );\n const deleteStmt = db.prepare(`DELETE FROM ${tableName} WHERE key = ?`);\n\n return {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n try {\n const row = selectStmt.get(key);\n if (!row || typeof row.value !== \"string\") return defaultValue;\n try {\n return JSON.parse(row.value) as T;\n } catch (parseError) {\n if (typeof defaultValue === \"string\") {\n return row.value as T;\n }\n throw parseError;\n }\n } catch (error) {\n console.error(`SQLite getItem failed for key \"${key}\":`, error);\n return defaultValue;\n }\n },\n async setItem<T>(key: string, value: T): Promise<void> {\n try {\n upsertStmt.run(key, JSON.stringify(value));\n } catch (error) {\n console.error(`SQLite setItem failed for key \"${key}\":`, error);\n }\n },\n async removeItem(key: string): Promise<void> {\n try {\n deleteStmt.run(key);\n } catch (error) {\n console.error(`SQLite removeItem failed for key \"${key}\":`, error);\n }\n },\n };\n};\n","import type { StorageDriver } from \"../types\";\n\nexport interface IndexedDBDriverOptions {\n dbName?: string;\n storeName?: string;\n}\n\nconst openDatabase = (\n dbName: string,\n storeName: string\n): Promise<IDBDatabase> => {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(dbName, 1);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(storeName)) {\n db.createObjectStore(storeName);\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n};\n\nexport const createIndexedDBDriver = (\n options: IndexedDBDriverOptions = {}\n): StorageDriver => {\n const dbName = options.dbName || \"routstr-sdk\";\n const storeName = options.storeName || \"sdk_storage\";\n\n let dbPromise: Promise<IDBDatabase> | null = null;\n\n const getDb = (): Promise<IDBDatabase> => {\n if (!dbPromise) {\n dbPromise = openDatabase(dbName, storeName);\n }\n return dbPromise;\n };\n\n return {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n try {\n const db = await getDb();\n return new Promise<T>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readonly\");\n const store = tx.objectStore(storeName);\n const request = store.get(key);\n\n request.onsuccess = () => {\n const raw = request.result;\n if (raw === undefined) {\n resolve(defaultValue);\n return;\n }\n // Values are stored as raw JSON strings\n if (typeof raw === \"string\") {\n try {\n resolve(JSON.parse(raw) as T);\n } catch {\n if (typeof defaultValue === \"string\") {\n resolve(raw as T);\n } else {\n resolve(defaultValue);\n }\n }\n } else {\n // If stored as a native JS value (e.g. from a previous driver)\n resolve(raw as T);\n }\n };\n request.onerror = () => reject(request.error);\n });\n } catch (error) {\n console.error(`IndexedDB getItem failed for key \"${key}\":`, error);\n return defaultValue;\n }\n },\n\n async setItem<T>(key: string, value: T): Promise<void> {\n try {\n const db = await getDb();\n return new Promise<void>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readwrite\");\n const store = tx.objectStore(storeName);\n store.put(JSON.stringify(value), key);\n\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n } catch (error) {\n console.error(`IndexedDB setItem failed for key \"${key}\":`, error);\n }\n },\n\n async removeItem(key: string): Promise<void> {\n try {\n const db = await getDb();\n return new Promise<void>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readwrite\");\n const store = tx.objectStore(storeName);\n store.delete(key);\n\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n } catch (error) {\n console.error(`IndexedDB removeItem failed for key \"${key}\":`, error);\n }\n },\n };\n};\n","export const SDK_STORAGE_KEYS = {\n MODELS_FROM_ALL_PROVIDERS: \"modelsFromAllProviders\",\n LAST_USED_MODEL: \"lastUsedModel\",\n BASE_URLS_LIST: \"base_urls_list\",\n DISABLED_PROVIDERS: \"disabled_providers\",\n MINTS_FROM_ALL_PROVIDERS: \"mints_from_all_providers\",\n INFO_FROM_ALL_PROVIDERS: \"info_from_all_providers\",\n LAST_MODELS_UPDATE: \"lastModelsUpdate\",\n LAST_BASE_URLS_UPDATE: \"lastBaseUrlsUpdate\",\n LOCAL_CASHU_TOKENS: \"local_cashu_tokens\",\n API_KEYS: \"api_keys\",\n CHILD_KEYS: \"child_keys\",\n ROUTSTR21_MODELS: \"routstr21Models\",\n LAST_ROUTSTR21_MODELS_UPDATE: \"lastRoutstr21ModelsUpdate\",\n CACHED_RECEIVE_TOKENS: \"cached_receive_tokens\",\n} as const;\n\nexport type SdkStorageKey =\n (typeof SDK_STORAGE_KEYS)[keyof typeof SDK_STORAGE_KEYS];\n","import { createStore, type StoreApi } from \"zustand/vanilla\";\nimport type { DiscoveryAdapter } from \"../discovery/interfaces\";\nimport type { StorageAdapter, ProviderRegistry } from \"../wallet/interfaces\";\nimport type { ProviderInfo, Model } from \"../core\";\nimport { getDecodedToken } from \"@cashu/cashu-ts\";\nimport { SDK_STORAGE_KEYS } from \"./keys\";\nimport type { StorageDriver, SdkStorageState } from \"./types\";\n\nconst normalizeBaseUrl = (baseUrl: string): string =>\n baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n\nconst getCashuTokenBalance = (token: string): number => {\n try {\n const decoded = getDecodedToken(token);\n const unitDivisor = decoded.unit === \"msat\" ? 1000 : 1;\n let sum = 0;\n for (const proof of decoded.proofs) {\n sum += proof.amount / unitDivisor;\n }\n return sum;\n } catch {\n return 0;\n }\n};\n\nexport interface SdkStoreOptions {\n driver: StorageDriver;\n}\n\nexport interface SdkStorageStore extends SdkStorageState {\n setModelsFromAllProviders: (value: Record<string, Model[]>) => void;\n setLastUsedModel: (value: string | null) => void;\n setBaseUrlsList: (value: string[]) => void;\n setBaseUrlsLastUpdate: (value: number | null) => void;\n setDisabledProviders: (value: string[]) => void;\n setMintsFromAllProviders: (value: Record<string, string[]>) => void;\n setInfoFromAllProviders: (value: Record<string, ProviderInfo>) => void;\n setLastModelsUpdate: (value: Record<string, number>) => void;\n setCachedTokens: (\n value:\n | Array<{\n baseUrl: string;\n token: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n | ((\n current: SdkStorageStore[\"cachedTokens\"]\n ) => SdkStorageStore[\"cachedTokens\"])\n ) => void;\n setApiKeys: (\n value:\n | Array<{\n baseUrl: string;\n key: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n | ((current: SdkStorageStore[\"apiKeys\"]) => SdkStorageStore[\"apiKeys\"])\n ) => void;\n setChildKeys: (\n value: Array<{\n parentBaseUrl: string;\n childKey: string;\n balance?: number;\n balanceLimit?: number;\n validityDate?: number;\n createdAt?: number;\n }>\n ) => void;\n setRoutstr21Models: (value: string[]) => void;\n setRoutstr21ModelsLastUpdate: (value: number | null) => void;\n setCachedReceiveTokens: (\n value: Array<{\n token: string;\n amount: number;\n unit: \"sat\" | \"msat\";\n createdAt?: number;\n }>\n ) => void;\n}\n\n/** Store type returned after async initialization */\nexport type SdkStore = StoreApi<SdkStorageStore>;\n\nexport const createSdkStore = async ({\n driver,\n}: SdkStoreOptions): Promise<SdkStore> => {\n // Hydrate all initial state from the async driver in parallel\n const [\n rawModels,\n lastUsedModel,\n rawBaseUrls,\n lastBaseUrlsUpdate,\n rawDisabledProviders,\n rawMints,\n rawInfo,\n rawLastModelsUpdate,\n rawCachedTokens,\n rawApiKeys,\n rawChildKeys,\n rawRoutstr21Models,\n rawLastRoutstr21ModelsUpdate,\n rawCachedReceiveTokens,\n ] = await Promise.all([\n driver.getItem<Record<string, Model[]>>(\n SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,\n {}\n ),\n driver.getItem<string | null>(SDK_STORAGE_KEYS.LAST_USED_MODEL, null),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.BASE_URLS_LIST, []),\n driver.getItem<number | null>(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, null),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, []),\n driver.getItem<Record<string, string[]>>(\n SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS,\n {}\n ),\n driver.getItem<Record<string, ProviderInfo>>(\n SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS,\n {}\n ),\n driver.getItem<Record<string, number>>(\n SDK_STORAGE_KEYS.LAST_MODELS_UPDATE,\n {}\n ),\n driver.getItem<\n Array<{\n baseUrl: string;\n token: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n >(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, []),\n driver.getItem<\n Array<{\n baseUrl: string;\n key: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n >(SDK_STORAGE_KEYS.API_KEYS, []),\n driver.getItem<\n Array<{\n parentBaseUrl: string;\n childKey: string;\n balance?: number;\n balanceLimit?: number;\n validityDate?: number;\n createdAt?: number;\n }>\n >(SDK_STORAGE_KEYS.CHILD_KEYS, []),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, []),\n driver.getItem<number | null>(\n SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE,\n null\n ),\n driver.getItem<\n Array<{\n token: string;\n amount: number;\n unit: \"sat\" | \"msat\";\n createdAt?: number;\n }>\n >(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, []),\n ]);\n\n // Normalize all hydrated state\n const modelsFromAllProviders = Object.fromEntries(\n Object.entries(rawModels).map(([baseUrl, models]) => [\n normalizeBaseUrl(baseUrl),\n models,\n ])\n );\n\n const baseUrlsList = rawBaseUrls.map((url) => normalizeBaseUrl(url));\n\n const disabledProviders = rawDisabledProviders.map((url) =>\n normalizeBaseUrl(url)\n );\n\n const mintsFromAllProviders = Object.fromEntries(\n Object.entries(rawMints).map(([baseUrl, mints]) => [\n normalizeBaseUrl(baseUrl),\n mints.map((mint) => (mint.endsWith(\"/\") ? mint.slice(0, -1) : mint)),\n ])\n );\n\n const infoFromAllProviders = Object.fromEntries(\n Object.entries(rawInfo).map(([baseUrl, info]) => [\n normalizeBaseUrl(baseUrl),\n info,\n ])\n );\n\n const lastModelsUpdate = Object.fromEntries(\n Object.entries(rawLastModelsUpdate).map(([baseUrl, timestamp]) => [\n normalizeBaseUrl(baseUrl),\n timestamp,\n ])\n );\n\n const cachedTokens = rawCachedTokens.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance:\n typeof entry.balance === \"number\"\n ? entry.balance\n : getCashuTokenBalance(entry.token),\n lastUsed: entry.lastUsed ?? null,\n }));\n\n const apiKeys = rawApiKeys.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance: entry.balance ?? 0,\n lastUsed: entry.lastUsed ?? null,\n }));\n\n const childKeys = rawChildKeys.map((entry) => ({\n parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),\n childKey: entry.childKey,\n balance: entry.balance ?? 0,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt ?? Date.now(),\n }));\n\n const routstr21Models = rawRoutstr21Models;\n const lastRoutstr21ModelsUpdate = rawLastRoutstr21ModelsUpdate;\n\n const cachedReceiveTokens = rawCachedReceiveTokens?.map((entry) => ({\n token: entry.token,\n amount: entry.amount,\n unit: entry.unit || \"sat\",\n createdAt: entry.createdAt ?? Date.now(),\n }));\n\n // Create the store with hydrated state.\n // All setters update in-memory state synchronously and persist to driver\n // as fire-and-forget (no await on setItem).\n return createStore<SdkStorageStore>((set, get) => ({\n modelsFromAllProviders,\n lastUsedModel,\n baseUrlsList,\n lastBaseUrlsUpdate,\n disabledProviders,\n mintsFromAllProviders,\n infoFromAllProviders,\n lastModelsUpdate,\n cachedTokens,\n apiKeys,\n childKeys,\n routstr21Models,\n lastRoutstr21ModelsUpdate,\n cachedReceiveTokens,\n setModelsFromAllProviders: (value) => {\n const normalized: Record<string, Model[]> = {};\n for (const [baseUrl, models] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = models;\n }\n void driver.setItem(\n SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,\n normalized\n );\n set({ modelsFromAllProviders: normalized });\n },\n setLastUsedModel: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.LAST_USED_MODEL, value);\n set({ lastUsedModel: value });\n },\n setBaseUrlsList: (value) => {\n const normalized = value.map((url) => normalizeBaseUrl(url));\n void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);\n set({ baseUrlsList: normalized });\n },\n setBaseUrlsLastUpdate: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, value);\n set({ lastBaseUrlsUpdate: value });\n },\n setDisabledProviders: (value) => {\n const normalized = value.map((url) => normalizeBaseUrl(url));\n void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);\n set({ disabledProviders: normalized });\n },\n setMintsFromAllProviders: (value) => {\n const normalized: Record<string, string[]> = {};\n for (const [baseUrl, mints] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = mints.map((mint) =>\n mint.endsWith(\"/\") ? mint.slice(0, -1) : mint\n );\n }\n void driver.setItem(\n SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS,\n normalized\n );\n set({ mintsFromAllProviders: normalized });\n },\n setInfoFromAllProviders: (value) => {\n const normalized: Record<string, ProviderInfo> = {};\n for (const [baseUrl, info] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = info;\n }\n void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);\n set({ infoFromAllProviders: normalized });\n },\n setLastModelsUpdate: (value) => {\n const normalized: Record<string, number> = {};\n for (const [baseUrl, timestamp] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = timestamp;\n }\n void driver.setItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, normalized);\n set({ lastModelsUpdate: normalized });\n },\n setCachedTokens: (value) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.cachedTokens) : value;\n const normalized = updates.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance:\n typeof entry.balance === \"number\"\n ? entry.balance\n : getCashuTokenBalance(entry.token),\n lastUsed: entry.lastUsed ?? null,\n }));\n void driver.setItem(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, normalized);\n return { cachedTokens: normalized };\n });\n },\n setApiKeys: (value) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.apiKeys) : value;\n const normalized = updates.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance: entry.balance ?? 0,\n lastUsed: entry.lastUsed ?? null,\n }));\n void driver.setItem(SDK_STORAGE_KEYS.API_KEYS, normalized);\n return { apiKeys: normalized };\n });\n },\n setChildKeys: (\n value:\n | Array<{\n parentBaseUrl: string;\n childKey: string;\n balance?: number;\n balanceLimit?: number;\n validityDate?: number;\n createdAt?: number;\n }>\n | ((\n current: SdkStorageStore[\"childKeys\"]\n ) => SdkStorageStore[\"childKeys\"])\n ) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.childKeys) : value;\n const normalized = updates.map((entry) => ({\n parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),\n childKey: entry.childKey,\n balance: entry.balance ?? 0,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt ?? Date.now(),\n }));\n void driver.setItem(SDK_STORAGE_KEYS.CHILD_KEYS, normalized);\n return { childKeys: normalized };\n });\n },\n setRoutstr21Models: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, value);\n set({ routstr21Models: value });\n },\n setRoutstr21ModelsLastUpdate: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE, value);\n set({ lastRoutstr21ModelsUpdate: value });\n },\n setCachedReceiveTokens: (value) => {\n const normalized = value.map((entry) => ({\n token: entry.token,\n amount: entry.amount,\n unit: entry.unit || \"sat\",\n createdAt: entry.createdAt ?? Date.now(),\n }));\n void driver.setItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, normalized);\n set({ cachedReceiveTokens: normalized });\n },\n }));\n};\n\nexport const createDiscoveryAdapterFromStore = (\n store: SdkStore\n): DiscoveryAdapter => ({\n getCachedModels: () => store.getState().modelsFromAllProviders,\n setCachedModels: (models) =>\n store.getState().setModelsFromAllProviders(models),\n getCachedMints: () => store.getState().mintsFromAllProviders,\n setCachedMints: (mints) => store.getState().setMintsFromAllProviders(mints),\n getCachedProviderInfo: () => store.getState().infoFromAllProviders,\n setCachedProviderInfo: (info) =>\n store.getState().setInfoFromAllProviders(info),\n getProviderLastUpdate: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const timestamps = store.getState().lastModelsUpdate;\n return timestamps[normalized] || null;\n },\n setProviderLastUpdate: (baseUrl, timestamp) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const timestamps = { ...store.getState().lastModelsUpdate };\n timestamps[normalized] = timestamp;\n store.getState().setLastModelsUpdate(timestamps);\n },\n getLastUsedModel: () => store.getState().lastUsedModel,\n setLastUsedModel: (modelId) => store.getState().setLastUsedModel(modelId),\n getDisabledProviders: () => store.getState().disabledProviders,\n getBaseUrlsList: () => store.getState().baseUrlsList,\n setBaseUrlsList: (urls) => store.getState().setBaseUrlsList(urls),\n getBaseUrlsLastUpdate: () => store.getState().lastBaseUrlsUpdate,\n setBaseUrlsLastUpdate: (timestamp) =>\n store.getState().setBaseUrlsLastUpdate(timestamp),\n getRoutstr21Models: () => store.getState().routstr21Models,\n setRoutstr21Models: (models) => store.getState().setRoutstr21Models(models),\n getRoutstr21ModelsLastUpdate: () =>\n store.getState().lastRoutstr21ModelsUpdate,\n setRoutstr21ModelsLastUpdate: (timestamp) =>\n store.getState().setRoutstr21ModelsLastUpdate(timestamp),\n});\n\nexport const createStorageAdapterFromStore = (\n store: SdkStore\n): StorageAdapter => ({\n getToken: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const entry = store\n .getState()\n .cachedTokens.find((token) => token.baseUrl === normalized);\n if (!entry) return null;\n const next = store\n .getState()\n .cachedTokens.map((token) =>\n token.baseUrl === normalized\n ? { ...token, lastUsed: Date.now() }\n : token\n );\n store.getState().setCachedTokens(next);\n return entry.token;\n },\n setToken: (baseUrl, token) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const tokens = store.getState().cachedTokens;\n const balance = getCashuTokenBalance(token);\n const existingIndex = tokens.findIndex(\n (entry) => entry.baseUrl === normalized\n );\n if (existingIndex !== -1) {\n throw new Error(`Token already exists for baseUrl: ${normalized}`);\n }\n const next = [...tokens];\n next.push({\n baseUrl: normalized,\n token,\n balance,\n lastUsed: Date.now(),\n });\n store.getState().setCachedTokens(next);\n },\n removeToken: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const next = store\n .getState()\n .cachedTokens.filter((entry) => entry.baseUrl !== normalized);\n store.getState().setCachedTokens(next);\n },\n updateTokenBalance: (baseUrl, balance) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const tokens = store.getState().cachedTokens;\n const next = tokens.map((entry) =>\n entry.baseUrl === normalized ? { ...entry, balance } : entry\n );\n store.getState().setCachedTokens(next);\n },\n getCachedTokenDistribution: () => {\n const cachedTokens = store.getState().cachedTokens;\n const distributionMap: Record<string, number> = {};\n\n for (const entry of cachedTokens) {\n const sum = entry.balance || 0;\n if (sum > 0) {\n distributionMap[entry.baseUrl] =\n (distributionMap[entry.baseUrl] || 0) + sum;\n }\n }\n\n return Object.entries(distributionMap)\n .map(([baseUrl, amt]) => ({ baseUrl, amount: amt }))\n .sort((a, b) => b.amount - a.amount);\n },\n getApiKeyDistribution: () => {\n const apiKeys = store.getState().apiKeys;\n const distributionMap: Record<string, number> = {};\n\n for (const entry of apiKeys) {\n const sum = entry.balance || 0;\n if (sum > 0) {\n distributionMap[entry.baseUrl] =\n (distributionMap[entry.baseUrl] || 0) + sum;\n }\n }\n\n return Object.entries(distributionMap)\n .map(([baseUrl, amt]) => ({ baseUrl, amount: amt }))\n .sort((a, b) => b.amount - a.amount);\n },\n saveProviderInfo: (baseUrl, info) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const next = { ...store.getState().infoFromAllProviders };\n next[normalized] = info;\n store.getState().setInfoFromAllProviders(next);\n },\n getProviderInfo: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n return store.getState().infoFromAllProviders[normalized] || null;\n },\n\n // ========== API Keys (for apikeys mode) ==========\n\n getApiKey: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const entry = store\n .getState()\n .apiKeys.find((key) => key.baseUrl === normalized);\n if (!entry) return null;\n // Update lastUsed timestamp\n const next = store\n .getState()\n .apiKeys.map((key) =>\n key.baseUrl === normalized ? { ...key, lastUsed: Date.now() } : key\n );\n store.getState().setApiKeys(next);\n return entry;\n },\n\n setApiKey: (baseUrl, key) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const keys = store.getState().apiKeys;\n const existingIndex = keys.findIndex(\n (entry) => entry.baseUrl === normalized\n );\n if (existingIndex !== -1) {\n throw new Error(`ApiKey already exists for baseUrl: ${normalized}`);\n }\n const next = [...keys];\n next.push({\n baseUrl: normalized,\n key,\n balance: 0,\n lastUsed: Date.now(),\n });\n store.getState().setApiKeys(next);\n },\n\n updateApiKeyBalance: (baseUrl, balance) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const keys = store.getState().apiKeys;\n const next = keys.map((entry) =>\n entry.baseUrl === normalized ? { ...entry, balance } : entry\n );\n store.getState().setApiKeys(next);\n },\n\n removeApiKey: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const next = store\n .getState()\n .apiKeys.filter((entry) => entry.baseUrl !== normalized);\n store.getState().setApiKeys(next);\n },\n\n getAllApiKeys: () => {\n return store.getState().apiKeys.map((entry) => ({\n baseUrl: entry.baseUrl,\n key: entry.key,\n balance: entry.balance,\n lastUsed: entry.lastUsed,\n }));\n },\n\n // ========== Child Keys ==========\n\n getChildKey: (parentBaseUrl) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const entry = store\n .getState()\n .childKeys.find((key) => key.parentBaseUrl === normalized);\n if (!entry) return null;\n return {\n parentBaseUrl: entry.parentBaseUrl,\n childKey: entry.childKey,\n balance: entry.balance,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt,\n };\n },\n\n setChildKey: (\n parentBaseUrl,\n childKey,\n balance,\n validityDate,\n balanceLimit\n ) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const keys = store.getState().childKeys;\n const existingIndex = keys.findIndex(\n (entry) => entry.parentBaseUrl === normalized\n );\n if (existingIndex !== -1) {\n // Update existing child key\n const next = keys.map((entry) =>\n entry.parentBaseUrl === normalized\n ? {\n ...entry,\n childKey,\n balance: balance ?? 0,\n validityDate,\n balanceLimit,\n createdAt: Date.now(),\n }\n : entry\n );\n store.getState().setChildKeys(next);\n } else {\n // Add new child key\n const next = [...keys];\n next.push({\n parentBaseUrl: normalized,\n childKey,\n balance: balance ?? 0,\n validityDate,\n balanceLimit,\n createdAt: Date.now(),\n });\n store.getState().setChildKeys(next);\n }\n },\n\n updateChildKeyBalance: (parentBaseUrl, balance) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const keys = store.getState().childKeys;\n const next = keys.map((entry) =>\n entry.parentBaseUrl === normalized ? { ...entry, balance } : entry\n );\n store.getState().setChildKeys(next);\n },\n\n removeChildKey: (parentBaseUrl) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const next = store\n .getState()\n .childKeys.filter((entry) => entry.parentBaseUrl !== normalized);\n store.getState().setChildKeys(next);\n },\n\n getAllChildKeys: () => {\n return store.getState().childKeys.map((entry) => ({\n parentBaseUrl: entry.parentBaseUrl,\n childKey: entry.childKey,\n balance: entry.balance,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt,\n }));\n },\n\n getCachedReceiveTokens: () => {\n return store.getState().cachedReceiveTokens;\n },\n\n setCachedReceiveTokens: (tokens) => {\n store.getState().setCachedReceiveTokens(tokens);\n },\n});\n\nexport const createProviderRegistryFromStore = (\n store: SdkStore\n): ProviderRegistry => ({\n getModelsForProvider: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n return store.getState().modelsFromAllProviders[normalized] || [];\n },\n getDisabledProviders: () => store.getState().disabledProviders,\n getProviderMints: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n return store.getState().mintsFromAllProviders[normalized] || [];\n },\n getProviderInfo: async (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const cached = store.getState().infoFromAllProviders[normalized];\n if (cached) return cached;\n try {\n const response = await fetch(`${normalized}v1/info`);\n if (!response.ok) {\n throw new Error(`Failed ${response.status}`);\n }\n const info = (await response.json()) as ProviderInfo;\n const next = { ...store.getState().infoFromAllProviders };\n next[normalized] = info;\n store.getState().setInfoFromAllProviders(next);\n return info;\n } catch (error) {\n console.warn(`Failed to fetch provider info from ${normalized}:`, error);\n return null;\n }\n },\n getAllProvidersModels: () => store.getState().modelsFromAllProviders,\n});\n","import { localStorageDriver } from \"./drivers/localStorage\";\nimport { createMemoryDriver } from \"./drivers/memory\";\nimport { createSqliteDriver } from \"./drivers/sqlite\";\nimport { createIndexedDBDriver } from \"./drivers/indexedDB\";\nimport type { StorageDriver } from \"./types\";\nimport {\n createSdkStore,\n createDiscoveryAdapterFromStore,\n createProviderRegistryFromStore,\n createStorageAdapterFromStore,\n type SdkStore,\n} from \"./store\";\n\nexport type { StorageDriver } from \"./types\";\nexport type { SdkStore } from \"./store\";\nexport type { DiscoveryAdapter } from \"../discovery/interfaces\";\nexport type { StorageAdapter, ProviderRegistry } from \"../wallet/interfaces\";\nexport { SDK_STORAGE_KEYS } from \"./keys\";\nexport {\n createSdkStore,\n createDiscoveryAdapterFromStore,\n createProviderRegistryFromStore,\n createStorageAdapterFromStore,\n} from \"./store\";\nexport {\n localStorageDriver,\n createMemoryDriver,\n createSqliteDriver,\n createIndexedDBDriver,\n};\n\nconst isBrowser = (): boolean => {\n try {\n return (\n typeof window !== \"undefined\" &&\n typeof window.localStorage !== \"undefined\"\n );\n } catch {\n return false;\n }\n};\n\nconst isNode = (): boolean => {\n try {\n return (\n typeof process !== \"undefined\" &&\n process.versions != null &&\n process.versions.node != null\n );\n } catch {\n return false;\n }\n};\n\nlet defaultDriver: StorageDriver | null = null;\n\nconst isBun = (): boolean => {\n return typeof process.versions.bun !== \"undefined\";\n};\n\nexport const getDefaultSdkDriver = (): StorageDriver => {\n if (defaultDriver) return defaultDriver;\n if (isBrowser()) {\n defaultDriver = localStorageDriver;\n return defaultDriver;\n }\n if (isBun()) {\n defaultDriver = createMemoryDriver();\n return defaultDriver;\n }\n if (isNode()) {\n defaultDriver = createSqliteDriver();\n return defaultDriver;\n }\n defaultDriver = createMemoryDriver();\n return defaultDriver;\n};\n\nlet defaultStorePromise: Promise<SdkStore> | null = null;\n\nexport const getDefaultSdkStore = (): Promise<SdkStore> => {\n if (!defaultStorePromise) {\n defaultStorePromise = createSdkStore({ driver: getDefaultSdkDriver() });\n }\n return defaultStorePromise;\n};\n\nexport const getDefaultDiscoveryAdapter = async () =>\n createDiscoveryAdapterFromStore(await getDefaultSdkStore());\n\nexport const getDefaultStorageAdapter = async () =>\n createStorageAdapterFromStore(await getDefaultSdkStore());\n\nexport const getDefaultProviderRegistry = async () =>\n createProviderRegistryFromStore(await getDefaultSdkStore());\n","/**\n * routeRequests - SDK helper for routing OpenAI-compatible requests to the cheapest provider\n *\n * This module provides a reusable function for routing requests to the cheapest\n * provider based on model pricing, with automatic Cashu token handling.\n */\n\nimport type { Model, Message } from \"./core/types\";\nimport type { DiscoveryAdapter } from \"./discovery/interfaces\";\nimport type {\n ProviderRegistry,\n WalletAdapter,\n StorageAdapter,\n} from \"./wallet/interfaces\";\nimport { ModelManager } from \"./discovery/ModelManager\";\nimport { ProviderManager } from \"./client/ProviderManager\";\nimport { RoutstrClient, type DebugLevel } from \"./client/RoutstrClient\";\n\n/**\n * Options for routeRequests function\n */\nexport interface RouteRequestOptions {\n /** The model ID to route (e.g., \"gpt-4o\") */\n modelId: string;\n /** The request body to proxy to the provider */\n requestBody: unknown;\n /** Optional: API path (defaults to /v1/chat/completions) */\n path?: string;\n /** Optional: force a specific provider base URL */\n forcedProvider?: string;\n /** Wallet adapter for Cashu operations */\n walletAdapter: WalletAdapter;\n /** Storage adapter for caching */\n storageAdapter: StorageAdapter;\n /** Provider registry for tracking available providers */\n providerRegistry: ProviderRegistry;\n /** Discovery adapter for model/mint discovery */\n discoveryAdapter: DiscoveryAdapter;\n /** Optional: additional provider URLs to include */\n includeProviderUrls?: string[];\n /** Optional: Tor mode for onion routing */\n torMode?: boolean;\n /** Optional: force refresh of cached data */\n forceRefresh?: boolean;\n /** Optional: pre-initialized ModelManager (skips bootstrap if provided) */\n modelManager?: ModelManager;\n /** Optional: set RoutstrClient debug level */\n debugLevel?: DebugLevel;\n}\n\n/**\n * Result from routeRequests function\n */\nexport interface RouteRequestResult {\n /** The selected provider base URL */\n baseUrl: string;\n /** The selected model with pricing info */\n selectedModel: Model;\n /** Pricing info for the selected provider */\n pricing: {\n promptPerMillion: number;\n completionPerMillion: number;\n totalPerMillion: number;\n };\n /** The response from the provider */\n response: {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: unknown;\n };\n}\n\n/**\n * Route an OpenAI-compatible request to the cheapest provider\n *\n * This function:\n * 1. Bootstraps providers and fetches models\n * 2. Discovers available mints\n * 3. Selects the cheapest provider for the requested model\n * 4. Handles Cashu send/receive via RoutstrClient\n * 5. Proxies the request and returns the response\n *\n * @param options - Routing options\n * @returns The provider response\n */\nexport async function routeRequests(\n options: RouteRequestOptions\n): Promise<Response> {\n const {\n modelId,\n requestBody,\n path = \"/v1/chat/completions\",\n forcedProvider,\n walletAdapter,\n storageAdapter,\n providerRegistry,\n discoveryAdapter,\n includeProviderUrls = [],\n torMode = false,\n forceRefresh = false,\n modelManager: providedModelManager,\n debugLevel,\n } = options;\n\n // Use provided ModelManager or create a new one\n let modelManager: ModelManager;\n let providers: string[];\n\n if (providedModelManager) {\n modelManager = providedModelManager;\n providers = modelManager.getBaseUrls();\n if (providers.length === 0) {\n throw new Error(\"No providers available - run bootstrap first\");\n }\n } else {\n // Initialize ModelManager\n modelManager = new ModelManager(discoveryAdapter, {\n includeProviderUrls: forcedProvider\n ? [forcedProvider, ...includeProviderUrls]\n : includeProviderUrls,\n });\n\n // Bootstrap providers\n providers = await modelManager.bootstrapProviders(torMode);\n if (providers.length === 0) {\n throw new Error(\"No providers available\");\n }\n\n // Fetch models\n await modelManager.fetchModels(providers, forceRefresh);\n }\n\n // Initialize ProviderManager\n const providerManager = new ProviderManager(providerRegistry);\n\n // Determine cheapest provider\n let baseUrl: string;\n let selectedModel: Model;\n\n if (forcedProvider) {\n // Use forced provider\n const normalizedProvider = forcedProvider.endsWith(\"/\")\n ? forcedProvider\n : `${forcedProvider}/`;\n const cachedModels = modelManager.getAllCachedModels();\n const models = cachedModels[normalizedProvider] || [];\n const match = models.find((m) => m.id === modelId);\n if (!match) {\n throw new Error(\n `Provider ${normalizedProvider} does not offer model: ${modelId}`\n );\n }\n baseUrl = normalizedProvider;\n selectedModel = match;\n } else {\n // Find cheapest provider\n const ranking = providerManager.getProviderPriceRankingForModel(modelId, {\n torMode,\n includeDisabled: false,\n });\n if (ranking.length === 0) {\n throw new Error(`No providers found for model: ${modelId}`);\n }\n const cheapest = ranking[0];\n baseUrl = cheapest.baseUrl;\n selectedModel = cheapest.model;\n }\n\n // Get wallet balance\n const balances = await walletAdapter.getBalances();\n const totalBalance = Object.values(balances).reduce((sum, v) => sum + v, 0);\n\n if (totalBalance <= 0) {\n throw new Error(\n \"Wallet balance is empty. Add a mint and fund it before making requests.\"\n );\n }\n\n // Get mint URL\n const providerMints = providerRegistry.getProviderMints(baseUrl);\n const mintUrl =\n walletAdapter.getActiveMintUrl() ||\n providerMints[0] ||\n Object.keys(balances)[0];\n\n if (!mintUrl) {\n throw new Error(\"No mint configured in wallet\");\n }\n\n // Initialize RoutstrClient\n const alertLevel = \"min\";\n const client = new RoutstrClient(\n walletAdapter,\n storageAdapter,\n providerRegistry,\n alertLevel,\n \"apikeys\"\n );\n\n if (debugLevel) {\n client.setDebugLevel(debugLevel);\n }\n\n // Extract options from request body\n const maxTokens = extractMaxTokens(requestBody);\n const stream = extractStream(requestBody);\n\n // Make the request using the simpler routeRequest method\n let response: Response | null = null;\n\n try {\n const proxiedBody: Record<string, unknown> =\n requestBody && typeof requestBody === \"object\"\n ? { ...(requestBody as Record<string, unknown>) }\n : {};\n\n proxiedBody.model = selectedModel.id;\n\n if (stream !== undefined) {\n proxiedBody.stream = stream;\n }\n\n if (maxTokens !== undefined) {\n proxiedBody.max_tokens = maxTokens;\n }\n console.log(modelId);\n\n response = await client.routeRequest({\n path,\n method: \"POST\",\n body: proxiedBody,\n baseUrl,\n mintUrl,\n modelId: modelId,\n });\n\n if (!response.ok) {\n throw new Error(`${response.status} ${response.statusText}`);\n }\n\n return response;\n } catch (error) {\n if (\n error instanceof Error &&\n (error.message.includes(\"401\") ||\n error.message.includes(\"402\") ||\n error.message.includes(\"403\"))\n ) {\n throw new Error(`Authentication failed: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Extract message history from request body\n */\nfunction extractMessageHistory(requestBody: unknown): Message[] {\n if (!requestBody || typeof requestBody !== \"object\") {\n return [];\n }\n\n const body = requestBody as Record<string, unknown>;\n const messages = body.messages;\n\n if (!Array.isArray(messages)) {\n return [];\n }\n\n return messages as Message[];\n}\n\n/**\n * Extract max_tokens from request body\n */\nfunction extractMaxTokens(requestBody: unknown): number | undefined {\n if (!requestBody || typeof requestBody !== \"object\") {\n return undefined;\n }\n\n const body = requestBody as Record<string, unknown>;\n const maxTokens = body.max_tokens;\n\n if (typeof maxTokens === \"number\") {\n return maxTokens;\n }\n\n return undefined;\n}\n\n/**\n * Extract stream option from request body\n */\nfunction extractStream(requestBody: unknown): boolean {\n if (!requestBody || typeof requestBody !== \"object\") {\n return false;\n }\n\n const body = requestBody as Record<string, unknown>;\n const stream = body.stream;\n\n return stream === true;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../core/errors.ts","../discovery/ModelManager.ts","../discovery/MintDiscovery.ts","../wallet/AuditLogger.ts","../wallet/tokenUtils.ts","../wallet/CashuSpender.ts","../wallet/BalanceManager.ts","../client/StreamProcessor.ts","../utils/torUtils.ts","../client/ProviderManager.ts","../client/RoutstrClient.ts","../storage/drivers/localStorage.ts","../storage/drivers/memory.ts","../storage/drivers/sqlite.ts","../storage/drivers/indexedDB.ts","../storage/keys.ts","../storage/store.ts","../storage/index.ts","../routeRequests.ts"],"names":["RelayPool","EventStore","onlyEvents","tap","event","mintUrl","spendResult","getDecodedToken","createStore","isBrowser","isBun"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Custom error classes for the Routstr SDK\n * Provides specific error types for different failure modes\n */\n\n/**\n * Error thrown when balance is insufficient for an operation\n */\nexport class InsufficientBalanceError extends Error {\n constructor(\n public required: number,\n public available: number,\n public maxMintBalance: number = 0,\n public maxMintUrl: string = \"\",\n customMessage?: string\n ) {\n super(\n customMessage ??\n (`Insufficient balance: need ${required} sats, have ${available} sats available. ` +\n (maxMintBalance > 0\n ? `Largest mint balance: ${maxMintBalance} sats from ${maxMintUrl}`\n : \"\"))\n );\n this.name = \"InsufficientBalanceError\";\n }\n}\n\n/**\n * Error thrown when a provider returns an error response\n */\nexport class ProviderError extends Error {\n constructor(\n public baseUrl: string,\n public statusCode: number,\n message: string,\n public requestId?: string\n ) {\n super(\n `Provider ${baseUrl} returned ${statusCode}: ${message}` +\n (requestId ? ` (Request ID: ${requestId})` : \"\")\n );\n this.name = \"ProviderError\";\n }\n}\n\n/**\n * Error thrown when a mint is unreachable\n */\nexport class MintUnreachableError extends Error {\n constructor(public mintUrl: string) {\n super(\n `Your mint ${mintUrl} is unreachable or is blocking your IP. Please try again later or switch mints.`\n );\n this.name = \"MintUnreachableError\";\n }\n}\n\n/**\n * Error thrown when a token operation fails\n */\nexport class TokenOperationError extends Error {\n constructor(\n message: string,\n public operation: \"send\" | \"receive\" | \"refund\",\n public mintUrl?: string\n ) {\n super(message);\n this.name = \"TokenOperationError\";\n }\n}\n\n/**\n * Error thrown when provider failover fails\n */\nexport class FailoverError extends Error {\n constructor(\n public originalProvider: string,\n public failedProviders: string[],\n message?: string\n ) {\n super(\n message ||\n `All providers failed. Original: ${originalProvider}, Failed: ${failedProviders.join(\", \")}`\n );\n this.name = \"FailoverError\";\n }\n}\n\n/**\n * Error thrown when streaming response processing fails\n */\nexport class StreamingError extends Error {\n constructor(\n message: string,\n public finishReason?: string,\n public accumulatedContent?: string\n ) {\n super(message);\n this.name = \"StreamingError\";\n }\n}\n\n/**\n * Error thrown when model is not found on a provider\n */\nexport class ModelNotFoundError extends Error {\n constructor(public modelId: string, public baseUrl: string) {\n super(`Model '${modelId}' not found on provider ${baseUrl}`);\n this.name = \"ModelNotFoundError\";\n }\n}\n\n/**\n * Error thrown when provider bootstrap fails\n */\nexport class ProviderBootstrapError extends Error {\n constructor(\n public failedProviders: string[],\n message?: string\n ) {\n super(\n message || `Failed to bootstrap providers. Tried: ${failedProviders.join(\", \")}`\n );\n this.name = \"ProviderBootstrapError\";\n }\n}\n\n/**\n * Error thrown when no providers are available\n */\nexport class NoProvidersAvailableError extends Error {\n constructor() {\n super(\"No providers are available for model discovery\");\n this.name = \"NoProvidersAvailableError\";\n }\n}\n\n/**\n * Error thrown when mint discovery fails\n */\nexport class MintDiscoveryError extends Error {\n constructor(\n public baseUrl: string,\n message?: string\n ) {\n super(message || `Failed to discover mints from provider ${baseUrl}`);\n this.name = \"MintDiscoveryError\";\n }\n}\n","/**\n * ModelManager class for discovering, fetching, and managing models from providers\n * Core responsibility: fetching models from providers, caching them, and selecting the best option\n * (lowest cost) across multiple providers\n */\n\nimport type { Model } from \"../core/types\";\nimport type { DiscoveryAdapter, ProviderInfo } from \"./interfaces\";\nimport {\n NoProvidersAvailableError,\n ProviderBootstrapError,\n} from \"../core/errors\";\nimport { onlyEvents, RelayPool } from \"applesauce-relay\";\nimport { EventStore } from \"applesauce-core\";\nimport { tap } from \"rxjs\";\n\n/**\n * Configuration for ModelManager\n */\nexport interface ModelManagerConfig {\n /** URL to fetch provider directory from */\n providerDirectoryUrl?: string;\n /** Additional provider base URLs to include */\n includeProviderUrls?: string[];\n /** Provider base URLs to exclude */\n excludeProviderUrls?: string[];\n /** Cache TTL in milliseconds (default: 21 minutes) */\n cacheTTL?: number;\n}\n\n/**\n * ModelManager handles all model discovery and caching logic\n * Abstracts away storage details via DiscoveryAdapter\n */\nexport class ModelManager {\n private readonly cacheTTL: number;\n private readonly providerDirectoryUrl: string;\n private readonly includeProviderUrls: string[];\n private readonly excludeProviderUrls: string[];\n\n constructor(\n private adapter: DiscoveryAdapter,\n config: ModelManagerConfig = {}\n ) {\n this.providerDirectoryUrl =\n config.providerDirectoryUrl || \"https://api.routstr.com/v1/providers/\";\n this.cacheTTL = config.cacheTTL || 210 * 60 * 1000; // 21 minutes\n this.includeProviderUrls = config.includeProviderUrls || [];\n this.excludeProviderUrls = config.excludeProviderUrls || [];\n }\n\n /**\n * Get the list of bootstrapped provider base URLs\n * @returns Array of provider base URLs\n */\n getBaseUrls(): string[] {\n return this.adapter.getBaseUrlsList();\n }\n\n static async init(\n adapter: DiscoveryAdapter,\n config: ModelManagerConfig = {},\n options: { torMode?: boolean; forceRefresh?: boolean } = {}\n ): Promise<ModelManager> {\n const manager = new ModelManager(adapter, config);\n const torMode = options.torMode ?? false;\n const forceRefresh = options.forceRefresh ?? false;\n const providers = await manager.bootstrapProviders(torMode, forceRefresh);\n await manager.fetchModels(providers, forceRefresh);\n return manager;\n }\n\n /**\n * Bootstrap provider list from the provider directory\n * First tries to fetch from Nostr (kind 30421), falls back to HTTP\n * @param torMode Whether running in Tor context\n * @param forceRefresh Ignore provider cache and refresh provider sources\n * @returns Array of provider base URLs\n * @throws ProviderBootstrapError if all providers fail to fetch\n */\n async bootstrapProviders(\n torMode: boolean = false,\n forceRefresh: boolean = false\n ): Promise<string[]> {\n // First try cache\n if (!forceRefresh) {\n const cachedUrls = this.adapter.getBaseUrlsList();\n if (cachedUrls.length > 0) {\n const lastUpdate = this.adapter.getBaseUrlsLastUpdate();\n const cacheValid =\n lastUpdate && Date.now() - lastUpdate <= this.cacheTTL;\n if (cacheValid) {\n await this.fetchRoutstr21Models(forceRefresh);\n return this.filterBaseUrlsForTor(cachedUrls, torMode);\n }\n }\n }\n\n // Try Nostr first (kind 38421)\n try {\n const nostrProviders = await this.bootstrapFromNostr(38421, torMode);\n if (nostrProviders.length > 0) {\n const filtered = this.filterBaseUrlsForTor(nostrProviders, torMode);\n this.adapter.setBaseUrlsList(filtered);\n this.adapter.setBaseUrlsLastUpdate(Date.now());\n await this.fetchRoutstr21Models(forceRefresh);\n return filtered;\n }\n } catch (e) {\n console.warn(\"Nostr bootstrap failed, falling back to HTTP:\", e);\n }\n\n // Fall back to HTTP\n return this.bootstrapFromHttp(torMode, forceRefresh);\n }\n\n /**\n * Bootstrap providers from Nostr network (kind 30421)\n * @param kind The Nostr kind to fetch\n * @param torMode Whether running in Tor context\n * @returns Array of provider base URLs\n */\n private async bootstrapFromNostr(\n kind: number,\n torMode: boolean\n ): Promise<string[]> {\n const DEFAULT_RELAYS = [\n \"wss://relay.primal.net\",\n \"wss://nos.lol\",\n \"wss://relay.routstr.com\",\n ];\n\n const pool = new RelayPool();\n const localEventStore = new EventStore();\n\n const timeoutMs = 5000;\n\n await new Promise<void>((resolve) => {\n pool\n .req(DEFAULT_RELAYS, {\n kinds: [kind],\n limit: 100,\n })\n .pipe(\n onlyEvents(),\n tap((event) => {\n localEventStore.add(event);\n })\n )\n .subscribe({\n complete: () => {\n resolve();\n },\n });\n\n setTimeout(() => {\n resolve();\n }, timeoutMs);\n });\n\n const timeline = localEventStore.getTimeline({ kinds: [kind] });\n\n const bases = new Set<string>();\n\n for (const event of timeline) {\n const eventUrls: string[] = [];\n\n for (const tag of event.tags) {\n if (tag[0] === \"u\" && typeof tag[1] === \"string\") {\n eventUrls.push(tag[1]);\n }\n }\n\n if (eventUrls.length > 0) {\n for (const url of eventUrls) {\n const normalized = this.normalizeUrl(url);\n if (!torMode || normalized.includes(\".onion\")) {\n bases.add(normalized);\n }\n }\n continue;\n }\n\n try {\n const content = JSON.parse(event.content);\n const providers = Array.isArray(content)\n ? content\n : content.providers || [];\n\n for (const p of providers) {\n const endpoints = this.getProviderEndpoints(p, torMode);\n for (const endpoint of endpoints) {\n bases.add(endpoint);\n }\n }\n } catch {\n try {\n const providers = JSON.parse(event.content);\n if (Array.isArray(providers)) {\n for (const p of providers) {\n const endpoints = this.getProviderEndpoints(p, torMode);\n for (const endpoint of endpoints) {\n bases.add(endpoint);\n }\n }\n }\n } catch {\n console.warn(\n \"[NostrBootstrap] Failed to parse Nostr event content:\",\n event.id\n );\n }\n }\n }\n\n // Add additional configured providers\n for (const url of this.includeProviderUrls) {\n const normalized = this.normalizeUrl(url);\n if (!torMode || normalized.includes(\".onion\")) {\n bases.add(normalized);\n }\n }\n\n const excluded = new Set(\n this.excludeProviderUrls.map((url) => this.normalizeUrl(url))\n );\n\n const result = Array.from(bases).filter((base) => !excluded.has(base));\n\n return result;\n }\n\n /**\n * Bootstrap providers from HTTP endpoint\n * @param torMode Whether running in Tor context\n * @param forceRefresh Ignore routstr21 cache and fetch fresh data\n * @returns Array of provider base URLs\n */\n private async bootstrapFromHttp(\n torMode: boolean,\n forceRefresh: boolean = false\n ): Promise<string[]> {\n try {\n const res = await fetch(this.providerDirectoryUrl);\n if (!res.ok) {\n throw new Error(`Failed to fetch providers: ${res.status}`);\n }\n\n const data = await res.json();\n const providers = Array.isArray(data?.providers) ? data.providers : [];\n\n const bases = new Set<string>();\n for (const p of providers) {\n const endpoints = this.getProviderEndpoints(p, torMode);\n for (const endpoint of endpoints) {\n bases.add(endpoint);\n }\n }\n\n for (const url of this.includeProviderUrls) {\n const normalized = this.normalizeUrl(url);\n if (!torMode || normalized.includes(\".onion\")) {\n bases.add(normalized);\n }\n }\n\n const excluded = new Set(\n this.excludeProviderUrls.map((url) => this.normalizeUrl(url))\n );\n\n const list = Array.from(bases).filter((base) => !excluded.has(base));\n\n if (list.length > 0) {\n this.adapter.setBaseUrlsList(list);\n this.adapter.setBaseUrlsLastUpdate(Date.now());\n await this.fetchRoutstr21Models(forceRefresh);\n }\n\n return list;\n } catch (e) {\n console.error(\"Failed to bootstrap providers\", e);\n throw new ProviderBootstrapError([], `Provider bootstrap failed: ${e}`);\n }\n }\n\n /**\n * Fetch models from all providers and select best-priced options\n * Uses cache if available and not expired\n * @param baseUrls List of provider base URLs to fetch from\n * @param forceRefresh Ignore cache and fetch fresh data\n * @param onProgress Callback fired after each provider completes with current combined models\n * @returns Array of unique models with best prices selected\n */\n async fetchModels(\n baseUrls: string[],\n forceRefresh: boolean = false,\n onProgress?: (models: Model[]) => void\n ): Promise<Model[]> {\n if (baseUrls.length === 0) {\n throw new NoProvidersAvailableError();\n }\n\n const bestById = new Map<string, { model: Model; base: string }>();\n const modelsFromAllProviders: Record<string, Model[]> = {};\n const disabledProviders = this.adapter.getDisabledProviders();\n\n // Helper to estimate minimum cost for a model\n const estimateMinCost = (m: Model): number => {\n return m?.sats_pricing?.completion ?? 0;\n };\n\n // Helper to emit current progress\n const emitProgress = () => {\n if (onProgress) {\n const currentModels = Array.from(bestById.values()).map((v) => v.model);\n onProgress(currentModels);\n }\n };\n\n // Fetch from all providers in parallel with progressive updates\n const fetchPromises = baseUrls.map(async (url) => {\n const base = url.endsWith(\"/\") ? url : `${url}/`;\n try {\n // Check cache if not forcing refresh\n let list: Model[];\n\n if (!forceRefresh) {\n const lastUpdate = this.adapter.getProviderLastUpdate(base);\n const cacheValid =\n lastUpdate && Date.now() - lastUpdate <= this.cacheTTL;\n\n if (cacheValid) {\n const cachedModels = this.adapter.getCachedModels();\n const cachedList = cachedModels[base] || [];\n list = cachedList;\n } else {\n // Cache expired or doesn't exist, fetch fresh\n list = await this.fetchModelsFromProvider(base);\n }\n } else {\n // Force refresh\n list = await this.fetchModelsFromProvider(base);\n }\n\n modelsFromAllProviders[base] = list;\n this.adapter.setProviderLastUpdate(base, Date.now());\n\n // Update best-priced models if provider not disabled\n if (!disabledProviders.includes(base)) {\n for (const m of list) {\n const existing = bestById.get(m.id);\n\n // Skip models without sats pricing\n if (!m.sats_pricing) continue;\n\n if (!existing) {\n bestById.set(m.id, { model: m, base });\n continue;\n }\n\n // Replace if this provider has lower cost\n const currentCost = estimateMinCost(m);\n const existingCost = estimateMinCost(existing.model);\n if (currentCost < existingCost && m.sats_pricing) {\n bestById.set(m.id, { model: m, base });\n }\n }\n }\n\n emitProgress();\n\n return { success: true, base, list };\n } catch (error) {\n if (this.isProviderDownError(error)) {\n console.warn(`Provider ${base} is down right now.`);\n } else {\n console.warn(`Failed to fetch models from ${base}:`, error);\n }\n this.adapter.setProviderLastUpdate(base, Date.now());\n return { success: false, base };\n }\n });\n\n await Promise.allSettled(fetchPromises);\n\n // Cache all provider results\n const existingCache = this.adapter.getCachedModels();\n this.adapter.setCachedModels({\n ...existingCache,\n ...modelsFromAllProviders,\n });\n\n // Return combined models array\n return Array.from(bestById.values()).map((v) => v.model);\n }\n\n /**\n * Fetch models from a single provider\n * @param baseUrl Provider base URL\n * @returns Array of models from provider\n */\n private async fetchModelsFromProvider(baseUrl: string): Promise<Model[]> {\n const res = await fetch(`${baseUrl}v1/models`);\n if (!res.ok) {\n throw new Error(`Failed to fetch models: ${res.status}`);\n }\n\n const json = await res.json();\n const list = Array.isArray(json?.data)\n ? json.data.map((m: Model) => ({\n ...m,\n id: m.id.split(\"/\").pop() || m.id,\n }))\n : [];\n\n return list;\n }\n\n private isProviderDownError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const msg = error.message.toLowerCase();\n if (msg.includes(\"fetch failed\")) return true;\n if (msg.includes(\"502\")) return true;\n if (msg.includes(\"503\")) return true;\n if (msg.includes(\"504\")) return true;\n const cause = error.cause as { code?: string } | undefined;\n return cause?.code === \"ENOTFOUND\";\n }\n\n /**\n * Get all cached models from all providers\n * @returns Record mapping baseUrl -> models\n */\n getAllCachedModels(): Record<string, Model[]> {\n return this.adapter.getCachedModels();\n }\n\n /**\n * Clear cache for a specific provider\n * @param baseUrl Provider base URL\n */\n clearProviderCache(baseUrl: string): void {\n const base = baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n const cached = this.adapter.getCachedModels();\n delete cached[base];\n this.adapter.setCachedModels(cached);\n this.adapter.setProviderLastUpdate(base, 0);\n }\n\n /**\n * Clear all model caches\n */\n clearAllCache(): void {\n this.adapter.setCachedModels({});\n }\n\n /**\n * Filter base URLs based on Tor context\n * @param baseUrls Provider URLs to filter\n * @param torMode Whether in Tor context\n * @returns Filtered URLs appropriate for Tor mode\n */\n filterBaseUrlsForTor(baseUrls: string[], torMode: boolean): string[] {\n if (!torMode) {\n // In normal mode, exclude onion URLs\n return baseUrls.filter((url) => !url.includes(\".onion\"));\n }\n // In Tor mode, only include onion URLs\n return baseUrls.filter((url) => url.includes(\".onion\"));\n }\n\n /**\n * Get provider endpoints from provider info\n * @param provider Provider object from directory\n * @param torMode Whether in Tor context\n * @returns Array of endpoint URLs\n */\n private getProviderEndpoints(provider: any, torMode: boolean): string[] {\n const endpoints: string[] = [];\n\n if (torMode && provider.onion_url) {\n endpoints.push(this.normalizeUrl(provider.onion_url));\n } else if (provider.endpoint_url) {\n endpoints.push(this.normalizeUrl(provider.endpoint_url));\n }\n\n return endpoints;\n }\n\n /**\n * Normalize provider URL with trailing slash\n * @param url URL to normalize\n * @returns Normalized URL\n */\n private normalizeUrl(url: string): string {\n if (!url.startsWith(\"http\")) {\n url = `https://${url}`;\n }\n return url.endsWith(\"/\") ? url : `${url}/`;\n }\n\n /**\n * Fetch routstr21 models from Nostr network (kind 38423)\n * Uses cache if available and not expired\n * @returns Array of model IDs or empty array if not found\n */\n async fetchRoutstr21Models(forceRefresh: boolean = false): Promise<string[]> {\n // Check cache first\n const cachedModels = this.adapter.getRoutstr21Models();\n if (!forceRefresh && cachedModels.length > 0) {\n const lastUpdate = this.adapter.getRoutstr21ModelsLastUpdate();\n const cacheValid = lastUpdate && Date.now() - lastUpdate <= this.cacheTTL;\n if (cacheValid) {\n return cachedModels;\n }\n }\n\n const DEFAULT_RELAYS = [\n \"wss://relay.primal.net\",\n \"wss://nos.lol\",\n \"wss://relay.routstr.com\",\n ];\n\n const pool = new RelayPool();\n const localEventStore = new EventStore();\n\n const timeoutMs = 5000;\n\n await new Promise<void>((resolve) => {\n pool\n .req(DEFAULT_RELAYS, {\n kinds: [38423],\n \"#d\": [\"routstr-21-models\"],\n limit: 1,\n authors: [\n \"4ad6fa2d16e2a9b576c863b4cf7404a70d4dc320c0c447d10ad6ff58993eacc8\",\n ],\n })\n .pipe(\n onlyEvents(),\n tap((event) => {\n localEventStore.add(event);\n })\n )\n .subscribe({\n complete: () => {\n resolve();\n },\n });\n\n setTimeout(() => {\n resolve();\n }, timeoutMs);\n });\n\n const timeline = localEventStore.getTimeline({ kinds: [38423] });\n\n if (timeline.length === 0) {\n return cachedModels.length > 0 ? cachedModels : [];\n }\n\n const event = timeline[0];\n\n try {\n const content = JSON.parse(event.content);\n const models = Array.isArray(content?.models) ? content.models : [];\n this.adapter.setRoutstr21Models(models);\n this.adapter.setRoutstr21ModelsLastUpdate(Date.now());\n return models;\n } catch {\n console.warn(\n \"[Routstr21Models] Failed to parse Nostr event content:\",\n event.id\n );\n return cachedModels.length > 0 ? cachedModels : [];\n }\n }\n}\n","/**\n * MintDiscovery class for discovering mints and provider info\n * Core responsibility: fetching mint information from providers and caching it\n */\n\nimport type { DiscoveryAdapter, ProviderInfo } from \"./interfaces\";\n\n/**\n * Configuration for MintDiscovery\n */\nexport interface MintDiscoveryConfig {\n /** Cache TTL in milliseconds (default: 21 minutes) */\n cacheTTL?: number;\n}\n\n/**\n * MintDiscovery handles mint and provider info discovery\n * Abstracts away storage details via DiscoveryAdapter\n */\nexport class MintDiscovery {\n private readonly cacheTTL: number;\n\n constructor(\n private adapter: DiscoveryAdapter,\n config: MintDiscoveryConfig = {}\n ) {\n this.cacheTTL = config.cacheTTL || 21 * 60 * 1000; // 21 minutes\n }\n\n /**\n * Fetch mints from all providers via their /v1/info endpoints\n * Caches mints and full provider info for later access\n * @param baseUrls List of provider base URLs to fetch from\n * @returns Object with mints and provider info from all providers\n */\n async discoverMints(\n baseUrls: string[],\n options: { forceRefresh?: boolean } = {}\n ): Promise<{\n mintsFromProviders: Record<string, string[]>;\n infoFromProviders: Record<string, ProviderInfo>;\n }> {\n if (baseUrls.length === 0) {\n return { mintsFromProviders: {}, infoFromProviders: {} };\n }\n\n const mintsFromAllProviders: Record<string, string[]> = {};\n const infoFromAllProviders: Record<string, ProviderInfo> = {};\n const forceRefresh = options.forceRefresh ?? false;\n\n // Fetch info from each provider\n const fetchPromises = baseUrls.map(async (url) => {\n const base = url.endsWith(\"/\") ? url : `${url}/`;\n try {\n if (!forceRefresh) {\n const lastUpdate = this.adapter.getProviderLastUpdate(base);\n const cacheValid =\n lastUpdate && Date.now() - lastUpdate <= this.cacheTTL;\n if (cacheValid) {\n const cachedMints = this.adapter.getCachedMints()[base] || [];\n const cachedInfo = this.adapter.getCachedProviderInfo()[base];\n mintsFromAllProviders[base] = cachedMints;\n if (cachedInfo) {\n infoFromAllProviders[base] = cachedInfo;\n }\n return {\n success: true,\n base,\n mints: cachedMints,\n info: cachedInfo,\n };\n }\n }\n\n const res = await fetch(`${base}v1/info`);\n if (!res.ok) {\n throw new Error(`Failed to fetch info: ${res.status}`);\n }\n\n const json = await res.json();\n\n // Extract mints array from response\n const mints: string[] = Array.isArray(json?.mints) ? json.mints : [];\n\n // Normalize mint URLs (remove trailing slashes for consistency)\n const normalizedMints = mints.map((mint) =>\n mint.endsWith(\"/\") ? mint.slice(0, -1) : mint\n );\n\n // Save provider mints and full info\n mintsFromAllProviders[base] = normalizedMints;\n infoFromAllProviders[base] = json;\n this.adapter.setProviderLastUpdate(base, Date.now());\n\n return { success: true, base, mints: normalizedMints, info: json };\n } catch (error) {\n this.adapter.setProviderLastUpdate(base, Date.now());\n if (this.isProviderDownError(error)) {\n console.warn(`Provider ${base} is down right now.`);\n } else {\n console.warn(`Failed to fetch mints from ${base}:`, error);\n }\n return { success: false, base, mints: [], info: null };\n }\n });\n\n // Wait for all to complete (but allow individual failures)\n const results = await Promise.allSettled(fetchPromises);\n\n // Handle results\n for (const result of results) {\n if (result.status === \"fulfilled\") {\n const { base, mints, info } = result.value;\n mintsFromAllProviders[base] = mints;\n if (info) {\n infoFromAllProviders[base] = info;\n }\n } else {\n // Log but don't throw - continue with partial results\n console.error(\"Mint discovery error:\", result.reason);\n }\n }\n\n // Cache all results\n try {\n this.adapter.setCachedMints(mintsFromAllProviders);\n this.adapter.setCachedProviderInfo(infoFromAllProviders);\n } catch (error) {\n console.error(\"Error caching mint discovery results:\", error);\n }\n\n return {\n mintsFromProviders: mintsFromAllProviders,\n infoFromProviders: infoFromAllProviders,\n };\n }\n\n /**\n * Get cached mints from all providers\n * @returns Record mapping baseUrl -> mint URLs\n */\n getCachedMints(): Record<string, string[]> {\n return this.adapter.getCachedMints();\n }\n\n /**\n * Get cached provider info from all providers\n * @returns Record mapping baseUrl -> provider info\n */\n getCachedProviderInfo(): Record<string, ProviderInfo> {\n return this.adapter.getCachedProviderInfo();\n }\n\n /**\n * Get mints for a specific provider\n * @param baseUrl Provider base URL\n * @returns Array of mint URLs for the provider\n */\n getProviderMints(baseUrl: string): string[] {\n const normalized = baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n const allMints = this.getCachedMints();\n return allMints[normalized] || [];\n }\n\n /**\n * Get info for a specific provider\n * @param baseUrl Provider base URL\n * @returns Provider info object or null if not found\n */\n getProviderInfo(baseUrl: string): ProviderInfo | null {\n const normalized = baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n const allInfo = this.getCachedProviderInfo();\n return allInfo[normalized] || null;\n }\n\n /**\n * Clear mint cache for a specific provider\n * @param baseUrl Provider base URL\n */\n clearProviderMintCache(baseUrl: string): void {\n const normalized = baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n\n const mints = this.getCachedMints();\n delete mints[normalized];\n this.adapter.setCachedMints(mints);\n\n const info = this.getCachedProviderInfo();\n delete info[normalized];\n this.adapter.setCachedProviderInfo(info);\n }\n\n /**\n * Clear all mint caches\n */\n clearAllCache(): void {\n this.adapter.setCachedMints({});\n this.adapter.setCachedProviderInfo({});\n }\n\n private isProviderDownError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const msg = error.message.toLowerCase();\n if (msg.includes(\"fetch failed\")) return true;\n if (msg.includes(\"502\")) return true;\n if (msg.includes(\"503\")) return true;\n if (msg.includes(\"504\")) return true;\n const cause = error.cause as { code?: string } | undefined;\n if (cause?.code === \"ENOTFOUND\") return true;\n return false;\n }\n}\n","/**\n * AuditLogger - Transaction audit logging utility\n * Writes JSON-formatted transaction logs to audit.log\n */\n\nexport interface AuditLogEntry {\n timestamp: string;\n action: \"spend\" | \"topup\" | \"refund\" | \"receive\" | \"balance_check\";\n totalBalance: number;\n providerBalances: Record<string, number>;\n mintBalances: Record<string, number>;\n amount?: number;\n mintUrl?: string;\n baseUrl?: string;\n status: \"success\" | \"failed\";\n details?: string;\n}\n\nexport class AuditLogger {\n private static instance: AuditLogger | null = null;\n\n static getInstance(): AuditLogger {\n if (!AuditLogger.instance) {\n AuditLogger.instance = new AuditLogger();\n }\n return AuditLogger.instance;\n }\n\n async log(entry: Omit<AuditLogEntry, \"timestamp\">): Promise<void> {\n const fullEntry: AuditLogEntry = {\n ...entry,\n timestamp: new Date().toISOString(),\n };\n\n const logLine = JSON.stringify(fullEntry) + \"\\n\";\n\n if (typeof window === \"undefined\") {\n try {\n const fs = await import(\"fs\");\n const path = await import(\"path\");\n const logPath = path.join(process.cwd(), \"audit.log\");\n fs.appendFileSync(logPath, logLine);\n } catch (error) {\n console.error(\"[AuditLogger] Failed to write to file:\", error);\n }\n } else {\n console.log(\"[AUDIT]\", logLine.trim());\n }\n }\n\n async logBalanceSnapshot(\n action: AuditLogEntry[\"action\"],\n amounts: {\n totalBalance: number;\n providerBalances: Record<string, number>;\n mintBalances: Record<string, number>;\n },\n options?: {\n amount?: number;\n mintUrl?: string;\n baseUrl?: string;\n status?: \"success\" | \"failed\";\n details?: string;\n }\n ): Promise<void> {\n await this.log({\n action,\n totalBalance: amounts.totalBalance,\n providerBalances: amounts.providerBalances,\n mintBalances: amounts.mintBalances,\n amount: options?.amount,\n mintUrl: options?.mintUrl,\n baseUrl: options?.baseUrl,\n status: options?.status ?? \"success\",\n details: options?.details,\n });\n }\n}\n\nexport const auditLogger = AuditLogger.getInstance();\n","import type { MintSelection } from \"../core/types\";\n\nexport function isNetworkErrorMessage(message: string): boolean {\n return (\n message.includes(\"NetworkError when attempting to fetch resource\") ||\n message.includes(\"Failed to fetch\") ||\n message.includes(\"Load failed\")\n );\n}\n\nexport function getBalanceInSats(\n balance: number,\n unit: \"sat\" | \"msat\" | string | undefined\n): number {\n return unit === \"msat\" ? balance / 1000 : balance;\n}\n\nexport function getTotalMintBalanceInSats(\n balances: Record<string, number>,\n units: Record<string, \"sat\" | \"msat\">\n): number {\n let total = 0;\n for (const mintUrl in balances) {\n total += getBalanceInSats(balances[mintUrl], units[mintUrl]);\n }\n return total;\n}\n\nexport function selectMintWithBalance(\n balances: Record<string, number>,\n units: Record<string, string>,\n amount: number,\n excludeMints: string[] = []\n): MintSelection {\n for (const mintUrl in balances) {\n if (excludeMints.includes(mintUrl)) {\n continue;\n }\n\n const balanceInSats = getBalanceInSats(balances[mintUrl], units[mintUrl]);\n if (balanceInSats >= amount) {\n return { selectedMintUrl: mintUrl, selectedMintBalance: balanceInSats };\n }\n }\n\n return { selectedMintUrl: null, selectedMintBalance: 0 };\n}\n","/**\n * CashuSpender - Core spending logic for Cashu tokens\n *\n * Handles:\n * - Mint selection with sufficient balance\n * - Provider mint compatibility checks\n * - Retry logic with alternate mints\n * - Critical section management (busy state)\n *\n * Extracted from hooks/useCashuWithXYZ.ts\n */\n\nimport type { WalletAdapter, StorageAdapter } from \"./interfaces\";\nimport type { SpendResult } from \"../core/types\";\nimport { InsufficientBalanceError } from \"../core/errors\";\nimport { BalanceManager } from \"./BalanceManager\";\nimport { auditLogger } from \"./AuditLogger\";\nimport { getBalanceInSats, isNetworkErrorMessage } from \"./tokenUtils\";\n\n/**\n * Options for spending cashu tokens\n */\nexport interface SpendOptions {\n /** The mint URL to send from (can be overridden if insufficient balance) */\n mintUrl: string;\n\n /** The amount to spend in sats */\n amount: number;\n\n /** The provider base URL (for token storage and provider mint checks) */\n baseUrl: string;\n\n /** Whether to reuse an existing token if available */\n reuseToken?: boolean;\n\n /** Optional P2PK public key */\n p2pkPubkey?: string;\n\n /** Array of mint URLs to exclude (for retry logic) */\n excludeMints?: string[];\n\n /** Current retry count (for internal recursion) */\n retryCount?: number;\n\n /** Specific provider baseUrls to refund (if not provided, refunds all except current) */\n refundBaseUrls?: string[];\n}\n\ntype DebugLevel = \"DEBUG\" | \"WARN\" | \"ERROR\";\n\n/**\n * CashuSpender manages the spending of Cashu tokens\n */\nexport class CashuSpender {\n private _isBusy = false;\n private debugLevel: DebugLevel = \"WARN\";\n\n constructor(\n private walletAdapter: WalletAdapter,\n private storageAdapter: StorageAdapter,\n private _providerRegistry?: unknown,\n private balanceManager?: BalanceManager\n ) {}\n\n async receiveToken(token: string): Promise<{\n success: boolean;\n amount: number;\n unit: \"sat\" | \"msat\";\n message?: string;\n }> {\n const result = await this.walletAdapter.receiveToken(token);\n\n if (!result.success && result.message?.includes(\"Failed to fetch mint\")) {\n const cachedTokens = this.storageAdapter.getCachedReceiveTokens();\n const existingIndex = cachedTokens.findIndex((t) => t.token === token);\n if (existingIndex === -1) {\n this.storageAdapter.setCachedReceiveTokens([\n ...cachedTokens,\n {\n token,\n amount: result.amount,\n unit: result.unit,\n createdAt: Date.now(),\n },\n ]);\n }\n }\n\n return result;\n }\n\n private async _getBalanceState(): Promise<{\n totalBalance: number;\n providerBalances: Record<string, number>;\n mintBalances: Record<string, number>;\n }> {\n if (this.balanceManager) {\n return this.balanceManager.getBalanceState();\n }\n\n const mintBalances = await this.walletAdapter.getBalances();\n const units = this.walletAdapter.getMintUnits();\n\n let totalMintBalance = 0;\n const normalizedMintBalances: Record<string, number> = {};\n for (const url in mintBalances) {\n const balance = mintBalances[url];\n const unit = units[url];\n const balanceInSats = getBalanceInSats(balance, unit);\n normalizedMintBalances[url] = balanceInSats;\n totalMintBalance += balanceInSats;\n }\n\n const pendingDistribution =\n this.storageAdapter.getCachedTokenDistribution();\n const providerBalances: Record<string, number> = {};\n let totalProviderBalance = 0;\n for (const pending of pendingDistribution) {\n providerBalances[pending.baseUrl] =\n (providerBalances[pending.baseUrl] || 0) + pending.amount;\n totalProviderBalance += pending.amount;\n }\n\n const apiKeys = this.storageAdapter.getAllApiKeys();\n for (const apiKey of apiKeys) {\n if (!providerBalances[apiKey.baseUrl]) {\n providerBalances[apiKey.baseUrl] = 0;\n }\n providerBalances[apiKey.baseUrl] += apiKey.balance;\n totalProviderBalance += apiKey.balance;\n }\n\n return {\n totalBalance: totalMintBalance + totalProviderBalance,\n providerBalances,\n mintBalances: normalizedMintBalances,\n };\n }\n\n private async _logTransaction(\n action: \"spend\" | \"topup\" | \"refund\" | \"receive\" | \"balance_check\",\n options?: {\n amount?: number;\n mintUrl?: string;\n baseUrl?: string;\n status?: \"success\" | \"failed\";\n details?: string;\n }\n ): Promise<void> {\n const balanceState = await this._getBalanceState();\n await auditLogger.logBalanceSnapshot(action, balanceState, options);\n }\n\n /**\n * Check if the spender is currently in a critical operation\n */\n get isBusy(): boolean {\n return this._isBusy;\n }\n\n getDebugLevel(): DebugLevel {\n return this.debugLevel;\n }\n\n setDebugLevel(level: DebugLevel): void {\n this.debugLevel = level;\n }\n\n private _log(level: \"DEBUG\" | \"WARN\" | \"ERROR\", ...args: unknown[]): void {\n const levelPriority: Record<DebugLevel, number> = {\n DEBUG: 0,\n WARN: 1,\n ERROR: 2,\n };\n\n if (levelPriority[level] >= levelPriority[this.debugLevel]) {\n switch (level) {\n case \"DEBUG\":\n console.log(...args);\n break;\n case \"WARN\":\n console.warn(...args);\n break;\n case \"ERROR\":\n console.error(...args);\n break;\n }\n }\n }\n\n /**\n * Spend Cashu tokens with automatic mint selection and retry logic\n * Throws errors on failure instead of returning failed SpendResult\n */\n async spend(options: SpendOptions): Promise<SpendResult> {\n const {\n mintUrl,\n amount,\n baseUrl,\n reuseToken = false,\n p2pkPubkey,\n excludeMints = [],\n retryCount = 0,\n } = options;\n\n this._isBusy = true;\n\n try {\n const result = await this._spendInternal({\n mintUrl,\n amount,\n baseUrl,\n reuseToken,\n p2pkPubkey,\n excludeMints,\n retryCount,\n });\n\n if (result.status === \"failed\" || !result.token) {\n const errorMsg =\n result.error || `Insufficient balance. Need ${amount} sats.`;\n\n if (this._isNetworkError(errorMsg)) {\n throw new Error(\n `Your mint ${mintUrl} is unreachable or is blocking your IP. Please try again later or switch mints.`\n );\n }\n\n if (result.errorDetails) {\n throw new InsufficientBalanceError(\n result.errorDetails.required,\n result.errorDetails.available,\n result.errorDetails.maxMintBalance,\n result.errorDetails.maxMintUrl\n );\n }\n\n throw new Error(errorMsg);\n }\n\n return result;\n } finally {\n this._isBusy = false;\n }\n }\n\n /**\n * Check if error message indicates a network error\n */\n private _isNetworkError(message: string): boolean {\n return (\n isNetworkErrorMessage(message) ||\n (message.includes(\"Your mint\") && message.includes(\"unreachable\"))\n );\n }\n\n /**\n * Internal spending logic\n */\n private async _spendInternal(options: SpendOptions): Promise<SpendResult> {\n let {\n mintUrl,\n amount,\n baseUrl,\n reuseToken,\n p2pkPubkey,\n excludeMints,\n retryCount,\n } = options;\n\n this._log(\n \"DEBUG\",\n `[CashuSpender] _spendInternal: amount=${amount}, mintUrl=${mintUrl}, baseUrl=${baseUrl}, reuseToken=${reuseToken}`\n );\n\n // Validate amount\n let adjustedAmount = Math.ceil(amount);\n if (!adjustedAmount || isNaN(adjustedAmount)) {\n this._log(\n \"ERROR\",\n `[CashuSpender] _spendInternal: Invalid amount: ${amount}`\n );\n return {\n token: null,\n status: \"failed\",\n balance: 0,\n error: \"Please enter a valid amount\",\n };\n }\n\n // Try to get existing token for reuse\n if (reuseToken && baseUrl) {\n this._log(\n \"DEBUG\",\n `[CashuSpender] _spendInternal: Attempting to reuse token for ${baseUrl}`\n );\n const existingResult = await this._tryReuseToken(\n baseUrl,\n adjustedAmount,\n mintUrl\n );\n if (existingResult) {\n this._log(\n \"DEBUG\",\n `[CashuSpender] _spendInternal: Successfully reused token, balance: ${existingResult.balance}`\n );\n return existingResult;\n }\n this._log(\n \"DEBUG\",\n `[CashuSpender] _spendInternal: Could not reuse token, will create new token`\n );\n }\n\n // Get current balance state\n const balanceState = await this._getBalanceState();\n const totalAvailableBalance = balanceState.totalBalance;\n\n this._log(\n \"DEBUG\",\n `[CashuSpender] _spendInternal: totalAvailableBalance=${totalAvailableBalance}, adjustedAmount=${adjustedAmount}`\n );\n\n // Check total balance\n if (totalAvailableBalance < adjustedAmount) {\n this._log(\n \"ERROR\",\n `[CashuSpender] _spendInternal: Insufficient balance, have=${totalAvailableBalance}, need=${adjustedAmount}`\n );\n return this._createInsufficientBalanceError(\n adjustedAmount,\n balanceState.mintBalances,\n totalAvailableBalance\n );\n }\n\n let token: string | null = null;\n let selectedMintUrl: string | undefined;\n let spentAmount = adjustedAmount;\n\n if (this.balanceManager) {\n const tokenResult = await this.balanceManager.createProviderToken({\n mintUrl,\n baseUrl,\n amount: adjustedAmount,\n p2pkPubkey,\n excludeMints,\n retryCount,\n });\n\n if (!tokenResult.success || !tokenResult.token) {\n if ((tokenResult.error || \"\").includes(\"Insufficient balance\")) {\n return this._createInsufficientBalanceError(\n adjustedAmount,\n balanceState.mintBalances,\n totalAvailableBalance\n );\n }\n\n return {\n token: null,\n status: \"failed\",\n balance: 0,\n error: tokenResult.error || \"Failed to create token\",\n };\n }\n\n token = tokenResult.token;\n selectedMintUrl = tokenResult.selectedMintUrl;\n spentAmount = tokenResult.amountSpent || adjustedAmount;\n } else {\n try {\n token = await this.walletAdapter.sendToken(\n mintUrl,\n adjustedAmount,\n p2pkPubkey\n );\n selectedMintUrl = mintUrl;\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n return {\n token: null,\n status: \"failed\",\n balance: 0,\n error: `Error generating token: ${errorMsg}`,\n };\n }\n }\n\n // Store token and return\n if (token && baseUrl) {\n this.storageAdapter.setToken(baseUrl, token);\n }\n\n this._logTransaction(\"spend\", {\n amount: spentAmount,\n mintUrl: selectedMintUrl || mintUrl,\n baseUrl,\n status: \"success\",\n });\n\n this._log(\n \"DEBUG\",\n `[CashuSpender] _spendInternal: Successfully spent ${spentAmount}, returning token with balance=${spentAmount}`\n );\n\n const units = this.walletAdapter.getMintUnits();\n\n return {\n token,\n status: \"success\",\n balance: spentAmount,\n unit:\n (selectedMintUrl ? units[selectedMintUrl] : units[mintUrl]) || \"sat\",\n };\n }\n\n /**\n * Try to reuse an existing token\n */\n private async _tryReuseToken(\n baseUrl: string,\n amount: number,\n mintUrl: string\n ): Promise<SpendResult | null> {\n const storedToken = this.storageAdapter.getToken(baseUrl);\n if (!storedToken) return null;\n\n // Get pending distribution to check balance\n const pendingDistribution =\n this.storageAdapter.getCachedTokenDistribution();\n const balanceForBaseUrl =\n pendingDistribution.find((b) => b.baseUrl === baseUrl)?.amount || 0;\n\n this._log(\"DEBUG\", \"RESUINGDSR GSODGNSD\", balanceForBaseUrl, amount);\n\n if (balanceForBaseUrl > amount) {\n const units = this.walletAdapter.getMintUnits();\n const unit = units[mintUrl] || \"sat\";\n return {\n token: storedToken,\n status: \"success\",\n balance: balanceForBaseUrl,\n unit,\n };\n }\n\n // Token exists but insufficient balance - attempt topup\n if (this.balanceManager) {\n const topUpAmount = Math.ceil(amount * 1.2 - balanceForBaseUrl);\n const topUpResult = await this.balanceManager.topUp({\n mintUrl,\n baseUrl,\n amount: topUpAmount,\n });\n this._log(\"DEBUG\", \"TOPUP \", topUpResult);\n\n if (topUpResult.success && topUpResult.toppedUpAmount) {\n const newBalance = balanceForBaseUrl + topUpResult.toppedUpAmount;\n const units = this.walletAdapter.getMintUnits();\n const unit = units[mintUrl] || \"sat\";\n\n this._logTransaction(\"topup\", {\n amount: topUpResult.toppedUpAmount,\n mintUrl,\n baseUrl,\n status: \"success\",\n });\n\n return {\n token: storedToken,\n status: \"success\",\n balance: newBalance,\n unit,\n };\n }\n\n const providerBalance = await this._getProviderTokenBalance(\n baseUrl,\n storedToken\n );\n this._log(\"DEBUG\", providerBalance);\n if (providerBalance <= 0) {\n this.storageAdapter.removeToken(baseUrl);\n }\n }\n\n return null;\n }\n\n /**\n * Refund specific providers without retrying spend\n */\n async refundProviders(\n baseUrls: string[],\n mintUrl: string,\n refundApiKeys: boolean = false\n ): Promise<{ baseUrl: string; success: boolean }[]> {\n const results: { baseUrl: string; success: boolean }[] = [];\n\n const pendingDistribution =\n this.storageAdapter.getCachedTokenDistribution();\n\n const toRefund = pendingDistribution.filter((p) =>\n baseUrls.includes(p.baseUrl)\n );\n\n const refundResults = await Promise.allSettled(\n toRefund.map(async (pending) => {\n const token = this.storageAdapter.getToken(pending.baseUrl);\n this._log(\"DEBUG\", token, this.balanceManager);\n if (!token || !this.balanceManager) {\n return { baseUrl: pending.baseUrl, success: false };\n }\n\n const tokenBalance = await this.balanceManager.getTokenBalance(\n token,\n pending.baseUrl\n );\n\n if (tokenBalance.reserved > 0) {\n return { baseUrl: pending.baseUrl, success: false };\n }\n\n const result = await this.balanceManager.refund({\n mintUrl,\n baseUrl: pending.baseUrl,\n token,\n });\n this._log(\"DEBUG\", result);\n\n if (result.success) {\n this.storageAdapter.removeToken(pending.baseUrl);\n }\n\n return { baseUrl: pending.baseUrl, success: result.success };\n })\n );\n\n results.push(\n ...refundResults.map((r) =>\n r.status === \"fulfilled\" ? r.value : { baseUrl: \"\", success: false }\n )\n );\n\n if (refundApiKeys) {\n const apiKeyDistribution = this.storageAdapter.getApiKeyDistribution();\n const apiKeysToRefund = apiKeyDistribution.filter((p) =>\n baseUrls.includes(p.baseUrl)\n );\n\n for (const apiKeyEntry of apiKeysToRefund) {\n const apiKeyEntryFull = this.storageAdapter.getApiKey(\n apiKeyEntry.baseUrl\n );\n if (apiKeyEntryFull && this.balanceManager) {\n const refundResult = await this.balanceManager.refundApiKey({\n mintUrl,\n baseUrl: apiKeyEntry.baseUrl,\n apiKey: apiKeyEntryFull.key,\n });\n\n if (refundResult.success) {\n this.storageAdapter.updateApiKeyBalance(apiKeyEntry.baseUrl, 0);\n }\n\n results.push({\n baseUrl: apiKeyEntry.baseUrl,\n success: refundResult.success,\n });\n } else {\n results.push({\n baseUrl: apiKeyEntry.baseUrl,\n success: false,\n });\n }\n }\n }\n\n return results;\n }\n\n /**\n * Create an insufficient balance error result\n */\n private _createInsufficientBalanceError(\n required: number,\n normalizedBalances: Record<string, number>,\n availableBalance?: number\n ): SpendResult {\n let maxBalance = 0;\n let maxMintUrl = \"\";\n\n for (const mintUrl in normalizedBalances) {\n const balanceInSats = normalizedBalances[mintUrl];\n\n if (balanceInSats > maxBalance) {\n maxBalance = balanceInSats;\n maxMintUrl = mintUrl;\n }\n }\n\n const error = new InsufficientBalanceError(\n required,\n availableBalance ?? maxBalance,\n maxBalance,\n maxMintUrl\n );\n\n return {\n token: null,\n status: \"failed\",\n balance: 0,\n error: error.message,\n errorDetails: {\n required,\n available: availableBalance ?? maxBalance,\n maxMintBalance: maxBalance,\n maxMintUrl,\n },\n };\n }\n\n private async _getProviderTokenBalance(\n baseUrl: string,\n token: string\n ): Promise<number> {\n try {\n const response = await fetch(`${baseUrl}v1/wallet/info`, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (response.ok) {\n const data = await response.json();\n return data.balance / 1000;\n }\n } catch {\n return 0;\n }\n return 0;\n }\n}\n","/**\n * BalanceManager - Handles refunding and topping up tokens from providers\n *\n * Handles:\n * - Fetching refund tokens from provider API\n * - Receiving/storing refunded tokens\n * - Topping up API key balances with cashu tokens\n * - Error handling for various refund/topup failure modes\n *\n * Extracted from utils/cashuUtils.ts\n */\n\nimport type {\n WalletAdapter,\n StorageAdapter,\n ProviderRegistry,\n} from \"./interfaces\";\nimport type { RefundResult, TopUpResult } from \"../core/types\";\nimport { InsufficientBalanceError } from \"../core/errors\";\nimport { CashuSpender } from \"./CashuSpender\";\nimport {\n getBalanceInSats,\n isNetworkErrorMessage,\n selectMintWithBalance,\n} from \"./tokenUtils\";\n\n/**\n * Options for refunding tokens\n */\nexport interface RefundOptions {\n /** The mint URL (for NIP-60 wallet operations) */\n mintUrl: string;\n\n /** The provider base URL */\n baseUrl: string;\n\n /** Optional specific token to refund (if not provided, uses stored token) */\n token?: string;\n}\n\n/**\n * Options for refunding API key balance\n */\nexport interface RefundApiKeyOptions {\n /** The mint URL (for NIP-60 wallet operations) */\n mintUrl: string;\n\n /** The provider base URL */\n baseUrl: string;\n\n /** The API key to use for authentication */\n apiKey: string;\n}\n\n/**\n * Options for topping up API key balance\n */\nexport interface TopUpOptions {\n /** The mint URL to spend from */\n mintUrl: string;\n\n /** The provider base URL */\n baseUrl: string;\n\n /** Amount to top up in sats */\n amount: number;\n\n /** Optional specific API key to top up (if not provided, uses stored token) */\n token?: string;\n}\n\nexport interface CreateProviderTokenOptions {\n mintUrl: string;\n baseUrl: string;\n amount: number;\n p2pkPubkey?: string;\n excludeMints?: string[];\n retryCount?: number;\n}\n\nexport interface ProviderTokenResult {\n success: boolean;\n token?: string;\n error?: string;\n selectedMintUrl?: string;\n amountSpent?: number;\n}\n\nexport interface BalanceState {\n totalBalance: number;\n providerBalances: Record<string, number>;\n mintBalances: Record<string, number>;\n}\n\n/**\n * BalanceManager handles token refunds and topups from providers\n */\nexport class BalanceManager {\n private cashuSpender: CashuSpender;\n\n constructor(\n private walletAdapter: WalletAdapter,\n private storageAdapter: StorageAdapter,\n private providerRegistry?: ProviderRegistry,\n cashuSpender?: CashuSpender\n ) {\n if (cashuSpender) {\n this.cashuSpender = cashuSpender;\n } else {\n this.cashuSpender = new CashuSpender(\n walletAdapter,\n storageAdapter,\n providerRegistry,\n this\n );\n }\n }\n\n async getBalanceState(): Promise<BalanceState> {\n const mintBalances = await this.walletAdapter.getBalances();\n const units = this.walletAdapter.getMintUnits();\n\n let totalMintBalance = 0;\n const normalizedMintBalances: Record<string, number> = {};\n for (const url in mintBalances) {\n const balance = mintBalances[url];\n const unit = units[url];\n const balanceInSats = getBalanceInSats(balance, unit);\n normalizedMintBalances[url] = balanceInSats;\n totalMintBalance += balanceInSats;\n }\n\n const pendingDistribution =\n this.storageAdapter.getCachedTokenDistribution();\n const providerBalances: Record<string, number> = {};\n let totalProviderBalance = 0;\n for (const pending of pendingDistribution) {\n providerBalances[pending.baseUrl] =\n (providerBalances[pending.baseUrl] || 0) + pending.amount;\n totalProviderBalance += pending.amount;\n }\n\n const apiKeys = this.storageAdapter.getAllApiKeys();\n for (const apiKey of apiKeys) {\n if (!providerBalances[apiKey.baseUrl]) {\n providerBalances[apiKey.baseUrl] = 0;\n }\n providerBalances[apiKey.baseUrl] += apiKey.balance;\n totalProviderBalance += apiKey.balance;\n }\n\n return {\n totalBalance: totalMintBalance + totalProviderBalance,\n providerBalances,\n mintBalances: normalizedMintBalances,\n };\n }\n\n /**\n * Unified refund - handles both NIP-60 and legacy wallet refunds\n */\n async refund(options: RefundOptions): Promise<RefundResult> {\n const { mintUrl, baseUrl, token: providedToken } = options;\n\n const storedToken = providedToken || this.storageAdapter.getToken(baseUrl);\n\n if (!storedToken) {\n console.log(\"[BalanceManager] No token to refund, returning early\");\n return { success: true, message: \"No API key to refund\" };\n }\n\n let fetchResult:\n | { success: boolean; token?: string; requestId?: string; error?: string }\n | undefined;\n\n try {\n // Fetch refund token from provider\n fetchResult = await this._fetchRefundToken(baseUrl, storedToken);\n\n if (!fetchResult.success) {\n return {\n success: false,\n message: fetchResult.error || \"Refund failed\",\n requestId: fetchResult.requestId,\n };\n }\n\n if (!fetchResult.token) {\n return {\n success: false,\n message: \"No token received from refund\",\n requestId: fetchResult.requestId,\n };\n }\n\n // Check if this is a \"no balance to refund\" case\n if (fetchResult.error === \"No balance to refund\") {\n console.log(\n \"[BalanceManager] No balance to refund, removing stored token\"\n );\n this.storageAdapter.removeToken(baseUrl);\n return { success: true, message: \"No balance to refund\" };\n }\n\n // Receive the refunded token\n const receiveResult = await this.cashuSpender.receiveToken(\n fetchResult.token\n );\n const totalAmountMsat =\n receiveResult.unit === \"msat\"\n ? receiveResult.amount\n : receiveResult.amount * 1000;\n\n // Remove the stored token if we used it from storage\n if (!providedToken) {\n this.storageAdapter.removeToken(baseUrl);\n }\n\n return {\n success: receiveResult.success,\n refundedAmount: totalAmountMsat,\n requestId: fetchResult.requestId,\n };\n } catch (error) {\n console.error(\"[BalanceManager] Refund error\", error);\n return this._handleRefundError(error, mintUrl, fetchResult?.requestId);\n }\n }\n\n /**\n * Refund API key balance - convert remaining API key balance to cashu token\n */\n async refundApiKey(options: RefundApiKeyOptions): Promise<RefundResult> {\n const { mintUrl, baseUrl, apiKey } = options;\n\n if (!apiKey) {\n return { success: false, message: \"No API key to refund\" };\n }\n\n let fetchResult:\n | { success: boolean; token?: string; requestId?: string; error?: string }\n | undefined;\n\n try {\n fetchResult = await this._fetchRefundTokenWithApiKey(baseUrl, apiKey);\n\n if (!fetchResult.success) {\n return {\n success: false,\n message: fetchResult.error || \"API key refund failed\",\n requestId: fetchResult.requestId,\n };\n }\n\n if (!fetchResult.token) {\n return {\n success: false,\n message: \"No token received from API key refund\",\n requestId: fetchResult.requestId,\n };\n }\n\n if (fetchResult.error === \"No balance to refund\") {\n return { success: false, message: \"No balance to refund\" };\n }\n\n const receiveResult = await this.cashuSpender.receiveToken(\n fetchResult.token\n );\n const totalAmountMsat =\n receiveResult.unit === \"msat\"\n ? receiveResult.amount\n : receiveResult.amount * 1000;\n\n if (receiveResult.success) {\n this.storageAdapter.removeApiKey(baseUrl); // TODO: remove this after all nodes upgrade to 0.4.0\n }\n\n return {\n success: receiveResult.success,\n refundedAmount: totalAmountMsat,\n requestId: fetchResult.requestId,\n };\n } catch (error) {\n console.error(\"[BalanceManager] API key refund error\", error);\n return this._handleRefundError(error, mintUrl, fetchResult?.requestId);\n }\n }\n\n /**\n * Fetch refund token from provider API using API key authentication\n */\n private async _fetchRefundTokenWithApiKey(\n baseUrl: string,\n apiKey: string\n ): Promise<{\n success: boolean;\n token?: string;\n requestId?: string;\n error?: string;\n }> {\n if (!baseUrl) {\n return {\n success: false,\n error: \"No base URL configured\",\n };\n }\n\n const normalizedBaseUrl = baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n const url = `${normalizedBaseUrl}v1/wallet/refund`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n controller.abort();\n }, 60000);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const requestId =\n response.headers.get(\"x-routstr-request-id\") || undefined;\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n requestId,\n error: `API key refund failed: ${\n errorData?.detail || response.statusText\n }`,\n };\n }\n\n const data = await response.json();\n return {\n success: true,\n token: data.token,\n requestId,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n console.error(\n \"[BalanceManager._fetchRefundTokenWithApiKey] Fetch error\",\n error\n );\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n return {\n success: false,\n error: \"Request timed out after 1 minute\",\n };\n }\n return {\n success: false,\n error: error.message,\n };\n }\n\n return {\n success: false,\n error: \"Unknown error occurred during API key refund request\",\n };\n }\n }\n\n /**\n * Top up API key balance with a cashu token\n */\n async topUp(options: TopUpOptions): Promise<TopUpResult> {\n const { mintUrl, baseUrl, amount, token: providedToken } = options;\n\n if (!amount || amount <= 0) {\n return { success: false, message: \"Invalid top up amount\" };\n }\n\n const storedToken = providedToken || this.storageAdapter.getToken(baseUrl);\n if (!storedToken) {\n return { success: false, message: \"No API key available for top up\" };\n }\n\n let cashuToken: string | null = null;\n let requestId: string | undefined;\n\n try {\n const tokenResult = await this.createProviderToken({\n mintUrl,\n baseUrl,\n amount,\n });\n\n if (!tokenResult.success || !tokenResult.token) {\n return {\n success: false,\n message: tokenResult.error || \"Unable to create top up token\",\n };\n }\n\n cashuToken = tokenResult.token;\n\n const topUpResult = await this._postTopUp(\n baseUrl,\n storedToken,\n cashuToken\n );\n requestId = topUpResult.requestId;\n console.log(topUpResult);\n\n if (!topUpResult.success) {\n await this._recoverFailedTopUp(cashuToken);\n return {\n success: false,\n message: topUpResult.error || \"Top up failed\",\n requestId,\n recoveredToken: true,\n };\n }\n\n return {\n success: true,\n toppedUpAmount: amount,\n requestId,\n };\n } catch (error) {\n console.log(\n \"DEBUG\",\n `[TopuPU] topup: Topup result for ${baseUrl}: error=${error}`\n );\n if (cashuToken) {\n await this._recoverFailedTopUp(cashuToken);\n }\n\n return this._handleTopUpError(error, mintUrl, requestId);\n }\n }\n\n async createProviderToken(\n options: CreateProviderTokenOptions\n ): Promise<ProviderTokenResult> {\n const {\n mintUrl,\n baseUrl,\n amount,\n retryCount = 0,\n excludeMints = [],\n p2pkPubkey,\n } = options;\n\n const adjustedAmount = Math.ceil(amount);\n if (!adjustedAmount || isNaN(adjustedAmount)) {\n return { success: false, error: \"Invalid top up amount\" };\n }\n\n const balanceState = await this.getBalanceState();\n const balances = await this.walletAdapter.getBalances();\n const units = this.walletAdapter.getMintUnits();\n\n const totalMintBalance = Object.values(balanceState.mintBalances).reduce(\n (sum, value) => sum + value,\n 0\n );\n const targetProviderBalance = balanceState.providerBalances[baseUrl] || 0;\n const refundableProviderBalance = Object.entries(\n balanceState.providerBalances\n )\n .filter(([providerBaseUrl]) => providerBaseUrl !== baseUrl)\n .reduce((sum, [, value]) => sum + value, 0);\n\n if (\n totalMintBalance + targetProviderBalance < adjustedAmount &&\n totalMintBalance + targetProviderBalance + refundableProviderBalance >=\n adjustedAmount &&\n retryCount < 1\n ) {\n await this._refundOtherProvidersForTopUp(baseUrl, mintUrl);\n return this.createProviderToken({\n ...options,\n retryCount: retryCount + 1,\n });\n }\n\n if (totalMintBalance + targetProviderBalance < adjustedAmount) {\n const error = new InsufficientBalanceError(\n adjustedAmount,\n totalMintBalance + targetProviderBalance,\n totalMintBalance,\n Object.entries(balanceState.mintBalances).reduce(\n (max, [url, balance]) =>\n balance > max.balance ? { url, balance } : max,\n { url: \"\", balance: 0 }\n ).url\n );\n return { success: false, error: error.message };\n }\n\n if (targetProviderBalance >= adjustedAmount) {\n return {\n success: true,\n amountSpent: 0,\n };\n }\n\n const providerMints =\n baseUrl && this.providerRegistry\n ? this.providerRegistry.getProviderMints(baseUrl)\n : [];\n\n let requiredAmount = adjustedAmount;\n const supportedMintsOnly = providerMints.length > 0;\n\n let candidates = this._selectCandidateMints({\n balances,\n units,\n amount: requiredAmount,\n preferredMintUrl: mintUrl,\n excludeMints,\n allowedMints: supportedMintsOnly ? providerMints : undefined,\n });\n\n if (candidates.length === 0 && supportedMintsOnly) {\n requiredAmount += 2;\n candidates = this._selectCandidateMints({\n balances,\n units,\n amount: requiredAmount,\n preferredMintUrl: mintUrl,\n excludeMints,\n });\n }\n\n if (candidates.length === 0) {\n let maxBalance = 0;\n let maxMintUrl = \"\";\n for (const mintUrl in balances) {\n const balance = balances[mintUrl];\n const unit = units[mintUrl];\n const balanceInSats = getBalanceInSats(balance, unit);\n if (balanceInSats > maxBalance) {\n maxBalance = balanceInSats;\n maxMintUrl = mintUrl;\n }\n }\n\n const error = new InsufficientBalanceError(\n adjustedAmount,\n totalMintBalance,\n maxBalance,\n maxMintUrl\n );\n\n return { success: false, error: error.message };\n }\n\n let lastError: string | undefined;\n for (const candidateMint of candidates) {\n try {\n const token = await this.walletAdapter.sendToken(\n candidateMint,\n requiredAmount,\n p2pkPubkey\n );\n return {\n success: true,\n token,\n selectedMintUrl: candidateMint,\n amountSpent: requiredAmount,\n };\n } catch (error) {\n if (error instanceof Error) {\n lastError = error.message;\n\n if (isNetworkErrorMessage(error.message)) {\n continue;\n }\n }\n\n return {\n success: false,\n error: lastError || \"Failed to create top up token\",\n };\n }\n }\n\n return {\n success: false,\n error:\n lastError || \"All candidate mints failed while creating top up token\",\n };\n }\n\n private _selectCandidateMints(options: {\n balances: Record<string, number>;\n units: Record<string, \"sat\" | \"msat\">;\n amount: number;\n preferredMintUrl: string;\n excludeMints: string[];\n allowedMints?: string[];\n }): string[] {\n const {\n balances,\n units,\n amount,\n preferredMintUrl,\n excludeMints,\n allowedMints,\n } = options;\n\n const candidates: string[] = [];\n\n const { selectedMintUrl: firstMint } = selectMintWithBalance(\n balances,\n units,\n amount,\n excludeMints\n );\n\n if (\n firstMint &&\n (!allowedMints ||\n allowedMints.length === 0 ||\n allowedMints.includes(firstMint))\n ) {\n candidates.push(firstMint);\n }\n\n const canUseMint = (mint: string): boolean => {\n if (excludeMints.includes(mint)) return false;\n if (\n allowedMints &&\n allowedMints.length > 0 &&\n !allowedMints.includes(mint)\n ) {\n return false;\n }\n const rawBalance = balances[mint] || 0;\n const unit = units[mint];\n const balanceInSats = getBalanceInSats(rawBalance, unit);\n return balanceInSats >= amount;\n };\n\n if (\n preferredMintUrl &&\n canUseMint(preferredMintUrl) &&\n !candidates.includes(preferredMintUrl)\n ) {\n candidates.push(preferredMintUrl);\n }\n\n for (const mint in balances) {\n if (mint === preferredMintUrl || candidates.includes(mint)) continue;\n if (canUseMint(mint)) {\n candidates.push(mint);\n }\n }\n\n return candidates;\n }\n\n private async _refundOtherProvidersForTopUp(\n baseUrl: string,\n mintUrl: string\n ): Promise<void> {\n const pendingDistribution =\n this.storageAdapter.getCachedTokenDistribution();\n const apiKeyDistribution = this.storageAdapter.getApiKeyDistribution();\n\n const toRefund = pendingDistribution.filter(\n (pending) => pending.baseUrl !== baseUrl\n );\n const apiKeysToRefund = apiKeyDistribution.filter(\n (apiKey) => apiKey.baseUrl !== baseUrl && apiKey.amount > 0\n );\n\n const tokenRefundResults = await Promise.allSettled(\n toRefund.map(async (pending) => {\n const token = this.storageAdapter.getToken(pending.baseUrl);\n if (!token) {\n return { baseUrl: pending.baseUrl, success: false };\n }\n\n const tokenBalance = await this.getTokenBalance(token, pending.baseUrl);\n if (tokenBalance.reserved > 0) {\n return { baseUrl: pending.baseUrl, success: false };\n }\n\n const result = await this.refund({\n mintUrl,\n baseUrl: pending.baseUrl,\n token,\n });\n\n return { baseUrl: pending.baseUrl, success: result.success };\n })\n );\n\n for (const result of tokenRefundResults) {\n if (result.status === \"fulfilled\" && result.value.success) {\n this.storageAdapter.removeToken(result.value.baseUrl);\n }\n }\n\n const apiKeyRefundResults = await Promise.allSettled(\n apiKeysToRefund.map(async (apiKeyEntry) => {\n const fullApiKeyEntry = this.storageAdapter.getApiKey(\n apiKeyEntry.baseUrl\n );\n if (!fullApiKeyEntry) {\n return { baseUrl: apiKeyEntry.baseUrl, success: false };\n }\n\n const result = await this.refundApiKey({\n mintUrl,\n baseUrl: apiKeyEntry.baseUrl,\n apiKey: fullApiKeyEntry.key,\n });\n\n return { baseUrl: apiKeyEntry.baseUrl, success: result.success };\n })\n );\n\n for (const result of apiKeyRefundResults) {\n if (result.status === \"fulfilled\" && result.value.success) {\n this.storageAdapter.updateApiKeyBalance(result.value.baseUrl, 0);\n }\n }\n }\n\n /**\n * Fetch refund token from provider API\n */\n private async _fetchRefundToken(\n baseUrl: string,\n storedToken: string\n ): Promise<{\n success: boolean;\n token?: string;\n requestId?: string;\n error?: string;\n }> {\n if (!baseUrl) {\n return {\n success: false,\n error: \"No base URL configured\",\n };\n }\n\n const normalizedBaseUrl = baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n\n const url = `${normalizedBaseUrl}v1/wallet/refund`;\n\n // Create an AbortController for timeout handling\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n controller.abort();\n }, 60000); // 1 minute timeout\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${storedToken}`,\n \"Content-Type\": \"application/json\",\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const requestId =\n response.headers.get(\"x-routstr-request-id\") || undefined;\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n\n if (\n response.status === 400 &&\n errorData?.detail === \"No balance to refund\"\n ) {\n this.storageAdapter.removeToken(baseUrl);\n return {\n success: false,\n requestId,\n error: \"No balance to refund\",\n };\n }\n\n return {\n success: false,\n requestId,\n error: `Refund request failed with status ${response.status}: ${\n errorData?.detail || response.statusText\n }`,\n };\n }\n\n const data = await response.json();\n console.log(\"refund rsule\", data);\n return {\n success: true,\n token: data.token,\n requestId,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n console.error(\"[BalanceManager._fetchRefundToken] Fetch error\", error);\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n return {\n success: false,\n error: \"Request timed out after 1 minute\",\n };\n }\n return {\n success: false,\n error: error.message,\n };\n }\n\n return {\n success: false,\n error: \"Unknown error occurred during refund request\",\n };\n }\n }\n\n /**\n * Post topup request to provider API\n */\n private async _postTopUp(\n baseUrl: string,\n storedToken: string,\n cashuToken: string\n ): Promise<{\n success: boolean;\n requestId?: string;\n error?: string;\n }> {\n if (!baseUrl) {\n return {\n success: false,\n error: \"No base URL configured\",\n };\n }\n\n const normalizedBaseUrl = baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n const url = `${normalizedBaseUrl}v1/wallet/topup?cashu_token=${encodeURIComponent(\n cashuToken\n )}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n controller.abort();\n }, 60000);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${storedToken}`,\n \"Content-Type\": \"application/json\",\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const requestId =\n response.headers.get(\"x-routstr-request-id\") || undefined;\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n requestId,\n error:\n errorData?.detail || `Top up failed with status ${response.status}`,\n };\n }\n\n return { success: true, requestId };\n } catch (error) {\n clearTimeout(timeoutId);\n console.error(\"[BalanceManager._postTopUp] Fetch error\", error);\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n return {\n success: false,\n error: \"Request timed out after 1 minute\",\n };\n }\n return {\n success: false,\n error: error.message,\n };\n }\n\n return {\n success: false,\n error: \"Unknown error occurred during top up request\",\n };\n }\n }\n\n /**\n * Attempt to receive token back after failed top up\n */\n private async _recoverFailedTopUp(cashuToken: string): Promise<void> {\n try {\n await this.cashuSpender.receiveToken(cashuToken);\n } catch (error) {\n console.error(\n \"[BalanceManager._recoverFailedTopUp] Failed to recover token\",\n error\n );\n }\n }\n\n /**\n * Handle refund errors with specific error types\n */\n private _handleRefundError(\n error: unknown,\n mintUrl: string,\n requestId?: string\n ): RefundResult {\n if (error instanceof Error) {\n // Network errors\n if (isNetworkErrorMessage(error.message)) {\n return {\n success: false,\n message: `Failed to connect to the mint: ${mintUrl}`,\n requestId,\n };\n }\n\n // Wallet not found error\n if (error.message.includes(\"Wallet not found\")) {\n return {\n success: false,\n message: `Wallet couldn't be loaded. Please save this refunded cashu token manually.`,\n requestId,\n };\n }\n\n return {\n success: false,\n message: error.message,\n requestId,\n };\n }\n\n return {\n success: false,\n message: \"Refund failed\",\n requestId,\n };\n }\n\n /**\n * Get token balance from provider\n */\n async getTokenBalance(\n token: string,\n baseUrl: string\n ): Promise<{\n amount: number;\n reserved: number;\n unit: \"sat\" | \"msat\";\n apiKey: string;\n isInvalidApiKey?: boolean;\n }> {\n try {\n const response = await fetch(`${baseUrl}v1/wallet/info`, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (response.ok) {\n const data = await response.json();\n console.log(\"TOKENA FASJDFAS\", data);\n return {\n amount: data.balance,\n reserved: data.reserved ?? 0,\n unit: \"msat\",\n apiKey: data.api_key,\n };\n } else {\n console.log(response.status);\n const data = await response.json();\n console.log(\"FAILED \", data);\n\n // Check for invalid/expired API key error (proofs already spent)\n const isInvalidApiKey =\n response.status === 401 &&\n data?.code === \"invalid_api_key\" &&\n data?.message?.includes(\"proofs already spent\");\n\n return {\n amount: -1,\n reserved: data.reserved ?? 0,\n unit: \"msat\",\n apiKey: data.api_key,\n isInvalidApiKey,\n };\n }\n } catch (error) {\n console.error(\"ERRORR IN RESTPONSE\", error);\n // Fall through to default\n }\n\n return { amount: -1, reserved: 0, unit: \"sat\", apiKey: \"\" };\n }\n\n /**\n * Handle topup errors with specific error types\n */\n private _handleTopUpError(\n error: unknown,\n mintUrl: string,\n requestId?: string\n ): TopUpResult {\n if (error instanceof Error) {\n if (isNetworkErrorMessage(error.message)) {\n return {\n success: false,\n message: `Failed to connect to the mint: ${mintUrl}`,\n requestId,\n };\n }\n\n if (error.message.includes(\"Wallet not found\")) {\n return {\n success: false,\n message:\n \"Wallet couldn't be loaded. The cashu token was recovered locally.\",\n requestId,\n };\n }\n\n return {\n success: false,\n message: error.message,\n requestId,\n };\n }\n\n return {\n success: false,\n message: \"Top up failed\",\n requestId,\n };\n }\n}\n","/**\n * StreamProcessor - Handles SSE streaming response parsing\n *\n * Handles:\n * - Line buffering for large payloads\n * - Content extraction from delta chunks\n * - Thinking/reasoning block extraction\n * - Image data merging and deduplication\n * - Usage statistics extraction\n * - Citations and annotations\n *\n * Extracted from utils/apiUtils.ts processStreamingResponse\n */\n\nimport type { StreamingResult, ImageData, AnnotationData } from \"../core/types\";\n\n/**\n * Callbacks for streaming updates\n */\nexport interface StreamCallbacks {\n /** Called when new content arrives */\n onContent: (content: string) => void;\n /** Called when thinking content arrives */\n onThinking: (thinking: string) => void;\n}\n\n/**\n * StreamProcessor parses SSE streaming responses\n */\nexport class StreamProcessor {\n private accumulatedContent = \"\";\n private accumulatedThinking = \"\";\n private accumulatedImages: ImageData[] = [];\n private isInThinking = false;\n private isInContent = false;\n\n /**\n * Process a streaming response\n */\n async process(\n response: Response,\n callbacks: StreamCallbacks,\n modelId?: string\n ): Promise<StreamingResult> {\n if (!response.body) {\n throw new Error(\"Response body is not available\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n\n // Reset state\n this.accumulatedContent = \"\";\n this.accumulatedThinking = \"\";\n this.accumulatedImages = [];\n this.isInThinking = false;\n this.isInContent = false;\n\n // Result accumulators\n let usage: StreamingResult[\"usage\"];\n let model: string | undefined;\n let finish_reason: string | undefined;\n let citations: string[] | undefined;\n let annotations: AnnotationData[] | undefined;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n buffer += chunk;\n\n // Process complete lines\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\"; // Keep incomplete line in buffer\n\n for (const line of lines) {\n const parsed = this._parseLine(line);\n if (!parsed) continue;\n\n // Handle content delta\n if (parsed.content) {\n this._handleContent(parsed.content, callbacks, modelId);\n }\n\n // Handle reasoning/thinking\n if (parsed.reasoning) {\n this._handleThinking(parsed.reasoning, callbacks);\n }\n\n // Extract metadata\n if (parsed.usage) {\n usage = parsed.usage;\n }\n if (parsed.model) {\n model = parsed.model;\n }\n if (parsed.finish_reason) {\n finish_reason = parsed.finish_reason;\n }\n if (parsed.citations) {\n citations = parsed.citations;\n }\n if (parsed.annotations) {\n annotations = parsed.annotations;\n }\n\n // Handle images\n if (parsed.images) {\n this._mergeImages(parsed.images);\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n return {\n content: this.accumulatedContent,\n thinking: this.accumulatedThinking || undefined,\n images: this.accumulatedImages.length > 0 ? this.accumulatedImages : undefined,\n usage,\n model,\n finish_reason,\n citations,\n annotations,\n };\n }\n\n /**\n * Parse a single SSE line\n */\n private _parseLine(line: string): {\n content?: string;\n reasoning?: string;\n usage?: StreamingResult[\"usage\"];\n model?: string;\n finish_reason?: string;\n citations?: string[];\n annotations?: AnnotationData[];\n images?: ImageData[];\n } | null {\n if (!line.trim()) return null;\n\n // SSE data lines start with \"data: \"\n if (!line.startsWith(\"data: \")) {\n // Show \"Generating...\" for non-data lines if no content yet\n return null;\n }\n\n const jsonData = line.slice(6);\n\n if (jsonData === \"[DONE]\") {\n return null;\n }\n\n try {\n const parsed = JSON.parse(jsonData);\n const result: ReturnType<typeof this._parseLine> = {};\n\n // Extract content delta\n if (parsed.choices?.[0]?.delta?.content) {\n result.content = parsed.choices[0].delta.content;\n }\n\n // Extract reasoning (OpenRouter style)\n if (parsed.choices?.[0]?.delta?.reasoning) {\n result.reasoning = parsed.choices[0].delta.reasoning;\n }\n\n // Extract usage (usually in final chunk)\n if (parsed.usage) {\n result.usage = {\n total_tokens: parsed.usage.total_tokens,\n prompt_tokens: parsed.usage.prompt_tokens,\n completion_tokens: parsed.usage.completion_tokens,\n };\n }\n\n // Extract model info\n if (parsed.model) {\n result.model = parsed.model;\n }\n\n // Extract citations\n if (parsed.citations) {\n result.citations = parsed.citations;\n }\n\n // Extract annotations\n if (parsed.annotations) {\n result.annotations = parsed.annotations;\n }\n\n // Extract finish reason\n if (parsed.choices?.[0]?.finish_reason) {\n result.finish_reason = parsed.choices[0].finish_reason;\n }\n\n // Extract images (from message or delta)\n const images =\n parsed.choices?.[0]?.message?.images ||\n parsed.choices?.[0]?.delta?.images;\n if (images && Array.isArray(images)) {\n result.images = images;\n }\n\n return result;\n } catch {\n // Swallow parse errors for streaming chunks\n return null;\n }\n }\n\n /**\n * Handle content delta with thinking support\n */\n private _handleContent(\n content: string,\n callbacks: StreamCallbacks,\n modelId?: string\n ): void {\n // If we were in thinking mode and now got content, close thinking tag\n if (this.isInThinking && !this.isInContent) {\n this.accumulatedThinking += \"</thinking>\";\n callbacks.onThinking(this.accumulatedThinking);\n this.isInThinking = false;\n this.isInContent = true;\n }\n\n // For models that use <thinking> tags inline\n if (modelId) {\n this._extractThinkingFromContent(content, callbacks);\n } else {\n this.accumulatedContent += content;\n }\n\n callbacks.onContent(this.accumulatedContent);\n }\n\n /**\n * Handle thinking/reasoning content\n */\n private _handleThinking(reasoning: string, callbacks: StreamCallbacks): void {\n if (!this.isInThinking) {\n this.accumulatedThinking += \"<thinking> \";\n this.isInThinking = true;\n }\n this.accumulatedThinking += reasoning;\n callbacks.onThinking(this.accumulatedThinking);\n }\n\n /**\n * Extract thinking blocks from content (for models with inline thinking)\n */\n private _extractThinkingFromContent(\n content: string,\n callbacks: StreamCallbacks\n ): void {\n // Simple extraction - models that wrap thinking in <thinking> tags\n const parts = content.split(/(<thinking>|<\\/thinking>)/);\n\n for (const part of parts) {\n if (part === \"<thinking>\") {\n this.isInThinking = true;\n if (!this.accumulatedThinking.includes(\"<thinking>\")) {\n this.accumulatedThinking += \"<thinking> \";\n }\n } else if (part === \"</thinking>\") {\n this.isInThinking = false;\n this.accumulatedThinking += \"</thinking>\";\n } else if (this.isInThinking) {\n this.accumulatedThinking += part;\n } else {\n this.accumulatedContent += part;\n }\n }\n }\n\n /**\n * Merge images into accumulated array, avoiding duplicates\n */\n private _mergeImages(newImages: ImageData[]): void {\n for (const img of newImages) {\n const newUrl = img.image_url?.url;\n const existingIndex = this.accumulatedImages.findIndex((existing) => {\n const existingUrl = existing.image_url?.url;\n if (newUrl && existingUrl) {\n return existingUrl === newUrl;\n }\n if (img.index !== undefined && existing.index !== undefined) {\n return existing.index === img.index;\n }\n return false;\n });\n\n if (existingIndex === -1) {\n this.accumulatedImages.push(img);\n } else {\n this.accumulatedImages[existingIndex] = img;\n }\n }\n }\n}\n","export type ProviderDirectoryEntry = {\n endpoint_url?: string | null;\n endpoint_urls?: string[] | null;\n onion_url?: string | null;\n onion_urls?: string[] | null;\n name?: string | null;\n};\n\nconst TOR_ONION_SUFFIX = \".onion\";\n\nexport const isTorContext = (): boolean => {\n if (typeof window === \"undefined\") return false;\n const hostname = window.location.hostname.toLowerCase();\n return hostname.endsWith(TOR_ONION_SUFFIX);\n};\n\nexport const isOnionUrl = (url: string): boolean => {\n if (!url) return false;\n const trimmed = url.trim().toLowerCase();\n if (!trimmed) return false;\n try {\n const candidate = trimmed.startsWith(\"http\")\n ? trimmed\n : `http://${trimmed}`;\n return new URL(candidate).hostname.endsWith(TOR_ONION_SUFFIX);\n } catch {\n return trimmed.includes(TOR_ONION_SUFFIX);\n }\n};\n\nconst shouldAllowHttp = (url: string, torMode: boolean): boolean => {\n if (!url.startsWith(\"http://\")) return true;\n if (url.includes(\"localhost\") || url.includes(\"127.0.0.1\")) return true;\n return torMode && isOnionUrl(url);\n};\n\nexport const normalizeProviderUrl = (\n url?: string | null,\n torMode: boolean = false\n): string | null => {\n if (!url || typeof url !== \"string\") return null;\n const trimmed = url.trim();\n if (!trimmed) return null;\n if (/^https?:\\/\\//i.test(trimmed)) {\n return trimmed.endsWith(\"/\") ? trimmed : `${trimmed}/`;\n }\n const useHttpForOnion = torMode && isOnionUrl(trimmed);\n const withProto = `${useHttpForOnion ? \"http\" : \"https\"}://${trimmed}`;\n return withProto.endsWith(\"/\") ? withProto : `${withProto}/`;\n};\n\nconst dedupePreserveOrder = (urls: string[]): string[] => {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const url of urls) {\n if (!seen.has(url)) {\n seen.add(url);\n out.push(url);\n }\n }\n return out;\n};\n\nexport const getProviderEndpoints = (\n provider: ProviderDirectoryEntry,\n torMode: boolean\n): string[] => {\n const rawUrls: (string | null | undefined)[] = [\n provider.endpoint_url,\n ...(Array.isArray(provider.endpoint_urls) ? provider.endpoint_urls : []),\n provider.onion_url,\n ...(Array.isArray(provider.onion_urls) ? provider.onion_urls : []),\n ];\n\n const normalized = rawUrls\n .map((value) => normalizeProviderUrl(value, torMode))\n .filter((value): value is string => Boolean(value));\n\n const unique = dedupePreserveOrder(normalized).filter((value) =>\n shouldAllowHttp(value, torMode)\n );\n\n if (unique.length === 0) return [];\n\n const onion = unique.filter((value) => isOnionUrl(value));\n const clearnet = unique.filter((value) => !isOnionUrl(value));\n\n if (torMode) {\n return onion.length > 0 ? onion : clearnet;\n }\n\n return clearnet;\n};\n\nexport const filterBaseUrlsForTor = (\n baseUrls: string[],\n torMode: boolean\n): string[] => {\n if (!Array.isArray(baseUrls)) return [];\n\n const normalized = baseUrls\n .map((value) => normalizeProviderUrl(value, torMode))\n .filter((value): value is string => Boolean(value));\n\n const filtered = normalized.filter((value) =>\n torMode ? true : !isOnionUrl(value)\n );\n\n return dedupePreserveOrder(\n filtered.filter((value) => shouldAllowHttp(value, torMode))\n );\n};\n","/**\n * ProviderManager - Handles provider selection and failover logic\n *\n * Handles:\n * - Finding the best provider for a model based on price\n * - Provider failover when errors occur\n * - Tracking failed providers to avoid retry loops\n * - Provider version compatibility\n *\n * Extracted from utils/apiUtils.ts findNextBestProvider and related logic\n */\n\nimport type { ProviderRegistry } from \"../wallet/interfaces\";\nimport type { Model } from \"../core/types\";\nimport { isOnionUrl, isTorContext } from \"../utils/torUtils\";\n\nexport interface ModelProviderPrice {\n baseUrl: string;\n model: Model;\n promptPerMillion: number;\n completionPerMillion: number;\n totalPerMillion: number;\n}\n\n/**\n * Extract image resolution (width, height) from a base64 data URL without DOM.\n * Supports PNG and JPEG. Returns null if format unsupported or parsing fails.\n */\nfunction getImageResolutionFromDataUrl(\n dataUrl: string\n): { width: number; height: number } | null {\n try {\n if (typeof dataUrl !== \"string\" || !dataUrl.startsWith(\"data:\"))\n return null;\n\n const commaIdx = dataUrl.indexOf(\",\");\n if (commaIdx === -1) return null;\n\n const meta = dataUrl.slice(5, commaIdx); // e.g. \"image/png;base64\"\n const base64 = dataUrl.slice(commaIdx + 1);\n\n // Decode base64 to binary\n const binary =\n typeof atob === \"function\"\n ? atob(base64)\n : Buffer.from(base64, \"base64\").toString(\"binary\");\n\n const len = binary.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) bytes[i] = binary.charCodeAt(i);\n\n const isPNG = meta.includes(\"image/png\");\n const isJPEG = meta.includes(\"image/jpeg\") || meta.includes(\"image/jpg\");\n\n // PNG: width/height are 4-byte big-endian at offsets 16 and 20\n if (isPNG) {\n // Validate PNG signature\n const sig = [137, 80, 78, 71, 13, 10, 26, 10];\n for (let i = 0; i < sig.length; i++) {\n if (bytes[i] !== sig[i]) return null;\n }\n const view = new DataView(\n bytes.buffer,\n bytes.byteOffset,\n bytes.byteLength\n );\n const width = view.getUint32(16, false);\n const height = view.getUint32(20, false);\n if (width > 0 && height > 0) return { width, height };\n return null;\n }\n\n // JPEG: parse markers to SOF0/SOF2 for dimensions\n if (isJPEG) {\n let offset = 0;\n // JPEG SOI 0xFFD8\n if (bytes[offset++] !== 0xff || bytes[offset++] !== 0xd8) return null;\n\n while (offset < bytes.length) {\n // Find marker\n while (offset < bytes.length && bytes[offset] !== 0xff) offset++;\n if (offset + 1 >= bytes.length) break;\n\n // Skip fill bytes 0xFF\n while (bytes[offset] === 0xff) offset++;\n const marker = bytes[offset++];\n\n // Standalone markers without length\n if (marker === 0xd8 || marker === 0xd9) continue; // SOI/EOI\n\n if (offset + 1 >= bytes.length) break;\n const length = (bytes[offset] << 8) | bytes[offset + 1];\n offset += 2;\n\n // SOF0 (0xC0) or SOF2 (0xC2) contain dimensions\n if (marker === 0xc0 || marker === 0xc2) {\n if (length < 7 || offset + length - 2 > bytes.length) return null;\n const precision = bytes[offset];\n const height = (bytes[offset + 1] << 8) | bytes[offset + 2];\n const width = (bytes[offset + 3] << 8) | bytes[offset + 4];\n if (precision > 0 && width > 0 && height > 0)\n return { width, height };\n return null;\n } else {\n // Skip this segment\n offset += length - 2;\n }\n }\n return null;\n }\n\n // Unsupported formats (e.g., webp/gif) - skip for now\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Calculate image tokens based on OpenAI's vision pricing.\n *\n * For low detail: 85 tokens\n * For high detail/auto: 85 base tokens + 170 tokens per 512px tile\n */\nfunction calculateImageTokens(\n width: number,\n height: number,\n detail: \"low\" | \"high\" | \"auto\" = \"auto\"\n): number {\n if (detail === \"low\") return 85;\n\n let w = width;\n let h = height;\n\n // Clamp longest side to 2048 while preserving aspect ratio\n if (w > 2048 || h > 2048) {\n const aspectRatio = w / h;\n if (w > h) {\n w = 2048;\n h = Math.floor(w / aspectRatio);\n } else {\n h = 2048;\n w = Math.floor(h * aspectRatio);\n }\n }\n\n // Then clamp longest side to 768 while preserving aspect ratio\n if (w > 768 || h > 768) {\n const aspectRatio = w / h;\n if (w > h) {\n w = 768;\n h = Math.floor(w / aspectRatio);\n } else {\n h = 768;\n w = Math.floor(h * aspectRatio);\n }\n }\n\n // Number of 512px tiles, ceil division using (x + 511) // 512\n const tilesWidth = Math.floor((w + 511) / 512);\n const tilesHeight = Math.floor((h + 511) / 512);\n const numTiles = tilesWidth * tilesHeight;\n\n return 85 + 170 * numTiles;\n}\n\n/**\n * Candidate provider for failover\n */\ninterface CandidateProvider {\n baseUrl: string;\n model: Model;\n cost: number;\n}\n\n/**\n * ProviderManager handles provider selection and failover\n */\nfunction isInsecureHttpUrl(url: string): boolean {\n return url.startsWith(\"http://\");\n}\n\nexport class ProviderManager {\n private failedProviders = new Set<string>();\n\n constructor(private providerRegistry: ProviderRegistry) {}\n\n /**\n * Reset the failed providers list\n */\n resetFailedProviders(): void {\n this.failedProviders.clear();\n }\n\n /**\n * Mark a provider as failed\n */\n markFailed(baseUrl: string): void {\n this.failedProviders.add(baseUrl);\n }\n\n /**\n * Check if a provider has failed\n */\n hasFailed(baseUrl: string): boolean {\n return this.failedProviders.has(baseUrl);\n }\n\n /**\n * Find the next best provider for a model\n * @param modelId The model ID to find a provider for\n * @param currentBaseUrl The current provider to exclude\n * @returns The best provider URL or null if none available\n */\n findNextBestProvider(modelId: string, currentBaseUrl: string): string | null {\n try {\n const torMode = isTorContext();\n const disabledProviders = new Set(\n this.providerRegistry.getDisabledProviders()\n );\n\n // Get all providers with their models\n const allProviders = this.providerRegistry.getAllProvidersModels();\n\n // Find all candidate providers\n const candidates: CandidateProvider[] = [];\n\n for (const [baseUrl, models] of Object.entries(allProviders)) {\n // Skip current, failed, and disabled providers\n if (\n baseUrl === currentBaseUrl ||\n this.failedProviders.has(baseUrl) ||\n disabledProviders.has(baseUrl)\n ) {\n continue;\n }\n\n // Skip onion URLs and insecure http URLs if not in Tor mode\n if (!torMode && (isOnionUrl(baseUrl) || isInsecureHttpUrl(baseUrl))) {\n continue;\n }\n\n // Find the model in this provider's list\n const model = models.find((m: Model) => m.id === modelId);\n if (!model) continue;\n\n // Calculate cost (using completion price as the metric)\n const cost = model.sats_pricing?.completion ?? 0;\n candidates.push({ baseUrl, model, cost });\n }\n\n // Sort by price (lowest first)\n candidates.sort((a, b) => a.cost - b.cost);\n\n return candidates.length > 0 ? candidates[0].baseUrl : null;\n } catch (error) {\n console.error(\"Error finding next best provider:\", error);\n return null;\n }\n }\n\n /**\n * Find the best model for a provider\n * Useful when switching providers and need to find equivalent model\n */\n async getModelForProvider(\n baseUrl: string,\n modelId: string\n ): Promise<Model | null> {\n // Get models for this provider\n const models = this.providerRegistry.getModelsForProvider(baseUrl);\n\n // First try exact match\n const exactMatch = models.find((m) => m.id === modelId);\n if (exactMatch) return exactMatch;\n\n // Try matching by ID suffix (for backward compatibility with v0.1.x providers)\n const providerInfo = await this.providerRegistry.getProviderInfo(baseUrl);\n if (providerInfo?.version && /^0\\.1\\./.test(providerInfo.version)) {\n const suffix = modelId.split(\"/\").pop();\n const suffixMatch = models.find((m) => m.id === suffix);\n if (suffixMatch) return suffixMatch;\n }\n\n return null;\n }\n\n /**\n * Get all available providers for a model\n * Returns sorted list by price\n */\n getAllProvidersForModel(modelId: string): Array<{\n baseUrl: string;\n model: Model;\n cost: number;\n }> {\n const candidates: CandidateProvider[] = [];\n const allProviders = this.providerRegistry.getAllProvidersModels();\n const disabledProviders = new Set(\n this.providerRegistry.getDisabledProviders()\n );\n const torMode = isTorContext();\n\n for (const [baseUrl, models] of Object.entries(allProviders)) {\n if (disabledProviders.has(baseUrl)) continue;\n if (!torMode && (isOnionUrl(baseUrl) || isInsecureHttpUrl(baseUrl)))\n continue;\n\n const model = models.find((m: Model) => m.id === modelId);\n if (!model) continue;\n\n const cost = model.sats_pricing?.completion ?? 0;\n candidates.push({ baseUrl, model, cost });\n }\n\n return candidates.sort((a, b) => a.cost - b.cost);\n }\n\n /**\n * Get providers for a model sorted by prompt+completion pricing\n */\n getProviderPriceRankingForModel(\n modelId: string,\n options: { torMode?: boolean; includeDisabled?: boolean } = {}\n ): ModelProviderPrice[] {\n const normalizedId = this.normalizeModelId(modelId);\n const includeDisabled = options.includeDisabled ?? false;\n const torMode = options.torMode ?? false;\n const disabledProviders = new Set(\n this.providerRegistry.getDisabledProviders()\n );\n const allModels = this.providerRegistry.getAllProvidersModels();\n const results: ModelProviderPrice[] = [];\n\n for (const [baseUrl, models] of Object.entries(allModels)) {\n if (!includeDisabled && disabledProviders.has(baseUrl)) continue;\n if (torMode && !baseUrl.includes(\".onion\")) continue;\n if (\n !torMode &&\n (baseUrl.includes(\".onion\") || isInsecureHttpUrl(baseUrl))\n )\n continue;\n\n const match = models.find(\n (model) => this.normalizeModelId(model.id) === normalizedId\n );\n if (!match?.sats_pricing) continue;\n\n const prompt = match.sats_pricing.prompt;\n const completion = match.sats_pricing.completion;\n if (typeof prompt !== \"number\" || typeof completion !== \"number\") {\n continue;\n }\n\n const promptPerMillion = prompt * 1_000_000;\n const completionPerMillion = completion * 1_000_000;\n const totalPerMillion = promptPerMillion + completionPerMillion;\n\n results.push({\n baseUrl,\n model: match,\n promptPerMillion,\n completionPerMillion,\n totalPerMillion,\n });\n }\n\n return results.sort((a, b) => {\n if (a.totalPerMillion !== b.totalPerMillion) {\n return a.totalPerMillion - b.totalPerMillion;\n }\n return a.baseUrl.localeCompare(b.baseUrl);\n });\n }\n\n /**\n * Get best-priced provider for a specific model\n */\n getBestProviderForModel(\n modelId: string,\n options: { torMode?: boolean; includeDisabled?: boolean } = {}\n ): string | null {\n const ranking = this.getProviderPriceRankingForModel(modelId, options);\n return ranking[0]?.baseUrl ?? null;\n }\n\n private normalizeModelId(modelId: string): string {\n return modelId.includes(\"/\")\n ? modelId.split(\"/\").pop() || modelId\n : modelId;\n }\n\n /**\n * Check if a provider accepts a specific mint\n */\n providerAcceptsMint(baseUrl: string, mintUrl: string): boolean {\n const providerMints = this.providerRegistry.getProviderMints(baseUrl);\n if (providerMints.length === 0) {\n // If no mints specified, provider accepts all\n return true;\n }\n return providerMints.includes(mintUrl);\n }\n\n /**\n * Get required sats for a model based on message history\n * Simple estimation based on typical usage\n */\n getRequiredSatsForModel(\n model: Model,\n apiMessages: any[],\n maxTokens?: number\n ): number {\n try {\n let imageTokens = 0;\n if (apiMessages) {\n for (const msg of apiMessages as any[]) {\n const content = (msg as any)?.content;\n if (Array.isArray(content)) {\n for (const part of content) {\n const isImage =\n part && typeof part === \"object\" && part.type === \"image_url\";\n const url: string | undefined = isImage\n ? typeof part.image_url === \"string\"\n ? part.image_url\n : part.image_url?.url\n : undefined;\n\n // Expecting a base64 data URL for local image inputs\n if (url && typeof url === \"string\" && url.startsWith(\"data:\")) {\n const res = getImageResolutionFromDataUrl(url);\n if (res) {\n const tokensFromImage = calculateImageTokens(\n res.width,\n res.height\n );\n // const patchSize = 32;\n // const patchesW = Math.floor((res.width + patchSize - 1) / patchSize);\n // const patchesH = Math.floor((res.height + patchSize - 1) / patchSize);\n // const tokensFromImage = patchesW * patchesH;\n imageTokens += tokensFromImage;\n console.log(\"IMAGE INPUT RESOLUTION\", {\n width: res.width,\n height: res.height,\n tokensFromImage,\n });\n } else {\n console.log(\n \"IMAGE INPUT RESOLUTION\",\n \"unknown (unsupported format or parse failure)\"\n );\n }\n }\n }\n }\n }\n }\n // Remove image_url parts from apiMessages when estimating text token count\n const apiMessagesNoImages = apiMessages // SWITCH AFTER NODE UPDAATES\n ? (apiMessages as any[]).map((m: any) => {\n if (Array.isArray(m?.content)) {\n const filtered = m.content.filter(\n (p: any) =>\n !(p && typeof p === \"object\" && p.type === \"image_url\")\n );\n return { ...m, content: filtered };\n }\n return m;\n })\n : undefined;\n\n const approximateTokens = apiMessagesNoImages // SWITCH AFTER NODE UPDAATES\n ? Math.ceil(JSON.stringify(apiMessagesNoImages, null, 2).length / 2.84)\n : 10000; // Assumed tokens for minimum balance calculation\n\n const totalInputTokens = approximateTokens + imageTokens;\n\n const sp: any = model?.sats_pricing as any;\n\n if (!sp) return 0;\n\n // If we don't have max_completion_cost, fall back to max_cost\n if (!sp.max_completion_cost) {\n return sp.max_cost ?? 50;\n }\n\n // Calculate based on token usage (similar to getTokenAmountForModel in apiUtils.ts)\n const promptCosts = (sp.prompt || 0) * totalInputTokens;\n let completionCost = sp.max_completion_cost;\n if (maxTokens !== undefined && sp.completion) {\n completionCost = sp.completion * maxTokens;\n }\n const totalEstimatedCosts = (promptCosts + completionCost) * 1.05;\n // return totalEstimatedCosts > sp.max_cost ? sp.max_cost : totalEstimatedCosts; // in some image input calculations, this cost balloons up. Now includes image tokens via 32px patches.\n return totalEstimatedCosts; // Backend has a bug here.it's calculating image tokens wrong. gotta switch to different logic once its fixed\n } catch (e) {\n console.error(e);\n return 0;\n }\n }\n}\n","/**\n * RoutstrClient - Main API client for Routstr\n *\n * Orchestrates:\n * - Token spending via CashuSpender\n * - API requests with authentication\n * - Streaming response processing\n * - Provider failover via ProviderManager\n * - Error handling and refunds\n *\n * Extracted from utils/apiUtils.ts\n */\n\nimport type { Message, TransactionHistory } from \"../core/types\";\nimport type { Model } from \"../core/types\";\nimport type {\n WalletAdapter,\n StorageAdapter,\n ProviderRegistry,\n StreamingCallbacks,\n} from \"../wallet/interfaces\";\nimport { CashuSpender } from \"../wallet/CashuSpender\";\nimport { BalanceManager } from \"../wallet/BalanceManager\";\nimport { StreamProcessor } from \"./StreamProcessor\";\nimport { ProviderManager } from \"./ProviderManager\";\nimport type { StreamingResult } from \"../core/types\";\nimport {\n ProviderError,\n FailoverError,\n InsufficientBalanceError,\n} from \"../core/errors\";\n\n/**\n * Options for fetching AI response\n */\nexport interface FetchOptions {\n messageHistory: Message[];\n selectedModel: Model;\n baseUrl: string;\n mintUrl: string;\n balance: number;\n transactionHistory: TransactionHistory[];\n maxTokens?: number;\n headers?: Record<string, string>;\n}\n\n/**\n * RoutstrClient is the main SDK entry point\n */\nexport type AlertLevel = \"max\" | \"min\";\nexport type RoutstrClientMode = \"xcashu\" | \"lazyrefund\" | \"apikeys\";\nexport type DebugLevel = \"DEBUG\" | \"WARN\" | \"ERROR\";\n\nconst TOPUP_MARGIN = 1.2;\n\nexport interface RouteRequestParams {\n path: string;\n method: string;\n body?: unknown;\n headers?: Record<string, string>;\n baseUrl: string;\n mintUrl: string;\n modelId?: string;\n}\n\nexport class RoutstrClient {\n private cashuSpender: CashuSpender;\n private balanceManager: BalanceManager;\n private streamProcessor: StreamProcessor;\n private providerManager: ProviderManager;\n private alertLevel: AlertLevel;\n private mode: RoutstrClientMode;\n private debugLevel: DebugLevel = \"WARN\";\n\n constructor(\n private walletAdapter: WalletAdapter,\n private storageAdapter: StorageAdapter,\n private providerRegistry: ProviderRegistry,\n alertLevel: AlertLevel,\n mode: RoutstrClientMode = \"xcashu\"\n ) {\n this.balanceManager = new BalanceManager(\n walletAdapter,\n storageAdapter,\n providerRegistry\n );\n this.cashuSpender = new CashuSpender(\n walletAdapter,\n storageAdapter,\n providerRegistry,\n this.balanceManager\n );\n this.streamProcessor = new StreamProcessor();\n this.providerManager = new ProviderManager(providerRegistry);\n this.alertLevel = alertLevel;\n this.mode = mode;\n }\n\n /**\n * Get the current client mode\n */\n getMode(): RoutstrClientMode {\n return this.mode;\n }\n\n getDebugLevel(): DebugLevel {\n return this.debugLevel;\n }\n\n setDebugLevel(level: DebugLevel): void {\n this.debugLevel = level;\n }\n\n private _log(level: \"DEBUG\" | \"WARN\" | \"ERROR\", ...args: unknown[]): void {\n const levelPriority: Record<DebugLevel, number> = {\n DEBUG: 0,\n WARN: 1,\n ERROR: 2,\n };\n\n if (levelPriority[level] >= levelPriority[this.debugLevel]) {\n switch (level) {\n case \"DEBUG\":\n console.log(...args);\n break;\n case \"WARN\":\n console.warn(...args);\n break;\n case \"ERROR\":\n console.error(...args);\n break;\n }\n }\n }\n\n /**\n * Get the CashuSpender instance\n */\n getCashuSpender(): CashuSpender {\n return this.cashuSpender;\n }\n\n /**\n * Get the BalanceManager instance\n */\n getBalanceManager(): BalanceManager {\n return this.balanceManager;\n }\n\n /**\n * Get the ProviderManager instance\n */\n getProviderManager(): ProviderManager {\n return this.providerManager;\n }\n\n /**\n * Check if the client is currently busy (in critical section)\n */\n get isBusy(): boolean {\n return this.cashuSpender.isBusy;\n }\n\n /**\n * Route an API request to the upstream provider\n *\n * This is a simpler alternative to fetchAIResponse that just proxies\n * the request upstream without the streaming callback machinery.\n * Useful for daemon-style routing where you just need to forward\n * requests and get responses back.\n */\n async routeRequest(params: RouteRequestParams): Promise<Response> {\n const {\n path,\n method,\n body,\n headers = {},\n baseUrl,\n mintUrl,\n modelId,\n } = params;\n\n await this._checkBalance();\n\n let requiredSats = 1;\n let selectedModel: Model | undefined;\n if (modelId) {\n const providerModel = await this.providerManager.getModelForProvider(\n baseUrl,\n modelId\n );\n selectedModel = providerModel ?? undefined;\n if (selectedModel) {\n requiredSats = this.providerManager.getRequiredSatsForModel(\n selectedModel,\n []\n );\n }\n }\n\n const { token, tokenBalance, tokenBalanceUnit } = await this._spendToken({\n mintUrl,\n amount: requiredSats,\n baseUrl,\n });\n this._log(\"DEBUG\", token, baseUrl);\n\n let requestBody = body;\n if (body && typeof body === \"object\") {\n const bodyObj = body as Record<string, unknown>;\n if (!bodyObj.stream) {\n requestBody = { ...bodyObj, stream: false };\n }\n }\n\n const baseHeaders = this._buildBaseHeaders(headers);\n const requestHeaders = this._withAuthHeader(baseHeaders, token);\n\n const response = await this._makeRequest({\n path,\n method,\n body: method === \"GET\" ? undefined : requestBody,\n baseUrl,\n mintUrl,\n token,\n requiredSats,\n headers: requestHeaders,\n baseHeaders,\n selectedModel,\n });\n\n const tokenBalanceInSats =\n tokenBalanceUnit === \"msat\" ? tokenBalance / 1000 : tokenBalance;\n const baseUrlUsed = (response as any).baseUrl || baseUrl;\n const tokenUsed = (response as any).token || token;\n const satsSpent = await this._handlePostResponseBalanceUpdate({\n token: tokenUsed,\n baseUrl: baseUrlUsed,\n initialTokenBalance: tokenBalanceInSats,\n response,\n });\n\n return response;\n }\n\n /**\n * Fetch AI response with streaming\n */\n async fetchAIResponse(\n options: FetchOptions,\n callbacks: StreamingCallbacks\n ): Promise<void> {\n const {\n messageHistory,\n selectedModel,\n baseUrl,\n mintUrl,\n balance,\n transactionHistory,\n maxTokens,\n headers,\n } = options;\n\n // Convert messages for API\n const apiMessages = await this._convertMessages(messageHistory);\n\n // Calculate required amount\n const requiredSats = this.providerManager.getRequiredSatsForModel(\n selectedModel,\n apiMessages,\n maxTokens\n );\n\n try {\n // Check balance first\n await this._checkBalance();\n\n // Spend tokens\n callbacks.onPaymentProcessing?.(true);\n\n const spendResult = await this._spendToken({\n mintUrl,\n amount: requiredSats,\n baseUrl,\n });\n\n let token = spendResult.token;\n let tokenBalance = spendResult.tokenBalance;\n let tokenBalanceUnit = spendResult.tokenBalanceUnit;\n\n const tokenBalanceInSats =\n tokenBalanceUnit === \"msat\" ? tokenBalance / 1000 : tokenBalance;\n\n callbacks.onTokenCreated?.(this._getPendingCashuTokenAmount());\n\n const baseHeaders = this._buildBaseHeaders(headers);\n const requestHeaders = this._withAuthHeader(baseHeaders, token);\n\n // Reset failed providers for new request\n this.providerManager.resetFailedProviders();\n\n // Get provider info for version compatibility\n const providerInfo = await this.providerRegistry.getProviderInfo(baseUrl);\n const providerVersion = providerInfo?.version ?? \"\";\n\n // Handle v0.1.x providers (only send leaf ID)\n let modelIdForRequest = selectedModel.id;\n if (/^0\\.1\\./.test(providerVersion)) {\n const newModel = await this.providerManager.getModelForProvider(\n baseUrl,\n selectedModel.id\n );\n modelIdForRequest = newModel?.id ?? selectedModel.id;\n }\n\n const body: any = {\n model: modelIdForRequest,\n messages: apiMessages,\n stream: true,\n };\n\n if (maxTokens !== undefined) {\n body.max_tokens = maxTokens;\n }\n\n // Only add tools for OpenAI models\n if (selectedModel?.name?.startsWith(\"OpenAI:\")) {\n body.tools = [{ type: \"web_search\" }];\n }\n\n // Make API request\n const response = await this._makeRequest({\n path: \"/v1/chat/completions\",\n method: \"POST\",\n body,\n selectedModel,\n baseUrl,\n mintUrl,\n token,\n requiredSats,\n maxTokens,\n headers: requestHeaders,\n baseHeaders,\n });\n\n if (!response.body) {\n throw new Error(\"Response body is not available\");\n }\n\n // Process streaming response\n if (response.status === 200) {\n const baseUrlUsed = (response as any).baseUrl || baseUrl;\n\n const streamingResult = await this.streamProcessor.process(\n response,\n {\n onContent: callbacks.onStreamingUpdate,\n onThinking: callbacks.onThinkingUpdate,\n },\n selectedModel.id\n );\n\n // Handle finish reason\n if (streamingResult.finish_reason === \"content_filter\") {\n callbacks.onMessageAppend({\n role: \"assistant\",\n content: \"Your request was denied due to content filtering.\",\n });\n } else if (\n streamingResult.content ||\n (streamingResult.images && streamingResult.images.length > 0)\n ) {\n // Create assistant message\n const message = await this._createAssistantMessage(streamingResult);\n callbacks.onMessageAppend(message);\n } else {\n // No content received\n callbacks.onMessageAppend({\n role: \"system\",\n content: \"The provider did not respond to this request.\",\n });\n }\n\n // Clear streaming\n callbacks.onStreamingUpdate(\"\");\n callbacks.onThinkingUpdate(\"\");\n\n // Handle post-response refund (skip for xcashu mode - refund is in response)\n const isApikeysEstimate = this.mode === \"apikeys\";\n let satsSpent = await this._handlePostResponseBalanceUpdate({\n token,\n baseUrl: baseUrlUsed,\n initialTokenBalance: tokenBalanceInSats,\n fallbackSatsSpent: isApikeysEstimate\n ? this._getEstimatedCosts(selectedModel, streamingResult)\n : undefined,\n response,\n });\n const estimatedCosts = this._getEstimatedCosts(\n selectedModel,\n streamingResult\n );\n const onLastMessageSatsUpdate = callbacks.onLastMessageSatsUpdate as\n | ((satsSpent: number, estimatedCosts: number) => void)\n | undefined;\n onLastMessageSatsUpdate?.(satsSpent, estimatedCosts);\n } else {\n throw new Error(`${response.status} ${response.statusText}`);\n }\n } catch (error) {\n this._handleError(error, callbacks);\n } finally {\n callbacks.onPaymentProcessing?.(false);\n }\n }\n\n /**\n * Make the API request with failover support\n */\n private async _makeRequest(params: {\n path: string;\n method: string;\n body?: unknown;\n selectedModel?: Model;\n baseUrl: string;\n mintUrl: string;\n token: string;\n requiredSats: number;\n maxTokens?: number;\n headers: Record<string, string>;\n baseHeaders: Record<string, string>;\n retryCount?: number;\n }): Promise<Response> {\n const { path, method, body, baseUrl, token, headers } = params;\n\n try {\n const url = `${baseUrl.replace(/\\/$/, \"\")}${path}`;\n if (this.mode === \"xcashu\") this._log(\"DEBUG\", \"HEADERS,\", headers);\n this._log(\"DEBUG\", \"HEADERS,\", headers);\n const response = await fetch(url, {\n method,\n headers,\n body:\n body === undefined || method === \"GET\"\n ? undefined\n : JSON.stringify(body),\n });\n if (this.mode === \"xcashu\") this._log(\"DEBUG\", \"response,\", response);\n this._log(\"DEBUG\", \"response,\", response);\n\n (response as any).baseUrl = baseUrl;\n (response as any).token = token;\n\n if (!response.ok) {\n const requestId =\n response.headers.get(\"x-routstr-request-id\") || undefined;\n let bodyText: string | undefined;\n try {\n bodyText = await response.text();\n } catch (e) {\n bodyText = undefined;\n }\n return await this._handleErrorResponse(\n params,\n token,\n response.status,\n requestId,\n this.mode === \"xcashu\"\n ? (response.headers.get(\"x-cashu\") ?? undefined)\n : undefined,\n bodyText,\n params.retryCount ?? 0\n );\n }\n\n return response;\n } catch (error: any) {\n // Handle network errors with failover\n if (this._isNetworkError(error?.message || \"\")) {\n return await this._handleErrorResponse(\n params,\n token,\n -1, // just for Network Error to skip all statuses\n undefined,\n undefined,\n undefined,\n params.retryCount ?? 0\n );\n // return await this._handleNetworkError(error, params);\n }\n throw error;\n }\n }\n\n /**\n * Handle error responses with failover\n */\n private async _handleErrorResponse(\n params: {\n path: string;\n method: string;\n body?: unknown;\n selectedModel?: Model;\n baseUrl: string;\n mintUrl: string;\n token: string;\n requiredSats: number;\n maxTokens?: number;\n headers: Record<string, string>;\n baseHeaders: Record<string, string>;\n },\n token: string,\n status: number,\n requestId?: string,\n xCashuRefundToken?: string,\n responseBody?: string,\n retryCount: number = 0\n ): Promise<Response> {\n const MAX_RETRIES_PER_PROVIDER = 2;\n const { path, method, body, selectedModel, baseUrl, mintUrl } = params;\n let tryNextProvider: boolean = false;\n\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: status=${status}, baseUrl=${baseUrl}, mode=${this.mode}, token preview=${token}, requestId=${requestId}`\n );\n\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Attempting to receive/restore token for ${baseUrl}`\n );\n if (params.token.startsWith(\"cashu\")) {\n const tryReceiveTokenResult = await this.cashuSpender.receiveToken(\n params.token\n );\n if (tryReceiveTokenResult.success) {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Token restored successfully, amount=${tryReceiveTokenResult.amount}`\n );\n tryNextProvider = true;\n if (this.mode === \"lazyrefund\")\n this.storageAdapter.removeToken(baseUrl);\n } else {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Failed to receive token. `\n );\n }\n }\n\n if (this.mode === \"xcashu\") {\n if (xCashuRefundToken) {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Attempting to receive xcashu refund token, preview=${xCashuRefundToken.substring(0, 20)}...`\n );\n try {\n const receiveResult =\n await this.cashuSpender.receiveToken(xCashuRefundToken);\n if (receiveResult.success) {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: xcashu refund received, amount=${receiveResult.amount}`\n );\n tryNextProvider = true;\n } else\n throw new ProviderError(\n baseUrl,\n status,\n \"xcashu refund failed\",\n requestId\n );\n } catch (error) {\n this._log(\"ERROR\", \"[xcashu] Failed to receive refund token:\", error);\n throw new ProviderError(\n baseUrl,\n status,\n \"[xcashu] Failed to receive refund token\",\n requestId\n );\n }\n } else {\n if (!tryNextProvider)\n throw new ProviderError(\n baseUrl,\n status,\n \"[xcashu] Failed to receive refund token\",\n requestId\n );\n }\n }\n\n if (\n status === 402 &&\n !tryNextProvider &&\n (this.mode === \"apikeys\" || this.mode === \"lazyrefund\")\n ) {\n this.storageAdapter.getApiKey(baseUrl);\n\n let topupAmount = params.requiredSats;\n\n try {\n let currentBalance = 0;\n\n if (this.mode === \"apikeys\") {\n const currentBalanceInfo = await this.balanceManager.getTokenBalance(\n params.token,\n baseUrl\n );\n currentBalance =\n currentBalanceInfo.unit === \"msat\"\n ? currentBalanceInfo.amount / 1000\n : currentBalanceInfo.amount;\n } else if (this.mode === \"lazyrefund\") {\n const distribution = this.storageAdapter.getCachedTokenDistribution();\n const tokenEntry = distribution.find((t) => t.baseUrl === baseUrl);\n currentBalance = tokenEntry?.amount ?? 0;\n }\n\n const shortfall = Math.max(0, params.requiredSats - currentBalance);\n topupAmount = shortfall > 0 ? shortfall : params.requiredSats;\n } catch (e) {\n this._log(\n \"WARN\",\n \"Could not get current token balance for topup calculation:\",\n e\n );\n }\n\n const topupResult = await this.balanceManager.topUp({\n mintUrl,\n baseUrl,\n amount: topupAmount * TOPUP_MARGIN,\n token: params.token,\n });\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Topup result for ${baseUrl}: success=${topupResult.success}, message=${topupResult.message}`\n );\n\n if (!topupResult.success) {\n const message = topupResult.message || \"\";\n if (message.includes(\"Insufficient balance\")) {\n const needMatch = message.match(/need (\\d+)/);\n const haveMatch = message.match(/have (\\d+)/);\n const required = needMatch\n ? parseInt(needMatch[1], 10)\n : params.requiredSats;\n const available = haveMatch ? parseInt(haveMatch[1], 10) : 0;\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Insufficient balance, need=${required}, have=${available}`\n );\n throw new InsufficientBalanceError(required, available, 0, \"\", message);\n } else {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Topup failed with non-insufficient-balance error, will try next provider`\n );\n tryNextProvider = true;\n }\n } else {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Topup successful, will retry with new token`\n );\n }\n if (!tryNextProvider) {\n if (retryCount < MAX_RETRIES_PER_PROVIDER) {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Retrying 402 (attempt ${retryCount + 1}/${MAX_RETRIES_PER_PROVIDER})`\n );\n return this._makeRequest({\n ...params,\n token: params.token,\n headers: this._withAuthHeader(params.baseHeaders, params.token),\n retryCount: retryCount + 1,\n });\n } else {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: 402 retry limit reached (${retryCount}/${MAX_RETRIES_PER_PROVIDER}), failing over to next provider`\n );\n tryNextProvider = true;\n }\n }\n }\n\n const isInsufficientBalance413 =\n status === 413 && responseBody?.includes(\"Insufficient balance\");\n\n if (\n isInsufficientBalance413 &&\n !tryNextProvider &&\n this.mode === \"apikeys\"\n ) {\n let retryToken = params.token;\n\n try {\n const latestBalanceInfo = await this.balanceManager.getTokenBalance(\n params.token,\n baseUrl\n );\n\n // Handle invalid/expired API key - delete and fail over\n if (latestBalanceInfo.isInvalidApiKey) {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Invalid API key (proofs already spent), removing for ${baseUrl}`\n );\n this.storageAdapter.removeApiKey(baseUrl);\n tryNextProvider = true;\n } else {\n const latestTokenBalance =\n latestBalanceInfo.unit === \"msat\"\n ? latestBalanceInfo.amount / 1000\n : latestBalanceInfo.amount;\n\n if (latestBalanceInfo.apiKey) {\n const storedApiKeyEntry = this.storageAdapter.getApiKey(baseUrl);\n if (storedApiKeyEntry?.key !== latestBalanceInfo.apiKey) {\n if (storedApiKeyEntry) {\n this.storageAdapter.removeApiKey(baseUrl);\n }\n this.storageAdapter.setApiKey(baseUrl, latestBalanceInfo.apiKey);\n }\n retryToken = latestBalanceInfo.apiKey;\n }\n\n if (latestTokenBalance >= 0) {\n this.storageAdapter.updateApiKeyBalance(\n baseUrl,\n latestTokenBalance\n );\n }\n }\n } catch (error) {\n this._log(\n \"WARN\",\n `[RoutstrClient] _handleErrorResponse: Failed to refresh API key after 413 insufficient balance for ${baseUrl}`,\n error\n );\n }\n\n if (retryCount < MAX_RETRIES_PER_PROVIDER) {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Retrying 413 (attempt ${retryCount + 1}/${MAX_RETRIES_PER_PROVIDER})`\n );\n return this._makeRequest({\n ...params,\n token: retryToken,\n headers: this._withAuthHeader(params.baseHeaders, retryToken),\n retryCount: retryCount + 1,\n });\n } else {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: 413 retry limit reached (${retryCount}/${MAX_RETRIES_PER_PROVIDER}), failing over to next provider`\n );\n tryNextProvider = true;\n }\n }\n\n if (\n (status === 401 ||\n status === 403 ||\n status === 413 ||\n status === 400 ||\n status === 500 ||\n status === 502 ||\n status === 503 ||\n status === 504 ||\n status === 521) &&\n !tryNextProvider\n ) {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Status ${status} (auth/server error), attempting refund for ${baseUrl}, mode=${this.mode}`\n );\n if (this.mode === \"lazyrefund\") {\n try {\n // Refund current token\n const refundResult = await this.balanceManager.refund({\n mintUrl,\n baseUrl,\n token: params.token,\n });\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Lazyrefund result: success=${refundResult.success}`\n );\n if (refundResult.success) this.storageAdapter.removeToken(baseUrl);\n else\n throw new ProviderError(\n baseUrl,\n status,\n \"refund failed\",\n requestId\n );\n } catch (error) {\n throw new ProviderError(\n baseUrl,\n status,\n \"Failed to refund token\",\n requestId\n );\n }\n } else if (this.mode === \"apikeys\") {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Attempting API key refund for ${baseUrl}, key preview=${token}`\n );\n const initialBalance = await this.balanceManager.getTokenBalance(\n token,\n baseUrl\n );\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Initial API key balance: ${initialBalance.amount}`\n );\n const refundResult = await this.balanceManager.refundApiKey({\n mintUrl,\n baseUrl,\n apiKey: token,\n });\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: API key refund result: success=${refundResult.success}, message=${refundResult.message}`\n );\n if (!refundResult.success && initialBalance.amount > 0) {\n throw new ProviderError(\n baseUrl,\n status,\n refundResult.message ?? \"Unknown error\"\n );\n }\n }\n }\n\n this.providerManager.markFailed(baseUrl);\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Marked provider ${baseUrl} as failed`\n );\n\n if (!selectedModel) {\n throw new ProviderError(\n baseUrl,\n status,\n \"Funny, no selected model. HMM. \"\n );\n }\n\n const nextProvider = this.providerManager.findNextBestProvider(\n selectedModel.id,\n baseUrl\n );\n\n if (nextProvider) {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Failing over to next provider: ${nextProvider}, model: ${selectedModel.id}`\n );\n // Get new model for this provider\n const newModel =\n (await this.providerManager.getModelForProvider(\n nextProvider,\n selectedModel.id\n )) ?? selectedModel;\n\n const messagesForPricing = Array.isArray(\n (body as { messages?: unknown })?.messages\n )\n ? ((body as { messages?: unknown }).messages as any[])\n : [];\n\n const newRequiredSats = this.providerManager.getRequiredSatsForModel(\n newModel,\n messagesForPricing,\n params.maxTokens\n );\n\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Creating new token for failover provider ${nextProvider}, required sats: ${newRequiredSats}`\n );\n const spendResult = await this._spendToken({\n mintUrl,\n amount: newRequiredSats,\n baseUrl: nextProvider,\n });\n\n // Retry with new provider (reset retry count)\n return this._makeRequest({\n ...params,\n path,\n method,\n body,\n baseUrl: nextProvider,\n selectedModel: newModel,\n token: spendResult.token!,\n requiredSats: newRequiredSats,\n headers: this._withAuthHeader(params.baseHeaders, spendResult.token!),\n retryCount: 0,\n });\n }\n\n // No more providers to try\n throw new FailoverError(baseUrl, Array.from(this.providerManager as any));\n }\n\n /**\n * Handle post-response balance update for all modes\n */\n private async _handlePostResponseBalanceUpdate(params: {\n token: string;\n baseUrl: string;\n initialTokenBalance: number;\n fallbackSatsSpent?: number;\n response?: Response;\n }): Promise<number> {\n const { token, baseUrl, initialTokenBalance, fallbackSatsSpent, response } =\n params;\n\n let satsSpent: number = initialTokenBalance;\n\n if (this.mode === \"xcashu\" && response) {\n const refundToken = response.headers.get(\"x-cashu\") ?? undefined;\n if (refundToken) {\n try {\n const receiveResult =\n await this.cashuSpender.receiveToken(refundToken);\n satsSpent =\n initialTokenBalance -\n receiveResult.amount * (receiveResult.unit == \"sat\" ? 1 : 1000);\n } catch (error) {\n this._log(\"ERROR\", \"[xcashu] Failed to receive refund token:\", error);\n }\n }\n } else if (this.mode === \"lazyrefund\") {\n const latestBalanceInfo = await this.balanceManager.getTokenBalance(\n token,\n baseUrl\n );\n const latestTokenBalance =\n latestBalanceInfo.unit === \"msat\"\n ? latestBalanceInfo.amount / 1000\n : latestBalanceInfo.amount;\n this.storageAdapter.updateTokenBalance(baseUrl, latestTokenBalance);\n satsSpent = initialTokenBalance - latestTokenBalance;\n } else if (this.mode === \"apikeys\") {\n try {\n const latestBalanceInfo = await this.balanceManager.getTokenBalance(\n token,\n baseUrl\n );\n this._log(\n \"DEBUG\",\n \"LATEST Balance\",\n latestBalanceInfo.amount,\n latestBalanceInfo.reserved,\n latestBalanceInfo.apiKey,\n baseUrl\n );\n const latestTokenBalance =\n latestBalanceInfo.unit === \"msat\"\n ? latestBalanceInfo.amount / 1000\n : latestBalanceInfo.amount;\n\n const storedApiKeyEntry = this.storageAdapter.getApiKey(baseUrl);\n if (\n storedApiKeyEntry?.key.startsWith(\"cashu\") &&\n latestBalanceInfo.apiKey\n ) {\n this.storageAdapter.removeApiKey(baseUrl);\n this.storageAdapter.setApiKey(baseUrl, latestBalanceInfo.apiKey);\n }\n this.storageAdapter.updateApiKeyBalance(baseUrl, latestTokenBalance);\n\n satsSpent = initialTokenBalance - latestTokenBalance;\n } catch (e) {\n this._log(\"WARN\", \"Could not get updated API key balance:\", e);\n satsSpent = fallbackSatsSpent ?? initialTokenBalance;\n }\n }\n\n return satsSpent;\n }\n\n /**\n * Convert messages for API format\n */\n private async _convertMessages(messages: Message[]): Promise<any[]> {\n return Promise.all(\n messages\n .filter((m) => m.role !== \"system\")\n .map(async (m) => ({\n role: m.role,\n content: typeof m.content === \"string\" ? m.content : m.content,\n }))\n );\n }\n\n /**\n * Create assistant message from streaming result\n */\n private async _createAssistantMessage(\n result: StreamingResult\n ): Promise<Message> {\n if (result.images && result.images.length > 0) {\n // Multimodal message with images\n const content: any[] = [];\n\n if (result.content) {\n content.push({\n type: \"text\",\n text: result.content,\n thinking: result.thinking,\n citations: result.citations,\n annotations: result.annotations,\n });\n }\n\n for (const img of result.images) {\n content.push({\n type: \"image_url\",\n image_url: {\n url: img.image_url.url,\n },\n });\n }\n\n return {\n role: \"assistant\",\n content,\n };\n }\n\n // Simple text message\n return {\n role: \"assistant\",\n content: result.content || \"\",\n };\n }\n\n /**\n * Create a child key for a parent API key via the provider's API\n * POST /v1/balance/child-key\n */\n private async _createChildKey(\n baseUrl: string,\n parentApiKey: string,\n options?: {\n count?: number;\n balanceLimit?: number;\n balanceLimitReset?: string;\n validityDate?: number;\n }\n ): Promise<{\n childKey: string;\n balance: number;\n balanceLimit?: number;\n validityDate?: number;\n }> {\n const response = await fetch(`${baseUrl}v1/balance/child-key`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${parentApiKey}`,\n },\n body: JSON.stringify({\n count: options?.count ?? 1,\n balance_limit: options?.balanceLimit,\n balance_limit_reset: options?.balanceLimitReset,\n validity_date: options?.validityDate,\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to create child key: ${response.status} ${await response.text()}`\n );\n }\n\n const data = await response.json();\n\n return {\n childKey: data.api_keys?.[0],\n balance: data.balance ?? 0,\n balanceLimit: data.balance_limit,\n validityDate: data.validity_date,\n };\n }\n\n /**\n * Calculate estimated costs from usage\n */\n private _getEstimatedCosts(\n selectedModel: Model,\n streamingResult: StreamingResult\n ): number {\n let estimatedCosts = 0;\n if (streamingResult.usage) {\n const { completion_tokens, prompt_tokens } = streamingResult.usage;\n if (completion_tokens !== undefined && prompt_tokens !== undefined) {\n estimatedCosts =\n (selectedModel.sats_pricing?.completion ?? 0) * completion_tokens +\n (selectedModel.sats_pricing?.prompt ?? 0) * prompt_tokens;\n }\n }\n return estimatedCosts;\n }\n\n /**\n * Get pending cashu token amount\n */\n private _getPendingCashuTokenAmount(): number {\n const distribution = this.storageAdapter.getCachedTokenDistribution();\n return distribution.reduce((total, item) => total + item.amount, 0);\n }\n\n /**\n * Check if error message indicates a network error\n */\n private _isNetworkError(message: string): boolean {\n return (\n message.includes(\"NetworkError when attempting to fetch resource\") ||\n message.includes(\"Failed to fetch\") ||\n message.includes(\"Load failed\")\n );\n }\n\n /**\n * Handle errors and notify callbacks\n */\n private _handleError(error: unknown, callbacks: StreamingCallbacks): void {\n this._log(\"ERROR\", \"[RoutstrClient] _handleError: Error occurred\", error);\n\n if (error instanceof Error) {\n const isStreamError =\n error.message.includes(\"Error in input stream\") ||\n error.message.includes(\"Load failed\");\n const modifiedErrorMsg = isStreamError\n ? \"AI stream was cut off, turn on Keep Active or please try again\"\n : error.message;\n\n this._log(\n \"ERROR\",\n `[RoutstrClient] _handleError: Error type=${error.constructor.name}, message=${modifiedErrorMsg}, isStreamError=${isStreamError}`\n );\n\n callbacks.onMessageAppend({\n role: \"system\",\n content:\n \"Uncaught Error: \" +\n modifiedErrorMsg +\n (this.alertLevel === \"max\" ? \" | \" + error.stack : \"\"),\n });\n } else {\n callbacks.onMessageAppend({\n role: \"system\",\n content: \"Unknown Error: Please tag Routstr on Nostr and/or retry.\",\n });\n }\n }\n\n /**\n * Check wallet balance and throw if insufficient\n */\n private async _checkBalance(): Promise<void> {\n const balances = await this.walletAdapter.getBalances();\n const totalBalance = Object.values(balances).reduce((sum, v) => sum + v, 0);\n\n if (totalBalance <= 0) {\n throw new InsufficientBalanceError(1, 0);\n }\n }\n\n /**\n * Spend a token using CashuSpender with standardized error handling\n */\n private async _spendToken(params: {\n mintUrl: string;\n amount: number;\n baseUrl: string;\n }): Promise<{\n token: string;\n tokenBalance: number;\n tokenBalanceUnit: \"sat\" | \"msat\";\n }> {\n const { mintUrl, amount, baseUrl } = params;\n\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _spendToken: mode=${this.mode}, amount=${amount}, baseUrl=${baseUrl}, mintUrl=${mintUrl}`\n );\n\n if (this.mode === \"apikeys\") {\n let parentApiKey = this.storageAdapter.getApiKey(baseUrl);\n if (!parentApiKey) {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _spendToken: No existing API key for ${baseUrl}, creating new one via Cashu`\n );\n const spendResult = await this.cashuSpender.spend({\n mintUrl: mintUrl,\n amount: amount * TOPUP_MARGIN,\n baseUrl: \"\",\n reuseToken: false,\n });\n\n if (!spendResult.token) {\n this._log(\n \"ERROR\",\n `[RoutstrClient] _spendToken: Failed to create Cashu token for API key creation, error:`,\n spendResult.error\n );\n throw new Error(\n `[RoutstrClient] _spendToken: Failed to create Cashu token for API key creation, error: ${spendResult.error}`\n );\n } else {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _spendToken: Cashu token created, token preview: ${spendResult.token}`\n );\n }\n\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _spendToken: Created API key for ${baseUrl}, key preview: ${spendResult.token}, balance: ${spendResult.balance}`\n );\n\n try {\n this.storageAdapter.setApiKey(baseUrl, spendResult.token);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"ApiKey already exists\")\n ) {\n const tryReceiveTokenResult = await this.cashuSpender.receiveToken(\n spendResult.token\n );\n if (tryReceiveTokenResult.success) {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Token restored successfully, amount=${tryReceiveTokenResult.amount}`\n );\n } else {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _handleErrorResponse: Token restore failed or not needed`\n );\n }\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _spendToken: API key already exists for ${baseUrl}, using existing key`\n );\n } else {\n throw error;\n }\n }\n parentApiKey = this.storageAdapter.getApiKey(baseUrl);\n } else {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _spendToken: Using existing API key for ${baseUrl}, key preview: ${parentApiKey.key}`\n );\n }\n\n let tokenBalance = 0;\n let tokenBalanceUnit: \"sat\" | \"msat\" = \"sat\";\n\n const apiKeyDistribution = this.storageAdapter.getApiKeyDistribution();\n const distributionForBaseUrl = apiKeyDistribution.find(\n (d) => d.baseUrl === baseUrl\n );\n if (distributionForBaseUrl) {\n tokenBalance = distributionForBaseUrl.amount;\n }\n\n if (tokenBalance === 0 && parentApiKey) {\n try {\n const balanceInfo = await this.balanceManager.getTokenBalance(\n parentApiKey.key,\n baseUrl\n );\n tokenBalance = balanceInfo.amount;\n tokenBalanceUnit = balanceInfo.unit;\n } catch (e) {\n this._log(\"WARN\", \"Could not get initial API key balance:\", e);\n }\n }\n\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _spendToken: Returning token with balance=${tokenBalance} ${tokenBalanceUnit}`\n );\n\n return {\n token: parentApiKey?.key ?? \"\",\n tokenBalance,\n tokenBalanceUnit,\n };\n }\n\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _spendToken: Calling CashuSpender.spend for amount=${amount}, mintUrl=${mintUrl}, mode=${this.mode}`\n );\n const spendResult = await this.cashuSpender.spend({\n mintUrl,\n amount,\n baseUrl: this.mode === \"lazyrefund\" ? baseUrl : \"\",\n reuseToken: this.mode === \"lazyrefund\",\n });\n\n if (!spendResult.token) {\n this._log(\n \"ERROR\",\n `[RoutstrClient] _spendToken: CashuSpender.spend failed, error:`,\n spendResult.error\n );\n } else {\n this._log(\n \"DEBUG\",\n `[RoutstrClient] _spendToken: Cashu token created, token preview: ${spendResult.token}, balance: ${spendResult.balance} ${spendResult.unit ?? \"sat\"}`\n );\n }\n\n return {\n token: spendResult.token!,\n tokenBalance: spendResult.balance,\n tokenBalanceUnit: spendResult.unit ?? \"sat\",\n };\n }\n\n /**\n * Build request headers with common defaults and dev mock controls\n */\n private _buildBaseHeaders(\n additionalHeaders: Record<string, string> = {},\n token?: string\n ): Record<string, string> {\n const headers: Record<string, string> = {\n ...additionalHeaders,\n \"Content-Type\": \"application/json\",\n };\n\n return headers;\n }\n\n /**\n * Attach auth headers using the active client mode\n */\n private _withAuthHeader(\n headers: Record<string, string>,\n token: string\n ): Record<string, string> {\n const nextHeaders = { ...headers };\n\n if (this.mode === \"xcashu\") {\n nextHeaders[\"X-Cashu\"] = token;\n } else {\n nextHeaders[\"Authorization\"] = `Bearer ${token}`;\n }\n\n return nextHeaders;\n }\n}\n","import type { StorageDriver } from \"../types\";\n\nconst canUseLocalStorage = (): boolean => {\n return (\n typeof window !== \"undefined\" && typeof window.localStorage !== \"undefined\"\n );\n};\n\nconst isQuotaExceeded = (error: unknown): boolean => {\n const e = error as { name?: string; code?: number } | null;\n return (\n !!e &&\n (e?.name === \"QuotaExceededError\" || e?.code === 22 || e?.code === 1014)\n );\n};\n\nconst NON_CRITICAL_KEYS = new Set<string>([\"modelsFromAllProviders\"]);\n\nexport const localStorageDriver: StorageDriver = {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n if (!canUseLocalStorage()) return defaultValue;\n try {\n const item = window.localStorage.getItem(key);\n if (item === null) return defaultValue;\n try {\n return JSON.parse(item) as T;\n } catch (parseError) {\n if (typeof defaultValue === \"string\") {\n return item as T;\n }\n throw parseError;\n }\n } catch (error) {\n console.error(`Error retrieving item with key \"${key}\":`, error);\n if (canUseLocalStorage()) {\n try {\n window.localStorage.removeItem(key);\n } catch (removeError) {\n console.error(\n `Error removing corrupted item with key \"${key}\":`,\n removeError\n );\n }\n }\n return defaultValue;\n }\n },\n async setItem<T>(key: string, value: T): Promise<void> {\n if (!canUseLocalStorage()) return;\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n if (isQuotaExceeded(error)) {\n if (NON_CRITICAL_KEYS.has(key)) {\n console.warn(\n `Storage quota exceeded; skipping non-critical key \"${key}\".`\n );\n return;\n }\n try {\n window.localStorage.removeItem(\"modelsFromAllProviders\");\n } catch {}\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n return;\n } catch (retryError) {\n console.warn(\n `Storage quota exceeded; unable to persist key \"${key}\" after cleanup attempt.`,\n retryError\n );\n return;\n }\n }\n console.error(`Error storing item with key \"${key}\":`, error);\n }\n },\n async removeItem(key: string): Promise<void> {\n if (!canUseLocalStorage()) return;\n try {\n window.localStorage.removeItem(key);\n } catch (error) {\n console.error(`Error removing item with key \"${key}\":`, error);\n }\n },\n};\n","import type { StorageDriver } from \"../types\";\n\nexport const createMemoryDriver = (\n seed?: Record<string, string>\n): StorageDriver => {\n const store = new Map<string, string>();\n\n if (seed) {\n for (const [key, value] of Object.entries(seed)) {\n store.set(key, value);\n }\n }\n\n return {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n const item = store.get(key);\n if (item === undefined) return defaultValue;\n try {\n return JSON.parse(item) as T;\n } catch (parseError) {\n if (typeof defaultValue === \"string\") {\n return item as T;\n }\n throw parseError;\n }\n },\n async setItem<T>(key: string, value: T): Promise<void> {\n store.set(key, JSON.stringify(value));\n },\n async removeItem(key: string): Promise<void> {\n store.delete(key);\n },\n };\n};\n","import type { StorageDriver } from \"../types\";\n\ntype BetterSqlite3Database = {\n prepare: (sql: string) => {\n run: (...params: any[]) => { changes: number };\n get: (...params: any[]) => any;\n };\n exec: (sql: string) => void;\n close?: () => void;\n};\n\nexport interface SqliteDriverOptions {\n dbPath?: string;\n tableName?: string;\n}\n\nconst isBun = (): boolean => {\n return typeof process.versions.bun !== \"undefined\";\n};\n\nconst createDatabase = (dbPath: string): BetterSqlite3Database => {\n if (isBun()) {\n throw new Error(\n \"SQLite driver not supported in Bun. Use createMemoryDriver() instead.\"\n );\n }\n\n let Database: any = null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n Database = require(\"better-sqlite3\");\n } catch (error) {\n throw new Error(\n `better-sqlite3 is required for sqlite storage. Install it to use sqlite storage. (${error})`\n );\n }\n return new Database(dbPath);\n};\n\nexport const createSqliteDriver = (\n options: SqliteDriverOptions = {}\n): StorageDriver => {\n const dbPath = options.dbPath || \"routstr.sqlite\";\n const tableName = options.tableName || \"sdk_storage\";\n\n const db = createDatabase(dbPath);\n db.exec(\n `CREATE TABLE IF NOT EXISTS ${tableName} (key TEXT PRIMARY KEY, value TEXT NOT NULL)`\n );\n\n const selectStmt = db.prepare(`SELECT value FROM ${tableName} WHERE key = ?`);\n const upsertStmt = db.prepare(\n `INSERT INTO ${tableName} (key, value) VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value`\n );\n const deleteStmt = db.prepare(`DELETE FROM ${tableName} WHERE key = ?`);\n\n return {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n try {\n const row = selectStmt.get(key);\n if (!row || typeof row.value !== \"string\") return defaultValue;\n try {\n return JSON.parse(row.value) as T;\n } catch (parseError) {\n if (typeof defaultValue === \"string\") {\n return row.value as T;\n }\n throw parseError;\n }\n } catch (error) {\n console.error(`SQLite getItem failed for key \"${key}\":`, error);\n return defaultValue;\n }\n },\n async setItem<T>(key: string, value: T): Promise<void> {\n try {\n upsertStmt.run(key, JSON.stringify(value));\n } catch (error) {\n console.error(`SQLite setItem failed for key \"${key}\":`, error);\n }\n },\n async removeItem(key: string): Promise<void> {\n try {\n deleteStmt.run(key);\n } catch (error) {\n console.error(`SQLite removeItem failed for key \"${key}\":`, error);\n }\n },\n };\n};\n","import type { StorageDriver } from \"../types\";\n\nexport interface IndexedDBDriverOptions {\n dbName?: string;\n storeName?: string;\n}\n\nconst isBrowser = typeof indexedDB !== \"undefined\";\n\nconst openDatabase = (\n dbName: string,\n storeName: string\n): Promise<IDBDatabase> => {\n if (!isBrowser) {\n return Promise.reject(new Error(\"IndexedDB is not available\"));\n }\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(dbName, 1);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(storeName)) {\n db.createObjectStore(storeName);\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n};\n\nexport const createIndexedDBDriver = (\n options: IndexedDBDriverOptions = {}\n): StorageDriver => {\n const dbName = options.dbName || \"routstr-sdk\";\n const storeName = options.storeName || \"sdk_storage\";\n\n let dbPromise: Promise<IDBDatabase> | null = null;\n\n const getDb = (): Promise<IDBDatabase> => {\n if (!dbPromise) {\n dbPromise = openDatabase(dbName, storeName);\n }\n return dbPromise;\n };\n\n return {\n async getItem<T>(key: string, defaultValue: T): Promise<T> {\n try {\n const db = await getDb();\n return new Promise<T>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readonly\");\n const store = tx.objectStore(storeName);\n const request = store.get(key);\n\n request.onsuccess = () => {\n const raw = request.result;\n if (raw === undefined) {\n resolve(defaultValue);\n return;\n }\n // Values are stored as raw JSON strings\n if (typeof raw === \"string\") {\n try {\n resolve(JSON.parse(raw) as T);\n } catch {\n if (typeof defaultValue === \"string\") {\n resolve(raw as T);\n } else {\n resolve(defaultValue);\n }\n }\n } else {\n // If stored as a native JS value (e.g. from a previous driver)\n resolve(raw as T);\n }\n };\n request.onerror = () => reject(request.error);\n });\n } catch (error) {\n console.error(`IndexedDB getItem failed for key \"${key}\":`, error);\n return defaultValue;\n }\n },\n\n async setItem<T>(key: string, value: T): Promise<void> {\n try {\n const db = await getDb();\n return new Promise<void>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readwrite\");\n const store = tx.objectStore(storeName);\n store.put(JSON.stringify(value), key);\n\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n } catch (error) {\n console.error(`IndexedDB setItem failed for key \"${key}\":`, error);\n }\n },\n\n async removeItem(key: string): Promise<void> {\n try {\n const db = await getDb();\n return new Promise<void>((resolve, reject) => {\n const tx = db.transaction(storeName, \"readwrite\");\n const store = tx.objectStore(storeName);\n store.delete(key);\n\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n } catch (error) {\n console.error(`IndexedDB removeItem failed for key \"${key}\":`, error);\n }\n },\n };\n};\n","export const SDK_STORAGE_KEYS = {\n MODELS_FROM_ALL_PROVIDERS: \"modelsFromAllProviders\",\n LAST_USED_MODEL: \"lastUsedModel\",\n BASE_URLS_LIST: \"base_urls_list\",\n DISABLED_PROVIDERS: \"disabled_providers\",\n MINTS_FROM_ALL_PROVIDERS: \"mints_from_all_providers\",\n INFO_FROM_ALL_PROVIDERS: \"info_from_all_providers\",\n LAST_MODELS_UPDATE: \"lastModelsUpdate\",\n LAST_BASE_URLS_UPDATE: \"lastBaseUrlsUpdate\",\n LOCAL_CASHU_TOKENS: \"local_cashu_tokens\",\n API_KEYS: \"api_keys\",\n CHILD_KEYS: \"child_keys\",\n ROUTSTR21_MODELS: \"routstr21Models\",\n LAST_ROUTSTR21_MODELS_UPDATE: \"lastRoutstr21ModelsUpdate\",\n CACHED_RECEIVE_TOKENS: \"cached_receive_tokens\",\n USAGE_TRACKING: \"usage_tracking\",\n CLIENT_IDS: \"client_ids\",\n} as const;\n\nexport type SdkStorageKey =\n (typeof SDK_STORAGE_KEYS)[keyof typeof SDK_STORAGE_KEYS];\n","import { createStore, type StoreApi } from \"zustand/vanilla\";\nimport type { DiscoveryAdapter } from \"../discovery/interfaces\";\nimport type { StorageAdapter, ProviderRegistry } from \"../wallet/interfaces\";\nimport type { ProviderInfo, Model } from \"../core\";\nimport { getDecodedToken } from \"@cashu/cashu-ts\";\nimport { SDK_STORAGE_KEYS } from \"./keys\";\nimport type { StorageDriver, SdkStorageState } from \"./types\";\n\nconst normalizeBaseUrl = (baseUrl: string): string =>\n baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`;\n\nconst getCashuTokenBalance = (token: string): number => {\n try {\n const decoded = getDecodedToken(token);\n const unitDivisor = decoded.unit === \"msat\" ? 1000 : 1;\n let sum = 0;\n for (const proof of decoded.proofs) {\n sum += proof.amount / unitDivisor;\n }\n return sum;\n } catch {\n return 0;\n }\n};\n\nexport interface SdkStoreOptions {\n driver: StorageDriver;\n}\n\nexport interface SdkStorageStore extends SdkStorageState {\n setModelsFromAllProviders: (value: Record<string, Model[]>) => void;\n setLastUsedModel: (value: string | null) => void;\n setBaseUrlsList: (value: string[]) => void;\n setBaseUrlsLastUpdate: (value: number | null) => void;\n setDisabledProviders: (value: string[]) => void;\n setMintsFromAllProviders: (value: Record<string, string[]>) => void;\n setInfoFromAllProviders: (value: Record<string, ProviderInfo>) => void;\n setLastModelsUpdate: (value: Record<string, number>) => void;\n setCachedTokens: (\n value:\n | Array<{\n baseUrl: string;\n token: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n | ((\n current: SdkStorageStore[\"cachedTokens\"]\n ) => SdkStorageStore[\"cachedTokens\"])\n ) => void;\n setApiKeys: (\n value:\n | Array<{\n baseUrl: string;\n key: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n | ((current: SdkStorageStore[\"apiKeys\"]) => SdkStorageStore[\"apiKeys\"])\n ) => void;\n setChildKeys: (\n value: Array<{\n parentBaseUrl: string;\n childKey: string;\n balance?: number;\n balanceLimit?: number;\n validityDate?: number;\n createdAt?: number;\n }>\n ) => void;\n setRoutstr21Models: (value: string[]) => void;\n setRoutstr21ModelsLastUpdate: (value: number | null) => void;\n setCachedReceiveTokens: (\n value: Array<{\n token: string;\n amount: number;\n unit: \"sat\" | \"msat\";\n createdAt?: number;\n }>\n ) => void;\n setUsageTracking: (\n value: Array<{\n id: string;\n timestamp: number;\n modelId: string;\n baseUrl: string;\n requestId: string;\n cost: number;\n satsCost: number;\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n client?: string;\n sessionId?: string;\n tags?: string[];\n }>\n ) => void;\n setClientIds: (\n value:\n | Array<{\n clientId: string;\n name: string;\n apiKey: string;\n baseUrl: string;\n createdAt?: number;\n lastUsed?: number | null;\n }>\n | ((current: SdkStorageStore[\"clientIds\"]) => SdkStorageStore[\"clientIds\"])\n ) => void;\n}\n\n/** Store type returned after async initialization */\nexport type SdkStore = StoreApi<SdkStorageStore>;\n\nconst createEmptyStore = (driver: StorageDriver): SdkStore =>\n createStore<SdkStorageStore>((set, get) => ({\n modelsFromAllProviders: {},\n lastUsedModel: null,\n baseUrlsList: [],\n lastBaseUrlsUpdate: null,\n disabledProviders: [],\n mintsFromAllProviders: {},\n infoFromAllProviders: {},\n lastModelsUpdate: {},\n cachedTokens: [],\n apiKeys: [],\n childKeys: [],\n routstr21Models: [],\n lastRoutstr21ModelsUpdate: null,\n cachedReceiveTokens: [],\n usageTracking: [],\n clientIds: [],\n setModelsFromAllProviders: (value) => {\n const normalized: Record<string, Model[]> = {};\n for (const [baseUrl, models] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = models;\n }\n void driver.setItem(\n SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,\n normalized\n );\n set({ modelsFromAllProviders: normalized });\n },\n setLastUsedModel: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.LAST_USED_MODEL, value);\n set({ lastUsedModel: value });\n },\n setBaseUrlsList: (value) => {\n const normalized = value.map((url) => normalizeBaseUrl(url));\n void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);\n set({ baseUrlsList: normalized });\n },\n setBaseUrlsLastUpdate: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, value);\n set({ lastBaseUrlsUpdate: value });\n },\n setDisabledProviders: (value) => {\n const normalized = value.map((url) => normalizeBaseUrl(url));\n void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);\n set({ disabledProviders: normalized });\n },\n setMintsFromAllProviders: (value) => {\n const normalized: Record<string, string[]> = {};\n for (const [baseUrl, mints] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = mints.map((mint) =>\n mint.endsWith(\"/\") ? mint.slice(0, -1) : mint\n );\n }\n void driver.setItem(\n SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS,\n normalized\n );\n set({ mintsFromAllProviders: normalized });\n },\n setInfoFromAllProviders: (value) => {\n const normalized: Record<string, ProviderInfo> = {};\n for (const [baseUrl, info] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = info;\n }\n void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);\n set({ infoFromAllProviders: normalized });\n },\n setLastModelsUpdate: (value) => {\n const normalized: Record<string, number> = {};\n for (const [baseUrl, timestamp] of Object.entries(value)) {\n normalized[normalizeBaseUrl(baseUrl)] = timestamp;\n }\n void driver.setItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, normalized);\n set({ lastModelsUpdate: normalized });\n },\n setCachedTokens: (value) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.cachedTokens) : value;\n const normalized = updates.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance:\n typeof entry.balance === \"number\"\n ? entry.balance\n : getCashuTokenBalance(entry.token),\n lastUsed: entry.lastUsed ?? null,\n }));\n void driver.setItem(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, normalized);\n return { cachedTokens: normalized };\n });\n },\n setApiKeys: (value) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.apiKeys) : value;\n const normalized = updates.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance: entry.balance ?? 0,\n lastUsed: entry.lastUsed ?? null,\n }));\n void driver.setItem(SDK_STORAGE_KEYS.API_KEYS, normalized);\n return { apiKeys: normalized };\n });\n },\n setChildKeys: (\n value:\n | Array<{\n parentBaseUrl: string;\n childKey: string;\n balance?: number;\n balanceLimit?: number;\n validityDate?: number;\n createdAt?: number;\n }>\n | ((\n current: SdkStorageStore[\"childKeys\"]\n ) => SdkStorageStore[\"childKeys\"])\n ) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.childKeys) : value;\n const normalized = updates.map((entry) => ({\n parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),\n childKey: entry.childKey,\n balance: entry.balance ?? 0,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt ?? Date.now(),\n }));\n void driver.setItem(SDK_STORAGE_KEYS.CHILD_KEYS, normalized);\n return { childKeys: normalized };\n });\n },\n setRoutstr21Models: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, value);\n set({ routstr21Models: value });\n },\n setRoutstr21ModelsLastUpdate: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE, value);\n set({ lastRoutstr21ModelsUpdate: value });\n },\n setCachedReceiveTokens: (value) => {\n const normalized = value.map((entry) => ({\n token: entry.token,\n amount: entry.amount,\n unit: entry.unit || \"sat\",\n createdAt: entry.createdAt ?? Date.now(),\n }));\n void driver.setItem(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, normalized);\n set({ cachedReceiveTokens: normalized });\n },\n setUsageTracking: (value) => {\n void driver.setItem(SDK_STORAGE_KEYS.USAGE_TRACKING, value);\n set({ usageTracking: value });\n },\n setClientIds: (value) => {\n set((state) => {\n const updates =\n typeof value === \"function\" ? value(state.clientIds) : value;\n const normalized = updates.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n createdAt: entry.createdAt ?? Date.now(),\n lastUsed: entry.lastUsed ?? null,\n }));\n void driver.setItem(SDK_STORAGE_KEYS.CLIENT_IDS, normalized);\n return { clientIds: normalized };\n });\n },\n }));\n\nconst hydrateStoreFromDriver = async (\n store: SdkStore,\n driver: StorageDriver\n): Promise<void> => {\n const [\n rawModels,\n lastUsedModel,\n rawBaseUrls,\n lastBaseUrlsUpdate,\n rawDisabledProviders,\n rawMints,\n rawInfo,\n rawLastModelsUpdate,\n rawCachedTokens,\n rawApiKeys,\n rawChildKeys,\n rawRoutstr21Models,\n rawLastRoutstr21ModelsUpdate,\n rawCachedReceiveTokens,\n rawUsageTracking,\n rawClientIds,\n ] = await Promise.all([\n driver.getItem<Record<string, Model[]>>(\n SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,\n {}\n ),\n driver.getItem<string | null>(SDK_STORAGE_KEYS.LAST_USED_MODEL, null),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.BASE_URLS_LIST, []),\n driver.getItem<number | null>(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, null),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, []),\n driver.getItem<Record<string, string[]>>(\n SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS,\n {}\n ),\n driver.getItem<Record<string, ProviderInfo>>(\n SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS,\n {}\n ),\n driver.getItem<Record<string, number>>(\n SDK_STORAGE_KEYS.LAST_MODELS_UPDATE,\n {}\n ),\n driver.getItem<\n Array<{\n baseUrl: string;\n token: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n >(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, []),\n driver.getItem<\n Array<{\n baseUrl: string;\n key: string;\n balance?: number;\n lastUsed?: number | null;\n }>\n >(SDK_STORAGE_KEYS.API_KEYS, []),\n driver.getItem<\n Array<{\n parentBaseUrl: string;\n childKey: string;\n balance?: number;\n balanceLimit?: number;\n validityDate?: number;\n createdAt?: number;\n }>\n >(SDK_STORAGE_KEYS.CHILD_KEYS, []),\n driver.getItem<string[]>(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, []),\n driver.getItem<number | null>(\n SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE,\n null\n ),\n driver.getItem<\n Array<{\n token: string;\n amount: number;\n unit: \"sat\" | \"msat\";\n createdAt?: number;\n }>\n >(SDK_STORAGE_KEYS.CACHED_RECEIVE_TOKENS, []),\n driver.getItem<\n Array<{\n id: string;\n timestamp: number;\n modelId: string;\n baseUrl: string;\n requestId: string;\n cost: number;\n satsCost: number;\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n client?: string;\n sessionId?: string;\n tags?: string[];\n }>\n >(SDK_STORAGE_KEYS.USAGE_TRACKING, []),\n driver.getItem<\n Array<{\n clientId: string;\n name: string;\n apiKey: string;\n baseUrl: string;\n createdAt?: number;\n lastUsed?: number | null;\n }>\n >(SDK_STORAGE_KEYS.CLIENT_IDS, []),\n ]);\n\n const modelsFromAllProviders = Object.fromEntries(\n Object.entries(rawModels).map(([baseUrl, models]) => [\n normalizeBaseUrl(baseUrl),\n models,\n ])\n );\n\n const baseUrlsList = rawBaseUrls.map((url) => normalizeBaseUrl(url));\n\n const disabledProviders = rawDisabledProviders.map((url) =>\n normalizeBaseUrl(url)\n );\n\n const mintsFromAllProviders = Object.fromEntries(\n Object.entries(rawMints).map(([baseUrl, mints]) => [\n normalizeBaseUrl(baseUrl),\n mints.map((mint) => (mint.endsWith(\"/\") ? mint.slice(0, -1) : mint)),\n ])\n );\n\n const infoFromAllProviders = Object.fromEntries(\n Object.entries(rawInfo).map(([baseUrl, info]) => [\n normalizeBaseUrl(baseUrl),\n info,\n ])\n );\n\n const lastModelsUpdate = Object.fromEntries(\n Object.entries(rawLastModelsUpdate).map(([baseUrl, timestamp]) => [\n normalizeBaseUrl(baseUrl),\n timestamp,\n ])\n );\n\n const cachedTokens = rawCachedTokens.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance:\n typeof entry.balance === \"number\"\n ? entry.balance\n : getCashuTokenBalance(entry.token),\n lastUsed: entry.lastUsed ?? null,\n }));\n\n const apiKeys = rawApiKeys.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n balance: entry.balance ?? 0,\n lastUsed: entry.lastUsed ?? null,\n }));\n\n const childKeys = rawChildKeys.map((entry) => ({\n parentBaseUrl: normalizeBaseUrl(entry.parentBaseUrl),\n childKey: entry.childKey,\n balance: entry.balance ?? 0,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt ?? Date.now(),\n }));\n\n const routstr21Models = rawRoutstr21Models;\n const lastRoutstr21ModelsUpdate = rawLastRoutstr21ModelsUpdate;\n\n const cachedReceiveTokens = rawCachedReceiveTokens?.map((entry) => ({\n token: entry.token,\n amount: entry.amount,\n unit: entry.unit || \"sat\",\n createdAt: entry.createdAt ?? Date.now(),\n }));\n\n const usageTracking = rawUsageTracking;\n\n const clientIds = rawClientIds.map((entry) => ({\n ...entry,\n baseUrl: normalizeBaseUrl(entry.baseUrl),\n createdAt: entry.createdAt ?? Date.now(),\n lastUsed: entry.lastUsed ?? null,\n }));\n\n store.setState({\n modelsFromAllProviders,\n lastUsedModel,\n baseUrlsList,\n lastBaseUrlsUpdate,\n disabledProviders,\n mintsFromAllProviders,\n infoFromAllProviders,\n lastModelsUpdate,\n cachedTokens,\n apiKeys,\n childKeys,\n routstr21Models,\n lastRoutstr21ModelsUpdate,\n cachedReceiveTokens,\n usageTracking,\n clientIds,\n });\n};\n\nexport const createSdkStore = ({\n driver,\n}: SdkStoreOptions): { store: SdkStore; hydrate: Promise<void> } => {\n const store = createEmptyStore(driver);\n return {\n store,\n hydrate: hydrateStoreFromDriver(store, driver),\n };\n};\n\nexport const createDiscoveryAdapterFromStore = (\n store: SdkStore\n): DiscoveryAdapter => ({\n getCachedModels: () => store.getState().modelsFromAllProviders,\n setCachedModels: (models) =>\n store.getState().setModelsFromAllProviders(models),\n getCachedMints: () => store.getState().mintsFromAllProviders,\n setCachedMints: (mints) => store.getState().setMintsFromAllProviders(mints),\n getCachedProviderInfo: () => store.getState().infoFromAllProviders,\n setCachedProviderInfo: (info) =>\n store.getState().setInfoFromAllProviders(info),\n getProviderLastUpdate: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const timestamps = store.getState().lastModelsUpdate;\n return timestamps[normalized] || null;\n },\n setProviderLastUpdate: (baseUrl, timestamp) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const timestamps = { ...store.getState().lastModelsUpdate };\n timestamps[normalized] = timestamp;\n store.getState().setLastModelsUpdate(timestamps);\n },\n getLastUsedModel: () => store.getState().lastUsedModel,\n setLastUsedModel: (modelId) => store.getState().setLastUsedModel(modelId),\n getDisabledProviders: () => store.getState().disabledProviders,\n getBaseUrlsList: () => store.getState().baseUrlsList,\n setBaseUrlsList: (urls) => store.getState().setBaseUrlsList(urls),\n getBaseUrlsLastUpdate: () => store.getState().lastBaseUrlsUpdate,\n setBaseUrlsLastUpdate: (timestamp) =>\n store.getState().setBaseUrlsLastUpdate(timestamp),\n getRoutstr21Models: () => store.getState().routstr21Models,\n setRoutstr21Models: (models) => store.getState().setRoutstr21Models(models),\n getRoutstr21ModelsLastUpdate: () =>\n store.getState().lastRoutstr21ModelsUpdate,\n setRoutstr21ModelsLastUpdate: (timestamp) =>\n store.getState().setRoutstr21ModelsLastUpdate(timestamp),\n});\n\nexport const createStorageAdapterFromStore = (\n store: SdkStore\n): StorageAdapter => ({\n getToken: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const entry = store\n .getState()\n .cachedTokens.find((token) => token.baseUrl === normalized);\n if (!entry) return null;\n const next = store\n .getState()\n .cachedTokens.map((token) =>\n token.baseUrl === normalized\n ? { ...token, lastUsed: Date.now() }\n : token\n );\n store.getState().setCachedTokens(next);\n return entry.token;\n },\n setToken: (baseUrl, token) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const tokens = store.getState().cachedTokens;\n const balance = getCashuTokenBalance(token);\n const existingIndex = tokens.findIndex(\n (entry) => entry.baseUrl === normalized\n );\n if (existingIndex !== -1) {\n throw new Error(`Token already exists for baseUrl: ${normalized}`);\n }\n const next = [...tokens];\n next.push({\n baseUrl: normalized,\n token,\n balance,\n lastUsed: Date.now(),\n });\n store.getState().setCachedTokens(next);\n },\n removeToken: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const next = store\n .getState()\n .cachedTokens.filter((entry) => entry.baseUrl !== normalized);\n store.getState().setCachedTokens(next);\n },\n updateTokenBalance: (baseUrl, balance) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const tokens = store.getState().cachedTokens;\n const next = tokens.map((entry) =>\n entry.baseUrl === normalized ? { ...entry, balance } : entry\n );\n store.getState().setCachedTokens(next);\n },\n getCachedTokenDistribution: () => {\n const cachedTokens = store.getState().cachedTokens;\n const distributionMap: Record<string, number> = {};\n\n for (const entry of cachedTokens) {\n const sum = entry.balance || 0;\n if (sum > 0) {\n distributionMap[entry.baseUrl] =\n (distributionMap[entry.baseUrl] || 0) + sum;\n }\n }\n\n return Object.entries(distributionMap)\n .map(([baseUrl, amt]) => ({ baseUrl, amount: amt }))\n .sort((a, b) => b.amount - a.amount);\n },\n getApiKeyDistribution: () => {\n const apiKeys = store.getState().apiKeys;\n const distributionMap: Record<string, number> = {};\n\n for (const entry of apiKeys) {\n const sum = entry.balance || 0;\n if (sum > 0) {\n distributionMap[entry.baseUrl] =\n (distributionMap[entry.baseUrl] || 0) + sum;\n }\n }\n\n return Object.entries(distributionMap)\n .map(([baseUrl, amt]) => ({ baseUrl, amount: amt }))\n .sort((a, b) => b.amount - a.amount);\n },\n saveProviderInfo: (baseUrl, info) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const next = { ...store.getState().infoFromAllProviders };\n next[normalized] = info;\n store.getState().setInfoFromAllProviders(next);\n },\n getProviderInfo: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n return store.getState().infoFromAllProviders[normalized] || null;\n },\n\n // ========== API Keys (for apikeys mode) ==========\n\n getApiKey: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const entry = store\n .getState()\n .apiKeys.find((key) => key.baseUrl === normalized);\n if (!entry) return null;\n // Update lastUsed timestamp\n const next = store\n .getState()\n .apiKeys.map((key) =>\n key.baseUrl === normalized ? { ...key, lastUsed: Date.now() } : key\n );\n store.getState().setApiKeys(next);\n return entry;\n },\n\n setApiKey: (baseUrl, key) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const keys = store.getState().apiKeys;\n const existingIndex = keys.findIndex(\n (entry) => entry.baseUrl === normalized\n );\n if (existingIndex !== -1) {\n throw new Error(`ApiKey already exists for baseUrl: ${normalized}`);\n }\n const next = [...keys];\n next.push({\n baseUrl: normalized,\n key,\n balance: 0,\n lastUsed: Date.now(),\n });\n store.getState().setApiKeys(next);\n },\n\n updateApiKeyBalance: (baseUrl, balance) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const keys = store.getState().apiKeys;\n const next = keys.map((entry) =>\n entry.baseUrl === normalized ? { ...entry, balance } : entry\n );\n store.getState().setApiKeys(next);\n },\n\n removeApiKey: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const next = store\n .getState()\n .apiKeys.filter((entry) => entry.baseUrl !== normalized);\n store.getState().setApiKeys(next);\n },\n\n getAllApiKeys: () => {\n return store.getState().apiKeys.map((entry) => ({\n baseUrl: entry.baseUrl,\n key: entry.key,\n balance: entry.balance,\n lastUsed: entry.lastUsed,\n }));\n },\n\n // ========== Child Keys ==========\n\n getChildKey: (parentBaseUrl) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const entry = store\n .getState()\n .childKeys.find((key) => key.parentBaseUrl === normalized);\n if (!entry) return null;\n return {\n parentBaseUrl: entry.parentBaseUrl,\n childKey: entry.childKey,\n balance: entry.balance,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt,\n };\n },\n\n setChildKey: (\n parentBaseUrl,\n childKey,\n balance,\n validityDate,\n balanceLimit\n ) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const keys = store.getState().childKeys;\n const existingIndex = keys.findIndex(\n (entry) => entry.parentBaseUrl === normalized\n );\n if (existingIndex !== -1) {\n // Update existing child key\n const next = keys.map((entry) =>\n entry.parentBaseUrl === normalized\n ? {\n ...entry,\n childKey,\n balance: balance ?? 0,\n validityDate,\n balanceLimit,\n createdAt: Date.now(),\n }\n : entry\n );\n store.getState().setChildKeys(next);\n } else {\n // Add new child key\n const next = [...keys];\n next.push({\n parentBaseUrl: normalized,\n childKey,\n balance: balance ?? 0,\n validityDate,\n balanceLimit,\n createdAt: Date.now(),\n });\n store.getState().setChildKeys(next);\n }\n },\n\n updateChildKeyBalance: (parentBaseUrl, balance) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const keys = store.getState().childKeys;\n const next = keys.map((entry) =>\n entry.parentBaseUrl === normalized ? { ...entry, balance } : entry\n );\n store.getState().setChildKeys(next);\n },\n\n removeChildKey: (parentBaseUrl) => {\n const normalized = normalizeBaseUrl(parentBaseUrl);\n const next = store\n .getState()\n .childKeys.filter((entry) => entry.parentBaseUrl !== normalized);\n store.getState().setChildKeys(next);\n },\n\n getAllChildKeys: () => {\n return store.getState().childKeys.map((entry) => ({\n parentBaseUrl: entry.parentBaseUrl,\n childKey: entry.childKey,\n balance: entry.balance,\n balanceLimit: entry.balanceLimit,\n validityDate: entry.validityDate,\n createdAt: entry.createdAt,\n }));\n },\n\n getCachedReceiveTokens: () => {\n return store.getState().cachedReceiveTokens;\n },\n\n setCachedReceiveTokens: (tokens) => {\n store.getState().setCachedReceiveTokens(tokens);\n },\n});\n\nexport const createProviderRegistryFromStore = (\n store: SdkStore\n): ProviderRegistry => ({\n getModelsForProvider: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n return store.getState().modelsFromAllProviders[normalized] || [];\n },\n getDisabledProviders: () => store.getState().disabledProviders,\n getProviderMints: (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n return store.getState().mintsFromAllProviders[normalized] || [];\n },\n getProviderInfo: async (baseUrl) => {\n const normalized = normalizeBaseUrl(baseUrl);\n const cached = store.getState().infoFromAllProviders[normalized];\n if (cached) return cached;\n try {\n const response = await fetch(`${normalized}v1/info`);\n if (!response.ok) {\n throw new Error(`Failed ${response.status}`);\n }\n const info = (await response.json()) as ProviderInfo;\n const next = { ...store.getState().infoFromAllProviders };\n next[normalized] = info;\n store.getState().setInfoFromAllProviders(next);\n return info;\n } catch (error) {\n console.warn(`Failed to fetch provider info from ${normalized}:`, error);\n return null;\n }\n },\n getAllProvidersModels: () => store.getState().modelsFromAllProviders,\n});\n","import { localStorageDriver } from \"./drivers/localStorage\";\nimport { createMemoryDriver } from \"./drivers/memory\";\nimport { createSqliteDriver } from \"./drivers/sqlite\";\nimport { createIndexedDBDriver } from \"./drivers/indexedDB\";\nimport type { StorageDriver } from \"./types\";\nimport {\n createSdkStore,\n createDiscoveryAdapterFromStore,\n createProviderRegistryFromStore,\n createStorageAdapterFromStore,\n type SdkStore,\n} from \"./store\";\n\nexport type { StorageDriver } from \"./types\";\nexport type { SdkStore } from \"./store\";\nexport type { DiscoveryAdapter } from \"../discovery/interfaces\";\nexport type { StorageAdapter, ProviderRegistry } from \"../wallet/interfaces\";\nexport { SDK_STORAGE_KEYS } from \"./keys\";\nexport {\n createSdkStore,\n createDiscoveryAdapterFromStore,\n createProviderRegistryFromStore,\n createStorageAdapterFromStore,\n} from \"./store\";\nexport {\n localStorageDriver,\n createMemoryDriver,\n createSqliteDriver,\n createIndexedDBDriver,\n};\n\nconst isBrowser = (): boolean => {\n try {\n return (\n typeof window !== \"undefined\" &&\n typeof window.localStorage !== \"undefined\"\n );\n } catch {\n return false;\n }\n};\n\nconst isNode = (): boolean => {\n try {\n return (\n typeof process !== \"undefined\" &&\n process.versions != null &&\n process.versions.node != null\n );\n } catch {\n return false;\n }\n};\n\nlet defaultDriver: StorageDriver | null = null;\n\nconst isBun = (): boolean => {\n return typeof process.versions.bun !== \"undefined\";\n};\n\nexport const getDefaultSdkDriver = (): StorageDriver => {\n if (defaultDriver) return defaultDriver;\n if (isBrowser()) {\n defaultDriver = localStorageDriver;\n return defaultDriver;\n }\n if (isBun()) {\n defaultDriver = createMemoryDriver();\n return defaultDriver;\n }\n if (isNode()) {\n defaultDriver = createSqliteDriver();\n return defaultDriver;\n }\n defaultDriver = createMemoryDriver();\n return defaultDriver;\n};\n\nlet defaultStore: ReturnType<typeof createSdkStore> | null = null;\n\nexport const getDefaultSdkStore = (): Promise<SdkStore> => {\n if (!defaultStore) {\n defaultStore = createSdkStore({ driver: getDefaultSdkDriver() });\n }\n return defaultStore.hydrate.then(() => defaultStore!.store);\n};\n\nexport const getDefaultDiscoveryAdapter = async () =>\n createDiscoveryAdapterFromStore(await getDefaultSdkStore());\n\nexport const getDefaultStorageAdapter = async () =>\n createStorageAdapterFromStore(await getDefaultSdkStore());\n\nexport const getDefaultProviderRegistry = async () =>\n createProviderRegistryFromStore(await getDefaultSdkStore());\n","/**\n * routeRequests - SDK helper for routing OpenAI-compatible requests to the cheapest provider\n *\n * This module provides a reusable function for routing requests to the cheapest\n * provider based on model pricing, with automatic Cashu token handling.\n */\n\nimport type { Model, Message } from \"./core/types\";\nimport type { DiscoveryAdapter } from \"./discovery/interfaces\";\nimport type {\n ProviderRegistry,\n WalletAdapter,\n StorageAdapter,\n} from \"./wallet/interfaces\";\nimport { ModelManager } from \"./discovery/ModelManager\";\nimport { ProviderManager } from \"./client/ProviderManager\";\nimport { RoutstrClient, type DebugLevel } from \"./client/RoutstrClient\";\n\n/**\n * Options for routeRequests function\n */\nexport interface RouteRequestOptions {\n /** The model ID to route (e.g., \"gpt-4o\") */\n modelId: string;\n /** The request body to proxy to the provider */\n requestBody: unknown;\n /** Optional: API path (defaults to /v1/chat/completions) */\n path?: string;\n /** Optional: force a specific provider base URL */\n forcedProvider?: string;\n /** Wallet adapter for Cashu operations */\n walletAdapter: WalletAdapter;\n /** Storage adapter for caching */\n storageAdapter: StorageAdapter;\n /** Provider registry for tracking available providers */\n providerRegistry: ProviderRegistry;\n /** Discovery adapter for model/mint discovery */\n discoveryAdapter: DiscoveryAdapter;\n /** Optional: additional provider URLs to include */\n includeProviderUrls?: string[];\n /** Optional: Tor mode for onion routing */\n torMode?: boolean;\n /** Optional: force refresh of cached data */\n forceRefresh?: boolean;\n /** Optional: pre-initialized ModelManager (skips bootstrap if provided) */\n modelManager?: ModelManager;\n /** Optional: set RoutstrClient debug level */\n debugLevel?: DebugLevel;\n /** Optional: client mode (xcashu, lazyrefund, or apikeys) */\n mode?: \"xcashu\" | \"lazyrefund\" | \"apikeys\";\n}\n\n/**\n * Result from routeRequests function\n */\nexport interface RouteRequestResult {\n /** The selected provider base URL */\n baseUrl: string;\n /** The selected model with pricing info */\n selectedModel: Model;\n /** Pricing info for the selected provider */\n pricing: {\n promptPerMillion: number;\n completionPerMillion: number;\n totalPerMillion: number;\n };\n /** The response from the provider */\n response: {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: unknown;\n };\n}\n\n/**\n * Route an OpenAI-compatible request to the cheapest provider\n *\n * This function:\n * 1. Bootstraps providers and fetches models\n * 2. Discovers available mints\n * 3. Selects the cheapest provider for the requested model\n * 4. Handles Cashu send/receive via RoutstrClient\n * 5. Proxies the request and returns the response\n *\n * @param options - Routing options\n * @returns The provider response\n */\nexport async function routeRequests(\n options: RouteRequestOptions\n): Promise<Response> {\n const {\n modelId,\n requestBody,\n path = \"/v1/chat/completions\",\n forcedProvider,\n walletAdapter,\n storageAdapter,\n providerRegistry,\n discoveryAdapter,\n includeProviderUrls = [],\n torMode = false,\n forceRefresh = false,\n modelManager: providedModelManager,\n debugLevel,\n mode = \"apikeys\",\n } = options;\n\n // Use provided ModelManager or create a new one\n let modelManager: ModelManager;\n let providers: string[];\n\n if (providedModelManager) {\n modelManager = providedModelManager;\n providers = modelManager.getBaseUrls();\n if (providers.length === 0) {\n throw new Error(\"No providers available - run bootstrap first\");\n }\n } else {\n // Initialize ModelManager\n modelManager = new ModelManager(discoveryAdapter, {\n includeProviderUrls: forcedProvider\n ? [forcedProvider, ...includeProviderUrls]\n : includeProviderUrls,\n });\n\n // Bootstrap providers\n providers = await modelManager.bootstrapProviders(torMode);\n if (providers.length === 0) {\n throw new Error(\"No providers available\");\n }\n\n // Fetch models\n await modelManager.fetchModels(providers, forceRefresh);\n }\n\n // Initialize ProviderManager\n const providerManager = new ProviderManager(providerRegistry);\n\n // Determine cheapest provider\n let baseUrl: string;\n let selectedModel: Model;\n\n if (forcedProvider) {\n // Use forced provider\n const normalizedProvider = forcedProvider.endsWith(\"/\")\n ? forcedProvider\n : `${forcedProvider}/`;\n const cachedModels = modelManager.getAllCachedModels();\n const models = cachedModels[normalizedProvider] || [];\n const match = models.find((m) => m.id === modelId);\n if (!match) {\n throw new Error(\n `Provider ${normalizedProvider} does not offer model: ${modelId}`\n );\n }\n baseUrl = normalizedProvider;\n selectedModel = match;\n } else {\n // Find cheapest provider\n const ranking = providerManager.getProviderPriceRankingForModel(modelId, {\n torMode,\n includeDisabled: false,\n });\n if (ranking.length === 0) {\n throw new Error(`No providers found for model: ${modelId}`);\n }\n const cheapest = ranking[0];\n baseUrl = cheapest.baseUrl;\n selectedModel = cheapest.model;\n }\n\n // Get wallet balance\n const balances = await walletAdapter.getBalances();\n const totalBalance = Object.values(balances).reduce((sum, v) => sum + v, 0);\n\n if (totalBalance <= 0) {\n throw new Error(\n \"Wallet balance is empty. Add a mint and fund it before making requests.\"\n );\n }\n\n // Get mint URL\n const providerMints = providerRegistry.getProviderMints(baseUrl);\n const mintUrl =\n walletAdapter.getActiveMintUrl() ||\n providerMints[0] ||\n Object.keys(balances)[0];\n\n if (!mintUrl) {\n throw new Error(\"No mint configured in wallet\");\n }\n\n // Initialize RoutstrClient\n const alertLevel = \"min\";\n const client = new RoutstrClient(\n walletAdapter,\n storageAdapter,\n providerRegistry,\n alertLevel,\n mode\n );\n\n if (debugLevel) {\n client.setDebugLevel(debugLevel);\n }\n\n // Extract options from request body\n const maxTokens = extractMaxTokens(requestBody);\n const stream = extractStream(requestBody);\n\n // Make the request using the simpler routeRequest method\n let response: Response | null = null;\n\n try {\n const proxiedBody: Record<string, unknown> =\n requestBody && typeof requestBody === \"object\"\n ? { ...(requestBody as Record<string, unknown>) }\n : {};\n\n proxiedBody.model = selectedModel.id;\n\n if (stream !== undefined) {\n proxiedBody.stream = stream;\n }\n\n if (maxTokens !== undefined) {\n proxiedBody.max_tokens = maxTokens;\n }\n console.log(modelId);\n\n response = await client.routeRequest({\n path,\n method: \"POST\",\n body: proxiedBody,\n baseUrl,\n mintUrl,\n modelId: modelId,\n });\n\n if (!response.ok) {\n throw new Error(`${response.status} ${response.statusText}`);\n }\n\n return response;\n } catch (error) {\n if (\n error instanceof Error &&\n (error.message.includes(\"401\") ||\n error.message.includes(\"402\") ||\n error.message.includes(\"403\"))\n ) {\n throw new Error(`Authentication failed: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Extract message history from request body\n */\nfunction extractMessageHistory(requestBody: unknown): Message[] {\n if (!requestBody || typeof requestBody !== \"object\") {\n return [];\n }\n\n const body = requestBody as Record<string, unknown>;\n const messages = body.messages;\n\n if (!Array.isArray(messages)) {\n return [];\n }\n\n return messages as Message[];\n}\n\n/**\n * Extract max_tokens from request body\n */\nfunction extractMaxTokens(requestBody: unknown): number | undefined {\n if (!requestBody || typeof requestBody !== \"object\") {\n return undefined;\n }\n\n const body = requestBody as Record<string, unknown>;\n const maxTokens = body.max_tokens;\n\n if (typeof maxTokens === \"number\") {\n return maxTokens;\n }\n\n return undefined;\n}\n\n/**\n * Extract stream option from request body\n */\nfunction extractStream(requestBody: unknown): boolean {\n if (!requestBody || typeof requestBody !== \"object\") {\n return false;\n }\n\n const body = requestBody as Record<string, unknown>;\n const stream = body.stream;\n\n return stream === true;\n}\n"]}
|