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