@claudexor/daemon 3.19.0 → 3.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/command-retention.d.ts +1 -1
- package/dist/command-retention.d.ts.map +1 -1
- package/dist/command-retention.js +20 -4
- package/dist/command-retention.js.map +1 -1
- package/dist/continuation-admission.d.ts +11 -0
- package/dist/continuation-admission.d.ts.map +1 -0
- package/dist/continuation-admission.js +16 -0
- package/dist/continuation-admission.js.map +1 -0
- package/dist/credential-generation.d.ts +18 -0
- package/dist/credential-generation.d.ts.map +1 -0
- package/dist/credential-generation.js +43 -0
- package/dist/credential-generation.js.map +1 -0
- package/dist/credential-unusable-ledger.d.ts +26 -22
- package/dist/credential-unusable-ledger.d.ts.map +1 -1
- package/dist/credential-unusable-ledger.js +178 -38
- package/dist/credential-unusable-ledger.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/journal-fold-policy.d.ts.map +1 -1
- package/dist/journal-fold-policy.js +26 -2
- package/dist/journal-fold-policy.js.map +1 -1
- package/dist/pre-progress-refusal-ledger.d.ts +3 -6
- package/dist/pre-progress-refusal-ledger.d.ts.map +1 -1
- package/dist/pre-progress-refusal-ledger.js +7 -16
- package/dist/pre-progress-refusal-ledger.js.map +1 -1
- package/dist/project-partitions.d.ts +4 -0
- package/dist/project-partitions.d.ts.map +1 -1
- package/dist/project-partitions.js +7 -0
- package/dist/project-partitions.js.map +1 -1
- package/dist/quota-poll-lanes.d.ts +27 -9
- package/dist/quota-poll-lanes.d.ts.map +1 -1
- package/dist/quota-poll-lanes.js +95 -20
- package/dist/quota-poll-lanes.js.map +1 -1
- package/dist/quota-poll-pacer.d.ts +33 -36
- package/dist/quota-poll-pacer.d.ts.map +1 -1
- package/dist/quota-poll-pacer.js +115 -63
- package/dist/quota-poll-pacer.js.map +1 -1
- package/dist/quota-registry-support.d.ts +74 -0
- package/dist/quota-registry-support.d.ts.map +1 -1
- package/dist/quota-registry-support.js +154 -8
- package/dist/quota-registry-support.js.map +1 -1
- package/dist/quota-registry.d.ts +32 -7
- package/dist/quota-registry.d.ts.map +1 -1
- package/dist/quota-registry.js +76 -73
- package/dist/quota-registry.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -1
- package/dist/server.js.map +1 -1
- package/dist/terminal-authority.d.ts +1 -0
- package/dist/terminal-authority.d.ts.map +1 -1
- package/dist/thread-store-support.d.ts.map +1 -1
- package/dist/thread-store-support.js +10 -1
- package/dist/thread-store-support.js.map +1 -1
- package/dist/threads.d.ts +3 -1
- package/dist/threads.d.ts.map +1 -1
- package/dist/threads.js +2 -2
- package/dist/threads.js.map +1 -1
- package/package.json +6 -5
package/dist/quota-poll-lanes.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { QUOTA_GAP_ABSENCE_REASONS } from "@claudexor/schema";
|
|
1
|
+
import { QUOTA_GAP_ABSENCE_REASONS, quotaSourceTraits } from "@claudexor/schema";
|
|
2
2
|
import { QuotaPollPacer } from "./quota-poll-pacer.js";
|
|
3
3
|
import { earliestFreshRenewalAt, earliestQuotaRenewalAt, latestQuotaRenewalObservedAt, quotaSubjectIdentity, remainingQuotaRefreshDemand, } from "./quota-refresh-demand.js";
|
|
4
4
|
export const QUOTA_POLL_INTERVAL_MS = 60_000;
|
|
@@ -66,7 +66,13 @@ export async function performPollSweep(lanes, deps) {
|
|
|
66
66
|
* snapshots; an anonymous lane keeps the pre-existing global semantics.
|
|
67
67
|
* `since` is the start of the cycle being judged: evidence it observed whose
|
|
68
68
|
* window resets before the next tick is renewal due at that tick. */
|
|
69
|
-
export function laneDemand(vendor, snapshots, subjects, now, dueBefore, since) {
|
|
69
|
+
export function laneDemand(vendor, snapshots, subjects, now, dueBefore, since, lanes = []) {
|
|
70
|
+
// A paced subject contributes neither demand nor a renewal horizon until
|
|
71
|
+
// its floor expires, so healthy siblings keep their ordinary cadence.
|
|
72
|
+
subjects = subjects?.filter((subject) => {
|
|
73
|
+
const lane = lanes.find((item) => item.vendor === subject.harness);
|
|
74
|
+
return lane?.pacer.rateLimitCooldownUntil(now, subject) == null;
|
|
75
|
+
});
|
|
70
76
|
const laneSnapshots = vendor === null
|
|
71
77
|
? snapshots
|
|
72
78
|
: snapshots.filter((snapshot) => snapshot.subject.harness === vendor);
|
|
@@ -80,13 +86,13 @@ export function laneDemand(vendor, snapshots, subjects, now, dueBefore, since) {
|
|
|
80
86
|
};
|
|
81
87
|
}
|
|
82
88
|
/** Select which refreshers one cycle runs. A full (foreground) cycle honors
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
89
|
+
* legacy vendor floors and current subject floors. Fully paced lanes stay
|
|
90
|
+
* idle; a partially paced source receives the same floor callbacks and
|
|
91
|
+
* continues its serial sweep for eligible accounts. Skips are disclosed. A poll-scoped cycle was already gated by the sweep. Anonymous
|
|
86
92
|
* lanes never carry a floor and always run. Every running refresher is bound
|
|
87
93
|
* to the cycle kind (foreground vs poll), so a source can honor an explicit
|
|
88
94
|
* refresh while the registry keeps calling `refresh()`. */
|
|
89
|
-
export function selectCycleEntries(refresherLanes, scope, nowMs) {
|
|
95
|
+
export function selectCycleEntries(refresherLanes, scope, nowMs, isCurrent = () => true, subjects = [], snapshots = []) {
|
|
90
96
|
const skipped = scope === null
|
|
91
97
|
? refresherLanes.lanes.flatMap((lane) => {
|
|
92
98
|
const until = lane.vendor === null ? null : lane.pacer.rateLimitCooldownUntil(nowMs);
|
|
@@ -96,13 +102,81 @@ export function selectCycleEntries(refresherLanes, scope, nowMs) {
|
|
|
96
102
|
})
|
|
97
103
|
: [];
|
|
98
104
|
const skippedVendors = new Set(skipped.map((row) => row.vendor));
|
|
99
|
-
const
|
|
105
|
+
const subjectSkips = subjects.flatMap((subject) => {
|
|
106
|
+
if (skippedVendors.has(subject.harness) || (scope !== null && scope.vendor !== subject.harness))
|
|
107
|
+
return [];
|
|
108
|
+
const lane = refresherLanes.lanes.find((item) => item.vendor === subject.harness);
|
|
109
|
+
const until = lane?.pacer.rateLimitCooldownUntil(nowMs, subject) ?? null;
|
|
110
|
+
return until === null
|
|
111
|
+
? []
|
|
112
|
+
: [{ vendor: subject.harness, subject, not_before: new Date(until).toISOString() }];
|
|
113
|
+
});
|
|
114
|
+
for (const lane of refresherLanes.lanes) {
|
|
115
|
+
if (lane.vendor === null)
|
|
116
|
+
continue;
|
|
117
|
+
const owned = subjects.filter((subject) => subject.harness === lane.vendor);
|
|
118
|
+
if (owned.length > 0 &&
|
|
119
|
+
owned.every((subject) => lane.pacer.rateLimitCooldownUntil(nowMs, subject) !== null)) {
|
|
120
|
+
skippedVendors.add(lane.vendor);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
100
123
|
const running = refresherLanes.entries
|
|
101
124
|
.filter((entry) => scope === null
|
|
102
125
|
? entry.lane.vendor === null || !skippedVendors.has(entry.lane.vendor)
|
|
103
|
-
: entry.lane === scope
|
|
104
|
-
|
|
105
|
-
|
|
126
|
+
: entry.lane === scope &&
|
|
127
|
+
(entry.lane.vendor === null || !skippedVendors.has(entry.lane.vendor)))
|
|
128
|
+
.map((entry) => ({
|
|
129
|
+
lane: entry.lane,
|
|
130
|
+
refresh: () => entry.refresh({
|
|
131
|
+
foreground: scope === null,
|
|
132
|
+
shouldRefresh: (subject) => scope === null ||
|
|
133
|
+
remainingQuotaRefreshDemand(snapshots.filter((snapshot) => snapshot.subject.credential_route === subject.credential_route), [subject], nowMs + QUOTA_POLL_INTERVAL_MS).size > 0,
|
|
134
|
+
pacing: {
|
|
135
|
+
bindCredentials: (bindings) => {
|
|
136
|
+
if (isCurrent())
|
|
137
|
+
entry.lane.pacer.bindCredentials(bindings);
|
|
138
|
+
},
|
|
139
|
+
cooldownUntil: (subject, now) => entry.lane.pacer.rateLimitCooldownUntil(now, subject),
|
|
140
|
+
noteRateLimited: (subject, observedAt, retryAfterMs) => {
|
|
141
|
+
if (isCurrent())
|
|
142
|
+
entry.lane.pacer.noteRateLimited(observedAt, retryAfterMs, subject);
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
}),
|
|
146
|
+
}));
|
|
147
|
+
return { running, skipped: [...skipped, ...subjectSkips] };
|
|
148
|
+
}
|
|
149
|
+
/** Commit validated source pacing independently of quota facts. Immediate
|
|
150
|
+
* producer callbacks already protect token aliases in the serial source pass;
|
|
151
|
+
* re-stating the same 429 here is idempotent. Sources without such callbacks
|
|
152
|
+
* still receive the subject floor after their batch validates. */
|
|
153
|
+
export function noteRefreshPacing(lanes, snapshots, claims, skipped, now) {
|
|
154
|
+
for (const snapshot of snapshots) {
|
|
155
|
+
if (quotaSourceTraits(snapshot.source).refreshDemandHarness !== snapshot.subject.harness)
|
|
156
|
+
continue;
|
|
157
|
+
lanes
|
|
158
|
+
.find((lane) => lane.vendor === snapshot.subject.harness)
|
|
159
|
+
?.pacer.noteSubjectSuccess(snapshot.subject);
|
|
160
|
+
}
|
|
161
|
+
for (const claim of claims) {
|
|
162
|
+
const lane = lanes.find((item) => item.vendor === claim.subject.harness);
|
|
163
|
+
if (claim.reason === "rate_limited") {
|
|
164
|
+
lane?.pacer.noteRateLimited(Date.parse(claim.observed_at), claim.retry_after_ms ?? null, claim.subject);
|
|
165
|
+
}
|
|
166
|
+
if (claim.reason !== "poll_paced" && claim.reason !== "probe_skipped_rate_limited")
|
|
167
|
+
continue;
|
|
168
|
+
const until = lane?.pacer.rateLimitCooldownUntil(now, claim.subject);
|
|
169
|
+
const alreadySkipped = skipped.some((row) => row.subject &&
|
|
170
|
+
row.subject.harness === claim.subject.harness &&
|
|
171
|
+
row.subject.subject_id === claim.subject.subject_id &&
|
|
172
|
+
row.subject.credential_route === claim.subject.credential_route);
|
|
173
|
+
if (until && !alreadySkipped)
|
|
174
|
+
skipped.push({
|
|
175
|
+
vendor: claim.subject.harness,
|
|
176
|
+
subject: claim.subject,
|
|
177
|
+
not_before: new Date(until).toISOString(),
|
|
178
|
+
});
|
|
179
|
+
}
|
|
106
180
|
}
|
|
107
181
|
/** Absence recomputation covers exactly the lanes that RAN: an anonymous
|
|
108
182
|
* lane's coverage is unknowable, so its cycle keeps the full rebuild. */
|
|
@@ -112,8 +186,8 @@ export function recomputeScopeFor(running) {
|
|
|
112
186
|
? null
|
|
113
187
|
: new Set(ranLanes.map((lane) => lane.vendor));
|
|
114
188
|
}
|
|
115
|
-
/** Derived `poll_paced` gap rows: while a
|
|
116
|
-
* active,
|
|
189
|
+
/** Derived `poll_paced` gap rows: while a subject or legacy vendor floor is
|
|
190
|
+
* active, each affected universe subject lacking FRESH snapshot cover
|
|
117
191
|
* and lacking a stored absence row is stated as paused — a live projection
|
|
118
192
|
* (never journaled), stable per floor so the projection signature does not
|
|
119
193
|
* churn markers on every read. Keeps a suppressed vendor's subjects from
|
|
@@ -125,12 +199,12 @@ export function derivePollPacedRows(lanes, subjects, existingRows, freshCovered,
|
|
|
125
199
|
for (const lane of lanes) {
|
|
126
200
|
if (lane.vendor === null)
|
|
127
201
|
continue;
|
|
128
|
-
const until = lane.pacer.rateLimitCooldownUntil(now);
|
|
129
|
-
if (until === null)
|
|
130
|
-
continue;
|
|
131
202
|
for (const subject of subjects) {
|
|
132
203
|
if (subject.harness !== lane.vendor)
|
|
133
204
|
continue;
|
|
205
|
+
const until = lane.pacer.rateLimitCooldownUntil(now, subject);
|
|
206
|
+
if (until === null)
|
|
207
|
+
continue;
|
|
134
208
|
const key = quotaSubjectIdentity(subject);
|
|
135
209
|
if (freshCovered.has(key) || present.has(key))
|
|
136
210
|
continue;
|
|
@@ -138,20 +212,21 @@ export function derivePollPacedRows(lanes, subjects, existingRows, freshCovered,
|
|
|
138
212
|
rows.push({
|
|
139
213
|
subject,
|
|
140
214
|
reason: "poll_paced",
|
|
141
|
-
detail: `
|
|
142
|
-
observed_at: new Date(lane.pacer.rateLimitObservedAt(now)).toISOString(),
|
|
215
|
+
detail: `quota poll paused by rate-limit cooldown until ${new Date(until).toISOString()}`,
|
|
216
|
+
observed_at: new Date(lane.pacer.rateLimitObservedAt(now, subject)).toISOString(),
|
|
143
217
|
});
|
|
144
218
|
}
|
|
145
219
|
}
|
|
146
220
|
return rows;
|
|
147
221
|
}
|
|
148
|
-
/** Subject-identity cover sets over one active-snapshot view.
|
|
149
|
-
*
|
|
222
|
+
/** Subject-identity cover sets over one active-snapshot view. A partial
|
|
223
|
+
* measured window cannot cover a failed or paced full-inventory read. */
|
|
150
224
|
export function subjectCoverSets(active) {
|
|
151
225
|
return {
|
|
152
226
|
covered: new Set(active.map((snapshot) => quotaSubjectIdentity(snapshot.subject))),
|
|
153
227
|
freshCovered: new Set(active
|
|
154
|
-
.filter((snapshot) => snapshot.freshness === "fresh"
|
|
228
|
+
.filter((snapshot) => snapshot.freshness === "fresh" &&
|
|
229
|
+
quotaSourceTraits(snapshot.source).snapshotMode === "full")
|
|
155
230
|
.map((snapshot) => quotaSubjectIdentity(snapshot.subject))),
|
|
156
231
|
};
|
|
157
232
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota-poll-lanes.js","sourceRoot":"","sources":["../src/quota-poll-lanes.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"quota-poll-lanes.js","sourceRoot":"","sources":["../src/quota-poll-lanes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,42 +1,30 @@
|
|
|
1
|
+
import type { QuotaSubject } from "@claudexor/schema";
|
|
1
2
|
/**
|
|
2
|
-
* Daemon-private persistence for
|
|
3
|
-
*
|
|
3
|
+
* Daemon-private persistence for poll floors: current subject/route floors and
|
|
4
|
+
* legacy per-vendor floors retained through their recorded deadlines. Deliberately OUTSIDE the quota journal and every quota projection
|
|
4
5
|
* (owner decision 7=A): a throttled POLL is pacing state, never quota truth —
|
|
5
6
|
* journaling it as a cooldown would read as "window exhausted" to rotation
|
|
6
7
|
* and to external consumers of the quota surface.
|
|
7
8
|
*/
|
|
8
9
|
export interface QuotaPacerStateStore {
|
|
9
|
-
/**
|
|
10
|
+
/** Legacy vendor floor, retained for upgrades; 0 = none. */
|
|
10
11
|
load(vendor: string): number;
|
|
11
|
-
|
|
12
|
+
loadSubject?(subject: QuotaSubject): number;
|
|
13
|
+
saveSubject?(subject: QuotaSubject, notBeforeMs: number): void;
|
|
12
14
|
}
|
|
13
15
|
/** File-backed store under the daemon dir. Best-effort durability: a missing,
|
|
14
16
|
* corrupt, or unwritable file only forgets the floor (fail-open to polling),
|
|
15
17
|
* it never breaks the poll cycle. */
|
|
16
18
|
export declare function quotaPacerFileStore(dir: string): QuotaPacerStateStore;
|
|
17
|
-
/**
|
|
18
|
-
*
|
|
19
|
-
*
|
|
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
|
-
*/
|
|
19
|
+
/** One vendor lane's demand ladder plus subject/route poll floors. Healthy
|
|
20
|
+
* renewals retain the existing single serial sweep. Only legacy persisted
|
|
21
|
+
* vendor floors suppress the whole lane; new 429s never infer vendor scope. */
|
|
37
22
|
export declare class QuotaPollPacer {
|
|
38
23
|
private readonly vendor;
|
|
39
24
|
private readonly store?;
|
|
25
|
+
private readonly subjectFloors;
|
|
26
|
+
private credentialAliases;
|
|
27
|
+
private readonly subjectFailures;
|
|
40
28
|
private failures;
|
|
41
29
|
private notBefore;
|
|
42
30
|
/** Completion instant of the cycle that armed the current retry ladder
|
|
@@ -47,10 +35,8 @@ export declare class QuotaPollPacer {
|
|
|
47
35
|
/** When the active floor was observed (0 = unknown, e.g. store-loaded). */
|
|
48
36
|
private rateLimitedSince;
|
|
49
37
|
constructor(vendor?: string | null, store?: QuotaPacerStateStore | undefined);
|
|
50
|
-
/** Credential/routability
|
|
51
|
-
*
|
|
52
|
-
* not about which credentials exist (and a daemon restart or profile toggle
|
|
53
|
-
* must not become a 429 amplifier). */
|
|
38
|
+
/** Credential/routability changes reset retry ladders, never recorded poll
|
|
39
|
+
* floors: a profile toggle or restart must not become a 429 amplifier. */
|
|
54
40
|
noteCredentialChange(): void;
|
|
55
41
|
/** May the lane poll now? The vendor rate-limit floor is absolute. The retry
|
|
56
42
|
* ladder is not: `renewalDueObservedAt` — the latest observation instant of
|
|
@@ -60,14 +46,23 @@ export declare class QuotaPollPacer {
|
|
|
60
46
|
* ladder was armed and the ladder must not postpone its renewal. Evidence
|
|
61
47
|
* the arming cycle itself produced is capped by `armBackoff` instead. */
|
|
62
48
|
pollEligible(now: number, renewalDueObservedAt?: number | null): boolean;
|
|
63
|
-
/**
|
|
64
|
-
rateLimitCooldownUntil(now: number): number | null;
|
|
49
|
+
/** Active floor for a subject, or legacy whole-lane floor when omitted. */
|
|
50
|
+
rateLimitCooldownUntil(now: number, subject?: QuotaSubject): number | null;
|
|
51
|
+
/** Bind the current source's token-identical rows without retaining tokens or
|
|
52
|
+
* hashes on disk. Pre-binding the complete read makes profile order irrelevant
|
|
53
|
+
* after restart: an alias preceding the cooled row inherits its saved floor. */
|
|
54
|
+
bindCredentials(bindings: ReadonlyArray<{
|
|
55
|
+
subject: QuotaSubject;
|
|
56
|
+
credentialHash: string;
|
|
57
|
+
}>): void;
|
|
58
|
+
private subjectFloor;
|
|
59
|
+
private saveSubjectFloor;
|
|
65
60
|
/** Stable observation stamp for the ACTIVE floor's derived gap rows: the
|
|
66
61
|
* instant the floor was observed. A store-loaded floor (daemon restart)
|
|
67
62
|
* has no recorded observation, so the first read anchors it — stability of
|
|
68
63
|
* the projection signature matters more than the exact historical instant,
|
|
69
64
|
* and the anchor is honest ("known paused since at least then"). */
|
|
70
|
-
rateLimitObservedAt(now: number): number;
|
|
65
|
+
rateLimitObservedAt(now: number, subject?: QuotaSubject): number;
|
|
71
66
|
/** A cycle for this lane completed: reset on fully satisfied demand, else
|
|
72
67
|
* exponential backoff anchored at completion (never the stale start) and
|
|
73
68
|
* capped at `renewalNotBefore` — the tick by which evidence this cycle DID
|
|
@@ -77,11 +72,13 @@ export declare class QuotaPollPacer {
|
|
|
77
72
|
* the 15-minute ceiling). Null = no satisfied evidence is due later. */
|
|
78
73
|
notePollSuccess(completedAt: number, demandRemains: boolean, renewalNotBefore?: number | null): void;
|
|
79
74
|
notePollFailure(completedAt: number, renewalNotBefore?: number | null): void;
|
|
80
|
-
/** A
|
|
81
|
-
* floor
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
75
|
+
/** A primary observation resets this subject's missing-header retry ladder.
|
|
76
|
+
* Its already-recorded Retry-After floor is still honored until its deadline. */
|
|
77
|
+
noteSubjectSuccess(subject: QuotaSubject): void;
|
|
78
|
+
/** A 429 paces only its subject and known token-identical aliases. The
|
|
79
|
+
* no-header exponential ladder belongs to that identity too: a healthy
|
|
80
|
+
* sibling's successful renewal must neither reset it nor acquire it. */
|
|
81
|
+
noteRateLimited(observedAt: number, retryAfterMs: number | null, subject: QuotaSubject): void;
|
|
85
82
|
private armBackoff;
|
|
86
83
|
}
|
|
87
84
|
//# 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":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAUtD;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,4DAA4D;IAC5D,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,WAAW,CAAC,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAAC;IAC5C,WAAW,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAChE;AAED;;qCAEqC;AACrC,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CA0CrE;AAMD;;+EAE+E;AAC/E,qBAAa,cAAc;IAevB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;IAfzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0D;IACxF,OAAO,CAAC,iBAAiB,CAA8C;IACvE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA4D;IAC5F,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAAK;IACtB;;mCAE+B;IAC/B,OAAO,CAAC,OAAO,CAAK;IACpB,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;8EAC0E;IAC1E,oBAAoB,IAAI,IAAI,CAK3B;IAED;;;;;;6EAMyE;IACzE,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,oBAAoB,GAAE,MAAM,GAAG,IAAW,GAAG,OAAO,CAI7E;IAED,2EAA2E;IAC3E,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAIzE;IAED;;oFAEgF;IAChF,eAAe,CACb,QAAQ,EAAE,aAAa,CAAC;QAAE,OAAO,EAAE,YAAY,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,GACzE,IAAI,CAsBN;IAED,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,gBAAgB;IAUxB;;;;wEAIoE;IACpE,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM,CAQ/D;IAED;;;;;;4EAMwE;IACxE,eAAe,CACb,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,OAAO,EACtB,gBAAgB,GAAE,MAAM,GAAG,IAAW,GACrC,IAAI,CAQN;IAED,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,gBAAgB,GAAE,MAAM,GAAG,IAAW,GAAG,IAAI,CAEjF;IAED;qFACiF;IACjF,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAI9C;IAED;;4EAEwE;IACxE,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAU5F;IAED,OAAO,CAAC,UAAU;CAOnB"}
|
package/dist/quota-poll-pacer.js
CHANGED
|
@@ -15,55 +15,50 @@ export function quotaPacerFileStore(dir) {
|
|
|
15
15
|
const read = () => {
|
|
16
16
|
try {
|
|
17
17
|
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
typeof parsed.vendors === "object" &&
|
|
21
|
-
!Array.isArray(parsed.vendors)
|
|
22
|
-
? parsed.vendors
|
|
18
|
+
const record = (value) => value !== null && typeof value === "object" && !Array.isArray(value)
|
|
19
|
+
? value
|
|
23
20
|
: {};
|
|
21
|
+
return parsed?.version === 1 || parsed?.version === 2
|
|
22
|
+
? {
|
|
23
|
+
vendors: record(parsed.vendors),
|
|
24
|
+
subjects: record(parsed.subjects),
|
|
25
|
+
}
|
|
26
|
+
: { vendors: {}, subjects: {} };
|
|
24
27
|
}
|
|
25
28
|
catch {
|
|
26
|
-
return {};
|
|
29
|
+
return { vendors: {}, subjects: {} };
|
|
27
30
|
}
|
|
28
31
|
};
|
|
32
|
+
const load = (section, key) => {
|
|
33
|
+
const iso = read()[section][key]?.not_before;
|
|
34
|
+
const at = typeof iso === "string" ? Date.parse(iso) : Number.NaN;
|
|
35
|
+
return Number.isFinite(at) ? at : 0;
|
|
36
|
+
};
|
|
37
|
+
const save = (section, key, until) => {
|
|
38
|
+
const state = read();
|
|
39
|
+
state[section][key] = { not_before: new Date(until).toISOString() };
|
|
40
|
+
const tmp = `${path}.tmp.${process.pid}`;
|
|
41
|
+
writeFileSync(tmp, `${JSON.stringify({ version: 2, ...state }, null, 2)}\n`);
|
|
42
|
+
renameSync(tmp, path);
|
|
43
|
+
};
|
|
29
44
|
return {
|
|
30
|
-
load(vendor)
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
},
|
|
45
|
+
load: (vendor) => load("vendors", vendor),
|
|
46
|
+
loadSubject: (subject) => load("subjects", subjectKey(subject)),
|
|
47
|
+
saveSubject: (subject, until) => save("subjects", subjectKey(subject), until),
|
|
42
48
|
};
|
|
43
49
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
*
|
|
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
|
-
*/
|
|
50
|
+
function subjectKey(subject) {
|
|
51
|
+
return JSON.stringify([subject.harness, subject.credential_route, subject.subject_id]);
|
|
52
|
+
}
|
|
53
|
+
/** One vendor lane's demand ladder plus subject/route poll floors. Healthy
|
|
54
|
+
* renewals retain the existing single serial sweep. Only legacy persisted
|
|
55
|
+
* vendor floors suppress the whole lane; new 429s never infer vendor scope. */
|
|
64
56
|
export class QuotaPollPacer {
|
|
65
57
|
vendor;
|
|
66
58
|
store;
|
|
59
|
+
subjectFloors = new Map();
|
|
60
|
+
credentialAliases = new Map();
|
|
61
|
+
subjectFailures = new Map();
|
|
67
62
|
failures = 0;
|
|
68
63
|
notBefore = 0;
|
|
69
64
|
/** Completion instant of the cycle that armed the current retry ladder
|
|
@@ -85,14 +80,13 @@ export class QuotaPollPacer {
|
|
|
85
80
|
}
|
|
86
81
|
}
|
|
87
82
|
}
|
|
88
|
-
/** Credential/routability
|
|
89
|
-
*
|
|
90
|
-
* not about which credentials exist (and a daemon restart or profile toggle
|
|
91
|
-
* must not become a 429 amplifier). */
|
|
83
|
+
/** Credential/routability changes reset retry ladders, never recorded poll
|
|
84
|
+
* floors: a profile toggle or restart must not become a 429 amplifier. */
|
|
92
85
|
noteCredentialChange() {
|
|
93
86
|
this.failures = 0;
|
|
94
87
|
this.notBefore = 0;
|
|
95
88
|
this.armedAt = 0;
|
|
89
|
+
this.subjectFailures.clear();
|
|
96
90
|
}
|
|
97
91
|
/** May the lane poll now? The vendor rate-limit floor is absolute. The retry
|
|
98
92
|
* ladder is not: `renewalDueObservedAt` — the latest observation instant of
|
|
@@ -108,16 +102,74 @@ export class QuotaPollPacer {
|
|
|
108
102
|
return true;
|
|
109
103
|
return renewalDueObservedAt !== null && renewalDueObservedAt > this.armedAt;
|
|
110
104
|
}
|
|
111
|
-
/**
|
|
112
|
-
rateLimitCooldownUntil(now) {
|
|
113
|
-
|
|
105
|
+
/** Active floor for a subject, or legacy whole-lane floor when omitted. */
|
|
106
|
+
rateLimitCooldownUntil(now, subject) {
|
|
107
|
+
const floor = subject === undefined ? 0 : this.subjectFloor(subject).until;
|
|
108
|
+
const until = Math.max(this.rateLimitedNotBefore, floor);
|
|
109
|
+
return now < until ? until : null;
|
|
110
|
+
}
|
|
111
|
+
/** Bind the current source's token-identical rows without retaining tokens or
|
|
112
|
+
* hashes on disk. Pre-binding the complete read makes profile order irrelevant
|
|
113
|
+
* after restart: an alias preceding the cooled row inherits its saved floor. */
|
|
114
|
+
bindCredentials(bindings) {
|
|
115
|
+
const groups = new Map();
|
|
116
|
+
for (const { subject, credentialHash } of bindings) {
|
|
117
|
+
const identity = JSON.stringify([subject.harness, subject.credential_route, credentialHash]);
|
|
118
|
+
const group = groups.get(identity) ?? [];
|
|
119
|
+
group.push(subject);
|
|
120
|
+
groups.set(identity, group);
|
|
121
|
+
}
|
|
122
|
+
this.credentialAliases = new Map();
|
|
123
|
+
for (const group of groups.values()) {
|
|
124
|
+
const floor = group.reduce((current, subject) => {
|
|
125
|
+
const candidate = this.subjectFloor(subject);
|
|
126
|
+
return candidate.until > current.until ? candidate : current;
|
|
127
|
+
}, { until: 0, observed: 0 });
|
|
128
|
+
for (const subject of group) {
|
|
129
|
+
this.credentialAliases.set(subjectKey(subject), group);
|
|
130
|
+
this.saveSubjectFloor(subject, floor.until, floor.observed);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
subjectFloor(subject) {
|
|
135
|
+
const key = subjectKey(subject);
|
|
136
|
+
let floor = this.subjectFloors.get(key);
|
|
137
|
+
if (floor === undefined) {
|
|
138
|
+
let until = 0;
|
|
139
|
+
try {
|
|
140
|
+
until = this.store?.loadSubject?.(subject) ?? 0;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
/* fail-open */
|
|
144
|
+
}
|
|
145
|
+
floor = { until, observed: 0 };
|
|
146
|
+
this.subjectFloors.set(key, floor);
|
|
147
|
+
}
|
|
148
|
+
return floor;
|
|
149
|
+
}
|
|
150
|
+
saveSubjectFloor(subject, until, observed) {
|
|
151
|
+
if (until <= this.subjectFloor(subject).until)
|
|
152
|
+
return;
|
|
153
|
+
this.subjectFloors.set(subjectKey(subject), { until, observed });
|
|
154
|
+
try {
|
|
155
|
+
this.store?.saveSubject?.(subject, until);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
/* fail-open */
|
|
159
|
+
}
|
|
114
160
|
}
|
|
115
161
|
/** Stable observation stamp for the ACTIVE floor's derived gap rows: the
|
|
116
162
|
* instant the floor was observed. A store-loaded floor (daemon restart)
|
|
117
163
|
* has no recorded observation, so the first read anchors it — stability of
|
|
118
164
|
* the projection signature matters more than the exact historical instant,
|
|
119
165
|
* and the anchor is honest ("known paused since at least then"). */
|
|
120
|
-
rateLimitObservedAt(now) {
|
|
166
|
+
rateLimitObservedAt(now, subject) {
|
|
167
|
+
if (subject !== undefined && this.subjectFloor(subject).until > this.rateLimitedNotBefore) {
|
|
168
|
+
const floor = this.subjectFloor(subject);
|
|
169
|
+
if (floor.observed === 0)
|
|
170
|
+
floor.observed = now;
|
|
171
|
+
return floor.observed;
|
|
172
|
+
}
|
|
121
173
|
if (this.rateLimitedSince === 0)
|
|
122
174
|
this.rateLimitedSince = now;
|
|
123
175
|
return this.rateLimitedSince;
|
|
@@ -141,25 +193,25 @@ export class QuotaPollPacer {
|
|
|
141
193
|
notePollFailure(completedAt, renewalNotBefore = null) {
|
|
142
194
|
this.armBackoff(completedAt, renewalNotBefore);
|
|
143
195
|
}
|
|
144
|
-
/** A
|
|
145
|
-
* floor
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
196
|
+
/** A primary observation resets this subject's missing-header retry ladder.
|
|
197
|
+
* Its already-recorded Retry-After floor is still honored until its deadline. */
|
|
198
|
+
noteSubjectSuccess(subject) {
|
|
199
|
+
for (const alias of this.credentialAliases.get(subjectKey(subject)) ?? [subject]) {
|
|
200
|
+
this.subjectFailures.delete(subjectKey(alias));
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/** A 429 paces only its subject and known token-identical aliases. The
|
|
204
|
+
* no-header exponential ladder belongs to that identity too: a healthy
|
|
205
|
+
* sibling's successful renewal must neither reset it nor acquire it. */
|
|
206
|
+
noteRateLimited(observedAt, retryAfterMs, subject) {
|
|
207
|
+
const prior = this.subjectFailures.get(subjectKey(subject));
|
|
208
|
+
const count = prior?.observedAt === observedAt ? prior.count : (prior?.count ?? 0) + 1;
|
|
209
|
+
const exponential = Math.min(POLL_BACKOFF_MS * 2 ** (count - 1), MAX_POLL_BACKOFF_MS);
|
|
150
210
|
const floor = Math.max(exponential, Math.min(retryAfterMs ?? 0, MAX_RATE_LIMIT_FLOOR_MS));
|
|
151
211
|
const until = observedAt + floor;
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
this.rateLimitedSince = observedAt;
|
|
156
|
-
if (this.vendor !== null) {
|
|
157
|
-
try {
|
|
158
|
-
this.store?.save(this.vendor, until);
|
|
159
|
-
}
|
|
160
|
-
catch {
|
|
161
|
-
/* fail-open: losing the durable floor only re-allows polling */
|
|
162
|
-
}
|
|
212
|
+
for (const alias of this.credentialAliases.get(subjectKey(subject)) ?? [subject]) {
|
|
213
|
+
this.subjectFailures.set(subjectKey(alias), { observedAt, count });
|
|
214
|
+
this.saveSubjectFloor(alias, until, observedAt);
|
|
163
215
|
}
|
|
164
216
|
}
|
|
165
217
|
armBackoff(completedAt, renewalNotBefore) {
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
1
|
+
{"version":3,"file":"quota-poll-pacer.js","sourceRoot":"","sources":["../src/quota-poll-pacer.ts"],"names":[],"mappings":"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"}
|