offrouter-core 0.2.0 → 0.2.2

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.
Files changed (139) hide show
  1. package/dist/audit.d.ts +137 -0
  2. package/dist/audit.d.ts.map +1 -0
  3. package/dist/audit.js +320 -0
  4. package/dist/audit.js.map +1 -0
  5. package/dist/auth/credential-chain.d.ts +84 -0
  6. package/dist/auth/credential-chain.d.ts.map +1 -0
  7. package/dist/auth/credential-chain.js +150 -0
  8. package/dist/auth/credential-chain.js.map +1 -0
  9. package/dist/auth/index.d.ts +10 -0
  10. package/dist/auth/index.d.ts.map +1 -0
  11. package/dist/auth/index.js +7 -0
  12. package/dist/auth/index.js.map +1 -0
  13. package/dist/auth/keychain.d.ts +60 -0
  14. package/dist/auth/keychain.d.ts.map +1 -0
  15. package/dist/auth/keychain.js +104 -0
  16. package/dist/auth/keychain.js.map +1 -0
  17. package/dist/auth/oauth-pkce.d.ts +138 -0
  18. package/dist/auth/oauth-pkce.d.ts.map +1 -0
  19. package/dist/auth/oauth-pkce.js +375 -0
  20. package/dist/auth/oauth-pkce.js.map +1 -0
  21. package/dist/auth/oauth-server.d.ts +36 -0
  22. package/dist/auth/oauth-server.d.ts.map +1 -0
  23. package/dist/auth/oauth-server.js +210 -0
  24. package/dist/auth/oauth-server.js.map +1 -0
  25. package/dist/config.d.ts +76 -0
  26. package/dist/config.d.ts.map +1 -0
  27. package/dist/config.js +355 -0
  28. package/dist/config.js.map +1 -0
  29. package/dist/delegation.d.ts +123 -0
  30. package/dist/delegation.d.ts.map +1 -0
  31. package/dist/delegation.js +455 -0
  32. package/dist/delegation.js.map +1 -0
  33. package/dist/index.d.ts +41 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +26 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/policy.d.ts +45 -0
  38. package/dist/policy.d.ts.map +1 -0
  39. package/dist/policy.js +318 -0
  40. package/dist/policy.js.map +1 -0
  41. package/{src/protocol.ts → dist/protocol.d.ts} +2 -2
  42. package/dist/protocol.d.ts.map +1 -0
  43. package/dist/protocol.js +6 -0
  44. package/dist/protocol.js.map +1 -0
  45. package/dist/providers/adapter.d.ts +137 -0
  46. package/dist/providers/adapter.d.ts.map +1 -0
  47. package/dist/providers/adapter.js +163 -0
  48. package/dist/providers/adapter.js.map +1 -0
  49. package/dist/providers/catalog-data.d.ts +128 -0
  50. package/dist/providers/catalog-data.d.ts.map +1 -0
  51. package/dist/providers/catalog-data.js +397 -0
  52. package/dist/providers/catalog-data.js.map +1 -0
  53. package/dist/providers/catalog.d.ts +63 -0
  54. package/dist/providers/catalog.d.ts.map +1 -0
  55. package/dist/providers/catalog.js +394 -0
  56. package/dist/providers/catalog.js.map +1 -0
  57. package/dist/providers/fake.d.ts +46 -0
  58. package/dist/providers/fake.d.ts.map +1 -0
  59. package/dist/providers/fake.js +234 -0
  60. package/dist/providers/fake.js.map +1 -0
  61. package/dist/providers/openai-compatible.d.ts +65 -0
  62. package/dist/providers/openai-compatible.d.ts.map +1 -0
  63. package/dist/providers/openai-compatible.js +434 -0
  64. package/dist/providers/openai-compatible.js.map +1 -0
  65. package/dist/proxy/responses-mapper.d.ts +366 -0
  66. package/dist/proxy/responses-mapper.d.ts.map +1 -0
  67. package/dist/proxy/responses-mapper.js +517 -0
  68. package/dist/proxy/responses-mapper.js.map +1 -0
  69. package/dist/proxy/responses-server.d.ts +29 -0
  70. package/dist/proxy/responses-server.d.ts.map +1 -0
  71. package/dist/proxy/responses-server.js +360 -0
  72. package/dist/proxy/responses-server.js.map +1 -0
  73. package/dist/router.d.ts +18 -0
  74. package/dist/router.d.ts.map +1 -0
  75. package/dist/router.js +296 -0
  76. package/dist/router.js.map +1 -0
  77. package/dist/schemas.d.ts +560 -0
  78. package/dist/schemas.d.ts.map +1 -0
  79. package/{src/schemas.ts → dist/schemas.js} +83 -103
  80. package/dist/schemas.js.map +1 -0
  81. package/dist/secrets.d.ts +112 -0
  82. package/dist/secrets.d.ts.map +1 -0
  83. package/dist/secrets.js +326 -0
  84. package/dist/secrets.js.map +1 -0
  85. package/dist/types.d.ts +117 -0
  86. package/dist/types.d.ts.map +1 -0
  87. package/dist/types.js +6 -0
  88. package/dist/types.js.map +1 -0
  89. package/dist/usage-file.d.ts +59 -0
  90. package/dist/usage-file.d.ts.map +1 -0
  91. package/dist/usage-file.js +316 -0
  92. package/dist/usage-file.js.map +1 -0
  93. package/dist/usage.d.ts +235 -0
  94. package/dist/usage.d.ts.map +1 -0
  95. package/dist/usage.js +517 -0
  96. package/dist/usage.js.map +1 -0
  97. package/package.json +9 -4
  98. package/src/audit.test.ts +0 -302
  99. package/src/audit.ts +0 -553
  100. package/src/auth/credential-chain.test.ts +0 -326
  101. package/src/auth/credential-chain.ts +0 -235
  102. package/src/auth/index.ts +0 -45
  103. package/src/auth/keychain.test.ts +0 -265
  104. package/src/auth/keychain.ts +0 -168
  105. package/src/auth/oauth-pkce.test.ts +0 -329
  106. package/src/auth/oauth-pkce.ts +0 -571
  107. package/src/auth/oauth-server.test.ts +0 -83
  108. package/src/auth/oauth-server.ts +0 -296
  109. package/src/config.test.ts +0 -479
  110. package/src/config.ts +0 -505
  111. package/src/delegation.test.ts +0 -368
  112. package/src/delegation.ts +0 -605
  113. package/src/index.ts +0 -280
  114. package/src/policy.test.ts +0 -634
  115. package/src/policy.ts +0 -420
  116. package/src/providers/adapter.test.ts +0 -293
  117. package/src/providers/adapter.ts +0 -328
  118. package/src/providers/catalog-data.test.ts +0 -258
  119. package/src/providers/catalog-data.ts +0 -498
  120. package/src/providers/catalog.test.ts +0 -84
  121. package/src/providers/catalog.ts +0 -483
  122. package/src/providers/fake.ts +0 -312
  123. package/src/providers/openai-compatible.test.ts +0 -366
  124. package/src/providers/openai-compatible.ts +0 -554
  125. package/src/proxy/responses-mapper.test.ts +0 -290
  126. package/src/proxy/responses-mapper.ts +0 -736
  127. package/src/proxy/responses-server.test.ts +0 -322
  128. package/src/proxy/responses-server.ts +0 -469
  129. package/src/router.test.ts +0 -699
  130. package/src/router.ts +0 -352
  131. package/src/schemas.test.ts +0 -291
  132. package/src/secrets.test.ts +0 -271
  133. package/src/secrets.ts +0 -461
  134. package/src/types.ts +0 -173
  135. package/src/usage-file.test.ts +0 -243
  136. package/src/usage-file.ts +0 -435
  137. package/src/usage.test.ts +0 -335
  138. package/src/usage.ts +0 -859
  139. package/tsconfig.json +0 -9
package/dist/usage.js ADDED
@@ -0,0 +1,517 @@
1
+ /**
2
+ * Usage, quota, and provider-health store for OffRouter V1.
3
+ *
4
+ * Distinguishes subscription quota from API-key spend so doctor/status/route
5
+ * explain can say why paid fallback was or was not used.
6
+ *
7
+ * Provider health uses a small sliding-window error budget plus cooldown:
8
+ * - healthy: enough budget remaining, no active cooldown
9
+ * - degraded: elevated errors but still usable
10
+ * - dead: cooldown active after budget exhaustion / hard failures
11
+ *
12
+ * In-memory only for this task; SQLite is deferred until the interface stabilizes.
13
+ */
14
+ import { InMemoryAuditStore, } from "./audit.js";
15
+ export const DEFAULT_NEAR_LIMIT_THRESHOLD = 0.2;
16
+ const DEFAULT_WINDOW_MS = 60_000;
17
+ const DEFAULT_HEALTHY_MAX_ERRORS = 2;
18
+ const DEFAULT_DEAD_MIN_ERRORS = 5;
19
+ const DEFAULT_COOLDOWN_MS = 30_000;
20
+ const HARD_ERROR_KINDS = new Set([
21
+ "auth_failure",
22
+ "quota_exhausted",
23
+ ]);
24
+ /**
25
+ * In-memory usage/health store.
26
+ * Mutations are serialized so concurrent updates never lose counters.
27
+ */
28
+ export class InMemoryUsageStore {
29
+ #providers = new Map();
30
+ #accounts = new Map();
31
+ #windowMs;
32
+ #healthyMaxErrors;
33
+ #deadMinErrors;
34
+ #cooldownMs;
35
+ #now;
36
+ #chain = Promise.resolve();
37
+ constructor(options = {}) {
38
+ this.#windowMs = options.windowMs ?? DEFAULT_WINDOW_MS;
39
+ this.#healthyMaxErrors =
40
+ options.healthyMaxErrors ?? DEFAULT_HEALTHY_MAX_ERRORS;
41
+ this.#deadMinErrors = options.deadMinErrors ?? DEFAULT_DEAD_MIN_ERRORS;
42
+ this.#cooldownMs = options.cooldownMs ?? DEFAULT_COOLDOWN_MS;
43
+ this.#now = options.now ?? (() => new Date());
44
+ if (this.#healthyMaxErrors < 0 ||
45
+ this.#deadMinErrors <= this.#healthyMaxErrors) {
46
+ throw new RangeError("healthyMaxErrors must be >= 0 and deadMinErrors must be > healthyMaxErrors");
47
+ }
48
+ }
49
+ #exclusive(fn) {
50
+ const run = this.#chain.then(fn, fn);
51
+ this.#chain = run.then(() => undefined, () => undefined);
52
+ return run;
53
+ }
54
+ async record(event) {
55
+ return this.#exclusive(() => {
56
+ const at = event.at ?? this.#now();
57
+ const state = this.#ensure(event.providerId, event.modelId, at);
58
+ const previousHealth = state.health;
59
+ if (event.modelId)
60
+ state.modelId = event.modelId;
61
+ switch (event.kind) {
62
+ case "request_success":
63
+ state.successCount += 1;
64
+ state.lastSuccessAt = at.toISOString();
65
+ this.#pruneErrors(state, at.getTime());
66
+ break;
67
+ case "request_error":
68
+ case "rate_limited":
69
+ case "timeout":
70
+ case "auth_failure":
71
+ case "quota_exhausted":
72
+ state.errorCount += 1;
73
+ state.errorTimestamps.push(at.getTime());
74
+ state.lastErrorAt = at.toISOString();
75
+ state.lastErrorKind = event.kind;
76
+ if (event.kind === "rate_limited") {
77
+ state.subscriptionStatus =
78
+ state.subscriptionStatus === "exhausted"
79
+ ? "exhausted"
80
+ : "rate-limited";
81
+ }
82
+ if (event.kind === "quota_exhausted") {
83
+ if (event.authTier === "subscription") {
84
+ state.subscriptionStatus = "exhausted";
85
+ if (state.subscriptionQuotaLimit !== undefined &&
86
+ state.subscriptionQuotaUsed < state.subscriptionQuotaLimit) {
87
+ state.subscriptionQuotaUsed = state.subscriptionQuotaLimit;
88
+ }
89
+ }
90
+ }
91
+ if (HARD_ERROR_KINDS.has(event.kind)) {
92
+ state.cooldownUntil = at.getTime() + this.#cooldownMs;
93
+ }
94
+ break;
95
+ case "cancelled":
96
+ // Cancellation is not a provider-health error by default.
97
+ break;
98
+ case "subscription_quota_set":
99
+ if (event.quotaLimit !== undefined) {
100
+ state.subscriptionQuotaLimit = event.quotaLimit;
101
+ }
102
+ if (event.amount !== undefined) {
103
+ state.subscriptionQuotaUsed = event.amount;
104
+ }
105
+ if (event.subscriptionStatus) {
106
+ state.subscriptionStatus = event.subscriptionStatus;
107
+ }
108
+ break;
109
+ case "subscription_usage": {
110
+ const units = event.amount ?? 1;
111
+ state.subscriptionQuotaUsed += units;
112
+ state.successCount += 1;
113
+ state.lastSuccessAt = at.toISOString();
114
+ if (state.subscriptionQuotaLimit !== undefined &&
115
+ state.subscriptionQuotaUsed >= state.subscriptionQuotaLimit) {
116
+ state.subscriptionStatus = "exhausted";
117
+ }
118
+ else if (!state.subscriptionStatus ||
119
+ state.subscriptionStatus === "unknown") {
120
+ state.subscriptionStatus = "active";
121
+ }
122
+ break;
123
+ }
124
+ case "api_key_spend": {
125
+ const usd = event.amount ?? 0;
126
+ if (usd < 0) {
127
+ throw new RangeError("api_key_spend amount must be >= 0");
128
+ }
129
+ state.apiKeySpendUsd += usd;
130
+ state.successCount += 1;
131
+ state.lastSuccessAt = at.toISOString();
132
+ break;
133
+ }
134
+ default: {
135
+ const _exhaustive = event.kind;
136
+ throw new Error(`Unhandled usage event kind: ${String(_exhaustive)}`);
137
+ }
138
+ }
139
+ if (event.subscriptionStatus) {
140
+ state.subscriptionStatus = event.subscriptionStatus;
141
+ }
142
+ this.#recomputeHealth(state, at.getTime(), event);
143
+ state.updatedAt = at.toISOString();
144
+ return {
145
+ snapshot: toSnapshot(state),
146
+ healthChanged: previousHealth !== state.health,
147
+ previousHealth,
148
+ };
149
+ });
150
+ }
151
+ async getProvider(providerId) {
152
+ const state = this.#providers.get(providerId);
153
+ if (!state)
154
+ return undefined;
155
+ const now = this.#now();
156
+ this.#recomputeHealth(state, now.getTime());
157
+ state.updatedAt = now.toISOString();
158
+ return toSnapshot(state);
159
+ }
160
+ async listProviders() {
161
+ const now = this.#now();
162
+ const out = [];
163
+ for (const state of this.#providers.values()) {
164
+ this.#recomputeHealth(state, now.getTime());
165
+ state.updatedAt = now.toISOString();
166
+ out.push(toSnapshot(state));
167
+ }
168
+ return out.sort((a, b) => a.providerId.localeCompare(b.providerId));
169
+ }
170
+ async setSubscriptionQuota(providerId, input) {
171
+ const result = await this.record({
172
+ providerId,
173
+ modelId: input.modelId,
174
+ authTier: "subscription",
175
+ kind: "subscription_quota_set",
176
+ amount: input.used,
177
+ quotaLimit: input.limit,
178
+ subscriptionStatus: input.status,
179
+ at: input.at,
180
+ });
181
+ return result.snapshot;
182
+ }
183
+ async explainPaidFallback(providerId, options = {}) {
184
+ const snap = await this.getProvider(providerId);
185
+ const hasApiKey = options.hasApiKeyCandidate === true;
186
+ const apiKeySpendUsd = snap?.apiKeySpendUsd ?? 0;
187
+ if (!snap) {
188
+ return {
189
+ providerId,
190
+ recommendation: hasApiKey ? "api_key_only" : "no_capacity",
191
+ reason: hasApiKey
192
+ ? "No subscription usage recorded for this provider; API-key candidate may be used if policy allows."
193
+ : "No usage recorded and no API-key candidate announced.",
194
+ apiKeySpendUsd: 0,
195
+ usedPaidFallback: false,
196
+ };
197
+ }
198
+ const subStatus = snap.subscriptionStatus;
199
+ const remaining = snap.subscriptionQuotaRemaining;
200
+ const health = snap.health;
201
+ const subscriptionUsable = health !== "dead" &&
202
+ subStatus !== "exhausted" &&
203
+ subStatus !== "expired" &&
204
+ subStatus !== "unconfigured" &&
205
+ (remaining === undefined || remaining > 0);
206
+ if (subscriptionUsable) {
207
+ if (subStatus === "rate-limited" || health === "degraded") {
208
+ return {
209
+ providerId,
210
+ recommendation: hasApiKey
211
+ ? "allow_api_key_fallback"
212
+ : "prefer_subscription",
213
+ reason: subStatus === "rate-limited"
214
+ ? "Subscription is rate-limited; API-key fallback is justified if policy allows."
215
+ : "Subscription capacity is degraded; API-key fallback is available if policy allows.",
216
+ subscriptionStatus: subStatus,
217
+ subscriptionQuotaRemaining: remaining,
218
+ subscriptionHealth: health,
219
+ apiKeySpendUsd,
220
+ usedPaidFallback: apiKeySpendUsd > 0,
221
+ };
222
+ }
223
+ return {
224
+ providerId,
225
+ recommendation: "prefer_subscription",
226
+ reason: remaining === undefined
227
+ ? "Healthy subscription capacity is preferred over paid API-key routes."
228
+ : `Subscription still has ${remaining} quota units remaining; paid API-key fallback should not be used yet.`,
229
+ subscriptionStatus: subStatus ?? "active",
230
+ subscriptionQuotaRemaining: remaining,
231
+ subscriptionHealth: health,
232
+ apiKeySpendUsd,
233
+ usedPaidFallback: apiKeySpendUsd > 0,
234
+ };
235
+ }
236
+ if (hasApiKey) {
237
+ let reason;
238
+ if (subStatus === "exhausted" ||
239
+ (remaining !== undefined && remaining <= 0)) {
240
+ reason =
241
+ "Subscription quota is exhausted; paid API-key fallback is justified if policy allows.";
242
+ }
243
+ else if (subStatus === "expired") {
244
+ reason =
245
+ "Subscription is expired; paid API-key fallback is justified if policy allows.";
246
+ }
247
+ else if (subStatus === "unconfigured") {
248
+ reason =
249
+ "Subscription is unconfigured; paid API-key fallback is justified if policy allows.";
250
+ }
251
+ else if (health === "dead") {
252
+ reason = `Subscription provider is dead${snap.cooldownUntil
253
+ ? ` until ${new Date(snap.cooldownUntil).toISOString()}`
254
+ : ""}; paid API-key fallback is justified if policy allows.`;
255
+ }
256
+ else {
257
+ reason =
258
+ "Subscription capacity is unavailable; paid API-key fallback is justified if policy allows.";
259
+ }
260
+ return {
261
+ providerId,
262
+ recommendation: "allow_api_key_fallback",
263
+ reason,
264
+ subscriptionStatus: subStatus,
265
+ subscriptionQuotaRemaining: remaining,
266
+ subscriptionHealth: health,
267
+ apiKeySpendUsd,
268
+ usedPaidFallback: apiKeySpendUsd > 0,
269
+ };
270
+ }
271
+ return {
272
+ providerId,
273
+ recommendation: "no_capacity",
274
+ reason: "Subscription capacity is unavailable and no API-key candidate is available.",
275
+ subscriptionStatus: subStatus,
276
+ subscriptionQuotaRemaining: remaining,
277
+ subscriptionHealth: health,
278
+ apiKeySpendUsd,
279
+ usedPaidFallback: false,
280
+ };
281
+ }
282
+ async recordUsage(providerId, accountId, input) {
283
+ return this.#exclusive(() => {
284
+ const at = input.at ?? this.#now();
285
+ const key = `${providerId}:${accountId}`;
286
+ let state = this.#accounts.get(key);
287
+ if (!state) {
288
+ state = { providerId, accountId, used: 0, updatedAt: at.toISOString() };
289
+ this.#accounts.set(key, state);
290
+ }
291
+ if (input.used !== undefined)
292
+ state.used = input.used;
293
+ if (input.limit !== undefined)
294
+ state.limit = input.limit;
295
+ state.updatedAt = at.toISOString();
296
+ return computeAccountSnapshot(state);
297
+ });
298
+ }
299
+ async isNearLimit(providerId, accountId, threshold) {
300
+ return this.#exclusive(() => {
301
+ const key = `${providerId}:${accountId}`;
302
+ const state = this.#accounts.get(key);
303
+ if (!state)
304
+ return false;
305
+ return computeAccountSnapshot(state, threshold).nearLimit;
306
+ });
307
+ }
308
+ async getNearLimitAccounts(threshold) {
309
+ return this.#exclusive(() => {
310
+ const out = [];
311
+ for (const state of this.#accounts.values()) {
312
+ const snap = computeAccountSnapshot(state, threshold);
313
+ if (snap.nearLimit)
314
+ out.push(snap);
315
+ }
316
+ return out.sort((a, b) => {
317
+ if (a.providerId !== b.providerId)
318
+ return a.providerId.localeCompare(b.providerId);
319
+ return a.accountId.localeCompare(b.accountId);
320
+ });
321
+ });
322
+ }
323
+ async getAccountUsage(providerId, accountId) {
324
+ return this.#exclusive(() => {
325
+ const key = `${providerId}:${accountId}`;
326
+ const state = this.#accounts.get(key);
327
+ if (!state)
328
+ return undefined;
329
+ return computeAccountSnapshot(state);
330
+ });
331
+ }
332
+ async listAccountUsage() {
333
+ return this.#exclusive(() => {
334
+ const out = [];
335
+ for (const state of this.#accounts.values()) {
336
+ out.push(computeAccountSnapshot(state));
337
+ }
338
+ return out.sort((a, b) => {
339
+ if (a.providerId !== b.providerId)
340
+ return a.providerId.localeCompare(b.providerId);
341
+ return a.accountId.localeCompare(b.accountId);
342
+ });
343
+ });
344
+ }
345
+ toJSON() {
346
+ const providers = {};
347
+ for (const [id, state] of this.#providers) {
348
+ providers[id] = {
349
+ health: state.health,
350
+ healthReason: state.healthReason,
351
+ subscriptionQuotaLimit: state.subscriptionQuotaLimit,
352
+ subscriptionQuotaUsed: state.subscriptionQuotaUsed,
353
+ subscriptionStatus: state.subscriptionStatus,
354
+ apiKeySpendUsd: state.apiKeySpendUsd,
355
+ successCount: state.successCount,
356
+ errorCount: state.errorCount,
357
+ cooldownUntil: state.cooldownUntil,
358
+ };
359
+ }
360
+ return {
361
+ kind: "in-memory-usage",
362
+ providers,
363
+ accounts: Object.fromEntries(this.#accounts),
364
+ };
365
+ }
366
+ #ensure(providerId, modelId, at) {
367
+ let state = this.#providers.get(providerId);
368
+ if (!state) {
369
+ state = {
370
+ providerId,
371
+ modelId,
372
+ errorTimestamps: [],
373
+ health: "healthy",
374
+ subscriptionQuotaUsed: 0,
375
+ apiKeySpendUsd: 0,
376
+ successCount: 0,
377
+ errorCount: 0,
378
+ updatedAt: at.toISOString(),
379
+ };
380
+ this.#providers.set(providerId, state);
381
+ }
382
+ return state;
383
+ }
384
+ #pruneErrors(state, nowMs) {
385
+ const cutoff = nowMs - this.#windowMs;
386
+ state.errorTimestamps = state.errorTimestamps.filter((t) => t >= cutoff);
387
+ }
388
+ #recomputeHealth(state, nowMs, event) {
389
+ this.#pruneErrors(state, nowMs);
390
+ if (state.cooldownUntil !== undefined && state.cooldownUntil <= nowMs) {
391
+ state.cooldownUntil = undefined;
392
+ }
393
+ const errors = state.errorTimestamps.length;
394
+ let health;
395
+ let reason;
396
+ if (state.cooldownUntil !== undefined && state.cooldownUntil > nowMs) {
397
+ health = "dead";
398
+ reason = `Cooldown active until ${new Date(state.cooldownUntil).toISOString()}`;
399
+ }
400
+ else if (state.subscriptionStatus === "exhausted" ||
401
+ (state.subscriptionQuotaLimit !== undefined &&
402
+ state.subscriptionQuotaUsed >= state.subscriptionQuotaLimit)) {
403
+ if (event?.kind === "quota_exhausted" && state.cooldownUntil) {
404
+ health = "dead";
405
+ reason = "Subscription quota exhausted; cooldown applied";
406
+ }
407
+ else if (errors >= this.#deadMinErrors) {
408
+ health = "dead";
409
+ reason = `Error budget exhausted (${errors} errors in ${this.#windowMs}ms window) with subscription quota exhausted`;
410
+ state.cooldownUntil = nowMs + this.#cooldownMs;
411
+ }
412
+ else {
413
+ health = "degraded";
414
+ reason = "Subscription quota exhausted";
415
+ }
416
+ }
417
+ else if (errors >= this.#deadMinErrors) {
418
+ health = "dead";
419
+ reason = `Error budget exhausted (${errors} errors in ${this.#windowMs}ms window)`;
420
+ state.cooldownUntil = nowMs + this.#cooldownMs;
421
+ }
422
+ else if (errors > this.#healthyMaxErrors) {
423
+ health = "degraded";
424
+ reason = `Elevated error rate (${errors} errors in ${this.#windowMs}ms window)`;
425
+ }
426
+ else {
427
+ health = "healthy";
428
+ reason =
429
+ errors === 0
430
+ ? "No recent errors"
431
+ : `Within error budget (${errors}/${this.#healthyMaxErrors} allowed)`;
432
+ }
433
+ state.health = health;
434
+ state.healthReason = reason;
435
+ }
436
+ }
437
+ function toSnapshot(state) {
438
+ const limit = state.subscriptionQuotaLimit;
439
+ const used = state.subscriptionQuotaUsed;
440
+ const remaining = limit === undefined ? undefined : Math.max(0, limit - used);
441
+ return {
442
+ providerId: state.providerId,
443
+ modelId: state.modelId,
444
+ health: state.health,
445
+ healthReason: state.healthReason,
446
+ recentErrorCount: state.errorTimestamps.length,
447
+ cooldownUntil: state.cooldownUntil,
448
+ subscriptionQuotaLimit: limit,
449
+ subscriptionQuotaUsed: used,
450
+ subscriptionQuotaRemaining: remaining,
451
+ subscriptionStatus: state.subscriptionStatus,
452
+ apiKeySpendUsd: state.apiKeySpendUsd,
453
+ successCount: state.successCount,
454
+ errorCount: state.errorCount,
455
+ lastErrorAt: state.lastErrorAt,
456
+ lastErrorKind: state.lastErrorKind,
457
+ lastSuccessAt: state.lastSuccessAt,
458
+ updatedAt: state.updatedAt,
459
+ };
460
+ }
461
+ export function computeAccountSnapshot(doc, threshold = DEFAULT_NEAR_LIMIT_THRESHOLD) {
462
+ const limit = doc.limit;
463
+ const used = doc.used;
464
+ const remaining = limit === undefined ? undefined : Math.max(0, limit - used);
465
+ let status;
466
+ let nearLimit = false;
467
+ let health;
468
+ if (limit === undefined) {
469
+ status = "unknown";
470
+ health = "healthy";
471
+ }
472
+ else if (used >= limit) {
473
+ status = "exhausted";
474
+ health = "dead";
475
+ }
476
+ else if ((limit - used) / limit < threshold) {
477
+ status = "near-limit";
478
+ nearLimit = true;
479
+ health = "degraded";
480
+ }
481
+ else {
482
+ status = "active";
483
+ health = "healthy";
484
+ }
485
+ const percentRemaining = limit === undefined
486
+ ? undefined
487
+ : Math.round(((limit - used) / limit) * 100);
488
+ return {
489
+ providerId: doc.providerId,
490
+ accountId: doc.accountId,
491
+ used,
492
+ limit,
493
+ remaining,
494
+ percentRemaining,
495
+ nearLimit,
496
+ subscriptionStatus: status,
497
+ health,
498
+ updatedAt: doc.updatedAt,
499
+ };
500
+ }
501
+ export class InMemoryStateStore {
502
+ audit;
503
+ usage;
504
+ constructor(options) {
505
+ this.audit = options?.audit ?? new InMemoryAuditStore(options?.auditOptions);
506
+ this.usage =
507
+ options?.usage ?? new InMemoryUsageStore(options?.usageOptions);
508
+ }
509
+ toJSON() {
510
+ return {
511
+ kind: "in-memory-state",
512
+ audit: this.audit.toJSON(),
513
+ usage: this.usage.toJSON(),
514
+ };
515
+ }
516
+ }
517
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "offrouter-core",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -15,7 +15,12 @@
15
15
  "test": "vitest run"
16
16
  },
17
17
  "dependencies": {
18
- "smol-toml": "0.0.0",
19
- "zod": "0.0.0"
20
- }
18
+ "smol-toml": "^1.7.0",
19
+ "zod": "^3.23.0"
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "README.md",
24
+ "LICENSE"
25
+ ]
21
26
  }