audit-tools 0.33.9 → 0.33.11
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/audit/orchestrator/rollingDispatch.js +1 -1
- package/dist/audit/orchestrator/rollingDispatch.js.map +1 -1
- package/dist/remediate/steps/nextStep.js +1 -1
- package/dist/remediate/steps/nextStep.js.map +1 -1
- package/dist/shared/dispatch/admissionLeaseReconcile.js +1 -1
- package/dist/shared/dispatch/admissionLeaseReconcile.js.map +1 -1
- package/dist/shared/dispatch/admissionLoop.d.ts +42 -10
- package/dist/shared/dispatch/admissionLoop.d.ts.map +1 -1
- package/dist/shared/dispatch/admissionLoop.js +74 -7
- package/dist/shared/dispatch/admissionLoop.js.map +1 -1
- package/dist/shared/dispatch/dispatchQuotaContract.d.ts +82 -7
- package/dist/shared/dispatch/dispatchQuotaContract.d.ts.map +1 -1
- package/dist/shared/dispatch/hostDispatchWall.d.ts.map +1 -1
- package/dist/shared/dispatch/hostDispatchWall.js +8 -0
- package/dist/shared/dispatch/hostDispatchWall.js.map +1 -1
- package/dist/shared/dispatch/rollingDispatch.d.ts +17 -10
- package/dist/shared/dispatch/rollingDispatch.d.ts.map +1 -1
- package/dist/shared/dispatch/rollingDispatch.js +49 -33
- package/dist/shared/dispatch/rollingDispatch.js.map +1 -1
- package/dist/shared/dispatch/unifiedRolling.d.ts +3 -2
- package/dist/shared/dispatch/unifiedRolling.d.ts.map +1 -1
- package/dist/shared/dispatch/unifiedRolling.js +12 -4
- package/dist/shared/dispatch/unifiedRolling.js.map +1 -1
- package/dist/shared/index.d.ts +2 -2
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +5 -1
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/providers/providerConfirmation.d.ts +1 -1
- package/dist/shared/providers/providerConfirmation.d.ts.map +1 -1
- package/dist/shared/providers/providerConfirmation.js +11 -2
- package/dist/shared/providers/providerConfirmation.js.map +1 -1
- package/dist/shared/providers/sharedProviderConfirmation.d.ts +20 -5
- package/dist/shared/providers/sharedProviderConfirmation.d.ts.map +1 -1
- package/dist/shared/providers/sharedProviderConfirmation.js +108 -34
- package/dist/shared/providers/sharedProviderConfirmation.js.map +1 -1
- package/dist/shared/quota/accountId.d.ts +70 -0
- package/dist/shared/quota/accountId.d.ts.map +1 -1
- package/dist/shared/quota/accountId.js +82 -5
- package/dist/shared/quota/accountId.js.map +1 -1
- package/dist/shared/quota/apiPool.d.ts +2 -1
- package/dist/shared/quota/apiPool.d.ts.map +1 -1
- package/dist/shared/quota/apiPool.js +14 -2
- package/dist/shared/quota/apiPool.js.map +1 -1
- package/dist/shared/quota/capacity.d.ts +82 -0
- package/dist/shared/quota/capacity.d.ts.map +1 -1
- package/dist/shared/quota/capacity.js +42 -1
- package/dist/shared/quota/capacity.js.map +1 -1
- package/dist/shared/quota/claudeOAuthQuotaSource.d.ts.map +1 -1
- package/dist/shared/quota/claudeOAuthQuotaSource.js +46 -8
- package/dist/shared/quota/claudeOAuthQuotaSource.js.map +1 -1
- package/dist/shared/quota/quotaSource.d.ts +73 -2
- package/dist/shared/quota/quotaSource.d.ts.map +1 -1
- package/dist/shared/quota/quotaSource.js +57 -2
- package/dist/shared/quota/quotaSource.js.map +1 -1
- package/dist/shared/quota/reservationLedger.d.ts +98 -26
- package/dist/shared/quota/reservationLedger.d.ts.map +1 -1
- package/dist/shared/quota/reservationLedger.js +109 -37
- package/dist/shared/quota/reservationLedger.js.map +1 -1
- package/dist/shared/quota/scheduler.d.ts +25 -1
- package/dist/shared/quota/scheduler.d.ts.map +1 -1
- package/dist/shared/quota/scheduler.js +115 -10
- package/dist/shared/quota/scheduler.js.map +1 -1
- package/dist/shared/quota/state.d.ts +24 -9
- package/dist/shared/quota/state.d.ts.map +1 -1
- package/dist/shared/quota/state.js +43 -16
- package/dist/shared/quota/state.js.map +1 -1
- package/dist/shared/quota/types.d.ts +57 -6
- package/dist/shared/quota/types.d.ts.map +1 -1
- package/dist/shared/quota/types.js.map +1 -1
- package/dist/shared/quota/windowConstraints.d.ts +56 -0
- package/dist/shared/quota/windowConstraints.d.ts.map +1 -0
- package/dist/shared/quota/windowConstraints.js +71 -0
- package/dist/shared/quota/windowConstraints.js.map +1 -0
- package/dist/shared/types/providerConfirmation.d.ts +31 -1
- package/dist/shared/types/providerConfirmation.d.ts.map +1 -1
- package/docs/audit-pkg/operator-guide.md +4 -1
- package/package.json +1 -1
|
@@ -45,12 +45,17 @@ export interface QuotaStateEntry {
|
|
|
45
45
|
last_429_at: string | null;
|
|
46
46
|
consecutive_429_count?: number;
|
|
47
47
|
/**
|
|
48
|
-
* Learned tokens→percent slope (EWMA)
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
48
|
+
* Learned tokens→percent slope (EWMA), keyed by `windowSlopeKey(scope, label)`
|
|
49
|
+
* (e.g. "account:session", "model:session") — NOT by bare label: an account-scoped
|
|
50
|
+
* and a model-scoped window can share a group name while pricing different
|
|
51
|
+
* allowances. `slope = Δtokens / Δpercent` where percent = remaining_pct*100.
|
|
52
|
+
* Windows scale on different denominators, so each learns its own slope.
|
|
53
|
+
*
|
|
54
|
+
* Two consumers, and the distinction matters: the slope prices each window's
|
|
55
|
+
* remaining percent into a token budget for REPORTING (the MIN across a pool's
|
|
56
|
+
* windows), and it is the exchange rate ADMISSION uses to convert a packet's tokens
|
|
57
|
+
* into a draw against a percent-denominated window. Absent until observed (cold
|
|
58
|
+
* start), which reads as `calibrating`.
|
|
54
59
|
*/
|
|
55
60
|
tokens_per_pct?: Record<string, number>;
|
|
56
61
|
/**
|
|
@@ -90,6 +95,41 @@ export interface QuotaBindingWindow {
|
|
|
90
95
|
/** The window's own remaining token budget (the value that won the MIN). */
|
|
91
96
|
budget: number;
|
|
92
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* One quota window's remaining allowance, expressed in THAT WINDOW'S OWN UNIT, as
|
|
100
|
+
* the metering unit admission reserves against. This is what replaces the MIN
|
|
101
|
+
* collapse as the basis for admission: the MIN survives only for REPORTING which
|
|
102
|
+
* window binds ({@link QuotaBindingWindow}).
|
|
103
|
+
*
|
|
104
|
+
* ⚠ There is no unit shared across windows, which is the whole reason this is a
|
|
105
|
+
* list rather than a number. A 5-hour `session` and a 7-day `weekly` scale on
|
|
106
|
+
* different denominators, so the same N tokens is a different fraction of each.
|
|
107
|
+
*
|
|
108
|
+
* `unit` is decided per window, by what the provider actually reported:
|
|
109
|
+
* - `tokens` — the window reported an ABSOLUTE `tokens_remaining`. Tokens are
|
|
110
|
+
* directly commensurable here because no exchange rate is involved, so even an
|
|
111
|
+
* account-scoped window shared by N models can meter in tokens.
|
|
112
|
+
* - `percent` — only `remaining_pct` is known, priced through the pool's own
|
|
113
|
+
* learned `tokensPerPct`. This is REQUIRED for an account-scoped percent window:
|
|
114
|
+
* N models share one percent allowance but each converts its tokens at its OWN
|
|
115
|
+
* rate, so percent is the only unit in which their draws are comparable.
|
|
116
|
+
*
|
|
117
|
+
* A window that can be priced in NEITHER unit is not represented here at all — it
|
|
118
|
+
* sets `calibrating`, which routes the pool through the cold-start clamp rather
|
|
119
|
+
* than being waved through unmetered.
|
|
120
|
+
*/
|
|
121
|
+
export interface WindowBudget {
|
|
122
|
+
/** Which partition the allowance belongs to — decided at the producer, never re-derived. */
|
|
123
|
+
scope: import("./quotaSource.js").QuotaWindowScope;
|
|
124
|
+
label: string;
|
|
125
|
+
/** Remaining allowance, in `unit`. */
|
|
126
|
+
budget: number;
|
|
127
|
+
unit: "tokens" | "percent";
|
|
128
|
+
/** Tokens per percentage point for this pool+window. Present iff `unit === "percent"`. */
|
|
129
|
+
tokensPerPct?: number;
|
|
130
|
+
/** The window's reset, carried for wall reporting. */
|
|
131
|
+
reset_at: string | null;
|
|
132
|
+
}
|
|
93
133
|
export interface WaveSchedule {
|
|
94
134
|
max_concurrent: number;
|
|
95
135
|
estimated_wave_tokens: number;
|
|
@@ -118,6 +158,17 @@ export interface WaveSchedule {
|
|
|
118
158
|
* time when there is no cooldown. Absent/null at cold start / no live snapshot.
|
|
119
159
|
*/
|
|
120
160
|
binding_window?: QuotaBindingWindow | null;
|
|
161
|
+
/**
|
|
162
|
+
* Every window this pool must fit inside, each in its own unit — the METERING
|
|
163
|
+
* basis. Admission reserves against ALL of them (all-or-nothing); an account-scoped
|
|
164
|
+
* entry is shared with every sibling model on the credential, which is what stops N
|
|
165
|
+
* models on one account from each admitting against their own copy of one allowance.
|
|
166
|
+
*
|
|
167
|
+
* Empty/absent when there is no live snapshot, or on the cooldown path where budget
|
|
168
|
+
* derivation is skipped entirely — admission then falls back to a single pool-keyed
|
|
169
|
+
* constraint carrying the scalar budget, i.e. exactly the pre-partition behaviour.
|
|
170
|
+
*/
|
|
171
|
+
window_budgets?: WindowBudget[];
|
|
121
172
|
/** Tokens already in flight against this pool when the wave was sized (0 default). */
|
|
122
173
|
in_flight_tokens?: number;
|
|
123
174
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iBAAiB,mIAQ5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,qBAAqB,sCAAoC,CAAC;AACvE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,gCAAgC,kHAY3C,CAAC;AACH,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAC9C,OAAO,gCAAgC,CACxC,CAAC;AAEF,eAAO,MAAM,0BAA0B;;;;;;;;;;;;EAM5B,CAAC;AACZ,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;EAQtB,CAAC;AACZ,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/shared/quota/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,IAAI,CAAC;IACtC,iBAAiB;IACjB,uBAAuB;IACvB,iBAAiB;IACjB,WAAW;IACX,kBAAkB;IAClB,SAAS;IACT,SAAS;CACV,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AAGvE,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,CAAC,IAAI,CAAC;IACrD,WAAW;IACX,eAAe;IACf,gBAAgB;IAChB,aAAa;IACb,wEAAwE;IACxE,yEAAyE;IACzE,mBAAmB;IACnB,6EAA6E;IAC7E,6EAA6E;IAC7E,0EAA0E;IAC1E,eAAe;CAChB,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC;KACxC,MAAM,CAAC;IACN,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,MAAM,EAAE,gCAAgC;IACxC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC/B,CAAC;KACD,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC;KAClC,MAAM,CAAC;IACN,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACvD,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC3D,wBAAwB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC7D,CAAC;KACD,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/shared/quota/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,IAAI,CAAC;IACtC,iBAAiB;IACjB,uBAAuB;IACvB,iBAAiB;IACjB,WAAW;IACX,kBAAkB;IAClB,SAAS;IACT,SAAS;CACV,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AAGvE,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,CAAC,IAAI,CAAC;IACrD,WAAW;IACX,eAAe;IACf,gBAAgB;IAChB,aAAa;IACb,wEAAwE;IACxE,yEAAyE;IACzE,mBAAmB;IACnB,6EAA6E;IAC7E,6EAA6E;IAC7E,0EAA0E;IAC1E,eAAe;CAChB,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC;KACxC,MAAM,CAAC;IACN,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,MAAM,EAAE,gCAAgC;IACxC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC/B,CAAC;KACD,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC;KAClC,MAAM,CAAC;IACN,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACvD,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC3D,wBAAwB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC7D,CAAC;KACD,MAAM,EAAE,CAAC;AAwCZ;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,IAAI,CAAC;IACzC,KAAK;IACL,KAAK;IACL,cAAc;IACd,UAAU;IACV,kBAAkB;IAClB,MAAM;CACP,CAAC,CAAC;AA0GH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC;KAChC,MAAM,CAAC;IACN,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC7C,CAAC;KACD,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { AdmitConstraint } from "./reservationLedger.js";
|
|
2
|
+
import type { QuotaWindowScope } from "./quotaSource.js";
|
|
3
|
+
import type { WindowBudget } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* The ledger key one window meters against.
|
|
6
|
+
*
|
|
7
|
+
* - `account` → `(accountKey, label)`: ONE allowance shared by every model on the
|
|
8
|
+
* credential. `accountKey` comes from the PRODUCER (`CapacityPool.accountKey`,
|
|
9
|
+
* set from the source declaration) — it is deliberately NOT derived here from
|
|
10
|
+
* `poolId`, because an explicitly declared `source.id` is returned verbatim as the
|
|
11
|
+
* pool key and carries no recoverable credential. Parsing it back out is what kept
|
|
12
|
+
* the motivating `nim-nano`/`nim-super` case broken across five rounds.
|
|
13
|
+
* - `model` → `(poolId, label)`: applies to this model alone; sharing it would
|
|
14
|
+
* falsely throttle siblings the limit does not cover.
|
|
15
|
+
*
|
|
16
|
+
* ⚠ The two are NAMESPACED (`acct:` / `pool:`). Without that they collide whenever
|
|
17
|
+
* `accountKey === poolId` — which is exactly the unattributable-source fallback — and
|
|
18
|
+
* an account-scoped and a model-scoped window sharing a label would silently meter as
|
|
19
|
+
* one allowance, destroying the partition on the pool class that most needs it.
|
|
20
|
+
*/
|
|
21
|
+
export declare function windowResourceKey(scope: QuotaWindowScope, label: string, poolId: string, accountKey: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* What `tokens` costs against one window, in that window's own unit. Returns null
|
|
24
|
+
* when the window cannot price the draw — a `percent` window whose learned slope is
|
|
25
|
+
* missing or non-positive. A null must never be silently treated as free: the caller
|
|
26
|
+
* drops the whole pool to the cold-start path rather than admitting unmetered.
|
|
27
|
+
*/
|
|
28
|
+
export declare function windowCost(window: WindowBudget, tokens: number): number | null;
|
|
29
|
+
/**
|
|
30
|
+
* Build the constraint array a packet of `tokens` must clear to be admitted on this
|
|
31
|
+
* pool — one constraint per window, all-or-nothing at the ledger.
|
|
32
|
+
*
|
|
33
|
+
* An EMPTY `windows` list falls back to a single pool-keyed constraint carrying
|
|
34
|
+
* `fallbackBudget` — the no-live-signal case (no snapshot, or the cooldown path where
|
|
35
|
+
* derivation is skipped). ⚠ The fallback MUST be the pool's own scalar budget, not
|
|
36
|
+
* `+Infinity`: a caller still holding a finite `remaining_token_budget` would
|
|
37
|
+
* otherwise have its ceiling silently discarded and over-admit. In production the two
|
|
38
|
+
* coincide (no windows ⇒ null budget ⇒ unbounded), so this is the belt that stops a
|
|
39
|
+
* future divergence from failing open.
|
|
40
|
+
*
|
|
41
|
+
* A window that cannot price the draw is DROPPED from the array and reported in
|
|
42
|
+
* `unpriced`, so the caller can refuse rather than admit against a partial set —
|
|
43
|
+
* silently omitting it would meter the packet against fewer allowances than apply to
|
|
44
|
+
* it, which is the fail-open direction.
|
|
45
|
+
*/
|
|
46
|
+
export interface PoolConstraintResolution {
|
|
47
|
+
constraints: AdmitConstraint[];
|
|
48
|
+
/**
|
|
49
|
+
* Windows that apply to the packet but could not price it. NON-EMPTY MEANS REFUSE:
|
|
50
|
+
* admitting on `constraints` alone would meter the packet against fewer allowances
|
|
51
|
+
* than actually bind it.
|
|
52
|
+
*/
|
|
53
|
+
unpriced: WindowBudget[];
|
|
54
|
+
}
|
|
55
|
+
export declare function windowConstraintsFor(poolId: string, accountKey: string, windows: WindowBudget[] | undefined, tokens: number, fallbackBudget?: number): PoolConstraintResolution;
|
|
56
|
+
//# sourceMappingURL=windowConstraints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windowConstraints.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/windowConstraints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAe/C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,MAAM,CAER;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM9E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,YAAY,EAAE,GAAG,SAAS,EACnC,MAAM,EAAE,MAAM,EACd,cAAc,GAAE,MAAiC,GAChD,wBAAwB,CAsB1B"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// The one place that turns a pool's per-window allowances into ledger constraints.
|
|
2
|
+
//
|
|
3
|
+
// Both admission paths go through here — the host grant (`admissionLoop`) and the
|
|
4
|
+
// in-process rolling engine (`rollingDispatch`). That is deliberate: the metering
|
|
5
|
+
// PARTITION is decided at the producer (`WindowBudget.scope` and
|
|
6
|
+
// `CapacityPool.accountKey`) and merely CARRIED here, because the moment a call site
|
|
7
|
+
// composes its own resource key from pool identity it is re-deriving the partition —
|
|
8
|
+
// which is what five refused repair rounds each did differently and each got wrong.
|
|
9
|
+
//
|
|
10
|
+
// (`rollingDispatch` keeps a literal single-constraint fallback for the case where no
|
|
11
|
+
// resolver is wired at all; that is an absence-of-config path, not a second
|
|
12
|
+
// derivation.)
|
|
13
|
+
/**
|
|
14
|
+
* The ledger key one window meters against.
|
|
15
|
+
*
|
|
16
|
+
* - `account` → `(accountKey, label)`: ONE allowance shared by every model on the
|
|
17
|
+
* credential. `accountKey` comes from the PRODUCER (`CapacityPool.accountKey`,
|
|
18
|
+
* set from the source declaration) — it is deliberately NOT derived here from
|
|
19
|
+
* `poolId`, because an explicitly declared `source.id` is returned verbatim as the
|
|
20
|
+
* pool key and carries no recoverable credential. Parsing it back out is what kept
|
|
21
|
+
* the motivating `nim-nano`/`nim-super` case broken across five rounds.
|
|
22
|
+
* - `model` → `(poolId, label)`: applies to this model alone; sharing it would
|
|
23
|
+
* falsely throttle siblings the limit does not cover.
|
|
24
|
+
*
|
|
25
|
+
* ⚠ The two are NAMESPACED (`acct:` / `pool:`). Without that they collide whenever
|
|
26
|
+
* `accountKey === poolId` — which is exactly the unattributable-source fallback — and
|
|
27
|
+
* an account-scoped and a model-scoped window sharing a label would silently meter as
|
|
28
|
+
* one allowance, destroying the partition on the pool class that most needs it.
|
|
29
|
+
*/
|
|
30
|
+
export function windowResourceKey(scope, label, poolId, accountKey) {
|
|
31
|
+
return scope === "account" ? `acct:${accountKey}::${label}` : `pool:${poolId}::${label}`;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* What `tokens` costs against one window, in that window's own unit. Returns null
|
|
35
|
+
* when the window cannot price the draw — a `percent` window whose learned slope is
|
|
36
|
+
* missing or non-positive. A null must never be silently treated as free: the caller
|
|
37
|
+
* drops the whole pool to the cold-start path rather than admitting unmetered.
|
|
38
|
+
*/
|
|
39
|
+
export function windowCost(window, tokens) {
|
|
40
|
+
const draw = Math.max(0, tokens);
|
|
41
|
+
if (window.unit === "tokens")
|
|
42
|
+
return draw;
|
|
43
|
+
const slope = window.tokensPerPct;
|
|
44
|
+
if (typeof slope !== "number" || !Number.isFinite(slope) || slope <= 0)
|
|
45
|
+
return null;
|
|
46
|
+
return draw / slope;
|
|
47
|
+
}
|
|
48
|
+
export function windowConstraintsFor(poolId, accountKey, windows, tokens, fallbackBudget = Number.POSITIVE_INFINITY) {
|
|
49
|
+
if (!windows || windows.length === 0) {
|
|
50
|
+
return {
|
|
51
|
+
constraints: [{ resourceKey: poolId, budget: fallbackBudget, cost: Math.max(0, tokens) }],
|
|
52
|
+
unpriced: [],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const constraints = [];
|
|
56
|
+
const unpriced = [];
|
|
57
|
+
for (const window of windows) {
|
|
58
|
+
const cost = windowCost(window, tokens);
|
|
59
|
+
if (cost === null) {
|
|
60
|
+
unpriced.push(window);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
constraints.push({
|
|
64
|
+
resourceKey: windowResourceKey(window.scope, window.label, poolId, accountKey),
|
|
65
|
+
budget: window.budget,
|
|
66
|
+
cost,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return { constraints, unpriced };
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=windowConstraints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windowConstraints.js","sourceRoot":"","sources":["../../../src/shared/quota/windowConstraints.ts"],"names":[],"mappings":"AAIA,mFAAmF;AACnF,EAAE;AACF,kFAAkF;AAClF,kFAAkF;AAClF,iEAAiE;AACjE,qFAAqF;AACrF,qFAAqF;AACrF,oFAAoF;AACpF,EAAE;AACF,sFAAsF;AACtF,4EAA4E;AAC5E,eAAe;AAEf;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAuB,EACvB,KAAa,EACb,MAAc,EACd,UAAkB;IAElB,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,UAAU,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,MAAM,KAAK,KAAK,EAAE,CAAC;AAC3F,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,MAAoB,EAAE,MAAc;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACpF,OAAO,IAAI,GAAG,KAAK,CAAC;AACtB,CAAC;AA6BD,MAAM,UAAU,oBAAoB,CAClC,MAAc,EACd,UAAkB,EAClB,OAAmC,EACnC,MAAc,EACd,iBAAyB,MAAM,CAAC,iBAAiB;IAEjD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO;YACL,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;YACzF,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAsB,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,SAAS;QACX,CAAC;QACD,WAAW,CAAC,IAAI,CAAC;YACf,WAAW,EAAE,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC;YAC9E,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -94,6 +94,21 @@ export interface ProviderConfirmationInput {
|
|
|
94
94
|
export interface HostModelCostEntry {
|
|
95
95
|
/** Host model id — the dispatch cost-position key. */
|
|
96
96
|
model_id: string;
|
|
97
|
+
/**
|
|
98
|
+
* The conversation host this tier belongs to — the provider half of the gate's
|
|
99
|
+
* `backendIdentity`, stamped at write time from `resolveConversationHostProvider`.
|
|
100
|
+
*
|
|
101
|
+
* RECORDED rather than re-derived at read time on purpose: a confirmation written
|
|
102
|
+
* under one host may be read under another, and re-deriving would then qualify the
|
|
103
|
+
* tier with the *reading* host — silently attributing the operator's decision to a
|
|
104
|
+
* backend they never confirmed.
|
|
105
|
+
*
|
|
106
|
+
* Optional ONLY so a confirmation written before this field existed still parses.
|
|
107
|
+
* Absent ⇒ the tier contributes no gate key at all (`confirmedBackendKeys`), which
|
|
108
|
+
* is fail-SAFE: the gate re-asks, and the answer records the provider. Falling back
|
|
109
|
+
* to the bare `model_id` instead would be the bypass this field exists to close.
|
|
110
|
+
*/
|
|
111
|
+
provider?: ResolvedProviderName;
|
|
97
112
|
/** Blended $/Mtok from models.dev, or `null` when unpriceable. Advisory. */
|
|
98
113
|
blended_price_usd_per_mtok: number | null;
|
|
99
114
|
/** Operator-confirmed 0-based cost position (rung 1 of costRank). */
|
|
@@ -114,6 +129,17 @@ export interface SourcePoolCostEntry {
|
|
|
114
129
|
source_id: string;
|
|
115
130
|
/** The source's provider transport (e.g. `openai-compatible`). */
|
|
116
131
|
provider: string;
|
|
132
|
+
/**
|
|
133
|
+
* The backend ACTUALLY SERVING the model when this source is a proxied lane
|
|
134
|
+
* (e.g. `nim` behind a `claude-worker` transport) — the provider half of the
|
|
135
|
+
* gate's `backendIdentity`, and the same field `apiPool` keys the quota ledger on.
|
|
136
|
+
*
|
|
137
|
+
* Persisted because the CONFIRMED side must be able to reproduce the identity the
|
|
138
|
+
* DELTA computes; without it a proxied lane the operator confirmed would re-delta
|
|
139
|
+
* forever, which is exactly the livelock that deferred this fix before.
|
|
140
|
+
* Absent for a direct source, where the transport IS the backend.
|
|
141
|
+
*/
|
|
142
|
+
backend_provider?: string;
|
|
117
143
|
/**
|
|
118
144
|
* The source's model id — the DISPATCH cost-position key (a proxy-sourced source's
|
|
119
145
|
* namespaced `provider/model`, or a plain source model). Absent when the source
|
|
@@ -149,7 +175,11 @@ export interface SourcePoolCostEntry {
|
|
|
149
175
|
* fields regardless of intent. Unrepresentable, not guarded.
|
|
150
176
|
*/
|
|
151
177
|
export interface PersistedPoolEntry {
|
|
152
|
-
/**
|
|
178
|
+
/**
|
|
179
|
+
* Canonical provider name. The provider half of the gate's `backendIdentity`
|
|
180
|
+
* compare key — a configured provider is its own backend, with no proxy
|
|
181
|
+
* indirection to unwrap.
|
|
182
|
+
*/
|
|
153
183
|
name: ResolvedProviderName;
|
|
154
184
|
/**
|
|
155
185
|
* The reach half, branded `never` so it is genuinely UNREPRESENTABLE here.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providerConfirmation.d.ts","sourceRoot":"","sources":["../../../src/shared/types/providerConfirmation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAM3E;;;;;;;GAOG;AACH,eAAO,MAAM,oCAAoC,EAAG,OAAgB,CAAC;AAMrE;;;;;;;GAOG;AACH,eAAO,MAAM,mCAAmC,EAC9C,gCAAyC,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,IAAI,CAAC,EAAE,cAAc,CAAC;CACvB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,yBAAyB;IACxC,sDAAsD;IACtD,cAAc,EAAE,OAAO,mCAAmC,CAAC;IAC3D;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,mEAAmE;IACnE,OAAO,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACjC;;;;OAIG;IACH,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IACjC,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,0BAA0B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,mBAAmB;IAClC,wFAAwF;IACxF,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,0BAA0B,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,uFAAuF;IACvF,cAAc,EAAE,OAAO,CAAC;IACxB,yFAAyF;IACzF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,gDAAgD;AAChD;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,kBAAkB;IACjC
|
|
1
|
+
{"version":3,"file":"providerConfirmation.d.ts","sourceRoot":"","sources":["../../../src/shared/types/providerConfirmation.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,7 +36,10 @@ Shared install files:
|
|
|
36
36
|
- `.audit-code/install/SKILL.md`
|
|
37
37
|
- `.audit-code/install/GETTING-STARTED.md`
|
|
38
38
|
- `.audit-code/install/manifest.json`
|
|
39
|
-
|
|
39
|
+
|
|
40
|
+
Separately, `.audit-tools/audit/session-config.json` is created with defaults the first time
|
|
41
|
+
`next-step`/`advance-audit` runs and no config file yet exists — this happens lazily during an
|
|
42
|
+
audit run, not during `install`/`ensure` bootstrap.
|
|
40
43
|
|
|
41
44
|
Host-specific files may include:
|
|
42
45
|
|