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