routstrd 0.2.18 → 0.2.20

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.
@@ -32087,6 +32087,7 @@ __export(exports_dist, {
32087
32087
  setDefaultUsageTrackingDriver: () => setDefaultUsageTrackingDriver,
32088
32088
  routeRequests: () => routeRequests,
32089
32089
  normalizeProviderUrl: () => normalizeProviderUrl,
32090
+ noopLogger: () => noopLogger,
32090
32091
  localStorageDriver: () => localStorageDriver,
32091
32092
  isTorContext: () => isTorContext,
32092
32093
  isOnionUrl: () => isOnionUrl,
@@ -32112,6 +32113,7 @@ __export(exports_dist, {
32112
32113
  createDiscoveryAdapterFromStore: () => createDiscoveryAdapterFromStore,
32113
32114
  createBunSqliteUsageTrackingDriver: () => createBunSqliteUsageTrackingDriver,
32114
32115
  createBunSqliteDriver: () => createBunSqliteDriver,
32116
+ consoleLogger: () => consoleLogger,
32115
32117
  TokenOperationError: () => TokenOperationError,
32116
32118
  StreamingError: () => StreamingError,
32117
32119
  StreamProcessor: () => StreamProcessor,
@@ -32133,6 +32135,16 @@ __export(exports_dist, {
32133
32135
  });
32134
32136
  import { Transform } from "stream";
32135
32137
  import { StringDecoder } from "string_decoder";
32138
+ function makeConsoleLogger(prefix) {
32139
+ const fmt = (args) => prefix ? [prefix, ...args] : args;
32140
+ return {
32141
+ log: (...args) => console.log(...fmt(args)),
32142
+ warn: (...args) => console.warn(...fmt(args)),
32143
+ error: (...args) => console.error(...fmt(args)),
32144
+ debug: (...args) => console.log(...fmt(args)),
32145
+ child: (p) => makeConsoleLogger(prefix ? `${prefix}:${p}` : p)
32146
+ };
32147
+ }
32136
32148
  function isNetworkErrorMessage(message) {
32137
32149
  return message.includes("NetworkError when attempting to fetch resource") || message.includes("Failed to fetch") || message.includes("Load failed") || message.includes("ERR_TLS_CERT_ALTNAME_INVALID") || message.includes("ERR_TLS_CERT_NOT_YET_VALID") || message.includes("ERR_TLS_CERT_EXPIRED") || message.includes("UNABLE_TO_VERIFY_LEAF_SIGNATURE") || message.includes("SELF_SIGNED_CERT_IN_CHAIN");
32138
32150
  }
@@ -32357,7 +32369,8 @@ function calculateImageTokens(width, height, detail = "auto") {
32357
32369
  function isInsecureHttpUrl(url2) {
32358
32370
  return url2.startsWith("http://");
32359
32371
  }
32360
- async function createBunSqliteDriver(dbPath) {
32372
+ async function createBunSqliteDriver(dbPath, options) {
32373
+ const logger3 = (options?.logger ?? consoleLogger).child("BunSqliteDriver");
32361
32374
  const SQLite = (await import("bun:sqlite")).default;
32362
32375
  const db = new SQLite(dbPath);
32363
32376
  db.run(`
@@ -32381,7 +32394,7 @@ async function createBunSqliteDriver(dbPath) {
32381
32394
  throw parseError;
32382
32395
  }
32383
32396
  } catch (error) {
32384
- console.error(`SQLite getItem failed for key "${key}":`, error);
32397
+ logger3.error(`getItem failed for key "${key}":`, error);
32385
32398
  return defaultValue;
32386
32399
  }
32387
32400
  },
@@ -32389,14 +32402,14 @@ async function createBunSqliteDriver(dbPath) {
32389
32402
  try {
32390
32403
  db.query("INSERT INTO sdk_storage (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value").run(key, JSON.stringify(value));
32391
32404
  } catch (error) {
32392
- console.error(`SQLite setItem failed for key "${key}":`, error);
32405
+ logger3.error(`setItem failed for key "${key}":`, error);
32393
32406
  }
32394
32407
  },
32395
32408
  async removeItem(key) {
32396
32409
  try {
32397
32410
  db.query("DELETE FROM sdk_storage WHERE key = ?").run(key);
32398
32411
  } catch (error) {
32399
- console.error(`SQLite removeItem failed for key "${key}":`, error);
32412
+ logger3.error(`removeItem failed for key "${key}":`, error);
32400
32413
  }
32401
32414
  }
32402
32415
  };
@@ -32625,7 +32638,8 @@ async function resolveRouteRequestContext(options) {
32625
32638
  mode = "apikeys",
32626
32639
  usageTrackingDriver,
32627
32640
  sdkStore,
32628
- providerManager: providedProviderManager
32641
+ providerManager: providedProviderManager,
32642
+ logger: logger3
32629
32643
  } = options;
32630
32644
  let modelManager;
32631
32645
  let providers;
@@ -32637,7 +32651,8 @@ async function resolveRouteRequestContext(options) {
32637
32651
  }
32638
32652
  } else {
32639
32653
  modelManager = new ModelManager(discoveryAdapter, {
32640
- includeProviderUrls: forcedProvider ? [forcedProvider, ...includeProviderUrls] : includeProviderUrls
32654
+ includeProviderUrls: forcedProvider ? [forcedProvider, ...includeProviderUrls] : includeProviderUrls,
32655
+ logger: logger3
32641
32656
  });
32642
32657
  providers = await modelManager.bootstrapProviders(torMode);
32643
32658
  if (providers.length === 0) {
@@ -32645,7 +32660,7 @@ async function resolveRouteRequestContext(options) {
32645
32660
  }
32646
32661
  await modelManager.fetchModels(providers, forceRefresh);
32647
32662
  }
32648
- const providerManager = providedProviderManager ?? new ProviderManager(providerRegistry, sdkStore);
32663
+ const providerManager = providedProviderManager ?? new ProviderManager(providerRegistry, sdkStore, logger3);
32649
32664
  let baseUrl;
32650
32665
  let selectedModel;
32651
32666
  if (forcedProvider) {
@@ -32680,7 +32695,7 @@ async function resolveRouteRequestContext(options) {
32680
32695
  if (!mintUrl) {
32681
32696
  throw new Error("No mint configured in wallet");
32682
32697
  }
32683
- const client2 = new RoutstrClient(walletAdapter, storageAdapter, providerRegistry, "min", mode, { usageTrackingDriver, sdkStore, providerManager });
32698
+ const client2 = new RoutstrClient(walletAdapter, storageAdapter, providerRegistry, "min", mode, { usageTrackingDriver, sdkStore, providerManager, logger: logger3 });
32684
32699
  if (debugLevel) {
32685
32700
  client2.setDebugLevel(debugLevel);
32686
32701
  }
@@ -32743,18 +32758,20 @@ function extractStream(requestBody) {
32743
32758
  const stream = body.stream;
32744
32759
  return typeof stream === "boolean" ? stream : undefined;
32745
32760
  }
32746
- var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError, TokenOperationError, FailoverError, StreamingError, ModelNotFoundError, ProviderBootstrapError, NoProvidersAvailableError, MintDiscoveryError, ModelManager = class _ModelManager {
32761
+ var import_rxjs24, consoleLogger, noopLogger, InsufficientBalanceError, ProviderError, MintUnreachableError, TokenOperationError, FailoverError, StreamingError, ModelNotFoundError, ProviderBootstrapError, NoProvidersAvailableError, MintDiscoveryError, ModelManager = class _ModelManager {
32747
32762
  constructor(adapter, config = {}) {
32748
32763
  this.adapter = adapter;
32749
32764
  this.providerDirectoryUrl = config.providerDirectoryUrl || "https://api.routstr.com/v1/providers/";
32750
32765
  this.cacheTTL = config.cacheTTL || 210 * 60 * 1000;
32751
32766
  this.includeProviderUrls = config.includeProviderUrls || [];
32752
32767
  this.excludeProviderUrls = config.excludeProviderUrls || [];
32768
+ this.logger = (config.logger ?? consoleLogger).child("ModelManager");
32753
32769
  }
32754
32770
  cacheTTL;
32755
32771
  providerDirectoryUrl;
32756
32772
  includeProviderUrls;
32757
32773
  excludeProviderUrls;
32774
+ logger;
32758
32775
  getBaseUrls() {
32759
32776
  return this.adapter.getBaseUrlsList();
32760
32777
  }
@@ -32788,7 +32805,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
32788
32805
  return filtered;
32789
32806
  }
32790
32807
  } catch (e) {
32791
- console.warn("Nostr bootstrap failed, falling back to HTTP:", e);
32808
+ this.logger.warn("Nostr bootstrap failed, falling back to HTTP:", e);
32792
32809
  }
32793
32810
  return this.bootstrapFromHttp(torMode, forceRefresh);
32794
32811
  }
@@ -32855,7 +32872,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
32855
32872
  }
32856
32873
  }
32857
32874
  } catch {
32858
- console.warn("[NostrBootstrap] Failed to parse Nostr event content:", event3.id);
32875
+ this.logger.warn("NostrBootstrap: failed to parse event content:", event3.id);
32859
32876
  }
32860
32877
  }
32861
32878
  }
@@ -32899,7 +32916,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
32899
32916
  }
32900
32917
  return list;
32901
32918
  } catch (e) {
32902
- console.error("Failed to bootstrap providers", e);
32919
+ this.logger.error("Failed to bootstrap providers", e);
32903
32920
  throw new ProviderBootstrapError([], `Provider bootstrap failed: ${e}`);
32904
32921
  }
32905
32922
  }
@@ -32958,9 +32975,9 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
32958
32975
  return { success: true, base: base2, list };
32959
32976
  } catch (error) {
32960
32977
  if (this.isProviderDownError(error)) {
32961
- console.warn(`Provider ${base2} is down right now.`);
32978
+ this.logger.warn(`Provider ${base2} is down right now.`);
32962
32979
  } else {
32963
- console.warn(`Failed to fetch models from ${base2}:`, error);
32980
+ this.logger.warn(`Failed to fetch models from ${base2}:`, error);
32964
32981
  }
32965
32982
  this.adapter.setProviderLastUpdate(base2, Date.now());
32966
32983
  return { success: false, base: base2 };
@@ -33082,7 +33099,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33082
33099
  this.adapter.setRoutstr21ModelsLastUpdate(Date.now());
33083
33100
  return models;
33084
33101
  } catch {
33085
- console.warn("[Routstr21Models] Failed to parse Nostr event content:", event3.id);
33102
+ this.logger.warn("Routstr21Models: failed to parse Nostr event content:", event3.id);
33086
33103
  return cachedModels.length > 0 ? cachedModels : [];
33087
33104
  }
33088
33105
  }
@@ -33090,8 +33107,10 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33090
33107
  constructor(adapter, config = {}) {
33091
33108
  this.adapter = adapter;
33092
33109
  this.cacheTTL = config.cacheTTL || 21 * 60 * 1000;
33110
+ this.logger = (config.logger ?? consoleLogger).child("MintDiscovery");
33093
33111
  }
33094
33112
  cacheTTL;
33113
+ logger;
33095
33114
  async discoverMints(baseUrls, options = {}) {
33096
33115
  if (baseUrls.length === 0) {
33097
33116
  return { mintsFromProviders: {}, infoFromProviders: {} };
@@ -33134,9 +33153,9 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33134
33153
  } catch (error) {
33135
33154
  this.adapter.setProviderLastUpdate(base2, Date.now());
33136
33155
  if (this.isProviderDownError(error)) {
33137
- console.warn(`Provider ${base2} is down right now.`);
33156
+ this.logger.warn(`Provider ${base2} is down right now.`);
33138
33157
  } else {
33139
- console.warn(`Failed to fetch mints from ${base2}:`, error);
33158
+ this.logger.warn(`Failed to fetch mints from ${base2}:`, error);
33140
33159
  }
33141
33160
  return { success: false, base: base2, mints: [], info: null };
33142
33161
  }
@@ -33150,14 +33169,14 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33150
33169
  infoFromAllProviders[base2] = info;
33151
33170
  }
33152
33171
  } else {
33153
- console.error("Mint discovery error:", result.reason);
33172
+ this.logger.error("Mint discovery error:", result.reason);
33154
33173
  }
33155
33174
  }
33156
33175
  try {
33157
33176
  this.adapter.setCachedMints(mintsFromAllProviders);
33158
33177
  this.adapter.setCachedProviderInfo(infoFromAllProviders);
33159
33178
  } catch (error) {
33160
- console.error("Error caching mint discovery results:", error);
33179
+ this.logger.error("Error caching mint discovery results:", error);
33161
33180
  }
33162
33181
  return {
33163
33182
  mintsFromProviders: mintsFromAllProviders,
@@ -33254,14 +33273,16 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33254
33273
  });
33255
33274
  }
33256
33275
  }, auditLogger, CashuSpender = class {
33257
- constructor(walletAdapter, storageAdapter, _providerRegistry, balanceManager) {
33276
+ constructor(walletAdapter, storageAdapter, _providerRegistry, balanceManager, logger3) {
33258
33277
  this.walletAdapter = walletAdapter;
33259
33278
  this.storageAdapter = storageAdapter;
33260
33279
  this._providerRegistry = _providerRegistry;
33261
33280
  this.balanceManager = balanceManager;
33281
+ this.logger = (logger3 ?? consoleLogger).child("CashuSpender");
33262
33282
  }
33263
33283
  _isBusy = false;
33264
33284
  debugLevel = "WARN";
33285
+ logger;
33265
33286
  async receiveToken(token) {
33266
33287
  try {
33267
33288
  const result = await this.walletAdapter.receiveToken(token);
@@ -33351,13 +33372,13 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33351
33372
  if (levelPriority[level] >= levelPriority[this.debugLevel]) {
33352
33373
  switch (level) {
33353
33374
  case "DEBUG":
33354
- console.log(...args);
33375
+ this.logger.log(...args);
33355
33376
  break;
33356
33377
  case "WARN":
33357
- console.warn(...args);
33378
+ this.logger.warn(...args);
33358
33379
  break;
33359
33380
  case "ERROR":
33360
- console.error(...args);
33381
+ this.logger.error(...args);
33361
33382
  break;
33362
33383
  }
33363
33384
  }
@@ -33607,16 +33628,38 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33607
33628
  for (const apiKeyEntry of apiKeyDistribution) {
33608
33629
  const apiKeyEntryFull = this.storageAdapter.getApiKey(apiKeyEntry.baseUrl);
33609
33630
  if (apiKeyEntryFull && this.balanceManager) {
33631
+ try {
33632
+ const balanceResult = await this.balanceManager.getTokenBalance(apiKeyEntryFull.key, apiKeyEntry.baseUrl);
33633
+ if (balanceResult.isInvalidApiKey) {
33634
+ this.storageAdapter.removeApiKey(apiKeyEntry.baseUrl);
33635
+ results.push({
33636
+ baseUrl: apiKeyEntry.baseUrl,
33637
+ success: true
33638
+ });
33639
+ continue;
33640
+ }
33641
+ if (balanceResult.amount >= 0) {
33642
+ const balanceSat = balanceResult.unit === "msat" ? Math.floor(balanceResult.amount / 1000) : balanceResult.amount;
33643
+ this.storageAdapter.updateApiKeyBalance(apiKeyEntry.baseUrl, balanceSat);
33644
+ }
33645
+ } catch {
33646
+ }
33647
+ const refreshedEntry = this.storageAdapter.getApiKey(apiKeyEntry.baseUrl);
33648
+ if (!refreshedEntry)
33649
+ continue;
33610
33650
  const refundResult = await this.balanceManager.refundApiKey({
33611
33651
  mintUrl,
33612
33652
  baseUrl: apiKeyEntry.baseUrl,
33613
- apiKey: apiKeyEntryFull.key,
33653
+ apiKey: refreshedEntry.key,
33614
33654
  forceRefund
33615
33655
  });
33616
33656
  if (refundResult.success) {
33617
33657
  this.storageAdapter.removeApiKey(apiKeyEntry.baseUrl);
33618
33658
  } else {
33619
- this.storageAdapter.updateApiKeyBalance(apiKeyEntry.baseUrl, apiKeyEntry.amount);
33659
+ const currentEntry = this.storageAdapter.getApiKey(apiKeyEntry.baseUrl);
33660
+ if (currentEntry) {
33661
+ this.storageAdapter.updateApiKeyBalance(apiKeyEntry.baseUrl, currentEntry.balance);
33662
+ }
33620
33663
  }
33621
33664
  results.push({
33622
33665
  baseUrl: apiKeyEntry.baseUrl,
@@ -33672,10 +33715,11 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33672
33715
  return 0;
33673
33716
  }
33674
33717
  }, BalanceManager = class _BalanceManager {
33675
- constructor(walletAdapter, storageAdapter, providerRegistry, cashuSpender) {
33718
+ constructor(walletAdapter, storageAdapter, providerRegistry, cashuSpender, logger3) {
33676
33719
  this.walletAdapter = walletAdapter;
33677
33720
  this.storageAdapter = storageAdapter;
33678
33721
  this.providerRegistry = providerRegistry;
33722
+ this.logger = (logger3 ?? consoleLogger).child("BalanceManager");
33679
33723
  if (cashuSpender) {
33680
33724
  this.cashuSpender = cashuSpender;
33681
33725
  } else {
@@ -33685,6 +33729,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33685
33729
  cashuSpender;
33686
33730
  providerWalletOps = /* @__PURE__ */ new Map;
33687
33731
  static PROVIDER_WALLET_COOLDOWN_MS = 1e4;
33732
+ logger;
33688
33733
  _canRunProviderWalletOperation(baseUrl, type) {
33689
33734
  const existing = this.providerWalletOps.get(baseUrl);
33690
33735
  if (!existing) {
@@ -33750,7 +33795,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33750
33795
  const { mintUrl, baseUrl, apiKey, forceRefund } = options;
33751
33796
  const guard = this._canRunProviderWalletOperation(baseUrl, "refund");
33752
33797
  if (!guard.allowed) {
33753
- console.log(`[BalanceManager] Skipping refund for ${baseUrl} - ${guard.reason}`);
33798
+ this.logger.log(`Skipping refund for ${baseUrl} - ${guard.reason}`);
33754
33799
  return { success: false, message: guard.reason };
33755
33800
  }
33756
33801
  this._beginProviderWalletOperation(baseUrl, "refund");
@@ -33770,7 +33815,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33770
33815
  if (apiKeyEntry?.lastUsed) {
33771
33816
  const fiveMinutesAgo = Date.now() - 300000;
33772
33817
  if (apiKeyEntry.lastUsed > fiveMinutesAgo) {
33773
- console.log(`[BalanceManager] Skipping refund for ${baseUrl} - used ${Math.round((Date.now() - apiKeyEntry.lastUsed) / 1000)}s ago`);
33818
+ this.logger.log(`Skipping refund for ${baseUrl} - used ${Math.round((Date.now() - apiKeyEntry.lastUsed) / 1000)}s ago`);
33774
33819
  return {
33775
33820
  success: false,
33776
33821
  message: "API key was used recently, skipping refund"
@@ -33796,7 +33841,8 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33796
33841
  };
33797
33842
  }
33798
33843
  if (fetchResult.error === "No balance to refund") {
33799
- return { success: false, message: "No balance to refund" };
33844
+ this.storageAdapter.removeApiKey(baseUrl);
33845
+ return { success: true, message: "No balance to refund, key cleaned up" };
33800
33846
  }
33801
33847
  const receiveResult = await this.cashuSpender.receiveToken(fetchResult.token);
33802
33848
  const totalAmountMsat = receiveResult.unit === "msat" ? receiveResult.amount : receiveResult.amount * 1000;
@@ -33810,7 +33856,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33810
33856
  requestId: fetchResult.requestId
33811
33857
  };
33812
33858
  } catch (error) {
33813
- console.error("[BalanceManager] API key refund error", error);
33859
+ this.logger.error("API key refund error", error);
33814
33860
  return this._handleRefundError(error, mintUrl, fetchResult?.requestId);
33815
33861
  }
33816
33862
  }
@@ -33859,7 +33905,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33859
33905
  };
33860
33906
  } catch (error) {
33861
33907
  clearTimeout(timeoutId);
33862
- console.error("[BalanceManager.fetchRefundToken] Fetch error", error);
33908
+ this.logger.error("fetchRefundToken fetch error", error);
33863
33909
  if (error instanceof Error) {
33864
33910
  if (error.name === "AbortError") {
33865
33911
  return {
@@ -33882,7 +33928,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33882
33928
  const { mintUrl, baseUrl, amount, token: providedToken } = options;
33883
33929
  const guard = this._canRunProviderWalletOperation(baseUrl, "topup");
33884
33930
  if (!guard.allowed) {
33885
- console.log(`[BalanceManager] Skipping topup for ${baseUrl} - ${guard.reason}`);
33931
+ this.logger.log(`Skipping topup for ${baseUrl} - ${guard.reason}`);
33886
33932
  return { success: false, message: guard.reason };
33887
33933
  }
33888
33934
  this._beginProviderWalletOperation(baseUrl, "topup");
@@ -33919,7 +33965,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33919
33965
  cashuToken = tokenResult.token;
33920
33966
  const topUpResult = await this._postTopUp(baseUrl, apiKey, cashuToken);
33921
33967
  requestId = topUpResult.requestId;
33922
- console.log(topUpResult);
33968
+ this.logger.log("topUpResult:", topUpResult);
33923
33969
  if (!topUpResult.success) {
33924
33970
  await this._recoverFailedTopUp(cashuToken);
33925
33971
  return {
@@ -33935,7 +33981,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33935
33981
  requestId
33936
33982
  };
33937
33983
  } catch (error) {
33938
- console.log("DEBUG", `[TopuPU] topup: Topup result for ${baseUrl}: error=${error}`);
33984
+ this.logger.log(`topup error for ${baseUrl}: ${error}`);
33939
33985
  if (cashuToken) {
33940
33986
  await this._recoverFailedTopUp(cashuToken);
33941
33987
  }
@@ -33952,9 +33998,9 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33952
33998
  p2pkPubkey
33953
33999
  } = options;
33954
34000
  const adjustedAmount = Math.ceil(amount);
33955
- console.log(`[BalanceManager.createProviderToken] Starting: baseUrl=${baseUrl}, mintUrl=${mintUrl}, amount=${amount}, adjustedAmount=${adjustedAmount}, retryCount=${retryCount}`);
34001
+ this.logger.log(`createProviderToken: baseUrl=${baseUrl} mintUrl=${mintUrl} amount=${amount} adjustedAmount=${adjustedAmount} retryCount=${retryCount}`);
33956
34002
  if (!adjustedAmount || isNaN(adjustedAmount)) {
33957
- console.error(`[BalanceManager.createProviderToken] FAILURE: Invalid amount - amount=${amount}, adjustedAmount=${adjustedAmount}`);
34003
+ this.logger.error(`createProviderToken: invalid amount=${amount}`);
33958
34004
  return { success: false, error: "Invalid top up amount" };
33959
34005
  }
33960
34006
  const balanceState = await this.getBalanceState();
@@ -33972,7 +34018,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33972
34018
  }
33973
34019
  if (totalMintBalance + targetProviderBalance < adjustedAmount) {
33974
34020
  const error = new InsufficientBalanceError(adjustedAmount, totalMintBalance + targetProviderBalance, totalMintBalance, Object.entries(balanceState.mintBalances).reduce((max, [url2, balance]) => balance > max.balance ? { url: url2, balance } : max, { url: "", balance: 0 }).url);
33975
- console.error(`[BalanceManager.createProviderToken] FAILURE: Insufficient balance - required=${adjustedAmount}, available=${totalMintBalance + targetProviderBalance}, totalMintBalance=${totalMintBalance}, targetProviderBalance=${targetProviderBalance}, refundableProviderBalance=${refundableProviderBalance}`);
34021
+ this.logger.error(`createProviderToken: insufficient balance required=${adjustedAmount} available=${totalMintBalance + targetProviderBalance} totalMint=${totalMintBalance} targetProvider=${targetProviderBalance}`);
33976
34022
  return { success: false, error: error.message };
33977
34023
  }
33978
34024
  const providerMints = baseUrl && this.providerRegistry ? this.providerRegistry.getProviderMints(baseUrl) : [];
@@ -34008,16 +34054,16 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34008
34054
  maxMintUrl = mintUrl2;
34009
34055
  }
34010
34056
  }
34011
- console.error(`[BalanceManager.createProviderToken] FAILURE: No candidate mints found - requiredAmount=${requiredAmount}, totalMintBalance=${totalMintBalance}, maxBalance=${maxBalance}, maxMintUrl=${maxMintUrl}, providerMints=${JSON.stringify(providerMints)}`);
34057
+ this.logger.error(`createProviderToken: no candidate mints required=${requiredAmount} totalMint=${totalMintBalance} maxBalance=${maxBalance} maxMint=${maxMintUrl}`);
34012
34058
  const error = new InsufficientBalanceError(adjustedAmount, totalMintBalance, maxBalance, maxMintUrl);
34013
34059
  return { success: false, error: error.message };
34014
34060
  }
34015
34061
  let lastError;
34016
34062
  for (const candidateMint of candidates) {
34017
34063
  try {
34018
- console.log(`[BalanceManager.createProviderToken] Attempting mint: ${candidateMint}, amount: ${requiredAmount}`);
34064
+ this.logger.log(`createProviderToken: attempting mint=${candidateMint} amount=${requiredAmount}`);
34019
34065
  const token = await this.walletAdapter.sendToken(candidateMint, requiredAmount, p2pkPubkey);
34020
- console.log(`[BalanceManager.createProviderToken] SUCCESS: Token created from mint ${candidateMint}, all mint balances: ${JSON.stringify(Object.fromEntries(Object.entries(balances).map(([mint, balance]) => [mint, getBalanceInSats(balance, units[mint])])))}`);
34066
+ this.logger.log(`createProviderToken: success from mint=${candidateMint}`);
34021
34067
  return {
34022
34068
  success: true,
34023
34069
  token,
@@ -34026,11 +34072,11 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34026
34072
  };
34027
34073
  } catch (error) {
34028
34074
  const errorMsg = error instanceof Error ? error.message : String(error);
34029
- console.error(`[BalanceManager.createProviderToken] FAILURE: Mint ${candidateMint} failed with error: ${errorMsg}`);
34075
+ this.logger.error(`createProviderToken: mint=${candidateMint} failed: ${errorMsg}`);
34030
34076
  if (error instanceof Error) {
34031
34077
  lastError = errorMsg;
34032
34078
  if (isNetworkErrorMessage(error.message)) {
34033
- console.warn(`[BalanceManager.createProviderToken] Network error from ${candidateMint}, trying next mint...`);
34079
+ this.logger.warn(`createProviderToken: network error from ${candidateMint}, trying next mint...`);
34034
34080
  continue;
34035
34081
  }
34036
34082
  }
@@ -34040,7 +34086,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34040
34086
  };
34041
34087
  }
34042
34088
  }
34043
- console.error(`[BalanceManager.createProviderToken] FAILURE: All candidate mints exhausted - lastError=${lastError}, candidates=${JSON.stringify(candidates)}`);
34089
+ this.logger.error(`createProviderToken: all candidate mints exhausted lastError=${lastError}`);
34044
34090
  return {
34045
34091
  success: false,
34046
34092
  error: lastError || "All candidate mints failed while creating top up token"
@@ -34141,7 +34187,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34141
34187
  return { success: true, requestId };
34142
34188
  } catch (error) {
34143
34189
  clearTimeout(timeoutId);
34144
- console.error("[BalanceManager._postTopUp] Fetch error", error);
34190
+ this.logger.error("_postTopUp fetch error", error);
34145
34191
  if (error instanceof Error) {
34146
34192
  if (error.name === "AbortError") {
34147
34193
  return {
@@ -34164,7 +34210,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34164
34210
  try {
34165
34211
  await this.cashuSpender.receiveToken(cashuToken);
34166
34212
  } catch (error) {
34167
- console.error("[BalanceManager._recoverFailedTopUp] Failed to recover token", error);
34213
+ this.logger.error("_recoverFailedTopUp: failed to recover token", error);
34168
34214
  }
34169
34215
  }
34170
34216
  _handleRefundError(error, mintUrl, requestId) {
@@ -34211,9 +34257,9 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34211
34257
  apiKey: data.api_key
34212
34258
  };
34213
34259
  } else {
34214
- console.log(response.status);
34260
+ this.logger.warn(`getTokenBalance: status=${response.status}`);
34215
34261
  const data = await response.json();
34216
- console.log("FAILED ", data);
34262
+ this.logger.warn("getTokenBalance: FAILED", data);
34217
34263
  const isInvalidApiKey = response.status === 401 && data?.detail?.error?.code === "invalid_api_key" && data?.detail?.error?.message?.includes("proofs already spent");
34218
34264
  return {
34219
34265
  amount: -1,
@@ -34224,7 +34270,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34224
34270
  };
34225
34271
  }
34226
34272
  } catch (error) {
34227
- console.error("ERRORR IN RESTPONSE", error);
34273
+ this.logger.error("getTokenBalance error", error);
34228
34274
  }
34229
34275
  return { amount: -1, reserved: 0, unit: "sat", apiKey: "" };
34230
34276
  }
@@ -34521,9 +34567,10 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34521
34567
  const filtered = normalized.filter((value) => torMode ? true : !isOnionUrl(value));
34522
34568
  return dedupePreserveOrder(filtered.filter((value) => shouldAllowHttp(value, torMode)));
34523
34569
  }, ProviderManager = class _ProviderManager {
34524
- constructor(providerRegistry, store) {
34570
+ constructor(providerRegistry, store, logger3) {
34525
34571
  this.providerRegistry = providerRegistry;
34526
34572
  this.instanceId = `pm_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
34573
+ this.logger = (logger3 ?? consoleLogger).child(`ProviderManager:${this.instanceId}`);
34527
34574
  if (store) {
34528
34575
  this.store = store;
34529
34576
  this.hydrateFromStore();
@@ -34535,6 +34582,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34535
34582
  static COOLDOWN_DURATION_MS = 42000;
34536
34583
  store = null;
34537
34584
  instanceId;
34585
+ logger;
34538
34586
  hydrateFromStore() {
34539
34587
  if (!this.store)
34540
34588
  return;
@@ -34543,10 +34591,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34543
34591
  this.lastFailed = new Map(Object.entries(state.lastFailed));
34544
34592
  const now2 = Date.now();
34545
34593
  this.providersOnCoolDown = state.providersOnCooldown.filter((entry) => now2 - entry.timestamp < _ProviderManager.COOLDOWN_DURATION_MS).map((entry) => [entry.baseUrl, entry.timestamp]);
34546
- console.log(`[ProviderManager:${this.instanceId}] Hydrated from store:`);
34547
- console.log(` failedProviders: ${this.failedProviders.size}`);
34548
- console.log(` lastFailed: ${this.lastFailed.size}`);
34549
- console.log(` providersOnCooldown: ${this.providersOnCoolDown.length}`);
34594
+ this.logger.log(`Hydrated from store: failedProviders=${this.failedProviders.size} lastFailed=${this.lastFailed.size} providersOnCooldown=${this.providersOnCoolDown.length}`);
34550
34595
  }
34551
34596
  getInstanceId() {
34552
34597
  return this.instanceId;
@@ -34558,7 +34603,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34558
34603
  const age = now2 - timestamp;
34559
34604
  const isExpired = age >= _ProviderManager.COOLDOWN_DURATION_MS;
34560
34605
  if (isExpired) {
34561
- console.log(`[cleanupExpiredCooldowns:${this.instanceId}] Removing expired cooldown for ${url2} (age: ${age}ms, cooldown: ${_ProviderManager.COOLDOWN_DURATION_MS}ms)`);
34606
+ this.logger.log(`Removing expired cooldown for ${url2} (age: ${age}ms)`);
34562
34607
  this.failedProviders.delete(url2);
34563
34608
  if (this.store) {
34564
34609
  this.store.getState().removeFailedProvider(url2);
@@ -34568,7 +34613,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34568
34613
  });
34569
34614
  const after = this.providersOnCoolDown.length;
34570
34615
  if (before !== after) {
34571
- console.log(`[cleanupExpiredCooldowns:${this.instanceId}] Cleaned up ${before - after} expired cooldown(s), ${after} remaining`);
34616
+ this.logger.log(`Cleaned up ${before - after} expired cooldown(s), ${after} remaining`);
34572
34617
  }
34573
34618
  }
34574
34619
  getCooldownDurationMs() {
@@ -34598,14 +34643,10 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34598
34643
  markFailed(baseUrl) {
34599
34644
  const now2 = Date.now();
34600
34645
  const lastFailure = this.lastFailed.get(baseUrl);
34601
- console.log(`[markFailed:${this.instanceId}] baseUrl: ${baseUrl}`);
34602
- console.log(`[markFailed:${this.instanceId}] lastFailure from map: ${lastFailure}`);
34603
- console.log(`[markFailed:${this.instanceId}] current timestamp (now): ${now2}`);
34604
- console.log(`[markFailed:${this.instanceId}] COOLDOWN_DURATION_MS: ${_ProviderManager.COOLDOWN_DURATION_MS}`);
34646
+ this.logger.log(`markFailed: ${baseUrl} lastFailure=${lastFailure} now=${now2}`);
34605
34647
  if (lastFailure !== undefined) {
34606
34648
  const timeSinceLastFailure = now2 - lastFailure;
34607
- console.log(`[markFailed:${this.instanceId}] timeSinceLastFailure: ${timeSinceLastFailure}ms`);
34608
- console.log(`[markFailed:${this.instanceId}] isWithinCooldownWindow: ${timeSinceLastFailure < _ProviderManager.COOLDOWN_DURATION_MS}`);
34649
+ this.logger.log(`markFailed: timeSinceLastFailure=${timeSinceLastFailure}ms withinCooldown=${timeSinceLastFailure < _ProviderManager.COOLDOWN_DURATION_MS}`);
34609
34650
  }
34610
34651
  this.lastFailed.set(baseUrl, now2);
34611
34652
  this.failedProviders.add(baseUrl);
@@ -34613,24 +34654,23 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34613
34654
  this.store.getState().setLastFailedTimestamp(baseUrl, now2);
34614
34655
  this.store.getState().addFailedProvider(baseUrl);
34615
34656
  }
34616
- console.log(`[markFailed:${this.instanceId}] Updated lastFailed map for ${baseUrl} to ${now2}`);
34617
- console.log(`[markFailed:${this.instanceId}] failedProviders set size: ${this.failedProviders.size}`);
34657
+ this.logger.log(`markFailed: updated ${baseUrl} to ${now2}, failedProviders=${this.failedProviders.size}`);
34618
34658
  if (lastFailure !== undefined && now2 - lastFailure < _ProviderManager.COOLDOWN_DURATION_MS) {
34619
- console.log(`[markFailed:${this.instanceId}] Second failure detected within cooldown window for ${baseUrl}`);
34659
+ this.logger.log(`markFailed: second failure within cooldown window for ${baseUrl}`);
34620
34660
  if (!this.isOnCooldown(baseUrl)) {
34621
34661
  this.providersOnCoolDown.push([baseUrl, now2]);
34622
34662
  if (this.store) {
34623
34663
  this.store.getState().addProviderOnCooldown(baseUrl, now2);
34624
34664
  }
34625
- console.log(`[markFailed:${this.instanceId}] Provider ${baseUrl} added to cooldown after second failure within 5 minutes`);
34665
+ this.logger.log(`markFailed: ${baseUrl} added to cooldown`);
34626
34666
  } else {
34627
- console.log(`[markFailed:${this.instanceId}] Provider ${baseUrl} is already on cooldown`);
34667
+ this.logger.log(`markFailed: ${baseUrl} already on cooldown`);
34628
34668
  }
34629
34669
  } else {
34630
34670
  if (lastFailure === undefined) {
34631
- console.log(`[markFailed:${this.instanceId}] First failure for ${baseUrl} - not adding to cooldown yet`);
34671
+ this.logger.log(`markFailed: first failure for ${baseUrl}`);
34632
34672
  } else {
34633
- console.log(`[markFailed:${this.instanceId}] Failure outside cooldown window for ${baseUrl} (timeSinceLastFailure: ${now2 - lastFailure}ms)`);
34673
+ this.logger.log(`markFailed: failure outside cooldown window for ${baseUrl} (${now2 - lastFailure}ms ago)`);
34634
34674
  }
34635
34675
  }
34636
34676
  }
@@ -34662,15 +34702,12 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34662
34702
  try {
34663
34703
  const torMode = isTorContext();
34664
34704
  const disabledProviders = new Set(this.providerRegistry.getDisabledProviders());
34665
- console.log(`[findNextBestProvider:${this.instanceId}] Starting search for model: ${modelId}`);
34666
- console.log(`[findNextBestProvider:${this.instanceId}] disabledProviders: ${[...disabledProviders]}`);
34667
- console.log(`[findNextBestProvider:${this.instanceId}] providersOnCooldown: ${this.providersOnCoolDown.map(([url2]) => url2)}`);
34705
+ this.logger.log(`findNextBestProvider: model=${modelId} disabled=${[...disabledProviders].length} onCooldown=${this.providersOnCoolDown.length}`);
34668
34706
  const allProviders = this.providerRegistry.getAllProvidersModels();
34669
- console.log(`[findNextBestProvider:${this.instanceId}] Total providers in registry: ${Object.keys(allProviders).length}`);
34707
+ this.logger.log(`findNextBestProvider: total providers=${Object.keys(allProviders).length}`);
34670
34708
  const candidates = [];
34671
34709
  for (const [baseUrl, models] of Object.entries(allProviders)) {
34672
34710
  if (baseUrl === currentBaseUrl) {
34673
- console.log(`[findNextBestProvider:${this.instanceId}] SKIP (current): ${baseUrl}`);
34674
34711
  continue;
34675
34712
  }
34676
34713
  if (disabledProviders.has(baseUrl)) {
@@ -34696,7 +34733,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34696
34733
  return null;
34697
34734
  }
34698
34735
  } catch (error) {
34699
- console.error("Error finding next best provider:", error);
34736
+ this.logger.error("findNextBestProvider error:", error);
34700
34737
  return null;
34701
34738
  }
34702
34739
  }
@@ -34804,13 +34841,9 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34804
34841
  if (res) {
34805
34842
  const tokensFromImage = calculateImageTokens(res.width, res.height);
34806
34843
  imageTokens += tokensFromImage;
34807
- console.log("IMAGE INPUT RESOLUTION", {
34808
- width: res.width,
34809
- height: res.height,
34810
- tokensFromImage
34811
- });
34844
+ this.logger.log(`IMAGE INPUT RESOLUTION width=${res.width} height=${res.height} tokens=${tokensFromImage}`);
34812
34845
  } else {
34813
- console.log("IMAGE INPUT RESOLUTION", "unknown (unsupported format or parse failure)");
34846
+ this.logger.log("IMAGE INPUT RESOLUTION: unknown format");
34814
34847
  }
34815
34848
  }
34816
34849
  }
@@ -34841,7 +34874,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
34841
34874
  const totalEstimatedCosts = (promptCosts + completionCost) * 1.05;
34842
34875
  return totalEstimatedCosts;
34843
34876
  } catch (e) {
34844
- console.error(e);
34877
+ this.logger.error("getRequiredSatsForModel error:", e);
34845
34878
  return 0;
34846
34879
  }
34847
34880
  }
@@ -35967,9 +36000,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
35967
36000
  const distributionMap = {};
35968
36001
  for (const entry of apiKeys) {
35969
36002
  const sum = entry.balance || 0;
35970
- if (sum > 0) {
35971
- distributionMap[entry.baseUrl] = (distributionMap[entry.baseUrl] || 0) + sum;
35972
- }
36003
+ distributionMap[entry.baseUrl] = (distributionMap[entry.baseUrl] || 0) + sum;
35973
36004
  }
35974
36005
  return Object.entries(distributionMap).map(([baseUrl, amt]) => ({ baseUrl, amount: amt })).sort((a, b) => b.amount - a.amount);
35975
36006
  },
@@ -36132,38 +36163,41 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
36132
36163
  updateXcashuTokenTryCount: (token, tryCount) => {
36133
36164
  store.getState().updateXcashuTokenTryCount(token, tryCount);
36134
36165
  }
36135
- }), createProviderRegistryFromStore = (store) => ({
36136
- getModelsForProvider: (baseUrl) => {
36137
- const normalized = normalizeBaseUrl5(baseUrl);
36138
- return store.getState().modelsFromAllProviders[normalized] || [];
36139
- },
36140
- getDisabledProviders: () => store.getState().disabledProviders,
36141
- getProviderMints: (baseUrl) => {
36142
- const normalized = normalizeBaseUrl5(baseUrl);
36143
- return store.getState().mintsFromAllProviders[normalized] || [];
36144
- },
36145
- getProviderInfo: async (baseUrl) => {
36146
- const normalized = normalizeBaseUrl5(baseUrl);
36147
- const cached = store.getState().infoFromAllProviders[normalized];
36148
- if (cached)
36149
- return cached;
36150
- try {
36151
- const response = await fetch(`${normalized}v1/info`);
36152
- if (!response.ok) {
36153
- throw new Error(`Failed ${response.status}`);
36166
+ }), createProviderRegistryFromStore = (store, logger3) => {
36167
+ const log3 = (logger3 ?? consoleLogger).child("ProviderRegistry");
36168
+ return {
36169
+ getModelsForProvider: (baseUrl) => {
36170
+ const normalized = normalizeBaseUrl5(baseUrl);
36171
+ return store.getState().modelsFromAllProviders[normalized] || [];
36172
+ },
36173
+ getDisabledProviders: () => store.getState().disabledProviders,
36174
+ getProviderMints: (baseUrl) => {
36175
+ const normalized = normalizeBaseUrl5(baseUrl);
36176
+ return store.getState().mintsFromAllProviders[normalized] || [];
36177
+ },
36178
+ getProviderInfo: async (baseUrl) => {
36179
+ const normalized = normalizeBaseUrl5(baseUrl);
36180
+ const cached = store.getState().infoFromAllProviders[normalized];
36181
+ if (cached)
36182
+ return cached;
36183
+ try {
36184
+ const response = await fetch(`${normalized}v1/info`);
36185
+ if (!response.ok) {
36186
+ throw new Error(`Failed ${response.status}`);
36187
+ }
36188
+ const info = await response.json();
36189
+ const next = { ...store.getState().infoFromAllProviders };
36190
+ next[normalized] = info;
36191
+ store.getState().setInfoFromAllProviders(next);
36192
+ return info;
36193
+ } catch (error) {
36194
+ log3.warn(`Failed to fetch provider info from ${normalized}:`, error);
36195
+ return null;
36154
36196
  }
36155
- const info = await response.json();
36156
- const next = { ...store.getState().infoFromAllProviders };
36157
- next[normalized] = info;
36158
- store.getState().setInfoFromAllProviders(next);
36159
- return info;
36160
- } catch (error) {
36161
- console.warn(`Failed to fetch provider info from ${normalized}:`, error);
36162
- return null;
36163
- }
36164
- },
36165
- getAllProvidersModels: () => store.getState().modelsFromAllProviders
36166
- }), isBrowser3 = () => {
36197
+ },
36198
+ getAllProvidersModels: () => store.getState().modelsFromAllProviders
36199
+ };
36200
+ }, isBrowser3 = () => {
36167
36201
  try {
36168
36202
  return typeof window !== "undefined" && typeof window.localStorage !== "undefined";
36169
36203
  } catch {
@@ -36228,6 +36262,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
36228
36262
  this.walletAdapter = walletAdapter;
36229
36263
  this.storageAdapter = storageAdapter;
36230
36264
  this.providerRegistry = providerRegistry;
36265
+ this.logger = (options.logger ?? consoleLogger).child("RoutstrClient");
36231
36266
  this.balanceManager = new BalanceManager(walletAdapter, storageAdapter, providerRegistry);
36232
36267
  this.cashuSpender = new CashuSpender(walletAdapter, storageAdapter, providerRegistry, this.balanceManager);
36233
36268
  this.streamProcessor = new StreamProcessor;
@@ -36235,7 +36270,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
36235
36270
  this.mode = mode;
36236
36271
  this.usageTrackingDriver = options.usageTrackingDriver;
36237
36272
  this.sdkStore = options.sdkStore;
36238
- this.providerManager = options.providerManager ?? new ProviderManager(providerRegistry, this.sdkStore);
36273
+ this.providerManager = options.providerManager ?? new ProviderManager(providerRegistry, this.sdkStore, this.logger);
36239
36274
  }
36240
36275
  cashuSpender;
36241
36276
  balanceManager;
@@ -36246,6 +36281,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
36246
36281
  debugLevel = "WARN";
36247
36282
  usageTrackingDriver;
36248
36283
  sdkStore;
36284
+ logger;
36249
36285
  getMode() {
36250
36286
  return this.mode;
36251
36287
  }
@@ -36264,13 +36300,13 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
36264
36300
  if (levelPriority[level] >= levelPriority[this.debugLevel]) {
36265
36301
  switch (level) {
36266
36302
  case "DEBUG":
36267
- console.log(...args);
36303
+ this.logger.log(...args);
36268
36304
  break;
36269
36305
  case "WARN":
36270
- console.warn(...args);
36306
+ this.logger.warn(...args);
36271
36307
  break;
36272
36308
  case "ERROR":
36273
- console.error(...args);
36309
+ this.logger.error(...args);
36274
36310
  break;
36275
36311
  }
36276
36312
  }
@@ -36702,7 +36738,7 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
36702
36738
  tryNextProvider = true;
36703
36739
  }
36704
36740
  }
36705
- if ((status === 401 || status === 403 || status === 413 || status === 400 || status === 429 || status === 500 || status === 502 || status === 503 || status === 504 || status === 521) && !tryNextProvider) {
36741
+ if ((status === 401 || status === 403 || status === 404 || status === 413 || status === 400 || status === 429 || status === 500 || status === 502 || status === 503 || status === 504 || status === 521) && !tryNextProvider) {
36706
36742
  this._log("DEBUG", `[RoutstrClient] _handleErrorResponse: Status ${status} (${status === 429 ? "rate limited" : "auth/server error"}), attempting refund for ${baseUrl}, mode=${this.mode}`);
36707
36743
  if (this.mode === "apikeys") {
36708
36744
  this._log("DEBUG", `[RoutstrClient] _handleErrorResponse: Attempting API key refund for ${baseUrl}, key preview=${token}`);
@@ -37044,6 +37080,18 @@ var init_dist3 = __esm(() => {
37044
37080
  import_rxjs24 = __toESM(require_cjs(), 1);
37045
37081
  init_cashu_ts_es();
37046
37082
  init_vanilla();
37083
+ consoleLogger = makeConsoleLogger();
37084
+ noopLogger = {
37085
+ log: () => {
37086
+ },
37087
+ warn: () => {
37088
+ },
37089
+ error: () => {
37090
+ },
37091
+ debug: () => {
37092
+ },
37093
+ child: () => noopLogger
37094
+ };
37047
37095
  InsufficientBalanceError = class extends Error {
37048
37096
  constructor(required, available, maxMintBalance = 0, maxMintUrl = "", customMessage) {
37049
37097
  super(customMessage ?? `Insufficient balance: need ${required} sats, have ${available} sats available. ` + (maxMintBalance > 0 ? `Largest mint balance: ${maxMintBalance} sats from ${maxMintUrl}` : ""));
@@ -37332,7 +37380,19 @@ function saveDaemonConfig(config) {
37332
37380
  }
37333
37381
 
37334
37382
  // node_modules/@routstr/sdk/dist/storage/index.mjs
37335
- async function createBunSqliteDriver2(dbPath) {
37383
+ function makeConsoleLogger2(prefix) {
37384
+ const fmt = (args) => prefix ? [prefix, ...args] : args;
37385
+ return {
37386
+ log: (...args) => console.log(...fmt(args)),
37387
+ warn: (...args) => console.warn(...fmt(args)),
37388
+ error: (...args) => console.error(...fmt(args)),
37389
+ debug: (...args) => console.log(...fmt(args)),
37390
+ child: (p) => makeConsoleLogger2(prefix ? `${prefix}:${p}` : p)
37391
+ };
37392
+ }
37393
+ var consoleLogger2 = makeConsoleLogger2();
37394
+ async function createBunSqliteDriver2(dbPath, options) {
37395
+ const logger4 = (options?.logger ?? consoleLogger2).child("BunSqliteDriver");
37336
37396
  const SQLite = (await import("bun:sqlite")).default;
37337
37397
  const db = new SQLite(dbPath);
37338
37398
  db.run(`
@@ -37356,7 +37416,7 @@ async function createBunSqliteDriver2(dbPath) {
37356
37416
  throw parseError;
37357
37417
  }
37358
37418
  } catch (error) {
37359
- console.error(`SQLite getItem failed for key "${key}":`, error);
37419
+ logger4.error(`getItem failed for key "${key}":`, error);
37360
37420
  return defaultValue;
37361
37421
  }
37362
37422
  },
@@ -37364,14 +37424,14 @@ async function createBunSqliteDriver2(dbPath) {
37364
37424
  try {
37365
37425
  db.query("INSERT INTO sdk_storage (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value").run(key, JSON.stringify(value));
37366
37426
  } catch (error) {
37367
- console.error(`SQLite setItem failed for key "${key}":`, error);
37427
+ logger4.error(`setItem failed for key "${key}":`, error);
37368
37428
  }
37369
37429
  },
37370
37430
  async removeItem(key) {
37371
37431
  try {
37372
37432
  db.query("DELETE FROM sdk_storage WHERE key = ?").run(key);
37373
37433
  } catch (error) {
37374
- console.error(`SQLite removeItem failed for key "${key}":`, error);
37434
+ logger4.error(`removeItem failed for key "${key}":`, error);
37375
37435
  }
37376
37436
  }
37377
37437
  };