@routstr/sdk 0.3.9 → 0.3.11
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/dist/browser.d.mts +12 -0
- package/dist/browser.d.ts +12 -0
- package/dist/browser.js +6413 -0
- package/dist/browser.js.map +1 -0
- package/dist/browser.mjs +6361 -0
- package/dist/browser.mjs.map +1 -0
- package/dist/bun.d.mts +29 -0
- package/dist/bun.d.ts +29 -0
- package/dist/bun.js +6791 -0
- package/dist/bun.js.map +1 -0
- package/dist/bun.mjs +6733 -0
- package/dist/bun.mjs.map +1 -0
- package/dist/bunSqlite-BmXWNc25.d.ts +18 -0
- package/dist/bunSqlite-Bro9efsl.d.mts +18 -0
- package/dist/client/index.d.mts +85 -42
- package/dist/client/index.d.ts +85 -42
- package/dist/client/index.js +1243 -1584
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +1239 -1585
- package/dist/client/index.mjs.map +1 -1
- package/dist/discovery/index.d.mts +33 -3
- package/dist/discovery/index.d.ts +33 -3
- package/dist/discovery/index.js +30 -31
- package/dist/discovery/index.js.map +1 -1
- package/dist/discovery/index.mjs +30 -31
- package/dist/discovery/index.mjs.map +1 -1
- package/dist/index.d.mts +9 -7
- package/dist/index.d.ts +9 -7
- package/dist/index.js +1264 -1648
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1260 -1645
- package/dist/index.mjs.map +1 -1
- package/dist/node.d.mts +22 -0
- package/dist/node.d.ts +22 -0
- package/dist/node.js +6857 -0
- package/dist/node.js.map +1 -0
- package/dist/node.mjs +6801 -0
- package/dist/node.mjs.map +1 -0
- package/dist/storage/bun.d.mts +16 -0
- package/dist/storage/bun.d.ts +16 -0
- package/dist/storage/bun.js +1970 -0
- package/dist/storage/bun.js.map +1 -0
- package/dist/storage/bun.mjs +1946 -0
- package/dist/storage/bun.mjs.map +1 -0
- package/dist/storage/index.d.mts +4 -30
- package/dist/storage/index.d.ts +4 -30
- package/dist/storage/index.js +238 -650
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/index.mjs +239 -647
- package/dist/storage/index.mjs.map +1 -1
- package/dist/storage/node.d.mts +22 -0
- package/dist/storage/node.d.ts +22 -0
- package/dist/storage/node.js +2034 -0
- package/dist/storage/node.js.map +1 -0
- package/dist/storage/node.mjs +2012 -0
- package/dist/storage/node.mjs.map +1 -0
- package/dist/{store-58VcEUoA.d.ts → store-CAQLSbEj.d.ts} +52 -1
- package/dist/{store-C6dfj1cc.d.mts → store-CuXwe5Rg.d.mts} +52 -1
- package/dist/wallet/index.js +38 -24
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/index.mjs +38 -24
- package/dist/wallet/index.mjs.map +1 -1
- package/package.json +26 -1
package/dist/storage/index.js
CHANGED
|
@@ -110,154 +110,6 @@ var createMemoryDriver = (seed) => {
|
|
|
110
110
|
};
|
|
111
111
|
};
|
|
112
112
|
|
|
113
|
-
// core/types.ts
|
|
114
|
-
function makeConsoleLogger(prefix) {
|
|
115
|
-
const fmt = (args) => prefix ? [prefix, ...args] : args;
|
|
116
|
-
return {
|
|
117
|
-
log: (...args) => console.log(...fmt(args)),
|
|
118
|
-
warn: (...args) => console.warn(...fmt(args)),
|
|
119
|
-
error: (...args) => console.error(...fmt(args)),
|
|
120
|
-
debug: (...args) => console.log(...fmt(args)),
|
|
121
|
-
child: (p) => makeConsoleLogger(prefix ? `${prefix}:${p}` : p)
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
var consoleLogger = makeConsoleLogger();
|
|
125
|
-
|
|
126
|
-
// storage/drivers/sqlite.ts
|
|
127
|
-
var isBun = () => {
|
|
128
|
-
return typeof process.versions.bun !== "undefined";
|
|
129
|
-
};
|
|
130
|
-
var cachedDbModule = null;
|
|
131
|
-
var loadDatabase = async (dbPath) => {
|
|
132
|
-
if (isBun()) {
|
|
133
|
-
throw new Error(
|
|
134
|
-
"SQLite driver not supported in Bun. Use createBunSqliteDriver() instead."
|
|
135
|
-
);
|
|
136
|
-
}
|
|
137
|
-
try {
|
|
138
|
-
if (!cachedDbModule) {
|
|
139
|
-
cachedDbModule = (await import('better-sqlite3')).default;
|
|
140
|
-
}
|
|
141
|
-
return new cachedDbModule(dbPath);
|
|
142
|
-
} catch (error) {
|
|
143
|
-
throw new Error(
|
|
144
|
-
`better-sqlite3 is required for sqlite storage. Install it to use sqlite storage. (${error})`
|
|
145
|
-
);
|
|
146
|
-
}
|
|
147
|
-
};
|
|
148
|
-
var createSqliteDriver = (options = {}) => {
|
|
149
|
-
const dbPath = options.dbPath || "routstr.sqlite";
|
|
150
|
-
const tableName = options.tableName || "sdk_storage";
|
|
151
|
-
let db;
|
|
152
|
-
let selectStmt;
|
|
153
|
-
let upsertStmt;
|
|
154
|
-
let deleteStmt;
|
|
155
|
-
const initDb = async () => {
|
|
156
|
-
if (!db) {
|
|
157
|
-
db = await loadDatabase(dbPath);
|
|
158
|
-
db.exec(
|
|
159
|
-
`CREATE TABLE IF NOT EXISTS ${tableName} (key TEXT PRIMARY KEY, value TEXT NOT NULL)`
|
|
160
|
-
);
|
|
161
|
-
selectStmt = db.prepare(`SELECT value FROM ${tableName} WHERE key = ?`);
|
|
162
|
-
upsertStmt = db.prepare(
|
|
163
|
-
`INSERT INTO ${tableName} (key, value) VALUES (?, ?)
|
|
164
|
-
ON CONFLICT(key) DO UPDATE SET value = excluded.value`
|
|
165
|
-
);
|
|
166
|
-
deleteStmt = db.prepare(`DELETE FROM ${tableName} WHERE key = ?`);
|
|
167
|
-
}
|
|
168
|
-
};
|
|
169
|
-
const ensureInit = async () => {
|
|
170
|
-
if (!db) {
|
|
171
|
-
await initDb();
|
|
172
|
-
}
|
|
173
|
-
};
|
|
174
|
-
return {
|
|
175
|
-
async getItem(key, defaultValue) {
|
|
176
|
-
try {
|
|
177
|
-
await ensureInit();
|
|
178
|
-
const row = selectStmt.get(key);
|
|
179
|
-
if (!row || typeof row.value !== "string") return defaultValue;
|
|
180
|
-
try {
|
|
181
|
-
return JSON.parse(row.value);
|
|
182
|
-
} catch (parseError) {
|
|
183
|
-
if (typeof defaultValue === "string") {
|
|
184
|
-
return row.value;
|
|
185
|
-
}
|
|
186
|
-
throw parseError;
|
|
187
|
-
}
|
|
188
|
-
} catch (error) {
|
|
189
|
-
console.error(`SQLite getItem failed for key "${key}":`, error);
|
|
190
|
-
return defaultValue;
|
|
191
|
-
}
|
|
192
|
-
},
|
|
193
|
-
async setItem(key, value) {
|
|
194
|
-
try {
|
|
195
|
-
await ensureInit();
|
|
196
|
-
upsertStmt.run(key, JSON.stringify(value));
|
|
197
|
-
} catch (error) {
|
|
198
|
-
console.error(`SQLite setItem failed for key "${key}":`, error);
|
|
199
|
-
}
|
|
200
|
-
},
|
|
201
|
-
async removeItem(key) {
|
|
202
|
-
try {
|
|
203
|
-
await ensureInit();
|
|
204
|
-
deleteStmt.run(key);
|
|
205
|
-
} catch (error) {
|
|
206
|
-
console.error(`SQLite removeItem failed for key "${key}":`, error);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
};
|
|
210
|
-
};
|
|
211
|
-
async function createBunSqliteDriver(dbPath, options) {
|
|
212
|
-
const logger = (options?.logger ?? consoleLogger).child("BunSqliteDriver");
|
|
213
|
-
const SQLite = (await import(
|
|
214
|
-
/* webpackIgnore: true */
|
|
215
|
-
'bun:sqlite'
|
|
216
|
-
)).default;
|
|
217
|
-
const db = new SQLite(dbPath);
|
|
218
|
-
db.run(`
|
|
219
|
-
CREATE TABLE IF NOT EXISTS sdk_storage (
|
|
220
|
-
key TEXT PRIMARY KEY,
|
|
221
|
-
value TEXT NOT NULL
|
|
222
|
-
)
|
|
223
|
-
`);
|
|
224
|
-
return {
|
|
225
|
-
async getItem(key, defaultValue) {
|
|
226
|
-
try {
|
|
227
|
-
const row = db.query("SELECT value FROM sdk_storage WHERE key = ?").get(key);
|
|
228
|
-
if (!row || typeof row.value !== "string") return defaultValue;
|
|
229
|
-
try {
|
|
230
|
-
return JSON.parse(row.value);
|
|
231
|
-
} catch (parseError) {
|
|
232
|
-
if (typeof defaultValue === "string") {
|
|
233
|
-
return row.value;
|
|
234
|
-
}
|
|
235
|
-
throw parseError;
|
|
236
|
-
}
|
|
237
|
-
} catch (error) {
|
|
238
|
-
logger.error(`getItem failed for key "${key}":`, error);
|
|
239
|
-
return defaultValue;
|
|
240
|
-
}
|
|
241
|
-
},
|
|
242
|
-
async setItem(key, value) {
|
|
243
|
-
try {
|
|
244
|
-
db.query(
|
|
245
|
-
"INSERT INTO sdk_storage (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value"
|
|
246
|
-
).run(key, JSON.stringify(value));
|
|
247
|
-
} catch (error) {
|
|
248
|
-
logger.error(`setItem failed for key "${key}":`, error);
|
|
249
|
-
}
|
|
250
|
-
},
|
|
251
|
-
async removeItem(key) {
|
|
252
|
-
try {
|
|
253
|
-
db.query("DELETE FROM sdk_storage WHERE key = ?").run(key);
|
|
254
|
-
} catch (error) {
|
|
255
|
-
logger.error(`removeItem failed for key "${key}":`, error);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
};
|
|
259
|
-
}
|
|
260
|
-
|
|
261
113
|
// storage/drivers/indexedDB.ts
|
|
262
114
|
var isBrowser = typeof indexedDB !== "undefined";
|
|
263
115
|
var openDatabase = (dbName, storeName) => {
|
|
@@ -265,15 +117,32 @@ var openDatabase = (dbName, storeName) => {
|
|
|
265
117
|
return Promise.reject(new Error("IndexedDB is not available"));
|
|
266
118
|
}
|
|
267
119
|
return new Promise((resolve, reject) => {
|
|
268
|
-
const request = indexedDB.open(dbName,
|
|
120
|
+
const request = indexedDB.open(dbName, 2);
|
|
269
121
|
request.onupgradeneeded = () => {
|
|
270
122
|
const db = request.result;
|
|
271
123
|
if (!db.objectStoreNames.contains(storeName)) {
|
|
272
124
|
db.createObjectStore(storeName);
|
|
273
125
|
}
|
|
126
|
+
if (storeName !== "usage_tracking" && !db.objectStoreNames.contains("usage_tracking")) {
|
|
127
|
+
const utStore = db.createObjectStore("usage_tracking", { keyPath: "id" });
|
|
128
|
+
utStore.createIndex("timestamp", "timestamp", { unique: false });
|
|
129
|
+
utStore.createIndex("modelId", "modelId", { unique: false });
|
|
130
|
+
utStore.createIndex("baseUrl", "baseUrl", { unique: false });
|
|
131
|
+
utStore.createIndex("sessionId", "sessionId", { unique: false });
|
|
132
|
+
utStore.createIndex("client", "client", { unique: false });
|
|
133
|
+
}
|
|
134
|
+
if (storeName !== "sdk_storage" && !db.objectStoreNames.contains("sdk_storage")) {
|
|
135
|
+
db.createObjectStore("sdk_storage");
|
|
136
|
+
}
|
|
274
137
|
};
|
|
275
138
|
request.onsuccess = () => resolve(request.result);
|
|
276
139
|
request.onerror = () => reject(request.error);
|
|
140
|
+
request.onblocked = () => {
|
|
141
|
+
console.warn(
|
|
142
|
+
`[IndexedDB driver] open blocked for "${dbName}" (store: "${storeName}") \u2014 close other tabs using this DB`
|
|
143
|
+
);
|
|
144
|
+
reject(new Error(`IndexedDB "${dbName}" blocked by another connection`));
|
|
145
|
+
};
|
|
277
146
|
});
|
|
278
147
|
};
|
|
279
148
|
var createIndexedDBDriver = (options = {}) => {
|
|
@@ -375,6 +244,91 @@ var SDK_STORAGE_KEYS = {
|
|
|
375
244
|
PROVIDERS_ON_COOLDOWN: "providers_on_cooldown"
|
|
376
245
|
};
|
|
377
246
|
|
|
247
|
+
// storage/usageTracking/aggregate.ts
|
|
248
|
+
var pad2 = (n) => String(n).padStart(2, "0");
|
|
249
|
+
var jsGroupKey = (entry, groupBy, tzOffsetMinutes) => {
|
|
250
|
+
switch (groupBy) {
|
|
251
|
+
case "modelId":
|
|
252
|
+
return entry.modelId ?? null;
|
|
253
|
+
case "baseUrl":
|
|
254
|
+
return entry.baseUrl ?? null;
|
|
255
|
+
case "client":
|
|
256
|
+
return entry.client ?? null;
|
|
257
|
+
case "sessionId":
|
|
258
|
+
return entry.sessionId ?? null;
|
|
259
|
+
case "provider":
|
|
260
|
+
return entry.provider ?? null;
|
|
261
|
+
case "day": {
|
|
262
|
+
const d = new Date(entry.timestamp - tzOffsetMinutes * 6e4);
|
|
263
|
+
return `${d.getUTCFullYear()}-${pad2(d.getUTCMonth() + 1)}-${pad2(d.getUTCDate())}`;
|
|
264
|
+
}
|
|
265
|
+
case "hour": {
|
|
266
|
+
const d = new Date(entry.timestamp - tzOffsetMinutes * 6e4);
|
|
267
|
+
return pad2(d.getUTCHours());
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
var reduceAggregate = (entries, options = {}) => {
|
|
272
|
+
const emptyRow = (group) => ({
|
|
273
|
+
group,
|
|
274
|
+
requests: 0,
|
|
275
|
+
promptTokens: 0,
|
|
276
|
+
completionTokens: 0,
|
|
277
|
+
totalTokens: 0,
|
|
278
|
+
cost: 0,
|
|
279
|
+
satsCost: 0,
|
|
280
|
+
baseMsats: 0,
|
|
281
|
+
inputMsats: 0,
|
|
282
|
+
outputMsats: 0,
|
|
283
|
+
totalMsats: 0,
|
|
284
|
+
totalUsd: 0,
|
|
285
|
+
cacheReadInputTokens: 0,
|
|
286
|
+
cacheCreationInputTokens: 0,
|
|
287
|
+
cacheReadMsats: 0,
|
|
288
|
+
cacheCreationMsats: 0
|
|
289
|
+
});
|
|
290
|
+
const accumulate = (row, entry) => {
|
|
291
|
+
row.requests += 1;
|
|
292
|
+
row.promptTokens += entry.promptTokens;
|
|
293
|
+
row.completionTokens += entry.completionTokens;
|
|
294
|
+
row.totalTokens += entry.totalTokens;
|
|
295
|
+
row.cost += entry.cost;
|
|
296
|
+
row.satsCost += entry.satsCost;
|
|
297
|
+
row.baseMsats += entry.baseMsats ?? 0;
|
|
298
|
+
row.inputMsats += entry.inputMsats ?? 0;
|
|
299
|
+
row.outputMsats += entry.outputMsats ?? 0;
|
|
300
|
+
row.totalMsats += entry.totalMsats ?? 0;
|
|
301
|
+
row.totalUsd += entry.totalUsd ?? 0;
|
|
302
|
+
row.cacheReadInputTokens += entry.cacheReadInputTokens ?? 0;
|
|
303
|
+
row.cacheCreationInputTokens += entry.cacheCreationInputTokens ?? 0;
|
|
304
|
+
row.cacheReadMsats += entry.cacheReadMsats ?? 0;
|
|
305
|
+
row.cacheCreationMsats += entry.cacheCreationMsats ?? 0;
|
|
306
|
+
};
|
|
307
|
+
if (!options.groupBy) {
|
|
308
|
+
const total = emptyRow(null);
|
|
309
|
+
for (const entry of entries) accumulate(total, entry);
|
|
310
|
+
return [total];
|
|
311
|
+
}
|
|
312
|
+
const tz = options.tzOffsetMinutes ?? 0;
|
|
313
|
+
const groups = /* @__PURE__ */ new Map();
|
|
314
|
+
for (const entry of entries) {
|
|
315
|
+
const key = jsGroupKey(entry, options.groupBy, tz);
|
|
316
|
+
let row = groups.get(key);
|
|
317
|
+
if (!row) {
|
|
318
|
+
row = emptyRow(key);
|
|
319
|
+
groups.set(key, row);
|
|
320
|
+
}
|
|
321
|
+
accumulate(row, entry);
|
|
322
|
+
}
|
|
323
|
+
const rows = [...groups.values()];
|
|
324
|
+
if (options.groupBy === "day" || options.groupBy === "hour") {
|
|
325
|
+
rows.sort((a, b) => (a.group ?? "").localeCompare(b.group ?? ""));
|
|
326
|
+
} else {
|
|
327
|
+
rows.sort((a, b) => b.satsCost - a.satsCost);
|
|
328
|
+
}
|
|
329
|
+
return rows;
|
|
330
|
+
};
|
|
331
|
+
|
|
378
332
|
// storage/usageTracking/indexedDB.ts
|
|
379
333
|
var DEFAULT_DB_NAME = "routstr-sdk";
|
|
380
334
|
var DEFAULT_STORE_NAME = "usage_tracking";
|
|
@@ -386,9 +340,10 @@ var openDatabase2 = (dbName, storeName) => {
|
|
|
386
340
|
return Promise.reject(new Error("IndexedDB is not available"));
|
|
387
341
|
}
|
|
388
342
|
return new Promise((resolve, reject) => {
|
|
389
|
-
const request = indexedDB.open(dbName,
|
|
343
|
+
const request = indexedDB.open(dbName, 3);
|
|
390
344
|
request.onupgradeneeded = () => {
|
|
391
345
|
const db = request.result;
|
|
346
|
+
const tx = request.transaction;
|
|
392
347
|
if (!db.objectStoreNames.contains(storeName)) {
|
|
393
348
|
const store = db.createObjectStore(storeName, { keyPath: "id" });
|
|
394
349
|
store.createIndex("timestamp", "timestamp", { unique: false });
|
|
@@ -396,10 +351,25 @@ var openDatabase2 = (dbName, storeName) => {
|
|
|
396
351
|
store.createIndex("baseUrl", "baseUrl", { unique: false });
|
|
397
352
|
store.createIndex("sessionId", "sessionId", { unique: false });
|
|
398
353
|
store.createIndex("client", "client", { unique: false });
|
|
354
|
+
store.createIndex("provider", "provider", { unique: false });
|
|
355
|
+
} else if (tx) {
|
|
356
|
+
const store = tx.objectStore(storeName);
|
|
357
|
+
if (!store.indexNames.contains("provider")) {
|
|
358
|
+
store.createIndex("provider", "provider", { unique: false });
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
if (storeName !== "sdk_storage" && !db.objectStoreNames.contains("sdk_storage")) {
|
|
362
|
+
db.createObjectStore("sdk_storage");
|
|
399
363
|
}
|
|
400
364
|
};
|
|
401
365
|
request.onsuccess = () => resolve(request.result);
|
|
402
366
|
request.onerror = () => reject(request.error);
|
|
367
|
+
request.onblocked = () => {
|
|
368
|
+
console.warn(
|
|
369
|
+
`[usageTracking IndexedDB] open blocked for "${dbName}" \u2014 close other tabs using this DB`
|
|
370
|
+
);
|
|
371
|
+
reject(new Error(`IndexedDB "${dbName}" blocked by another connection`));
|
|
372
|
+
};
|
|
403
373
|
});
|
|
404
374
|
};
|
|
405
375
|
var matchesFilters = (entry, options = {}) => {
|
|
@@ -421,6 +391,12 @@ var matchesFilters = (entry, options = {}) => {
|
|
|
421
391
|
if (options.client && entry.client !== options.client) {
|
|
422
392
|
return false;
|
|
423
393
|
}
|
|
394
|
+
if (options.clients && options.clients.length > 0 && (entry.client == null || !options.clients.includes(entry.client))) {
|
|
395
|
+
return false;
|
|
396
|
+
}
|
|
397
|
+
if (options.provider && entry.provider !== options.provider) {
|
|
398
|
+
return false;
|
|
399
|
+
}
|
|
424
400
|
return true;
|
|
425
401
|
};
|
|
426
402
|
var createIndexedDBUsageTrackingDriver = (options = {}) => {
|
|
@@ -516,6 +492,10 @@ var createIndexedDBUsageTrackingDriver = (options = {}) => {
|
|
|
516
492
|
const results = await this.list(options2);
|
|
517
493
|
return results.length;
|
|
518
494
|
},
|
|
495
|
+
async aggregate(options2 = {}) {
|
|
496
|
+
const entries = await this.list(options2);
|
|
497
|
+
return reduceAggregate(entries, options2);
|
|
498
|
+
},
|
|
519
499
|
async deleteOlderThan(timestamp) {
|
|
520
500
|
await ensureMigrated();
|
|
521
501
|
const db = await getDb();
|
|
@@ -552,393 +532,8 @@ var createIndexedDBUsageTrackingDriver = (options = {}) => {
|
|
|
552
532
|
};
|
|
553
533
|
};
|
|
554
534
|
|
|
555
|
-
// storage/usageTracking/sqlite.ts
|
|
556
|
-
var MIGRATION_MARKER_KEY2 = "usage_tracking_migration_v1";
|
|
557
|
-
var normalizeBaseUrl2 = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
558
|
-
var isBun2 = () => {
|
|
559
|
-
return typeof process.versions.bun !== "undefined";
|
|
560
|
-
};
|
|
561
|
-
var cachedDbModule2 = null;
|
|
562
|
-
var loadDatabase2 = async (dbPath) => {
|
|
563
|
-
if (isBun2()) {
|
|
564
|
-
throw new Error(
|
|
565
|
-
"SQLite driver not supported in Bun. Use createMemoryDriver() instead."
|
|
566
|
-
);
|
|
567
|
-
}
|
|
568
|
-
try {
|
|
569
|
-
if (!cachedDbModule2) {
|
|
570
|
-
cachedDbModule2 = (await import('better-sqlite3')).default;
|
|
571
|
-
}
|
|
572
|
-
return new cachedDbModule2(dbPath);
|
|
573
|
-
} catch (error) {
|
|
574
|
-
throw new Error(
|
|
575
|
-
`better-sqlite3 is required for sqlite usage tracking. Install it to use sqlite storage. (${error})`
|
|
576
|
-
);
|
|
577
|
-
}
|
|
578
|
-
};
|
|
579
|
-
var buildWhereClause = (options = {}) => {
|
|
580
|
-
const clauses = [];
|
|
581
|
-
const params = [];
|
|
582
|
-
if (typeof options.before === "number") {
|
|
583
|
-
clauses.push("timestamp < ?");
|
|
584
|
-
params.push(options.before);
|
|
585
|
-
}
|
|
586
|
-
if (typeof options.after === "number") {
|
|
587
|
-
clauses.push("timestamp > ?");
|
|
588
|
-
params.push(options.after);
|
|
589
|
-
}
|
|
590
|
-
if (options.modelId) {
|
|
591
|
-
clauses.push("model_id = ?");
|
|
592
|
-
params.push(options.modelId);
|
|
593
|
-
}
|
|
594
|
-
if (options.baseUrl) {
|
|
595
|
-
clauses.push("base_url = ?");
|
|
596
|
-
params.push(normalizeBaseUrl2(options.baseUrl));
|
|
597
|
-
}
|
|
598
|
-
if (options.sessionId) {
|
|
599
|
-
clauses.push("session_id = ?");
|
|
600
|
-
params.push(options.sessionId);
|
|
601
|
-
}
|
|
602
|
-
if (options.client) {
|
|
603
|
-
clauses.push("client = ?");
|
|
604
|
-
params.push(options.client);
|
|
605
|
-
}
|
|
606
|
-
return {
|
|
607
|
-
sql: clauses.length > 0 ? `WHERE ${clauses.join(" AND ")}` : "",
|
|
608
|
-
params
|
|
609
|
-
};
|
|
610
|
-
};
|
|
611
|
-
var createSqliteUsageTrackingDriver = (options = {}) => {
|
|
612
|
-
const dbPath = options.dbPath || "routstr.sqlite";
|
|
613
|
-
const tableName = options.tableName || "usage_tracking";
|
|
614
|
-
const legacyStorageDriver = options.legacyStorageDriver;
|
|
615
|
-
let db;
|
|
616
|
-
let insertStmt;
|
|
617
|
-
let migrationComplete = false;
|
|
618
|
-
const initDb = async () => {
|
|
619
|
-
if (!db) {
|
|
620
|
-
db = await loadDatabase2(dbPath);
|
|
621
|
-
db.exec(`
|
|
622
|
-
CREATE TABLE IF NOT EXISTS ${tableName} (
|
|
623
|
-
id TEXT PRIMARY KEY,
|
|
624
|
-
timestamp INTEGER NOT NULL,
|
|
625
|
-
model_id TEXT NOT NULL,
|
|
626
|
-
base_url TEXT NOT NULL,
|
|
627
|
-
request_id TEXT NOT NULL,
|
|
628
|
-
cost REAL NOT NULL,
|
|
629
|
-
sats_cost REAL NOT NULL,
|
|
630
|
-
prompt_tokens INTEGER NOT NULL,
|
|
631
|
-
completion_tokens INTEGER NOT NULL,
|
|
632
|
-
total_tokens INTEGER NOT NULL,
|
|
633
|
-
client TEXT,
|
|
634
|
-
session_id TEXT,
|
|
635
|
-
tags TEXT
|
|
636
|
-
);
|
|
637
|
-
CREATE INDEX IF NOT EXISTS idx_${tableName}_timestamp ON ${tableName}(timestamp);
|
|
638
|
-
CREATE INDEX IF NOT EXISTS idx_${tableName}_model_id ON ${tableName}(model_id);
|
|
639
|
-
CREATE INDEX IF NOT EXISTS idx_${tableName}_base_url ON ${tableName}(base_url);
|
|
640
|
-
CREATE INDEX IF NOT EXISTS idx_${tableName}_session_id ON ${tableName}(session_id);
|
|
641
|
-
CREATE INDEX IF NOT EXISTS idx_${tableName}_client ON ${tableName}(client);
|
|
642
|
-
`);
|
|
643
|
-
insertStmt = db.prepare(`
|
|
644
|
-
INSERT OR REPLACE INTO ${tableName} (
|
|
645
|
-
id, timestamp, model_id, base_url, request_id,
|
|
646
|
-
cost, sats_cost, prompt_tokens, completion_tokens, total_tokens,
|
|
647
|
-
client, session_id, tags
|
|
648
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
649
|
-
`);
|
|
650
|
-
}
|
|
651
|
-
};
|
|
652
|
-
const ensureInit = async () => {
|
|
653
|
-
if (!db) {
|
|
654
|
-
await initDb();
|
|
655
|
-
}
|
|
656
|
-
};
|
|
657
|
-
const appendOne = (entry) => {
|
|
658
|
-
insertStmt.run(
|
|
659
|
-
entry.id,
|
|
660
|
-
entry.timestamp,
|
|
661
|
-
entry.modelId,
|
|
662
|
-
normalizeBaseUrl2(entry.baseUrl),
|
|
663
|
-
entry.requestId,
|
|
664
|
-
entry.cost,
|
|
665
|
-
entry.satsCost,
|
|
666
|
-
entry.promptTokens,
|
|
667
|
-
entry.completionTokens,
|
|
668
|
-
entry.totalTokens,
|
|
669
|
-
entry.client ?? null,
|
|
670
|
-
entry.sessionId ?? null,
|
|
671
|
-
JSON.stringify(entry.tags ?? [])
|
|
672
|
-
);
|
|
673
|
-
};
|
|
674
|
-
const ensureMigrated = async () => {
|
|
675
|
-
if (!legacyStorageDriver || migrationComplete) return;
|
|
676
|
-
const migrated = await legacyStorageDriver.getItem(
|
|
677
|
-
MIGRATION_MARKER_KEY2,
|
|
678
|
-
false
|
|
679
|
-
);
|
|
680
|
-
if (migrated) {
|
|
681
|
-
migrationComplete = true;
|
|
682
|
-
return;
|
|
683
|
-
}
|
|
684
|
-
const legacyEntries = await legacyStorageDriver.getItem(
|
|
685
|
-
SDK_STORAGE_KEYS.USAGE_TRACKING,
|
|
686
|
-
[]
|
|
687
|
-
);
|
|
688
|
-
for (const entry of legacyEntries) {
|
|
689
|
-
appendOne(entry);
|
|
690
|
-
}
|
|
691
|
-
if (legacyEntries.length > 0) {
|
|
692
|
-
await legacyStorageDriver.removeItem(SDK_STORAGE_KEYS.USAGE_TRACKING);
|
|
693
|
-
}
|
|
694
|
-
await legacyStorageDriver.setItem(MIGRATION_MARKER_KEY2, true);
|
|
695
|
-
migrationComplete = true;
|
|
696
|
-
};
|
|
697
|
-
const mapRow = (row) => ({
|
|
698
|
-
id: row.id,
|
|
699
|
-
timestamp: row.timestamp,
|
|
700
|
-
modelId: row.model_id,
|
|
701
|
-
baseUrl: row.base_url,
|
|
702
|
-
requestId: row.request_id,
|
|
703
|
-
cost: row.cost,
|
|
704
|
-
satsCost: row.sats_cost,
|
|
705
|
-
promptTokens: row.prompt_tokens,
|
|
706
|
-
completionTokens: row.completion_tokens,
|
|
707
|
-
totalTokens: row.total_tokens,
|
|
708
|
-
client: row.client ?? void 0,
|
|
709
|
-
sessionId: row.session_id ?? void 0,
|
|
710
|
-
tags: typeof row.tags === "string" ? JSON.parse(row.tags) : void 0
|
|
711
|
-
});
|
|
712
|
-
return {
|
|
713
|
-
async migrate() {
|
|
714
|
-
await ensureInit();
|
|
715
|
-
await ensureMigrated();
|
|
716
|
-
},
|
|
717
|
-
async append(entry) {
|
|
718
|
-
await ensureInit();
|
|
719
|
-
await ensureMigrated();
|
|
720
|
-
appendOne(entry);
|
|
721
|
-
},
|
|
722
|
-
async appendMany(entries) {
|
|
723
|
-
await ensureInit();
|
|
724
|
-
await ensureMigrated();
|
|
725
|
-
for (const entry of entries) {
|
|
726
|
-
appendOne(entry);
|
|
727
|
-
}
|
|
728
|
-
},
|
|
729
|
-
async list(options2 = {}) {
|
|
730
|
-
await ensureInit();
|
|
731
|
-
await ensureMigrated();
|
|
732
|
-
const { sql, params } = buildWhereClause(options2);
|
|
733
|
-
const limitSql = typeof options2.limit === "number" ? " LIMIT ?" : "";
|
|
734
|
-
const stmt = db.prepare(
|
|
735
|
-
`SELECT * FROM ${tableName} ${sql} ORDER BY timestamp DESC${limitSql}`
|
|
736
|
-
);
|
|
737
|
-
const rows = stmt.all(
|
|
738
|
-
...typeof options2.limit === "number" ? [...params, options2.limit] : params
|
|
739
|
-
);
|
|
740
|
-
return rows.map(mapRow);
|
|
741
|
-
},
|
|
742
|
-
async count(options2 = {}) {
|
|
743
|
-
await ensureInit();
|
|
744
|
-
await ensureMigrated();
|
|
745
|
-
const { sql, params } = buildWhereClause(options2);
|
|
746
|
-
const stmt = db.prepare(`SELECT COUNT(*) as count FROM ${tableName} ${sql}`);
|
|
747
|
-
const row = stmt.get(...params);
|
|
748
|
-
return Number(row?.count ?? 0);
|
|
749
|
-
},
|
|
750
|
-
async deleteOlderThan(timestamp) {
|
|
751
|
-
await ensureInit();
|
|
752
|
-
await ensureMigrated();
|
|
753
|
-
const stmt = db.prepare(`DELETE FROM ${tableName} WHERE timestamp < ?`);
|
|
754
|
-
const result = stmt.run(timestamp);
|
|
755
|
-
return result.changes;
|
|
756
|
-
},
|
|
757
|
-
async clear() {
|
|
758
|
-
await ensureInit();
|
|
759
|
-
await ensureMigrated();
|
|
760
|
-
db.prepare(`DELETE FROM ${tableName}`).run();
|
|
761
|
-
}
|
|
762
|
-
};
|
|
763
|
-
};
|
|
764
|
-
|
|
765
|
-
// storage/usageTracking/bunSqlite.ts
|
|
766
|
-
var MIGRATION_MARKER_KEY3 = "usage_tracking_migration_v1";
|
|
767
|
-
var normalizeBaseUrl3 = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
768
|
-
var buildWhereClause2 = (options = {}) => {
|
|
769
|
-
const clauses = [];
|
|
770
|
-
const params = [];
|
|
771
|
-
if (typeof options.before === "number") {
|
|
772
|
-
clauses.push("timestamp < ?");
|
|
773
|
-
params.push(options.before);
|
|
774
|
-
}
|
|
775
|
-
if (typeof options.after === "number") {
|
|
776
|
-
clauses.push("timestamp > ?");
|
|
777
|
-
params.push(options.after);
|
|
778
|
-
}
|
|
779
|
-
if (options.modelId) {
|
|
780
|
-
clauses.push("model_id = ?");
|
|
781
|
-
params.push(options.modelId);
|
|
782
|
-
}
|
|
783
|
-
if (options.baseUrl) {
|
|
784
|
-
clauses.push("base_url = ?");
|
|
785
|
-
params.push(normalizeBaseUrl3(options.baseUrl));
|
|
786
|
-
}
|
|
787
|
-
if (options.sessionId) {
|
|
788
|
-
clauses.push("session_id = ?");
|
|
789
|
-
params.push(options.sessionId);
|
|
790
|
-
}
|
|
791
|
-
if (options.client) {
|
|
792
|
-
clauses.push("client = ?");
|
|
793
|
-
params.push(options.client);
|
|
794
|
-
}
|
|
795
|
-
return {
|
|
796
|
-
sql: clauses.length > 0 ? `WHERE ${clauses.join(" AND ")}` : "",
|
|
797
|
-
params
|
|
798
|
-
};
|
|
799
|
-
};
|
|
800
|
-
var createBunSqliteUsageTrackingDriver = (options = {}) => {
|
|
801
|
-
const dbPath = options.dbPath || "routstr.sqlite";
|
|
802
|
-
const tableName = options.tableName || "usage_tracking";
|
|
803
|
-
const legacyStorageDriver = options.legacyStorageDriver;
|
|
804
|
-
const SQLiteDatabase = options.sqlite?.Database;
|
|
805
|
-
let migrationPromise = null;
|
|
806
|
-
if (!SQLiteDatabase) {
|
|
807
|
-
throw new Error(
|
|
808
|
-
"Bun SQLite Database constructor is required. Pass { sqlite: { Database } } when creating the driver."
|
|
809
|
-
);
|
|
810
|
-
}
|
|
811
|
-
const db = new SQLiteDatabase(dbPath);
|
|
812
|
-
db.run(`
|
|
813
|
-
CREATE TABLE IF NOT EXISTS ${tableName} (
|
|
814
|
-
id TEXT PRIMARY KEY,
|
|
815
|
-
timestamp INTEGER NOT NULL,
|
|
816
|
-
model_id TEXT NOT NULL,
|
|
817
|
-
base_url TEXT NOT NULL,
|
|
818
|
-
request_id TEXT NOT NULL,
|
|
819
|
-
cost REAL NOT NULL,
|
|
820
|
-
sats_cost REAL NOT NULL,
|
|
821
|
-
prompt_tokens INTEGER NOT NULL,
|
|
822
|
-
completion_tokens INTEGER NOT NULL,
|
|
823
|
-
total_tokens INTEGER NOT NULL,
|
|
824
|
-
client TEXT,
|
|
825
|
-
session_id TEXT,
|
|
826
|
-
tags TEXT
|
|
827
|
-
)
|
|
828
|
-
`);
|
|
829
|
-
db.run(`CREATE INDEX IF NOT EXISTS idx_${tableName}_timestamp ON ${tableName}(timestamp)`);
|
|
830
|
-
db.run(`CREATE INDEX IF NOT EXISTS idx_${tableName}_model_id ON ${tableName}(model_id)`);
|
|
831
|
-
db.run(`CREATE INDEX IF NOT EXISTS idx_${tableName}_base_url ON ${tableName}(base_url)`);
|
|
832
|
-
const appendOne = (entry) => {
|
|
833
|
-
db.query(`
|
|
834
|
-
INSERT OR REPLACE INTO ${tableName} (
|
|
835
|
-
id, timestamp, model_id, base_url, request_id,
|
|
836
|
-
cost, sats_cost, prompt_tokens, completion_tokens, total_tokens,
|
|
837
|
-
client, session_id, tags
|
|
838
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
839
|
-
`).run(
|
|
840
|
-
entry.id,
|
|
841
|
-
entry.timestamp,
|
|
842
|
-
entry.modelId,
|
|
843
|
-
normalizeBaseUrl3(entry.baseUrl),
|
|
844
|
-
entry.requestId,
|
|
845
|
-
entry.cost,
|
|
846
|
-
entry.satsCost,
|
|
847
|
-
entry.promptTokens,
|
|
848
|
-
entry.completionTokens,
|
|
849
|
-
entry.totalTokens,
|
|
850
|
-
entry.client ?? null,
|
|
851
|
-
entry.sessionId ?? null,
|
|
852
|
-
JSON.stringify(entry.tags ?? [])
|
|
853
|
-
);
|
|
854
|
-
};
|
|
855
|
-
const mapRow = (row) => ({
|
|
856
|
-
id: row.id,
|
|
857
|
-
timestamp: row.timestamp,
|
|
858
|
-
modelId: row.model_id,
|
|
859
|
-
baseUrl: row.base_url,
|
|
860
|
-
requestId: row.request_id,
|
|
861
|
-
cost: row.cost,
|
|
862
|
-
satsCost: row.sats_cost,
|
|
863
|
-
promptTokens: row.prompt_tokens,
|
|
864
|
-
completionTokens: row.completion_tokens,
|
|
865
|
-
totalTokens: row.total_tokens,
|
|
866
|
-
client: row.client ?? void 0,
|
|
867
|
-
sessionId: row.session_id ?? void 0,
|
|
868
|
-
tags: typeof row.tags === "string" ? JSON.parse(row.tags) : void 0
|
|
869
|
-
});
|
|
870
|
-
const ensureMigrated = async () => {
|
|
871
|
-
if (!legacyStorageDriver) return;
|
|
872
|
-
if (!migrationPromise) {
|
|
873
|
-
migrationPromise = (async () => {
|
|
874
|
-
const migrated = await legacyStorageDriver.getItem(
|
|
875
|
-
MIGRATION_MARKER_KEY3,
|
|
876
|
-
false
|
|
877
|
-
);
|
|
878
|
-
if (migrated) return;
|
|
879
|
-
const legacyEntries = await legacyStorageDriver.getItem(
|
|
880
|
-
SDK_STORAGE_KEYS.USAGE_TRACKING,
|
|
881
|
-
[]
|
|
882
|
-
);
|
|
883
|
-
if (legacyEntries.length > 0) {
|
|
884
|
-
for (const entry of legacyEntries) {
|
|
885
|
-
appendOne(entry);
|
|
886
|
-
}
|
|
887
|
-
await legacyStorageDriver.removeItem(SDK_STORAGE_KEYS.USAGE_TRACKING);
|
|
888
|
-
}
|
|
889
|
-
await legacyStorageDriver.setItem(MIGRATION_MARKER_KEY3, true);
|
|
890
|
-
})();
|
|
891
|
-
}
|
|
892
|
-
await migrationPromise;
|
|
893
|
-
};
|
|
894
|
-
return {
|
|
895
|
-
async migrate() {
|
|
896
|
-
await ensureMigrated();
|
|
897
|
-
},
|
|
898
|
-
async append(entry) {
|
|
899
|
-
await ensureMigrated();
|
|
900
|
-
appendOne(entry);
|
|
901
|
-
},
|
|
902
|
-
async appendMany(entries) {
|
|
903
|
-
await ensureMigrated();
|
|
904
|
-
for (const entry of entries) {
|
|
905
|
-
appendOne(entry);
|
|
906
|
-
}
|
|
907
|
-
},
|
|
908
|
-
async list(options2 = {}) {
|
|
909
|
-
await ensureMigrated();
|
|
910
|
-
const { sql, params } = buildWhereClause2(options2);
|
|
911
|
-
const limitSql = typeof options2.limit === "number" ? " LIMIT ?" : "";
|
|
912
|
-
const query = `SELECT * FROM ${tableName} ${sql} ORDER BY timestamp DESC${limitSql}`;
|
|
913
|
-
let rows;
|
|
914
|
-
if (typeof options2.limit === "number") {
|
|
915
|
-
rows = db.query(query).all(...params, options2.limit);
|
|
916
|
-
} else {
|
|
917
|
-
rows = db.query(query).all(...params);
|
|
918
|
-
}
|
|
919
|
-
return rows.map(mapRow);
|
|
920
|
-
},
|
|
921
|
-
async count(options2 = {}) {
|
|
922
|
-
const { sql, params } = buildWhereClause2(options2);
|
|
923
|
-
const query = `SELECT COUNT(*) as count FROM ${tableName} ${sql}`;
|
|
924
|
-
const row = db.query(query).get(...params);
|
|
925
|
-
return Number(row?.count ?? 0);
|
|
926
|
-
},
|
|
927
|
-
async deleteOlderThan(timestamp) {
|
|
928
|
-
await ensureMigrated();
|
|
929
|
-
const before = timestamp;
|
|
930
|
-
const result = db.query(`DELETE FROM ${tableName} WHERE timestamp < ?`).run(before);
|
|
931
|
-
return result.changes ?? 0;
|
|
932
|
-
},
|
|
933
|
-
async clear() {
|
|
934
|
-
await ensureMigrated();
|
|
935
|
-
db.query(`DELETE FROM ${tableName}`).run();
|
|
936
|
-
}
|
|
937
|
-
};
|
|
938
|
-
};
|
|
939
|
-
|
|
940
535
|
// storage/usageTracking/memory.ts
|
|
941
|
-
var
|
|
536
|
+
var normalizeBaseUrl2 = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
942
537
|
var matchesFilters2 = (entry, options = {}) => {
|
|
943
538
|
if (typeof options.before === "number" && entry.timestamp >= options.before) {
|
|
944
539
|
return false;
|
|
@@ -949,7 +544,7 @@ var matchesFilters2 = (entry, options = {}) => {
|
|
|
949
544
|
if (options.modelId && entry.modelId !== options.modelId) {
|
|
950
545
|
return false;
|
|
951
546
|
}
|
|
952
|
-
if (options.baseUrl &&
|
|
547
|
+
if (options.baseUrl && normalizeBaseUrl2(entry.baseUrl) !== normalizeBaseUrl2(options.baseUrl)) {
|
|
953
548
|
return false;
|
|
954
549
|
}
|
|
955
550
|
if (options.sessionId && entry.sessionId !== options.sessionId) {
|
|
@@ -958,23 +553,29 @@ var matchesFilters2 = (entry, options = {}) => {
|
|
|
958
553
|
if (options.client && entry.client !== options.client) {
|
|
959
554
|
return false;
|
|
960
555
|
}
|
|
556
|
+
if (options.clients && options.clients.length > 0 && (entry.client == null || !options.clients.includes(entry.client))) {
|
|
557
|
+
return false;
|
|
558
|
+
}
|
|
559
|
+
if (options.provider && entry.provider !== options.provider) {
|
|
560
|
+
return false;
|
|
561
|
+
}
|
|
961
562
|
return true;
|
|
962
563
|
};
|
|
963
564
|
var createMemoryUsageTrackingDriver = (seed = []) => {
|
|
964
565
|
const store = /* @__PURE__ */ new Map();
|
|
965
566
|
for (const entry of seed) {
|
|
966
|
-
store.set(entry.id, { ...entry, baseUrl:
|
|
567
|
+
store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl2(entry.baseUrl) });
|
|
967
568
|
}
|
|
968
569
|
return {
|
|
969
570
|
async migrate() {
|
|
970
571
|
return;
|
|
971
572
|
},
|
|
972
573
|
async append(entry) {
|
|
973
|
-
store.set(entry.id, { ...entry, baseUrl:
|
|
574
|
+
store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl2(entry.baseUrl) });
|
|
974
575
|
},
|
|
975
576
|
async appendMany(entries) {
|
|
976
577
|
for (const entry of entries) {
|
|
977
|
-
store.set(entry.id, { ...entry, baseUrl:
|
|
578
|
+
store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl2(entry.baseUrl) });
|
|
978
579
|
}
|
|
979
580
|
},
|
|
980
581
|
async list(options = {}) {
|
|
@@ -987,6 +588,10 @@ var createMemoryUsageTrackingDriver = (seed = []) => {
|
|
|
987
588
|
async count(options = {}) {
|
|
988
589
|
return (await this.list(options)).length;
|
|
989
590
|
},
|
|
591
|
+
async aggregate(options = {}) {
|
|
592
|
+
const entries = [...store.values()].filter((entry) => matchesFilters2(entry, options));
|
|
593
|
+
return reduceAggregate(entries, options);
|
|
594
|
+
},
|
|
990
595
|
async deleteOlderThan(timestamp) {
|
|
991
596
|
let deleted = 0;
|
|
992
597
|
for (const [id, entry] of store.entries()) {
|
|
@@ -1002,7 +607,22 @@ var createMemoryUsageTrackingDriver = (seed = []) => {
|
|
|
1002
607
|
}
|
|
1003
608
|
};
|
|
1004
609
|
};
|
|
1005
|
-
|
|
610
|
+
|
|
611
|
+
// core/types.ts
|
|
612
|
+
function makeConsoleLogger(prefix) {
|
|
613
|
+
const fmt = (args) => prefix ? [prefix, ...args] : args;
|
|
614
|
+
return {
|
|
615
|
+
log: (...args) => console.log(...fmt(args)),
|
|
616
|
+
warn: (...args) => console.warn(...fmt(args)),
|
|
617
|
+
error: (...args) => console.error(...fmt(args)),
|
|
618
|
+
debug: (...args) => console.log(...fmt(args)),
|
|
619
|
+
child: (p) => makeConsoleLogger(prefix ? `${prefix}:${p}` : p)
|
|
620
|
+
};
|
|
621
|
+
}
|
|
622
|
+
var consoleLogger = makeConsoleLogger();
|
|
623
|
+
|
|
624
|
+
// storage/store.ts
|
|
625
|
+
var normalizeBaseUrl3 = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
1006
626
|
var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
1007
627
|
modelsFromAllProviders: {},
|
|
1008
628
|
lastUsedModel: null,
|
|
@@ -1025,7 +645,7 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1025
645
|
setModelsFromAllProviders: (value) => {
|
|
1026
646
|
const normalized = {};
|
|
1027
647
|
for (const [baseUrl, models] of Object.entries(value)) {
|
|
1028
|
-
normalized[
|
|
648
|
+
normalized[normalizeBaseUrl3(baseUrl)] = models;
|
|
1029
649
|
}
|
|
1030
650
|
void driver.setItem(
|
|
1031
651
|
SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,
|
|
@@ -1038,7 +658,7 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1038
658
|
set({ lastUsedModel: value });
|
|
1039
659
|
},
|
|
1040
660
|
setBaseUrlsList: (value) => {
|
|
1041
|
-
const normalized = value.map((url) =>
|
|
661
|
+
const normalized = value.map((url) => normalizeBaseUrl3(url));
|
|
1042
662
|
void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);
|
|
1043
663
|
set({ baseUrlsList: normalized });
|
|
1044
664
|
},
|
|
@@ -1047,14 +667,14 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1047
667
|
set({ lastBaseUrlsUpdate: value });
|
|
1048
668
|
},
|
|
1049
669
|
setDisabledProviders: (value) => {
|
|
1050
|
-
const normalized = value.map((url) =>
|
|
670
|
+
const normalized = value.map((url) => normalizeBaseUrl3(url));
|
|
1051
671
|
void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);
|
|
1052
672
|
set({ disabledProviders: normalized });
|
|
1053
673
|
},
|
|
1054
674
|
setMintsFromAllProviders: (value) => {
|
|
1055
675
|
const normalized = {};
|
|
1056
676
|
for (const [baseUrl, mints] of Object.entries(value)) {
|
|
1057
|
-
normalized[
|
|
677
|
+
normalized[normalizeBaseUrl3(baseUrl)] = mints.map(
|
|
1058
678
|
(mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint
|
|
1059
679
|
);
|
|
1060
680
|
}
|
|
@@ -1067,7 +687,7 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1067
687
|
setInfoFromAllProviders: (value) => {
|
|
1068
688
|
const normalized = {};
|
|
1069
689
|
for (const [baseUrl, info] of Object.entries(value)) {
|
|
1070
|
-
normalized[
|
|
690
|
+
normalized[normalizeBaseUrl3(baseUrl)] = info;
|
|
1071
691
|
}
|
|
1072
692
|
void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);
|
|
1073
693
|
set({ infoFromAllProviders: normalized });
|
|
@@ -1075,7 +695,7 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1075
695
|
setLastModelsUpdate: (value) => {
|
|
1076
696
|
const normalized = {};
|
|
1077
697
|
for (const [baseUrl, timestamp] of Object.entries(value)) {
|
|
1078
|
-
normalized[
|
|
698
|
+
normalized[normalizeBaseUrl3(baseUrl)] = timestamp;
|
|
1079
699
|
}
|
|
1080
700
|
void driver.setItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, normalized);
|
|
1081
701
|
set({ lastModelsUpdate: normalized });
|
|
@@ -1085,7 +705,7 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1085
705
|
const updates = typeof value === "function" ? value(state.apiKeys) : value;
|
|
1086
706
|
const normalized = updates.map((entry) => ({
|
|
1087
707
|
...entry,
|
|
1088
|
-
baseUrl:
|
|
708
|
+
baseUrl: normalizeBaseUrl3(entry.baseUrl),
|
|
1089
709
|
balance: entry.balance ?? 0,
|
|
1090
710
|
lastUsed: entry.lastUsed ?? null
|
|
1091
711
|
}));
|
|
@@ -1097,7 +717,7 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1097
717
|
set((state) => {
|
|
1098
718
|
const updates = typeof value === "function" ? value(state.childKeys) : value;
|
|
1099
719
|
const normalized = updates.map((entry) => ({
|
|
1100
|
-
parentBaseUrl:
|
|
720
|
+
parentBaseUrl: normalizeBaseUrl3(entry.parentBaseUrl),
|
|
1101
721
|
childKey: entry.childKey,
|
|
1102
722
|
balance: entry.balance ?? 0,
|
|
1103
723
|
balanceLimit: entry.balanceLimit,
|
|
@@ -1111,9 +731,9 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1111
731
|
setXcashuTokens: (value) => {
|
|
1112
732
|
const normalized = {};
|
|
1113
733
|
for (const [baseUrl, tokens] of Object.entries(value)) {
|
|
1114
|
-
normalized[
|
|
734
|
+
normalized[normalizeBaseUrl3(baseUrl)] = tokens.map((entry) => ({
|
|
1115
735
|
...entry,
|
|
1116
|
-
baseUrl:
|
|
736
|
+
baseUrl: normalizeBaseUrl3(entry.baseUrl),
|
|
1117
737
|
createdAt: entry.createdAt ?? Date.now(),
|
|
1118
738
|
tryCount: entry.tryCount ?? 0
|
|
1119
739
|
}));
|
|
@@ -1164,12 +784,12 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1164
784
|
},
|
|
1165
785
|
// ========== Failure Tracking ==========
|
|
1166
786
|
setFailedProviders: (value) => {
|
|
1167
|
-
const normalized = value.map((url) =>
|
|
787
|
+
const normalized = value.map((url) => normalizeBaseUrl3(url));
|
|
1168
788
|
void driver.setItem(SDK_STORAGE_KEYS.FAILED_PROVIDERS, normalized);
|
|
1169
789
|
set({ failedProviders: normalized });
|
|
1170
790
|
},
|
|
1171
791
|
addFailedProvider: (baseUrl) => {
|
|
1172
|
-
const normalized =
|
|
792
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1173
793
|
const current = get().failedProviders;
|
|
1174
794
|
if (!current.includes(normalized)) {
|
|
1175
795
|
const updated = [...current, normalized];
|
|
@@ -1178,7 +798,7 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1178
798
|
}
|
|
1179
799
|
},
|
|
1180
800
|
removeFailedProvider: (baseUrl) => {
|
|
1181
|
-
const normalized =
|
|
801
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1182
802
|
const current = get().failedProviders;
|
|
1183
803
|
const updated = current.filter((url) => url !== normalized);
|
|
1184
804
|
void driver.setItem(SDK_STORAGE_KEYS.FAILED_PROVIDERS, updated);
|
|
@@ -1187,13 +807,13 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1187
807
|
setLastFailed: (value) => {
|
|
1188
808
|
const normalized = {};
|
|
1189
809
|
for (const [baseUrl, timestamp] of Object.entries(value)) {
|
|
1190
|
-
normalized[
|
|
810
|
+
normalized[normalizeBaseUrl3(baseUrl)] = timestamp;
|
|
1191
811
|
}
|
|
1192
812
|
void driver.setItem(SDK_STORAGE_KEYS.LAST_FAILED, normalized);
|
|
1193
813
|
set({ lastFailed: normalized });
|
|
1194
814
|
},
|
|
1195
815
|
setLastFailedTimestamp: (baseUrl, timestamp) => {
|
|
1196
|
-
const normalized =
|
|
816
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1197
817
|
const current = get().lastFailed;
|
|
1198
818
|
const updated = { ...current, [normalized]: timestamp };
|
|
1199
819
|
void driver.setItem(SDK_STORAGE_KEYS.LAST_FAILED, updated);
|
|
@@ -1201,14 +821,14 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1201
821
|
},
|
|
1202
822
|
setProvidersOnCooldown: (value) => {
|
|
1203
823
|
const normalized = value.map((entry) => ({
|
|
1204
|
-
baseUrl:
|
|
824
|
+
baseUrl: normalizeBaseUrl3(entry.baseUrl),
|
|
1205
825
|
timestamp: entry.timestamp
|
|
1206
826
|
}));
|
|
1207
827
|
void driver.setItem(SDK_STORAGE_KEYS.PROVIDERS_ON_COOLDOWN, normalized);
|
|
1208
828
|
set({ providersOnCooldown: normalized });
|
|
1209
829
|
},
|
|
1210
830
|
addProviderOnCooldown: (baseUrl, timestamp) => {
|
|
1211
|
-
const normalized =
|
|
831
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1212
832
|
const current = get().providersOnCooldown;
|
|
1213
833
|
if (!current.some((entry) => entry.baseUrl === normalized)) {
|
|
1214
834
|
const updated = [...current, { baseUrl: normalized, timestamp }];
|
|
@@ -1217,7 +837,7 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1217
837
|
}
|
|
1218
838
|
},
|
|
1219
839
|
removeProviderFromCooldown: (baseUrl) => {
|
|
1220
|
-
const normalized =
|
|
840
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1221
841
|
const current = get().providersOnCooldown;
|
|
1222
842
|
const updated = current.filter((entry) => entry.baseUrl !== normalized);
|
|
1223
843
|
void driver.setItem(SDK_STORAGE_KEYS.PROVIDERS_ON_COOLDOWN, updated);
|
|
@@ -1288,40 +908,40 @@ var hydrateStoreFromDriver = async (store, driver) => {
|
|
|
1288
908
|
]);
|
|
1289
909
|
const modelsFromAllProviders = Object.fromEntries(
|
|
1290
910
|
Object.entries(rawModels).map(([baseUrl, models]) => [
|
|
1291
|
-
|
|
911
|
+
normalizeBaseUrl3(baseUrl),
|
|
1292
912
|
models
|
|
1293
913
|
])
|
|
1294
914
|
);
|
|
1295
|
-
const baseUrlsList = rawBaseUrls.map((url) =>
|
|
915
|
+
const baseUrlsList = rawBaseUrls.map((url) => normalizeBaseUrl3(url));
|
|
1296
916
|
const disabledProviders = rawDisabledProviders.map(
|
|
1297
|
-
(url) =>
|
|
917
|
+
(url) => normalizeBaseUrl3(url)
|
|
1298
918
|
);
|
|
1299
919
|
const mintsFromAllProviders = Object.fromEntries(
|
|
1300
920
|
Object.entries(rawMints).map(([baseUrl, mints]) => [
|
|
1301
|
-
|
|
921
|
+
normalizeBaseUrl3(baseUrl),
|
|
1302
922
|
mints.map((mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint)
|
|
1303
923
|
])
|
|
1304
924
|
);
|
|
1305
925
|
const infoFromAllProviders = Object.fromEntries(
|
|
1306
926
|
Object.entries(rawInfo).map(([baseUrl, info]) => [
|
|
1307
|
-
|
|
927
|
+
normalizeBaseUrl3(baseUrl),
|
|
1308
928
|
info
|
|
1309
929
|
])
|
|
1310
930
|
);
|
|
1311
931
|
const lastModelsUpdate = Object.fromEntries(
|
|
1312
932
|
Object.entries(rawLastModelsUpdate).map(([baseUrl, timestamp]) => [
|
|
1313
|
-
|
|
933
|
+
normalizeBaseUrl3(baseUrl),
|
|
1314
934
|
timestamp
|
|
1315
935
|
])
|
|
1316
936
|
);
|
|
1317
937
|
const apiKeys = rawApiKeys.map((entry) => ({
|
|
1318
938
|
...entry,
|
|
1319
|
-
baseUrl:
|
|
939
|
+
baseUrl: normalizeBaseUrl3(entry.baseUrl),
|
|
1320
940
|
balance: entry.balance ?? 0,
|
|
1321
941
|
lastUsed: entry.lastUsed ?? null
|
|
1322
942
|
}));
|
|
1323
943
|
const childKeys = rawChildKeys.map((entry) => ({
|
|
1324
|
-
parentBaseUrl:
|
|
944
|
+
parentBaseUrl: normalizeBaseUrl3(entry.parentBaseUrl),
|
|
1325
945
|
childKey: entry.childKey,
|
|
1326
946
|
balance: entry.balance ?? 0,
|
|
1327
947
|
balanceLimit: entry.balanceLimit,
|
|
@@ -1330,9 +950,9 @@ var hydrateStoreFromDriver = async (store, driver) => {
|
|
|
1330
950
|
}));
|
|
1331
951
|
const xcashuTokens = Object.fromEntries(
|
|
1332
952
|
Object.entries(rawXcashuTokens).map(([baseUrl, tokens]) => [
|
|
1333
|
-
|
|
953
|
+
normalizeBaseUrl3(baseUrl),
|
|
1334
954
|
tokens.map((entry) => ({
|
|
1335
|
-
baseUrl:
|
|
955
|
+
baseUrl: normalizeBaseUrl3(entry.baseUrl),
|
|
1336
956
|
token: entry.token,
|
|
1337
957
|
createdAt: entry.createdAt ?? Date.now(),
|
|
1338
958
|
tryCount: entry.tryCount ?? 0
|
|
@@ -1353,16 +973,16 @@ var hydrateStoreFromDriver = async (store, driver) => {
|
|
|
1353
973
|
lastUsed: entry.lastUsed ?? null
|
|
1354
974
|
}));
|
|
1355
975
|
const failedProviders = rawFailedProviders.map(
|
|
1356
|
-
(url) =>
|
|
976
|
+
(url) => normalizeBaseUrl3(url)
|
|
1357
977
|
);
|
|
1358
978
|
const lastFailed = Object.fromEntries(
|
|
1359
979
|
Object.entries(rawLastFailed).map(([baseUrl, timestamp]) => [
|
|
1360
|
-
|
|
980
|
+
normalizeBaseUrl3(baseUrl),
|
|
1361
981
|
timestamp
|
|
1362
982
|
])
|
|
1363
983
|
);
|
|
1364
984
|
const providersOnCooldown = rawProvidersOnCooldown.map((entry) => ({
|
|
1365
|
-
baseUrl:
|
|
985
|
+
baseUrl: normalizeBaseUrl3(entry.baseUrl),
|
|
1366
986
|
timestamp: entry.timestamp
|
|
1367
987
|
}));
|
|
1368
988
|
store.setState({
|
|
@@ -1403,12 +1023,12 @@ var createDiscoveryAdapterFromStore = (store) => ({
|
|
|
1403
1023
|
getCachedProviderInfo: () => store.getState().infoFromAllProviders,
|
|
1404
1024
|
setCachedProviderInfo: (info) => store.getState().setInfoFromAllProviders(info),
|
|
1405
1025
|
getProviderLastUpdate: (baseUrl) => {
|
|
1406
|
-
const normalized =
|
|
1026
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1407
1027
|
const timestamps = store.getState().lastModelsUpdate;
|
|
1408
1028
|
return timestamps[normalized] || null;
|
|
1409
1029
|
},
|
|
1410
1030
|
setProviderLastUpdate: (baseUrl, timestamp) => {
|
|
1411
|
-
const normalized =
|
|
1031
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1412
1032
|
const timestamps = { ...store.getState().lastModelsUpdate };
|
|
1413
1033
|
timestamps[normalized] = timestamp;
|
|
1414
1034
|
store.getState().setLastModelsUpdate(timestamps);
|
|
@@ -1437,24 +1057,24 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1437
1057
|
return Object.entries(distributionMap).map(([baseUrl, amt]) => ({ baseUrl, amount: amt })).sort((a, b) => b.amount - a.amount);
|
|
1438
1058
|
},
|
|
1439
1059
|
saveProviderInfo: (baseUrl, info) => {
|
|
1440
|
-
const normalized =
|
|
1060
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1441
1061
|
const next = { ...store.getState().infoFromAllProviders };
|
|
1442
1062
|
next[normalized] = info;
|
|
1443
1063
|
store.getState().setInfoFromAllProviders(next);
|
|
1444
1064
|
},
|
|
1445
1065
|
getProviderInfo: (baseUrl) => {
|
|
1446
|
-
const normalized =
|
|
1066
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1447
1067
|
return store.getState().infoFromAllProviders[normalized] || null;
|
|
1448
1068
|
},
|
|
1449
1069
|
// ========== API Keys (for apikeys mode) ==========
|
|
1450
1070
|
getApiKey: (baseUrl) => {
|
|
1451
|
-
const normalized =
|
|
1071
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1452
1072
|
const entry = store.getState().apiKeys.find((key) => key.baseUrl === normalized);
|
|
1453
1073
|
if (!entry) return null;
|
|
1454
1074
|
return entry;
|
|
1455
1075
|
},
|
|
1456
1076
|
setApiKey: (baseUrl, key) => {
|
|
1457
|
-
const normalized =
|
|
1077
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1458
1078
|
const keys = store.getState().apiKeys;
|
|
1459
1079
|
const existingIndex = keys.findIndex(
|
|
1460
1080
|
(entry) => entry.baseUrl === normalized
|
|
@@ -1472,7 +1092,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1472
1092
|
store.getState().setApiKeys(next);
|
|
1473
1093
|
},
|
|
1474
1094
|
updateApiKeyBalance: (baseUrl, balance) => {
|
|
1475
|
-
const normalized =
|
|
1095
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1476
1096
|
const keys = store.getState().apiKeys;
|
|
1477
1097
|
const next = keys.map(
|
|
1478
1098
|
(entry) => entry.baseUrl === normalized ? { ...entry, balance, lastUsed: Date.now() } : entry
|
|
@@ -1480,7 +1100,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1480
1100
|
store.getState().setApiKeys(next);
|
|
1481
1101
|
},
|
|
1482
1102
|
removeApiKey: (baseUrl) => {
|
|
1483
|
-
const normalized =
|
|
1103
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1484
1104
|
const next = store.getState().apiKeys.filter((entry) => entry.baseUrl !== normalized);
|
|
1485
1105
|
store.getState().setApiKeys(next);
|
|
1486
1106
|
},
|
|
@@ -1494,7 +1114,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1494
1114
|
},
|
|
1495
1115
|
// ========== Child Keys ==========
|
|
1496
1116
|
getChildKey: (parentBaseUrl) => {
|
|
1497
|
-
const normalized =
|
|
1117
|
+
const normalized = normalizeBaseUrl3(parentBaseUrl);
|
|
1498
1118
|
const entry = store.getState().childKeys.find((key) => key.parentBaseUrl === normalized);
|
|
1499
1119
|
if (!entry) return null;
|
|
1500
1120
|
return {
|
|
@@ -1507,7 +1127,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1507
1127
|
};
|
|
1508
1128
|
},
|
|
1509
1129
|
setChildKey: (parentBaseUrl, childKey, balance, validityDate, balanceLimit) => {
|
|
1510
|
-
const normalized =
|
|
1130
|
+
const normalized = normalizeBaseUrl3(parentBaseUrl);
|
|
1511
1131
|
const keys = store.getState().childKeys;
|
|
1512
1132
|
const existingIndex = keys.findIndex(
|
|
1513
1133
|
(entry) => entry.parentBaseUrl === normalized
|
|
@@ -1538,7 +1158,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1538
1158
|
}
|
|
1539
1159
|
},
|
|
1540
1160
|
updateChildKeyBalance: (parentBaseUrl, balance) => {
|
|
1541
|
-
const normalized =
|
|
1161
|
+
const normalized = normalizeBaseUrl3(parentBaseUrl);
|
|
1542
1162
|
const keys = store.getState().childKeys;
|
|
1543
1163
|
const next = keys.map(
|
|
1544
1164
|
(entry) => entry.parentBaseUrl === normalized ? { ...entry, balance } : entry
|
|
@@ -1546,7 +1166,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1546
1166
|
store.getState().setChildKeys(next);
|
|
1547
1167
|
},
|
|
1548
1168
|
removeChildKey: (parentBaseUrl) => {
|
|
1549
|
-
const normalized =
|
|
1169
|
+
const normalized = normalizeBaseUrl3(parentBaseUrl);
|
|
1550
1170
|
const next = store.getState().childKeys.filter((entry) => entry.parentBaseUrl !== normalized);
|
|
1551
1171
|
store.getState().setChildKeys(next);
|
|
1552
1172
|
},
|
|
@@ -1571,11 +1191,11 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1571
1191
|
return store.getState().xcashuTokens;
|
|
1572
1192
|
},
|
|
1573
1193
|
getXcashuTokensForBaseUrl: (baseUrl) => {
|
|
1574
|
-
const normalized =
|
|
1194
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1575
1195
|
return store.getState().xcashuTokens[normalized] || [];
|
|
1576
1196
|
},
|
|
1577
1197
|
addXcashuToken: (baseUrl, token) => {
|
|
1578
|
-
const normalized =
|
|
1198
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1579
1199
|
const tokens = store.getState().xcashuTokens;
|
|
1580
1200
|
const existing = tokens[normalized] || [];
|
|
1581
1201
|
const next = { ...tokens };
|
|
@@ -1586,7 +1206,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1586
1206
|
store.getState().setXcashuTokens(next);
|
|
1587
1207
|
},
|
|
1588
1208
|
removeXcashuToken: (baseUrl, token) => {
|
|
1589
|
-
const normalized =
|
|
1209
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1590
1210
|
const tokens = store.getState().xcashuTokens;
|
|
1591
1211
|
const existing = tokens[normalized] || [];
|
|
1592
1212
|
const next = { ...tokens };
|
|
@@ -1597,7 +1217,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1597
1217
|
store.getState().setXcashuTokens(next);
|
|
1598
1218
|
},
|
|
1599
1219
|
clearXcashuTokensForBaseUrl: (baseUrl) => {
|
|
1600
|
-
const normalized =
|
|
1220
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1601
1221
|
const tokens = store.getState().xcashuTokens;
|
|
1602
1222
|
const next = { ...tokens };
|
|
1603
1223
|
delete next[normalized];
|
|
@@ -1611,16 +1231,16 @@ var createProviderRegistryFromStore = (store, logger) => {
|
|
|
1611
1231
|
const log = (logger ?? consoleLogger).child("ProviderRegistry");
|
|
1612
1232
|
return {
|
|
1613
1233
|
getModelsForProvider: (baseUrl) => {
|
|
1614
|
-
const normalized =
|
|
1234
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1615
1235
|
return store.getState().modelsFromAllProviders[normalized] || [];
|
|
1616
1236
|
},
|
|
1617
1237
|
getDisabledProviders: () => store.getState().disabledProviders,
|
|
1618
1238
|
getProviderMints: (baseUrl) => {
|
|
1619
|
-
const normalized =
|
|
1239
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1620
1240
|
return store.getState().mintsFromAllProviders[normalized] || [];
|
|
1621
1241
|
},
|
|
1622
1242
|
getProviderInfo: async (baseUrl) => {
|
|
1623
|
-
const normalized =
|
|
1243
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1624
1244
|
const cached = store.getState().infoFromAllProviders[normalized];
|
|
1625
1245
|
if (cached) return cached;
|
|
1626
1246
|
try {
|
|
@@ -1646,11 +1266,11 @@ var createProviderRegistryFromStore = (store, logger) => {
|
|
|
1646
1266
|
var MODEL_KEY_PREFIX = "models:provider:";
|
|
1647
1267
|
var MODEL_TS_KEY_PREFIX = "models:provider_timestamp:";
|
|
1648
1268
|
var PROVIDER_INDEX_KEY = "models:provider_index";
|
|
1649
|
-
var
|
|
1269
|
+
var MIGRATION_MARKER_KEY2 = "models_sharded_migration_v1";
|
|
1650
1270
|
var encodeBaseUrl = (baseUrl) => encodeURIComponent(baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`);
|
|
1651
1271
|
var modelKey = (baseUrl) => `${MODEL_KEY_PREFIX}${encodeBaseUrl(baseUrl)}`;
|
|
1652
1272
|
var modelTsKey = (baseUrl) => `${MODEL_TS_KEY_PREFIX}${encodeBaseUrl(baseUrl)}`;
|
|
1653
|
-
var
|
|
1273
|
+
var normalizeBaseUrl4 = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
1654
1274
|
var createShardedDiscoveryAdapter = async (options) => {
|
|
1655
1275
|
const { driver } = options;
|
|
1656
1276
|
const legacyModels = await driver.getItem(SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS, {});
|
|
@@ -1658,7 +1278,7 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1658
1278
|
if (Object.keys(legacyModels).length > 0) {
|
|
1659
1279
|
const migratedProviders = [];
|
|
1660
1280
|
for (const [baseUrl, models] of Object.entries(legacyModels)) {
|
|
1661
|
-
const normalized =
|
|
1281
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1662
1282
|
await driver.setItem(modelKey(normalized), models);
|
|
1663
1283
|
const ts = legacyTimestamps[normalized] ?? Date.now();
|
|
1664
1284
|
await driver.setItem(modelTsKey(normalized), ts);
|
|
@@ -1673,7 +1293,7 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1673
1293
|
await driver.removeItem(SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS);
|
|
1674
1294
|
await driver.removeItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE);
|
|
1675
1295
|
}
|
|
1676
|
-
await driver.setItem(
|
|
1296
|
+
await driver.setItem(MIGRATION_MARKER_KEY2, true);
|
|
1677
1297
|
const [
|
|
1678
1298
|
rawMints,
|
|
1679
1299
|
rawInfo,
|
|
@@ -1707,31 +1327,31 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1707
1327
|
const providerIndex = /* @__PURE__ */ new Set();
|
|
1708
1328
|
const knownProviders = /* @__PURE__ */ new Set();
|
|
1709
1329
|
for (const baseUrl of Object.keys(rawInfo)) {
|
|
1710
|
-
knownProviders.add(
|
|
1330
|
+
knownProviders.add(normalizeBaseUrl4(baseUrl));
|
|
1711
1331
|
}
|
|
1712
1332
|
for (const baseUrl of Object.keys(rawMints)) {
|
|
1713
|
-
knownProviders.add(
|
|
1333
|
+
knownProviders.add(normalizeBaseUrl4(baseUrl));
|
|
1714
1334
|
}
|
|
1715
1335
|
for (const baseUrl of rawBaseUrls) {
|
|
1716
|
-
knownProviders.add(
|
|
1336
|
+
knownProviders.add(normalizeBaseUrl4(baseUrl));
|
|
1717
1337
|
}
|
|
1718
1338
|
for (const baseUrl of rawDisabled) {
|
|
1719
|
-
knownProviders.add(
|
|
1339
|
+
knownProviders.add(normalizeBaseUrl4(baseUrl));
|
|
1720
1340
|
}
|
|
1721
1341
|
for (const baseUrl of Object.keys(legacyModels)) {
|
|
1722
|
-
knownProviders.add(
|
|
1342
|
+
knownProviders.add(normalizeBaseUrl4(baseUrl));
|
|
1723
1343
|
}
|
|
1724
1344
|
const indexProviders = await driver.getItem(
|
|
1725
1345
|
PROVIDER_INDEX_KEY,
|
|
1726
1346
|
[]
|
|
1727
1347
|
);
|
|
1728
1348
|
for (const baseUrl of indexProviders) {
|
|
1729
|
-
const normalized =
|
|
1349
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1730
1350
|
providerIndex.add(normalized);
|
|
1731
1351
|
knownProviders.add(normalized);
|
|
1732
1352
|
}
|
|
1733
1353
|
for (const baseUrl of knownProviders) {
|
|
1734
|
-
const normalized =
|
|
1354
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1735
1355
|
const models = await driver.getItem(
|
|
1736
1356
|
modelKey(normalized),
|
|
1737
1357
|
null
|
|
@@ -1752,19 +1372,19 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1752
1372
|
}
|
|
1753
1373
|
let mints = Object.fromEntries(
|
|
1754
1374
|
Object.entries(rawMints).map(([baseUrl, mintList]) => [
|
|
1755
|
-
|
|
1375
|
+
normalizeBaseUrl4(baseUrl),
|
|
1756
1376
|
mintList.map((mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint)
|
|
1757
1377
|
])
|
|
1758
1378
|
);
|
|
1759
1379
|
let info = Object.fromEntries(
|
|
1760
1380
|
Object.entries(rawInfo).map(([baseUrl, entry]) => [
|
|
1761
|
-
|
|
1381
|
+
normalizeBaseUrl4(baseUrl),
|
|
1762
1382
|
entry
|
|
1763
1383
|
])
|
|
1764
1384
|
);
|
|
1765
1385
|
let _lastUsedModel = lastUsedModel;
|
|
1766
|
-
let _disabledProviders = rawDisabled.map(
|
|
1767
|
-
let _baseUrlsList = rawBaseUrls.map(
|
|
1386
|
+
let _disabledProviders = rawDisabled.map(normalizeBaseUrl4);
|
|
1387
|
+
let _baseUrlsList = rawBaseUrls.map(normalizeBaseUrl4);
|
|
1768
1388
|
let _lastBaseUrlsUpdate = lastBaseUrlsUpdate;
|
|
1769
1389
|
let _routstr21Models = rawRoutstr21Models;
|
|
1770
1390
|
let _lastRoutstr21ModelsUpdate = lastRoutstr21ModelsUpdate;
|
|
@@ -1782,10 +1402,10 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1782
1402
|
},
|
|
1783
1403
|
setCachedModels: (models) => {
|
|
1784
1404
|
const nextKeys = new Set(
|
|
1785
|
-
Object.keys(models).map((baseUrl) =>
|
|
1405
|
+
Object.keys(models).map((baseUrl) => normalizeBaseUrl4(baseUrl))
|
|
1786
1406
|
);
|
|
1787
1407
|
for (const baseUrl of [...modelsByBaseUrl.keys()]) {
|
|
1788
|
-
if (!nextKeys.has(
|
|
1408
|
+
if (!nextKeys.has(normalizeBaseUrl4(baseUrl))) {
|
|
1789
1409
|
providerIndex.delete(baseUrl);
|
|
1790
1410
|
modelsByBaseUrl.delete(baseUrl);
|
|
1791
1411
|
timestampsByBaseUrl.delete(baseUrl);
|
|
@@ -1794,7 +1414,7 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1794
1414
|
}
|
|
1795
1415
|
}
|
|
1796
1416
|
for (const [baseUrl, modelList] of Object.entries(models)) {
|
|
1797
|
-
const normalized =
|
|
1417
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1798
1418
|
providerIndex.add(normalized);
|
|
1799
1419
|
modelsByBaseUrl.set(normalized, modelList);
|
|
1800
1420
|
const ts = timestampsByBaseUrl.get(normalized) ?? Date.now();
|
|
@@ -1805,10 +1425,10 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1805
1425
|
persistProviderIndex();
|
|
1806
1426
|
},
|
|
1807
1427
|
getProviderLastUpdate: (baseUrl) => {
|
|
1808
|
-
return timestampsByBaseUrl.get(
|
|
1428
|
+
return timestampsByBaseUrl.get(normalizeBaseUrl4(baseUrl)) ?? null;
|
|
1809
1429
|
},
|
|
1810
1430
|
setProviderLastUpdate: (baseUrl, timestamp) => {
|
|
1811
|
-
const normalized =
|
|
1431
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1812
1432
|
providerIndex.add(normalized);
|
|
1813
1433
|
timestampsByBaseUrl.set(normalized, timestamp);
|
|
1814
1434
|
void driver.setItem(modelTsKey(normalized), timestamp);
|
|
@@ -1819,7 +1439,7 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1819
1439
|
setCachedMints: (value) => {
|
|
1820
1440
|
const normalized = {};
|
|
1821
1441
|
for (const [baseUrl, mintList] of Object.entries(value)) {
|
|
1822
|
-
normalized[
|
|
1442
|
+
normalized[normalizeBaseUrl4(baseUrl)] = mintList.map(
|
|
1823
1443
|
(mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint
|
|
1824
1444
|
);
|
|
1825
1445
|
}
|
|
@@ -1831,7 +1451,7 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1831
1451
|
setCachedProviderInfo: (value) => {
|
|
1832
1452
|
const normalized = {};
|
|
1833
1453
|
for (const [baseUrl, entry] of Object.entries(value)) {
|
|
1834
|
-
normalized[
|
|
1454
|
+
normalized[normalizeBaseUrl4(baseUrl)] = entry;
|
|
1835
1455
|
}
|
|
1836
1456
|
info = normalized;
|
|
1837
1457
|
void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);
|
|
@@ -1845,7 +1465,7 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1845
1465
|
// -- Disabled providers (kv) --
|
|
1846
1466
|
getDisabledProviders: () => _disabledProviders,
|
|
1847
1467
|
setDisabledProviders: (urls) => {
|
|
1848
|
-
const normalized = urls.map(
|
|
1468
|
+
const normalized = urls.map(normalizeBaseUrl4);
|
|
1849
1469
|
_disabledProviders = normalized;
|
|
1850
1470
|
void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);
|
|
1851
1471
|
},
|
|
@@ -1853,7 +1473,7 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1853
1473
|
getBaseUrlsList: () => _baseUrlsList,
|
|
1854
1474
|
getBaseUrlsLastUpdate: () => _lastBaseUrlsUpdate,
|
|
1855
1475
|
setBaseUrlsList: (urls) => {
|
|
1856
|
-
const normalized = urls.map(
|
|
1476
|
+
const normalized = urls.map(normalizeBaseUrl4);
|
|
1857
1477
|
_baseUrlsList = normalized;
|
|
1858
1478
|
void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);
|
|
1859
1479
|
},
|
|
@@ -1881,16 +1501,16 @@ var createProviderRegistryFromDiscoveryAdapter = (adapter, logger) => {
|
|
|
1881
1501
|
const log = (logger ?? consoleLogger).child("ProviderRegistry");
|
|
1882
1502
|
return {
|
|
1883
1503
|
getModelsForProvider: (baseUrl) => {
|
|
1884
|
-
const normalized =
|
|
1504
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1885
1505
|
return adapter.getCachedModels()[normalized] || [];
|
|
1886
1506
|
},
|
|
1887
1507
|
getDisabledProviders: () => adapter.getDisabledProviders(),
|
|
1888
1508
|
getProviderMints: (baseUrl) => {
|
|
1889
|
-
const normalized =
|
|
1509
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1890
1510
|
return adapter.getCachedMints()[normalized] || [];
|
|
1891
1511
|
},
|
|
1892
1512
|
getProviderInfo: async (baseUrl) => {
|
|
1893
|
-
const normalized =
|
|
1513
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1894
1514
|
const cached = adapter.getCachedProviderInfo()[normalized];
|
|
1895
1515
|
if (cached) return cached;
|
|
1896
1516
|
try {
|
|
@@ -1921,31 +1541,13 @@ var isBrowser3 = () => {
|
|
|
1921
1541
|
return false;
|
|
1922
1542
|
}
|
|
1923
1543
|
};
|
|
1924
|
-
var isNode = () => {
|
|
1925
|
-
try {
|
|
1926
|
-
return typeof process !== "undefined" && process.versions != null && process.versions.node != null;
|
|
1927
|
-
} catch {
|
|
1928
|
-
return false;
|
|
1929
|
-
}
|
|
1930
|
-
};
|
|
1931
1544
|
var defaultDriver = null;
|
|
1932
|
-
var isBun3 = () => {
|
|
1933
|
-
return typeof process.versions.bun !== "undefined";
|
|
1934
|
-
};
|
|
1935
1545
|
var getDefaultSdkDriver = () => {
|
|
1936
1546
|
if (defaultDriver) return defaultDriver;
|
|
1937
1547
|
if (isBrowser3()) {
|
|
1938
1548
|
defaultDriver = localStorageDriver;
|
|
1939
1549
|
return defaultDriver;
|
|
1940
1550
|
}
|
|
1941
|
-
if (isBun3()) {
|
|
1942
|
-
defaultDriver = createMemoryDriver();
|
|
1943
|
-
return defaultDriver;
|
|
1944
|
-
}
|
|
1945
|
-
if (isNode()) {
|
|
1946
|
-
defaultDriver = createSqliteDriver();
|
|
1947
|
-
return defaultDriver;
|
|
1948
|
-
}
|
|
1949
1551
|
defaultDriver = createMemoryDriver();
|
|
1950
1552
|
return defaultDriver;
|
|
1951
1553
|
};
|
|
@@ -1966,16 +1568,6 @@ var getDefaultUsageTrackingDriver = () => {
|
|
|
1966
1568
|
});
|
|
1967
1569
|
return defaultUsageTrackingDriver;
|
|
1968
1570
|
}
|
|
1969
|
-
if (isBun3()) {
|
|
1970
|
-
defaultUsageTrackingDriver = createBunSqliteUsageTrackingDriver();
|
|
1971
|
-
return defaultUsageTrackingDriver;
|
|
1972
|
-
}
|
|
1973
|
-
if (isNode()) {
|
|
1974
|
-
defaultUsageTrackingDriver = createSqliteUsageTrackingDriver({
|
|
1975
|
-
legacyStorageDriver: storageDriver
|
|
1976
|
-
});
|
|
1977
|
-
return defaultUsageTrackingDriver;
|
|
1978
|
-
}
|
|
1979
1571
|
defaultUsageTrackingDriver = createMemoryUsageTrackingDriver();
|
|
1980
1572
|
return defaultUsageTrackingDriver;
|
|
1981
1573
|
};
|
|
@@ -1993,8 +1585,6 @@ var getDefaultStorageAdapter = async () => createStorageAdapterFromStore(await g
|
|
|
1993
1585
|
var getDefaultProviderRegistry = async () => createProviderRegistryFromDiscoveryAdapter(await getDefaultDiscoveryAdapter());
|
|
1994
1586
|
|
|
1995
1587
|
exports.SDK_STORAGE_KEYS = SDK_STORAGE_KEYS;
|
|
1996
|
-
exports.createBunSqliteDriver = createBunSqliteDriver;
|
|
1997
|
-
exports.createBunSqliteUsageTrackingDriver = createBunSqliteUsageTrackingDriver;
|
|
1998
1588
|
exports.createDiscoveryAdapterFromStore = createDiscoveryAdapterFromStore;
|
|
1999
1589
|
exports.createIndexedDBDriver = createIndexedDBDriver;
|
|
2000
1590
|
exports.createIndexedDBUsageTrackingDriver = createIndexedDBUsageTrackingDriver;
|
|
@@ -2004,8 +1594,6 @@ exports.createProviderRegistryFromDiscoveryAdapter = createProviderRegistryFromD
|
|
|
2004
1594
|
exports.createProviderRegistryFromStore = createProviderRegistryFromStore;
|
|
2005
1595
|
exports.createSdkStore = createSdkStore;
|
|
2006
1596
|
exports.createShardedDiscoveryAdapter = createShardedDiscoveryAdapter;
|
|
2007
|
-
exports.createSqliteDriver = createSqliteDriver;
|
|
2008
|
-
exports.createSqliteUsageTrackingDriver = createSqliteUsageTrackingDriver;
|
|
2009
1597
|
exports.createStorageAdapterFromStore = createStorageAdapterFromStore;
|
|
2010
1598
|
exports.getDefaultDiscoveryAdapter = getDefaultDiscoveryAdapter;
|
|
2011
1599
|
exports.getDefaultProviderRegistry = getDefaultProviderRegistry;
|