@sriinnu/kosha-discovery 0.6.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +95 -263
- package/dist/cli-cmd-model.d.ts +48 -0
- package/dist/cli-cmd-model.d.ts.map +1 -0
- package/dist/cli-cmd-model.js +231 -0
- package/dist/cli-cmd-model.js.map +1 -0
- package/dist/cli-cmd-query.d.ts +40 -0
- package/dist/cli-cmd-query.d.ts.map +1 -0
- package/dist/cli-cmd-query.js +303 -0
- package/dist/cli-cmd-query.js.map +1 -0
- package/dist/cli-commands.d.ts +65 -75
- package/dist/cli-commands.d.ts.map +1 -1
- package/dist/cli-commands.js +93 -543
- package/dist/cli-commands.js.map +1 -1
- package/dist/cli-format.d.ts +32 -0
- package/dist/cli-format.d.ts.map +1 -1
- package/dist/cli-format.js +51 -0
- package/dist/cli-format.js.map +1 -1
- package/dist/cli-help.d.ts +19 -0
- package/dist/cli-help.d.ts.map +1 -0
- package/dist/cli-help.js +150 -0
- package/dist/cli-help.js.map +1 -0
- package/dist/cli.js +4 -1
- package/dist/cli.js.map +1 -1
- package/dist/discovery/anthropic.d.ts +8 -1
- package/dist/discovery/anthropic.d.ts.map +1 -1
- package/dist/discovery/anthropic.js +26 -3
- package/dist/discovery/anthropic.js.map +1 -1
- package/dist/discovery/base.d.ts +26 -0
- package/dist/discovery/base.d.ts.map +1 -1
- package/dist/discovery/base.js +55 -2
- package/dist/discovery/base.js.map +1 -1
- package/dist/discovery/free-tier.d.ts +31 -0
- package/dist/discovery/free-tier.d.ts.map +1 -0
- package/dist/discovery/free-tier.js +47 -0
- package/dist/discovery/free-tier.js.map +1 -0
- package/dist/discovery/google.d.ts +8 -1
- package/dist/discovery/google.d.ts.map +1 -1
- package/dist/discovery/google.js +25 -3
- package/dist/discovery/google.js.map +1 -1
- package/dist/discovery/index.d.ts +3 -6
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/discovery/index.js +36 -55
- package/dist/discovery/index.js.map +1 -1
- package/dist/discovery/litellm-seed.d.ts +32 -0
- package/dist/discovery/litellm-seed.d.ts.map +1 -0
- package/dist/discovery/litellm-seed.js +252 -0
- package/dist/discovery/litellm-seed.js.map +1 -0
- package/dist/discovery/modelsdev-catalog.d.ts +95 -0
- package/dist/discovery/modelsdev-catalog.d.ts.map +1 -0
- package/dist/discovery/modelsdev-catalog.js +131 -0
- package/dist/discovery/modelsdev-catalog.js.map +1 -0
- package/dist/discovery/modelsdev-seed.d.ts +19 -0
- package/dist/discovery/modelsdev-seed.d.ts.map +1 -0
- package/dist/discovery/modelsdev-seed.js +203 -0
- package/dist/discovery/modelsdev-seed.js.map +1 -0
- package/dist/discovery/openai-compatible.d.ts.map +1 -1
- package/dist/discovery/openai-compatible.js +12 -1
- package/dist/discovery/openai-compatible.js.map +1 -1
- package/dist/discovery/openai.d.ts +9 -1
- package/dist/discovery/openai.d.ts.map +1 -1
- package/dist/discovery/openai.js +31 -8
- package/dist/discovery/openai.js.map +1 -1
- package/dist/discovery/promo-overrides.d.ts +54 -0
- package/dist/discovery/promo-overrides.d.ts.map +1 -0
- package/dist/discovery/promo-overrides.js +74 -0
- package/dist/discovery/promo-overrides.js.map +1 -0
- package/dist/discovery/public-seed.d.ts +30 -0
- package/dist/discovery/public-seed.d.ts.map +1 -0
- package/dist/discovery/public-seed.js +51 -0
- package/dist/discovery/public-seed.js.map +1 -0
- package/dist/discovery-contract.d.ts +14 -2
- package/dist/discovery-contract.d.ts.map +1 -1
- package/dist/discovery-contract.js +28 -0
- package/dist/discovery-contract.js.map +1 -1
- package/dist/enrichment/litellm-catalog.d.ts +81 -0
- package/dist/enrichment/litellm-catalog.d.ts.map +1 -0
- package/dist/enrichment/litellm-catalog.js +129 -0
- package/dist/enrichment/litellm-catalog.js.map +1 -0
- package/dist/enrichment/litellm.d.ts +9 -2
- package/dist/enrichment/litellm.d.ts.map +1 -1
- package/dist/enrichment/litellm.js +168 -20
- package/dist/enrichment/litellm.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.d.ts +18 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +293 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/model-features.d.ts +77 -0
- package/dist/model-features.d.ts.map +1 -0
- package/dist/model-features.js +245 -0
- package/dist/model-features.js.map +1 -0
- package/dist/provider-catalog.d.ts +9 -0
- package/dist/provider-catalog.d.ts.map +1 -1
- package/dist/provider-catalog.js +22 -0
- package/dist/provider-catalog.js.map +1 -1
- package/dist/proxy.d.ts +31 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +193 -0
- package/dist/proxy.js.map +1 -0
- package/dist/registry-discovery.d.ts.map +1 -1
- package/dist/registry-discovery.js +12 -2
- package/dist/registry-discovery.js.map +1 -1
- package/dist/registry-runtime.d.ts +40 -1
- package/dist/registry-runtime.d.ts.map +1 -1
- package/dist/registry-runtime.js +502 -30
- package/dist/registry-runtime.js.map +1 -1
- package/dist/registry-selection.js +2 -0
- package/dist/registry-selection.js.map +1 -1
- package/dist/registry.d.ts +9 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +11 -1
- package/dist/registry.js.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +6 -0
- package/dist/server.js.map +1 -1
- package/dist/tokenizer-family.d.ts +39 -0
- package/dist/tokenizer-family.d.ts.map +1 -0
- package/dist/tokenizer-family.js +92 -0
- package/dist/tokenizer-family.js.map +1 -0
- package/dist/types.d.ts +186 -0
- package/dist/types.d.ts.map +1 -1
- package/logo.png +0 -0
- package/package.json +15 -3
package/dist/registry-runtime.js
CHANGED
|
@@ -5,12 +5,16 @@
|
|
|
5
5
|
* can stay small without losing the existing behavior.
|
|
6
6
|
* @module
|
|
7
7
|
*/
|
|
8
|
-
import {
|
|
8
|
+
import { randomBytes } from "crypto";
|
|
9
|
+
import { mkdir, open, readdir, rename, stat, unlink, writeFile } from "fs/promises";
|
|
9
10
|
import { homedir } from "os";
|
|
10
|
-
import { join } from "path";
|
|
11
|
-
import {
|
|
12
|
-
import { getProviderConfig, isLocalProvider, normalizeProviderId } from "./provider-catalog.js";
|
|
11
|
+
import { dirname, join } from "path";
|
|
12
|
+
import { DISCOVERY_SCHEMA_VERSION } from "./discovery-contract.js";
|
|
13
|
+
import { getProviderConfig, getProviderDescriptor, isLocalProvider, normalizeProviderId } from "./provider-catalog.js";
|
|
13
14
|
import { registryDiscoverySnapshot } from "./registry-discovery.js";
|
|
15
|
+
import { StaleCachePolicy } from "./resilience.js";
|
|
16
|
+
import { applyPromoOverrides } from "./discovery/promo-overrides.js";
|
|
17
|
+
import { assertCleanPayload } from "./security.js";
|
|
14
18
|
const DEFAULT_CACHE_TTL_MS = 86_400_000;
|
|
15
19
|
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
16
20
|
const CACHE_KEY_PREFIX = "provider_";
|
|
@@ -21,26 +25,6 @@ const CACHE_KEY_PREFIX = "provider_";
|
|
|
21
25
|
* cache envelopes or internal layout changes.
|
|
22
26
|
*/
|
|
23
27
|
export const REGISTRY_MANIFEST_PATH = join(homedir(), ".kosha", "registry.json");
|
|
24
|
-
const FALLBACK_ENV_MAP = {
|
|
25
|
-
anthropic: "ANTHROPIC_API_KEY",
|
|
26
|
-
openai: "OPENAI_API_KEY",
|
|
27
|
-
google: "GOOGLE_API_KEY",
|
|
28
|
-
openrouter: "OPENROUTER_API_KEY",
|
|
29
|
-
nvidia: "NVIDIA_API_KEY",
|
|
30
|
-
together: "TOGETHER_API_KEY",
|
|
31
|
-
fireworks: "FIREWORKS_API_KEY",
|
|
32
|
-
groq: "GROQ_API_KEY",
|
|
33
|
-
mistral: "MISTRAL_API_KEY",
|
|
34
|
-
deepinfra: "DEEPINFRA_API_KEY",
|
|
35
|
-
cohere: "CO_API_KEY",
|
|
36
|
-
cerebras: "CEREBRAS_API_KEY",
|
|
37
|
-
perplexity: "PERPLEXITY_API_KEY",
|
|
38
|
-
deepseek: "DEEPSEEK_API_KEY",
|
|
39
|
-
moonshot: "MOONSHOT_API_KEY",
|
|
40
|
-
glm: "GLM_API_KEY",
|
|
41
|
-
zai: "ZAI_API_KEY",
|
|
42
|
-
minimax: "MINIMAX_API_KEY",
|
|
43
|
-
};
|
|
44
28
|
/**
|
|
45
29
|
* Run provider discovery, enrichment, caching, and delta emission.
|
|
46
30
|
*/
|
|
@@ -84,6 +68,14 @@ export async function registryDiscover(state, dependencies, options) {
|
|
|
84
68
|
if (options?.enrichWithPricing ?? true) {
|
|
85
69
|
await dependencies.enrichModels();
|
|
86
70
|
}
|
|
71
|
+
// Apply promo overrides as a final pricing pass so deals always win
|
|
72
|
+
// regardless of discovery path (API, seed, or enrichment).
|
|
73
|
+
for (const [providerId, providerInfo] of state.providerMap) {
|
|
74
|
+
state.providerMap.set(providerId, {
|
|
75
|
+
...providerInfo,
|
|
76
|
+
models: applyPromoOverrides(providerInfo.models),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
87
79
|
dependencies.populateModelAliases();
|
|
88
80
|
state.discoveredAt = Date.now();
|
|
89
81
|
await dependencies.saveToCache();
|
|
@@ -153,7 +145,7 @@ export function fallbackRegistryCredential(providerId, explicitKey) {
|
|
|
153
145
|
if (explicitKey) {
|
|
154
146
|
return { apiKey: explicitKey, source: "config" };
|
|
155
147
|
}
|
|
156
|
-
const envVar =
|
|
148
|
+
const envVar = getProviderDescriptor(normalizedProviderId)?.primaryCredentialEnvVar;
|
|
157
149
|
const value = envVar ? process.env[envVar] : undefined;
|
|
158
150
|
return value ? { apiKey: value, source: "env" } : { source: "none" };
|
|
159
151
|
}
|
|
@@ -178,6 +170,56 @@ export async function enrichRegistryModels(state) {
|
|
|
178
170
|
// I silently skip enrichment when the optional module is not present.
|
|
179
171
|
}
|
|
180
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* Load cached provider data, re-run LiteLLM enrichment, and persist results.
|
|
175
|
+
*
|
|
176
|
+
* This is the lightweight alternative to full re-discovery — no provider API
|
|
177
|
+
* calls, just a fetch from the litellm community catalogue. Returns `null`
|
|
178
|
+
* when no cached data is available.
|
|
179
|
+
*/
|
|
180
|
+
export async function registryEnrichOnly(state) {
|
|
181
|
+
const ttl = state.config.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;
|
|
182
|
+
const allEntry = await state.cache.get("providers_all");
|
|
183
|
+
if (!allEntry)
|
|
184
|
+
return null;
|
|
185
|
+
// Accept stale cache too — enrichment-only shouldn't fail just because
|
|
186
|
+
// the TTL expired. The user explicitly asked for enrichment, not discovery.
|
|
187
|
+
for (const provider of allEntry.data) {
|
|
188
|
+
state.providerMap.set(provider.id, provider);
|
|
189
|
+
}
|
|
190
|
+
state.discoveredAt = allEntry.timestamp;
|
|
191
|
+
// Snapshot pricing before enrichment to count how many models get updates.
|
|
192
|
+
const before = countPricingFields(state);
|
|
193
|
+
await enrichRegistryModels(state);
|
|
194
|
+
for (const [providerId, providerInfo] of state.providerMap) {
|
|
195
|
+
state.providerMap.set(providerId, {
|
|
196
|
+
...providerInfo,
|
|
197
|
+
models: applyPromoOverrides(providerInfo.models),
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
populateRegistryModelAliases(state);
|
|
201
|
+
await saveRegistryToCache(state);
|
|
202
|
+
await exportRegistryManifest(state);
|
|
203
|
+
const after = countPricingFields(state);
|
|
204
|
+
return {
|
|
205
|
+
modelCount: Array.from(state.providerMap.values()).reduce((sum, p) => sum + p.models.length, 0),
|
|
206
|
+
cachePricingUpdated: Math.max(0, after.cachePricing - before.cachePricing),
|
|
207
|
+
batchPricingUpdated: Math.max(0, after.batchPricing - before.batchPricing),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function countPricingFields(state) {
|
|
211
|
+
let cachePricing = 0;
|
|
212
|
+
let batchPricing = 0;
|
|
213
|
+
for (const providerInfo of state.providerMap.values()) {
|
|
214
|
+
for (const model of providerInfo.models) {
|
|
215
|
+
if (model.pricing?.cacheReadPerMillion !== undefined || model.pricing?.cacheWritePerMillion !== undefined)
|
|
216
|
+
cachePricing++;
|
|
217
|
+
if (model.pricing?.batchInputPerMillion !== undefined || model.pricing?.batchOutputPerMillion !== undefined)
|
|
218
|
+
batchPricing++;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return { cachePricing, batchPricing };
|
|
222
|
+
}
|
|
181
223
|
/**
|
|
182
224
|
* Populate reverse aliases onto discovered models for legacy consumers.
|
|
183
225
|
*/
|
|
@@ -243,14 +285,444 @@ export async function saveRegistryToCache(state) {
|
|
|
243
285
|
* the whole command.
|
|
244
286
|
*/
|
|
245
287
|
export async function exportRegistryManifest(state) {
|
|
288
|
+
let manifestPath = null;
|
|
289
|
+
let lockReleased = true;
|
|
290
|
+
let lockPath = null;
|
|
246
291
|
try {
|
|
247
|
-
const
|
|
248
|
-
state.lastSnapshotCache =
|
|
249
|
-
|
|
250
|
-
|
|
292
|
+
const fresh = state.lastSnapshotCache ?? registryDiscoverySnapshot(state);
|
|
293
|
+
state.lastSnapshotCache = fresh;
|
|
294
|
+
// Honour state.config.cacheDir so isolated tests (and any other caller
|
|
295
|
+
// that pins a custom cache root) don't clobber the user's real
|
|
296
|
+
// ~/.kosha/registry.json. Without this, running the kosha test suite
|
|
297
|
+
// silently overwrote the user's manifest with an empty one because
|
|
298
|
+
// every test instance triggered an export against the hardcoded path.
|
|
299
|
+
manifestPath = resolveManifestPath(state);
|
|
300
|
+
await mkdir(dirname(manifestPath), { recursive: true });
|
|
301
|
+
// Sweep stale tmp files left over from prior runs that were SIGKILLed
|
|
302
|
+
// mid-write. Each crashed run leaks a `<manifest>.<rand>.tmp` file;
|
|
303
|
+
// without this sweep they accumulate forever (~1.6 MB each).
|
|
304
|
+
await sweepStaleTmpFiles(manifestPath);
|
|
305
|
+
// Cross-process mutex around the read-merge-write critical section.
|
|
306
|
+
// Without this, two concurrent `kosha update` runs both read the same
|
|
307
|
+
// previous manifest, both compute their own merge, and both rename to
|
|
308
|
+
// the final path — last write wins, but the loser's distinct merged
|
|
309
|
+
// additions vanish (lost update).
|
|
310
|
+
lockPath = `${manifestPath}.lock`;
|
|
311
|
+
// Mark `lockReleased = false` ONLY after acquireExportLock returns
|
|
312
|
+
// successfully. If acquire throws (contention timeout, EACCES, …),
|
|
313
|
+
// the finally block must NOT unlink lockPath — that file belongs to
|
|
314
|
+
// the process that's currently holding the lock. Yanking it would
|
|
315
|
+
// let a third caller O_EXCL-acquire while the holder is mid-write,
|
|
316
|
+
// reintroducing the lost-update bug this lock was added to prevent.
|
|
317
|
+
await acquireExportLock(lockPath);
|
|
318
|
+
lockReleased = false;
|
|
319
|
+
// VDOM-style merge: if a previous manifest exists, preserve old
|
|
320
|
+
// providers/models that the fresh fetch dropped. A provider returning
|
|
321
|
+
// 0 models (auth error, rate limit, transient outage) must NOT wipe
|
|
322
|
+
// the user's pricing for those models — they retain their last-known
|
|
323
|
+
// values until a successful fetch supersedes them.
|
|
324
|
+
const previousManifest = await readPreviousManifest(manifestPath);
|
|
325
|
+
const merged = mergeManifests(previousManifest, fresh);
|
|
326
|
+
// Pricing-diff alerts. The most dangerous failure mode isn't "kosha
|
|
327
|
+
// returned null" (we already detect that). It's "kosha returned a
|
|
328
|
+
// wrong number" — silent over- or undercharging. We compare prev vs
|
|
329
|
+
// fresh rates per model and append anomalies (>25% delta) to a
|
|
330
|
+
// rolling 30-day log. Best-effort — never fails the export.
|
|
331
|
+
try {
|
|
332
|
+
const anomalies = detectPricingAnomalies(previousManifest, fresh);
|
|
333
|
+
if (anomalies.length > 0) {
|
|
334
|
+
await appendAnomalies(dirname(manifestPath), anomalies);
|
|
335
|
+
for (const a of anomalies) {
|
|
336
|
+
const tag = a.promo ? " [promo]" : "";
|
|
337
|
+
console.warn(`[kosha] pricing anomaly${tag}: ${a.key} ${a.field} ` +
|
|
338
|
+
`${a.previous} → ${a.current} (${(a.deltaPct * 100).toFixed(0)}%)`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
// Anomaly logging is observability only; never block manifest export.
|
|
344
|
+
}
|
|
345
|
+
// Atomic write: temp file in the same directory, then rename(2).
|
|
346
|
+
// `rename` within a single filesystem is atomic on POSIX and
|
|
347
|
+
// preserves any concurrent reader's existing fd. Without this, a
|
|
348
|
+
// reader (e.g. tokmeter's pricing manifest fallback) can land mid
|
|
349
|
+
// `JSON.stringify` write and parse a truncated file. The tmp suffix
|
|
350
|
+
// uses 8 random hex chars so two concurrent kosha updates don't
|
|
351
|
+
// collide on the staging name.
|
|
352
|
+
const tmpPath = `${manifestPath}.${randomBytes(4).toString("hex")}.tmp`;
|
|
353
|
+
try {
|
|
354
|
+
await writeFile(tmpPath, JSON.stringify(merged, null, 2), "utf-8");
|
|
355
|
+
// Snapshot rollback ring: rotate the existing manifest into a
|
|
356
|
+
// dated `.bak` slot before the rename overwrites it. Keeps the
|
|
357
|
+
// last 7 snapshots so a bad publish (provider returns garbage,
|
|
358
|
+
// kosha's own bug, hand-edit) has an undo path. Sweeping
|
|
359
|
+
// happens after rename so we never lose the manifest mid-rotate.
|
|
360
|
+
await rotateBackup(manifestPath);
|
|
361
|
+
await rename(tmpPath, manifestPath);
|
|
362
|
+
}
|
|
363
|
+
catch (err) {
|
|
364
|
+
// Best-effort cleanup of the temp file if rename failed.
|
|
365
|
+
await unlink(tmpPath).catch(() => { });
|
|
366
|
+
throw err;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
catch (err) {
|
|
370
|
+
// Manifest export is best-effort — the cache still works either way.
|
|
371
|
+
// But silent failure was making permission/disk-full bugs invisible
|
|
372
|
+
// for days. Surface the reason once via stderr; nothing else is
|
|
373
|
+
// gated on a successful export.
|
|
374
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
375
|
+
console.warn(`[kosha] manifest export failed (${manifestPath ?? "unknown path"}): ${reason}`);
|
|
376
|
+
}
|
|
377
|
+
finally {
|
|
378
|
+
if (!lockReleased && lockPath) {
|
|
379
|
+
await unlink(lockPath).catch(() => { });
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* O_EXCL-based file lock. Tries to create the lock file with `wx` flag —
|
|
385
|
+
* fails if it already exists. Retries with bounded backoff (max ~3s).
|
|
386
|
+
* Stale locks (>30s old) are reclaimed: a kosha process that crashed mid-
|
|
387
|
+
* critical-section won't deadlock future runs.
|
|
388
|
+
*/
|
|
389
|
+
async function acquireExportLock(lockPath) {
|
|
390
|
+
const STALE_AFTER_MS = 30_000;
|
|
391
|
+
const MAX_WAIT_MS = 3_000;
|
|
392
|
+
const startedAt = Date.now();
|
|
393
|
+
for (let attempt = 0;; attempt++) {
|
|
394
|
+
try {
|
|
395
|
+
const fd = await open(lockPath, "wx");
|
|
396
|
+
await fd.write(`${process.pid}\n`);
|
|
397
|
+
await fd.close();
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
catch (err) {
|
|
401
|
+
const code = err.code;
|
|
402
|
+
if (code !== "EEXIST")
|
|
403
|
+
throw err;
|
|
404
|
+
// Lock exists — check if it's stale.
|
|
405
|
+
try {
|
|
406
|
+
const s = await stat(lockPath);
|
|
407
|
+
if (Date.now() - s.mtimeMs > STALE_AFTER_MS) {
|
|
408
|
+
await unlink(lockPath).catch(() => { });
|
|
409
|
+
continue;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
catch {
|
|
413
|
+
continue; // raced with the holder unlinking
|
|
414
|
+
}
|
|
415
|
+
if (Date.now() - startedAt > MAX_WAIT_MS) {
|
|
416
|
+
throw new Error(`kosha manifest export: lock contention (${lockPath})`);
|
|
417
|
+
}
|
|
418
|
+
// Backoff with jitter: 50, 100, 200, 400, capped at 800ms
|
|
419
|
+
const delay = Math.min(800, 50 * 2 ** attempt) + Math.floor(Math.random() * 50);
|
|
420
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
const MAX_BACKUPS = 7;
|
|
425
|
+
/**
|
|
426
|
+
* Rotate the current manifest into a `.bak.<YYYY-MM-DD>` slot before it
|
|
427
|
+
* gets overwritten. Keeps the last MAX_BACKUPS snapshots; older ones get
|
|
428
|
+
* unlinked. If today's slot already exists (multiple updates same day),
|
|
429
|
+
* it's preserved — first write of the day wins, since the goal is "what
|
|
430
|
+
* did the manifest look like at the start of each day?"
|
|
431
|
+
*
|
|
432
|
+
* Best-effort: rotation failures don't abort the export. The current
|
|
433
|
+
* manifest is intact regardless.
|
|
434
|
+
*/
|
|
435
|
+
async function rotateBackup(manifestPath) {
|
|
436
|
+
try {
|
|
437
|
+
const dir = dirname(manifestPath);
|
|
438
|
+
const base = manifestPath.slice(dir.length + 1);
|
|
439
|
+
const today = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
|
|
440
|
+
const todayBak = join(dir, `${base}.bak.${today}`);
|
|
441
|
+
// Only rotate if the manifest exists and today's bak slot is empty.
|
|
442
|
+
try {
|
|
443
|
+
await stat(manifestPath);
|
|
444
|
+
}
|
|
445
|
+
catch {
|
|
446
|
+
return; // no current manifest, nothing to back up
|
|
447
|
+
}
|
|
448
|
+
try {
|
|
449
|
+
await stat(todayBak);
|
|
450
|
+
return; // today's slot already taken — first writer of the day wins
|
|
451
|
+
}
|
|
452
|
+
catch {
|
|
453
|
+
// fall through — slot is free
|
|
454
|
+
}
|
|
455
|
+
// Copy the current manifest to today's bak slot. We copy rather than
|
|
456
|
+
// rename so the live manifest stays in place during the gap between
|
|
457
|
+
// rotation and the new rename(2) below.
|
|
458
|
+
const { readFile } = await import("fs/promises");
|
|
459
|
+
const data = await readFile(manifestPath);
|
|
460
|
+
const tmp = `${todayBak}.${randomBytes(4).toString("hex")}.tmp`;
|
|
461
|
+
try {
|
|
462
|
+
await writeFile(tmp, data);
|
|
463
|
+
await rename(tmp, todayBak);
|
|
464
|
+
}
|
|
465
|
+
catch (err) {
|
|
466
|
+
await unlink(tmp).catch(() => { });
|
|
467
|
+
throw err;
|
|
468
|
+
}
|
|
469
|
+
// Sweep older backups down to MAX_BACKUPS.
|
|
470
|
+
const bakRe = new RegExp(`^${escapeRegExp(base)}\\.bak\\.(\\d{4}-\\d{2}-\\d{2})$`);
|
|
471
|
+
const entries = await readdir(dir);
|
|
472
|
+
const bakDates = entries
|
|
473
|
+
.map((name) => {
|
|
474
|
+
const m = bakRe.exec(name);
|
|
475
|
+
return m ? { name, date: m[1] } : null;
|
|
476
|
+
})
|
|
477
|
+
.filter((x) => x !== null)
|
|
478
|
+
.sort((a, b) => a.date.localeCompare(b.date));
|
|
479
|
+
const expired = bakDates.slice(0, Math.max(0, bakDates.length - MAX_BACKUPS));
|
|
480
|
+
await Promise.all(expired.map((b) => unlink(join(dir, b.name)).catch(() => { })));
|
|
251
481
|
}
|
|
252
482
|
catch {
|
|
253
|
-
//
|
|
483
|
+
// Rotation is observability/recovery only — don't gate the export.
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
/** Remove any `<manifest>.<...>.tmp` siblings older than 5 minutes. They are
|
|
487
|
+
* orphans from prior runs that crashed between writeFile and rename. */
|
|
488
|
+
async function sweepStaleTmpFiles(manifestPath) {
|
|
489
|
+
try {
|
|
490
|
+
const dir = dirname(manifestPath);
|
|
491
|
+
const base = manifestPath.slice(dir.length + 1);
|
|
492
|
+
const tmpRe = new RegExp(`^${escapeRegExp(base)}\\.[0-9a-f]+\\.tmp$`);
|
|
493
|
+
const fiveMinAgo = Date.now() - 5 * 60_000;
|
|
494
|
+
const entries = await readdir(dir);
|
|
495
|
+
await Promise.all(entries
|
|
496
|
+
.filter((name) => tmpRe.test(name))
|
|
497
|
+
.map(async (name) => {
|
|
498
|
+
const p = join(dir, name);
|
|
499
|
+
try {
|
|
500
|
+
const s = await stat(p);
|
|
501
|
+
if (s.mtimeMs < fiveMinAgo)
|
|
502
|
+
await unlink(p);
|
|
503
|
+
}
|
|
504
|
+
catch {
|
|
505
|
+
// raced with another sweeper or unlinked already — fine
|
|
506
|
+
}
|
|
507
|
+
}));
|
|
508
|
+
}
|
|
509
|
+
catch {
|
|
510
|
+
// Sweep is best-effort; do not block export on a directory listing failure.
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
function escapeRegExp(s) {
|
|
514
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
515
|
+
}
|
|
516
|
+
/** Resolve the on-disk path for the registry manifest. Tests + custom callers
|
|
517
|
+
* pin via `state.config.cacheDir`; production falls back to ~/.kosha. */
|
|
518
|
+
function resolveManifestPath(state) {
|
|
519
|
+
const cacheDir = state.config.cacheDir;
|
|
520
|
+
if (cacheDir)
|
|
521
|
+
return join(dirname(cacheDir), "registry.json");
|
|
522
|
+
return REGISTRY_MANIFEST_PATH;
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Merge a fresh discovery snapshot with the previous manifest on disk.
|
|
526
|
+
*
|
|
527
|
+
* Per-model rule: keep the latest pricing data we've ever seen, keyed by
|
|
528
|
+
* `key` (e.g. `anthropic:claude-opus-4-7`). Fresh entries win when present,
|
|
529
|
+
* but old entries survive if the fresh fetch dropped them (provider 503,
|
|
530
|
+
* no credentials, rate limit, etc.).
|
|
531
|
+
*
|
|
532
|
+
* Per-provider rule: a provider that exists in the old manifest but is
|
|
533
|
+
* absent from the fresh fetch keeps its full entry — same logic, applied
|
|
534
|
+
* to the provider list.
|
|
535
|
+
*
|
|
536
|
+
* If the previous manifest is missing or unreadable we just write the
|
|
537
|
+
* fresh snapshot as-is (first run / corrupted file).
|
|
538
|
+
*/
|
|
539
|
+
async function readPreviousManifest(manifestPath) {
|
|
540
|
+
try {
|
|
541
|
+
const { readFile } = await import("fs/promises");
|
|
542
|
+
const raw = await readFile(manifestPath, "utf-8");
|
|
543
|
+
const parsed = JSON.parse(raw);
|
|
544
|
+
if (!parsed?.models)
|
|
545
|
+
return null;
|
|
546
|
+
// Schema-version guard. A different version on disk means we can't
|
|
547
|
+
// trust the field shapes — caller falls through to fresh-only.
|
|
548
|
+
if (parsed.schemaVersion !== DISCOVERY_SCHEMA_VERSION)
|
|
549
|
+
return null;
|
|
550
|
+
assertCleanPayload(parsed, "registry manifest");
|
|
551
|
+
return parsed;
|
|
552
|
+
}
|
|
553
|
+
catch {
|
|
554
|
+
return null; // missing or unreadable
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
function mergeManifests(previous, fresh) {
|
|
558
|
+
if (!previous)
|
|
559
|
+
return fresh;
|
|
560
|
+
// Index previous entries by key so we can both detect collisions AND
|
|
561
|
+
// look back at the old data for pricing-degraded merge below.
|
|
562
|
+
const previousByKey = new Map();
|
|
563
|
+
for (const m of previous.models) {
|
|
564
|
+
if (m.key)
|
|
565
|
+
previousByKey.set(m.key, m);
|
|
566
|
+
}
|
|
567
|
+
// Per-model merge with two rules:
|
|
568
|
+
// (1) Old entries fresh dropped entirely → keep them.
|
|
569
|
+
// (2) Fresh entries that came back with NO pricing while the old entry
|
|
570
|
+
// HAD pricing → keep the old pricing block (degraded-fresh defence).
|
|
571
|
+
// This guards against transient enrichment failures (LiteLLM
|
|
572
|
+
// offline, models.dev 503, etc.) that would otherwise silently
|
|
573
|
+
// zero out previously-known prices on the next refresh.
|
|
574
|
+
const freshModelKeys = new Set();
|
|
575
|
+
const mergedModels = [];
|
|
576
|
+
for (const f of fresh.models ?? []) {
|
|
577
|
+
if (f.key)
|
|
578
|
+
freshModelKeys.add(f.key);
|
|
579
|
+
const old = f.key ? previousByKey.get(f.key) : undefined;
|
|
580
|
+
if (old && !hasUsablePricing(f) && hasUsablePricing(old)) {
|
|
581
|
+
// Keep all of fresh's metadata but restore pricing from old.
|
|
582
|
+
mergedModels.push({
|
|
583
|
+
...f,
|
|
584
|
+
pricing: old.pricing,
|
|
585
|
+
originPricing: old.originPricing,
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
mergedModels.push(f);
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
for (const old of previous.models) {
|
|
593
|
+
if (old.key && !freshModelKeys.has(old.key)) {
|
|
594
|
+
mergedModels.push(old);
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
const freshProviderIds = new Set((fresh.providers ?? []).map((p) => p.providerId));
|
|
598
|
+
const mergedProviders = [...(fresh.providers ?? [])];
|
|
599
|
+
for (const old of previous.providers ?? []) {
|
|
600
|
+
if (!freshProviderIds.has(old.providerId)) {
|
|
601
|
+
mergedProviders.push(old);
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
return {
|
|
605
|
+
...fresh,
|
|
606
|
+
models: mergedModels,
|
|
607
|
+
providers: mergedProviders,
|
|
608
|
+
};
|
|
609
|
+
}
|
|
610
|
+
/** True if the entry carries defined input + output rates on EITHER the
|
|
611
|
+
* origin (direct provider) side OR the proxy (`pricing`) side — even zero
|
|
612
|
+
* (free-tier). Anything else is "pricing-degraded" for our purposes.
|
|
613
|
+
*
|
|
614
|
+
* Both sides are checked independently. The earlier `originPricing ?? pricing`
|
|
615
|
+
* short-circuited on `originPricing` being defined, so a row with
|
|
616
|
+
* `originPricing = {input:0, output:0}` and `pricing = {input:5, output:15}`
|
|
617
|
+
* would falsely report degraded — and the caller would then overwrite the
|
|
618
|
+
* fresh proxy rate with old data. */
|
|
619
|
+
function hasUsablePricing(entry) {
|
|
620
|
+
if (!entry)
|
|
621
|
+
return false;
|
|
622
|
+
const sideHasPricing = (side) => {
|
|
623
|
+
const r = side;
|
|
624
|
+
if (!r)
|
|
625
|
+
return false;
|
|
626
|
+
return r.inputPerMillion !== undefined && r.outputPerMillion !== undefined;
|
|
627
|
+
};
|
|
628
|
+
return sideHasPricing(entry.originPricing) || sideHasPricing(entry.pricing);
|
|
629
|
+
}
|
|
630
|
+
const ANOMALY_DELTA_THRESHOLD = 0.25; // 25% in either direction
|
|
631
|
+
const ANOMALY_RETENTION_MS = 30 * 86_400_000; // 30 days
|
|
632
|
+
const ANOMALY_MAX_ENTRIES = 5_000; // cap so the file can't grow unbounded
|
|
633
|
+
const ANOMALY_FILE = "anomalies.json";
|
|
634
|
+
/** Compare prev vs fresh manifests and emit one anomaly per rate-field
|
|
635
|
+
* that moved more than ANOMALY_DELTA_THRESHOLD. Both directions count
|
|
636
|
+
* (a 90% rate drop is just as suspicious as a 90% jump). */
|
|
637
|
+
function hasPromoFlag(entry) {
|
|
638
|
+
if (!entry)
|
|
639
|
+
return false;
|
|
640
|
+
const caps = entry.rawCapabilities ?? entry.capabilities ?? [];
|
|
641
|
+
return caps.includes("promo_override");
|
|
642
|
+
}
|
|
643
|
+
function detectPricingAnomalies(previous, fresh) {
|
|
644
|
+
if (!previous?.models)
|
|
645
|
+
return [];
|
|
646
|
+
const prevByKey = new Map();
|
|
647
|
+
for (const m of previous.models) {
|
|
648
|
+
if (m.key)
|
|
649
|
+
prevByKey.set(m.key, m);
|
|
650
|
+
}
|
|
651
|
+
const ts = Date.now();
|
|
652
|
+
const anomalies = [];
|
|
653
|
+
const fields = [
|
|
654
|
+
{ name: "input", key: "inputPerMillion" },
|
|
655
|
+
{ name: "output", key: "outputPerMillion" },
|
|
656
|
+
{ name: "cacheRead", key: "cacheReadPerMillion" },
|
|
657
|
+
{ name: "cacheWrite", key: "cacheWritePerMillion" },
|
|
658
|
+
];
|
|
659
|
+
const sides = [
|
|
660
|
+
{ name: "origin", pick: (m) => m.originPricing },
|
|
661
|
+
{ name: "proxy", pick: (m) => m.pricing },
|
|
662
|
+
];
|
|
663
|
+
for (const f of fresh.models ?? []) {
|
|
664
|
+
if (!f.key)
|
|
665
|
+
continue;
|
|
666
|
+
const prev = prevByKey.get(f.key);
|
|
667
|
+
if (!prev)
|
|
668
|
+
continue;
|
|
669
|
+
for (const side of sides) {
|
|
670
|
+
const a = side.pick(prev);
|
|
671
|
+
const b = side.pick(f);
|
|
672
|
+
if (!a || !b)
|
|
673
|
+
continue;
|
|
674
|
+
for (const field of fields) {
|
|
675
|
+
const prevRate = a[field.key];
|
|
676
|
+
const newRate = b[field.key];
|
|
677
|
+
if (typeof prevRate !== "number" || typeof newRate !== "number")
|
|
678
|
+
continue;
|
|
679
|
+
if (prevRate === 0)
|
|
680
|
+
continue; // can't compute delta from zero baseline; skip
|
|
681
|
+
if (prevRate === newRate)
|
|
682
|
+
continue;
|
|
683
|
+
const delta = (newRate - prevRate) / prevRate;
|
|
684
|
+
if (Math.abs(delta) < ANOMALY_DELTA_THRESHOLD)
|
|
685
|
+
continue;
|
|
686
|
+
anomalies.push({
|
|
687
|
+
ts,
|
|
688
|
+
key: f.key,
|
|
689
|
+
field: field.name,
|
|
690
|
+
side: side.name,
|
|
691
|
+
previous: prevRate,
|
|
692
|
+
current: newRate,
|
|
693
|
+
deltaPct: delta,
|
|
694
|
+
promo: hasPromoFlag(prev) || hasPromoFlag(f),
|
|
695
|
+
});
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
return anomalies;
|
|
700
|
+
}
|
|
701
|
+
/** Append fresh anomalies to <manifestDir>/anomalies.json. Atomic write,
|
|
702
|
+
* rolling retention (30 days OR last 5000 entries, whichever is tighter). */
|
|
703
|
+
async function appendAnomalies(manifestDir, fresh) {
|
|
704
|
+
const path = join(manifestDir, ANOMALY_FILE);
|
|
705
|
+
const cutoff = Date.now() - ANOMALY_RETENTION_MS;
|
|
706
|
+
let existing = [];
|
|
707
|
+
try {
|
|
708
|
+
const { readFile } = await import("fs/promises");
|
|
709
|
+
const raw = await readFile(path, "utf-8");
|
|
710
|
+
const parsed = JSON.parse(raw);
|
|
711
|
+
if (Array.isArray(parsed.anomalies))
|
|
712
|
+
existing = parsed.anomalies;
|
|
713
|
+
}
|
|
714
|
+
catch {
|
|
715
|
+
// missing or unreadable — start fresh
|
|
716
|
+
}
|
|
717
|
+
const all = [...existing, ...fresh].filter((a) => a.ts >= cutoff).slice(-ANOMALY_MAX_ENTRIES);
|
|
718
|
+
const tmp = `${path}.${randomBytes(4).toString("hex")}.tmp`;
|
|
719
|
+
try {
|
|
720
|
+
await writeFile(tmp, JSON.stringify({ schemaVersion: 1, anomalies: all }, null, 2), "utf-8");
|
|
721
|
+
await rename(tmp, path);
|
|
722
|
+
}
|
|
723
|
+
catch (err) {
|
|
724
|
+
await unlink(tmp).catch(() => { });
|
|
725
|
+
throw err;
|
|
254
726
|
}
|
|
255
727
|
}
|
|
256
728
|
async function discoverProvider(state, dependencies, discoverer, timeout) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry-runtime.js","sourceRoot":"","sources":["../src/registry-runtime.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"registry-runtime.js","sourceRoot":"","sources":["../src/registry-runtime.ts"],"names":[],"mappings":"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"}
|