llm-relay 0.48.0 → 0.49.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/accounting-store.d.ts +7 -2
- package/dist/accounting-store.js.map +1 -1
- package/dist/availability-snapshot.js +3 -5
- package/dist/availability-snapshot.js.map +1 -1
- package/dist/availability.d.ts +14 -3
- package/dist/availability.js +59 -1
- package/dist/availability.js.map +1 -1
- package/dist/candidates.js +2 -1
- package/dist/candidates.js.map +1 -1
- package/dist/catalog.d.ts +10 -0
- package/dist/catalog.js +17 -3
- package/dist/catalog.js.map +1 -1
- package/dist/claude-hook.js +11 -1
- package/dist/claude-hook.js.map +1 -1
- package/dist/cli.js +20 -1
- package/dist/cli.js.map +1 -1
- package/dist/control-authorization.js +5 -1
- package/dist/control-authorization.js.map +1 -1
- package/dist/dashboard/.vite/manifest.json +1 -1
- package/dist/dashboard/assets/{index-BA4GdK4p.js → index-DWy2986E.js} +1 -1
- package/dist/dashboard/index.html +1 -1
- package/dist/dashboard-contract.d.ts +3 -2
- package/dist/dashboard-contract.js +1 -1
- package/dist/dashboard-contract.js.map +1 -1
- package/dist/dotenv.js +6 -1
- package/dist/dotenv.js.map +1 -1
- package/dist/hard-cap.d.ts +1 -1
- package/dist/hard-cap.js +2 -2
- package/dist/hard-cap.js.map +1 -1
- package/dist/key-checker.js +62 -16
- package/dist/key-checker.js.map +1 -1
- package/dist/onboarding.js +3 -3
- package/dist/onboarding.js.map +1 -1
- package/dist/ping/quota.js +28 -3
- package/dist/ping/quota.js.map +1 -1
- package/dist/pool-health.d.ts +10 -2
- package/dist/pool-health.js +24 -5
- package/dist/pool-health.js.map +1 -1
- package/dist/quota-demotion.d.ts +11 -4
- package/dist/quota-demotion.js +16 -20
- package/dist/quota-demotion.js.map +1 -1
- package/dist/quota-observation.d.ts +1 -0
- package/dist/quota-observation.js +1 -1
- package/dist/quota-observation.js.map +1 -1
- package/dist/refusal-interpretation.js +163 -42
- package/dist/refusal-interpretation.js.map +1 -1
- package/dist/self-update.d.ts +9 -0
- package/dist/self-update.js +14 -1
- package/dist/self-update.js.map +1 -1
- package/dist/server.js +32 -30
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/dist/pool-health.js
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
import { splitSpec } from "./config.js";
|
|
2
2
|
import { buildAuthHeaders } from "./authEnv.js";
|
|
3
3
|
import { providerCredentialSlots, resolveCredentialSlot, slotAllowsModel } from "./credential-fleet.js";
|
|
4
|
-
/**
|
|
5
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Verdicts that mean "this member will never answer until someone changes something".
|
|
6
|
+
*
|
|
7
|
+
* `auth` is a CONFIG fact (no enabled credential slot has a present key, so no request was
|
|
8
|
+
* sent); `denied` is a SERVER response (401/403) whose cause we deliberately do not infer —
|
|
9
|
+
* it may be the credential, but it may also be an entitlement wall on a model this key
|
|
10
|
+
* legitimately cannot touch. Both are surfaced to the operator, but only `auth` carries a
|
|
11
|
+
* credential-rotation recommendation in the CLI advice.
|
|
12
|
+
*/
|
|
13
|
+
export const DEAD_VERDICTS = new Set(["missing", "auth", "denied"]);
|
|
6
14
|
/**
|
|
7
15
|
* Probe headers. The credential half comes from the shared builder — it obeys the DECLARED
|
|
8
16
|
* `authHeader` (which `config.ts` already defaults to `x-api-key` for an anthropic-kind
|
|
@@ -63,13 +71,24 @@ export async function probeMember(pool, spec, cfg, fetchFn = fetch, maxTokens =
|
|
|
63
71
|
const r = await fetchFn(url, { method: "POST", headers: authHeaders(p, apiKey), body });
|
|
64
72
|
const latencyMs = now() - started;
|
|
65
73
|
if (r.status === 401 || r.status === 403) {
|
|
66
|
-
|
|
74
|
+
// The server said no; we cannot tell why from one signed request. Free-tier rosters
|
|
75
|
+
// list premium SKUs, so a 401/403 here may be the model (entitlement wall) or the
|
|
76
|
+
// key. Surface the rejection without assigning blame; the operator decides.
|
|
77
|
+
return { pool, spec, credentialId, verdict: "denied", httpStatus: r.status, latencyMs, detail: `HTTP ${r.status} (request rejected — cause not inferred; could be credential or entitlement)` };
|
|
67
78
|
}
|
|
68
79
|
if (r.status === 429) {
|
|
69
80
|
return { pool, spec, credentialId, verdict: "rate_limited", httpStatus: 429, latencyMs, detail: "HTTP 429" };
|
|
70
81
|
}
|
|
71
|
-
if (r.status === 404
|
|
72
|
-
|
|
82
|
+
if (r.status === 404) {
|
|
83
|
+
// A 404 on the chat/completions or /v1/messages endpoint is the strongest absence
|
|
84
|
+
// signal a single probe can produce: the server has no route for this model.
|
|
85
|
+
return { pool, spec, credentialId, verdict: "missing", httpStatus: r.status, latencyMs, detail: `HTTP 404 — model not servable` };
|
|
86
|
+
}
|
|
87
|
+
if (r.status === 400) {
|
|
88
|
+
// A 400 is a request-validation error (e.g. mistral's 9-char tool-call-id refusal,
|
|
89
|
+
// a max_tokens complaint), not evidence of model absence. Treat as a transient error
|
|
90
|
+
// so the operator looks at the detail instead of removing the member from the pool.
|
|
91
|
+
return { pool, spec, credentialId, verdict: "error", httpStatus: r.status, latencyMs, detail: `HTTP ${r.status} — request rejected by server (not absence evidence)` };
|
|
73
92
|
}
|
|
74
93
|
if (!r.ok) {
|
|
75
94
|
return { pool, spec, credentialId, verdict: "error", httpStatus: r.status, latencyMs, detail: `HTTP ${r.status}` };
|
package/dist/pool-health.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool-health.js","sourceRoot":"","sources":["../src/pool-health.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,eAAe,EAAuB,MAAM,uBAAuB,CAAC;AAe7H
|
|
1
|
+
{"version":3,"file":"pool-health.js","sourceRoot":"","sources":["../src/pool-health.ts"],"names":[],"mappings":"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"}
|
package/dist/quota-demotion.d.ts
CHANGED
|
@@ -19,8 +19,9 @@
|
|
|
19
19
|
* - unknown ⇒ NO EFFECT WHATSOEVER — same rule as the context guardrail. A bucket with neither
|
|
20
20
|
* an eligible observation nor a resolvable limit-plus-usage produces no opinion here.
|
|
21
21
|
*
|
|
22
|
-
* Pure and bounded: no IO, no clock of its own, a handful of (axis, period) pairs per cell
|
|
23
|
-
*
|
|
22
|
+
* Pure and bounded: no IO, no clock of its own, and a handful of (axis, period) pairs per cell.
|
|
23
|
+
* Every ledger read it may make (`usedInWindow`) is the store's IN-MEMORY window read, memoized
|
|
24
|
+
* to at most one read per period. The
|
|
24
25
|
* factory wraps everything in try/catch — this runs on the request path, and a routing hint must
|
|
25
26
|
* never be able to fail a request. It logs nothing: routing is not an error stream.
|
|
26
27
|
*/
|
|
@@ -28,7 +29,7 @@ import type { Config } from "./config.js";
|
|
|
28
29
|
import type { CircuitBreaker } from "./circuit-breaker.js";
|
|
29
30
|
import type { ResolvedAttempt } from "./resolved-attempt.js";
|
|
30
31
|
import type { QuotaAxis, QuotaPeriod } from "./quota-observation.js";
|
|
31
|
-
import { type RemainingResolution } from "./availability.js";
|
|
32
|
+
import { type RemainingResolution, type ResetsAtResolution } from "./availability.js";
|
|
32
33
|
/** One spent, gateable bucket — the smallest honest statement of "why this cell steps aside". */
|
|
33
34
|
export interface QuotaDemotion {
|
|
34
35
|
readonly axis: QuotaAxis;
|
|
@@ -40,7 +41,13 @@ export interface QuotaDemotion {
|
|
|
40
41
|
readonly basis: RemainingResolution["basis"];
|
|
41
42
|
/** When the band lifts; non-null by construction (see resolveQuotaDemotion). */
|
|
42
43
|
readonly resetsAt: number;
|
|
43
|
-
|
|
44
|
+
/**
|
|
45
|
+
* Which §5.2 rung produced `resetsAt`. Imported from `ResetsAtResolution` so the spelling has
|
|
46
|
+
* ONE home, but `Exclude`d of null: `resolveQuotaDemotion` skips a bucket whose reset or basis
|
|
47
|
+
* is null (no invented duration), so a demotion that exists always knows its rung. Importing
|
|
48
|
+
* the bare union would hand every consumer a null case that cannot occur.
|
|
49
|
+
*/
|
|
50
|
+
readonly resetsAtBasis: Exclude<ResetsAtResolution["basis"], null>;
|
|
44
51
|
}
|
|
45
52
|
/** The per-request evaluator threaded through the walk-order helpers. Null ⇒ no demotion. */
|
|
46
53
|
export type QuotaDemotionFn = (attempt: ResolvedAttempt, now: number) => QuotaDemotion | null;
|
package/dist/quota-demotion.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { parseCredentialId } from "./credential-id.js";
|
|
2
2
|
import { resolveConfiguredLimits } from "./configured-limits.js";
|
|
3
3
|
import { observedRateLimits } from "./rate-limits.js";
|
|
4
|
-
import { collectQuotaBuckets, resolveRemaining, resolveResetsAt, } from "./availability.js";
|
|
4
|
+
import { collectQuotaBuckets, projectLocalUsed, resolveRemaining, resolveResetsAt, } from "./availability.js";
|
|
5
5
|
/**
|
|
6
6
|
* Canonical bucket order, so "first gating bucket" is deterministic across calls.
|
|
7
7
|
*
|
|
@@ -13,7 +13,6 @@ export function bucketRank(axis, period) {
|
|
|
13
13
|
const periodRank = period === "minute" ? 0 : period === "day" ? 1 : 2;
|
|
14
14
|
return axisRank * 10 + periodRank;
|
|
15
15
|
}
|
|
16
|
-
const EMPTY_USED = { value: null, basis: null };
|
|
17
16
|
/** The §5.4 verdict for ONE credential×deployment cell, from whatever evidence exists. */
|
|
18
17
|
function resolveQuotaDemotion(deps, attempt, now) {
|
|
19
18
|
const quotaCfg = deps.cfg.routing.quota;
|
|
@@ -38,27 +37,24 @@ function resolveQuotaDemotion(deps, attempt, now) {
|
|
|
38
37
|
? observedRateLimits(target.provider, attempt.credentialId, model, { now })
|
|
39
38
|
: [];
|
|
40
39
|
const buckets = collectQuotaBuckets({ observations, learned, configured });
|
|
41
|
-
//
|
|
42
|
-
//
|
|
40
|
+
// Cache the RAW ledger window by period, so at most one read per period serves every axis
|
|
41
|
+
// projection without storing an already-projected value under an axis-free key.
|
|
43
42
|
const windowCache = new Map();
|
|
44
43
|
const localUsedFor = (period, axis) => {
|
|
45
|
-
let
|
|
46
|
-
if (
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
? EMPTY_USED
|
|
58
|
-
: { value: axis === "tokens" ? window.tokens : window.requests, basis: window.basis };
|
|
59
|
-
windowCache.set(period, reading);
|
|
44
|
+
let window = windowCache.get(period);
|
|
45
|
+
if (window === undefined) {
|
|
46
|
+
window =
|
|
47
|
+
deps.accounting === undefined || deps.accounting === null
|
|
48
|
+
? null
|
|
49
|
+
: deps.accounting.usedInWindow({
|
|
50
|
+
credentialId: attempt.credentialId,
|
|
51
|
+
...(model !== null ? { model } : {}),
|
|
52
|
+
period,
|
|
53
|
+
now,
|
|
54
|
+
});
|
|
55
|
+
windowCache.set(period, window);
|
|
60
56
|
}
|
|
61
|
-
return
|
|
57
|
+
return projectLocalUsed(window, axis);
|
|
62
58
|
};
|
|
63
59
|
let best = null;
|
|
64
60
|
for (const bucket of [...buckets.values()].sort((a, b) => bucketRank(a.axis, a.period) - bucketRank(b.axis, b.period))) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota-demotion.js","sourceRoot":"","sources":["../src/quota-demotion.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"quota-demotion.js","sourceRoot":"","sources":["../src/quota-demotion.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ export interface QuotaObservationOptions {
|
|
|
15
15
|
observedAt?: number;
|
|
16
16
|
}
|
|
17
17
|
export type QuotaHeaders = Headers | Readonly<Record<string, string | undefined>>;
|
|
18
|
+
export declare function bucketKey(axis: QuotaAxis, period: QuotaPeriod): string;
|
|
18
19
|
/**
|
|
19
20
|
* Extracts all complete, explicitly attributed limit/remaining pairs from response headers.
|
|
20
21
|
* Header names are case-insensitive; supported forms put `limit`, `remaining`, and optionally
|
|
@@ -127,7 +127,7 @@ function parseRetryAfter(value, observedAt) {
|
|
|
127
127
|
}
|
|
128
128
|
return parseHttpDate(value);
|
|
129
129
|
}
|
|
130
|
-
function bucketKey(axis, period) {
|
|
130
|
+
export function bucketKey(axis, period) {
|
|
131
131
|
return `${axis}:${period}`;
|
|
132
132
|
}
|
|
133
133
|
function canonicalBucketOrder(a, b) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota-observation.js","sourceRoot":"","sources":["../src/quota-observation.ts"],"names":[],"mappings":"AAkCA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AACjE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AACjE,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC;IACvC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO;CAClF,CAAC,CAAC;AAEH,SAAS,aAAa,CAAC,OAAqB;IAC1C,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,YAAY,OAAO,EAAE,CAAC;QACjE,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAyB;IAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAC1F,yFAAyF;IACzF,uFAAuF;IACvF,IAAI,CAAC,yDAAyD,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3E,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IAMtC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAC1B,CAAC,IAAI,EAAwB,EAAE,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,OAAO,CAC7F,CAAC;IACF,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAA2C,EAAE,CAC7E,OAAO,CAAC,GAAG,CAAC,IAAuC,CAAC,CACrD,CAAC;IAEF,qFAAqF;IACrF,uFAAuF;IACvF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7E,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;IACvC,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,CAAC,CAAE;QACnB,IAAI,EAAE,IAAI,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ;QAC5D,MAAM;QACN,iBAAiB,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,gFAAgF;IAChF,8EAA8E;IAC9E,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC,CAAC;IACpE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC/F,CAAC,mEAAmE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACnF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,WAAW,GAA2B;QAC1C,EAAE,EAAE,CAAC;QACL,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,MAAM;QACT,CAAC,EAAE,SAAS;QACZ,CAAC,EAAE,UAAU;KACd,CAAC;IACF,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC3E,KAAK,IAAI,MAAM,GAAG,UAAU,CAAC;IAC/B,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC;AAED,MAAM,aAAa,GAAG,2EAA2E,CAAC;AAClG,MAAM,SAAS,GAAG,6TAA6T,CAAC;AAChV,MAAM,MAAM,GAA2B;IACrC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IAC9C,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE;CACjD,CAAC;AAEF,SAAS,SAAS,CAAC,IAAY,EAAE,KAAa,EAAE,GAAW,EAAE,IAAY,EAAE,MAAc,EAAE,MAAc;IACvG,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,MAAM,GAAG,EAAE,IAAI,MAAM,GAAG,EAAE;QAAE,OAAO,SAAS,CAAC;IACzF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK;QACjG,IAAI,CAAC,UAAU,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,MAAM;QAC3F,IAAI,CAAC,aAAa,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjI,CAAC;IACD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACvE,OAAO,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxH,CAAC;IACD,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAE,CAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACvI,CAAC;AAED,wFAAwF;AACxF,SAAS,UAAU,CAAC,KAAyB,EAAE,UAAkB;IAC/D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAC1F,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,UAAU,GAAG,QAAQ,CAAC;IAEzD,qFAAqF;IACrF,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACzD,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IAEjD,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,eAAe,CAAC,KAAyB,EAAE,UAAkB;IACpE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAC1F,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,CAAC;IACD,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,SAAS,CAAC,IAAe,EAAE,MAAmB;IACrD,OAAO,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,oBAAoB,CAAC,CAAc,EAAE,CAAc;IAC1D,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,IAAI,SAAS,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACtC,MAAM,WAAW,GAAgC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC7F,OAAO,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;AAC5E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAAqB,EACrB,UAAmC,EAAE;IAErC,MAAM,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC;IAChD,MAAM,UAAU,GAAG,oBAAoB,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAC5F,CAAC,CAAC,oBAAoB;QACtB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IACf,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC/C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,UAA8B,CAAC;IAEnC,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC3B,UAAU,GAAG,QAAQ,CAAC;YACtB,SAAS;QACX,CAAC;QACD,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,UAAU,KAAK,SAAS;YAAE,SAAS;QACvC,MAAM,GAAG,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1D,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,GAAG;gBACP,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,sBAAsB,EAAE,UAAU,CAAC,iBAAiB;gBACpD,KAAK,EAAE,KAAK,EAAE;aACf,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAClC,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC;YACxB,MAAM,CAAC,sBAAsB,GAAG,UAAU,CAAC,iBAAiB,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAC5C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO;oBAAE,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC;;oBACrD,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,gBAAgB,GAAG,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,MAAM,YAAY,GAAuB,EAAE,CAAC;IAC5C,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC3D,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;YAAE,SAAS;QAC3E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC;YAAE,SAAS;QAClE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,SAAS,GAAG,CAAC;YAAE,SAAS;QAEzE,IAAI,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC;QAC5D,IAAI,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC,SAAS,KAAK,CAAC,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YAClF,QAAQ,GAAG,gBAAgB,CAAC;QAC9B,CAAC;QACD,YAAY,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,QAAQ;YACR,UAAU;YACV,KAAK,EAAE,iBAAiB;SACzB,CAAC,CAAC;IACL,CAAC;IAED,0FAA0F;IAC1F,uFAAuF;IACvF,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,6FAA6F;QAC7F,sEAAsE;QACtE,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,sBAAsB;YAC7D,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC;YAAE,SAAS;QAC3E,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAClC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;YAC3C,SAAS,KAAK,MAAM,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,CAC7F,CAAC;QACF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACtC,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;QACjC,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAClC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,IAAI,WAAW,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,CAChG,CAAC;QACF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACpD,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,KAAK,SAAS,IAAI,YAAY,CAAC,KAAK,CAAE,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YACjF,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC,KAAK,CAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QACtE,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,sBAAsB,CAAC,GAAG,IAA8C;IACtF,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;IACnD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,MAAM,WAAW,IAAI,GAAG,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,eAAe,CAAC,WAA6B;IAC3D,MAAM,KAAK,GAAG,CAAC,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;IAChE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC3C,CAAC"}
|
|
1
|
+
{"version":3,"file":"quota-observation.js","sourceRoot":"","sources":["../src/quota-observation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
1
|
+
import { lstatSync, mkdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { hasExactKeys } from "./json-shape.js";
|
|
3
|
-
import { join } from "node:path";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
4
|
import { homedir, tmpdir } from "node:os";
|
|
5
5
|
import { randomUUID } from "node:crypto";
|
|
6
6
|
import { WriteBehindTimer } from "./write-behind.js";
|
|
@@ -41,6 +41,9 @@ export const IGNORED_TTL_MS = 30 * 24 * 60 * 60 * 1000;
|
|
|
41
41
|
const MAX_RESET_MS = 7 * 24 * 60 * 60 * 1000;
|
|
42
42
|
let _store = null;
|
|
43
43
|
let _path = null;
|
|
44
|
+
// The stat token the currently-memoized `_store` was loaded from (or null when `_store` is null).
|
|
45
|
+
// Keyed by normalized path so two syntactic aliases of one file coalesce, exactly like `keystore.ts`.
|
|
46
|
+
let _token = null;
|
|
44
47
|
const writer = new WriteBehindTimer();
|
|
45
48
|
// Vitest workers can reuse a PID across separate runs. Keep the test store in a fresh,
|
|
46
49
|
// process-local namespace so a prior run can never make a new suite observe stale verdicts.
|
|
@@ -585,59 +588,176 @@ function migrateV1(parsed) {
|
|
|
585
588
|
}
|
|
586
589
|
return { version: 2, confirmed, unknown, ignored };
|
|
587
590
|
}
|
|
588
|
-
function
|
|
589
|
-
if (_store && _path === path)
|
|
590
|
-
return _store;
|
|
591
|
-
_path = path;
|
|
591
|
+
function observeInterpretationStore(path) {
|
|
592
592
|
try {
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
593
|
+
let stat;
|
|
594
|
+
const pathStat = lstatSync(path);
|
|
595
|
+
if (pathStat.isSymbolicLink()) {
|
|
596
|
+
const targetStat = statSync(path);
|
|
597
|
+
stat = { mtimeMs: targetStat.mtimeMs, size: targetStat.size, ino: targetStat.ino };
|
|
598
|
+
}
|
|
599
|
+
else {
|
|
600
|
+
stat = { mtimeMs: pathStat.mtimeMs, size: pathStat.size, ino: pathStat.ino };
|
|
601
|
+
}
|
|
602
|
+
if (!Number.isFinite(stat.mtimeMs) || !Number.isFinite(stat.size) || !Number.isFinite(stat.ino)) {
|
|
603
|
+
return { kind: "error", errno: "EINVAL" };
|
|
604
|
+
}
|
|
605
|
+
return { kind: "present", token: `stat:${stat.mtimeMs}:${stat.size}:${stat.ino}` };
|
|
606
|
+
}
|
|
607
|
+
catch (error) {
|
|
608
|
+
const code = error?.code;
|
|
609
|
+
if (code === "ENOENT")
|
|
610
|
+
return { kind: "absent" };
|
|
611
|
+
return code === undefined ? { kind: "error" } : { kind: "error", errno: code };
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
/** The one empty store. Absent, unreadable and corrupt all resolve to it. */
|
|
615
|
+
const emptyStore = () => ({ version: 2, confirmed: {}, unknown: {}, ignored: {} });
|
|
616
|
+
/**
|
|
617
|
+
* Parse a store file. The ONE parser: `load` reads through it, and so does the lost-update
|
|
618
|
+
* re-read inside `persist` — two copies of the acceptance rules is how one process comes to
|
|
619
|
+
* admit a row the other silently drops.
|
|
620
|
+
*/
|
|
621
|
+
function readStoreFile(normalizedPath) {
|
|
622
|
+
try {
|
|
623
|
+
const parsed = JSON.parse(readFileSync(normalizedPath, "utf8"));
|
|
624
|
+
if (!parsed || typeof parsed !== "object")
|
|
625
|
+
return emptyStore();
|
|
626
|
+
const raw = parsed;
|
|
627
|
+
if (raw.version === 1)
|
|
628
|
+
return migrateV1(raw);
|
|
629
|
+
if (raw.version !== 2)
|
|
630
|
+
return emptyStore();
|
|
631
|
+
const confirmed = {};
|
|
632
|
+
const unknown = {};
|
|
633
|
+
const ignored = {};
|
|
634
|
+
if (raw.confirmed && typeof raw.confirmed === "object") {
|
|
635
|
+
for (const [signature, entry] of Object.entries(raw.confirmed)) {
|
|
636
|
+
if (signatureParts(signature) && validInterpretation(entry))
|
|
637
|
+
confirmed[signature] = entry;
|
|
599
638
|
}
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
for (const [signature, entry] of Object.entries(raw.unknown)) {
|
|
612
|
-
if (validUnknown(entry) && unknownMatchesSignature(signature, entry))
|
|
613
|
-
unknown[signature] = entry;
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
if (raw.ignored && typeof raw.ignored === "object") {
|
|
617
|
-
for (const [signature, entry] of Object.entries(raw.ignored)) {
|
|
618
|
-
if (signatureParts(signature) && validIgnored(entry))
|
|
619
|
-
ignored[signature] = entry;
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
_store = { version: 2, confirmed, unknown, ignored };
|
|
623
|
-
return _store;
|
|
639
|
+
}
|
|
640
|
+
if (raw.unknown && typeof raw.unknown === "object") {
|
|
641
|
+
for (const [signature, entry] of Object.entries(raw.unknown)) {
|
|
642
|
+
if (validUnknown(entry) && unknownMatchesSignature(signature, entry))
|
|
643
|
+
unknown[signature] = entry;
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
if (raw.ignored && typeof raw.ignored === "object") {
|
|
647
|
+
for (const [signature, entry] of Object.entries(raw.ignored)) {
|
|
648
|
+
if (signatureParts(signature) && validIgnored(entry))
|
|
649
|
+
ignored[signature] = entry;
|
|
624
650
|
}
|
|
625
651
|
}
|
|
652
|
+
return { version: 2, confirmed, unknown, ignored };
|
|
626
653
|
}
|
|
627
654
|
catch {
|
|
628
|
-
|
|
655
|
+
return emptyStore();
|
|
629
656
|
}
|
|
630
|
-
|
|
657
|
+
}
|
|
658
|
+
function load(path) {
|
|
659
|
+
const normalizedPath = resolve(path);
|
|
660
|
+
const observation = observeInterpretationStore(normalizedPath);
|
|
661
|
+
// If we have a memoized store for this path:
|
|
662
|
+
// - If _token is null (file didn't exist when we loaded), we can only return the memoized
|
|
663
|
+
// store if the file is STILL absent. If the file now exists externally, we must re-read.
|
|
664
|
+
// - If _token matches the current file's token, return the memoized store.
|
|
665
|
+
if (_store !== null &&
|
|
666
|
+
_path === normalizedPath &&
|
|
667
|
+
((_token === null && observation.kind === "absent") ||
|
|
668
|
+
(observation.kind === "present" && observation.token === _token))) {
|
|
669
|
+
return _store;
|
|
670
|
+
}
|
|
671
|
+
// Need to (re)load. Absent, unreadable and corrupt all degrade to an empty store: unlike a
|
|
672
|
+
// keystore row, every interpretation here is re-learnable and the SEEDS live in source, so
|
|
673
|
+
// nothing binding is lost. `persist` re-reads through the same parser, so the two paths cannot
|
|
674
|
+
// come to disagree about what a stored file means.
|
|
675
|
+
const result = observation.kind === "present" ? readStoreFile(normalizedPath) : emptyStore();
|
|
676
|
+
// Memoize the loaded store and its stat token.
|
|
677
|
+
_store = result;
|
|
678
|
+
_path = normalizedPath;
|
|
679
|
+
_token = observation.kind === "present" ? observation.token : null;
|
|
631
680
|
return _store;
|
|
632
681
|
}
|
|
682
|
+
/**
|
|
683
|
+
* Merge an externally-modified file into the in-memory store before overwriting.
|
|
684
|
+
*
|
|
685
|
+
* Merge rules (justified by provenance):
|
|
686
|
+
* - A `confirmed` row is an OPERATOR-DECLARED acceptance and must never be dropped by
|
|
687
|
+
* another process's stale snapshot. We always take the union of confirmed signatures,
|
|
688
|
+
* and for a signature present in both, the disk version wins (the operator explicitly
|
|
689
|
+
* accepted it in another process).
|
|
690
|
+
* - `unknown` rows are queue entries and may be unioned. We keep the entry with the
|
|
691
|
+
* higher `lastSeen` (fresher sample wins), and merge counts if the signature appears
|
|
692
|
+
* in both.
|
|
693
|
+
* - A signature that moved from `unknown` to `confirmed` on disk must not be resurrected
|
|
694
|
+
* into `unknown` by an in-memory writer that still had it pending. We handle this by
|
|
695
|
+
* always preferring `confirmed` over `unknown` for the same signature.
|
|
696
|
+
* - `ignored` entries are unioned by signature, keeping the latest `at` timestamp.
|
|
697
|
+
*/
|
|
698
|
+
function mergeStores(disk, memory) {
|
|
699
|
+
// Start with disk's confirmed (operator-declared wins)
|
|
700
|
+
const confirmed = { ...disk.confirmed };
|
|
701
|
+
// Then layer memory's confirmed — but disk's wins on conflicts
|
|
702
|
+
for (const [sig, entry] of Object.entries(memory.confirmed)) {
|
|
703
|
+
if (!(sig in confirmed))
|
|
704
|
+
confirmed[sig] = entry;
|
|
705
|
+
}
|
|
706
|
+
// Unknown: union, preferring confirmed over unknown for same signature
|
|
707
|
+
const unknown = { ...disk.unknown };
|
|
708
|
+
for (const [sig, memEntry] of Object.entries(memory.unknown)) {
|
|
709
|
+
if (sig in confirmed)
|
|
710
|
+
continue; // confirmed wins — don't resurrect into unknown
|
|
711
|
+
const diskEntry = unknown[sig];
|
|
712
|
+
if (!diskEntry) {
|
|
713
|
+
unknown[sig] = memEntry;
|
|
714
|
+
}
|
|
715
|
+
else {
|
|
716
|
+
// Fresher sample wins the body; the window and the count span both observers.
|
|
717
|
+
// ⚠ COPY, never mutate in place: the chosen entry belongs to `_store` (or to the disk
|
|
718
|
+
// store we just parsed), and writing the summed count back into it would inflate the
|
|
719
|
+
// count again on the next persist that follows another external write.
|
|
720
|
+
const fresher = memEntry.lastSeen >= diskEntry.lastSeen ? memEntry : diskEntry;
|
|
721
|
+
unknown[sig] = {
|
|
722
|
+
...fresher,
|
|
723
|
+
count: memEntry.count + diskEntry.count,
|
|
724
|
+
firstSeen: Math.min(memEntry.firstSeen, diskEntry.firstSeen),
|
|
725
|
+
lastSeen: Math.max(memEntry.lastSeen, diskEntry.lastSeen),
|
|
726
|
+
};
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
// Ignored: union, keep latest `at`
|
|
730
|
+
const ignored = { ...disk.ignored };
|
|
731
|
+
for (const [sig, memEntry] of Object.entries(memory.ignored ?? {})) {
|
|
732
|
+
const diskEntry = ignored[sig];
|
|
733
|
+
if (!diskEntry || memEntry.at > diskEntry.at)
|
|
734
|
+
ignored[sig] = memEntry;
|
|
735
|
+
}
|
|
736
|
+
return { version: 2, confirmed, unknown, ignored };
|
|
737
|
+
}
|
|
633
738
|
function persist(path) {
|
|
634
739
|
if (!_store)
|
|
635
740
|
return;
|
|
741
|
+
const normalizedPath = resolve(path);
|
|
636
742
|
try {
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
743
|
+
// Before writing, check if the file has changed since we loaded it.
|
|
744
|
+
// If so, re-read and merge to avoid lost updates.
|
|
745
|
+
const observation = observeInterpretationStore(normalizedPath);
|
|
746
|
+
let storeToWrite = _store;
|
|
747
|
+
if (observation.kind === "present" && observation.token !== _token) {
|
|
748
|
+
// The file moved under us — another process (usually `llm-relay eligibility accept`, which
|
|
749
|
+
// runs as its own CLI process) wrote it after we loaded. Re-read through the SAME parser and
|
|
750
|
+
// merge, so this write cannot serialize a stale snapshot over an operator's acceptance.
|
|
751
|
+
const diskStore = readStoreFile(normalizedPath);
|
|
752
|
+
storeToWrite = mergeStores(diskStore, _store);
|
|
753
|
+
}
|
|
754
|
+
mkdirSync(join(normalizedPath, ".."), { recursive: true });
|
|
755
|
+
const tmp = `${normalizedPath}.${process.pid}.tmp`;
|
|
756
|
+
writeFileSync(tmp, JSON.stringify(storeToWrite, null, 2) + "\n", "utf8");
|
|
757
|
+
renameSync(tmp, normalizedPath);
|
|
758
|
+
// Update memoized token to the newly-written file's stat.
|
|
759
|
+
const newObservation = observeInterpretationStore(normalizedPath);
|
|
760
|
+
_token = newObservation.kind === "present" ? newObservation.token : null;
|
|
641
761
|
}
|
|
642
762
|
catch {
|
|
643
763
|
/* storage problem, never a request failure — same contract as every other store here */
|
|
@@ -828,6 +948,7 @@ export function flushInterpretations(opts = {}) {
|
|
|
828
948
|
export function resetInterpretations() {
|
|
829
949
|
_store = null;
|
|
830
950
|
_path = null;
|
|
951
|
+
_token = null;
|
|
831
952
|
writer.clear();
|
|
832
953
|
}
|
|
833
954
|
//# sourceMappingURL=refusal-interpretation.js.map
|