@routstr/sdk 0.3.9 → 0.3.10
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 +6278 -0
- package/dist/browser.js.map +1 -0
- package/dist/browser.mjs +6230 -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 +6586 -0
- package/dist/bun.js.map +1 -0
- package/dist/bun.mjs +6532 -0
- package/dist/bun.mjs.map +1 -0
- package/dist/bunSqlite-BMTseLIz.d.ts +18 -0
- package/dist/bunSqlite-D6AreVE2.d.mts +18 -0
- package/dist/client/index.d.mts +63 -41
- package/dist/client/index.d.ts +63 -41
- package/dist/client/index.js +801 -1291
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +801 -1292
- 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 +28 -21
- package/dist/discovery/index.js.map +1 -1
- package/dist/discovery/index.mjs +28 -21
- package/dist/discovery/index.mjs.map +1 -1
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +1045 -1564
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1045 -1561
- 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 +6651 -0
- package/dist/node.js.map +1 -0
- package/dist/node.mjs +6599 -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 +1801 -0
- package/dist/storage/bun.js.map +1 -0
- package/dist/storage/bun.mjs +1777 -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 +139 -650
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/index.mjs +140 -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 +1864 -0
- package/dist/storage/node.js.map +1 -0
- package/dist/storage/node.mjs +1842 -0
- package/dist/storage/node.mjs.map +1 -0
- package/dist/{store-C6dfj1cc.d.mts → store-BiuM2V9N.d.mts} +14 -0
- package/dist/{store-58VcEUoA.d.ts → store-C8MZlfuz.d.ts} +14 -0
- 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 = {}) => {
|
|
@@ -386,9 +255,10 @@ var openDatabase2 = (dbName, storeName) => {
|
|
|
386
255
|
return Promise.reject(new Error("IndexedDB is not available"));
|
|
387
256
|
}
|
|
388
257
|
return new Promise((resolve, reject) => {
|
|
389
|
-
const request = indexedDB.open(dbName,
|
|
258
|
+
const request = indexedDB.open(dbName, 3);
|
|
390
259
|
request.onupgradeneeded = () => {
|
|
391
260
|
const db = request.result;
|
|
261
|
+
const tx = request.transaction;
|
|
392
262
|
if (!db.objectStoreNames.contains(storeName)) {
|
|
393
263
|
const store = db.createObjectStore(storeName, { keyPath: "id" });
|
|
394
264
|
store.createIndex("timestamp", "timestamp", { unique: false });
|
|
@@ -396,10 +266,25 @@ var openDatabase2 = (dbName, storeName) => {
|
|
|
396
266
|
store.createIndex("baseUrl", "baseUrl", { unique: false });
|
|
397
267
|
store.createIndex("sessionId", "sessionId", { unique: false });
|
|
398
268
|
store.createIndex("client", "client", { unique: false });
|
|
269
|
+
store.createIndex("provider", "provider", { unique: false });
|
|
270
|
+
} else if (tx) {
|
|
271
|
+
const store = tx.objectStore(storeName);
|
|
272
|
+
if (!store.indexNames.contains("provider")) {
|
|
273
|
+
store.createIndex("provider", "provider", { unique: false });
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
if (storeName !== "sdk_storage" && !db.objectStoreNames.contains("sdk_storage")) {
|
|
277
|
+
db.createObjectStore("sdk_storage");
|
|
399
278
|
}
|
|
400
279
|
};
|
|
401
280
|
request.onsuccess = () => resolve(request.result);
|
|
402
281
|
request.onerror = () => reject(request.error);
|
|
282
|
+
request.onblocked = () => {
|
|
283
|
+
console.warn(
|
|
284
|
+
`[usageTracking IndexedDB] open blocked for "${dbName}" \u2014 close other tabs using this DB`
|
|
285
|
+
);
|
|
286
|
+
reject(new Error(`IndexedDB "${dbName}" blocked by another connection`));
|
|
287
|
+
};
|
|
403
288
|
});
|
|
404
289
|
};
|
|
405
290
|
var matchesFilters = (entry, options = {}) => {
|
|
@@ -421,6 +306,9 @@ var matchesFilters = (entry, options = {}) => {
|
|
|
421
306
|
if (options.client && entry.client !== options.client) {
|
|
422
307
|
return false;
|
|
423
308
|
}
|
|
309
|
+
if (options.provider && entry.provider !== options.provider) {
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
424
312
|
return true;
|
|
425
313
|
};
|
|
426
314
|
var createIndexedDBUsageTrackingDriver = (options = {}) => {
|
|
@@ -552,393 +440,8 @@ var createIndexedDBUsageTrackingDriver = (options = {}) => {
|
|
|
552
440
|
};
|
|
553
441
|
};
|
|
554
442
|
|
|
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
443
|
// storage/usageTracking/memory.ts
|
|
941
|
-
var
|
|
444
|
+
var normalizeBaseUrl2 = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
942
445
|
var matchesFilters2 = (entry, options = {}) => {
|
|
943
446
|
if (typeof options.before === "number" && entry.timestamp >= options.before) {
|
|
944
447
|
return false;
|
|
@@ -949,7 +452,7 @@ var matchesFilters2 = (entry, options = {}) => {
|
|
|
949
452
|
if (options.modelId && entry.modelId !== options.modelId) {
|
|
950
453
|
return false;
|
|
951
454
|
}
|
|
952
|
-
if (options.baseUrl &&
|
|
455
|
+
if (options.baseUrl && normalizeBaseUrl2(entry.baseUrl) !== normalizeBaseUrl2(options.baseUrl)) {
|
|
953
456
|
return false;
|
|
954
457
|
}
|
|
955
458
|
if (options.sessionId && entry.sessionId !== options.sessionId) {
|
|
@@ -958,23 +461,26 @@ var matchesFilters2 = (entry, options = {}) => {
|
|
|
958
461
|
if (options.client && entry.client !== options.client) {
|
|
959
462
|
return false;
|
|
960
463
|
}
|
|
464
|
+
if (options.provider && entry.provider !== options.provider) {
|
|
465
|
+
return false;
|
|
466
|
+
}
|
|
961
467
|
return true;
|
|
962
468
|
};
|
|
963
469
|
var createMemoryUsageTrackingDriver = (seed = []) => {
|
|
964
470
|
const store = /* @__PURE__ */ new Map();
|
|
965
471
|
for (const entry of seed) {
|
|
966
|
-
store.set(entry.id, { ...entry, baseUrl:
|
|
472
|
+
store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl2(entry.baseUrl) });
|
|
967
473
|
}
|
|
968
474
|
return {
|
|
969
475
|
async migrate() {
|
|
970
476
|
return;
|
|
971
477
|
},
|
|
972
478
|
async append(entry) {
|
|
973
|
-
store.set(entry.id, { ...entry, baseUrl:
|
|
479
|
+
store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl2(entry.baseUrl) });
|
|
974
480
|
},
|
|
975
481
|
async appendMany(entries) {
|
|
976
482
|
for (const entry of entries) {
|
|
977
|
-
store.set(entry.id, { ...entry, baseUrl:
|
|
483
|
+
store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl2(entry.baseUrl) });
|
|
978
484
|
}
|
|
979
485
|
},
|
|
980
486
|
async list(options = {}) {
|
|
@@ -1002,7 +508,22 @@ var createMemoryUsageTrackingDriver = (seed = []) => {
|
|
|
1002
508
|
}
|
|
1003
509
|
};
|
|
1004
510
|
};
|
|
1005
|
-
|
|
511
|
+
|
|
512
|
+
// core/types.ts
|
|
513
|
+
function makeConsoleLogger(prefix) {
|
|
514
|
+
const fmt = (args) => prefix ? [prefix, ...args] : args;
|
|
515
|
+
return {
|
|
516
|
+
log: (...args) => console.log(...fmt(args)),
|
|
517
|
+
warn: (...args) => console.warn(...fmt(args)),
|
|
518
|
+
error: (...args) => console.error(...fmt(args)),
|
|
519
|
+
debug: (...args) => console.log(...fmt(args)),
|
|
520
|
+
child: (p) => makeConsoleLogger(prefix ? `${prefix}:${p}` : p)
|
|
521
|
+
};
|
|
522
|
+
}
|
|
523
|
+
var consoleLogger = makeConsoleLogger();
|
|
524
|
+
|
|
525
|
+
// storage/store.ts
|
|
526
|
+
var normalizeBaseUrl3 = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
1006
527
|
var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
1007
528
|
modelsFromAllProviders: {},
|
|
1008
529
|
lastUsedModel: null,
|
|
@@ -1025,7 +546,7 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1025
546
|
setModelsFromAllProviders: (value) => {
|
|
1026
547
|
const normalized = {};
|
|
1027
548
|
for (const [baseUrl, models] of Object.entries(value)) {
|
|
1028
|
-
normalized[
|
|
549
|
+
normalized[normalizeBaseUrl3(baseUrl)] = models;
|
|
1029
550
|
}
|
|
1030
551
|
void driver.setItem(
|
|
1031
552
|
SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,
|
|
@@ -1038,7 +559,7 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1038
559
|
set({ lastUsedModel: value });
|
|
1039
560
|
},
|
|
1040
561
|
setBaseUrlsList: (value) => {
|
|
1041
|
-
const normalized = value.map((url) =>
|
|
562
|
+
const normalized = value.map((url) => normalizeBaseUrl3(url));
|
|
1042
563
|
void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);
|
|
1043
564
|
set({ baseUrlsList: normalized });
|
|
1044
565
|
},
|
|
@@ -1047,14 +568,14 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1047
568
|
set({ lastBaseUrlsUpdate: value });
|
|
1048
569
|
},
|
|
1049
570
|
setDisabledProviders: (value) => {
|
|
1050
|
-
const normalized = value.map((url) =>
|
|
571
|
+
const normalized = value.map((url) => normalizeBaseUrl3(url));
|
|
1051
572
|
void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);
|
|
1052
573
|
set({ disabledProviders: normalized });
|
|
1053
574
|
},
|
|
1054
575
|
setMintsFromAllProviders: (value) => {
|
|
1055
576
|
const normalized = {};
|
|
1056
577
|
for (const [baseUrl, mints] of Object.entries(value)) {
|
|
1057
|
-
normalized[
|
|
578
|
+
normalized[normalizeBaseUrl3(baseUrl)] = mints.map(
|
|
1058
579
|
(mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint
|
|
1059
580
|
);
|
|
1060
581
|
}
|
|
@@ -1067,7 +588,7 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1067
588
|
setInfoFromAllProviders: (value) => {
|
|
1068
589
|
const normalized = {};
|
|
1069
590
|
for (const [baseUrl, info] of Object.entries(value)) {
|
|
1070
|
-
normalized[
|
|
591
|
+
normalized[normalizeBaseUrl3(baseUrl)] = info;
|
|
1071
592
|
}
|
|
1072
593
|
void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);
|
|
1073
594
|
set({ infoFromAllProviders: normalized });
|
|
@@ -1075,7 +596,7 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1075
596
|
setLastModelsUpdate: (value) => {
|
|
1076
597
|
const normalized = {};
|
|
1077
598
|
for (const [baseUrl, timestamp] of Object.entries(value)) {
|
|
1078
|
-
normalized[
|
|
599
|
+
normalized[normalizeBaseUrl3(baseUrl)] = timestamp;
|
|
1079
600
|
}
|
|
1080
601
|
void driver.setItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, normalized);
|
|
1081
602
|
set({ lastModelsUpdate: normalized });
|
|
@@ -1085,7 +606,7 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1085
606
|
const updates = typeof value === "function" ? value(state.apiKeys) : value;
|
|
1086
607
|
const normalized = updates.map((entry) => ({
|
|
1087
608
|
...entry,
|
|
1088
|
-
baseUrl:
|
|
609
|
+
baseUrl: normalizeBaseUrl3(entry.baseUrl),
|
|
1089
610
|
balance: entry.balance ?? 0,
|
|
1090
611
|
lastUsed: entry.lastUsed ?? null
|
|
1091
612
|
}));
|
|
@@ -1097,7 +618,7 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1097
618
|
set((state) => {
|
|
1098
619
|
const updates = typeof value === "function" ? value(state.childKeys) : value;
|
|
1099
620
|
const normalized = updates.map((entry) => ({
|
|
1100
|
-
parentBaseUrl:
|
|
621
|
+
parentBaseUrl: normalizeBaseUrl3(entry.parentBaseUrl),
|
|
1101
622
|
childKey: entry.childKey,
|
|
1102
623
|
balance: entry.balance ?? 0,
|
|
1103
624
|
balanceLimit: entry.balanceLimit,
|
|
@@ -1111,9 +632,9 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1111
632
|
setXcashuTokens: (value) => {
|
|
1112
633
|
const normalized = {};
|
|
1113
634
|
for (const [baseUrl, tokens] of Object.entries(value)) {
|
|
1114
|
-
normalized[
|
|
635
|
+
normalized[normalizeBaseUrl3(baseUrl)] = tokens.map((entry) => ({
|
|
1115
636
|
...entry,
|
|
1116
|
-
baseUrl:
|
|
637
|
+
baseUrl: normalizeBaseUrl3(entry.baseUrl),
|
|
1117
638
|
createdAt: entry.createdAt ?? Date.now(),
|
|
1118
639
|
tryCount: entry.tryCount ?? 0
|
|
1119
640
|
}));
|
|
@@ -1164,12 +685,12 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1164
685
|
},
|
|
1165
686
|
// ========== Failure Tracking ==========
|
|
1166
687
|
setFailedProviders: (value) => {
|
|
1167
|
-
const normalized = value.map((url) =>
|
|
688
|
+
const normalized = value.map((url) => normalizeBaseUrl3(url));
|
|
1168
689
|
void driver.setItem(SDK_STORAGE_KEYS.FAILED_PROVIDERS, normalized);
|
|
1169
690
|
set({ failedProviders: normalized });
|
|
1170
691
|
},
|
|
1171
692
|
addFailedProvider: (baseUrl) => {
|
|
1172
|
-
const normalized =
|
|
693
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1173
694
|
const current = get().failedProviders;
|
|
1174
695
|
if (!current.includes(normalized)) {
|
|
1175
696
|
const updated = [...current, normalized];
|
|
@@ -1178,7 +699,7 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1178
699
|
}
|
|
1179
700
|
},
|
|
1180
701
|
removeFailedProvider: (baseUrl) => {
|
|
1181
|
-
const normalized =
|
|
702
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1182
703
|
const current = get().failedProviders;
|
|
1183
704
|
const updated = current.filter((url) => url !== normalized);
|
|
1184
705
|
void driver.setItem(SDK_STORAGE_KEYS.FAILED_PROVIDERS, updated);
|
|
@@ -1187,13 +708,13 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1187
708
|
setLastFailed: (value) => {
|
|
1188
709
|
const normalized = {};
|
|
1189
710
|
for (const [baseUrl, timestamp] of Object.entries(value)) {
|
|
1190
|
-
normalized[
|
|
711
|
+
normalized[normalizeBaseUrl3(baseUrl)] = timestamp;
|
|
1191
712
|
}
|
|
1192
713
|
void driver.setItem(SDK_STORAGE_KEYS.LAST_FAILED, normalized);
|
|
1193
714
|
set({ lastFailed: normalized });
|
|
1194
715
|
},
|
|
1195
716
|
setLastFailedTimestamp: (baseUrl, timestamp) => {
|
|
1196
|
-
const normalized =
|
|
717
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1197
718
|
const current = get().lastFailed;
|
|
1198
719
|
const updated = { ...current, [normalized]: timestamp };
|
|
1199
720
|
void driver.setItem(SDK_STORAGE_KEYS.LAST_FAILED, updated);
|
|
@@ -1201,14 +722,14 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1201
722
|
},
|
|
1202
723
|
setProvidersOnCooldown: (value) => {
|
|
1203
724
|
const normalized = value.map((entry) => ({
|
|
1204
|
-
baseUrl:
|
|
725
|
+
baseUrl: normalizeBaseUrl3(entry.baseUrl),
|
|
1205
726
|
timestamp: entry.timestamp
|
|
1206
727
|
}));
|
|
1207
728
|
void driver.setItem(SDK_STORAGE_KEYS.PROVIDERS_ON_COOLDOWN, normalized);
|
|
1208
729
|
set({ providersOnCooldown: normalized });
|
|
1209
730
|
},
|
|
1210
731
|
addProviderOnCooldown: (baseUrl, timestamp) => {
|
|
1211
|
-
const normalized =
|
|
732
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1212
733
|
const current = get().providersOnCooldown;
|
|
1213
734
|
if (!current.some((entry) => entry.baseUrl === normalized)) {
|
|
1214
735
|
const updated = [...current, { baseUrl: normalized, timestamp }];
|
|
@@ -1217,7 +738,7 @@ var createEmptyStore = (driver) => vanilla.createStore((set, get) => ({
|
|
|
1217
738
|
}
|
|
1218
739
|
},
|
|
1219
740
|
removeProviderFromCooldown: (baseUrl) => {
|
|
1220
|
-
const normalized =
|
|
741
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1221
742
|
const current = get().providersOnCooldown;
|
|
1222
743
|
const updated = current.filter((entry) => entry.baseUrl !== normalized);
|
|
1223
744
|
void driver.setItem(SDK_STORAGE_KEYS.PROVIDERS_ON_COOLDOWN, updated);
|
|
@@ -1288,40 +809,40 @@ var hydrateStoreFromDriver = async (store, driver) => {
|
|
|
1288
809
|
]);
|
|
1289
810
|
const modelsFromAllProviders = Object.fromEntries(
|
|
1290
811
|
Object.entries(rawModels).map(([baseUrl, models]) => [
|
|
1291
|
-
|
|
812
|
+
normalizeBaseUrl3(baseUrl),
|
|
1292
813
|
models
|
|
1293
814
|
])
|
|
1294
815
|
);
|
|
1295
|
-
const baseUrlsList = rawBaseUrls.map((url) =>
|
|
816
|
+
const baseUrlsList = rawBaseUrls.map((url) => normalizeBaseUrl3(url));
|
|
1296
817
|
const disabledProviders = rawDisabledProviders.map(
|
|
1297
|
-
(url) =>
|
|
818
|
+
(url) => normalizeBaseUrl3(url)
|
|
1298
819
|
);
|
|
1299
820
|
const mintsFromAllProviders = Object.fromEntries(
|
|
1300
821
|
Object.entries(rawMints).map(([baseUrl, mints]) => [
|
|
1301
|
-
|
|
822
|
+
normalizeBaseUrl3(baseUrl),
|
|
1302
823
|
mints.map((mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint)
|
|
1303
824
|
])
|
|
1304
825
|
);
|
|
1305
826
|
const infoFromAllProviders = Object.fromEntries(
|
|
1306
827
|
Object.entries(rawInfo).map(([baseUrl, info]) => [
|
|
1307
|
-
|
|
828
|
+
normalizeBaseUrl3(baseUrl),
|
|
1308
829
|
info
|
|
1309
830
|
])
|
|
1310
831
|
);
|
|
1311
832
|
const lastModelsUpdate = Object.fromEntries(
|
|
1312
833
|
Object.entries(rawLastModelsUpdate).map(([baseUrl, timestamp]) => [
|
|
1313
|
-
|
|
834
|
+
normalizeBaseUrl3(baseUrl),
|
|
1314
835
|
timestamp
|
|
1315
836
|
])
|
|
1316
837
|
);
|
|
1317
838
|
const apiKeys = rawApiKeys.map((entry) => ({
|
|
1318
839
|
...entry,
|
|
1319
|
-
baseUrl:
|
|
840
|
+
baseUrl: normalizeBaseUrl3(entry.baseUrl),
|
|
1320
841
|
balance: entry.balance ?? 0,
|
|
1321
842
|
lastUsed: entry.lastUsed ?? null
|
|
1322
843
|
}));
|
|
1323
844
|
const childKeys = rawChildKeys.map((entry) => ({
|
|
1324
|
-
parentBaseUrl:
|
|
845
|
+
parentBaseUrl: normalizeBaseUrl3(entry.parentBaseUrl),
|
|
1325
846
|
childKey: entry.childKey,
|
|
1326
847
|
balance: entry.balance ?? 0,
|
|
1327
848
|
balanceLimit: entry.balanceLimit,
|
|
@@ -1330,9 +851,9 @@ var hydrateStoreFromDriver = async (store, driver) => {
|
|
|
1330
851
|
}));
|
|
1331
852
|
const xcashuTokens = Object.fromEntries(
|
|
1332
853
|
Object.entries(rawXcashuTokens).map(([baseUrl, tokens]) => [
|
|
1333
|
-
|
|
854
|
+
normalizeBaseUrl3(baseUrl),
|
|
1334
855
|
tokens.map((entry) => ({
|
|
1335
|
-
baseUrl:
|
|
856
|
+
baseUrl: normalizeBaseUrl3(entry.baseUrl),
|
|
1336
857
|
token: entry.token,
|
|
1337
858
|
createdAt: entry.createdAt ?? Date.now(),
|
|
1338
859
|
tryCount: entry.tryCount ?? 0
|
|
@@ -1353,16 +874,16 @@ var hydrateStoreFromDriver = async (store, driver) => {
|
|
|
1353
874
|
lastUsed: entry.lastUsed ?? null
|
|
1354
875
|
}));
|
|
1355
876
|
const failedProviders = rawFailedProviders.map(
|
|
1356
|
-
(url) =>
|
|
877
|
+
(url) => normalizeBaseUrl3(url)
|
|
1357
878
|
);
|
|
1358
879
|
const lastFailed = Object.fromEntries(
|
|
1359
880
|
Object.entries(rawLastFailed).map(([baseUrl, timestamp]) => [
|
|
1360
|
-
|
|
881
|
+
normalizeBaseUrl3(baseUrl),
|
|
1361
882
|
timestamp
|
|
1362
883
|
])
|
|
1363
884
|
);
|
|
1364
885
|
const providersOnCooldown = rawProvidersOnCooldown.map((entry) => ({
|
|
1365
|
-
baseUrl:
|
|
886
|
+
baseUrl: normalizeBaseUrl3(entry.baseUrl),
|
|
1366
887
|
timestamp: entry.timestamp
|
|
1367
888
|
}));
|
|
1368
889
|
store.setState({
|
|
@@ -1403,12 +924,12 @@ var createDiscoveryAdapterFromStore = (store) => ({
|
|
|
1403
924
|
getCachedProviderInfo: () => store.getState().infoFromAllProviders,
|
|
1404
925
|
setCachedProviderInfo: (info) => store.getState().setInfoFromAllProviders(info),
|
|
1405
926
|
getProviderLastUpdate: (baseUrl) => {
|
|
1406
|
-
const normalized =
|
|
927
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1407
928
|
const timestamps = store.getState().lastModelsUpdate;
|
|
1408
929
|
return timestamps[normalized] || null;
|
|
1409
930
|
},
|
|
1410
931
|
setProviderLastUpdate: (baseUrl, timestamp) => {
|
|
1411
|
-
const normalized =
|
|
932
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1412
933
|
const timestamps = { ...store.getState().lastModelsUpdate };
|
|
1413
934
|
timestamps[normalized] = timestamp;
|
|
1414
935
|
store.getState().setLastModelsUpdate(timestamps);
|
|
@@ -1437,24 +958,24 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1437
958
|
return Object.entries(distributionMap).map(([baseUrl, amt]) => ({ baseUrl, amount: amt })).sort((a, b) => b.amount - a.amount);
|
|
1438
959
|
},
|
|
1439
960
|
saveProviderInfo: (baseUrl, info) => {
|
|
1440
|
-
const normalized =
|
|
961
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1441
962
|
const next = { ...store.getState().infoFromAllProviders };
|
|
1442
963
|
next[normalized] = info;
|
|
1443
964
|
store.getState().setInfoFromAllProviders(next);
|
|
1444
965
|
},
|
|
1445
966
|
getProviderInfo: (baseUrl) => {
|
|
1446
|
-
const normalized =
|
|
967
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1447
968
|
return store.getState().infoFromAllProviders[normalized] || null;
|
|
1448
969
|
},
|
|
1449
970
|
// ========== API Keys (for apikeys mode) ==========
|
|
1450
971
|
getApiKey: (baseUrl) => {
|
|
1451
|
-
const normalized =
|
|
972
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1452
973
|
const entry = store.getState().apiKeys.find((key) => key.baseUrl === normalized);
|
|
1453
974
|
if (!entry) return null;
|
|
1454
975
|
return entry;
|
|
1455
976
|
},
|
|
1456
977
|
setApiKey: (baseUrl, key) => {
|
|
1457
|
-
const normalized =
|
|
978
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1458
979
|
const keys = store.getState().apiKeys;
|
|
1459
980
|
const existingIndex = keys.findIndex(
|
|
1460
981
|
(entry) => entry.baseUrl === normalized
|
|
@@ -1472,7 +993,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1472
993
|
store.getState().setApiKeys(next);
|
|
1473
994
|
},
|
|
1474
995
|
updateApiKeyBalance: (baseUrl, balance) => {
|
|
1475
|
-
const normalized =
|
|
996
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1476
997
|
const keys = store.getState().apiKeys;
|
|
1477
998
|
const next = keys.map(
|
|
1478
999
|
(entry) => entry.baseUrl === normalized ? { ...entry, balance, lastUsed: Date.now() } : entry
|
|
@@ -1480,7 +1001,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1480
1001
|
store.getState().setApiKeys(next);
|
|
1481
1002
|
},
|
|
1482
1003
|
removeApiKey: (baseUrl) => {
|
|
1483
|
-
const normalized =
|
|
1004
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1484
1005
|
const next = store.getState().apiKeys.filter((entry) => entry.baseUrl !== normalized);
|
|
1485
1006
|
store.getState().setApiKeys(next);
|
|
1486
1007
|
},
|
|
@@ -1494,7 +1015,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1494
1015
|
},
|
|
1495
1016
|
// ========== Child Keys ==========
|
|
1496
1017
|
getChildKey: (parentBaseUrl) => {
|
|
1497
|
-
const normalized =
|
|
1018
|
+
const normalized = normalizeBaseUrl3(parentBaseUrl);
|
|
1498
1019
|
const entry = store.getState().childKeys.find((key) => key.parentBaseUrl === normalized);
|
|
1499
1020
|
if (!entry) return null;
|
|
1500
1021
|
return {
|
|
@@ -1507,7 +1028,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1507
1028
|
};
|
|
1508
1029
|
},
|
|
1509
1030
|
setChildKey: (parentBaseUrl, childKey, balance, validityDate, balanceLimit) => {
|
|
1510
|
-
const normalized =
|
|
1031
|
+
const normalized = normalizeBaseUrl3(parentBaseUrl);
|
|
1511
1032
|
const keys = store.getState().childKeys;
|
|
1512
1033
|
const existingIndex = keys.findIndex(
|
|
1513
1034
|
(entry) => entry.parentBaseUrl === normalized
|
|
@@ -1538,7 +1059,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1538
1059
|
}
|
|
1539
1060
|
},
|
|
1540
1061
|
updateChildKeyBalance: (parentBaseUrl, balance) => {
|
|
1541
|
-
const normalized =
|
|
1062
|
+
const normalized = normalizeBaseUrl3(parentBaseUrl);
|
|
1542
1063
|
const keys = store.getState().childKeys;
|
|
1543
1064
|
const next = keys.map(
|
|
1544
1065
|
(entry) => entry.parentBaseUrl === normalized ? { ...entry, balance } : entry
|
|
@@ -1546,7 +1067,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1546
1067
|
store.getState().setChildKeys(next);
|
|
1547
1068
|
},
|
|
1548
1069
|
removeChildKey: (parentBaseUrl) => {
|
|
1549
|
-
const normalized =
|
|
1070
|
+
const normalized = normalizeBaseUrl3(parentBaseUrl);
|
|
1550
1071
|
const next = store.getState().childKeys.filter((entry) => entry.parentBaseUrl !== normalized);
|
|
1551
1072
|
store.getState().setChildKeys(next);
|
|
1552
1073
|
},
|
|
@@ -1571,11 +1092,11 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1571
1092
|
return store.getState().xcashuTokens;
|
|
1572
1093
|
},
|
|
1573
1094
|
getXcashuTokensForBaseUrl: (baseUrl) => {
|
|
1574
|
-
const normalized =
|
|
1095
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1575
1096
|
return store.getState().xcashuTokens[normalized] || [];
|
|
1576
1097
|
},
|
|
1577
1098
|
addXcashuToken: (baseUrl, token) => {
|
|
1578
|
-
const normalized =
|
|
1099
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1579
1100
|
const tokens = store.getState().xcashuTokens;
|
|
1580
1101
|
const existing = tokens[normalized] || [];
|
|
1581
1102
|
const next = { ...tokens };
|
|
@@ -1586,7 +1107,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1586
1107
|
store.getState().setXcashuTokens(next);
|
|
1587
1108
|
},
|
|
1588
1109
|
removeXcashuToken: (baseUrl, token) => {
|
|
1589
|
-
const normalized =
|
|
1110
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1590
1111
|
const tokens = store.getState().xcashuTokens;
|
|
1591
1112
|
const existing = tokens[normalized] || [];
|
|
1592
1113
|
const next = { ...tokens };
|
|
@@ -1597,7 +1118,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1597
1118
|
store.getState().setXcashuTokens(next);
|
|
1598
1119
|
},
|
|
1599
1120
|
clearXcashuTokensForBaseUrl: (baseUrl) => {
|
|
1600
|
-
const normalized =
|
|
1121
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1601
1122
|
const tokens = store.getState().xcashuTokens;
|
|
1602
1123
|
const next = { ...tokens };
|
|
1603
1124
|
delete next[normalized];
|
|
@@ -1611,16 +1132,16 @@ var createProviderRegistryFromStore = (store, logger) => {
|
|
|
1611
1132
|
const log = (logger ?? consoleLogger).child("ProviderRegistry");
|
|
1612
1133
|
return {
|
|
1613
1134
|
getModelsForProvider: (baseUrl) => {
|
|
1614
|
-
const normalized =
|
|
1135
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1615
1136
|
return store.getState().modelsFromAllProviders[normalized] || [];
|
|
1616
1137
|
},
|
|
1617
1138
|
getDisabledProviders: () => store.getState().disabledProviders,
|
|
1618
1139
|
getProviderMints: (baseUrl) => {
|
|
1619
|
-
const normalized =
|
|
1140
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1620
1141
|
return store.getState().mintsFromAllProviders[normalized] || [];
|
|
1621
1142
|
},
|
|
1622
1143
|
getProviderInfo: async (baseUrl) => {
|
|
1623
|
-
const normalized =
|
|
1144
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1624
1145
|
const cached = store.getState().infoFromAllProviders[normalized];
|
|
1625
1146
|
if (cached) return cached;
|
|
1626
1147
|
try {
|
|
@@ -1646,11 +1167,11 @@ var createProviderRegistryFromStore = (store, logger) => {
|
|
|
1646
1167
|
var MODEL_KEY_PREFIX = "models:provider:";
|
|
1647
1168
|
var MODEL_TS_KEY_PREFIX = "models:provider_timestamp:";
|
|
1648
1169
|
var PROVIDER_INDEX_KEY = "models:provider_index";
|
|
1649
|
-
var
|
|
1170
|
+
var MIGRATION_MARKER_KEY2 = "models_sharded_migration_v1";
|
|
1650
1171
|
var encodeBaseUrl = (baseUrl) => encodeURIComponent(baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`);
|
|
1651
1172
|
var modelKey = (baseUrl) => `${MODEL_KEY_PREFIX}${encodeBaseUrl(baseUrl)}`;
|
|
1652
1173
|
var modelTsKey = (baseUrl) => `${MODEL_TS_KEY_PREFIX}${encodeBaseUrl(baseUrl)}`;
|
|
1653
|
-
var
|
|
1174
|
+
var normalizeBaseUrl4 = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
1654
1175
|
var createShardedDiscoveryAdapter = async (options) => {
|
|
1655
1176
|
const { driver } = options;
|
|
1656
1177
|
const legacyModels = await driver.getItem(SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS, {});
|
|
@@ -1658,7 +1179,7 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1658
1179
|
if (Object.keys(legacyModels).length > 0) {
|
|
1659
1180
|
const migratedProviders = [];
|
|
1660
1181
|
for (const [baseUrl, models] of Object.entries(legacyModels)) {
|
|
1661
|
-
const normalized =
|
|
1182
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1662
1183
|
await driver.setItem(modelKey(normalized), models);
|
|
1663
1184
|
const ts = legacyTimestamps[normalized] ?? Date.now();
|
|
1664
1185
|
await driver.setItem(modelTsKey(normalized), ts);
|
|
@@ -1673,7 +1194,7 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1673
1194
|
await driver.removeItem(SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS);
|
|
1674
1195
|
await driver.removeItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE);
|
|
1675
1196
|
}
|
|
1676
|
-
await driver.setItem(
|
|
1197
|
+
await driver.setItem(MIGRATION_MARKER_KEY2, true);
|
|
1677
1198
|
const [
|
|
1678
1199
|
rawMints,
|
|
1679
1200
|
rawInfo,
|
|
@@ -1707,31 +1228,31 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1707
1228
|
const providerIndex = /* @__PURE__ */ new Set();
|
|
1708
1229
|
const knownProviders = /* @__PURE__ */ new Set();
|
|
1709
1230
|
for (const baseUrl of Object.keys(rawInfo)) {
|
|
1710
|
-
knownProviders.add(
|
|
1231
|
+
knownProviders.add(normalizeBaseUrl4(baseUrl));
|
|
1711
1232
|
}
|
|
1712
1233
|
for (const baseUrl of Object.keys(rawMints)) {
|
|
1713
|
-
knownProviders.add(
|
|
1234
|
+
knownProviders.add(normalizeBaseUrl4(baseUrl));
|
|
1714
1235
|
}
|
|
1715
1236
|
for (const baseUrl of rawBaseUrls) {
|
|
1716
|
-
knownProviders.add(
|
|
1237
|
+
knownProviders.add(normalizeBaseUrl4(baseUrl));
|
|
1717
1238
|
}
|
|
1718
1239
|
for (const baseUrl of rawDisabled) {
|
|
1719
|
-
knownProviders.add(
|
|
1240
|
+
knownProviders.add(normalizeBaseUrl4(baseUrl));
|
|
1720
1241
|
}
|
|
1721
1242
|
for (const baseUrl of Object.keys(legacyModels)) {
|
|
1722
|
-
knownProviders.add(
|
|
1243
|
+
knownProviders.add(normalizeBaseUrl4(baseUrl));
|
|
1723
1244
|
}
|
|
1724
1245
|
const indexProviders = await driver.getItem(
|
|
1725
1246
|
PROVIDER_INDEX_KEY,
|
|
1726
1247
|
[]
|
|
1727
1248
|
);
|
|
1728
1249
|
for (const baseUrl of indexProviders) {
|
|
1729
|
-
const normalized =
|
|
1250
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1730
1251
|
providerIndex.add(normalized);
|
|
1731
1252
|
knownProviders.add(normalized);
|
|
1732
1253
|
}
|
|
1733
1254
|
for (const baseUrl of knownProviders) {
|
|
1734
|
-
const normalized =
|
|
1255
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1735
1256
|
const models = await driver.getItem(
|
|
1736
1257
|
modelKey(normalized),
|
|
1737
1258
|
null
|
|
@@ -1752,19 +1273,19 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1752
1273
|
}
|
|
1753
1274
|
let mints = Object.fromEntries(
|
|
1754
1275
|
Object.entries(rawMints).map(([baseUrl, mintList]) => [
|
|
1755
|
-
|
|
1276
|
+
normalizeBaseUrl4(baseUrl),
|
|
1756
1277
|
mintList.map((mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint)
|
|
1757
1278
|
])
|
|
1758
1279
|
);
|
|
1759
1280
|
let info = Object.fromEntries(
|
|
1760
1281
|
Object.entries(rawInfo).map(([baseUrl, entry]) => [
|
|
1761
|
-
|
|
1282
|
+
normalizeBaseUrl4(baseUrl),
|
|
1762
1283
|
entry
|
|
1763
1284
|
])
|
|
1764
1285
|
);
|
|
1765
1286
|
let _lastUsedModel = lastUsedModel;
|
|
1766
|
-
let _disabledProviders = rawDisabled.map(
|
|
1767
|
-
let _baseUrlsList = rawBaseUrls.map(
|
|
1287
|
+
let _disabledProviders = rawDisabled.map(normalizeBaseUrl4);
|
|
1288
|
+
let _baseUrlsList = rawBaseUrls.map(normalizeBaseUrl4);
|
|
1768
1289
|
let _lastBaseUrlsUpdate = lastBaseUrlsUpdate;
|
|
1769
1290
|
let _routstr21Models = rawRoutstr21Models;
|
|
1770
1291
|
let _lastRoutstr21ModelsUpdate = lastRoutstr21ModelsUpdate;
|
|
@@ -1782,10 +1303,10 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1782
1303
|
},
|
|
1783
1304
|
setCachedModels: (models) => {
|
|
1784
1305
|
const nextKeys = new Set(
|
|
1785
|
-
Object.keys(models).map((baseUrl) =>
|
|
1306
|
+
Object.keys(models).map((baseUrl) => normalizeBaseUrl4(baseUrl))
|
|
1786
1307
|
);
|
|
1787
1308
|
for (const baseUrl of [...modelsByBaseUrl.keys()]) {
|
|
1788
|
-
if (!nextKeys.has(
|
|
1309
|
+
if (!nextKeys.has(normalizeBaseUrl4(baseUrl))) {
|
|
1789
1310
|
providerIndex.delete(baseUrl);
|
|
1790
1311
|
modelsByBaseUrl.delete(baseUrl);
|
|
1791
1312
|
timestampsByBaseUrl.delete(baseUrl);
|
|
@@ -1794,7 +1315,7 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1794
1315
|
}
|
|
1795
1316
|
}
|
|
1796
1317
|
for (const [baseUrl, modelList] of Object.entries(models)) {
|
|
1797
|
-
const normalized =
|
|
1318
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1798
1319
|
providerIndex.add(normalized);
|
|
1799
1320
|
modelsByBaseUrl.set(normalized, modelList);
|
|
1800
1321
|
const ts = timestampsByBaseUrl.get(normalized) ?? Date.now();
|
|
@@ -1805,10 +1326,10 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1805
1326
|
persistProviderIndex();
|
|
1806
1327
|
},
|
|
1807
1328
|
getProviderLastUpdate: (baseUrl) => {
|
|
1808
|
-
return timestampsByBaseUrl.get(
|
|
1329
|
+
return timestampsByBaseUrl.get(normalizeBaseUrl4(baseUrl)) ?? null;
|
|
1809
1330
|
},
|
|
1810
1331
|
setProviderLastUpdate: (baseUrl, timestamp) => {
|
|
1811
|
-
const normalized =
|
|
1332
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1812
1333
|
providerIndex.add(normalized);
|
|
1813
1334
|
timestampsByBaseUrl.set(normalized, timestamp);
|
|
1814
1335
|
void driver.setItem(modelTsKey(normalized), timestamp);
|
|
@@ -1819,7 +1340,7 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1819
1340
|
setCachedMints: (value) => {
|
|
1820
1341
|
const normalized = {};
|
|
1821
1342
|
for (const [baseUrl, mintList] of Object.entries(value)) {
|
|
1822
|
-
normalized[
|
|
1343
|
+
normalized[normalizeBaseUrl4(baseUrl)] = mintList.map(
|
|
1823
1344
|
(mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint
|
|
1824
1345
|
);
|
|
1825
1346
|
}
|
|
@@ -1831,7 +1352,7 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1831
1352
|
setCachedProviderInfo: (value) => {
|
|
1832
1353
|
const normalized = {};
|
|
1833
1354
|
for (const [baseUrl, entry] of Object.entries(value)) {
|
|
1834
|
-
normalized[
|
|
1355
|
+
normalized[normalizeBaseUrl4(baseUrl)] = entry;
|
|
1835
1356
|
}
|
|
1836
1357
|
info = normalized;
|
|
1837
1358
|
void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);
|
|
@@ -1845,7 +1366,7 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1845
1366
|
// -- Disabled providers (kv) --
|
|
1846
1367
|
getDisabledProviders: () => _disabledProviders,
|
|
1847
1368
|
setDisabledProviders: (urls) => {
|
|
1848
|
-
const normalized = urls.map(
|
|
1369
|
+
const normalized = urls.map(normalizeBaseUrl4);
|
|
1849
1370
|
_disabledProviders = normalized;
|
|
1850
1371
|
void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);
|
|
1851
1372
|
},
|
|
@@ -1853,7 +1374,7 @@ var createShardedDiscoveryAdapter = async (options) => {
|
|
|
1853
1374
|
getBaseUrlsList: () => _baseUrlsList,
|
|
1854
1375
|
getBaseUrlsLastUpdate: () => _lastBaseUrlsUpdate,
|
|
1855
1376
|
setBaseUrlsList: (urls) => {
|
|
1856
|
-
const normalized = urls.map(
|
|
1377
|
+
const normalized = urls.map(normalizeBaseUrl4);
|
|
1857
1378
|
_baseUrlsList = normalized;
|
|
1858
1379
|
void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);
|
|
1859
1380
|
},
|
|
@@ -1881,16 +1402,16 @@ var createProviderRegistryFromDiscoveryAdapter = (adapter, logger) => {
|
|
|
1881
1402
|
const log = (logger ?? consoleLogger).child("ProviderRegistry");
|
|
1882
1403
|
return {
|
|
1883
1404
|
getModelsForProvider: (baseUrl) => {
|
|
1884
|
-
const normalized =
|
|
1405
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1885
1406
|
return adapter.getCachedModels()[normalized] || [];
|
|
1886
1407
|
},
|
|
1887
1408
|
getDisabledProviders: () => adapter.getDisabledProviders(),
|
|
1888
1409
|
getProviderMints: (baseUrl) => {
|
|
1889
|
-
const normalized =
|
|
1410
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1890
1411
|
return adapter.getCachedMints()[normalized] || [];
|
|
1891
1412
|
},
|
|
1892
1413
|
getProviderInfo: async (baseUrl) => {
|
|
1893
|
-
const normalized =
|
|
1414
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1894
1415
|
const cached = adapter.getCachedProviderInfo()[normalized];
|
|
1895
1416
|
if (cached) return cached;
|
|
1896
1417
|
try {
|
|
@@ -1921,31 +1442,13 @@ var isBrowser3 = () => {
|
|
|
1921
1442
|
return false;
|
|
1922
1443
|
}
|
|
1923
1444
|
};
|
|
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
1445
|
var defaultDriver = null;
|
|
1932
|
-
var isBun3 = () => {
|
|
1933
|
-
return typeof process.versions.bun !== "undefined";
|
|
1934
|
-
};
|
|
1935
1446
|
var getDefaultSdkDriver = () => {
|
|
1936
1447
|
if (defaultDriver) return defaultDriver;
|
|
1937
1448
|
if (isBrowser3()) {
|
|
1938
1449
|
defaultDriver = localStorageDriver;
|
|
1939
1450
|
return defaultDriver;
|
|
1940
1451
|
}
|
|
1941
|
-
if (isBun3()) {
|
|
1942
|
-
defaultDriver = createMemoryDriver();
|
|
1943
|
-
return defaultDriver;
|
|
1944
|
-
}
|
|
1945
|
-
if (isNode()) {
|
|
1946
|
-
defaultDriver = createSqliteDriver();
|
|
1947
|
-
return defaultDriver;
|
|
1948
|
-
}
|
|
1949
1452
|
defaultDriver = createMemoryDriver();
|
|
1950
1453
|
return defaultDriver;
|
|
1951
1454
|
};
|
|
@@ -1966,16 +1469,6 @@ var getDefaultUsageTrackingDriver = () => {
|
|
|
1966
1469
|
});
|
|
1967
1470
|
return defaultUsageTrackingDriver;
|
|
1968
1471
|
}
|
|
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
1472
|
defaultUsageTrackingDriver = createMemoryUsageTrackingDriver();
|
|
1980
1473
|
return defaultUsageTrackingDriver;
|
|
1981
1474
|
};
|
|
@@ -1993,8 +1486,6 @@ var getDefaultStorageAdapter = async () => createStorageAdapterFromStore(await g
|
|
|
1993
1486
|
var getDefaultProviderRegistry = async () => createProviderRegistryFromDiscoveryAdapter(await getDefaultDiscoveryAdapter());
|
|
1994
1487
|
|
|
1995
1488
|
exports.SDK_STORAGE_KEYS = SDK_STORAGE_KEYS;
|
|
1996
|
-
exports.createBunSqliteDriver = createBunSqliteDriver;
|
|
1997
|
-
exports.createBunSqliteUsageTrackingDriver = createBunSqliteUsageTrackingDriver;
|
|
1998
1489
|
exports.createDiscoveryAdapterFromStore = createDiscoveryAdapterFromStore;
|
|
1999
1490
|
exports.createIndexedDBDriver = createIndexedDBDriver;
|
|
2000
1491
|
exports.createIndexedDBUsageTrackingDriver = createIndexedDBUsageTrackingDriver;
|
|
@@ -2004,8 +1495,6 @@ exports.createProviderRegistryFromDiscoveryAdapter = createProviderRegistryFromD
|
|
|
2004
1495
|
exports.createProviderRegistryFromStore = createProviderRegistryFromStore;
|
|
2005
1496
|
exports.createSdkStore = createSdkStore;
|
|
2006
1497
|
exports.createShardedDiscoveryAdapter = createShardedDiscoveryAdapter;
|
|
2007
|
-
exports.createSqliteDriver = createSqliteDriver;
|
|
2008
|
-
exports.createSqliteUsageTrackingDriver = createSqliteUsageTrackingDriver;
|
|
2009
1498
|
exports.createStorageAdapterFromStore = createStorageAdapterFromStore;
|
|
2010
1499
|
exports.getDefaultDiscoveryAdapter = getDefaultDiscoveryAdapter;
|
|
2011
1500
|
exports.getDefaultProviderRegistry = getDefaultProviderRegistry;
|