@routstr/sdk 0.2.5 → 0.2.6

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.
@@ -1,12 +1,4 @@
1
1
  import { createStore } from 'zustand/vanilla';
2
- import { getDecodedToken } from '@cashu/cashu-ts';
3
-
4
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
5
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
6
- }) : x)(function(x) {
7
- if (typeof require !== "undefined") return require.apply(this, arguments);
8
- throw Error('Dynamic require of "' + x + '" is not supported');
9
- });
10
2
 
11
3
  // storage/drivers/localStorage.ts
12
4
  var canUseLocalStorage = () => {
@@ -120,38 +112,54 @@ var createMemoryDriver = (seed) => {
120
112
  var isBun = () => {
121
113
  return typeof process.versions.bun !== "undefined";
122
114
  };
123
- var createDatabase = (dbPath) => {
115
+ var cachedDbModule = null;
116
+ var loadDatabase = async (dbPath) => {
124
117
  if (isBun()) {
125
118
  throw new Error(
126
- "SQLite driver not supported in Bun. Use createMemoryDriver() instead."
119
+ "SQLite driver not supported in Bun. Use createBunSqliteDriver() instead."
127
120
  );
128
121
  }
129
- let Database = null;
130
122
  try {
131
- Database = __require("better-sqlite3");
123
+ if (!cachedDbModule) {
124
+ cachedDbModule = (await import('better-sqlite3')).default;
125
+ }
126
+ return new cachedDbModule(dbPath);
132
127
  } catch (error) {
133
128
  throw new Error(
134
129
  `better-sqlite3 is required for sqlite storage. Install it to use sqlite storage. (${error})`
135
130
  );
136
131
  }
137
- return new Database(dbPath);
138
132
  };
139
133
  var createSqliteDriver = (options = {}) => {
140
134
  const dbPath = options.dbPath || "routstr.sqlite";
141
135
  const tableName = options.tableName || "sdk_storage";
142
- const db = createDatabase(dbPath);
143
- db.exec(
144
- `CREATE TABLE IF NOT EXISTS ${tableName} (key TEXT PRIMARY KEY, value TEXT NOT NULL)`
145
- );
146
- const selectStmt = db.prepare(`SELECT value FROM ${tableName} WHERE key = ?`);
147
- const upsertStmt = db.prepare(
148
- `INSERT INTO ${tableName} (key, value) VALUES (?, ?)
136
+ let db;
137
+ let selectStmt;
138
+ let upsertStmt;
139
+ let deleteStmt;
140
+ const initDb = async () => {
141
+ if (!db) {
142
+ db = await loadDatabase(dbPath);
143
+ db.exec(
144
+ `CREATE TABLE IF NOT EXISTS ${tableName} (key TEXT PRIMARY KEY, value TEXT NOT NULL)`
145
+ );
146
+ selectStmt = db.prepare(`SELECT value FROM ${tableName} WHERE key = ?`);
147
+ upsertStmt = db.prepare(
148
+ `INSERT INTO ${tableName} (key, value) VALUES (?, ?)
149
149
  ON CONFLICT(key) DO UPDATE SET value = excluded.value`
150
- );
151
- const deleteStmt = db.prepare(`DELETE FROM ${tableName} WHERE key = ?`);
150
+ );
151
+ deleteStmt = db.prepare(`DELETE FROM ${tableName} WHERE key = ?`);
152
+ }
153
+ };
154
+ const ensureInit = async () => {
155
+ if (!db) {
156
+ await initDb();
157
+ }
158
+ };
152
159
  return {
153
160
  async getItem(key, defaultValue) {
154
161
  try {
162
+ await ensureInit();
155
163
  const row = selectStmt.get(key);
156
164
  if (!row || typeof row.value !== "string") return defaultValue;
157
165
  try {
@@ -169,6 +177,7 @@ var createSqliteDriver = (options = {}) => {
169
177
  },
170
178
  async setItem(key, value) {
171
179
  try {
180
+ await ensureInit();
172
181
  upsertStmt.run(key, JSON.stringify(value));
173
182
  } catch (error) {
174
183
  console.error(`SQLite setItem failed for key "${key}":`, error);
@@ -176,6 +185,7 @@ var createSqliteDriver = (options = {}) => {
176
185
  },
177
186
  async removeItem(key) {
178
187
  try {
188
+ await ensureInit();
179
189
  deleteStmt.run(key);
180
190
  } catch (error) {
181
191
  console.error(`SQLite removeItem failed for key "${key}":`, error);
@@ -183,6 +193,54 @@ var createSqliteDriver = (options = {}) => {
183
193
  }
184
194
  };
185
195
  };
196
+ async function createBunSqliteDriver(dbPath) {
197
+ const SQLite = (await import(
198
+ /* webpackIgnore: true */
199
+ 'bun:sqlite'
200
+ )).default;
201
+ const db = new SQLite(dbPath);
202
+ db.run(`
203
+ CREATE TABLE IF NOT EXISTS sdk_storage (
204
+ key TEXT PRIMARY KEY,
205
+ value TEXT NOT NULL
206
+ )
207
+ `);
208
+ return {
209
+ async getItem(key, defaultValue) {
210
+ try {
211
+ const row = db.query("SELECT value FROM sdk_storage WHERE key = ?").get(key);
212
+ if (!row || typeof row.value !== "string") return defaultValue;
213
+ try {
214
+ return JSON.parse(row.value);
215
+ } catch (parseError) {
216
+ if (typeof defaultValue === "string") {
217
+ return row.value;
218
+ }
219
+ throw parseError;
220
+ }
221
+ } catch (error) {
222
+ console.error(`SQLite getItem failed for key "${key}":`, error);
223
+ return defaultValue;
224
+ }
225
+ },
226
+ async setItem(key, value) {
227
+ try {
228
+ db.query(
229
+ "INSERT INTO sdk_storage (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value"
230
+ ).run(key, JSON.stringify(value));
231
+ } catch (error) {
232
+ console.error(`SQLite setItem failed for key "${key}":`, error);
233
+ }
234
+ },
235
+ async removeItem(key) {
236
+ try {
237
+ db.query("DELETE FROM sdk_storage WHERE key = ?").run(key);
238
+ } catch (error) {
239
+ console.error(`SQLite removeItem failed for key "${key}":`, error);
240
+ }
241
+ }
242
+ };
243
+ }
186
244
 
187
245
  // storage/drivers/indexedDB.ts
188
246
  var isBrowser = typeof indexedDB !== "undefined";
@@ -288,9 +346,9 @@ var SDK_STORAGE_KEYS = {
288
346
  INFO_FROM_ALL_PROVIDERS: "info_from_all_providers",
289
347
  LAST_MODELS_UPDATE: "lastModelsUpdate",
290
348
  LAST_BASE_URLS_UPDATE: "lastBaseUrlsUpdate",
291
- LOCAL_CASHU_TOKENS: "local_cashu_tokens",
292
349
  API_KEYS: "api_keys",
293
350
  CHILD_KEYS: "child_keys",
351
+ XCASHU_TOKENS: "xcashu_tokens",
294
352
  ROUTSTR21_MODELS: "routstr21Models",
295
353
  LAST_ROUTSTR21_MODELS_UPDATE: "lastRoutstr21ModelsUpdate",
296
354
  CACHED_RECEIVE_TOKENS: "cached_receive_tokens",
@@ -481,21 +539,23 @@ var normalizeBaseUrl2 = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUr
481
539
  var isBun2 = () => {
482
540
  return typeof process.versions.bun !== "undefined";
483
541
  };
484
- var createDatabase2 = (dbPath) => {
542
+ var cachedDbModule2 = null;
543
+ var loadDatabase2 = async (dbPath) => {
485
544
  if (isBun2()) {
486
545
  throw new Error(
487
546
  "SQLite driver not supported in Bun. Use createMemoryDriver() instead."
488
547
  );
489
548
  }
490
- let Database = null;
491
549
  try {
492
- Database = __require("better-sqlite3");
550
+ if (!cachedDbModule2) {
551
+ cachedDbModule2 = (await import('better-sqlite3')).default;
552
+ }
553
+ return new cachedDbModule2(dbPath);
493
554
  } catch (error) {
494
555
  throw new Error(
495
556
  `better-sqlite3 is required for sqlite usage tracking. Install it to use sqlite storage. (${error})`
496
557
  );
497
558
  }
498
- return new Database(dbPath);
499
559
  };
500
560
  var buildWhereClause = (options = {}) => {
501
561
  const clauses = [];
@@ -532,38 +592,49 @@ var buildWhereClause = (options = {}) => {
532
592
  var createSqliteUsageTrackingDriver = (options = {}) => {
533
593
  const dbPath = options.dbPath || "routstr.sqlite";
534
594
  const tableName = options.tableName || "usage_tracking";
535
- const db = createDatabase2(dbPath);
536
595
  const legacyStorageDriver = options.legacyStorageDriver;
537
- db.exec(`
538
- CREATE TABLE IF NOT EXISTS ${tableName} (
539
- id TEXT PRIMARY KEY,
540
- timestamp INTEGER NOT NULL,
541
- model_id TEXT NOT NULL,
542
- base_url TEXT NOT NULL,
543
- request_id TEXT NOT NULL,
544
- cost REAL NOT NULL,
545
- sats_cost REAL NOT NULL,
546
- prompt_tokens INTEGER NOT NULL,
547
- completion_tokens INTEGER NOT NULL,
548
- total_tokens INTEGER NOT NULL,
549
- client TEXT,
550
- session_id TEXT,
551
- tags TEXT
552
- );
553
- CREATE INDEX IF NOT EXISTS idx_${tableName}_timestamp ON ${tableName}(timestamp);
554
- CREATE INDEX IF NOT EXISTS idx_${tableName}_model_id ON ${tableName}(model_id);
555
- CREATE INDEX IF NOT EXISTS idx_${tableName}_base_url ON ${tableName}(base_url);
556
- CREATE INDEX IF NOT EXISTS idx_${tableName}_session_id ON ${tableName}(session_id);
557
- CREATE INDEX IF NOT EXISTS idx_${tableName}_client ON ${tableName}(client);
558
- `);
559
- const insertStmt = db.prepare(`
560
- INSERT OR REPLACE INTO ${tableName} (
561
- id, timestamp, model_id, base_url, request_id,
562
- cost, sats_cost, prompt_tokens, completion_tokens, total_tokens,
563
- client, session_id, tags
564
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
565
- `);
596
+ let db;
597
+ let insertStmt;
566
598
  let migrationComplete = false;
599
+ const initDb = async () => {
600
+ if (!db) {
601
+ db = await loadDatabase2(dbPath);
602
+ db.exec(`
603
+ CREATE TABLE IF NOT EXISTS ${tableName} (
604
+ id TEXT PRIMARY KEY,
605
+ timestamp INTEGER NOT NULL,
606
+ model_id TEXT NOT NULL,
607
+ base_url TEXT NOT NULL,
608
+ request_id TEXT NOT NULL,
609
+ cost REAL NOT NULL,
610
+ sats_cost REAL NOT NULL,
611
+ prompt_tokens INTEGER NOT NULL,
612
+ completion_tokens INTEGER NOT NULL,
613
+ total_tokens INTEGER NOT NULL,
614
+ client TEXT,
615
+ session_id TEXT,
616
+ tags TEXT
617
+ );
618
+ CREATE INDEX IF NOT EXISTS idx_${tableName}_timestamp ON ${tableName}(timestamp);
619
+ CREATE INDEX IF NOT EXISTS idx_${tableName}_model_id ON ${tableName}(model_id);
620
+ CREATE INDEX IF NOT EXISTS idx_${tableName}_base_url ON ${tableName}(base_url);
621
+ CREATE INDEX IF NOT EXISTS idx_${tableName}_session_id ON ${tableName}(session_id);
622
+ CREATE INDEX IF NOT EXISTS idx_${tableName}_client ON ${tableName}(client);
623
+ `);
624
+ insertStmt = db.prepare(`
625
+ INSERT OR REPLACE INTO ${tableName} (
626
+ id, timestamp, model_id, base_url, request_id,
627
+ cost, sats_cost, prompt_tokens, completion_tokens, total_tokens,
628
+ client, session_id, tags
629
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
630
+ `);
631
+ }
632
+ };
633
+ const ensureInit = async () => {
634
+ if (!db) {
635
+ await initDb();
636
+ }
637
+ };
567
638
  const appendOne = (entry) => {
568
639
  insertStmt.run(
569
640
  entry.id,
@@ -621,19 +692,23 @@ var createSqliteUsageTrackingDriver = (options = {}) => {
621
692
  });
622
693
  return {
623
694
  async migrate() {
695
+ await ensureInit();
624
696
  await ensureMigrated();
625
697
  },
626
698
  async append(entry) {
699
+ await ensureInit();
627
700
  await ensureMigrated();
628
701
  appendOne(entry);
629
702
  },
630
703
  async appendMany(entries) {
704
+ await ensureInit();
631
705
  await ensureMigrated();
632
706
  for (const entry of entries) {
633
707
  appendOne(entry);
634
708
  }
635
709
  },
636
710
  async list(options2 = {}) {
711
+ await ensureInit();
637
712
  await ensureMigrated();
638
713
  const { sql, params } = buildWhereClause(options2);
639
714
  const limitSql = typeof options2.limit === "number" ? " LIMIT ?" : "";
@@ -646,6 +721,7 @@ var createSqliteUsageTrackingDriver = (options = {}) => {
646
721
  return rows.map(mapRow);
647
722
  },
648
723
  async count(options2 = {}) {
724
+ await ensureInit();
649
725
  await ensureMigrated();
650
726
  const { sql, params } = buildWhereClause(options2);
651
727
  const stmt = db.prepare(`SELECT COUNT(*) as count FROM ${tableName} ${sql}`);
@@ -653,20 +729,197 @@ var createSqliteUsageTrackingDriver = (options = {}) => {
653
729
  return Number(row?.count ?? 0);
654
730
  },
655
731
  async deleteOlderThan(timestamp) {
732
+ await ensureInit();
656
733
  await ensureMigrated();
657
734
  const stmt = db.prepare(`DELETE FROM ${tableName} WHERE timestamp < ?`);
658
735
  const result = stmt.run(timestamp);
659
736
  return result.changes;
660
737
  },
661
738
  async clear() {
739
+ await ensureInit();
662
740
  await ensureMigrated();
663
741
  db.prepare(`DELETE FROM ${tableName}`).run();
664
742
  }
665
743
  };
666
744
  };
667
745
 
668
- // storage/usageTracking/memory.ts
746
+ // storage/usageTracking/bunSqlite.ts
747
+ var MIGRATION_MARKER_KEY3 = "usage_tracking_migration_v1";
669
748
  var normalizeBaseUrl3 = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
749
+ var buildWhereClause2 = (options = {}) => {
750
+ const clauses = [];
751
+ const params = [];
752
+ if (typeof options.before === "number") {
753
+ clauses.push("timestamp < ?");
754
+ params.push(options.before);
755
+ }
756
+ if (typeof options.after === "number") {
757
+ clauses.push("timestamp > ?");
758
+ params.push(options.after);
759
+ }
760
+ if (options.modelId) {
761
+ clauses.push("model_id = ?");
762
+ params.push(options.modelId);
763
+ }
764
+ if (options.baseUrl) {
765
+ clauses.push("base_url = ?");
766
+ params.push(normalizeBaseUrl3(options.baseUrl));
767
+ }
768
+ if (options.sessionId) {
769
+ clauses.push("session_id = ?");
770
+ params.push(options.sessionId);
771
+ }
772
+ if (options.client) {
773
+ clauses.push("client = ?");
774
+ params.push(options.client);
775
+ }
776
+ return {
777
+ sql: clauses.length > 0 ? `WHERE ${clauses.join(" AND ")}` : "",
778
+ params
779
+ };
780
+ };
781
+ var createBunSqliteUsageTrackingDriver = (options = {}) => {
782
+ const dbPath = options.dbPath || "routstr.sqlite";
783
+ const tableName = options.tableName || "usage_tracking";
784
+ const legacyStorageDriver = options.legacyStorageDriver;
785
+ const SQLiteDatabase = options.sqlite?.Database;
786
+ let migrationPromise = null;
787
+ if (!SQLiteDatabase) {
788
+ throw new Error(
789
+ "Bun SQLite Database constructor is required. Pass { sqlite: { Database } } when creating the driver."
790
+ );
791
+ }
792
+ const db = new SQLiteDatabase(dbPath);
793
+ db.run(`
794
+ CREATE TABLE IF NOT EXISTS ${tableName} (
795
+ id TEXT PRIMARY KEY,
796
+ timestamp INTEGER NOT NULL,
797
+ model_id TEXT NOT NULL,
798
+ base_url TEXT NOT NULL,
799
+ request_id TEXT NOT NULL,
800
+ cost REAL NOT NULL,
801
+ sats_cost REAL NOT NULL,
802
+ prompt_tokens INTEGER NOT NULL,
803
+ completion_tokens INTEGER NOT NULL,
804
+ total_tokens INTEGER NOT NULL,
805
+ client TEXT,
806
+ session_id TEXT,
807
+ tags TEXT
808
+ )
809
+ `);
810
+ db.run(`CREATE INDEX IF NOT EXISTS idx_${tableName}_timestamp ON ${tableName}(timestamp)`);
811
+ db.run(`CREATE INDEX IF NOT EXISTS idx_${tableName}_model_id ON ${tableName}(model_id)`);
812
+ db.run(`CREATE INDEX IF NOT EXISTS idx_${tableName}_base_url ON ${tableName}(base_url)`);
813
+ const appendOne = (entry) => {
814
+ db.query(`
815
+ INSERT OR REPLACE INTO ${tableName} (
816
+ id, timestamp, model_id, base_url, request_id,
817
+ cost, sats_cost, prompt_tokens, completion_tokens, total_tokens,
818
+ client, session_id, tags
819
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
820
+ `).run(
821
+ entry.id,
822
+ entry.timestamp,
823
+ entry.modelId,
824
+ normalizeBaseUrl3(entry.baseUrl),
825
+ entry.requestId,
826
+ entry.cost,
827
+ entry.satsCost,
828
+ entry.promptTokens,
829
+ entry.completionTokens,
830
+ entry.totalTokens,
831
+ entry.client ?? null,
832
+ entry.sessionId ?? null,
833
+ JSON.stringify(entry.tags ?? [])
834
+ );
835
+ };
836
+ const mapRow = (row) => ({
837
+ id: row.id,
838
+ timestamp: row.timestamp,
839
+ modelId: row.model_id,
840
+ baseUrl: row.base_url,
841
+ requestId: row.request_id,
842
+ cost: row.cost,
843
+ satsCost: row.sats_cost,
844
+ promptTokens: row.prompt_tokens,
845
+ completionTokens: row.completion_tokens,
846
+ totalTokens: row.total_tokens,
847
+ client: row.client ?? void 0,
848
+ sessionId: row.session_id ?? void 0,
849
+ tags: typeof row.tags === "string" ? JSON.parse(row.tags) : void 0
850
+ });
851
+ const ensureMigrated = async () => {
852
+ if (!legacyStorageDriver) return;
853
+ if (!migrationPromise) {
854
+ migrationPromise = (async () => {
855
+ const migrated = await legacyStorageDriver.getItem(
856
+ MIGRATION_MARKER_KEY3,
857
+ false
858
+ );
859
+ if (migrated) return;
860
+ const legacyEntries = await legacyStorageDriver.getItem(
861
+ SDK_STORAGE_KEYS.USAGE_TRACKING,
862
+ []
863
+ );
864
+ if (legacyEntries.length > 0) {
865
+ for (const entry of legacyEntries) {
866
+ appendOne(entry);
867
+ }
868
+ await legacyStorageDriver.removeItem(SDK_STORAGE_KEYS.USAGE_TRACKING);
869
+ }
870
+ await legacyStorageDriver.setItem(MIGRATION_MARKER_KEY3, true);
871
+ })();
872
+ }
873
+ await migrationPromise;
874
+ };
875
+ return {
876
+ async migrate() {
877
+ await ensureMigrated();
878
+ },
879
+ async append(entry) {
880
+ await ensureMigrated();
881
+ appendOne(entry);
882
+ },
883
+ async appendMany(entries) {
884
+ await ensureMigrated();
885
+ for (const entry of entries) {
886
+ appendOne(entry);
887
+ }
888
+ },
889
+ async list(options2 = {}) {
890
+ await ensureMigrated();
891
+ const { sql, params } = buildWhereClause2(options2);
892
+ const limitSql = typeof options2.limit === "number" ? " LIMIT ?" : "";
893
+ const query = `SELECT * FROM ${tableName} ${sql} ORDER BY timestamp DESC${limitSql}`;
894
+ let rows;
895
+ if (typeof options2.limit === "number") {
896
+ rows = db.query(query).all(...params, options2.limit);
897
+ } else {
898
+ rows = db.query(query).all(...params);
899
+ }
900
+ return rows.map(mapRow);
901
+ },
902
+ async count(options2 = {}) {
903
+ const { sql, params } = buildWhereClause2(options2);
904
+ const query = `SELECT COUNT(*) as count FROM ${tableName} ${sql}`;
905
+ const row = db.query(query).get(...params);
906
+ return Number(row?.count ?? 0);
907
+ },
908
+ async deleteOlderThan(timestamp) {
909
+ await ensureMigrated();
910
+ const before = timestamp;
911
+ const result = db.query(`DELETE FROM ${tableName} WHERE timestamp < ?`).run(before);
912
+ return result.changes ?? 0;
913
+ },
914
+ async clear() {
915
+ await ensureMigrated();
916
+ db.query(`DELETE FROM ${tableName}`).run();
917
+ }
918
+ };
919
+ };
920
+
921
+ // storage/usageTracking/memory.ts
922
+ var normalizeBaseUrl4 = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
670
923
  var matchesFilters2 = (entry, options = {}) => {
671
924
  if (typeof options.before === "number" && entry.timestamp >= options.before) {
672
925
  return false;
@@ -677,7 +930,7 @@ var matchesFilters2 = (entry, options = {}) => {
677
930
  if (options.modelId && entry.modelId !== options.modelId) {
678
931
  return false;
679
932
  }
680
- if (options.baseUrl && normalizeBaseUrl3(entry.baseUrl) !== normalizeBaseUrl3(options.baseUrl)) {
933
+ if (options.baseUrl && normalizeBaseUrl4(entry.baseUrl) !== normalizeBaseUrl4(options.baseUrl)) {
681
934
  return false;
682
935
  }
683
936
  if (options.sessionId && entry.sessionId !== options.sessionId) {
@@ -691,18 +944,18 @@ var matchesFilters2 = (entry, options = {}) => {
691
944
  var createMemoryUsageTrackingDriver = (seed = []) => {
692
945
  const store = /* @__PURE__ */ new Map();
693
946
  for (const entry of seed) {
694
- store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl3(entry.baseUrl) });
947
+ store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl4(entry.baseUrl) });
695
948
  }
696
949
  return {
697
950
  async migrate() {
698
951
  return;
699
952
  },
700
953
  async append(entry) {
701
- store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl3(entry.baseUrl) });
954
+ store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl4(entry.baseUrl) });
702
955
  },
703
956
  async appendMany(entries) {
704
957
  for (const entry of entries) {
705
- store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl3(entry.baseUrl) });
958
+ store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl4(entry.baseUrl) });
706
959
  }
707
960
  },
708
961
  async list(options = {}) {
@@ -730,20 +983,7 @@ var createMemoryUsageTrackingDriver = (seed = []) => {
730
983
  }
731
984
  };
732
985
  };
733
- var normalizeBaseUrl4 = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
734
- var getCashuTokenBalance = (token) => {
735
- try {
736
- const decoded = getDecodedToken(token);
737
- const unitDivisor = decoded.unit === "msat" ? 1e3 : 1;
738
- let sum = 0;
739
- for (const proof of decoded.proofs) {
740
- sum += proof.amount / unitDivisor;
741
- }
742
- return sum;
743
- } catch {
744
- return 0;
745
- }
746
- };
986
+ var normalizeBaseUrl5 = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
747
987
  var createEmptyStore = (driver) => createStore((set, get) => ({
748
988
  modelsFromAllProviders: {},
749
989
  lastUsedModel: null,
@@ -753,9 +993,9 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
753
993
  mintsFromAllProviders: {},
754
994
  infoFromAllProviders: {},
755
995
  lastModelsUpdate: {},
756
- cachedTokens: [],
757
996
  apiKeys: [],
758
997
  childKeys: [],
998
+ xcashuTokens: {},
759
999
  routstr21Models: [],
760
1000
  lastRoutstr21ModelsUpdate: null,
761
1001
  cachedReceiveTokens: [],
@@ -763,7 +1003,7 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
763
1003
  setModelsFromAllProviders: (value) => {
764
1004
  const normalized = {};
765
1005
  for (const [baseUrl, models] of Object.entries(value)) {
766
- normalized[normalizeBaseUrl4(baseUrl)] = models;
1006
+ normalized[normalizeBaseUrl5(baseUrl)] = models;
767
1007
  }
768
1008
  void driver.setItem(
769
1009
  SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,
@@ -776,7 +1016,7 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
776
1016
  set({ lastUsedModel: value });
777
1017
  },
778
1018
  setBaseUrlsList: (value) => {
779
- const normalized = value.map((url) => normalizeBaseUrl4(url));
1019
+ const normalized = value.map((url) => normalizeBaseUrl5(url));
780
1020
  void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);
781
1021
  set({ baseUrlsList: normalized });
782
1022
  },
@@ -785,14 +1025,14 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
785
1025
  set({ lastBaseUrlsUpdate: value });
786
1026
  },
787
1027
  setDisabledProviders: (value) => {
788
- const normalized = value.map((url) => normalizeBaseUrl4(url));
1028
+ const normalized = value.map((url) => normalizeBaseUrl5(url));
789
1029
  void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);
790
1030
  set({ disabledProviders: normalized });
791
1031
  },
792
1032
  setMintsFromAllProviders: (value) => {
793
1033
  const normalized = {};
794
1034
  for (const [baseUrl, mints] of Object.entries(value)) {
795
- normalized[normalizeBaseUrl4(baseUrl)] = mints.map(
1035
+ normalized[normalizeBaseUrl5(baseUrl)] = mints.map(
796
1036
  (mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint
797
1037
  );
798
1038
  }
@@ -805,7 +1045,7 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
805
1045
  setInfoFromAllProviders: (value) => {
806
1046
  const normalized = {};
807
1047
  for (const [baseUrl, info] of Object.entries(value)) {
808
- normalized[normalizeBaseUrl4(baseUrl)] = info;
1048
+ normalized[normalizeBaseUrl5(baseUrl)] = info;
809
1049
  }
810
1050
  void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);
811
1051
  set({ infoFromAllProviders: normalized });
@@ -813,30 +1053,17 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
813
1053
  setLastModelsUpdate: (value) => {
814
1054
  const normalized = {};
815
1055
  for (const [baseUrl, timestamp] of Object.entries(value)) {
816
- normalized[normalizeBaseUrl4(baseUrl)] = timestamp;
1056
+ normalized[normalizeBaseUrl5(baseUrl)] = timestamp;
817
1057
  }
818
1058
  void driver.setItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, normalized);
819
1059
  set({ lastModelsUpdate: normalized });
820
1060
  },
821
- setCachedTokens: (value) => {
822
- set((state) => {
823
- const updates = typeof value === "function" ? value(state.cachedTokens) : value;
824
- const normalized = updates.map((entry) => ({
825
- ...entry,
826
- baseUrl: normalizeBaseUrl4(entry.baseUrl),
827
- balance: typeof entry.balance === "number" ? entry.balance : getCashuTokenBalance(entry.token),
828
- lastUsed: entry.lastUsed ?? null
829
- }));
830
- void driver.setItem(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, normalized);
831
- return { cachedTokens: normalized };
832
- });
833
- },
834
1061
  setApiKeys: (value) => {
835
1062
  set((state) => {
836
1063
  const updates = typeof value === "function" ? value(state.apiKeys) : value;
837
1064
  const normalized = updates.map((entry) => ({
838
1065
  ...entry,
839
- baseUrl: normalizeBaseUrl4(entry.baseUrl),
1066
+ baseUrl: normalizeBaseUrl5(entry.baseUrl),
840
1067
  balance: entry.balance ?? 0,
841
1068
  lastUsed: entry.lastUsed ?? null
842
1069
  }));
@@ -848,7 +1075,7 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
848
1075
  set((state) => {
849
1076
  const updates = typeof value === "function" ? value(state.childKeys) : value;
850
1077
  const normalized = updates.map((entry) => ({
851
- parentBaseUrl: normalizeBaseUrl4(entry.parentBaseUrl),
1078
+ parentBaseUrl: normalizeBaseUrl5(entry.parentBaseUrl),
852
1079
  childKey: entry.childKey,
853
1080
  balance: entry.balance ?? 0,
854
1081
  balanceLimit: entry.balanceLimit,
@@ -859,6 +1086,30 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
859
1086
  return { childKeys: normalized };
860
1087
  });
861
1088
  },
1089
+ setXcashuTokens: (value) => {
1090
+ const normalized = {};
1091
+ for (const [baseUrl, tokens] of Object.entries(value)) {
1092
+ normalized[normalizeBaseUrl5(baseUrl)] = tokens.map((entry) => ({
1093
+ ...entry,
1094
+ baseUrl: normalizeBaseUrl5(entry.baseUrl),
1095
+ createdAt: entry.createdAt ?? Date.now(),
1096
+ tryCount: entry.tryCount ?? 0
1097
+ }));
1098
+ }
1099
+ void driver.setItem(SDK_STORAGE_KEYS.XCASHU_TOKENS, normalized);
1100
+ set({ xcashuTokens: normalized });
1101
+ },
1102
+ updateXcashuTokenTryCount: (token, tryCount) => {
1103
+ const currentTokens = get().xcashuTokens;
1104
+ const updatedTokens = {};
1105
+ for (const [baseUrl, tokens] of Object.entries(currentTokens)) {
1106
+ updatedTokens[baseUrl] = tokens.map(
1107
+ (entry) => entry.token === token ? { ...entry, tryCount } : entry
1108
+ );
1109
+ }
1110
+ void driver.setItem(SDK_STORAGE_KEYS.XCASHU_TOKENS, updatedTokens);
1111
+ set({ xcashuTokens: updatedTokens });
1112
+ },
862
1113
  setRoutstr21Models: (value) => {
863
1114
  void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, value);
864
1115
  set({ routstr21Models: value });
@@ -900,9 +1151,9 @@ var hydrateStoreFromDriver = async (store, driver) => {
900
1151
  rawMints,
901
1152
  rawInfo,
902
1153
  rawLastModelsUpdate,
903
- rawCachedTokens,
904
1154
  rawApiKeys,
905
1155
  rawChildKeys,
1156
+ rawXcashuTokens,
906
1157
  rawRoutstr21Models,
907
1158
  rawLastRoutstr21ModelsUpdate,
908
1159
  rawCachedReceiveTokens,
@@ -928,9 +1179,9 @@ var hydrateStoreFromDriver = async (store, driver) => {
928
1179
  SDK_STORAGE_KEYS.LAST_MODELS_UPDATE,
929
1180
  {}
930
1181
  ),
931
- driver.getItem(SDK_STORAGE_KEYS.LOCAL_CASHU_TOKENS, []),
932
1182
  driver.getItem(SDK_STORAGE_KEYS.API_KEYS, []),
933
1183
  driver.getItem(SDK_STORAGE_KEYS.CHILD_KEYS, []),
1184
+ driver.getItem(SDK_STORAGE_KEYS.XCASHU_TOKENS, {}),
934
1185
  driver.getItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, []),
935
1186
  driver.getItem(
936
1187
  SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE,
@@ -941,52 +1192,57 @@ var hydrateStoreFromDriver = async (store, driver) => {
941
1192
  ]);
942
1193
  const modelsFromAllProviders = Object.fromEntries(
943
1194
  Object.entries(rawModels).map(([baseUrl, models]) => [
944
- normalizeBaseUrl4(baseUrl),
1195
+ normalizeBaseUrl5(baseUrl),
945
1196
  models
946
1197
  ])
947
1198
  );
948
- const baseUrlsList = rawBaseUrls.map((url) => normalizeBaseUrl4(url));
1199
+ const baseUrlsList = rawBaseUrls.map((url) => normalizeBaseUrl5(url));
949
1200
  const disabledProviders = rawDisabledProviders.map(
950
- (url) => normalizeBaseUrl4(url)
1201
+ (url) => normalizeBaseUrl5(url)
951
1202
  );
952
1203
  const mintsFromAllProviders = Object.fromEntries(
953
1204
  Object.entries(rawMints).map(([baseUrl, mints]) => [
954
- normalizeBaseUrl4(baseUrl),
1205
+ normalizeBaseUrl5(baseUrl),
955
1206
  mints.map((mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint)
956
1207
  ])
957
1208
  );
958
1209
  const infoFromAllProviders = Object.fromEntries(
959
1210
  Object.entries(rawInfo).map(([baseUrl, info]) => [
960
- normalizeBaseUrl4(baseUrl),
1211
+ normalizeBaseUrl5(baseUrl),
961
1212
  info
962
1213
  ])
963
1214
  );
964
1215
  const lastModelsUpdate = Object.fromEntries(
965
1216
  Object.entries(rawLastModelsUpdate).map(([baseUrl, timestamp]) => [
966
- normalizeBaseUrl4(baseUrl),
1217
+ normalizeBaseUrl5(baseUrl),
967
1218
  timestamp
968
1219
  ])
969
1220
  );
970
- const cachedTokens = rawCachedTokens.map((entry) => ({
971
- ...entry,
972
- baseUrl: normalizeBaseUrl4(entry.baseUrl),
973
- balance: typeof entry.balance === "number" ? entry.balance : getCashuTokenBalance(entry.token),
974
- lastUsed: entry.lastUsed ?? null
975
- }));
976
1221
  const apiKeys = rawApiKeys.map((entry) => ({
977
1222
  ...entry,
978
- baseUrl: normalizeBaseUrl4(entry.baseUrl),
1223
+ baseUrl: normalizeBaseUrl5(entry.baseUrl),
979
1224
  balance: entry.balance ?? 0,
980
1225
  lastUsed: entry.lastUsed ?? null
981
1226
  }));
982
1227
  const childKeys = rawChildKeys.map((entry) => ({
983
- parentBaseUrl: normalizeBaseUrl4(entry.parentBaseUrl),
1228
+ parentBaseUrl: normalizeBaseUrl5(entry.parentBaseUrl),
984
1229
  childKey: entry.childKey,
985
1230
  balance: entry.balance ?? 0,
986
1231
  balanceLimit: entry.balanceLimit,
987
1232
  validityDate: entry.validityDate,
988
1233
  createdAt: entry.createdAt ?? Date.now()
989
1234
  }));
1235
+ const xcashuTokens = Object.fromEntries(
1236
+ Object.entries(rawXcashuTokens).map(([baseUrl, tokens]) => [
1237
+ normalizeBaseUrl5(baseUrl),
1238
+ tokens.map((entry) => ({
1239
+ baseUrl: normalizeBaseUrl5(entry.baseUrl),
1240
+ token: entry.token,
1241
+ createdAt: entry.createdAt ?? Date.now(),
1242
+ tryCount: entry.tryCount ?? 0
1243
+ }))
1244
+ ])
1245
+ );
990
1246
  const routstr21Models = rawRoutstr21Models;
991
1247
  const lastRoutstr21ModelsUpdate = rawLastRoutstr21ModelsUpdate;
992
1248
  const cachedReceiveTokens = rawCachedReceiveTokens?.map((entry) => ({
@@ -1009,9 +1265,9 @@ var hydrateStoreFromDriver = async (store, driver) => {
1009
1265
  mintsFromAllProviders,
1010
1266
  infoFromAllProviders,
1011
1267
  lastModelsUpdate,
1012
- cachedTokens,
1013
1268
  apiKeys,
1014
1269
  childKeys,
1270
+ xcashuTokens,
1015
1271
  routstr21Models,
1016
1272
  lastRoutstr21ModelsUpdate,
1017
1273
  cachedReceiveTokens,
@@ -1035,12 +1291,12 @@ var createDiscoveryAdapterFromStore = (store) => ({
1035
1291
  getCachedProviderInfo: () => store.getState().infoFromAllProviders,
1036
1292
  setCachedProviderInfo: (info) => store.getState().setInfoFromAllProviders(info),
1037
1293
  getProviderLastUpdate: (baseUrl) => {
1038
- const normalized = normalizeBaseUrl4(baseUrl);
1294
+ const normalized = normalizeBaseUrl5(baseUrl);
1039
1295
  const timestamps = store.getState().lastModelsUpdate;
1040
1296
  return timestamps[normalized] || null;
1041
1297
  },
1042
1298
  setProviderLastUpdate: (baseUrl, timestamp) => {
1043
- const normalized = normalizeBaseUrl4(baseUrl);
1299
+ const normalized = normalizeBaseUrl5(baseUrl);
1044
1300
  const timestamps = { ...store.getState().lastModelsUpdate };
1045
1301
  timestamps[normalized] = timestamp;
1046
1302
  store.getState().setLastModelsUpdate(timestamps);
@@ -1058,59 +1314,6 @@ var createDiscoveryAdapterFromStore = (store) => ({
1058
1314
  setRoutstr21ModelsLastUpdate: (timestamp) => store.getState().setRoutstr21ModelsLastUpdate(timestamp)
1059
1315
  });
1060
1316
  var createStorageAdapterFromStore = (store) => ({
1061
- getToken: (baseUrl) => {
1062
- const normalized = normalizeBaseUrl4(baseUrl);
1063
- const entry = store.getState().cachedTokens.find((token) => token.baseUrl === normalized);
1064
- if (!entry) return null;
1065
- const next = store.getState().cachedTokens.map(
1066
- (token) => token.baseUrl === normalized ? { ...token, lastUsed: Date.now() } : token
1067
- );
1068
- store.getState().setCachedTokens(next);
1069
- return entry.token;
1070
- },
1071
- setToken: (baseUrl, token) => {
1072
- const normalized = normalizeBaseUrl4(baseUrl);
1073
- const tokens = store.getState().cachedTokens;
1074
- const balance = getCashuTokenBalance(token);
1075
- const existingIndex = tokens.findIndex(
1076
- (entry) => entry.baseUrl === normalized
1077
- );
1078
- if (existingIndex !== -1) {
1079
- throw new Error(`Token already exists for baseUrl: ${normalized}`);
1080
- }
1081
- const next = [...tokens];
1082
- next.push({
1083
- baseUrl: normalized,
1084
- token,
1085
- balance,
1086
- lastUsed: Date.now()
1087
- });
1088
- store.getState().setCachedTokens(next);
1089
- },
1090
- removeToken: (baseUrl) => {
1091
- const normalized = normalizeBaseUrl4(baseUrl);
1092
- const next = store.getState().cachedTokens.filter((entry) => entry.baseUrl !== normalized);
1093
- store.getState().setCachedTokens(next);
1094
- },
1095
- updateTokenBalance: (baseUrl, balance) => {
1096
- const normalized = normalizeBaseUrl4(baseUrl);
1097
- const tokens = store.getState().cachedTokens;
1098
- const next = tokens.map(
1099
- (entry) => entry.baseUrl === normalized ? { ...entry, balance } : entry
1100
- );
1101
- store.getState().setCachedTokens(next);
1102
- },
1103
- getCachedTokenDistribution: () => {
1104
- const cachedTokens = store.getState().cachedTokens;
1105
- const distributionMap = {};
1106
- for (const entry of cachedTokens) {
1107
- const sum = entry.balance || 0;
1108
- if (sum > 0) {
1109
- distributionMap[entry.baseUrl] = (distributionMap[entry.baseUrl] || 0) + sum;
1110
- }
1111
- }
1112
- return Object.entries(distributionMap).map(([baseUrl, amt]) => ({ baseUrl, amount: amt })).sort((a, b) => b.amount - a.amount);
1113
- },
1114
1317
  getApiKeyDistribution: () => {
1115
1318
  const apiKeys = store.getState().apiKeys;
1116
1319
  const distributionMap = {};
@@ -1123,28 +1326,24 @@ var createStorageAdapterFromStore = (store) => ({
1123
1326
  return Object.entries(distributionMap).map(([baseUrl, amt]) => ({ baseUrl, amount: amt })).sort((a, b) => b.amount - a.amount);
1124
1327
  },
1125
1328
  saveProviderInfo: (baseUrl, info) => {
1126
- const normalized = normalizeBaseUrl4(baseUrl);
1329
+ const normalized = normalizeBaseUrl5(baseUrl);
1127
1330
  const next = { ...store.getState().infoFromAllProviders };
1128
1331
  next[normalized] = info;
1129
1332
  store.getState().setInfoFromAllProviders(next);
1130
1333
  },
1131
1334
  getProviderInfo: (baseUrl) => {
1132
- const normalized = normalizeBaseUrl4(baseUrl);
1335
+ const normalized = normalizeBaseUrl5(baseUrl);
1133
1336
  return store.getState().infoFromAllProviders[normalized] || null;
1134
1337
  },
1135
1338
  // ========== API Keys (for apikeys mode) ==========
1136
1339
  getApiKey: (baseUrl) => {
1137
- const normalized = normalizeBaseUrl4(baseUrl);
1340
+ const normalized = normalizeBaseUrl5(baseUrl);
1138
1341
  const entry = store.getState().apiKeys.find((key) => key.baseUrl === normalized);
1139
1342
  if (!entry) return null;
1140
- const next = store.getState().apiKeys.map(
1141
- (key) => key.baseUrl === normalized ? { ...key, lastUsed: Date.now() } : key
1142
- );
1143
- store.getState().setApiKeys(next);
1144
1343
  return entry;
1145
1344
  },
1146
1345
  setApiKey: (baseUrl, key) => {
1147
- const normalized = normalizeBaseUrl4(baseUrl);
1346
+ const normalized = normalizeBaseUrl5(baseUrl);
1148
1347
  const keys = store.getState().apiKeys;
1149
1348
  const existingIndex = keys.findIndex(
1150
1349
  (entry) => entry.baseUrl === normalized
@@ -1162,15 +1361,15 @@ var createStorageAdapterFromStore = (store) => ({
1162
1361
  store.getState().setApiKeys(next);
1163
1362
  },
1164
1363
  updateApiKeyBalance: (baseUrl, balance) => {
1165
- const normalized = normalizeBaseUrl4(baseUrl);
1364
+ const normalized = normalizeBaseUrl5(baseUrl);
1166
1365
  const keys = store.getState().apiKeys;
1167
1366
  const next = keys.map(
1168
- (entry) => entry.baseUrl === normalized ? { ...entry, balance } : entry
1367
+ (entry) => entry.baseUrl === normalized ? { ...entry, balance, lastUsed: Date.now() } : entry
1169
1368
  );
1170
1369
  store.getState().setApiKeys(next);
1171
1370
  },
1172
1371
  removeApiKey: (baseUrl) => {
1173
- const normalized = normalizeBaseUrl4(baseUrl);
1372
+ const normalized = normalizeBaseUrl5(baseUrl);
1174
1373
  const next = store.getState().apiKeys.filter((entry) => entry.baseUrl !== normalized);
1175
1374
  store.getState().setApiKeys(next);
1176
1375
  },
@@ -1184,7 +1383,7 @@ var createStorageAdapterFromStore = (store) => ({
1184
1383
  },
1185
1384
  // ========== Child Keys ==========
1186
1385
  getChildKey: (parentBaseUrl) => {
1187
- const normalized = normalizeBaseUrl4(parentBaseUrl);
1386
+ const normalized = normalizeBaseUrl5(parentBaseUrl);
1188
1387
  const entry = store.getState().childKeys.find((key) => key.parentBaseUrl === normalized);
1189
1388
  if (!entry) return null;
1190
1389
  return {
@@ -1197,7 +1396,7 @@ var createStorageAdapterFromStore = (store) => ({
1197
1396
  };
1198
1397
  },
1199
1398
  setChildKey: (parentBaseUrl, childKey, balance, validityDate, balanceLimit) => {
1200
- const normalized = normalizeBaseUrl4(parentBaseUrl);
1399
+ const normalized = normalizeBaseUrl5(parentBaseUrl);
1201
1400
  const keys = store.getState().childKeys;
1202
1401
  const existingIndex = keys.findIndex(
1203
1402
  (entry) => entry.parentBaseUrl === normalized
@@ -1228,7 +1427,7 @@ var createStorageAdapterFromStore = (store) => ({
1228
1427
  }
1229
1428
  },
1230
1429
  updateChildKeyBalance: (parentBaseUrl, balance) => {
1231
- const normalized = normalizeBaseUrl4(parentBaseUrl);
1430
+ const normalized = normalizeBaseUrl5(parentBaseUrl);
1232
1431
  const keys = store.getState().childKeys;
1233
1432
  const next = keys.map(
1234
1433
  (entry) => entry.parentBaseUrl === normalized ? { ...entry, balance } : entry
@@ -1236,7 +1435,7 @@ var createStorageAdapterFromStore = (store) => ({
1236
1435
  store.getState().setChildKeys(next);
1237
1436
  },
1238
1437
  removeChildKey: (parentBaseUrl) => {
1239
- const normalized = normalizeBaseUrl4(parentBaseUrl);
1438
+ const normalized = normalizeBaseUrl5(parentBaseUrl);
1240
1439
  const next = store.getState().childKeys.filter((entry) => entry.parentBaseUrl !== normalized);
1241
1440
  store.getState().setChildKeys(next);
1242
1441
  },
@@ -1255,20 +1454,60 @@ var createStorageAdapterFromStore = (store) => ({
1255
1454
  },
1256
1455
  setCachedReceiveTokens: (tokens) => {
1257
1456
  store.getState().setCachedReceiveTokens(tokens);
1457
+ },
1458
+ // ========== XCashu Tokens (multiple tokens per baseUrl) ==========
1459
+ getXcashuTokens: () => {
1460
+ return store.getState().xcashuTokens;
1461
+ },
1462
+ getXcashuTokensForBaseUrl: (baseUrl) => {
1463
+ const normalized = normalizeBaseUrl5(baseUrl);
1464
+ return store.getState().xcashuTokens[normalized] || [];
1465
+ },
1466
+ addXcashuToken: (baseUrl, token) => {
1467
+ const normalized = normalizeBaseUrl5(baseUrl);
1468
+ const tokens = store.getState().xcashuTokens;
1469
+ const existing = tokens[normalized] || [];
1470
+ const next = { ...tokens };
1471
+ next[normalized] = [
1472
+ ...existing,
1473
+ { baseUrl: normalized, token, createdAt: Date.now(), tryCount: 0 }
1474
+ ];
1475
+ store.getState().setXcashuTokens(next);
1476
+ },
1477
+ removeXcashuToken: (baseUrl, token) => {
1478
+ const normalized = normalizeBaseUrl5(baseUrl);
1479
+ const tokens = store.getState().xcashuTokens;
1480
+ const existing = tokens[normalized] || [];
1481
+ const next = { ...tokens };
1482
+ next[normalized] = existing.filter((entry) => entry.token !== token);
1483
+ if (next[normalized].length === 0) {
1484
+ delete next[normalized];
1485
+ }
1486
+ store.getState().setXcashuTokens(next);
1487
+ },
1488
+ clearXcashuTokensForBaseUrl: (baseUrl) => {
1489
+ const normalized = normalizeBaseUrl5(baseUrl);
1490
+ const tokens = store.getState().xcashuTokens;
1491
+ const next = { ...tokens };
1492
+ delete next[normalized];
1493
+ store.getState().setXcashuTokens(next);
1494
+ },
1495
+ updateXcashuTokenTryCount: (token, tryCount) => {
1496
+ store.getState().updateXcashuTokenTryCount(token, tryCount);
1258
1497
  }
1259
1498
  });
1260
1499
  var createProviderRegistryFromStore = (store) => ({
1261
1500
  getModelsForProvider: (baseUrl) => {
1262
- const normalized = normalizeBaseUrl4(baseUrl);
1501
+ const normalized = normalizeBaseUrl5(baseUrl);
1263
1502
  return store.getState().modelsFromAllProviders[normalized] || [];
1264
1503
  },
1265
1504
  getDisabledProviders: () => store.getState().disabledProviders,
1266
1505
  getProviderMints: (baseUrl) => {
1267
- const normalized = normalizeBaseUrl4(baseUrl);
1506
+ const normalized = normalizeBaseUrl5(baseUrl);
1268
1507
  return store.getState().mintsFromAllProviders[normalized] || [];
1269
1508
  },
1270
1509
  getProviderInfo: async (baseUrl) => {
1271
- const normalized = normalizeBaseUrl4(baseUrl);
1510
+ const normalized = normalizeBaseUrl5(baseUrl);
1272
1511
  const cached = store.getState().infoFromAllProviders[normalized];
1273
1512
  if (cached) return cached;
1274
1513
  try {
@@ -1343,7 +1582,7 @@ var getDefaultUsageTrackingDriver = () => {
1343
1582
  return defaultUsageTrackingDriver;
1344
1583
  }
1345
1584
  if (isBun3()) {
1346
- defaultUsageTrackingDriver = createMemoryUsageTrackingDriver();
1585
+ defaultUsageTrackingDriver = createBunSqliteUsageTrackingDriver();
1347
1586
  return defaultUsageTrackingDriver;
1348
1587
  }
1349
1588
  if (isNode()) {
@@ -1355,10 +1594,13 @@ var getDefaultUsageTrackingDriver = () => {
1355
1594
  defaultUsageTrackingDriver = createMemoryUsageTrackingDriver();
1356
1595
  return defaultUsageTrackingDriver;
1357
1596
  };
1597
+ var setDefaultUsageTrackingDriver = (driver) => {
1598
+ defaultUsageTrackingDriver = driver;
1599
+ };
1358
1600
  var getDefaultDiscoveryAdapter = async () => createDiscoveryAdapterFromStore(await getDefaultSdkStore());
1359
1601
  var getDefaultStorageAdapter = async () => createStorageAdapterFromStore(await getDefaultSdkStore());
1360
1602
  var getDefaultProviderRegistry = async () => createProviderRegistryFromStore(await getDefaultSdkStore());
1361
1603
 
1362
- export { SDK_STORAGE_KEYS, createDiscoveryAdapterFromStore, createIndexedDBDriver, createIndexedDBUsageTrackingDriver, createMemoryDriver, createMemoryUsageTrackingDriver, createProviderRegistryFromStore, createSdkStore, createSqliteDriver, createSqliteUsageTrackingDriver, createStorageAdapterFromStore, getDefaultDiscoveryAdapter, getDefaultProviderRegistry, getDefaultSdkDriver, getDefaultSdkStore, getDefaultStorageAdapter, getDefaultUsageTrackingDriver, localStorageDriver };
1604
+ export { SDK_STORAGE_KEYS, createBunSqliteDriver, createBunSqliteUsageTrackingDriver, createDiscoveryAdapterFromStore, createIndexedDBDriver, createIndexedDBUsageTrackingDriver, createMemoryDriver, createMemoryUsageTrackingDriver, createProviderRegistryFromStore, createSdkStore, createSqliteDriver, createSqliteUsageTrackingDriver, createStorageAdapterFromStore, getDefaultDiscoveryAdapter, getDefaultProviderRegistry, getDefaultSdkDriver, getDefaultSdkStore, getDefaultStorageAdapter, getDefaultUsageTrackingDriver, localStorageDriver, setDefaultUsageTrackingDriver };
1363
1605
  //# sourceMappingURL=index.mjs.map
1364
1606
  //# sourceMappingURL=index.mjs.map