@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.
- package/README.md +1 -2
- package/dist/client/index.d.mts +19 -5
- package/dist/client/index.d.ts +19 -5
- package/dist/client/index.js +506 -451
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +506 -451
- package/dist/client/index.mjs.map +1 -1
- package/dist/index.d.mts +16 -8
- package/dist/index.d.ts +16 -8
- package/dist/index.js +627 -528
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +625 -529
- package/dist/index.mjs.map +1 -1
- package/dist/{interfaces-CluftN4z.d.ts → interfaces-B62Rw-dd.d.ts} +19 -14
- package/dist/{interfaces-C6Dr6hKy.d.mts → interfaces-C5fLD3jB.d.mts} +19 -14
- package/dist/storage/index.d.mts +36 -162
- package/dist/storage/index.d.ts +36 -162
- package/dist/storage/index.js +434 -189
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/index.mjs +432 -190
- package/dist/storage/index.mjs.map +1 -1
- package/dist/store-BJlwiDX5.d.ts +151 -0
- package/dist/store-C5lnyX8k.d.mts +151 -0
- package/dist/wallet/index.d.mts +18 -24
- package/dist/wallet/index.d.ts +18 -24
- package/dist/wallet/index.js +106 -255
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/index.mjs +106 -255
- package/dist/wallet/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/storage/index.js
CHANGED
|
@@ -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
|
|
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
|
|
121
|
+
"SQLite driver not supported in Bun. Use createBunSqliteDriver() instead."
|
|
129
122
|
);
|
|
130
123
|
}
|
|
131
|
-
let Database = null;
|
|
132
124
|
try {
|
|
133
|
-
|
|
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
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
540
|
-
|
|
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/
|
|
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 &&
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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[
|
|
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) =>
|
|
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) =>
|
|
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[
|
|
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[
|
|
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[
|
|
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:
|
|
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:
|
|
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
|
-
|
|
1197
|
+
normalizeBaseUrl5(baseUrl),
|
|
947
1198
|
models
|
|
948
1199
|
])
|
|
949
1200
|
);
|
|
950
|
-
const baseUrlsList = rawBaseUrls.map((url) =>
|
|
1201
|
+
const baseUrlsList = rawBaseUrls.map((url) => normalizeBaseUrl5(url));
|
|
951
1202
|
const disabledProviders = rawDisabledProviders.map(
|
|
952
|
-
(url) =>
|
|
1203
|
+
(url) => normalizeBaseUrl5(url)
|
|
953
1204
|
);
|
|
954
1205
|
const mintsFromAllProviders = Object.fromEntries(
|
|
955
1206
|
Object.entries(rawMints).map(([baseUrl, mints]) => [
|
|
956
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
1508
|
+
const normalized = normalizeBaseUrl5(baseUrl);
|
|
1270
1509
|
return store.getState().mintsFromAllProviders[normalized] || [];
|
|
1271
1510
|
},
|
|
1272
1511
|
getProviderInfo: async (baseUrl) => {
|
|
1273
|
-
const normalized =
|
|
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 =
|
|
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
|