@routstr/sdk 0.3.8 → 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 +1223 -1658
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +1223 -1659
- package/dist/client/index.mjs.map +1 -1
- package/dist/discovery/index.d.mts +67 -3
- package/dist/discovery/index.d.ts +67 -3
- package/dist/discovery/index.js +242 -79
- package/dist/discovery/index.js.map +1 -1
- package/dist/discovery/index.mjs +242 -79
- package/dist/discovery/index.mjs.map +1 -1
- package/dist/index.d.mts +5 -4
- package/dist/index.d.ts +5 -4
- package/dist/index.js +1975 -2004
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1973 -2001
- 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 +30 -30
- package/dist/storage/index.d.ts +30 -30
- package/dist/storage/index.js +393 -625
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/index.mjs +392 -622
- 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/dist/wallet/index.d.mts +4 -0
- package/dist/wallet/index.d.ts +4 -0
- package/dist/wallet/index.js +11 -4
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/index.mjs +11 -4
- package/dist/wallet/index.mjs.map +1 -1
- package/package.json +28 -2
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 = {}) => {
|
|
@@ -384,9 +253,10 @@ var openDatabase2 = (dbName, storeName) => {
|
|
|
384
253
|
return Promise.reject(new Error("IndexedDB is not available"));
|
|
385
254
|
}
|
|
386
255
|
return new Promise((resolve, reject) => {
|
|
387
|
-
const request = indexedDB.open(dbName,
|
|
256
|
+
const request = indexedDB.open(dbName, 3);
|
|
388
257
|
request.onupgradeneeded = () => {
|
|
389
258
|
const db = request.result;
|
|
259
|
+
const tx = request.transaction;
|
|
390
260
|
if (!db.objectStoreNames.contains(storeName)) {
|
|
391
261
|
const store = db.createObjectStore(storeName, { keyPath: "id" });
|
|
392
262
|
store.createIndex("timestamp", "timestamp", { unique: false });
|
|
@@ -394,10 +264,25 @@ var openDatabase2 = (dbName, storeName) => {
|
|
|
394
264
|
store.createIndex("baseUrl", "baseUrl", { unique: false });
|
|
395
265
|
store.createIndex("sessionId", "sessionId", { unique: false });
|
|
396
266
|
store.createIndex("client", "client", { unique: false });
|
|
267
|
+
store.createIndex("provider", "provider", { unique: false });
|
|
268
|
+
} else if (tx) {
|
|
269
|
+
const store = tx.objectStore(storeName);
|
|
270
|
+
if (!store.indexNames.contains("provider")) {
|
|
271
|
+
store.createIndex("provider", "provider", { unique: false });
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
if (storeName !== "sdk_storage" && !db.objectStoreNames.contains("sdk_storage")) {
|
|
275
|
+
db.createObjectStore("sdk_storage");
|
|
397
276
|
}
|
|
398
277
|
};
|
|
399
278
|
request.onsuccess = () => resolve(request.result);
|
|
400
279
|
request.onerror = () => reject(request.error);
|
|
280
|
+
request.onblocked = () => {
|
|
281
|
+
console.warn(
|
|
282
|
+
`[usageTracking IndexedDB] open blocked for "${dbName}" \u2014 close other tabs using this DB`
|
|
283
|
+
);
|
|
284
|
+
reject(new Error(`IndexedDB "${dbName}" blocked by another connection`));
|
|
285
|
+
};
|
|
401
286
|
});
|
|
402
287
|
};
|
|
403
288
|
var matchesFilters = (entry, options = {}) => {
|
|
@@ -419,6 +304,9 @@ var matchesFilters = (entry, options = {}) => {
|
|
|
419
304
|
if (options.client && entry.client !== options.client) {
|
|
420
305
|
return false;
|
|
421
306
|
}
|
|
307
|
+
if (options.provider && entry.provider !== options.provider) {
|
|
308
|
+
return false;
|
|
309
|
+
}
|
|
422
310
|
return true;
|
|
423
311
|
};
|
|
424
312
|
var createIndexedDBUsageTrackingDriver = (options = {}) => {
|
|
@@ -550,393 +438,8 @@ var createIndexedDBUsageTrackingDriver = (options = {}) => {
|
|
|
550
438
|
};
|
|
551
439
|
};
|
|
552
440
|
|
|
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
441
|
// storage/usageTracking/memory.ts
|
|
939
|
-
var
|
|
442
|
+
var normalizeBaseUrl2 = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
940
443
|
var matchesFilters2 = (entry, options = {}) => {
|
|
941
444
|
if (typeof options.before === "number" && entry.timestamp >= options.before) {
|
|
942
445
|
return false;
|
|
@@ -947,7 +450,7 @@ var matchesFilters2 = (entry, options = {}) => {
|
|
|
947
450
|
if (options.modelId && entry.modelId !== options.modelId) {
|
|
948
451
|
return false;
|
|
949
452
|
}
|
|
950
|
-
if (options.baseUrl &&
|
|
453
|
+
if (options.baseUrl && normalizeBaseUrl2(entry.baseUrl) !== normalizeBaseUrl2(options.baseUrl)) {
|
|
951
454
|
return false;
|
|
952
455
|
}
|
|
953
456
|
if (options.sessionId && entry.sessionId !== options.sessionId) {
|
|
@@ -956,23 +459,26 @@ var matchesFilters2 = (entry, options = {}) => {
|
|
|
956
459
|
if (options.client && entry.client !== options.client) {
|
|
957
460
|
return false;
|
|
958
461
|
}
|
|
462
|
+
if (options.provider && entry.provider !== options.provider) {
|
|
463
|
+
return false;
|
|
464
|
+
}
|
|
959
465
|
return true;
|
|
960
466
|
};
|
|
961
467
|
var createMemoryUsageTrackingDriver = (seed = []) => {
|
|
962
468
|
const store = /* @__PURE__ */ new Map();
|
|
963
469
|
for (const entry of seed) {
|
|
964
|
-
store.set(entry.id, { ...entry, baseUrl:
|
|
470
|
+
store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl2(entry.baseUrl) });
|
|
965
471
|
}
|
|
966
472
|
return {
|
|
967
473
|
async migrate() {
|
|
968
474
|
return;
|
|
969
475
|
},
|
|
970
476
|
async append(entry) {
|
|
971
|
-
store.set(entry.id, { ...entry, baseUrl:
|
|
477
|
+
store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl2(entry.baseUrl) });
|
|
972
478
|
},
|
|
973
479
|
async appendMany(entries) {
|
|
974
480
|
for (const entry of entries) {
|
|
975
|
-
store.set(entry.id, { ...entry, baseUrl:
|
|
481
|
+
store.set(entry.id, { ...entry, baseUrl: normalizeBaseUrl2(entry.baseUrl) });
|
|
976
482
|
}
|
|
977
483
|
},
|
|
978
484
|
async list(options = {}) {
|
|
@@ -1000,7 +506,22 @@ var createMemoryUsageTrackingDriver = (seed = []) => {
|
|
|
1000
506
|
}
|
|
1001
507
|
};
|
|
1002
508
|
};
|
|
1003
|
-
|
|
509
|
+
|
|
510
|
+
// core/types.ts
|
|
511
|
+
function makeConsoleLogger(prefix) {
|
|
512
|
+
const fmt = (args) => prefix ? [prefix, ...args] : args;
|
|
513
|
+
return {
|
|
514
|
+
log: (...args) => console.log(...fmt(args)),
|
|
515
|
+
warn: (...args) => console.warn(...fmt(args)),
|
|
516
|
+
error: (...args) => console.error(...fmt(args)),
|
|
517
|
+
debug: (...args) => console.log(...fmt(args)),
|
|
518
|
+
child: (p) => makeConsoleLogger(prefix ? `${prefix}:${p}` : p)
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
var consoleLogger = makeConsoleLogger();
|
|
522
|
+
|
|
523
|
+
// storage/store.ts
|
|
524
|
+
var normalizeBaseUrl3 = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
1004
525
|
var createEmptyStore = (driver) => createStore((set, get) => ({
|
|
1005
526
|
modelsFromAllProviders: {},
|
|
1006
527
|
lastUsedModel: null,
|
|
@@ -1023,7 +544,7 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
|
|
|
1023
544
|
setModelsFromAllProviders: (value) => {
|
|
1024
545
|
const normalized = {};
|
|
1025
546
|
for (const [baseUrl, models] of Object.entries(value)) {
|
|
1026
|
-
normalized[
|
|
547
|
+
normalized[normalizeBaseUrl3(baseUrl)] = models;
|
|
1027
548
|
}
|
|
1028
549
|
void driver.setItem(
|
|
1029
550
|
SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS,
|
|
@@ -1036,7 +557,7 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
|
|
|
1036
557
|
set({ lastUsedModel: value });
|
|
1037
558
|
},
|
|
1038
559
|
setBaseUrlsList: (value) => {
|
|
1039
|
-
const normalized = value.map((url) =>
|
|
560
|
+
const normalized = value.map((url) => normalizeBaseUrl3(url));
|
|
1040
561
|
void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);
|
|
1041
562
|
set({ baseUrlsList: normalized });
|
|
1042
563
|
},
|
|
@@ -1045,14 +566,14 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
|
|
|
1045
566
|
set({ lastBaseUrlsUpdate: value });
|
|
1046
567
|
},
|
|
1047
568
|
setDisabledProviders: (value) => {
|
|
1048
|
-
const normalized = value.map((url) =>
|
|
569
|
+
const normalized = value.map((url) => normalizeBaseUrl3(url));
|
|
1049
570
|
void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);
|
|
1050
571
|
set({ disabledProviders: normalized });
|
|
1051
572
|
},
|
|
1052
573
|
setMintsFromAllProviders: (value) => {
|
|
1053
574
|
const normalized = {};
|
|
1054
575
|
for (const [baseUrl, mints] of Object.entries(value)) {
|
|
1055
|
-
normalized[
|
|
576
|
+
normalized[normalizeBaseUrl3(baseUrl)] = mints.map(
|
|
1056
577
|
(mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint
|
|
1057
578
|
);
|
|
1058
579
|
}
|
|
@@ -1065,7 +586,7 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
|
|
|
1065
586
|
setInfoFromAllProviders: (value) => {
|
|
1066
587
|
const normalized = {};
|
|
1067
588
|
for (const [baseUrl, info] of Object.entries(value)) {
|
|
1068
|
-
normalized[
|
|
589
|
+
normalized[normalizeBaseUrl3(baseUrl)] = info;
|
|
1069
590
|
}
|
|
1070
591
|
void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);
|
|
1071
592
|
set({ infoFromAllProviders: normalized });
|
|
@@ -1073,7 +594,7 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
|
|
|
1073
594
|
setLastModelsUpdate: (value) => {
|
|
1074
595
|
const normalized = {};
|
|
1075
596
|
for (const [baseUrl, timestamp] of Object.entries(value)) {
|
|
1076
|
-
normalized[
|
|
597
|
+
normalized[normalizeBaseUrl3(baseUrl)] = timestamp;
|
|
1077
598
|
}
|
|
1078
599
|
void driver.setItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, normalized);
|
|
1079
600
|
set({ lastModelsUpdate: normalized });
|
|
@@ -1083,7 +604,7 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
|
|
|
1083
604
|
const updates = typeof value === "function" ? value(state.apiKeys) : value;
|
|
1084
605
|
const normalized = updates.map((entry) => ({
|
|
1085
606
|
...entry,
|
|
1086
|
-
baseUrl:
|
|
607
|
+
baseUrl: normalizeBaseUrl3(entry.baseUrl),
|
|
1087
608
|
balance: entry.balance ?? 0,
|
|
1088
609
|
lastUsed: entry.lastUsed ?? null
|
|
1089
610
|
}));
|
|
@@ -1095,7 +616,7 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
|
|
|
1095
616
|
set((state) => {
|
|
1096
617
|
const updates = typeof value === "function" ? value(state.childKeys) : value;
|
|
1097
618
|
const normalized = updates.map((entry) => ({
|
|
1098
|
-
parentBaseUrl:
|
|
619
|
+
parentBaseUrl: normalizeBaseUrl3(entry.parentBaseUrl),
|
|
1099
620
|
childKey: entry.childKey,
|
|
1100
621
|
balance: entry.balance ?? 0,
|
|
1101
622
|
balanceLimit: entry.balanceLimit,
|
|
@@ -1109,9 +630,9 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
|
|
|
1109
630
|
setXcashuTokens: (value) => {
|
|
1110
631
|
const normalized = {};
|
|
1111
632
|
for (const [baseUrl, tokens] of Object.entries(value)) {
|
|
1112
|
-
normalized[
|
|
633
|
+
normalized[normalizeBaseUrl3(baseUrl)] = tokens.map((entry) => ({
|
|
1113
634
|
...entry,
|
|
1114
|
-
baseUrl:
|
|
635
|
+
baseUrl: normalizeBaseUrl3(entry.baseUrl),
|
|
1115
636
|
createdAt: entry.createdAt ?? Date.now(),
|
|
1116
637
|
tryCount: entry.tryCount ?? 0
|
|
1117
638
|
}));
|
|
@@ -1162,12 +683,12 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
|
|
|
1162
683
|
},
|
|
1163
684
|
// ========== Failure Tracking ==========
|
|
1164
685
|
setFailedProviders: (value) => {
|
|
1165
|
-
const normalized = value.map((url) =>
|
|
686
|
+
const normalized = value.map((url) => normalizeBaseUrl3(url));
|
|
1166
687
|
void driver.setItem(SDK_STORAGE_KEYS.FAILED_PROVIDERS, normalized);
|
|
1167
688
|
set({ failedProviders: normalized });
|
|
1168
689
|
},
|
|
1169
690
|
addFailedProvider: (baseUrl) => {
|
|
1170
|
-
const normalized =
|
|
691
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1171
692
|
const current = get().failedProviders;
|
|
1172
693
|
if (!current.includes(normalized)) {
|
|
1173
694
|
const updated = [...current, normalized];
|
|
@@ -1176,7 +697,7 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
|
|
|
1176
697
|
}
|
|
1177
698
|
},
|
|
1178
699
|
removeFailedProvider: (baseUrl) => {
|
|
1179
|
-
const normalized =
|
|
700
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1180
701
|
const current = get().failedProviders;
|
|
1181
702
|
const updated = current.filter((url) => url !== normalized);
|
|
1182
703
|
void driver.setItem(SDK_STORAGE_KEYS.FAILED_PROVIDERS, updated);
|
|
@@ -1185,13 +706,13 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
|
|
|
1185
706
|
setLastFailed: (value) => {
|
|
1186
707
|
const normalized = {};
|
|
1187
708
|
for (const [baseUrl, timestamp] of Object.entries(value)) {
|
|
1188
|
-
normalized[
|
|
709
|
+
normalized[normalizeBaseUrl3(baseUrl)] = timestamp;
|
|
1189
710
|
}
|
|
1190
711
|
void driver.setItem(SDK_STORAGE_KEYS.LAST_FAILED, normalized);
|
|
1191
712
|
set({ lastFailed: normalized });
|
|
1192
713
|
},
|
|
1193
714
|
setLastFailedTimestamp: (baseUrl, timestamp) => {
|
|
1194
|
-
const normalized =
|
|
715
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1195
716
|
const current = get().lastFailed;
|
|
1196
717
|
const updated = { ...current, [normalized]: timestamp };
|
|
1197
718
|
void driver.setItem(SDK_STORAGE_KEYS.LAST_FAILED, updated);
|
|
@@ -1199,14 +720,14 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
|
|
|
1199
720
|
},
|
|
1200
721
|
setProvidersOnCooldown: (value) => {
|
|
1201
722
|
const normalized = value.map((entry) => ({
|
|
1202
|
-
baseUrl:
|
|
723
|
+
baseUrl: normalizeBaseUrl3(entry.baseUrl),
|
|
1203
724
|
timestamp: entry.timestamp
|
|
1204
725
|
}));
|
|
1205
726
|
void driver.setItem(SDK_STORAGE_KEYS.PROVIDERS_ON_COOLDOWN, normalized);
|
|
1206
727
|
set({ providersOnCooldown: normalized });
|
|
1207
728
|
},
|
|
1208
729
|
addProviderOnCooldown: (baseUrl, timestamp) => {
|
|
1209
|
-
const normalized =
|
|
730
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1210
731
|
const current = get().providersOnCooldown;
|
|
1211
732
|
if (!current.some((entry) => entry.baseUrl === normalized)) {
|
|
1212
733
|
const updated = [...current, { baseUrl: normalized, timestamp }];
|
|
@@ -1215,7 +736,7 @@ var createEmptyStore = (driver) => createStore((set, get) => ({
|
|
|
1215
736
|
}
|
|
1216
737
|
},
|
|
1217
738
|
removeProviderFromCooldown: (baseUrl) => {
|
|
1218
|
-
const normalized =
|
|
739
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1219
740
|
const current = get().providersOnCooldown;
|
|
1220
741
|
const updated = current.filter((entry) => entry.baseUrl !== normalized);
|
|
1221
742
|
void driver.setItem(SDK_STORAGE_KEYS.PROVIDERS_ON_COOLDOWN, updated);
|
|
@@ -1286,40 +807,40 @@ var hydrateStoreFromDriver = async (store, driver) => {
|
|
|
1286
807
|
]);
|
|
1287
808
|
const modelsFromAllProviders = Object.fromEntries(
|
|
1288
809
|
Object.entries(rawModels).map(([baseUrl, models]) => [
|
|
1289
|
-
|
|
810
|
+
normalizeBaseUrl3(baseUrl),
|
|
1290
811
|
models
|
|
1291
812
|
])
|
|
1292
813
|
);
|
|
1293
|
-
const baseUrlsList = rawBaseUrls.map((url) =>
|
|
814
|
+
const baseUrlsList = rawBaseUrls.map((url) => normalizeBaseUrl3(url));
|
|
1294
815
|
const disabledProviders = rawDisabledProviders.map(
|
|
1295
|
-
(url) =>
|
|
816
|
+
(url) => normalizeBaseUrl3(url)
|
|
1296
817
|
);
|
|
1297
818
|
const mintsFromAllProviders = Object.fromEntries(
|
|
1298
819
|
Object.entries(rawMints).map(([baseUrl, mints]) => [
|
|
1299
|
-
|
|
820
|
+
normalizeBaseUrl3(baseUrl),
|
|
1300
821
|
mints.map((mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint)
|
|
1301
822
|
])
|
|
1302
823
|
);
|
|
1303
824
|
const infoFromAllProviders = Object.fromEntries(
|
|
1304
825
|
Object.entries(rawInfo).map(([baseUrl, info]) => [
|
|
1305
|
-
|
|
826
|
+
normalizeBaseUrl3(baseUrl),
|
|
1306
827
|
info
|
|
1307
828
|
])
|
|
1308
829
|
);
|
|
1309
830
|
const lastModelsUpdate = Object.fromEntries(
|
|
1310
831
|
Object.entries(rawLastModelsUpdate).map(([baseUrl, timestamp]) => [
|
|
1311
|
-
|
|
832
|
+
normalizeBaseUrl3(baseUrl),
|
|
1312
833
|
timestamp
|
|
1313
834
|
])
|
|
1314
835
|
);
|
|
1315
836
|
const apiKeys = rawApiKeys.map((entry) => ({
|
|
1316
837
|
...entry,
|
|
1317
|
-
baseUrl:
|
|
838
|
+
baseUrl: normalizeBaseUrl3(entry.baseUrl),
|
|
1318
839
|
balance: entry.balance ?? 0,
|
|
1319
840
|
lastUsed: entry.lastUsed ?? null
|
|
1320
841
|
}));
|
|
1321
842
|
const childKeys = rawChildKeys.map((entry) => ({
|
|
1322
|
-
parentBaseUrl:
|
|
843
|
+
parentBaseUrl: normalizeBaseUrl3(entry.parentBaseUrl),
|
|
1323
844
|
childKey: entry.childKey,
|
|
1324
845
|
balance: entry.balance ?? 0,
|
|
1325
846
|
balanceLimit: entry.balanceLimit,
|
|
@@ -1328,9 +849,9 @@ var hydrateStoreFromDriver = async (store, driver) => {
|
|
|
1328
849
|
}));
|
|
1329
850
|
const xcashuTokens = Object.fromEntries(
|
|
1330
851
|
Object.entries(rawXcashuTokens).map(([baseUrl, tokens]) => [
|
|
1331
|
-
|
|
852
|
+
normalizeBaseUrl3(baseUrl),
|
|
1332
853
|
tokens.map((entry) => ({
|
|
1333
|
-
baseUrl:
|
|
854
|
+
baseUrl: normalizeBaseUrl3(entry.baseUrl),
|
|
1334
855
|
token: entry.token,
|
|
1335
856
|
createdAt: entry.createdAt ?? Date.now(),
|
|
1336
857
|
tryCount: entry.tryCount ?? 0
|
|
@@ -1351,16 +872,16 @@ var hydrateStoreFromDriver = async (store, driver) => {
|
|
|
1351
872
|
lastUsed: entry.lastUsed ?? null
|
|
1352
873
|
}));
|
|
1353
874
|
const failedProviders = rawFailedProviders.map(
|
|
1354
|
-
(url) =>
|
|
875
|
+
(url) => normalizeBaseUrl3(url)
|
|
1355
876
|
);
|
|
1356
877
|
const lastFailed = Object.fromEntries(
|
|
1357
878
|
Object.entries(rawLastFailed).map(([baseUrl, timestamp]) => [
|
|
1358
|
-
|
|
879
|
+
normalizeBaseUrl3(baseUrl),
|
|
1359
880
|
timestamp
|
|
1360
881
|
])
|
|
1361
882
|
);
|
|
1362
883
|
const providersOnCooldown = rawProvidersOnCooldown.map((entry) => ({
|
|
1363
|
-
baseUrl:
|
|
884
|
+
baseUrl: normalizeBaseUrl3(entry.baseUrl),
|
|
1364
885
|
timestamp: entry.timestamp
|
|
1365
886
|
}));
|
|
1366
887
|
store.setState({
|
|
@@ -1401,12 +922,12 @@ var createDiscoveryAdapterFromStore = (store) => ({
|
|
|
1401
922
|
getCachedProviderInfo: () => store.getState().infoFromAllProviders,
|
|
1402
923
|
setCachedProviderInfo: (info) => store.getState().setInfoFromAllProviders(info),
|
|
1403
924
|
getProviderLastUpdate: (baseUrl) => {
|
|
1404
|
-
const normalized =
|
|
925
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1405
926
|
const timestamps = store.getState().lastModelsUpdate;
|
|
1406
927
|
return timestamps[normalized] || null;
|
|
1407
928
|
},
|
|
1408
929
|
setProviderLastUpdate: (baseUrl, timestamp) => {
|
|
1409
|
-
const normalized =
|
|
930
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1410
931
|
const timestamps = { ...store.getState().lastModelsUpdate };
|
|
1411
932
|
timestamps[normalized] = timestamp;
|
|
1412
933
|
store.getState().setLastModelsUpdate(timestamps);
|
|
@@ -1435,24 +956,24 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1435
956
|
return Object.entries(distributionMap).map(([baseUrl, amt]) => ({ baseUrl, amount: amt })).sort((a, b) => b.amount - a.amount);
|
|
1436
957
|
},
|
|
1437
958
|
saveProviderInfo: (baseUrl, info) => {
|
|
1438
|
-
const normalized =
|
|
959
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1439
960
|
const next = { ...store.getState().infoFromAllProviders };
|
|
1440
961
|
next[normalized] = info;
|
|
1441
962
|
store.getState().setInfoFromAllProviders(next);
|
|
1442
963
|
},
|
|
1443
964
|
getProviderInfo: (baseUrl) => {
|
|
1444
|
-
const normalized =
|
|
965
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1445
966
|
return store.getState().infoFromAllProviders[normalized] || null;
|
|
1446
967
|
},
|
|
1447
968
|
// ========== API Keys (for apikeys mode) ==========
|
|
1448
969
|
getApiKey: (baseUrl) => {
|
|
1449
|
-
const normalized =
|
|
970
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1450
971
|
const entry = store.getState().apiKeys.find((key) => key.baseUrl === normalized);
|
|
1451
972
|
if (!entry) return null;
|
|
1452
973
|
return entry;
|
|
1453
974
|
},
|
|
1454
975
|
setApiKey: (baseUrl, key) => {
|
|
1455
|
-
const normalized =
|
|
976
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1456
977
|
const keys = store.getState().apiKeys;
|
|
1457
978
|
const existingIndex = keys.findIndex(
|
|
1458
979
|
(entry) => entry.baseUrl === normalized
|
|
@@ -1470,7 +991,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1470
991
|
store.getState().setApiKeys(next);
|
|
1471
992
|
},
|
|
1472
993
|
updateApiKeyBalance: (baseUrl, balance) => {
|
|
1473
|
-
const normalized =
|
|
994
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1474
995
|
const keys = store.getState().apiKeys;
|
|
1475
996
|
const next = keys.map(
|
|
1476
997
|
(entry) => entry.baseUrl === normalized ? { ...entry, balance, lastUsed: Date.now() } : entry
|
|
@@ -1478,7 +999,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1478
999
|
store.getState().setApiKeys(next);
|
|
1479
1000
|
},
|
|
1480
1001
|
removeApiKey: (baseUrl) => {
|
|
1481
|
-
const normalized =
|
|
1002
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1482
1003
|
const next = store.getState().apiKeys.filter((entry) => entry.baseUrl !== normalized);
|
|
1483
1004
|
store.getState().setApiKeys(next);
|
|
1484
1005
|
},
|
|
@@ -1492,7 +1013,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1492
1013
|
},
|
|
1493
1014
|
// ========== Child Keys ==========
|
|
1494
1015
|
getChildKey: (parentBaseUrl) => {
|
|
1495
|
-
const normalized =
|
|
1016
|
+
const normalized = normalizeBaseUrl3(parentBaseUrl);
|
|
1496
1017
|
const entry = store.getState().childKeys.find((key) => key.parentBaseUrl === normalized);
|
|
1497
1018
|
if (!entry) return null;
|
|
1498
1019
|
return {
|
|
@@ -1505,7 +1026,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1505
1026
|
};
|
|
1506
1027
|
},
|
|
1507
1028
|
setChildKey: (parentBaseUrl, childKey, balance, validityDate, balanceLimit) => {
|
|
1508
|
-
const normalized =
|
|
1029
|
+
const normalized = normalizeBaseUrl3(parentBaseUrl);
|
|
1509
1030
|
const keys = store.getState().childKeys;
|
|
1510
1031
|
const existingIndex = keys.findIndex(
|
|
1511
1032
|
(entry) => entry.parentBaseUrl === normalized
|
|
@@ -1536,7 +1057,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1536
1057
|
}
|
|
1537
1058
|
},
|
|
1538
1059
|
updateChildKeyBalance: (parentBaseUrl, balance) => {
|
|
1539
|
-
const normalized =
|
|
1060
|
+
const normalized = normalizeBaseUrl3(parentBaseUrl);
|
|
1540
1061
|
const keys = store.getState().childKeys;
|
|
1541
1062
|
const next = keys.map(
|
|
1542
1063
|
(entry) => entry.parentBaseUrl === normalized ? { ...entry, balance } : entry
|
|
@@ -1544,7 +1065,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1544
1065
|
store.getState().setChildKeys(next);
|
|
1545
1066
|
},
|
|
1546
1067
|
removeChildKey: (parentBaseUrl) => {
|
|
1547
|
-
const normalized =
|
|
1068
|
+
const normalized = normalizeBaseUrl3(parentBaseUrl);
|
|
1548
1069
|
const next = store.getState().childKeys.filter((entry) => entry.parentBaseUrl !== normalized);
|
|
1549
1070
|
store.getState().setChildKeys(next);
|
|
1550
1071
|
},
|
|
@@ -1569,11 +1090,11 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1569
1090
|
return store.getState().xcashuTokens;
|
|
1570
1091
|
},
|
|
1571
1092
|
getXcashuTokensForBaseUrl: (baseUrl) => {
|
|
1572
|
-
const normalized =
|
|
1093
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1573
1094
|
return store.getState().xcashuTokens[normalized] || [];
|
|
1574
1095
|
},
|
|
1575
1096
|
addXcashuToken: (baseUrl, token) => {
|
|
1576
|
-
const normalized =
|
|
1097
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1577
1098
|
const tokens = store.getState().xcashuTokens;
|
|
1578
1099
|
const existing = tokens[normalized] || [];
|
|
1579
1100
|
const next = { ...tokens };
|
|
@@ -1584,7 +1105,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1584
1105
|
store.getState().setXcashuTokens(next);
|
|
1585
1106
|
},
|
|
1586
1107
|
removeXcashuToken: (baseUrl, token) => {
|
|
1587
|
-
const normalized =
|
|
1108
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1588
1109
|
const tokens = store.getState().xcashuTokens;
|
|
1589
1110
|
const existing = tokens[normalized] || [];
|
|
1590
1111
|
const next = { ...tokens };
|
|
@@ -1595,7 +1116,7 @@ var createStorageAdapterFromStore = (store) => ({
|
|
|
1595
1116
|
store.getState().setXcashuTokens(next);
|
|
1596
1117
|
},
|
|
1597
1118
|
clearXcashuTokensForBaseUrl: (baseUrl) => {
|
|
1598
|
-
const normalized =
|
|
1119
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1599
1120
|
const tokens = store.getState().xcashuTokens;
|
|
1600
1121
|
const next = { ...tokens };
|
|
1601
1122
|
delete next[normalized];
|
|
@@ -1609,16 +1130,16 @@ var createProviderRegistryFromStore = (store, logger) => {
|
|
|
1609
1130
|
const log = (logger ?? consoleLogger).child("ProviderRegistry");
|
|
1610
1131
|
return {
|
|
1611
1132
|
getModelsForProvider: (baseUrl) => {
|
|
1612
|
-
const normalized =
|
|
1133
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1613
1134
|
return store.getState().modelsFromAllProviders[normalized] || [];
|
|
1614
1135
|
},
|
|
1615
1136
|
getDisabledProviders: () => store.getState().disabledProviders,
|
|
1616
1137
|
getProviderMints: (baseUrl) => {
|
|
1617
|
-
const normalized =
|
|
1138
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1618
1139
|
return store.getState().mintsFromAllProviders[normalized] || [];
|
|
1619
1140
|
},
|
|
1620
1141
|
getProviderInfo: async (baseUrl) => {
|
|
1621
|
-
const normalized =
|
|
1142
|
+
const normalized = normalizeBaseUrl3(baseUrl);
|
|
1622
1143
|
const cached = store.getState().infoFromAllProviders[normalized];
|
|
1623
1144
|
if (cached) return cached;
|
|
1624
1145
|
try {
|
|
@@ -1640,6 +1161,277 @@ var createProviderRegistryFromStore = (store, logger) => {
|
|
|
1640
1161
|
};
|
|
1641
1162
|
};
|
|
1642
1163
|
|
|
1164
|
+
// storage/shardedDiscoveryAdapter.ts
|
|
1165
|
+
var MODEL_KEY_PREFIX = "models:provider:";
|
|
1166
|
+
var MODEL_TS_KEY_PREFIX = "models:provider_timestamp:";
|
|
1167
|
+
var PROVIDER_INDEX_KEY = "models:provider_index";
|
|
1168
|
+
var MIGRATION_MARKER_KEY2 = "models_sharded_migration_v1";
|
|
1169
|
+
var encodeBaseUrl = (baseUrl) => encodeURIComponent(baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`);
|
|
1170
|
+
var modelKey = (baseUrl) => `${MODEL_KEY_PREFIX}${encodeBaseUrl(baseUrl)}`;
|
|
1171
|
+
var modelTsKey = (baseUrl) => `${MODEL_TS_KEY_PREFIX}${encodeBaseUrl(baseUrl)}`;
|
|
1172
|
+
var normalizeBaseUrl4 = (baseUrl) => baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
1173
|
+
var createShardedDiscoveryAdapter = async (options) => {
|
|
1174
|
+
const { driver } = options;
|
|
1175
|
+
const legacyModels = await driver.getItem(SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS, {});
|
|
1176
|
+
const legacyTimestamps = await driver.getItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE, {});
|
|
1177
|
+
if (Object.keys(legacyModels).length > 0) {
|
|
1178
|
+
const migratedProviders = [];
|
|
1179
|
+
for (const [baseUrl, models] of Object.entries(legacyModels)) {
|
|
1180
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1181
|
+
await driver.setItem(modelKey(normalized), models);
|
|
1182
|
+
const ts = legacyTimestamps[normalized] ?? Date.now();
|
|
1183
|
+
await driver.setItem(modelTsKey(normalized), ts);
|
|
1184
|
+
migratedProviders.push(normalized);
|
|
1185
|
+
}
|
|
1186
|
+
const existingIndex = await driver.getItem(
|
|
1187
|
+
PROVIDER_INDEX_KEY,
|
|
1188
|
+
[]
|
|
1189
|
+
);
|
|
1190
|
+
const merged = [.../* @__PURE__ */ new Set([...existingIndex, ...migratedProviders])];
|
|
1191
|
+
await driver.setItem(PROVIDER_INDEX_KEY, merged);
|
|
1192
|
+
await driver.removeItem(SDK_STORAGE_KEYS.MODELS_FROM_ALL_PROVIDERS);
|
|
1193
|
+
await driver.removeItem(SDK_STORAGE_KEYS.LAST_MODELS_UPDATE);
|
|
1194
|
+
}
|
|
1195
|
+
await driver.setItem(MIGRATION_MARKER_KEY2, true);
|
|
1196
|
+
const [
|
|
1197
|
+
rawMints,
|
|
1198
|
+
rawInfo,
|
|
1199
|
+
lastUsedModel,
|
|
1200
|
+
rawDisabled,
|
|
1201
|
+
rawBaseUrls,
|
|
1202
|
+
lastBaseUrlsUpdate,
|
|
1203
|
+
rawRoutstr21Models,
|
|
1204
|
+
lastRoutstr21ModelsUpdate
|
|
1205
|
+
] = await Promise.all([
|
|
1206
|
+
driver.getItem(
|
|
1207
|
+
SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS,
|
|
1208
|
+
{}
|
|
1209
|
+
),
|
|
1210
|
+
driver.getItem(
|
|
1211
|
+
SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS,
|
|
1212
|
+
{}
|
|
1213
|
+
),
|
|
1214
|
+
driver.getItem(SDK_STORAGE_KEYS.LAST_USED_MODEL, null),
|
|
1215
|
+
driver.getItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, []),
|
|
1216
|
+
driver.getItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, []),
|
|
1217
|
+
driver.getItem(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, null),
|
|
1218
|
+
driver.getItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, []),
|
|
1219
|
+
driver.getItem(
|
|
1220
|
+
SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE,
|
|
1221
|
+
null
|
|
1222
|
+
)
|
|
1223
|
+
]);
|
|
1224
|
+
const modelsByBaseUrl = /* @__PURE__ */ new Map();
|
|
1225
|
+
const timestampsByBaseUrl = /* @__PURE__ */ new Map();
|
|
1226
|
+
const providerIndex = /* @__PURE__ */ new Set();
|
|
1227
|
+
const knownProviders = /* @__PURE__ */ new Set();
|
|
1228
|
+
for (const baseUrl of Object.keys(rawInfo)) {
|
|
1229
|
+
knownProviders.add(normalizeBaseUrl4(baseUrl));
|
|
1230
|
+
}
|
|
1231
|
+
for (const baseUrl of Object.keys(rawMints)) {
|
|
1232
|
+
knownProviders.add(normalizeBaseUrl4(baseUrl));
|
|
1233
|
+
}
|
|
1234
|
+
for (const baseUrl of rawBaseUrls) {
|
|
1235
|
+
knownProviders.add(normalizeBaseUrl4(baseUrl));
|
|
1236
|
+
}
|
|
1237
|
+
for (const baseUrl of rawDisabled) {
|
|
1238
|
+
knownProviders.add(normalizeBaseUrl4(baseUrl));
|
|
1239
|
+
}
|
|
1240
|
+
for (const baseUrl of Object.keys(legacyModels)) {
|
|
1241
|
+
knownProviders.add(normalizeBaseUrl4(baseUrl));
|
|
1242
|
+
}
|
|
1243
|
+
const indexProviders = await driver.getItem(
|
|
1244
|
+
PROVIDER_INDEX_KEY,
|
|
1245
|
+
[]
|
|
1246
|
+
);
|
|
1247
|
+
for (const baseUrl of indexProviders) {
|
|
1248
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1249
|
+
providerIndex.add(normalized);
|
|
1250
|
+
knownProviders.add(normalized);
|
|
1251
|
+
}
|
|
1252
|
+
for (const baseUrl of knownProviders) {
|
|
1253
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1254
|
+
const models = await driver.getItem(
|
|
1255
|
+
modelKey(normalized),
|
|
1256
|
+
null
|
|
1257
|
+
);
|
|
1258
|
+
const ts = await driver.getItem(
|
|
1259
|
+
modelTsKey(normalized),
|
|
1260
|
+
null
|
|
1261
|
+
);
|
|
1262
|
+
if (models !== null) {
|
|
1263
|
+
modelsByBaseUrl.set(normalized, models);
|
|
1264
|
+
}
|
|
1265
|
+
if (ts !== null) {
|
|
1266
|
+
timestampsByBaseUrl.set(normalized, ts);
|
|
1267
|
+
}
|
|
1268
|
+
if (models !== null || ts !== null) {
|
|
1269
|
+
providerIndex.add(normalized);
|
|
1270
|
+
}
|
|
1271
|
+
}
|
|
1272
|
+
let mints = Object.fromEntries(
|
|
1273
|
+
Object.entries(rawMints).map(([baseUrl, mintList]) => [
|
|
1274
|
+
normalizeBaseUrl4(baseUrl),
|
|
1275
|
+
mintList.map((mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint)
|
|
1276
|
+
])
|
|
1277
|
+
);
|
|
1278
|
+
let info = Object.fromEntries(
|
|
1279
|
+
Object.entries(rawInfo).map(([baseUrl, entry]) => [
|
|
1280
|
+
normalizeBaseUrl4(baseUrl),
|
|
1281
|
+
entry
|
|
1282
|
+
])
|
|
1283
|
+
);
|
|
1284
|
+
let _lastUsedModel = lastUsedModel;
|
|
1285
|
+
let _disabledProviders = rawDisabled.map(normalizeBaseUrl4);
|
|
1286
|
+
let _baseUrlsList = rawBaseUrls.map(normalizeBaseUrl4);
|
|
1287
|
+
let _lastBaseUrlsUpdate = lastBaseUrlsUpdate;
|
|
1288
|
+
let _routstr21Models = rawRoutstr21Models;
|
|
1289
|
+
let _lastRoutstr21ModelsUpdate = lastRoutstr21ModelsUpdate;
|
|
1290
|
+
const persistProviderIndex = () => {
|
|
1291
|
+
void driver.setItem(PROVIDER_INDEX_KEY, [...providerIndex]);
|
|
1292
|
+
};
|
|
1293
|
+
return {
|
|
1294
|
+
// -- Models (sharded kv) --
|
|
1295
|
+
getCachedModels: () => {
|
|
1296
|
+
const result = {};
|
|
1297
|
+
for (const [baseUrl, models] of modelsByBaseUrl.entries()) {
|
|
1298
|
+
result[baseUrl] = models;
|
|
1299
|
+
}
|
|
1300
|
+
return result;
|
|
1301
|
+
},
|
|
1302
|
+
setCachedModels: (models) => {
|
|
1303
|
+
const nextKeys = new Set(
|
|
1304
|
+
Object.keys(models).map((baseUrl) => normalizeBaseUrl4(baseUrl))
|
|
1305
|
+
);
|
|
1306
|
+
for (const baseUrl of [...modelsByBaseUrl.keys()]) {
|
|
1307
|
+
if (!nextKeys.has(normalizeBaseUrl4(baseUrl))) {
|
|
1308
|
+
providerIndex.delete(baseUrl);
|
|
1309
|
+
modelsByBaseUrl.delete(baseUrl);
|
|
1310
|
+
timestampsByBaseUrl.delete(baseUrl);
|
|
1311
|
+
void driver.removeItem(modelKey(baseUrl));
|
|
1312
|
+
void driver.removeItem(modelTsKey(baseUrl));
|
|
1313
|
+
}
|
|
1314
|
+
}
|
|
1315
|
+
for (const [baseUrl, modelList] of Object.entries(models)) {
|
|
1316
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1317
|
+
providerIndex.add(normalized);
|
|
1318
|
+
modelsByBaseUrl.set(normalized, modelList);
|
|
1319
|
+
const ts = timestampsByBaseUrl.get(normalized) ?? Date.now();
|
|
1320
|
+
timestampsByBaseUrl.set(normalized, ts);
|
|
1321
|
+
void driver.setItem(modelKey(normalized), modelList);
|
|
1322
|
+
void driver.setItem(modelTsKey(normalized), ts);
|
|
1323
|
+
}
|
|
1324
|
+
persistProviderIndex();
|
|
1325
|
+
},
|
|
1326
|
+
getProviderLastUpdate: (baseUrl) => {
|
|
1327
|
+
return timestampsByBaseUrl.get(normalizeBaseUrl4(baseUrl)) ?? null;
|
|
1328
|
+
},
|
|
1329
|
+
setProviderLastUpdate: (baseUrl, timestamp) => {
|
|
1330
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1331
|
+
providerIndex.add(normalized);
|
|
1332
|
+
timestampsByBaseUrl.set(normalized, timestamp);
|
|
1333
|
+
void driver.setItem(modelTsKey(normalized), timestamp);
|
|
1334
|
+
persistProviderIndex();
|
|
1335
|
+
},
|
|
1336
|
+
// -- Mints (kv) --
|
|
1337
|
+
getCachedMints: () => mints,
|
|
1338
|
+
setCachedMints: (value) => {
|
|
1339
|
+
const normalized = {};
|
|
1340
|
+
for (const [baseUrl, mintList] of Object.entries(value)) {
|
|
1341
|
+
normalized[normalizeBaseUrl4(baseUrl)] = mintList.map(
|
|
1342
|
+
(mint) => mint.endsWith("/") ? mint.slice(0, -1) : mint
|
|
1343
|
+
);
|
|
1344
|
+
}
|
|
1345
|
+
mints = normalized;
|
|
1346
|
+
void driver.setItem(SDK_STORAGE_KEYS.MINTS_FROM_ALL_PROVIDERS, normalized);
|
|
1347
|
+
},
|
|
1348
|
+
// -- Provider info (kv) --
|
|
1349
|
+
getCachedProviderInfo: () => info,
|
|
1350
|
+
setCachedProviderInfo: (value) => {
|
|
1351
|
+
const normalized = {};
|
|
1352
|
+
for (const [baseUrl, entry] of Object.entries(value)) {
|
|
1353
|
+
normalized[normalizeBaseUrl4(baseUrl)] = entry;
|
|
1354
|
+
}
|
|
1355
|
+
info = normalized;
|
|
1356
|
+
void driver.setItem(SDK_STORAGE_KEYS.INFO_FROM_ALL_PROVIDERS, normalized);
|
|
1357
|
+
},
|
|
1358
|
+
// -- Last used model (kv) --
|
|
1359
|
+
getLastUsedModel: () => _lastUsedModel,
|
|
1360
|
+
setLastUsedModel: (modelId) => {
|
|
1361
|
+
_lastUsedModel = modelId;
|
|
1362
|
+
void driver.setItem(SDK_STORAGE_KEYS.LAST_USED_MODEL, modelId);
|
|
1363
|
+
},
|
|
1364
|
+
// -- Disabled providers (kv) --
|
|
1365
|
+
getDisabledProviders: () => _disabledProviders,
|
|
1366
|
+
setDisabledProviders: (urls) => {
|
|
1367
|
+
const normalized = urls.map(normalizeBaseUrl4);
|
|
1368
|
+
_disabledProviders = normalized;
|
|
1369
|
+
void driver.setItem(SDK_STORAGE_KEYS.DISABLED_PROVIDERS, normalized);
|
|
1370
|
+
},
|
|
1371
|
+
// -- Base URLs (kv) --
|
|
1372
|
+
getBaseUrlsList: () => _baseUrlsList,
|
|
1373
|
+
getBaseUrlsLastUpdate: () => _lastBaseUrlsUpdate,
|
|
1374
|
+
setBaseUrlsList: (urls) => {
|
|
1375
|
+
const normalized = urls.map(normalizeBaseUrl4);
|
|
1376
|
+
_baseUrlsList = normalized;
|
|
1377
|
+
void driver.setItem(SDK_STORAGE_KEYS.BASE_URLS_LIST, normalized);
|
|
1378
|
+
},
|
|
1379
|
+
setBaseUrlsLastUpdate: (timestamp) => {
|
|
1380
|
+
_lastBaseUrlsUpdate = timestamp;
|
|
1381
|
+
void driver.setItem(SDK_STORAGE_KEYS.LAST_BASE_URLS_UPDATE, timestamp);
|
|
1382
|
+
},
|
|
1383
|
+
// -- Routstr21 models (kv) --
|
|
1384
|
+
getRoutstr21Models: () => _routstr21Models,
|
|
1385
|
+
setRoutstr21Models: (models) => {
|
|
1386
|
+
_routstr21Models = models;
|
|
1387
|
+
void driver.setItem(SDK_STORAGE_KEYS.ROUTSTR21_MODELS, models);
|
|
1388
|
+
},
|
|
1389
|
+
getRoutstr21ModelsLastUpdate: () => _lastRoutstr21ModelsUpdate,
|
|
1390
|
+
setRoutstr21ModelsLastUpdate: (timestamp) => {
|
|
1391
|
+
_lastRoutstr21ModelsUpdate = timestamp;
|
|
1392
|
+
void driver.setItem(
|
|
1393
|
+
SDK_STORAGE_KEYS.LAST_ROUTSTR21_MODELS_UPDATE,
|
|
1394
|
+
timestamp
|
|
1395
|
+
);
|
|
1396
|
+
}
|
|
1397
|
+
};
|
|
1398
|
+
};
|
|
1399
|
+
var createProviderRegistryFromDiscoveryAdapter = (adapter, logger) => {
|
|
1400
|
+
const log = (logger ?? consoleLogger).child("ProviderRegistry");
|
|
1401
|
+
return {
|
|
1402
|
+
getModelsForProvider: (baseUrl) => {
|
|
1403
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1404
|
+
return adapter.getCachedModels()[normalized] || [];
|
|
1405
|
+
},
|
|
1406
|
+
getDisabledProviders: () => adapter.getDisabledProviders(),
|
|
1407
|
+
getProviderMints: (baseUrl) => {
|
|
1408
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1409
|
+
return adapter.getCachedMints()[normalized] || [];
|
|
1410
|
+
},
|
|
1411
|
+
getProviderInfo: async (baseUrl) => {
|
|
1412
|
+
const normalized = normalizeBaseUrl4(baseUrl);
|
|
1413
|
+
const cached = adapter.getCachedProviderInfo()[normalized];
|
|
1414
|
+
if (cached) return cached;
|
|
1415
|
+
try {
|
|
1416
|
+
const response = await fetch(`${normalized}v1/info`);
|
|
1417
|
+
if (!response.ok) {
|
|
1418
|
+
throw new Error(`Failed ${response.status}`);
|
|
1419
|
+
}
|
|
1420
|
+
const info = await response.json();
|
|
1421
|
+
adapter.setCachedProviderInfo({
|
|
1422
|
+
...adapter.getCachedProviderInfo(),
|
|
1423
|
+
[normalized]: info
|
|
1424
|
+
});
|
|
1425
|
+
return info;
|
|
1426
|
+
} catch (error) {
|
|
1427
|
+
log.warn(`Failed to fetch provider info from ${normalized}:`, error);
|
|
1428
|
+
return null;
|
|
1429
|
+
}
|
|
1430
|
+
},
|
|
1431
|
+
getAllProvidersModels: () => adapter.getCachedModels()
|
|
1432
|
+
};
|
|
1433
|
+
};
|
|
1434
|
+
|
|
1643
1435
|
// storage/index.ts
|
|
1644
1436
|
var isBrowser3 = () => {
|
|
1645
1437
|
try {
|
|
@@ -1648,31 +1440,13 @@ var isBrowser3 = () => {
|
|
|
1648
1440
|
return false;
|
|
1649
1441
|
}
|
|
1650
1442
|
};
|
|
1651
|
-
var isNode = () => {
|
|
1652
|
-
try {
|
|
1653
|
-
return typeof process !== "undefined" && process.versions != null && process.versions.node != null;
|
|
1654
|
-
} catch {
|
|
1655
|
-
return false;
|
|
1656
|
-
}
|
|
1657
|
-
};
|
|
1658
1443
|
var defaultDriver = null;
|
|
1659
|
-
var isBun3 = () => {
|
|
1660
|
-
return typeof process.versions.bun !== "undefined";
|
|
1661
|
-
};
|
|
1662
1444
|
var getDefaultSdkDriver = () => {
|
|
1663
1445
|
if (defaultDriver) return defaultDriver;
|
|
1664
1446
|
if (isBrowser3()) {
|
|
1665
1447
|
defaultDriver = localStorageDriver;
|
|
1666
1448
|
return defaultDriver;
|
|
1667
1449
|
}
|
|
1668
|
-
if (isBun3()) {
|
|
1669
|
-
defaultDriver = createMemoryDriver();
|
|
1670
|
-
return defaultDriver;
|
|
1671
|
-
}
|
|
1672
|
-
if (isNode()) {
|
|
1673
|
-
defaultDriver = createSqliteDriver();
|
|
1674
|
-
return defaultDriver;
|
|
1675
|
-
}
|
|
1676
1450
|
defaultDriver = createMemoryDriver();
|
|
1677
1451
|
return defaultDriver;
|
|
1678
1452
|
};
|
|
@@ -1693,26 +1467,22 @@ var getDefaultUsageTrackingDriver = () => {
|
|
|
1693
1467
|
});
|
|
1694
1468
|
return defaultUsageTrackingDriver;
|
|
1695
1469
|
}
|
|
1696
|
-
if (isBun3()) {
|
|
1697
|
-
defaultUsageTrackingDriver = createBunSqliteUsageTrackingDriver();
|
|
1698
|
-
return defaultUsageTrackingDriver;
|
|
1699
|
-
}
|
|
1700
|
-
if (isNode()) {
|
|
1701
|
-
defaultUsageTrackingDriver = createSqliteUsageTrackingDriver({
|
|
1702
|
-
legacyStorageDriver: storageDriver
|
|
1703
|
-
});
|
|
1704
|
-
return defaultUsageTrackingDriver;
|
|
1705
|
-
}
|
|
1706
1470
|
defaultUsageTrackingDriver = createMemoryUsageTrackingDriver();
|
|
1707
1471
|
return defaultUsageTrackingDriver;
|
|
1708
1472
|
};
|
|
1709
1473
|
var setDefaultUsageTrackingDriver = (driver) => {
|
|
1710
1474
|
defaultUsageTrackingDriver = driver;
|
|
1711
1475
|
};
|
|
1712
|
-
var
|
|
1476
|
+
var defaultDiscoveryAdapter = null;
|
|
1477
|
+
var getDefaultDiscoveryAdapter = async () => {
|
|
1478
|
+
if (defaultDiscoveryAdapter) return defaultDiscoveryAdapter;
|
|
1479
|
+
const driver = getDefaultSdkDriver();
|
|
1480
|
+
defaultDiscoveryAdapter = await createShardedDiscoveryAdapter({ driver });
|
|
1481
|
+
return defaultDiscoveryAdapter;
|
|
1482
|
+
};
|
|
1713
1483
|
var getDefaultStorageAdapter = async () => createStorageAdapterFromStore(await getDefaultSdkStore());
|
|
1714
|
-
var getDefaultProviderRegistry = async () =>
|
|
1484
|
+
var getDefaultProviderRegistry = async () => createProviderRegistryFromDiscoveryAdapter(await getDefaultDiscoveryAdapter());
|
|
1715
1485
|
|
|
1716
|
-
export { SDK_STORAGE_KEYS,
|
|
1486
|
+
export { SDK_STORAGE_KEYS, createDiscoveryAdapterFromStore, createIndexedDBDriver, createIndexedDBUsageTrackingDriver, createMemoryDriver, createMemoryUsageTrackingDriver, createProviderRegistryFromDiscoveryAdapter, createProviderRegistryFromStore, createSdkStore, createShardedDiscoveryAdapter, createStorageAdapterFromStore, getDefaultDiscoveryAdapter, getDefaultProviderRegistry, getDefaultSdkDriver, getDefaultSdkStore, getDefaultStorageAdapter, getDefaultUsageTrackingDriver, localStorageDriver, setDefaultUsageTrackingDriver };
|
|
1717
1487
|
//# sourceMappingURL=index.mjs.map
|
|
1718
1488
|
//# sourceMappingURL=index.mjs.map
|