@claudexor/daemon 3.8.4 → 3.9.1
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/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/quota-poll-lanes.d.ts +100 -0
- package/dist/quota-poll-lanes.d.ts.map +1 -0
- package/dist/quota-poll-lanes.js +168 -0
- package/dist/quota-poll-lanes.js.map +1 -0
- package/dist/quota-poll-pacer.d.ts +63 -15
- package/dist/quota-poll-pacer.d.ts.map +1 -1
- package/dist/quota-poll-pacer.js +127 -43
- package/dist/quota-poll-pacer.js.map +1 -1
- package/dist/quota-projection.d.ts +4 -2
- package/dist/quota-projection.d.ts.map +1 -1
- package/dist/quota-projection.js +2 -2
- package/dist/quota-projection.js.map +1 -1
- package/dist/quota-refresh-coordinator.d.ts +3 -0
- package/dist/quota-refresh-coordinator.d.ts.map +1 -1
- package/dist/quota-refresh-coordinator.js +5 -0
- package/dist/quota-refresh-coordinator.js.map +1 -1
- package/dist/quota-registry.d.ts +53 -25
- package/dist/quota-registry.d.ts.map +1 -1
- package/dist/quota-registry.js +102 -61
- package/dist/quota-registry.js.map +1 -1
- package/package.json +5 -5
package/dist/index.d.ts
CHANGED
|
@@ -20,6 +20,8 @@ export * from "./command-authority.js";
|
|
|
20
20
|
export * from "./resource-store.js";
|
|
21
21
|
export * from "./quota-registry.js";
|
|
22
22
|
export * from "./quota-projection.js";
|
|
23
|
+
export * from "./quota-poll-lanes.js";
|
|
24
|
+
export { quotaPacerFileStore } from "./quota-poll-pacer.js";
|
|
23
25
|
export * from "./credential-unusable-ledger.js";
|
|
24
26
|
export * from "./project-partitions.js";
|
|
25
27
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iCAAiC,CAAC;AAChD,cAAc,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,cAAc,iCAAiC,CAAC;AAChD,cAAc,yBAAyB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -20,6 +20,8 @@ export * from "./command-authority.js";
|
|
|
20
20
|
export * from "./resource-store.js";
|
|
21
21
|
export * from "./quota-registry.js";
|
|
22
22
|
export * from "./quota-projection.js";
|
|
23
|
+
export * from "./quota-poll-lanes.js";
|
|
24
|
+
export { quotaPacerFileStore } from "./quota-poll-pacer.js";
|
|
23
25
|
export * from "./credential-unusable-ledger.js";
|
|
24
26
|
export * from "./project-partitions.js";
|
|
25
27
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iCAAiC,CAAC;AAChD,cAAc,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,cAAc,iCAAiC,CAAC;AAChD,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import type { QuotaAbsence, QuotaSnapshot, QuotaSubject } from "@claudexor/schema";
|
|
2
|
+
import { QuotaPollPacer, type QuotaPacerStateStore } from "./quota-poll-pacer.js";
|
|
3
|
+
/** One refresh cycle's fruit: the snapshots a source observed, plus the typed
|
|
4
|
+
* absences it CLAIMS for subjects it tried and could not observe. Absence is
|
|
5
|
+
* stated by the source, never inferred from an empty snapshot list. */
|
|
6
|
+
export interface QuotaRefreshResult {
|
|
7
|
+
snapshots: QuotaSnapshot[];
|
|
8
|
+
absences?: QuotaAbsence[];
|
|
9
|
+
}
|
|
10
|
+
export type QuotaRefresher = () => Promise<QuotaRefreshResult>;
|
|
11
|
+
/** A refresher bound to its vendor pacing lane. Refreshers of one vendor
|
|
12
|
+
* share ONE QuotaPollPacer, so a permanently unsatisfiable subject of one
|
|
13
|
+
* vendor backs off alone instead of pinning every vendor's cadence at the
|
|
14
|
+
* 15-minute ceiling. A bare QuotaRefresher (legacy embedders, tests) rides an
|
|
15
|
+
* anonymous lane with the pre-existing global-demand semantics. */
|
|
16
|
+
export interface QuotaVendorRefresher {
|
|
17
|
+
readonly vendor: string;
|
|
18
|
+
readonly refresh: QuotaRefresher;
|
|
19
|
+
}
|
|
20
|
+
export interface PacingLane {
|
|
21
|
+
readonly vendor: string | null;
|
|
22
|
+
readonly pacer: QuotaPollPacer;
|
|
23
|
+
}
|
|
24
|
+
export interface RefresherLanes {
|
|
25
|
+
/** Declaration-ordered refreshers, each bound to its pacing lane. */
|
|
26
|
+
readonly entries: ReadonlyArray<{
|
|
27
|
+
lane: PacingLane;
|
|
28
|
+
refresh: QuotaRefresher;
|
|
29
|
+
}>;
|
|
30
|
+
/** Distinct pacing lanes in first-appearance order. */
|
|
31
|
+
readonly lanes: readonly PacingLane[];
|
|
32
|
+
}
|
|
33
|
+
export declare function buildRefresherLanes(refreshers: readonly (QuotaRefresher | QuotaVendorRefresher)[], pacerStore?: QuotaPacerStateStore): RefresherLanes;
|
|
34
|
+
export interface PollSweepDeps {
|
|
35
|
+
readonly now: () => Date;
|
|
36
|
+
readonly publishClockTransition: () => void;
|
|
37
|
+
readonly laneHasDemand: (vendor: string | null, now: number) => boolean;
|
|
38
|
+
readonly currentGeneration: () => number;
|
|
39
|
+
readonly isCurrentGeneration: (generation: number) => boolean;
|
|
40
|
+
readonly runLaneCycle: (lane: PacingLane) => Promise<unknown>;
|
|
41
|
+
}
|
|
42
|
+
/** One background poll sweep: drive every vendor lane in order, running a
|
|
43
|
+
* coalesced cycle for each lane that is past its pacer gates and still has
|
|
44
|
+
* refresh demand, so one vendor's backoff never starves a sibling vendor's
|
|
45
|
+
* freshness. Resolves true when any lane refreshed. Single-flight of the
|
|
46
|
+
* sweep itself belongs to the caller. */
|
|
47
|
+
export declare function performPollSweep(lanes: readonly PacingLane[], deps: PollSweepDeps): Promise<boolean>;
|
|
48
|
+
/** Per-lane refresh demand: a vendor lane sees only its own subjects and
|
|
49
|
+
* snapshots; an anonymous lane keeps the pre-existing global semantics. */
|
|
50
|
+
export declare function laneHasDemand(vendor: string | null, snapshots: readonly QuotaSnapshot[], subjects?: readonly QuotaSubject[]): boolean;
|
|
51
|
+
export interface LaneCycleSelection {
|
|
52
|
+
readonly running: ReadonlyArray<{
|
|
53
|
+
lane: PacingLane;
|
|
54
|
+
refresh: QuotaRefresher;
|
|
55
|
+
}>;
|
|
56
|
+
readonly skipped: Array<{
|
|
57
|
+
vendor: string;
|
|
58
|
+
not_before: string;
|
|
59
|
+
}>;
|
|
60
|
+
}
|
|
61
|
+
/** Select which refreshers one cycle runs. A full (foreground) cycle honors
|
|
62
|
+
* each vendor lane's rate-limit floor: a vendor that just said 429 is not
|
|
63
|
+
* re-fanned-out by an explicit refresh — its skip is returned for additive
|
|
64
|
+
* disclosure. A poll-scoped cycle was already gated by the sweep. Anonymous
|
|
65
|
+
* lanes never carry a floor and always run. */
|
|
66
|
+
export declare function selectCycleEntries(refresherLanes: RefresherLanes, scope: PacingLane | null, nowMs: number): LaneCycleSelection;
|
|
67
|
+
/** Absence recomputation covers exactly the lanes that RAN: an anonymous
|
|
68
|
+
* lane's coverage is unknowable, so its cycle keeps the full rebuild. */
|
|
69
|
+
export declare function recomputeScopeFor(running: LaneCycleSelection["running"]): ReadonlySet<string> | null;
|
|
70
|
+
/** Derived `poll_paced` gap rows: while a vendor lane's rate-limit floor is
|
|
71
|
+
* active, every universe subject of that vendor lacking FRESH snapshot cover
|
|
72
|
+
* and lacking a stored absence row is stated as paused — a live projection
|
|
73
|
+
* (never journaled), stable per floor so the projection signature does not
|
|
74
|
+
* churn markers on every read. Keeps a suppressed vendor's subjects from
|
|
75
|
+
* falling silent (daemon restarts with a store-loaded floor included) and
|
|
76
|
+
* downstream exhaustion readers fail-open. */
|
|
77
|
+
export declare function derivePollPacedRows(lanes: readonly PacingLane[], subjects: readonly QuotaSubject[], existingRows: readonly QuotaAbsence[], freshCovered: ReadonlySet<string>, now: number): QuotaAbsence[];
|
|
78
|
+
/** Subject-identity cover sets over one active-snapshot view. Gap rows are
|
|
79
|
+
* silenced only by the FRESH set; every other reason by any active snapshot. */
|
|
80
|
+
export declare function subjectCoverSets(active: readonly QuotaSnapshot[]): {
|
|
81
|
+
covered: ReadonlySet<string>;
|
|
82
|
+
freshCovered: ReadonlySet<string>;
|
|
83
|
+
};
|
|
84
|
+
/** Pure absence fold for one cycle (V11a semantics): preserved out-of-scope
|
|
85
|
+
* rows first, then first-claim-wins claims, then `no_source` for uncovered
|
|
86
|
+
* in-scope universe subjects. Gap-representation claims ("deliberately not
|
|
87
|
+
* asked": rate_limited and its skip siblings) are silenced only by a FRESH
|
|
88
|
+
* snapshot — a stale one is exactly the state the gap row explains, and
|
|
89
|
+
* dropping the row there would let a stale spent window read as exhausted
|
|
90
|
+
* downstream. */
|
|
91
|
+
export declare function foldAbsenceClaims(input: {
|
|
92
|
+
claims: readonly QuotaAbsence[];
|
|
93
|
+
prior: readonly QuotaAbsence[];
|
|
94
|
+
rebuilt: (harness: string) => boolean;
|
|
95
|
+
covered: ReadonlySet<string>;
|
|
96
|
+
freshCovered: ReadonlySet<string>;
|
|
97
|
+
subjects: readonly QuotaSubject[];
|
|
98
|
+
now: number;
|
|
99
|
+
}): QuotaAbsence[];
|
|
100
|
+
//# sourceMappingURL=quota-poll-lanes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-poll-lanes.d.ts","sourceRoot":"","sources":["../src/quota-poll-lanes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { QUOTA_GAP_ABSENCE_REASONS } from "@claudexor/schema";
|
|
2
|
+
import { QuotaPollPacer } from "./quota-poll-pacer.js";
|
|
3
|
+
import { quotaSubjectIdentity, remainingQuotaRefreshDemand } from "./quota-refresh-demand.js";
|
|
4
|
+
export function buildRefresherLanes(refreshers, pacerStore) {
|
|
5
|
+
const laneByVendor = new Map();
|
|
6
|
+
const entries = refreshers.map((registration) => {
|
|
7
|
+
if (typeof registration === "function") {
|
|
8
|
+
return { lane: { vendor: null, pacer: new QuotaPollPacer() }, refresh: registration };
|
|
9
|
+
}
|
|
10
|
+
let lane = laneByVendor.get(registration.vendor);
|
|
11
|
+
if (!lane) {
|
|
12
|
+
lane = {
|
|
13
|
+
vendor: registration.vendor,
|
|
14
|
+
pacer: new QuotaPollPacer(registration.vendor, pacerStore),
|
|
15
|
+
};
|
|
16
|
+
laneByVendor.set(registration.vendor, lane);
|
|
17
|
+
}
|
|
18
|
+
return { lane, refresh: registration.refresh };
|
|
19
|
+
});
|
|
20
|
+
return { entries, lanes: [...new Set(entries.map((entry) => entry.lane))] };
|
|
21
|
+
}
|
|
22
|
+
/** One background poll sweep: drive every vendor lane in order, running a
|
|
23
|
+
* coalesced cycle for each lane that is past its pacer gates and still has
|
|
24
|
+
* refresh demand, so one vendor's backoff never starves a sibling vendor's
|
|
25
|
+
* freshness. Resolves true when any lane refreshed. Single-flight of the
|
|
26
|
+
* sweep itself belongs to the caller. */
|
|
27
|
+
export async function performPollSweep(lanes, deps) {
|
|
28
|
+
deps.publishClockTransition();
|
|
29
|
+
let ran = false;
|
|
30
|
+
for (const lane of lanes) {
|
|
31
|
+
const now = deps.now().getTime();
|
|
32
|
+
if (!lane.pacer.pollEligible(now))
|
|
33
|
+
continue;
|
|
34
|
+
if (!deps.laneHasDemand(lane.vendor, now))
|
|
35
|
+
continue;
|
|
36
|
+
const generation = deps.currentGeneration();
|
|
37
|
+
try {
|
|
38
|
+
await deps.runLaneCycle(lane);
|
|
39
|
+
ran = true;
|
|
40
|
+
// A cycle fenced away by a credential change reports no pacing
|
|
41
|
+
// outcome: the fresh-generation poll re-decides from scratch.
|
|
42
|
+
if (!deps.isCurrentGeneration(generation))
|
|
43
|
+
continue;
|
|
44
|
+
const completedAt = deps.now().getTime();
|
|
45
|
+
lane.pacer.notePollSuccess(completedAt, deps.laneHasDemand(lane.vendor, completedAt));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
if (deps.isCurrentGeneration(generation)) {
|
|
49
|
+
lane.pacer.notePollFailure(deps.now().getTime());
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return ran;
|
|
54
|
+
}
|
|
55
|
+
/** Per-lane refresh demand: a vendor lane sees only its own subjects and
|
|
56
|
+
* snapshots; an anonymous lane keeps the pre-existing global semantics. */
|
|
57
|
+
export function laneHasDemand(vendor, snapshots, subjects) {
|
|
58
|
+
if (vendor === null)
|
|
59
|
+
return remainingQuotaRefreshDemand(snapshots, subjects).size > 0;
|
|
60
|
+
return (remainingQuotaRefreshDemand(snapshots.filter((snapshot) => snapshot.subject.harness === vendor), subjects?.filter((subject) => subject.harness === vendor)).size > 0);
|
|
61
|
+
}
|
|
62
|
+
/** Select which refreshers one cycle runs. A full (foreground) cycle honors
|
|
63
|
+
* each vendor lane's rate-limit floor: a vendor that just said 429 is not
|
|
64
|
+
* re-fanned-out by an explicit refresh — its skip is returned for additive
|
|
65
|
+
* disclosure. A poll-scoped cycle was already gated by the sweep. Anonymous
|
|
66
|
+
* lanes never carry a floor and always run. */
|
|
67
|
+
export function selectCycleEntries(refresherLanes, scope, nowMs) {
|
|
68
|
+
const skipped = scope === null
|
|
69
|
+
? refresherLanes.lanes.flatMap((lane) => {
|
|
70
|
+
const until = lane.vendor === null ? null : lane.pacer.rateLimitCooldownUntil(nowMs);
|
|
71
|
+
return until === null
|
|
72
|
+
? []
|
|
73
|
+
: [{ vendor: lane.vendor, not_before: new Date(until).toISOString() }];
|
|
74
|
+
})
|
|
75
|
+
: [];
|
|
76
|
+
const skippedVendors = new Set(skipped.map((row) => row.vendor));
|
|
77
|
+
const running = refresherLanes.entries.filter((entry) => scope === null
|
|
78
|
+
? entry.lane.vendor === null || !skippedVendors.has(entry.lane.vendor)
|
|
79
|
+
: entry.lane === scope);
|
|
80
|
+
return { running, skipped };
|
|
81
|
+
}
|
|
82
|
+
/** Absence recomputation covers exactly the lanes that RAN: an anonymous
|
|
83
|
+
* lane's coverage is unknowable, so its cycle keeps the full rebuild. */
|
|
84
|
+
export function recomputeScopeFor(running) {
|
|
85
|
+
const ranLanes = [...new Set(running.map((entry) => entry.lane))];
|
|
86
|
+
return ranLanes.some((lane) => lane.vendor === null)
|
|
87
|
+
? null
|
|
88
|
+
: new Set(ranLanes.map((lane) => lane.vendor));
|
|
89
|
+
}
|
|
90
|
+
/** Derived `poll_paced` gap rows: while a vendor lane's rate-limit floor is
|
|
91
|
+
* active, every universe subject of that vendor lacking FRESH snapshot cover
|
|
92
|
+
* and lacking a stored absence row is stated as paused — a live projection
|
|
93
|
+
* (never journaled), stable per floor so the projection signature does not
|
|
94
|
+
* churn markers on every read. Keeps a suppressed vendor's subjects from
|
|
95
|
+
* falling silent (daemon restarts with a store-loaded floor included) and
|
|
96
|
+
* downstream exhaustion readers fail-open. */
|
|
97
|
+
export function derivePollPacedRows(lanes, subjects, existingRows, freshCovered, now) {
|
|
98
|
+
const present = new Set(existingRows.map((row) => quotaSubjectIdentity(row.subject)));
|
|
99
|
+
const rows = [];
|
|
100
|
+
for (const lane of lanes) {
|
|
101
|
+
if (lane.vendor === null)
|
|
102
|
+
continue;
|
|
103
|
+
const until = lane.pacer.rateLimitCooldownUntil(now);
|
|
104
|
+
if (until === null)
|
|
105
|
+
continue;
|
|
106
|
+
for (const subject of subjects) {
|
|
107
|
+
if (subject.harness !== lane.vendor)
|
|
108
|
+
continue;
|
|
109
|
+
const key = quotaSubjectIdentity(subject);
|
|
110
|
+
if (freshCovered.has(key) || present.has(key))
|
|
111
|
+
continue;
|
|
112
|
+
present.add(key);
|
|
113
|
+
rows.push({
|
|
114
|
+
subject,
|
|
115
|
+
reason: "poll_paced",
|
|
116
|
+
detail: `vendor poll paused by rate-limit cooldown until ${new Date(until).toISOString()}`,
|
|
117
|
+
observed_at: new Date(lane.pacer.rateLimitObservedAt(now)).toISOString(),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return rows;
|
|
122
|
+
}
|
|
123
|
+
/** Subject-identity cover sets over one active-snapshot view. Gap rows are
|
|
124
|
+
* silenced only by the FRESH set; every other reason by any active snapshot. */
|
|
125
|
+
export function subjectCoverSets(active) {
|
|
126
|
+
return {
|
|
127
|
+
covered: new Set(active.map((snapshot) => quotaSubjectIdentity(snapshot.subject))),
|
|
128
|
+
freshCovered: new Set(active
|
|
129
|
+
.filter((snapshot) => snapshot.freshness === "fresh")
|
|
130
|
+
.map((snapshot) => quotaSubjectIdentity(snapshot.subject))),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/** Pure absence fold for one cycle (V11a semantics): preserved out-of-scope
|
|
134
|
+
* rows first, then first-claim-wins claims, then `no_source` for uncovered
|
|
135
|
+
* in-scope universe subjects. Gap-representation claims ("deliberately not
|
|
136
|
+
* asked": rate_limited and its skip siblings) are silenced only by a FRESH
|
|
137
|
+
* snapshot — a stale one is exactly the state the gap row explains, and
|
|
138
|
+
* dropping the row there would let a stale spent window read as exhausted
|
|
139
|
+
* downstream. */
|
|
140
|
+
export function foldAbsenceClaims(input) {
|
|
141
|
+
const preserved = input.prior.filter((absence) => !input.rebuilt(absence.subject.harness));
|
|
142
|
+
const result = [];
|
|
143
|
+
const claimed = new Set(preserved.map((item) => quotaSubjectIdentity(item.subject)));
|
|
144
|
+
for (const claim of input.claims) {
|
|
145
|
+
const key = quotaSubjectIdentity(claim.subject);
|
|
146
|
+
const cover = QUOTA_GAP_ABSENCE_REASONS.has(claim.reason) ? input.freshCovered : input.covered;
|
|
147
|
+
if (cover.has(key) || claimed.has(key))
|
|
148
|
+
continue;
|
|
149
|
+
claimed.add(key);
|
|
150
|
+
result.push(claim);
|
|
151
|
+
}
|
|
152
|
+
for (const subject of input.subjects) {
|
|
153
|
+
if (!input.rebuilt(subject.harness))
|
|
154
|
+
continue;
|
|
155
|
+
const key = quotaSubjectIdentity(subject);
|
|
156
|
+
if (input.covered.has(key) || claimed.has(key))
|
|
157
|
+
continue;
|
|
158
|
+
claimed.add(key);
|
|
159
|
+
result.push({
|
|
160
|
+
subject,
|
|
161
|
+
reason: "no_source",
|
|
162
|
+
detail: null,
|
|
163
|
+
observed_at: new Date(input.now).toISOString(),
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
return [...preserved, ...result];
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=quota-poll-lanes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-poll-lanes.js","sourceRoot":"","sources":["../src/quota-poll-lanes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,71 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Daemon-private persistence for one pacer fact: the per-vendor rate-limit
|
|
3
|
+
* floor. Deliberately OUTSIDE the quota journal and every quota projection
|
|
4
|
+
* (owner decision 7=A): a throttled POLL is pacing state, never quota truth —
|
|
5
|
+
* journaling it as a cooldown would read as "window exhausted" to rotation
|
|
6
|
+
* and to external consumers of the quota surface.
|
|
7
|
+
*/
|
|
8
|
+
export interface QuotaPacerStateStore {
|
|
9
|
+
/** Millisecond epoch before which the vendor must not be polled; 0 = none. */
|
|
10
|
+
load(vendor: string): number;
|
|
11
|
+
save(vendor: string, notBeforeMs: number): void;
|
|
6
12
|
}
|
|
7
|
-
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
13
|
+
/** File-backed store under the daemon dir. Best-effort durability: a missing,
|
|
14
|
+
* corrupt, or unwritable file only forgets the floor (fail-open to polling),
|
|
15
|
+
* it never breaks the poll cycle. */
|
|
16
|
+
export declare function quotaPacerFileStore(dir: string): QuotaPacerStateStore;
|
|
17
|
+
/**
|
|
18
|
+
* Completion-anchored poll pacing for ONE vendor lane of the quota registry
|
|
19
|
+
* (one instance per vendor with a registered refresher), so a permanently
|
|
20
|
+
* unsatisfiable subject of one vendor can no longer pin every other vendor's
|
|
21
|
+
* refresh cadence at the 15-minute ceiling. Two independent gates:
|
|
22
|
+
*
|
|
23
|
+
* - the credential-demand backoff (`failures`/`notBefore`): in-memory,
|
|
24
|
+
* exponential per unsatisfied cycle, reset by a credential change — the
|
|
25
|
+
* pre-existing semantics, now per lane;
|
|
26
|
+
* - the vendor rate-limit floor (`rateLimitedNotBefore`): armed when a cycle
|
|
27
|
+
* observes a typed `rate_limited` absence for this vendor, honoring the
|
|
28
|
+
* vendor's Retry-After when known (max with the exponential ladder, 60s
|
|
29
|
+
* minimum). Persisted through the daemon-private store so a restart is not
|
|
30
|
+
* a 429 amplifier, and deliberately NOT reset by a credential change —
|
|
31
|
+
* logging in again does not un-rate-limit the vendor endpoint.
|
|
32
|
+
*
|
|
33
|
+
* Evidence/demand semantics stay with QuotaRegistry; this class owns only
|
|
34
|
+
* scheduling state. Single-flight of the poll sweep also lives in the
|
|
35
|
+
* registry, which drives every lane from one sweep.
|
|
36
|
+
*/
|
|
10
37
|
export declare class QuotaPollPacer {
|
|
11
|
-
private readonly
|
|
38
|
+
private readonly vendor;
|
|
39
|
+
private readonly store?;
|
|
12
40
|
private failures;
|
|
13
41
|
private notBefore;
|
|
14
|
-
private
|
|
15
|
-
/**
|
|
16
|
-
private
|
|
17
|
-
constructor(
|
|
42
|
+
private rateLimitedNotBefore;
|
|
43
|
+
/** When the active floor was observed (0 = unknown, e.g. store-loaded). */
|
|
44
|
+
private rateLimitedSince;
|
|
45
|
+
constructor(vendor?: string | null, store?: QuotaPacerStateStore | undefined);
|
|
46
|
+
/** Credential/routability change: drop only the credential-demand backoff.
|
|
47
|
+
* The vendor rate-limit floor survives — it is about the vendor endpoint,
|
|
48
|
+
* not about which credentials exist (and a daemon restart or profile toggle
|
|
49
|
+
* must not become a 429 amplifier). */
|
|
18
50
|
noteCredentialChange(): void;
|
|
19
|
-
|
|
20
|
-
|
|
51
|
+
pollEligible(now: number): boolean;
|
|
52
|
+
/** The active vendor rate-limit floor, or null when none is in effect. */
|
|
53
|
+
rateLimitCooldownUntil(now: number): number | null;
|
|
54
|
+
/** Stable observation stamp for the ACTIVE floor's derived gap rows: the
|
|
55
|
+
* instant the floor was observed. A store-loaded floor (daemon restart)
|
|
56
|
+
* has no recorded observation, so the first read anchors it — stability of
|
|
57
|
+
* the projection signature matters more than the exact historical instant,
|
|
58
|
+
* and the anchor is honest ("known paused since at least then"). */
|
|
59
|
+
rateLimitObservedAt(now: number): number;
|
|
60
|
+
/** A cycle for this lane completed: reset on fully satisfied demand, else
|
|
61
|
+
* exponential backoff anchored at completion (never the stale start). */
|
|
62
|
+
notePollSuccess(completedAt: number, demandRemains: boolean): void;
|
|
63
|
+
notePollFailure(completedAt: number): void;
|
|
64
|
+
/** A cycle observed a typed `rate_limited` absence for this vendor: arm the
|
|
65
|
+
* floor at max(exponential ladder, vendor Retry-After), monotonic, and
|
|
66
|
+
* persist it (a null Retry-After — Anthropic does not always send one —
|
|
67
|
+
* still arms the exponential-derived floor). */
|
|
68
|
+
noteRateLimited(observedAt: number, retryAfterMs: number | null): void;
|
|
21
69
|
private armBackoff;
|
|
22
70
|
}
|
|
23
71
|
//# sourceMappingURL=quota-poll-pacer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota-poll-pacer.d.ts","sourceRoot":"","sources":["../src/quota-poll-pacer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"quota-poll-pacer.d.ts","sourceRoot":"","sources":["../src/quota-poll-pacer.ts"],"names":[],"mappings":"AAWA;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,8EAA8E;IAC9E,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CACjD;AAED;;qCAEqC;AACrC,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAgCrE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,cAAc;IAQvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;IARzB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,oBAAoB,CAAK;IACjC,2EAA2E;IAC3E,OAAO,CAAC,gBAAgB,CAAK;IAE7B,YACmB,MAAM,GAAE,MAAM,GAAG,IAAW,EAC5B,KAAK,CAAC,EAAE,oBAAoB,YAAA,EAS9C;IAED;;;2CAGuC;IACvC,oBAAoB,IAAI,IAAI,CAG3B;IAED,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEjC;IAED,0EAA0E;IAC1E,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEjD;IAED;;;;wEAIoE;IACpE,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGvC;IAED;6EACyE;IACzE,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAG,IAAI,CAOjE;IAED,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAEzC;IAED;;;oDAGgD;IAChD,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAiBrE;IAED,OAAO,CAAC,UAAU;CAKnB"}
|
package/dist/quota-poll-pacer.js
CHANGED
|
@@ -1,59 +1,143 @@
|
|
|
1
|
+
import { readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
1
3
|
const POLL_BACKOFF_MS = 60_000;
|
|
2
4
|
const MAX_POLL_BACKOFF_MS = 15 * 60_000;
|
|
3
|
-
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
5
|
+
/** Ceiling on the vendor rate-limit floor (7 days, aligned with the
|
|
6
|
+
* Retry-After parser's clamp): valid long vendor floors are honored in full —
|
|
7
|
+
* the plan's max(exponential, retryAfterMs) — while a buggy or hostile value
|
|
8
|
+
* cannot silence a vendor's polling unboundedly. */
|
|
9
|
+
const MAX_RATE_LIMIT_FLOOR_MS = 7 * 24 * 60 * 60_000;
|
|
10
|
+
/** File-backed store under the daemon dir. Best-effort durability: a missing,
|
|
11
|
+
* corrupt, or unwritable file only forgets the floor (fail-open to polling),
|
|
12
|
+
* it never breaks the poll cycle. */
|
|
13
|
+
export function quotaPacerFileStore(dir) {
|
|
14
|
+
const path = join(dir, "quota-pacer-state.json");
|
|
15
|
+
const read = () => {
|
|
16
|
+
try {
|
|
17
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
18
|
+
return parsed?.version === 1 &&
|
|
19
|
+
parsed.vendors !== null &&
|
|
20
|
+
typeof parsed.vendors === "object" &&
|
|
21
|
+
!Array.isArray(parsed.vendors)
|
|
22
|
+
? parsed.vendors
|
|
23
|
+
: {};
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return {};
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
return {
|
|
30
|
+
load(vendor) {
|
|
31
|
+
const iso = read()[vendor]?.not_before;
|
|
32
|
+
const at = typeof iso === "string" ? Date.parse(iso) : Number.NaN;
|
|
33
|
+
return Number.isFinite(at) ? at : 0;
|
|
34
|
+
},
|
|
35
|
+
save(vendor, notBeforeMs) {
|
|
36
|
+
const vendors = read();
|
|
37
|
+
vendors[vendor] = { not_before: new Date(notBeforeMs).toISOString() };
|
|
38
|
+
const tmp = `${path}.tmp.${process.pid}`;
|
|
39
|
+
writeFileSync(tmp, `${JSON.stringify({ version: 1, vendors }, null, 2)}\n`);
|
|
40
|
+
renameSync(tmp, path);
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Completion-anchored poll pacing for ONE vendor lane of the quota registry
|
|
46
|
+
* (one instance per vendor with a registered refresher), so a permanently
|
|
47
|
+
* unsatisfiable subject of one vendor can no longer pin every other vendor's
|
|
48
|
+
* refresh cadence at the 15-minute ceiling. Two independent gates:
|
|
49
|
+
*
|
|
50
|
+
* - the credential-demand backoff (`failures`/`notBefore`): in-memory,
|
|
51
|
+
* exponential per unsatisfied cycle, reset by a credential change — the
|
|
52
|
+
* pre-existing semantics, now per lane;
|
|
53
|
+
* - the vendor rate-limit floor (`rateLimitedNotBefore`): armed when a cycle
|
|
54
|
+
* observes a typed `rate_limited` absence for this vendor, honoring the
|
|
55
|
+
* vendor's Retry-After when known (max with the exponential ladder, 60s
|
|
56
|
+
* minimum). Persisted through the daemon-private store so a restart is not
|
|
57
|
+
* a 429 amplifier, and deliberately NOT reset by a credential change —
|
|
58
|
+
* logging in again does not un-rate-limit the vendor endpoint.
|
|
59
|
+
*
|
|
60
|
+
* Evidence/demand semantics stay with QuotaRegistry; this class owns only
|
|
61
|
+
* scheduling state. Single-flight of the poll sweep also lives in the
|
|
62
|
+
* registry, which drives every lane from one sweep.
|
|
63
|
+
*/
|
|
6
64
|
export class QuotaPollPacer {
|
|
7
|
-
|
|
65
|
+
vendor;
|
|
66
|
+
store;
|
|
8
67
|
failures = 0;
|
|
9
68
|
notBefore = 0;
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
constructor(
|
|
14
|
-
this.
|
|
69
|
+
rateLimitedNotBefore = 0;
|
|
70
|
+
/** When the active floor was observed (0 = unknown, e.g. store-loaded). */
|
|
71
|
+
rateLimitedSince = 0;
|
|
72
|
+
constructor(vendor = null, store) {
|
|
73
|
+
this.vendor = vendor;
|
|
74
|
+
this.store = store;
|
|
75
|
+
if (this.vendor !== null && this.store) {
|
|
76
|
+
try {
|
|
77
|
+
this.rateLimitedNotBefore = this.store.load(this.vendor);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
/* fail-open: a broken store never blocks polling */
|
|
81
|
+
}
|
|
82
|
+
}
|
|
15
83
|
}
|
|
84
|
+
/** Credential/routability change: drop only the credential-demand backoff.
|
|
85
|
+
* The vendor rate-limit floor survives — it is about the vendor endpoint,
|
|
86
|
+
* not about which credentials exist (and a daemon restart or profile toggle
|
|
87
|
+
* must not become a 429 amplifier). */
|
|
16
88
|
noteCredentialChange() {
|
|
17
|
-
this.credentialGeneration += 1;
|
|
18
89
|
this.failures = 0;
|
|
19
90
|
this.notBefore = 0;
|
|
20
91
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
return this.inFlight;
|
|
24
|
-
const poll = this.perform().finally(() => {
|
|
25
|
-
if (this.inFlight === poll)
|
|
26
|
-
this.inFlight = null;
|
|
27
|
-
});
|
|
28
|
-
this.inFlight = poll;
|
|
29
|
-
return poll;
|
|
92
|
+
pollEligible(now) {
|
|
93
|
+
return now >= this.notBefore && now >= this.rateLimitedNotBefore;
|
|
30
94
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
this.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
this.
|
|
50
|
-
|
|
95
|
+
/** The active vendor rate-limit floor, or null when none is in effect. */
|
|
96
|
+
rateLimitCooldownUntil(now) {
|
|
97
|
+
return now < this.rateLimitedNotBefore ? this.rateLimitedNotBefore : null;
|
|
98
|
+
}
|
|
99
|
+
/** Stable observation stamp for the ACTIVE floor's derived gap rows: the
|
|
100
|
+
* instant the floor was observed. A store-loaded floor (daemon restart)
|
|
101
|
+
* has no recorded observation, so the first read anchors it — stability of
|
|
102
|
+
* the projection signature matters more than the exact historical instant,
|
|
103
|
+
* and the anchor is honest ("known paused since at least then"). */
|
|
104
|
+
rateLimitObservedAt(now) {
|
|
105
|
+
if (this.rateLimitedSince === 0)
|
|
106
|
+
this.rateLimitedSince = now;
|
|
107
|
+
return this.rateLimitedSince;
|
|
108
|
+
}
|
|
109
|
+
/** A cycle for this lane completed: reset on fully satisfied demand, else
|
|
110
|
+
* exponential backoff anchored at completion (never the stale start). */
|
|
111
|
+
notePollSuccess(completedAt, demandRemains) {
|
|
112
|
+
if (!demandRemains) {
|
|
113
|
+
this.failures = 0;
|
|
114
|
+
this.notBefore = 0;
|
|
115
|
+
return;
|
|
51
116
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
117
|
+
this.armBackoff(completedAt);
|
|
118
|
+
}
|
|
119
|
+
notePollFailure(completedAt) {
|
|
120
|
+
this.armBackoff(completedAt);
|
|
121
|
+
}
|
|
122
|
+
/** A cycle observed a typed `rate_limited` absence for this vendor: arm the
|
|
123
|
+
* floor at max(exponential ladder, vendor Retry-After), monotonic, and
|
|
124
|
+
* persist it (a null Retry-After — Anthropic does not always send one —
|
|
125
|
+
* still arms the exponential-derived floor). */
|
|
126
|
+
noteRateLimited(observedAt, retryAfterMs) {
|
|
127
|
+
const exponential = Math.min(POLL_BACKOFF_MS * 2 ** Math.max(this.failures - 1, 0), MAX_POLL_BACKOFF_MS);
|
|
128
|
+
const floor = Math.max(exponential, Math.min(retryAfterMs ?? 0, MAX_RATE_LIMIT_FLOOR_MS));
|
|
129
|
+
const until = observedAt + floor;
|
|
130
|
+
if (until <= this.rateLimitedNotBefore)
|
|
131
|
+
return;
|
|
132
|
+
this.rateLimitedNotBefore = until;
|
|
133
|
+
this.rateLimitedSince = observedAt;
|
|
134
|
+
if (this.vendor !== null) {
|
|
135
|
+
try {
|
|
136
|
+
this.store?.save(this.vendor, until);
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
/* fail-open: losing the durable floor only re-allows polling */
|
|
55
140
|
}
|
|
56
|
-
return false;
|
|
57
141
|
}
|
|
58
142
|
}
|
|
59
143
|
armBackoff(completedAt) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota-poll-pacer.js","sourceRoot":"","sources":["../src/quota-poll-pacer.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG,MAAM,CAAC;AAC/B,MAAM,mBAAmB,GAAG,EAAE,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"quota-poll-pacer.js","sourceRoot":"","sources":["../src/quota-poll-pacer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,eAAe,GAAG,MAAM,CAAC;AAC/B,MAAM,mBAAmB,GAAG,EAAE,GAAG,MAAM,CAAC;AACxC;;;oDAGoD;AACpD,MAAM,uBAAuB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;AAerD;;qCAEqC;AACrC,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,GAA6C,EAAE;QAC1D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAGnD,CAAC;YACF,OAAO,MAAM,EAAE,OAAO,KAAK,CAAC;gBAC1B,MAAM,CAAC,OAAO,KAAK,IAAI;gBACvB,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;gBAClC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC9B,CAAC,CAAE,MAAM,CAAC,OAAoD;gBAC9D,CAAC,CAAC,EAAE,CAAC;QACT,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;IACF,OAAO;QACL,IAAI,CAAC,MAAM;YACT,MAAM,GAAG,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;YACvC,MAAM,EAAE,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YAClE,OAAO,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,WAAW;YACtB,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC;YACvB,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACtE,MAAM,GAAG,GAAG,GAAG,IAAI,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC;YACzC,aAAa,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC5E,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,cAAc;IAQN,MAAM;IACN,KAAK;IARhB,QAAQ,GAAG,CAAC,CAAC;IACb,SAAS,GAAG,CAAC,CAAC;IACd,oBAAoB,GAAG,CAAC,CAAC;IACjC,2EAA2E;IACnE,gBAAgB,GAAG,CAAC,CAAC;IAE7B,YACmB,MAAM,GAAkB,IAAI,EAC5B,KAA4B;sBAD5B,MAAM;qBACN,KAAK;QAEtB,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3D,CAAC;YAAC,MAAM,CAAC;gBACP,oDAAoD;YACtD,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;2CAGuC;IACvC,oBAAoB;QAClB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,YAAY,CAAC,GAAW;QACtB,OAAO,GAAG,IAAI,IAAI,CAAC,SAAS,IAAI,GAAG,IAAI,IAAI,CAAC,oBAAoB,CAAC;IACnE,CAAC;IAED,0EAA0E;IAC1E,sBAAsB,CAAC,GAAW;QAChC,OAAO,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5E,CAAC;IAED;;;;wEAIoE;IACpE,mBAAmB,CAAC,GAAW;QAC7B,IAAI,IAAI,CAAC,gBAAgB,KAAK,CAAC;YAAE,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC;QAC7D,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED;6EACyE;IACzE,eAAe,CAAC,WAAmB,EAAE,aAAsB;QACzD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YAClB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED,eAAe,CAAC,WAAmB;QACjC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED;;;oDAGgD;IAChD,eAAe,CAAC,UAAkB,EAAE,YAA2B;QAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAC1B,eAAe,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC,EACrD,mBAAmB,CACpB,CAAC;QACF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC;QAC1F,MAAM,KAAK,GAAG,UAAU,GAAG,KAAK,CAAC;QACjC,IAAI,KAAK,IAAI,IAAI,CAAC,oBAAoB;YAAE,OAAO;QAC/C,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;QAClC,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC;QACnC,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC;gBACP,gEAAgE;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,WAAmB;QACpC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;QACnB,IAAI,CAAC,SAAS;YACZ,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAC5F,CAAC;CACF"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { DurableJournal } from "@claudexor/journal";
|
|
2
|
-
import
|
|
3
|
-
|
|
2
|
+
import type { QuotaPacerStateStore } from "./quota-poll-pacer.js";
|
|
3
|
+
import type { QuotaRefresher, QuotaVendorRefresher } from "./quota-poll-lanes.js";
|
|
4
|
+
import { QuotaRegistry, type QuotaSubjectUniverse } from "./quota-registry.js";
|
|
5
|
+
export declare function quotaProjection(refreshers?: readonly (QuotaRefresher | QuotaVendorRefresher)[], subjects?: QuotaSubjectUniverse, now?: () => Date, pacerStore?: QuotaPacerStateStore): {
|
|
4
6
|
name: string;
|
|
5
7
|
create: (journal: DurableJournal) => QuotaRegistry;
|
|
6
8
|
validate: (registry: QuotaRegistry) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota-projection.d.ts","sourceRoot":"","sources":["../src/quota-projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"quota-projection.d.ts","sourceRoot":"","sources":["../src/quota-projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE/E,wBAAgB,eAAe,CAC7B,UAAU,GAAE,SAAS,CAAC,cAAc,GAAG,oBAAoB,CAAC,EAAO,EACnE,QAAQ,CAAC,EAAE,oBAAoB,EAC/B,GAAG,GAAE,MAAM,IAAuB,EAClC,UAAU,CAAC,EAAE,oBAAoB;IAG/B,IAAI;IACJ,MAAM,YAAY,cAAc;IAEhC,QAAQ,aAAa,aAAa;IAClC,OAAO,aAAa,aAAa;EAEpC"}
|
package/dist/quota-projection.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { QuotaRegistry } from "./quota-registry.js";
|
|
2
|
-
export function quotaProjection(refreshers = [], subjects, now = () => new Date()) {
|
|
2
|
+
export function quotaProjection(refreshers = [], subjects, now = () => new Date(), pacerStore) {
|
|
3
3
|
return {
|
|
4
4
|
name: "quota",
|
|
5
|
-
create: (journal) => new QuotaRegistry(journal, refreshers, now, subjects),
|
|
5
|
+
create: (journal) => new QuotaRegistry(journal, refreshers, now, subjects, pacerStore),
|
|
6
6
|
validate: (registry) => registry.validateProjection(),
|
|
7
7
|
recover: (registry) => registry.recoverAfterStartup(),
|
|
8
8
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota-projection.js","sourceRoot":"","sources":["../src/quota-projection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"quota-projection.js","sourceRoot":"","sources":["../src/quota-projection.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAA6B,MAAM,qBAAqB,CAAC;AAE/E,MAAM,UAAU,eAAe,CAC7B,UAAU,GAAuD,EAAE,EACnE,QAA+B,EAC/B,GAAG,GAAe,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAClC,UAAiC;IAEjC,OAAO;QACL,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,CAAC,OAAuB,EAAE,EAAE,CAClC,IAAI,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC;QACnE,QAAQ,EAAE,CAAC,QAAuB,EAAE,EAAE,CAAC,QAAQ,CAAC,kBAAkB,EAAE;QACpE,OAAO,EAAE,CAAC,QAAuB,EAAE,EAAE,CAAC,QAAQ,CAAC,mBAAmB,EAAE;KACrE,CAAC;AACJ,CAAC"}
|
|
@@ -4,6 +4,9 @@ export declare class QuotaRefreshCoordinator<T> {
|
|
|
4
4
|
private inFlight;
|
|
5
5
|
retireCredentialGeneration(): void;
|
|
6
6
|
isCurrent(credentialGeneration: number): boolean;
|
|
7
|
+
/** The generation a caller should capture BEFORE a cycle to later ask
|
|
8
|
+
* whether a credential change intervened (per-lane pacing reads it). */
|
|
9
|
+
currentGeneration(): number;
|
|
7
10
|
run(start: (credentialGeneration: number) => Promise<T>, followCredentialChanges?: boolean): Promise<T>;
|
|
8
11
|
}
|
|
9
12
|
//# sourceMappingURL=quota-refresh-coordinator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota-refresh-coordinator.d.ts","sourceRoot":"","sources":["../src/quota-refresh-coordinator.ts"],"names":[],"mappings":"AAKA,8EAA8E;AAC9E,qBAAa,uBAAuB,CAAC,CAAC;IACpC,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,QAAQ,CAAgC;IAEhD,0BAA0B,IAAI,IAAI,CAEjC;IAED,SAAS,CAAC,oBAAoB,EAAE,MAAM,GAAG,OAAO,CAE/C;IAEK,GAAG,CACP,KAAK,EAAE,CAAC,oBAAoB,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACnD,uBAAuB,UAAO,GAC7B,OAAO,CAAC,CAAC,CAAC,CA6BZ;CACF"}
|
|
1
|
+
{"version":3,"file":"quota-refresh-coordinator.d.ts","sourceRoot":"","sources":["../src/quota-refresh-coordinator.ts"],"names":[],"mappings":"AAKA,8EAA8E;AAC9E,qBAAa,uBAAuB,CAAC,CAAC;IACpC,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,QAAQ,CAAgC;IAEhD,0BAA0B,IAAI,IAAI,CAEjC;IAED,SAAS,CAAC,oBAAoB,EAAE,MAAM,GAAG,OAAO,CAE/C;IAED;4EACwE;IACxE,iBAAiB,IAAI,MAAM,CAE1B;IAEK,GAAG,CACP,KAAK,EAAE,CAAC,oBAAoB,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACnD,uBAAuB,UAAO,GAC7B,OAAO,CAAC,CAAC,CAAC,CA6BZ;CACF"}
|
|
@@ -8,6 +8,11 @@ export class QuotaRefreshCoordinator {
|
|
|
8
8
|
isCurrent(credentialGeneration) {
|
|
9
9
|
return credentialGeneration === this.credentialGeneration;
|
|
10
10
|
}
|
|
11
|
+
/** The generation a caller should capture BEFORE a cycle to later ask
|
|
12
|
+
* whether a credential change intervened (per-lane pacing reads it). */
|
|
13
|
+
currentGeneration() {
|
|
14
|
+
return this.credentialGeneration;
|
|
15
|
+
}
|
|
11
16
|
async run(start, followCredentialChanges = true) {
|
|
12
17
|
const requestedGeneration = this.credentialGeneration;
|
|
13
18
|
for (;;) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota-refresh-coordinator.js","sourceRoot":"","sources":["../src/quota-refresh-coordinator.ts"],"names":[],"mappings":"AAKA,8EAA8E;AAC9E,MAAM,OAAO,uBAAuB;IAC1B,oBAAoB,GAAG,CAAC,CAAC;IACzB,QAAQ,GAA2B,IAAI,CAAC;IAEhD,0BAA0B;QACxB,IAAI,CAAC,oBAAoB,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,SAAS,CAAC,oBAA4B;QACpC,OAAO,oBAAoB,KAAK,IAAI,CAAC,oBAAoB,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,GAAG,CACP,KAAmD,EACnD,uBAAuB,GAAG,IAAI;QAE9B,MAAM,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAC;QACtD,SAAS,CAAC;YACR,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC;YACvD,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC1B,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,IAAI,OAAwB,CAAC;gBAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;oBACtD,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO;wBAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACtD,CAAC,CAAC,CAAC;gBACH,OAAO,GAAG,EAAE,oBAAoB,EAAE,MAAM,EAAE,CAAC;gBAC3C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;gBACxB,KAAK,GAAG,OAAO,CAAC;YAClB,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;gBAClC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,oBAAoB,CAAC;oBAAE,OAAO,MAAM,CAAC;gBAC9D,IAAI,CAAC,uBAAuB,IAAI,KAAK,CAAC,oBAAoB,KAAK,mBAAmB,EAAE,CAAC;oBACnF,OAAO,MAAM,CAAC;gBAChB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,oBAAoB,CAAC;oBAAE,MAAM,KAAK,CAAC;gBAC5D,IAAI,CAAC,uBAAuB,IAAI,KAAK,CAAC,oBAAoB,KAAK,mBAAmB,EAAE,CAAC;oBACnF,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YACD,oEAAoE;YACpE,wEAAwE;QAC1E,CAAC;IACH,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"quota-refresh-coordinator.js","sourceRoot":"","sources":["../src/quota-refresh-coordinator.ts"],"names":[],"mappings":"AAKA,8EAA8E;AAC9E,MAAM,OAAO,uBAAuB;IAC1B,oBAAoB,GAAG,CAAC,CAAC;IACzB,QAAQ,GAA2B,IAAI,CAAC;IAEhD,0BAA0B;QACxB,IAAI,CAAC,oBAAoB,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,SAAS,CAAC,oBAA4B;QACpC,OAAO,oBAAoB,KAAK,IAAI,CAAC,oBAAoB,CAAC;IAC5D,CAAC;IAED;4EACwE;IACxE,iBAAiB;QACf,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,GAAG,CACP,KAAmD,EACnD,uBAAuB,GAAG,IAAI;QAE9B,MAAM,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAC;QACtD,SAAS,CAAC;YACR,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC;YACvD,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC1B,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,IAAI,OAAwB,CAAC;gBAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;oBACtD,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO;wBAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACtD,CAAC,CAAC,CAAC;gBACH,OAAO,GAAG,EAAE,oBAAoB,EAAE,MAAM,EAAE,CAAC;gBAC3C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;gBACxB,KAAK,GAAG,OAAO,CAAC;YAClB,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;gBAClC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,oBAAoB,CAAC;oBAAE,OAAO,MAAM,CAAC;gBAC9D,IAAI,CAAC,uBAAuB,IAAI,KAAK,CAAC,oBAAoB,KAAK,mBAAmB,EAAE,CAAC;oBACnF,OAAO,MAAM,CAAC;gBAChB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,oBAAoB,CAAC;oBAAE,MAAM,KAAK,CAAC;gBAC5D,IAAI,CAAC,uBAAuB,IAAI,KAAK,CAAC,oBAAoB,KAAK,mBAAmB,EAAE,CAAC;oBACnF,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YACD,oEAAoE;YACpE,wEAAwE;QAC1E,CAAC;IACH,CAAC;CACF"}
|
package/dist/quota-registry.d.ts
CHANGED
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
import type { DurableJournal } from "@claudexor/journal";
|
|
2
|
-
import { type
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
* stated by the source, never inferred from an empty snapshot list. */
|
|
6
|
-
export interface QuotaRefreshResult {
|
|
7
|
-
snapshots: QuotaSnapshot[];
|
|
8
|
-
absences?: QuotaAbsence[];
|
|
9
|
-
}
|
|
10
|
-
export type QuotaRefresher = () => Promise<QuotaRefreshResult>;
|
|
2
|
+
import { type QuotaSnapshot, type QuotaSubject } from "@claudexor/schema";
|
|
3
|
+
import { type QuotaRefresher, type QuotaVendorRefresher } from "./quota-poll-lanes.js";
|
|
4
|
+
import type { QuotaPacerStateStore } from "./quota-poll-pacer.js";
|
|
11
5
|
/** The registered subject UNIVERSE: every subject the daemon expects to hear
|
|
12
6
|
* about, so a subject with neither snapshot nor a source claim still surfaces
|
|
13
7
|
* a "no_source" absence instead of vanishing. */
|
|
@@ -15,7 +9,6 @@ export type QuotaSubjectUniverse = () => QuotaSubject[];
|
|
|
15
9
|
/** Global-journal authority for vendor-owned quota snapshots. */
|
|
16
10
|
export declare class QuotaRegistry {
|
|
17
11
|
private readonly journal;
|
|
18
|
-
private readonly refreshers;
|
|
19
12
|
private readonly now;
|
|
20
13
|
private readonly subjects?;
|
|
21
14
|
private readonly snapshots;
|
|
@@ -28,9 +21,10 @@ export declare class QuotaRegistry {
|
|
|
28
21
|
* consumed by snapshot-then-SSE clients. */
|
|
29
22
|
private lastPublishedProjectionSignature;
|
|
30
23
|
private readonly refreshCoordinator;
|
|
31
|
-
private readonly
|
|
24
|
+
private readonly refresherLanes;
|
|
25
|
+
private pollSweepInFlight;
|
|
32
26
|
private recoveryMarkerPending;
|
|
33
|
-
constructor(journal: DurableJournal, refreshers?: readonly QuotaRefresher[], now?: () => Date, subjects?: QuotaSubjectUniverse | undefined);
|
|
27
|
+
constructor(journal: DurableJournal, refreshers?: readonly (QuotaRefresher | QuotaVendorRefresher)[], now?: () => Date, subjects?: QuotaSubjectUniverse | undefined, pacerStore?: QuotaPacerStateStore);
|
|
34
28
|
/** Publish the recovered projection boundary only after bootstrap activation. */
|
|
35
29
|
recoverAfterStartup(): void;
|
|
36
30
|
read(): {
|
|
@@ -72,11 +66,16 @@ export declare class QuotaRegistry {
|
|
|
72
66
|
plan_label: string | null;
|
|
73
67
|
subject_id: string | null;
|
|
74
68
|
};
|
|
75
|
-
reason: "auth_revoked" | "credential_profile_ambiguous" | "no_source" | "not_logged_in" | "platform_unsupported" | "refresh_failed" | "transport_unavailable";
|
|
69
|
+
reason: "auth_revoked" | "credential_profile_ambiguous" | "no_source" | "not_logged_in" | "platform_unsupported" | "poll_paced" | "probe_skipped_rate_limited" | "rate_limited" | "refresh_failed" | "transport_unavailable";
|
|
76
70
|
detail: string | null;
|
|
77
71
|
observed_at: string;
|
|
72
|
+
retry_after_ms?: number | undefined;
|
|
78
73
|
}[];
|
|
79
74
|
refreshed_at: string | null;
|
|
75
|
+
refresh_skipped?: {
|
|
76
|
+
vendor: string;
|
|
77
|
+
not_before: string;
|
|
78
|
+
}[] | undefined;
|
|
80
79
|
};
|
|
81
80
|
/** Freshness-annotated snapshots with expired (>24h) observations pruned.
|
|
82
81
|
* An old observation whose constraint still EXTENDS into the future (a
|
|
@@ -122,11 +121,16 @@ export declare class QuotaRegistry {
|
|
|
122
121
|
plan_label: string | null;
|
|
123
122
|
subject_id: string | null;
|
|
124
123
|
};
|
|
125
|
-
reason: "auth_revoked" | "credential_profile_ambiguous" | "no_source" | "not_logged_in" | "platform_unsupported" | "refresh_failed" | "transport_unavailable";
|
|
124
|
+
reason: "auth_revoked" | "credential_profile_ambiguous" | "no_source" | "not_logged_in" | "platform_unsupported" | "poll_paced" | "probe_skipped_rate_limited" | "rate_limited" | "refresh_failed" | "transport_unavailable";
|
|
126
125
|
detail: string | null;
|
|
127
126
|
observed_at: string;
|
|
127
|
+
retry_after_ms?: number | undefined;
|
|
128
128
|
}[];
|
|
129
129
|
refreshed_at: string | null;
|
|
130
|
+
refresh_skipped?: {
|
|
131
|
+
vendor: string;
|
|
132
|
+
not_before: string;
|
|
133
|
+
}[] | undefined;
|
|
130
134
|
}>;
|
|
131
135
|
/** Fresh quota plus the exact global-journal fence for snapshot-then-SSE.
|
|
132
136
|
* The cursor is captured inside refreshCycle, synchronously with `response`,
|
|
@@ -171,35 +175,59 @@ export declare class QuotaRegistry {
|
|
|
171
175
|
plan_label: string | null;
|
|
172
176
|
subject_id: string | null;
|
|
173
177
|
};
|
|
174
|
-
reason: "auth_revoked" | "credential_profile_ambiguous" | "no_source" | "not_logged_in" | "platform_unsupported" | "refresh_failed" | "transport_unavailable";
|
|
178
|
+
reason: "auth_revoked" | "credential_profile_ambiguous" | "no_source" | "not_logged_in" | "platform_unsupported" | "poll_paced" | "probe_skipped_rate_limited" | "rate_limited" | "refresh_failed" | "transport_unavailable";
|
|
175
179
|
detail: string | null;
|
|
176
180
|
observed_at: string;
|
|
181
|
+
retry_after_ms?: number | undefined;
|
|
177
182
|
}[];
|
|
178
183
|
refreshed_at: string | null;
|
|
184
|
+
refresh_skipped?: {
|
|
185
|
+
vendor: string;
|
|
186
|
+
not_before: string;
|
|
187
|
+
}[] | undefined;
|
|
179
188
|
};
|
|
180
189
|
quotaEventCursor: string;
|
|
181
190
|
}>;
|
|
182
|
-
/** One coalesced atomic refresh cycle
|
|
183
|
-
*
|
|
191
|
+
/** One coalesced atomic refresh cycle; a poll passes its lane so only that
|
|
192
|
+
* vendor's refreshers run. Join semantics are asymmetric on purpose: a poll
|
|
193
|
+
* joining a foreground FULL cycle keeps its (superset) result, but a FULL
|
|
194
|
+
* caller that joined a lane-SCOPED poll cycle re-runs a full cycle once it
|
|
195
|
+
* completes — an explicit refresh must not silently return with sibling
|
|
196
|
+
* vendors unre-fetched and undisclosed. Bounded retry; on exhaustion the
|
|
197
|
+
* last (complete-projection) result serves. */
|
|
184
198
|
private refreshCycle;
|
|
185
199
|
private performRefreshCycle;
|
|
186
200
|
/** Aggregate one cycle's snapshots + absence claims against the subject
|
|
187
201
|
* universe (V11a): a fresh-or-stale snapshot from ANY source means no
|
|
188
202
|
* absence; else the first refresher-claimed absence wins; neither =>
|
|
189
203
|
* "no_source". Identity is (harness, subject_id); route/source never split
|
|
190
|
-
* a subject.
|
|
204
|
+
* a subject.
|
|
205
|
+
*
|
|
206
|
+
* `scope` (a vendor-lane cycle) rebuilds only that vendor's rows plus every
|
|
207
|
+
* REFRESHERLESS harness's rows (those can only ever be `no_source`, and
|
|
208
|
+
* skipping them would leave e.g. a cursor subject silently unstated until
|
|
209
|
+
* the next full cycle); other vendors' claimed rows are preserved so a
|
|
210
|
+
* claude-only poll cannot degrade codex's typed reasons to no_source.
|
|
211
|
+
* `null` scope (a full cycle, or an anonymous-lane cycle whose coverage is
|
|
212
|
+
* unknowable) keeps the pre-existing full rebuild. */
|
|
191
213
|
private recomputeAbsences;
|
|
192
214
|
/** Absences whose subject is not (any longer) covered by an active snapshot —
|
|
193
|
-
* a snapshot arriving via ingest between cycles silences its absence at once
|
|
194
|
-
*
|
|
215
|
+
* a snapshot arriving via ingest between cycles silences its absence at once.
|
|
216
|
+
* Gap honesty for suppressed polls: a GAP-representation row is silenced
|
|
217
|
+
* only by a FRESH snapshot (stale last-known data and the "not re-asked"
|
|
218
|
+
* fact stay visible together), and a floor-suppressed vendor's unstated
|
|
219
|
+
* subjects gain DERIVED `poll_paced` rows (see derivePollPacedRows). */
|
|
195
220
|
private activeAbsences;
|
|
196
221
|
/** Credential or routability state changed (login/profile/native/settings):
|
|
197
|
-
* drop
|
|
198
|
-
* instead of waiting out up to 15 minutes of old-state
|
|
222
|
+
* drop the credential-demand backoff so the next poll observes the new
|
|
223
|
+
* subject universe instead of waiting out up to 15 minutes of old-state
|
|
224
|
+
* pacing. Each lane's vendor rate-limit floor deliberately survives — a
|
|
225
|
+
* login does not un-rate-limit the vendor endpoint. */
|
|
199
226
|
noteCredentialChange(): void;
|
|
200
|
-
/** Background official-source refresh for per-subject primary demand.
|
|
201
|
-
*
|
|
202
|
-
*
|
|
227
|
+
/** Background official-source refresh for per-subject primary demand. One
|
|
228
|
+
* single-flight sweep drives every vendor lane in order; each eligible lane
|
|
229
|
+
* runs its own coalesced cycle, so one vendor's backoff never starves a
|
|
230
|
+
* sibling vendor's freshness. Resolves true when any lane refreshed. */
|
|
203
231
|
pollStale(): Promise<boolean>;
|
|
204
232
|
ingest(harnessId: string, value: unknown): void;
|
|
205
233
|
upsert(value: QuotaSnapshot): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota-registry.d.ts","sourceRoot":"","sources":["../src/quota-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,
|
|
1
|
+
{"version":3,"file":"quota-registry.d.ts","sourceRoot":"","sources":["../src/quota-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAUL,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAQ3B,OAAO,EAUL,KAAK,cAAc,EACnB,KAAK,oBAAoB,EAE1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAYlE;;iDAEiD;AACjD,MAAM,MAAM,oBAAoB,GAAG,MAAM,YAAY,EAAE,CAAC;AAExD,iEAAiE;AACjE,qBAAa,aAAa;IAkBtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAExB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IApB5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoC;IAC9D;;iDAE6C;IAC7C,OAAO,CAAC,QAAQ,CAAsB;IACtC;;gDAE4C;IAC5C,OAAO,CAAC,gCAAgC,CAAuB;IAC/D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAE/B;IACJ,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,iBAAiB,CAAiC;IAC1D,OAAO,CAAC,qBAAqB,CAAS;IAEtC,YACmB,OAAO,EAAE,cAAc,EACxC,UAAU,GAAE,SAAS,CAAC,cAAc,GAAG,oBAAoB,CAAC,EAAO,EAClD,GAAG,GAAE,MAAM,IAAuB,EAClC,QAAQ,CAAC,EAAE,oBAAoB,YAAA,EAChD,UAAU,CAAC,EAAE,oBAAoB,EAsElC;IAED,iFAAiF;IACjF,mBAAmB,IAAI,IAAI,CAI1B;IAED,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAOH;IAED;;;6EAGyE;IACzE,OAAO,CAAC,eAAe;IAkBjB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAEZ;IAED;;8EAE0E;IACpE,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAGtB;IAED;;;;;;mDAM+C;YACjC,YAAY;YAcZ,mBAAmB;IA2FjC;;;;;;;;;;;;0DAYsD;IACtD,OAAO,CAAC,iBAAiB;IAyCzB;;;;;4EAKwE;IACxE,OAAO,CAAC,cAAc;IAatB;;;;2DAIuD;IACvD,oBAAoB,IAAI,IAAI,CAG3B;IAED;;;4EAGwE;IACxE,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAe5B;IAED,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CA2B9C;IAED,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAGjC;IAED,OAAO,CAAC,YAAY;IA8BpB;;6EAEyE;IACzE,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAW/D;IAED,OAAO,CAAC,sBAAsB;IAe9B,OAAO,CAAC,8BAA8B;IAOtC,OAAO,CAAC,mBAAmB;IAM3B,kBAAkB,IAAI,IAAI,CAEzB;IAED,OAAO,CAAC,cAAc;IA0DtB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,MAAM;CAUf"}
|
package/dist/quota-registry.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { hashJson } from "@claudexor/util";
|
|
2
|
-
import { ControlQuotaResponse, HarnessEvent, QuotaAbsence as QuotaAbsenceSchema, QuotaSnapshot as QuotaSnapshotSchema, REACTIVE_COOLDOWN_SOURCE, vendorResetDayCooldownEnd, } from "@claudexor/schema";
|
|
2
|
+
import { ControlQuotaResponse, HarnessEvent, QUOTA_GAP_ABSENCE_REASONS, QuotaAbsence as QuotaAbsenceSchema, QuotaSnapshot as QuotaSnapshotSchema, REACTIVE_COOLDOWN_SOURCE, vendorResetDayCooldownEnd, } from "@claudexor/schema";
|
|
3
3
|
import { isExpiredScopedCooldown, legacyV320Snapshot, snapshotKey, staleAt, withoutExpiredScopedCooldowns, } from "./quota-registry-support.js";
|
|
4
|
-
import {
|
|
4
|
+
import { buildRefresherLanes, derivePollPacedRows, foldAbsenceClaims, laneHasDemand, performPollSweep, recomputeScopeFor, selectCycleEntries, subjectCoverSets, } from "./quota-poll-lanes.js";
|
|
5
5
|
import { QuotaRefreshCoordinator } from "./quota-refresh-coordinator.js";
|
|
6
|
-
import { quotaSubjectIdentity
|
|
6
|
+
import { quotaSubjectIdentity } from "./quota-refresh-demand.js";
|
|
7
7
|
const UPSERTED = "quota.snapshot.upserted";
|
|
8
8
|
const SCOPED_PREPARED = "quota.snapshot.scoped_prepared";
|
|
9
9
|
const REMOVED = "quota.subject.removed";
|
|
@@ -14,7 +14,6 @@ const MAX_SNAPSHOT_AGE_MS = 24 * 60 * 60_000;
|
|
|
14
14
|
/** Global-journal authority for vendor-owned quota snapshots. */
|
|
15
15
|
export class QuotaRegistry {
|
|
16
16
|
journal;
|
|
17
|
-
refreshers;
|
|
18
17
|
now;
|
|
19
18
|
subjects;
|
|
20
19
|
snapshots = new Map();
|
|
@@ -27,11 +26,11 @@ export class QuotaRegistry {
|
|
|
27
26
|
* consumed by snapshot-then-SSE clients. */
|
|
28
27
|
lastPublishedProjectionSignature = null;
|
|
29
28
|
refreshCoordinator = new QuotaRefreshCoordinator();
|
|
30
|
-
|
|
29
|
+
refresherLanes;
|
|
30
|
+
pollSweepInFlight = null;
|
|
31
31
|
recoveryMarkerPending = false;
|
|
32
|
-
constructor(journal, refreshers = [], now = () => new Date(), subjects) {
|
|
32
|
+
constructor(journal, refreshers = [], now = () => new Date(), subjects, pacerStore) {
|
|
33
33
|
this.journal = journal;
|
|
34
|
-
this.refreshers = refreshers;
|
|
35
34
|
this.now = now;
|
|
36
35
|
this.subjects = subjects;
|
|
37
36
|
let rawMutationAfterMarker = false;
|
|
@@ -93,14 +92,7 @@ export class QuotaRegistry {
|
|
|
93
92
|
// already-subscribed clients permanently behind. Close the recovered
|
|
94
93
|
// commit boundary synchronously before the projection becomes available.
|
|
95
94
|
this.recoveryMarkerPending = rawMutationAfterMarker;
|
|
96
|
-
this.
|
|
97
|
-
now: this.now,
|
|
98
|
-
publishClockTransition: () => this.publishClockTransitionIfNeeded(),
|
|
99
|
-
hasDemand: (now) => remainingQuotaRefreshDemand(this.activeSnapshots(now), this.subjects?.()).size > 0,
|
|
100
|
-
refresh: async () => {
|
|
101
|
-
await this.refreshCycle(false);
|
|
102
|
-
},
|
|
103
|
-
});
|
|
95
|
+
this.refresherLanes = buildRefresherLanes(refreshers, pacerStore);
|
|
104
96
|
}
|
|
105
97
|
/** Publish the recovered projection boundary only after bootstrap activation. */
|
|
106
98
|
recoverAfterStartup() {
|
|
@@ -148,19 +140,31 @@ export class QuotaRegistry {
|
|
|
148
140
|
const { response, quotaEventCursor } = await this.refreshCycle();
|
|
149
141
|
return { response, quotaEventCursor };
|
|
150
142
|
}
|
|
151
|
-
/** One coalesced atomic refresh cycle
|
|
152
|
-
*
|
|
153
|
-
|
|
154
|
-
|
|
143
|
+
/** One coalesced atomic refresh cycle; a poll passes its lane so only that
|
|
144
|
+
* vendor's refreshers run. Join semantics are asymmetric on purpose: a poll
|
|
145
|
+
* joining a foreground FULL cycle keeps its (superset) result, but a FULL
|
|
146
|
+
* caller that joined a lane-SCOPED poll cycle re-runs a full cycle once it
|
|
147
|
+
* completes — an explicit refresh must not silently return with sibling
|
|
148
|
+
* vendors unre-fetched and undisclosed. Bounded retry; on exhaustion the
|
|
149
|
+
* last (complete-projection) result serves. */
|
|
150
|
+
async refreshCycle(followCredentialChanges = true, scope) {
|
|
151
|
+
for (let attempt = 0;; attempt += 1) {
|
|
152
|
+
const cycle = await this.refreshCoordinator.run((credentialGeneration) => this.performRefreshCycle(credentialGeneration, scope ?? null), followCredentialChanges);
|
|
153
|
+
if (scope !== undefined || !cycle.scoped || attempt > this.refresherLanes.lanes.length)
|
|
154
|
+
return cycle;
|
|
155
|
+
}
|
|
155
156
|
}
|
|
156
|
-
async performRefreshCycle(credentialGeneration) {
|
|
157
|
-
if (this.
|
|
157
|
+
async performRefreshCycle(credentialGeneration, scope) {
|
|
158
|
+
if (this.refresherLanes.entries.length === 0) {
|
|
158
159
|
throw Object.assign(new Error("no live vendor-owned quota refresh source is available"), {
|
|
159
160
|
code: "quota_refresh_unavailable",
|
|
160
161
|
status: 503,
|
|
161
162
|
});
|
|
162
163
|
}
|
|
163
|
-
|
|
164
|
+
// Foreground cycles honor each vendor lane's rate-limit cooldown; the
|
|
165
|
+
// skips serve last-known registry data and are disclosed additively.
|
|
166
|
+
const { running, skipped } = selectCycleEntries(this.refresherLanes, scope, this.now().getTime());
|
|
167
|
+
const settled = await Promise.allSettled(running.map(async ({ refresh }) => refresh()));
|
|
164
168
|
const batches = [];
|
|
165
169
|
const failures = [];
|
|
166
170
|
// Validate EVERY fulfilled source batch before the first durable write.
|
|
@@ -183,7 +187,10 @@ export class QuotaRegistry {
|
|
|
183
187
|
batches.push(null);
|
|
184
188
|
}
|
|
185
189
|
}
|
|
186
|
-
|
|
190
|
+
// An all-cooled full cycle (running empty, skips disclosed) is a served
|
|
191
|
+
// last-known response, not a failure; only attempted-and-failed sources
|
|
192
|
+
// make the cycle unavailable.
|
|
193
|
+
if (running.length > 0 && batches.every((batch) => batch === null)) {
|
|
187
194
|
throw Object.assign(new Error(`quota refresh failed: ${failures.join("; ")}`), {
|
|
188
195
|
code: "quota_refresh_unavailable",
|
|
189
196
|
status: 503,
|
|
@@ -208,25 +215,48 @@ export class QuotaRegistry {
|
|
|
208
215
|
claims.push(...batch.absences);
|
|
209
216
|
}
|
|
210
217
|
const now = this.now().getTime();
|
|
211
|
-
|
|
218
|
+
if (running.length > 0)
|
|
219
|
+
this.recomputeAbsences(claims, now, recomputeScopeFor(running));
|
|
220
|
+
// A typed rate_limited absence is PACING evidence (owner decision 7=A):
|
|
221
|
+
// arm the vendor lane's persisted floor — foreground cycles included, so
|
|
222
|
+
// an explicit refresh that got throttled also cools later fan-outs — and
|
|
223
|
+
// never journal it as a quota cooldown.
|
|
224
|
+
for (const claim of claims) {
|
|
225
|
+
if (claim.reason !== "rate_limited")
|
|
226
|
+
continue;
|
|
227
|
+
const lane = this.refresherLanes.lanes.find((item) => item.vendor === claim.subject.harness);
|
|
228
|
+
lane?.pacer.noteRateLimited(now, claim.retry_after_ms ?? null);
|
|
229
|
+
}
|
|
212
230
|
const refreshedAt = this.now().toISOString();
|
|
213
231
|
const response = ControlQuotaResponse.parse({
|
|
214
232
|
snapshots: this.activeSnapshots(now),
|
|
215
233
|
absences: this.activeAbsences(now),
|
|
216
234
|
refreshed_at: refreshedAt,
|
|
235
|
+
...(skipped.length > 0 ? { refresh_skipped: skipped } : {}),
|
|
217
236
|
});
|
|
218
237
|
// No await may appear between response construction and this marker/cursor.
|
|
219
238
|
// The marker makes absence-only and identical refreshes observable; its own
|
|
220
239
|
// cursor is the exact last event represented by this response.
|
|
221
240
|
const quotaEventCursor = this.appendProjectionMarker("refresh", refreshedAt, response);
|
|
222
|
-
|
|
241
|
+
// scoped: an unscoped joiner re-runs a full cycle on it (join semantics).
|
|
242
|
+
return { response, quotaEventCursor, scoped: scope !== null };
|
|
223
243
|
}
|
|
224
244
|
/** Aggregate one cycle's snapshots + absence claims against the subject
|
|
225
245
|
* universe (V11a): a fresh-or-stale snapshot from ANY source means no
|
|
226
246
|
* absence; else the first refresher-claimed absence wins; neither =>
|
|
227
247
|
* "no_source". Identity is (harness, subject_id); route/source never split
|
|
228
|
-
* a subject.
|
|
229
|
-
|
|
248
|
+
* a subject.
|
|
249
|
+
*
|
|
250
|
+
* `scope` (a vendor-lane cycle) rebuilds only that vendor's rows plus every
|
|
251
|
+
* REFRESHERLESS harness's rows (those can only ever be `no_source`, and
|
|
252
|
+
* skipping them would leave e.g. a cursor subject silently unstated until
|
|
253
|
+
* the next full cycle); other vendors' claimed rows are preserved so a
|
|
254
|
+
* claude-only poll cannot degrade codex's typed reasons to no_source.
|
|
255
|
+
* `null` scope (a full cycle, or an anonymous-lane cycle whose coverage is
|
|
256
|
+
* unknowable) keeps the pre-existing full rebuild. */
|
|
257
|
+
recomputeAbsences(claims, now, scope = null) {
|
|
258
|
+
const laneVendors = new Set(this.refresherLanes.lanes.map((lane) => lane.vendor).filter((vendor) => vendor !== null));
|
|
259
|
+
const rebuilt = (harness) => scope === null || scope.has(harness) || !laneVendors.has(harness);
|
|
230
260
|
// Every other reason answers "why is there no snapshot", so a snapshot
|
|
231
261
|
// silences it. `auth_revoked` says the vendor rejected the credential;
|
|
232
262
|
// `credential_profile_ambiguous` says current platform policy forbids
|
|
@@ -245,49 +275,60 @@ export class QuotaRegistry {
|
|
|
245
275
|
this.journal.append(REMOVED, { harness, subject_id });
|
|
246
276
|
this.remove(harness, subject_id);
|
|
247
277
|
}
|
|
248
|
-
const covered =
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
}
|
|
258
|
-
for (const subject of this.subjects?.() ?? []) {
|
|
259
|
-
const key = quotaSubjectIdentity(subject);
|
|
260
|
-
if (covered.has(key) || claimed.has(key))
|
|
261
|
-
continue;
|
|
262
|
-
claimed.add(key);
|
|
263
|
-
result.push({
|
|
264
|
-
subject,
|
|
265
|
-
reason: "no_source",
|
|
266
|
-
detail: null,
|
|
267
|
-
observed_at: new Date(now).toISOString(),
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
this.absences = result;
|
|
278
|
+
const { covered, freshCovered } = subjectCoverSets(this.activeSnapshots(now));
|
|
279
|
+
this.absences = foldAbsenceClaims({
|
|
280
|
+
claims,
|
|
281
|
+
prior: this.absences,
|
|
282
|
+
rebuilt,
|
|
283
|
+
covered,
|
|
284
|
+
freshCovered,
|
|
285
|
+
subjects: this.subjects?.() ?? [],
|
|
286
|
+
now,
|
|
287
|
+
});
|
|
271
288
|
}
|
|
272
289
|
/** Absences whose subject is not (any longer) covered by an active snapshot —
|
|
273
|
-
* a snapshot arriving via ingest between cycles silences its absence at once
|
|
274
|
-
*
|
|
290
|
+
* a snapshot arriving via ingest between cycles silences its absence at once.
|
|
291
|
+
* Gap honesty for suppressed polls: a GAP-representation row is silenced
|
|
292
|
+
* only by a FRESH snapshot (stale last-known data and the "not re-asked"
|
|
293
|
+
* fact stay visible together), and a floor-suppressed vendor's unstated
|
|
294
|
+
* subjects gain DERIVED `poll_paced` rows (see derivePollPacedRows). */
|
|
275
295
|
activeAbsences(now) {
|
|
276
|
-
const covered =
|
|
277
|
-
|
|
296
|
+
const { covered, freshCovered } = subjectCoverSets(this.activeSnapshots(now));
|
|
297
|
+
const rows = this.absences.filter((absence) => !(QUOTA_GAP_ABSENCE_REASONS.has(absence.reason) ? freshCovered : covered).has(quotaSubjectIdentity(absence.subject)));
|
|
298
|
+
const subjects = this.subjects?.() ?? [];
|
|
299
|
+
const lanes = this.refresherLanes.lanes;
|
|
300
|
+
return rows.concat(derivePollPacedRows(lanes, subjects, rows, freshCovered, now));
|
|
278
301
|
}
|
|
279
302
|
/** Credential or routability state changed (login/profile/native/settings):
|
|
280
|
-
* drop
|
|
281
|
-
* instead of waiting out up to 15 minutes of old-state
|
|
303
|
+
* drop the credential-demand backoff so the next poll observes the new
|
|
304
|
+
* subject universe instead of waiting out up to 15 minutes of old-state
|
|
305
|
+
* pacing. Each lane's vendor rate-limit floor deliberately survives — a
|
|
306
|
+
* login does not un-rate-limit the vendor endpoint. */
|
|
282
307
|
noteCredentialChange() {
|
|
283
308
|
this.refreshCoordinator.retireCredentialGeneration();
|
|
284
|
-
this.
|
|
309
|
+
for (const lane of this.refresherLanes.lanes)
|
|
310
|
+
lane.pacer.noteCredentialChange();
|
|
285
311
|
}
|
|
286
|
-
/** Background official-source refresh for per-subject primary demand.
|
|
287
|
-
*
|
|
288
|
-
*
|
|
312
|
+
/** Background official-source refresh for per-subject primary demand. One
|
|
313
|
+
* single-flight sweep drives every vendor lane in order; each eligible lane
|
|
314
|
+
* runs its own coalesced cycle, so one vendor's backoff never starves a
|
|
315
|
+
* sibling vendor's freshness. Resolves true when any lane refreshed. */
|
|
289
316
|
pollStale() {
|
|
290
|
-
|
|
317
|
+
if (this.pollSweepInFlight)
|
|
318
|
+
return this.pollSweepInFlight;
|
|
319
|
+
const sweep = performPollSweep(this.refresherLanes.lanes, {
|
|
320
|
+
now: this.now,
|
|
321
|
+
publishClockTransition: () => this.publishClockTransitionIfNeeded(),
|
|
322
|
+
laneHasDemand: (vendor, now) => laneHasDemand(vendor, this.activeSnapshots(now), this.subjects?.()),
|
|
323
|
+
currentGeneration: () => this.refreshCoordinator.currentGeneration(),
|
|
324
|
+
isCurrentGeneration: (generation) => this.refreshCoordinator.isCurrent(generation),
|
|
325
|
+
runLaneCycle: (lane) => this.refreshCycle(false, lane),
|
|
326
|
+
}).finally(() => {
|
|
327
|
+
if (this.pollSweepInFlight === sweep)
|
|
328
|
+
this.pollSweepInFlight = null;
|
|
329
|
+
});
|
|
330
|
+
this.pollSweepInFlight = sweep;
|
|
331
|
+
return sweep;
|
|
291
332
|
}
|
|
292
333
|
ingest(harnessId, value) {
|
|
293
334
|
const event = HarnessEvent.safeParse(value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota-registry.js","sourceRoot":"","sources":["../src/quota-registry.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"quota-registry.js","sourceRoot":"","sources":["../src/quota-registry.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@claudexor/daemon",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.9.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Managed local daemon: Unix-socket JSON-RPC, token auth, task queue. Runner injected (no second scheduler).",
|
|
6
6
|
"type": "module",
|
|
@@ -17,10 +17,10 @@
|
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"yaml": "^2.8.2",
|
|
20
|
-
"@claudexor/core": "3.
|
|
21
|
-
"@claudexor/
|
|
22
|
-
"@claudexor/
|
|
23
|
-
"@claudexor/
|
|
20
|
+
"@claudexor/core": "3.9.1",
|
|
21
|
+
"@claudexor/journal": "3.9.1",
|
|
22
|
+
"@claudexor/schema": "3.9.1",
|
|
23
|
+
"@claudexor/util": "3.9.1"
|
|
24
24
|
},
|
|
25
25
|
"repository": {
|
|
26
26
|
"type": "git",
|