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