llm-relay 0.47.0 → 0.48.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-io.js +1 -9
- package/dist/accounting-store-io.js.map +1 -1
- package/dist/accounting-store-schema.d.ts +0 -35
- package/dist/accounting-store-schema.js +14 -101
- package/dist/accounting-store-schema.js.map +1 -1
- package/dist/accounting-store.d.ts +7 -0
- package/dist/accounting-store.js +3 -1
- package/dist/accounting-store.js.map +1 -1
- package/dist/availability-snapshot.js +14 -44
- package/dist/availability-snapshot.js.map +1 -1
- package/dist/availability.d.ts +31 -4
- package/dist/availability.js +36 -0
- package/dist/availability.js.map +1 -1
- package/dist/backend.js +12 -20
- package/dist/backend.js.map +1 -1
- package/dist/candidates.js +12 -46
- package/dist/candidates.js.map +1 -1
- package/dist/cli.js +47 -178
- package/dist/cli.js.map +1 -1
- package/dist/configured-limits.js +55 -106
- package/dist/configured-limits.js.map +1 -1
- package/dist/cooldown-clear.d.ts +3 -0
- package/dist/cooldown-clear.js +158 -2
- package/dist/cooldown-clear.js.map +1 -1
- package/dist/dashboard/.vite/manifest.json +1 -1
- package/dist/dashboard/assets/{index-u-Ez_oE6.js → index-BA4GdK4p.js} +1 -1
- package/dist/dashboard/index.html +1 -1
- package/dist/dashboard-contract.js +1 -5
- package/dist/dashboard-contract.js.map +1 -1
- package/dist/dashboard-routes.js +29 -57
- package/dist/dashboard-routes.js.map +1 -1
- package/dist/dashboard-snapshot.js +17 -42
- package/dist/dashboard-snapshot.js.map +1 -1
- package/dist/dashboard-static.js +1 -3
- package/dist/dashboard-static.js.map +1 -1
- package/dist/dialect-stream.js +13 -21
- package/dist/dialect-stream.js.map +1 -1
- package/dist/hard-cap.d.ts +3 -1
- package/dist/hard-cap.js +11 -0
- package/dist/hard-cap.js.map +1 -1
- package/dist/json-shape.d.ts +22 -0
- package/dist/json-shape.js +40 -0
- package/dist/json-shape.js.map +1 -0
- package/dist/keys-cli.js +4 -60
- package/dist/keys-cli.js.map +1 -1
- package/dist/keystore.js +11 -18
- package/dist/keystore.js.map +1 -1
- package/dist/openai-dialect.js +46 -40
- package/dist/openai-dialect.js.map +1 -1
- package/dist/openai-request.d.ts +0 -26
- package/dist/openai-request.js +1 -3
- package/dist/openai-request.js.map +1 -1
- package/dist/quota-demotion.js +9 -34
- package/dist/quota-demotion.js.map +1 -1
- package/dist/refusal-interpretation.js +1 -4
- package/dist/refusal-interpretation.js.map +1 -1
- package/dist/responses-request.d.ts +0 -76
- package/dist/responses-request.js +1 -3
- package/dist/responses-request.js.map +1 -1
- package/dist/server.js +122 -150
- package/dist/server.js.map +1 -1
- package/dist/sse-frames.d.ts +39 -0
- package/dist/sse-frames.js +65 -0
- package/dist/sse-frames.js.map +1 -0
- package/dist/stream-commit.js +14 -24
- package/dist/stream-commit.js.map +1 -1
- package/dist/target-facts.d.ts +6 -0
- package/dist/target-facts.js +8 -5
- package/dist/target-facts.js.map +1 -1
- package/dist/think-tags.js +11 -30
- package/dist/think-tags.js.map +1 -1
- package/dist/tool-use-ids.d.ts +0 -31
- package/dist/tool-use-ids.js +11 -63
- package/dist/tool-use-ids.js.map +1 -1
- package/dist/usage-observer.js +22 -33
- package/dist/usage-observer.js.map +1 -1
- package/package.json +1 -1
|
@@ -15,25 +15,10 @@ function parseAxisValues(raw, where) {
|
|
|
15
15
|
}
|
|
16
16
|
return out;
|
|
17
17
|
}
|
|
18
|
-
/**
|
|
19
|
-
function
|
|
18
|
+
/** Recognize one member of the closed axis vocabulary. */
|
|
19
|
+
function isConfiguredLimitAxis(key) {
|
|
20
20
|
return CONFIGURED_LIMIT_AXES.includes(key);
|
|
21
21
|
}
|
|
22
|
-
/**
|
|
23
|
-
* Validate one flat hard-axis set. Same positive-safe-integer rule as the soft axes, but NO
|
|
24
|
-
* nested `models` handling here — the caller splits that out first.
|
|
25
|
-
*/
|
|
26
|
-
function parseHardAxisValues(raw, where) {
|
|
27
|
-
const out = {};
|
|
28
|
-
for (const key of Object.keys(raw)) {
|
|
29
|
-
const value = raw[key];
|
|
30
|
-
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
31
|
-
throw new Error(`${where}.${key} must be a positive integer; got ${JSON.stringify(value)}`);
|
|
32
|
-
}
|
|
33
|
-
out[key] = value;
|
|
34
|
-
}
|
|
35
|
-
return out;
|
|
36
|
-
}
|
|
37
22
|
/**
|
|
38
23
|
* Validate the `hard` sub-block of a `limits` declaration at load time. FLAT AXES ONLY: a
|
|
39
24
|
* per-deployment cap rides inside that deployment's own limits entry
|
|
@@ -50,7 +35,7 @@ export function parseHardLimits(raw, where) {
|
|
|
50
35
|
throw new Error(`${where} must be an object of rate-limit axes`);
|
|
51
36
|
}
|
|
52
37
|
for (const key of Object.keys(raw)) {
|
|
53
|
-
if (!
|
|
38
|
+
if (!isConfiguredLimitAxis(key)) {
|
|
54
39
|
// Month ceilings are refused, not ignored: the ledger's window read declines month
|
|
55
40
|
// (`usedInWindow` returns no figure), so such a cap could never fire and its presence would
|
|
56
41
|
// be a lie about what this relay enforces. See docs/reference.md "Hard caps".
|
|
@@ -58,7 +43,32 @@ export function parseHardLimits(raw, where) {
|
|
|
58
43
|
`minute/day periods only — a per-deployment cap belongs in that model's own limits entry`);
|
|
59
44
|
}
|
|
60
45
|
}
|
|
61
|
-
return
|
|
46
|
+
return parseAxisValues(raw, where);
|
|
47
|
+
}
|
|
48
|
+
/** Parse the grammar shared by a provider/credential block and each of its model entries. */
|
|
49
|
+
function parseLimitEntry(raw, where, allowModels) {
|
|
50
|
+
const axes = {};
|
|
51
|
+
let modelsRaw;
|
|
52
|
+
let hardRaw;
|
|
53
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
54
|
+
if (allowModels && key === "models") {
|
|
55
|
+
modelsRaw = value;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (key === "hard") {
|
|
59
|
+
hardRaw = value;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (!isConfiguredLimitAxis(key)) {
|
|
63
|
+
throw new Error(`${where}.${key} is not a known rate-limit axis (expected ${CONFIGURED_LIMIT_AXES.join(", ")})`);
|
|
64
|
+
}
|
|
65
|
+
axes[key] = value;
|
|
66
|
+
}
|
|
67
|
+
const limits = parseAxisValues(axes, where);
|
|
68
|
+
const hard = parseHardLimits(hardRaw, `${where}.hard`);
|
|
69
|
+
if (hard !== undefined)
|
|
70
|
+
limits.hard = hard;
|
|
71
|
+
return [limits, modelsRaw];
|
|
62
72
|
}
|
|
63
73
|
/**
|
|
64
74
|
* Validate a `limits` block at load time.
|
|
@@ -79,30 +89,8 @@ export function parseConfiguredLimits(raw, where) {
|
|
|
79
89
|
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
|
|
80
90
|
throw new Error(`${where} must be an object of rate-limit axes`);
|
|
81
91
|
}
|
|
82
|
-
const
|
|
83
|
-
const
|
|
84
|
-
let modelsRaw;
|
|
85
|
-
let hardRaw;
|
|
86
|
-
for (const [key, v] of Object.entries(value)) {
|
|
87
|
-
if (key === "models") {
|
|
88
|
-
modelsRaw = v;
|
|
89
|
-
continue;
|
|
90
|
-
}
|
|
91
|
-
if (key === "hard") {
|
|
92
|
-
// The refusal ceilings ride INSIDE the same block, validated by their own parser —
|
|
93
|
-
// which throws on the same typo hazards this one does.
|
|
94
|
-
hardRaw = v;
|
|
95
|
-
continue;
|
|
96
|
-
}
|
|
97
|
-
if (!CONFIGURED_LIMIT_AXES.includes(key)) {
|
|
98
|
-
throw new Error(`${where}.${key} is not a known rate-limit axis (expected ${CONFIGURED_LIMIT_AXES.join(", ")})`);
|
|
99
|
-
}
|
|
100
|
-
axes[key] = v;
|
|
101
|
-
}
|
|
102
|
-
const out = parseAxisValues(axes, where);
|
|
103
|
-
const hard = parseHardLimits(hardRaw, `${where}.hard`);
|
|
104
|
-
if (hard !== undefined)
|
|
105
|
-
out.hard = hard;
|
|
92
|
+
const [parsed, modelsRaw] = parseLimitEntry(raw, where, true);
|
|
93
|
+
const out = parsed;
|
|
106
94
|
if (modelsRaw !== undefined) {
|
|
107
95
|
if (typeof modelsRaw !== "object" || modelsRaw === null || Array.isArray(modelsRaw)) {
|
|
108
96
|
throw new Error(`${where}.models must be an object mapping backend model ids to limit axes`);
|
|
@@ -113,26 +101,9 @@ export function parseConfiguredLimits(raw, where) {
|
|
|
113
101
|
throw new Error(`${where}.models.${JSON.stringify(modelId)} must be an object of rate-limit axes`);
|
|
114
102
|
}
|
|
115
103
|
// A model override goes through the SAME closed-axis check — an "RPM" inside a model entry
|
|
116
|
-
// is the same silent-typo hazard as one at the top level. `
|
|
117
|
-
//
|
|
118
|
-
const
|
|
119
|
-
let entryHardRaw;
|
|
120
|
-
const entryAxes = {};
|
|
121
|
-
for (const [key, v] of Object.entries(entryValue)) {
|
|
122
|
-
if (key === "hard") {
|
|
123
|
-
entryHardRaw = v;
|
|
124
|
-
continue;
|
|
125
|
-
}
|
|
126
|
-
if (!CONFIGURED_LIMIT_AXES.includes(key)) {
|
|
127
|
-
throw new Error(`${where}.models.${JSON.stringify(modelId)}.${key} is not a known rate-limit axis ` +
|
|
128
|
-
`(expected ${CONFIGURED_LIMIT_AXES.join(", ")})`);
|
|
129
|
-
}
|
|
130
|
-
entryAxes[key] = v;
|
|
131
|
-
}
|
|
132
|
-
const parsedEntry = parseAxisValues(entryAxes, `${where}.models.${JSON.stringify(modelId)}`);
|
|
133
|
-
const entryHard = parseHardLimits(entryHardRaw, `${where}.models.${JSON.stringify(modelId)}.hard`);
|
|
134
|
-
if (entryHard !== undefined)
|
|
135
|
-
parsedEntry.hard = entryHard;
|
|
104
|
+
// is the same silent-typo hazard as one at the top level. `allowModels` is false here, so a
|
|
105
|
+
// nested `models` key is rejected by that same closed-axis check rather than recursing.
|
|
106
|
+
const [parsedEntry] = parseLimitEntry(entry, `${where}.models.${JSON.stringify(modelId)}`, false);
|
|
136
107
|
models[modelId] = parsedEntry;
|
|
137
108
|
}
|
|
138
109
|
if (Object.keys(models).length > 0)
|
|
@@ -163,54 +134,32 @@ export function resolveConfiguredLimits(cfg, provider, credentialLabel, model) {
|
|
|
163
134
|
: p.credentials?.find((c) => c.label === credentialLabel)?.limits;
|
|
164
135
|
if (providerLimits === undefined && credentialLimits === undefined)
|
|
165
136
|
return null;
|
|
137
|
+
const ladder = [
|
|
138
|
+
["credential-model", model !== null ? credentialLimits?.models?.[model] : undefined],
|
|
139
|
+
["provider-model", model !== null ? providerLimits?.models?.[model] : undefined],
|
|
140
|
+
["credential", credentialLimits],
|
|
141
|
+
["provider", providerLimits],
|
|
142
|
+
];
|
|
166
143
|
const out = { basis: "configured", source: {} };
|
|
167
144
|
const hard = {};
|
|
168
145
|
const hardSource = {};
|
|
169
146
|
let hardDeclared = false;
|
|
170
147
|
for (const axis of CONFIGURED_LIMIT_AXES) {
|
|
171
|
-
|
|
172
|
-
const
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
out[axis]
|
|
185
|
-
|
|
186
|
-
}
|
|
187
|
-
else if (fromProvider !== undefined) {
|
|
188
|
-
out[axis] = fromProvider;
|
|
189
|
-
out.source[axis] = "provider";
|
|
190
|
-
}
|
|
191
|
-
// The `hard` ladder mirrors the soft one EXACTLY — same four declaration sites, same
|
|
192
|
-
// most-specific-first order. A second grammar here would be a second thing to keep in step.
|
|
193
|
-
const fromCredentialHardModel = model !== null ? credentialLimits?.models?.[model]?.hard?.[axis] : undefined;
|
|
194
|
-
const fromProviderHardModel = model !== null ? providerLimits?.models?.[model]?.hard?.[axis] : undefined;
|
|
195
|
-
if (fromCredentialHardModel !== undefined) {
|
|
196
|
-
hard[axis] = fromCredentialHardModel;
|
|
197
|
-
hardSource[axis] = "credential-model";
|
|
198
|
-
hardDeclared = true;
|
|
199
|
-
}
|
|
200
|
-
else if (fromProviderHardModel !== undefined) {
|
|
201
|
-
hard[axis] = fromProviderHardModel;
|
|
202
|
-
hardSource[axis] = "provider-model";
|
|
203
|
-
hardDeclared = true;
|
|
204
|
-
}
|
|
205
|
-
else if (credentialLimits?.hard?.[axis] !== undefined) {
|
|
206
|
-
hard[axis] = credentialLimits.hard[axis];
|
|
207
|
-
hardSource[axis] = "credential";
|
|
208
|
-
hardDeclared = true;
|
|
209
|
-
}
|
|
210
|
-
else if (providerLimits?.hard?.[axis] !== undefined) {
|
|
211
|
-
hard[axis] = providerLimits.hard[axis];
|
|
212
|
-
hardSource[axis] = "provider";
|
|
213
|
-
hardDeclared = true;
|
|
148
|
+
// The two figures resolve independently while walking the SAME precedence ladder.
|
|
149
|
+
for (const [source, limits] of ladder) {
|
|
150
|
+
const softValue = limits?.[axis];
|
|
151
|
+
if (out[axis] === undefined && softValue !== undefined) {
|
|
152
|
+
out[axis] = softValue;
|
|
153
|
+
out.source[axis] = source;
|
|
154
|
+
}
|
|
155
|
+
const hardValue = limits?.hard?.[axis];
|
|
156
|
+
if (hard[axis] === undefined && hardValue !== undefined) {
|
|
157
|
+
hard[axis] = hardValue;
|
|
158
|
+
hardSource[axis] = source;
|
|
159
|
+
hardDeclared = true;
|
|
160
|
+
}
|
|
161
|
+
if (out[axis] !== undefined && hard[axis] !== undefined)
|
|
162
|
+
break;
|
|
214
163
|
}
|
|
215
164
|
}
|
|
216
165
|
// Attached only when something was declared, so a no-cap resolution keeps the exact pre-G2
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configured-limits.js","sourceRoot":"","sources":["../src/configured-limits.ts"],"names":[],"mappings":"AAmBA,mGAAmG;AACnG,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAU,CAAC;AA+B3E;;;GAGG;AACH,SAAS,eAAe,CAAC,GAA4B,EAAE,KAAa;IAClE,MAAM,GAAG,GAAuB,EAAE,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAK,KAAgB,IAAI,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,IAAI,GAAG,oCAAoC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAC3E,CAAC;QACJ,CAAC;QACD,GAAG,CAAC,GAA0B,CAAC,GAAG,KAAe,CAAC;IACpD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"configured-limits.js","sourceRoot":"","sources":["../src/configured-limits.ts"],"names":[],"mappings":"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"}
|
package/dist/cooldown-clear.d.ts
CHANGED
|
@@ -25,6 +25,9 @@ export interface CooldownClearResult {
|
|
|
25
25
|
readonly facts: ClearedCooldownGroup<ClearedCooldownFact>;
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
|
+
export type CooldownClearTargetKey = keyof CooldownClearTarget;
|
|
29
|
+
/** Validate the cooldown-clear wire envelope under a caller-owned exact target-key policy. */
|
|
30
|
+
export declare function isCooldownClearResult(value: unknown, expectedTarget: CooldownClearTarget, acceptedTargetKeys: readonly CooldownClearTargetKey[]): value is CooldownClearResult;
|
|
28
31
|
/** One mutation seam for the live breaker and process-global learned fact store. */
|
|
29
32
|
export declare function clearCooldowns(breaker: CircuitBreaker, target: CooldownClearTarget, opts?: {
|
|
30
33
|
factsPath?: string;
|
package/dist/cooldown-clear.js
CHANGED
|
@@ -1,5 +1,161 @@
|
|
|
1
|
-
import { makeCredentialId, parseCredentialId } from "./credential-id.js";
|
|
2
|
-
import {
|
|
1
|
+
import { CREDENTIAL_LABEL_PATTERN, makeCredentialId, parseCredentialId, } from "./credential-id.js";
|
|
2
|
+
import { hasExactKeys, isRecord } from "./json-shape.js";
|
|
3
|
+
import { clearCooldownFacts, clearCredentialInvalidFacts, COOLING_FACT_KINDS, } from "./target-facts.js";
|
|
4
|
+
function nonEmptyString(value) {
|
|
5
|
+
return typeof value === "string" && value.length > 0;
|
|
6
|
+
}
|
|
7
|
+
function credentialIdBelongsTo(provider, value) {
|
|
8
|
+
if (typeof value !== "string")
|
|
9
|
+
return false;
|
|
10
|
+
return parseCredentialId(value)?.provider === provider;
|
|
11
|
+
}
|
|
12
|
+
function targetMatches(value, expected, acceptedKeys) {
|
|
13
|
+
if (!hasExactKeys(value, acceptedKeys))
|
|
14
|
+
return false;
|
|
15
|
+
return acceptedKeys.every((key) => {
|
|
16
|
+
if (key !== "kinds")
|
|
17
|
+
return value[key] === expected[key];
|
|
18
|
+
return Array.isArray(value.kinds) && expected.kinds !== undefined &&
|
|
19
|
+
value.kinds.length === expected.kinds.length &&
|
|
20
|
+
value.kinds.every((kind, index) => kind === expected.kinds[index]);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function isCooldownFactScope(value) {
|
|
24
|
+
if (!isRecord(value))
|
|
25
|
+
return false;
|
|
26
|
+
switch (value.kind) {
|
|
27
|
+
case "attempt":
|
|
28
|
+
return hasExactKeys(value, ["kind", "provider", "credentialId", "model"]) &&
|
|
29
|
+
nonEmptyString(value.provider) &&
|
|
30
|
+
credentialIdBelongsTo(value.provider, value.credentialId) &&
|
|
31
|
+
nonEmptyString(value.model);
|
|
32
|
+
case "group": {
|
|
33
|
+
const keys = Object.hasOwn(value, "credentialId")
|
|
34
|
+
? ["kind", "provider", "credentialId", "members"]
|
|
35
|
+
: ["kind", "provider", "members"];
|
|
36
|
+
return hasExactKeys(value, keys) &&
|
|
37
|
+
nonEmptyString(value.provider) &&
|
|
38
|
+
Array.isArray(value.members) &&
|
|
39
|
+
value.members.length > 0 &&
|
|
40
|
+
value.members.every(nonEmptyString) &&
|
|
41
|
+
(!Object.hasOwn(value, "credentialId") || credentialIdBelongsTo(value.provider, value.credentialId));
|
|
42
|
+
}
|
|
43
|
+
case "deployment":
|
|
44
|
+
return hasExactKeys(value, ["kind", "provider", "model"]) &&
|
|
45
|
+
nonEmptyString(value.provider) && nonEmptyString(value.model);
|
|
46
|
+
case "credential":
|
|
47
|
+
return hasExactKeys(value, ["kind", "provider", "credentialId"]) &&
|
|
48
|
+
nonEmptyString(value.provider) && credentialIdBelongsTo(value.provider, value.credentialId);
|
|
49
|
+
case "provider":
|
|
50
|
+
return hasExactKeys(value, ["kind", "provider"]) && nonEmptyString(value.provider);
|
|
51
|
+
case "model":
|
|
52
|
+
return hasExactKeys(value, ["kind", "model"]) && nonEmptyString(value.model);
|
|
53
|
+
default:
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function scopeIsContainedByTarget(scope, target) {
|
|
58
|
+
const credentialId = target.credential === undefined
|
|
59
|
+
? undefined
|
|
60
|
+
: makeCredentialId(target.provider, target.credential);
|
|
61
|
+
switch (scope.kind) {
|
|
62
|
+
case "attempt":
|
|
63
|
+
return scope.provider === target.provider &&
|
|
64
|
+
(target.model === undefined || scope.model === target.model) &&
|
|
65
|
+
(credentialId === undefined || scope.credentialId === credentialId);
|
|
66
|
+
case "group":
|
|
67
|
+
return scope.provider === target.provider &&
|
|
68
|
+
(target.model === undefined || scope.members.every((member) => member === target.model)) &&
|
|
69
|
+
(credentialId === undefined || scope.credentialId === credentialId);
|
|
70
|
+
case "deployment":
|
|
71
|
+
return scope.provider === target.provider && credentialId === undefined &&
|
|
72
|
+
(target.model === undefined || scope.model === target.model);
|
|
73
|
+
case "credential":
|
|
74
|
+
return scope.provider === target.provider && target.model === undefined &&
|
|
75
|
+
(credentialId === undefined || scope.credentialId === credentialId);
|
|
76
|
+
case "provider":
|
|
77
|
+
return scope.provider === target.provider && target.model === undefined && credentialId === undefined;
|
|
78
|
+
case "model":
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function isNarrowedScope(value, target) {
|
|
83
|
+
if (!isRecord(value) || typeof value.kind !== "string")
|
|
84
|
+
return false;
|
|
85
|
+
const credentialId = target.credential === undefined
|
|
86
|
+
? undefined
|
|
87
|
+
: makeCredentialId(target.provider, target.credential);
|
|
88
|
+
switch (value.kind) {
|
|
89
|
+
case "attempt":
|
|
90
|
+
return hasExactKeys(value, ["kind", "provider", "credentialId", "model"]) &&
|
|
91
|
+
value.provider === target.provider && value.credentialId === credentialId &&
|
|
92
|
+
typeof value.model === "string";
|
|
93
|
+
case "group":
|
|
94
|
+
return hasExactKeys(value, ["kind", "provider", "credentialId", "members"]) &&
|
|
95
|
+
value.provider === target.provider && value.credentialId === credentialId &&
|
|
96
|
+
Array.isArray(value.members) && value.members.length > 0 &&
|
|
97
|
+
value.members.every(nonEmptyString);
|
|
98
|
+
case "credential":
|
|
99
|
+
return hasExactKeys(value, ["kind", "provider", "credentialId"]) &&
|
|
100
|
+
value.provider === target.provider && value.credentialId === credentialId;
|
|
101
|
+
default:
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function isCooldownCell(value, target, narrowed) {
|
|
106
|
+
if (!isRecord(value) || !hasExactKeys(value, ["provider", "model", "credential"]))
|
|
107
|
+
return false;
|
|
108
|
+
if (value.provider !== target.provider || (!narrowed && !nonEmptyString(value.provider)))
|
|
109
|
+
return false;
|
|
110
|
+
if (!(value.model === null || (narrowed ? typeof value.model === "string" : nonEmptyString(value.model)))) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
if (narrowed) {
|
|
114
|
+
if (value.credential !== target.credential)
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
else if (!nonEmptyString(value.credential) || !CREDENTIAL_LABEL_PATTERN.test(value.credential)) {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
return (target.model === undefined || value.model === target.model) &&
|
|
121
|
+
(target.credential === undefined || value.credential === target.credential);
|
|
122
|
+
}
|
|
123
|
+
function isCooldownFact(value, target, narrowed) {
|
|
124
|
+
if (!isRecord(value) || !hasExactKeys(value, ["kind", "scope"]))
|
|
125
|
+
return false;
|
|
126
|
+
if (narrowed) {
|
|
127
|
+
return value.kind === "credential-invalid" && isNarrowedScope(value.scope, target);
|
|
128
|
+
}
|
|
129
|
+
return typeof value.kind === "string" &&
|
|
130
|
+
COOLING_FACT_KINDS.has(value.kind) &&
|
|
131
|
+
isCooldownFactScope(value.scope) &&
|
|
132
|
+
scopeIsContainedByTarget(value.scope, target);
|
|
133
|
+
}
|
|
134
|
+
function isClearedGroup(value, isItem) {
|
|
135
|
+
if (!isRecord(value) || !hasExactKeys(value, ["count", "items"]) ||
|
|
136
|
+
typeof value.count !== "number" || !Number.isSafeInteger(value.count) ||
|
|
137
|
+
value.count < 0 || !Array.isArray(value.items)) {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
return value.count === value.items.length && value.items.every(isItem);
|
|
141
|
+
}
|
|
142
|
+
/** Validate the cooldown-clear wire envelope under a caller-owned exact target-key policy. */
|
|
143
|
+
export function isCooldownClearResult(value, expectedTarget, acceptedTargetKeys) {
|
|
144
|
+
if (!isRecord(value) || !hasExactKeys(value, ["target", "cleared"]) ||
|
|
145
|
+
!targetMatches(value.target, expectedTarget, acceptedTargetKeys) ||
|
|
146
|
+
!isRecord(value.cleared) ||
|
|
147
|
+
!hasExactKeys(value.cleared, ["breakerCells", "credentialFaults", "facts"])) {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
// Derived from the semantic condition the PRODUCER uses (`target.kinds !== undefined` in
|
|
151
|
+
// clearCooldowns), not from the key-policy array — one definition of "narrowed" per file.
|
|
152
|
+
const narrowed = expectedTarget.kinds !== undefined;
|
|
153
|
+
return isClearedGroup(value.cleared.breakerCells, narrowed
|
|
154
|
+
? (_item) => false
|
|
155
|
+
: (item) => isCooldownCell(item, expectedTarget, false)) &&
|
|
156
|
+
isClearedGroup(value.cleared.credentialFaults, (item) => isCooldownCell(item, expectedTarget, narrowed)) &&
|
|
157
|
+
isClearedGroup(value.cleared.facts, (item) => isCooldownFact(item, expectedTarget, narrowed));
|
|
158
|
+
}
|
|
3
159
|
function publicCell(cell) {
|
|
4
160
|
return {
|
|
5
161
|
provider: cell.provider,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cooldown-clear.js","sourceRoot":"","sources":["../src/cooldown-clear.ts"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"cooldown-clear.js","sourceRoot":"","sources":["../src/cooldown-clear.ts"],"names":[],"mappings":"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"}
|