@claudexor/schema 3.3.10 → 3.3.12
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/config.d.ts +22 -6
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +16 -4
- package/dist/config.js.map +1 -1
- package/dist/control.js +2 -2
- package/dist/control.js.map +1 -1
- package/dist/credential-profile-snapshot.d.ts +194 -0
- package/dist/credential-profile-snapshot.d.ts.map +1 -1
- package/dist/quota.d.ts +314 -0
- package/dist/quota.d.ts.map +1 -1
- package/dist/quota.js +151 -1
- package/dist/quota.js.map +1 -1
- package/generated/ControlCredentialProfilesQueryResponse.schema.json +79 -1
- package/generated/ControlCredentialProfilesSnapshotResponse.schema.json +79 -1
- package/generated/ControlQuotaRefreshRequest.schema.json +18 -0
- package/generated/ControlQuotaResponse.schema.json +79 -1
- package/generated/ControlSettingsSnapshot.schema.json +1 -1
- package/generated/GlobalConfig.schema.json +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-profile-snapshot.d.ts","sourceRoot":"","sources":["../src/credential-profile-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAM3B;+EAC+E;AAC/E,eAAO,MAAM,yCAAyC
|
|
1
|
+
{"version":3,"file":"credential-profile-snapshot.d.ts","sourceRoot":"","sources":["../src/credential-profile-snapshot.ts"],"names":[],"mappings":"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"}
|
package/dist/quota.d.ts
CHANGED
|
@@ -199,6 +199,218 @@ export declare const QuotaAbsence: z.ZodObject<{
|
|
|
199
199
|
observed_at: string;
|
|
200
200
|
}>;
|
|
201
201
|
export type QuotaAbsence = z.infer<typeof QuotaAbsence>;
|
|
202
|
+
export declare const QuotaAvailabilityState: z.ZodEnum<["available", "exhausted", "cooldown"]>;
|
|
203
|
+
export type QuotaAvailabilityState = z.infer<typeof QuotaAvailabilityState>;
|
|
204
|
+
export declare const QuotaModelScopedExhaustion: z.ZodObject<{
|
|
205
|
+
constraint_id: z.ZodString;
|
|
206
|
+
applies_to_models: z.ZodArray<z.ZodString, "many">;
|
|
207
|
+
resets_at: z.ZodNullable<z.ZodString>;
|
|
208
|
+
}, "strict", z.ZodTypeAny, {
|
|
209
|
+
constraint_id: string;
|
|
210
|
+
applies_to_models: string[];
|
|
211
|
+
resets_at: string | null;
|
|
212
|
+
}, {
|
|
213
|
+
constraint_id: string;
|
|
214
|
+
applies_to_models: string[];
|
|
215
|
+
resets_at: string | null;
|
|
216
|
+
}>;
|
|
217
|
+
export type QuotaModelScopedExhaustion = z.infer<typeof QuotaModelScopedExhaustion>;
|
|
218
|
+
export declare const QuotaAvailability: z.ZodObject<{
|
|
219
|
+
state: z.ZodEnum<["available", "exhausted", "cooldown"]>;
|
|
220
|
+
blocking_constraints: z.ZodArray<z.ZodString, "many">;
|
|
221
|
+
resets_at: z.ZodNullable<z.ZodString>;
|
|
222
|
+
model_scoped_exhaustions: z.ZodArray<z.ZodObject<{
|
|
223
|
+
constraint_id: z.ZodString;
|
|
224
|
+
applies_to_models: z.ZodArray<z.ZodString, "many">;
|
|
225
|
+
resets_at: z.ZodNullable<z.ZodString>;
|
|
226
|
+
}, "strict", z.ZodTypeAny, {
|
|
227
|
+
constraint_id: string;
|
|
228
|
+
applies_to_models: string[];
|
|
229
|
+
resets_at: string | null;
|
|
230
|
+
}, {
|
|
231
|
+
constraint_id: string;
|
|
232
|
+
applies_to_models: string[];
|
|
233
|
+
resets_at: string | null;
|
|
234
|
+
}>, "many">;
|
|
235
|
+
}, "strict", z.ZodTypeAny, {
|
|
236
|
+
state: "available" | "cooldown" | "exhausted";
|
|
237
|
+
blocking_constraints: string[];
|
|
238
|
+
resets_at: string | null;
|
|
239
|
+
model_scoped_exhaustions: {
|
|
240
|
+
constraint_id: string;
|
|
241
|
+
applies_to_models: string[];
|
|
242
|
+
resets_at: string | null;
|
|
243
|
+
}[];
|
|
244
|
+
}, {
|
|
245
|
+
state: "available" | "cooldown" | "exhausted";
|
|
246
|
+
blocking_constraints: string[];
|
|
247
|
+
resets_at: string | null;
|
|
248
|
+
model_scoped_exhaustions: {
|
|
249
|
+
constraint_id: string;
|
|
250
|
+
applies_to_models: string[];
|
|
251
|
+
resets_at: string | null;
|
|
252
|
+
}[];
|
|
253
|
+
}>;
|
|
254
|
+
export type QuotaAvailability = z.infer<typeof QuotaAvailability>;
|
|
255
|
+
export declare const ControlQuotaSnapshot: z.ZodObject<{
|
|
256
|
+
subject: z.ZodObject<{
|
|
257
|
+
harness: z.ZodString;
|
|
258
|
+
credential_route: z.ZodEnum<["vendor_native", "managed_api_key", "local"]>;
|
|
259
|
+
plan_label: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
260
|
+
/** The CREDENTIAL SUBJECT the windows belong to (release wave round-16
|
|
261
|
+
* #2): a Claudexor credential-profile id, or null for the harness's
|
|
262
|
+
* engine-default credential. Every producer (oauth-usage refresher,
|
|
263
|
+
* typed-event registry, adapter quota events) uses exactly this
|
|
264
|
+
* vocabulary; budget routing filters snapshots by exact subject so one
|
|
265
|
+
* account's exhaustion never cools another. */
|
|
266
|
+
subject_id: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
267
|
+
}, "strict", z.ZodTypeAny, {
|
|
268
|
+
harness: string;
|
|
269
|
+
credential_route: "local" | "managed_api_key" | "vendor_native";
|
|
270
|
+
plan_label: string | null;
|
|
271
|
+
subject_id: string | null;
|
|
272
|
+
}, {
|
|
273
|
+
harness: string;
|
|
274
|
+
credential_route: "local" | "managed_api_key" | "vendor_native";
|
|
275
|
+
plan_label?: string | null | undefined;
|
|
276
|
+
subject_id?: string | null | undefined;
|
|
277
|
+
}>;
|
|
278
|
+
constraints: z.ZodArray<z.ZodObject<{
|
|
279
|
+
id: z.ZodString;
|
|
280
|
+
label: z.ZodString;
|
|
281
|
+
/** omitted/null = this vendor window applies to every model. A non-null
|
|
282
|
+
* list is the producer's canonical model-id/alias scope, so a
|
|
283
|
+
* model-specific cap never cools a different model on the same subject. */
|
|
284
|
+
applies_to_models: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString, "many">>>;
|
|
285
|
+
used_ratio: z.ZodNullable<z.ZodNumber>;
|
|
286
|
+
window_seconds: z.ZodNullable<z.ZodNumber>;
|
|
287
|
+
resets_at: z.ZodNullable<z.ZodString>;
|
|
288
|
+
cooldown_until: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
289
|
+
}, "strict", z.ZodTypeAny, {
|
|
290
|
+
id: string;
|
|
291
|
+
label: string;
|
|
292
|
+
applies_to_models?: string[] | null | undefined;
|
|
293
|
+
used_ratio: number | null;
|
|
294
|
+
window_seconds: number | null;
|
|
295
|
+
resets_at: string | null;
|
|
296
|
+
cooldown_until: string | null;
|
|
297
|
+
}, {
|
|
298
|
+
id: string;
|
|
299
|
+
label: string;
|
|
300
|
+
applies_to_models?: string[] | null | undefined;
|
|
301
|
+
used_ratio: number | null;
|
|
302
|
+
window_seconds: number | null;
|
|
303
|
+
resets_at: string | null;
|
|
304
|
+
cooldown_until?: string | null | undefined;
|
|
305
|
+
}>, "many">;
|
|
306
|
+
source: z.ZodEnum<["codex_app_server", "codex_rollout", "claude_statusline", "claude_api_retry", "claude_oauth_usage"]>;
|
|
307
|
+
observed_at: z.ZodString;
|
|
308
|
+
freshness: z.ZodEnum<["fresh", "stale", "unknown"]>;
|
|
309
|
+
} & {
|
|
310
|
+
availability: z.ZodOptional<z.ZodObject<{
|
|
311
|
+
state: z.ZodEnum<["available", "exhausted", "cooldown"]>;
|
|
312
|
+
blocking_constraints: z.ZodArray<z.ZodString, "many">;
|
|
313
|
+
resets_at: z.ZodNullable<z.ZodString>;
|
|
314
|
+
model_scoped_exhaustions: z.ZodArray<z.ZodObject<{
|
|
315
|
+
constraint_id: z.ZodString;
|
|
316
|
+
applies_to_models: z.ZodArray<z.ZodString, "many">;
|
|
317
|
+
resets_at: z.ZodNullable<z.ZodString>;
|
|
318
|
+
}, "strict", z.ZodTypeAny, {
|
|
319
|
+
constraint_id: string;
|
|
320
|
+
applies_to_models: string[];
|
|
321
|
+
resets_at: string | null;
|
|
322
|
+
}, {
|
|
323
|
+
constraint_id: string;
|
|
324
|
+
applies_to_models: string[];
|
|
325
|
+
resets_at: string | null;
|
|
326
|
+
}>, "many">;
|
|
327
|
+
}, "strict", z.ZodTypeAny, {
|
|
328
|
+
state: "available" | "cooldown" | "exhausted";
|
|
329
|
+
blocking_constraints: string[];
|
|
330
|
+
resets_at: string | null;
|
|
331
|
+
model_scoped_exhaustions: {
|
|
332
|
+
constraint_id: string;
|
|
333
|
+
applies_to_models: string[];
|
|
334
|
+
resets_at: string | null;
|
|
335
|
+
}[];
|
|
336
|
+
}, {
|
|
337
|
+
state: "available" | "cooldown" | "exhausted";
|
|
338
|
+
blocking_constraints: string[];
|
|
339
|
+
resets_at: string | null;
|
|
340
|
+
model_scoped_exhaustions: {
|
|
341
|
+
constraint_id: string;
|
|
342
|
+
applies_to_models: string[];
|
|
343
|
+
resets_at: string | null;
|
|
344
|
+
}[];
|
|
345
|
+
}>>;
|
|
346
|
+
}, "strict", z.ZodTypeAny, {
|
|
347
|
+
subject: {
|
|
348
|
+
harness: string;
|
|
349
|
+
credential_route: "local" | "managed_api_key" | "vendor_native";
|
|
350
|
+
plan_label: string | null;
|
|
351
|
+
subject_id: string | null;
|
|
352
|
+
};
|
|
353
|
+
constraints: {
|
|
354
|
+
id: string;
|
|
355
|
+
label: string;
|
|
356
|
+
applies_to_models?: string[] | null | undefined;
|
|
357
|
+
used_ratio: number | null;
|
|
358
|
+
window_seconds: number | null;
|
|
359
|
+
resets_at: string | null;
|
|
360
|
+
cooldown_until: string | null;
|
|
361
|
+
}[];
|
|
362
|
+
source: "claude_api_retry" | "claude_oauth_usage" | "claude_statusline" | "codex_app_server" | "codex_rollout";
|
|
363
|
+
observed_at: string;
|
|
364
|
+
freshness: "fresh" | "stale" | "unknown";
|
|
365
|
+
availability?: {
|
|
366
|
+
state: "available" | "cooldown" | "exhausted";
|
|
367
|
+
blocking_constraints: string[];
|
|
368
|
+
resets_at: string | null;
|
|
369
|
+
model_scoped_exhaustions: {
|
|
370
|
+
constraint_id: string;
|
|
371
|
+
applies_to_models: string[];
|
|
372
|
+
resets_at: string | null;
|
|
373
|
+
}[];
|
|
374
|
+
} | undefined;
|
|
375
|
+
}, {
|
|
376
|
+
subject: {
|
|
377
|
+
harness: string;
|
|
378
|
+
credential_route: "local" | "managed_api_key" | "vendor_native";
|
|
379
|
+
plan_label?: string | null | undefined;
|
|
380
|
+
subject_id?: string | null | undefined;
|
|
381
|
+
};
|
|
382
|
+
constraints: {
|
|
383
|
+
id: string;
|
|
384
|
+
label: string;
|
|
385
|
+
applies_to_models?: string[] | null | undefined;
|
|
386
|
+
used_ratio: number | null;
|
|
387
|
+
window_seconds: number | null;
|
|
388
|
+
resets_at: string | null;
|
|
389
|
+
cooldown_until?: string | null | undefined;
|
|
390
|
+
}[];
|
|
391
|
+
source: "claude_api_retry" | "claude_oauth_usage" | "claude_statusline" | "codex_app_server" | "codex_rollout";
|
|
392
|
+
observed_at: string;
|
|
393
|
+
freshness: "fresh" | "stale" | "unknown";
|
|
394
|
+
availability?: {
|
|
395
|
+
state: "available" | "cooldown" | "exhausted";
|
|
396
|
+
blocking_constraints: string[];
|
|
397
|
+
resets_at: string | null;
|
|
398
|
+
model_scoped_exhaustions: {
|
|
399
|
+
constraint_id: string;
|
|
400
|
+
applies_to_models: string[];
|
|
401
|
+
resets_at: string | null;
|
|
402
|
+
}[];
|
|
403
|
+
} | undefined;
|
|
404
|
+
}>;
|
|
405
|
+
export type ControlQuotaSnapshot = z.infer<typeof ControlQuotaSnapshot>;
|
|
406
|
+
export declare const ControlQuotaRefreshRequest: z.ZodObject<{
|
|
407
|
+
model: z.ZodOptional<z.ZodString>;
|
|
408
|
+
}, "strict", z.ZodTypeAny, {
|
|
409
|
+
model?: string | undefined;
|
|
410
|
+
}, {
|
|
411
|
+
model?: string | undefined;
|
|
412
|
+
}>;
|
|
413
|
+
export type ControlQuotaRefreshRequest = z.infer<typeof ControlQuotaRefreshRequest>;
|
|
202
414
|
export declare const ControlQuotaResponse: z.ZodObject<{
|
|
203
415
|
snapshots: z.ZodArray<z.ZodObject<{
|
|
204
416
|
subject: z.ZodObject<{
|
|
@@ -254,6 +466,43 @@ export declare const ControlQuotaResponse: z.ZodObject<{
|
|
|
254
466
|
source: z.ZodEnum<["codex_app_server", "codex_rollout", "claude_statusline", "claude_api_retry", "claude_oauth_usage"]>;
|
|
255
467
|
observed_at: z.ZodString;
|
|
256
468
|
freshness: z.ZodEnum<["fresh", "stale", "unknown"]>;
|
|
469
|
+
} & {
|
|
470
|
+
availability: z.ZodOptional<z.ZodObject<{
|
|
471
|
+
state: z.ZodEnum<["available", "exhausted", "cooldown"]>;
|
|
472
|
+
blocking_constraints: z.ZodArray<z.ZodString, "many">;
|
|
473
|
+
resets_at: z.ZodNullable<z.ZodString>;
|
|
474
|
+
model_scoped_exhaustions: z.ZodArray<z.ZodObject<{
|
|
475
|
+
constraint_id: z.ZodString;
|
|
476
|
+
applies_to_models: z.ZodArray<z.ZodString, "many">;
|
|
477
|
+
resets_at: z.ZodNullable<z.ZodString>;
|
|
478
|
+
}, "strict", z.ZodTypeAny, {
|
|
479
|
+
constraint_id: string;
|
|
480
|
+
applies_to_models: string[];
|
|
481
|
+
resets_at: string | null;
|
|
482
|
+
}, {
|
|
483
|
+
constraint_id: string;
|
|
484
|
+
applies_to_models: string[];
|
|
485
|
+
resets_at: string | null;
|
|
486
|
+
}>, "many">;
|
|
487
|
+
}, "strict", z.ZodTypeAny, {
|
|
488
|
+
state: "available" | "cooldown" | "exhausted";
|
|
489
|
+
blocking_constraints: string[];
|
|
490
|
+
resets_at: string | null;
|
|
491
|
+
model_scoped_exhaustions: {
|
|
492
|
+
constraint_id: string;
|
|
493
|
+
applies_to_models: string[];
|
|
494
|
+
resets_at: string | null;
|
|
495
|
+
}[];
|
|
496
|
+
}, {
|
|
497
|
+
state: "available" | "cooldown" | "exhausted";
|
|
498
|
+
blocking_constraints: string[];
|
|
499
|
+
resets_at: string | null;
|
|
500
|
+
model_scoped_exhaustions: {
|
|
501
|
+
constraint_id: string;
|
|
502
|
+
applies_to_models: string[];
|
|
503
|
+
resets_at: string | null;
|
|
504
|
+
}[];
|
|
505
|
+
}>>;
|
|
257
506
|
}, "strict", z.ZodTypeAny, {
|
|
258
507
|
subject: {
|
|
259
508
|
harness: string;
|
|
@@ -273,6 +522,16 @@ export declare const ControlQuotaResponse: z.ZodObject<{
|
|
|
273
522
|
source: "claude_api_retry" | "claude_oauth_usage" | "claude_statusline" | "codex_app_server" | "codex_rollout";
|
|
274
523
|
observed_at: string;
|
|
275
524
|
freshness: "fresh" | "stale" | "unknown";
|
|
525
|
+
availability?: {
|
|
526
|
+
state: "available" | "cooldown" | "exhausted";
|
|
527
|
+
blocking_constraints: string[];
|
|
528
|
+
resets_at: string | null;
|
|
529
|
+
model_scoped_exhaustions: {
|
|
530
|
+
constraint_id: string;
|
|
531
|
+
applies_to_models: string[];
|
|
532
|
+
resets_at: string | null;
|
|
533
|
+
}[];
|
|
534
|
+
} | undefined;
|
|
276
535
|
}, {
|
|
277
536
|
subject: {
|
|
278
537
|
harness: string;
|
|
@@ -292,6 +551,16 @@ export declare const ControlQuotaResponse: z.ZodObject<{
|
|
|
292
551
|
source: "claude_api_retry" | "claude_oauth_usage" | "claude_statusline" | "codex_app_server" | "codex_rollout";
|
|
293
552
|
observed_at: string;
|
|
294
553
|
freshness: "fresh" | "stale" | "unknown";
|
|
554
|
+
availability?: {
|
|
555
|
+
state: "available" | "cooldown" | "exhausted";
|
|
556
|
+
blocking_constraints: string[];
|
|
557
|
+
resets_at: string | null;
|
|
558
|
+
model_scoped_exhaustions: {
|
|
559
|
+
constraint_id: string;
|
|
560
|
+
applies_to_models: string[];
|
|
561
|
+
resets_at: string | null;
|
|
562
|
+
}[];
|
|
563
|
+
} | undefined;
|
|
295
564
|
}>, "many">;
|
|
296
565
|
absences: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
297
566
|
subject: z.ZodObject<{
|
|
@@ -361,6 +630,16 @@ export declare const ControlQuotaResponse: z.ZodObject<{
|
|
|
361
630
|
source: "claude_api_retry" | "claude_oauth_usage" | "claude_statusline" | "codex_app_server" | "codex_rollout";
|
|
362
631
|
observed_at: string;
|
|
363
632
|
freshness: "fresh" | "stale" | "unknown";
|
|
633
|
+
availability?: {
|
|
634
|
+
state: "available" | "cooldown" | "exhausted";
|
|
635
|
+
blocking_constraints: string[];
|
|
636
|
+
resets_at: string | null;
|
|
637
|
+
model_scoped_exhaustions: {
|
|
638
|
+
constraint_id: string;
|
|
639
|
+
applies_to_models: string[];
|
|
640
|
+
resets_at: string | null;
|
|
641
|
+
}[];
|
|
642
|
+
} | undefined;
|
|
364
643
|
}[];
|
|
365
644
|
absences: {
|
|
366
645
|
subject: {
|
|
@@ -394,6 +673,16 @@ export declare const ControlQuotaResponse: z.ZodObject<{
|
|
|
394
673
|
source: "claude_api_retry" | "claude_oauth_usage" | "claude_statusline" | "codex_app_server" | "codex_rollout";
|
|
395
674
|
observed_at: string;
|
|
396
675
|
freshness: "fresh" | "stale" | "unknown";
|
|
676
|
+
availability?: {
|
|
677
|
+
state: "available" | "cooldown" | "exhausted";
|
|
678
|
+
blocking_constraints: string[];
|
|
679
|
+
resets_at: string | null;
|
|
680
|
+
model_scoped_exhaustions: {
|
|
681
|
+
constraint_id: string;
|
|
682
|
+
applies_to_models: string[];
|
|
683
|
+
resets_at: string | null;
|
|
684
|
+
}[];
|
|
685
|
+
} | undefined;
|
|
397
686
|
}[];
|
|
398
687
|
absences?: {
|
|
399
688
|
subject: {
|
|
@@ -409,4 +698,29 @@ export declare const ControlQuotaResponse: z.ZodObject<{
|
|
|
409
698
|
refreshed_at: string | null;
|
|
410
699
|
}>;
|
|
411
700
|
export type ControlQuotaResponse = z.infer<typeof ControlQuotaResponse>;
|
|
701
|
+
/** Derive one snapshot's typed model-aware availability — a pure projection
|
|
702
|
+
* over the snapshot's own constraints, never an aggregate across subjects.
|
|
703
|
+
* Blocking semantics mirror the router's `BudgetLedger`: a window
|
|
704
|
+
* blocks while its cooldown_until is in the future, or while used_ratio >= 1
|
|
705
|
+
* with a still-future resets_at (a spent ratio whose reset elapsed or is
|
|
706
|
+
* unknown is stale data, not a live block). Without `model`, only windows that
|
|
707
|
+
* apply to EVERY model can block; model-scoped spent windows are disclosed in
|
|
708
|
+
* model_scoped_exhaustions and leave state available — including a spent
|
|
709
|
+
* scoped window whose reset is UNKNOWN (disclosed with resets_at null, never
|
|
710
|
+
* blocking); one whose reset ELAPSED is provably released and not disclosed.
|
|
711
|
+
* With `model`, scoped windows matching it block too.
|
|
712
|
+
* Full-coverage inference ("every model is
|
|
713
|
+
* covered by some spent scoped window") is deliberately not attempted: the
|
|
714
|
+
* model universe is unknowable here, so that case stays available + disclosed. */
|
|
715
|
+
export declare function quotaSnapshotAvailability(snapshot: Pick<QuotaSnapshot, "constraints">, opts?: {
|
|
716
|
+
now?: Date;
|
|
717
|
+
model?: string | null;
|
|
718
|
+
}): QuotaAvailability;
|
|
719
|
+
/** Decorate a quota response with per-snapshot availability projections —
|
|
720
|
+
* applied at the /v2/quota boundary so journals, projection signatures, and
|
|
721
|
+
* embedded raw snapshots stay byte-identical. */
|
|
722
|
+
export declare function withQuotaAvailability(response: ControlQuotaResponse, opts?: {
|
|
723
|
+
now?: Date;
|
|
724
|
+
model?: string | null;
|
|
725
|
+
}): ControlQuotaResponse;
|
|
412
726
|
//# sourceMappingURL=quota.d.ts.map
|
package/dist/quota.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota.d.ts","sourceRoot":"","sources":["../src/quota.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAG3B,eAAO,MAAM,WAAW,iHAQgD,CAAC;AACzE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,eAAO,MAAM,cAAc,0CAE+B,CAAC;AAC3D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE5D,eAAO,MAAM,YAAY;;;;IAKrB;;;;;mDAK+C;;;;;;;;;;;;EAMhD,CAAC;AACJ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAExD,eAAO,MAAM,eAAe;;;IAIxB;;+EAE2E;;;;;;;;;;;;;;;;;;;;;;EAU5E,CAAC;AACJ,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,eAAO,MAAM,aAAa;;;;;QAjCtB;;;;;uDAK+C;;;;;;;;;;;;;;;;QAa/C;;mFAE2E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsBM,CAAC;AACtF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAE1D,eAAO,MAAM,kBAAkB,8HAa+D,CAAC;AAC/F,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEpE,eAAO,MAAM,YAAY;;;;;QA7DrB;;;;;uDAK+C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgE8C,CAAC;AAClG,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAExD,eAAO,MAAM,oBAAoB;;;;;;
|
|
1
|
+
{"version":3,"file":"quota.d.ts","sourceRoot":"","sources":["../src/quota.ts"],"names":[],"mappings":"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"}
|
package/dist/quota.js
CHANGED
|
@@ -75,9 +75,50 @@ export const QuotaAbsence = z
|
|
|
75
75
|
})
|
|
76
76
|
.strict()
|
|
77
77
|
.describe("A registered subject's typed missing-snapshot — absence is stated, never inferred.");
|
|
78
|
+
export const QuotaAvailabilityState = z
|
|
79
|
+
.enum(["available", "exhausted", "cooldown"])
|
|
80
|
+
.describe("Spendability verdict for one snapshot: exhausted = a spent window blocks every applicable request; cooldown = an applicable window is only rate-limit-cooling; available = nothing applicable blocks.");
|
|
81
|
+
export const QuotaModelScopedExhaustion = z
|
|
82
|
+
.object({
|
|
83
|
+
constraint_id: Id,
|
|
84
|
+
applies_to_models: z.array(Id).min(1),
|
|
85
|
+
resets_at: z.string().datetime({ offset: true }).nullable(),
|
|
86
|
+
})
|
|
87
|
+
.strict()
|
|
88
|
+
.describe("A spent or cooling window that applies only to the named models. Without a requested model it never sets the whole subject exhausted; when the request names a model it covers, it blocks that request too (and is then also listed in blocking_constraints). resets_at is its earliest known release instant (null = unknown).");
|
|
89
|
+
export const QuotaAvailability = z
|
|
90
|
+
.object({
|
|
91
|
+
state: QuotaAvailabilityState,
|
|
92
|
+
blocking_constraints: z
|
|
93
|
+
.array(Id)
|
|
94
|
+
.describe("Ids of the constraints that produced a non-available state."),
|
|
95
|
+
resets_at: z
|
|
96
|
+
.string()
|
|
97
|
+
.datetime({ offset: true })
|
|
98
|
+
.nullable()
|
|
99
|
+
.describe("Earliest known instant at which any blocking constraint may release; null when nothing blocks or no reset is known."),
|
|
100
|
+
model_scoped_exhaustions: z
|
|
101
|
+
.array(QuotaModelScopedExhaustion)
|
|
102
|
+
.describe("Every spent/cooling model-scoped window, listed regardless of state so consumers see partial exhaustion without re-deriving constraint scope."),
|
|
103
|
+
})
|
|
104
|
+
.strict()
|
|
105
|
+
.describe("Derived model-aware availability projection for one quota snapshot. Without a requested model, only windows applying to EVERY model can set exhausted/cooldown — a model-scoped spent window keeps state available and is disclosed in model_scoped_exhaustions.");
|
|
106
|
+
export const ControlQuotaSnapshot = QuotaSnapshot.extend({
|
|
107
|
+
availability: QuotaAvailability.optional().describe("Typed availability projection derived by the /v2/quota route; absent on surfaces that embed raw snapshots."),
|
|
108
|
+
}).describe("One vendor-owned quota snapshot plus its derived availability projection.");
|
|
109
|
+
export const ControlQuotaRefreshRequest = z
|
|
110
|
+
.object({
|
|
111
|
+
model: z
|
|
112
|
+
.string()
|
|
113
|
+
.min(1)
|
|
114
|
+
.optional()
|
|
115
|
+
.describe("Optional model id/alias the caller intends to spend against. When present, each snapshot's availability.state is computed against this model (case-insensitive alias containment in either direction), so windows scoped to OTHER models never report the subject exhausted."),
|
|
116
|
+
})
|
|
117
|
+
.strict()
|
|
118
|
+
.describe("Optional POST /v2/quota body; an empty or absent body keeps the model-agnostic projection.");
|
|
78
119
|
export const ControlQuotaResponse = z
|
|
79
120
|
.object({
|
|
80
|
-
snapshots: z.array(
|
|
121
|
+
snapshots: z.array(ControlQuotaSnapshot),
|
|
81
122
|
absences: z
|
|
82
123
|
.array(QuotaAbsence)
|
|
83
124
|
.default([])
|
|
@@ -86,4 +127,113 @@ export const ControlQuotaResponse = z
|
|
|
86
127
|
})
|
|
87
128
|
.strict()
|
|
88
129
|
.describe("Current quota snapshots without a fabricated aggregate.");
|
|
130
|
+
/** Millisecond instant of a still-future ISO timestamp, else null. */
|
|
131
|
+
function futureMs(iso, now) {
|
|
132
|
+
if (!iso)
|
|
133
|
+
return null;
|
|
134
|
+
const at = Date.parse(iso);
|
|
135
|
+
return Number.isFinite(at) && at > now ? at : null;
|
|
136
|
+
}
|
|
137
|
+
/** API-parameter model matching, deliberately looser than the router's exact
|
|
138
|
+
* `quotaConstraintAppliesToModel` (@claudexor/budget): consumers pass whatever
|
|
139
|
+
* model string they route with ("claude-fable-5", "fable", a bracketed
|
|
140
|
+
* variant), while producers publish vendor alias lists — so match by
|
|
141
|
+
* case-insensitive alias containment in either direction. A null/empty scope
|
|
142
|
+
* list is a vendor-wide window and matches every model. */
|
|
143
|
+
function modelScopeMatches(scope, model) {
|
|
144
|
+
if (scope == null || scope.length === 0)
|
|
145
|
+
return true;
|
|
146
|
+
const target = model.trim().toLowerCase();
|
|
147
|
+
return scope.some((alias) => {
|
|
148
|
+
const candidate = alias.trim().toLowerCase();
|
|
149
|
+
return (candidate !== "" &&
|
|
150
|
+
target !== "" &&
|
|
151
|
+
(candidate.includes(target) || target.includes(candidate)));
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
/** Derive one snapshot's typed model-aware availability — a pure projection
|
|
155
|
+
* over the snapshot's own constraints, never an aggregate across subjects.
|
|
156
|
+
* Blocking semantics mirror the router's `BudgetLedger`: a window
|
|
157
|
+
* blocks while its cooldown_until is in the future, or while used_ratio >= 1
|
|
158
|
+
* with a still-future resets_at (a spent ratio whose reset elapsed or is
|
|
159
|
+
* unknown is stale data, not a live block). Without `model`, only windows that
|
|
160
|
+
* apply to EVERY model can block; model-scoped spent windows are disclosed in
|
|
161
|
+
* model_scoped_exhaustions and leave state available — including a spent
|
|
162
|
+
* scoped window whose reset is UNKNOWN (disclosed with resets_at null, never
|
|
163
|
+
* blocking); one whose reset ELAPSED is provably released and not disclosed.
|
|
164
|
+
* With `model`, scoped windows matching it block too.
|
|
165
|
+
* Full-coverage inference ("every model is
|
|
166
|
+
* covered by some spent scoped window") is deliberately not attempted: the
|
|
167
|
+
* model universe is unknowable here, so that case stays available + disclosed. */
|
|
168
|
+
export function quotaSnapshotAvailability(snapshot, opts = {}) {
|
|
169
|
+
const now = (opts.now ?? new Date()).getTime();
|
|
170
|
+
const model = opts.model ?? null;
|
|
171
|
+
const blocking = [];
|
|
172
|
+
const scopedExhaustions = [];
|
|
173
|
+
let sawExhausted = false;
|
|
174
|
+
let earliestRelease = null;
|
|
175
|
+
for (const constraint of snapshot.constraints) {
|
|
176
|
+
const resetAt = futureMs(constraint.resets_at, now);
|
|
177
|
+
const cooldownAt = futureMs(constraint.cooldown_until, now);
|
|
178
|
+
const exhausted = constraint.used_ratio !== null && constraint.used_ratio >= 1 && resetAt !== null;
|
|
179
|
+
const cooling = cooldownAt !== null;
|
|
180
|
+
// A spent ratio with an UNKNOWN reset never blocks (BudgetLedger mirror:
|
|
181
|
+
// stale data, not a live block), but a scoped one is still DISCLOSED below
|
|
182
|
+
// with resets_at null; an elapsed reset is provably released and stays
|
|
183
|
+
// undisclosed.
|
|
184
|
+
const spentUnknownReset = constraint.used_ratio !== null && constraint.used_ratio >= 1 && constraint.resets_at === null;
|
|
185
|
+
if (!exhausted && !cooling && !spentUnknownReset)
|
|
186
|
+
continue;
|
|
187
|
+
// A constraint stays blocked until EVERY active condition lifts, so its
|
|
188
|
+
// own release is the LATER of the two; the snapshot-level resets_at below
|
|
189
|
+
// is the EARLIEST such release across blocking constraints. A
|
|
190
|
+
// disclosure-only window (spent, unknown reset) has no release instant.
|
|
191
|
+
const release = !exhausted && !cooling
|
|
192
|
+
? null
|
|
193
|
+
: exhausted && cooling
|
|
194
|
+
? resetAt >= cooldownAt
|
|
195
|
+
? { iso: constraint.resets_at, at: resetAt }
|
|
196
|
+
: { iso: constraint.cooldown_until, at: cooldownAt }
|
|
197
|
+
: exhausted
|
|
198
|
+
? { iso: constraint.resets_at, at: resetAt }
|
|
199
|
+
: { iso: constraint.cooldown_until, at: cooldownAt };
|
|
200
|
+
const scope = constraint.applies_to_models ?? null;
|
|
201
|
+
const scoped = scope !== null && scope.length > 0;
|
|
202
|
+
if (scoped) {
|
|
203
|
+
scopedExhaustions.push({
|
|
204
|
+
constraint_id: constraint.id,
|
|
205
|
+
applies_to_models: [...scope],
|
|
206
|
+
resets_at: release?.iso ?? null,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
if (release === null)
|
|
210
|
+
continue;
|
|
211
|
+
if (scoped && (model === null || !modelScopeMatches(scope, model)))
|
|
212
|
+
continue;
|
|
213
|
+
blocking.push(constraint.id);
|
|
214
|
+
if (exhausted)
|
|
215
|
+
sawExhausted = true;
|
|
216
|
+
if (earliestRelease === null || release.at < earliestRelease.at) {
|
|
217
|
+
earliestRelease = release;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return QuotaAvailability.parse({
|
|
221
|
+
state: blocking.length === 0 ? "available" : sawExhausted ? "exhausted" : "cooldown",
|
|
222
|
+
blocking_constraints: blocking,
|
|
223
|
+
resets_at: earliestRelease?.iso ?? null,
|
|
224
|
+
model_scoped_exhaustions: scopedExhaustions,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
/** Decorate a quota response with per-snapshot availability projections —
|
|
228
|
+
* applied at the /v2/quota boundary so journals, projection signatures, and
|
|
229
|
+
* embedded raw snapshots stay byte-identical. */
|
|
230
|
+
export function withQuotaAvailability(response, opts = {}) {
|
|
231
|
+
return {
|
|
232
|
+
...response,
|
|
233
|
+
snapshots: response.snapshots.map((snapshot) => ({
|
|
234
|
+
...snapshot,
|
|
235
|
+
availability: quotaSnapshotAvailability(snapshot, opts),
|
|
236
|
+
})),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
89
239
|
//# sourceMappingURL=quota.js.map
|
package/dist/quota.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota.js","sourceRoot":"","sources":["../src/quota.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"quota.js","sourceRoot":"","sources":["../src/quota.ts"],"names":[],"mappings":"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"}
|