mcp-usage-control 1.0.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.
Files changed (47) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +141 -0
  3. package/dist/index.d.ts +533 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +2131 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/observability.d.ts +154 -0
  8. package/dist/observability.d.ts.map +1 -0
  9. package/dist/observability.js +171 -0
  10. package/dist/observability.js.map +1 -0
  11. package/dist/operational.d.ts +87 -0
  12. package/dist/operational.d.ts.map +1 -0
  13. package/dist/operational.js +193 -0
  14. package/dist/operational.js.map +1 -0
  15. package/dist/progressive-store-conformance.d.ts +4 -0
  16. package/dist/progressive-store-conformance.d.ts.map +1 -0
  17. package/dist/progressive-store-conformance.js +333 -0
  18. package/dist/progressive-store-conformance.js.map +1 -0
  19. package/dist/reconciliation-conformance.d.ts +36 -0
  20. package/dist/reconciliation-conformance.d.ts.map +1 -0
  21. package/dist/reconciliation-conformance.js +211 -0
  22. package/dist/reconciliation-conformance.js.map +1 -0
  23. package/dist/settlement-outcomes.d.ts +24 -0
  24. package/dist/settlement-outcomes.d.ts.map +1 -0
  25. package/dist/settlement-outcomes.js +68 -0
  26. package/dist/settlement-outcomes.js.map +1 -0
  27. package/dist/store-conformance.d.ts +50 -0
  28. package/dist/store-conformance.d.ts.map +1 -0
  29. package/dist/store-conformance.js +378 -0
  30. package/dist/store-conformance.js.map +1 -0
  31. package/dist/thresholds.d.ts +26 -0
  32. package/dist/thresholds.d.ts.map +1 -0
  33. package/dist/thresholds.js +56 -0
  34. package/dist/thresholds.js.map +1 -0
  35. package/dist/vector-store-conformance.d.ts +4 -0
  36. package/dist/vector-store-conformance.d.ts.map +1 -0
  37. package/dist/vector-store-conformance.js +297 -0
  38. package/dist/vector-store-conformance.js.map +1 -0
  39. package/dist/weighted-credits.d.ts +41 -0
  40. package/dist/weighted-credits.d.ts.map +1 -0
  41. package/dist/weighted-credits.js +143 -0
  42. package/dist/weighted-credits.js.map +1 -0
  43. package/dist/windowed-budget-keys.d.ts +36 -0
  44. package/dist/windowed-budget-keys.d.ts.map +1 -0
  45. package/dist/windowed-budget-keys.js +178 -0
  46. package/dist/windowed-budget-keys.js.map +1 -0
  47. package/package.json +113 -0
@@ -0,0 +1,193 @@
1
+ export const MCP_USAGE_CONTROL_PACKAGE_NAME = 'mcp-usage-control';
2
+ export const MCP_USAGE_CONTROL_VERSION = '1.0.0';
3
+ /**
4
+ * Build a bounded, static runtime descriptor suitable for health output.
5
+ * Identity is diagnostic only and must never participate in admission decisions.
6
+ */
7
+ export function createUsageRuntimeIdentity(input) {
8
+ const packageName = input.packageName ?? MCP_USAGE_CONTROL_PACKAGE_NAME;
9
+ const packageVersion = input.packageVersion ?? MCP_USAGE_CONTROL_VERSION;
10
+ validateStaticIdentifier(packageName, 'packageName', 128);
11
+ validateStaticIdentifier(packageVersion, 'packageVersion', 64);
12
+ validateProvider(input.provider);
13
+ if (input.storageSchemaVersion !== undefined) {
14
+ validateStaticIdentifier(input.storageSchemaVersion, 'storageSchemaVersion', 64);
15
+ }
16
+ const capabilities = [...new Set(input.capabilities ?? [])];
17
+ for (const capability of capabilities)
18
+ validateCapability(capability);
19
+ capabilities.sort();
20
+ return {
21
+ packageName,
22
+ packageVersion,
23
+ provider: input.provider,
24
+ capabilities,
25
+ ...(input.storageSchemaVersion === undefined
26
+ ? {}
27
+ : { storageSchemaVersion: input.storageSchemaVersion }),
28
+ };
29
+ }
30
+ /**
31
+ * Project one explicitly selected authoritative budget balance into a safe quota view.
32
+ * Callers own the budget/window identity and must select the correct scoped balance.
33
+ */
34
+ export function projectScopedQuota(limit, remaining) {
35
+ assertNonNegativeSafeInteger(limit, 'limit');
36
+ assertNonNegativeSafeInteger(remaining, 'remaining');
37
+ if (remaining > limit)
38
+ throw new RangeError('remaining cannot exceed limit');
39
+ return {
40
+ limit,
41
+ remaining,
42
+ used: limit - remaining,
43
+ exhausted: remaining === 0,
44
+ utilization: limit === 0 ? 1 : (limit - remaining) / limit,
45
+ };
46
+ }
47
+ /**
48
+ * Add a caller-selected known reset boundary to one scoped quota projection.
49
+ * The boundary is policy/UX metadata only and is never inferred from a budget key.
50
+ */
51
+ export function projectScopedQuotaWindow(limit, remaining, resetsAt) {
52
+ assertNonNegativeSafeInteger(resetsAt, 'resetsAt');
53
+ return { ...projectScopedQuota(limit, remaining), resetsAt };
54
+ }
55
+ /**
56
+ * Process-local bounded lifecycle counters derived from UsageEvent.
57
+ * This observer is deliberately non-authoritative and never infers quota truth.
58
+ */
59
+ export class UsageOperationalMonitor {
60
+ identity;
61
+ counters = emptyCounters();
62
+ lastEventAt;
63
+ constructor(identity) {
64
+ this.identity = identity === undefined ? undefined : createUsageRuntimeIdentity(identity);
65
+ }
66
+ onInvalidSettlementOutcome() {
67
+ this.counters.invalidSettlementOutcomes = increment(this.counters.invalidSettlementOutcomes);
68
+ }
69
+ onEvent(event) {
70
+ this.counters.eventsObserved = increment(this.counters.eventsObserved);
71
+ this.lastEventAt = event.timestamp;
72
+ switch (event.type) {
73
+ case 'reserve.accepted':
74
+ case 'vector.reserve.accepted':
75
+ this.counters.reserveAccepted = increment(this.counters.reserveAccepted);
76
+ this.counters.observedAttempts.reserve = increment(this.counters.observedAttempts.reserve);
77
+ return;
78
+ case 'reserve.denied':
79
+ case 'vector.reserve.denied':
80
+ this.counters.reserveDenied = increment(this.counters.reserveDenied);
81
+ this.counters.observedAttempts.reserve = increment(this.counters.observedAttempts.reserve);
82
+ return;
83
+ case 'settlement.completed':
84
+ case 'vector.settlement.completed':
85
+ this.counters.settlementsCompleted = increment(this.counters.settlementsCompleted);
86
+ this.counters.observedAttempts.settle = increment(this.counters.observedAttempts.settle);
87
+ return;
88
+ case 'reservation.recovered':
89
+ case 'vector.reservation.recovered':
90
+ if (event.recovery === 'pending_released') {
91
+ this.counters.pendingReservationsReleased = add(this.counters.pendingReservationsReleased, event.count);
92
+ }
93
+ else {
94
+ this.counters.liableReservationsRetained = add(this.counters.liableReservationsRetained, event.count);
95
+ }
96
+ return;
97
+ case 'operation.error': {
98
+ const key = errorCounterKey(event.phase);
99
+ this.counters.errors[key] = increment(this.counters.errors[key]);
100
+ if (event.phase === 'reserve') {
101
+ this.counters.observedAttempts.reserve = increment(this.counters.observedAttempts.reserve);
102
+ }
103
+ else if (event.phase === 'settle') {
104
+ this.counters.observedAttempts.settle = increment(this.counters.observedAttempts.settle);
105
+ }
106
+ return;
107
+ }
108
+ }
109
+ }
110
+ snapshot() {
111
+ return {
112
+ ...(this.identity === undefined ? {} : { identity: cloneIdentity(this.identity) }),
113
+ lifecycle: {
114
+ ...this.counters,
115
+ observedAttempts: { ...this.counters.observedAttempts },
116
+ errors: { ...this.counters.errors },
117
+ },
118
+ ...(this.lastEventAt === undefined ? {} : { lastEventAt: this.lastEventAt }),
119
+ };
120
+ }
121
+ }
122
+ function emptyCounters() {
123
+ return {
124
+ eventsObserved: 0,
125
+ reserveAccepted: 0,
126
+ reserveDenied: 0,
127
+ settlementsCompleted: 0,
128
+ pendingReservationsReleased: 0,
129
+ liableReservationsRetained: 0,
130
+ invalidSettlementOutcomes: 0,
131
+ observedAttempts: {
132
+ reserve: 0,
133
+ settle: 0,
134
+ },
135
+ errors: {
136
+ quote: 0,
137
+ reserve: 0,
138
+ markLiable: 0,
139
+ renew: 0,
140
+ settle: 0,
141
+ },
142
+ };
143
+ }
144
+ function errorCounterKey(phase) {
145
+ return phase === 'mark_liable' ? 'markLiable' : phase;
146
+ }
147
+ function increment(value) {
148
+ return add(value, 1);
149
+ }
150
+ function add(value, amount) {
151
+ if (!Number.isSafeInteger(amount) || amount < 0)
152
+ return Number.MAX_SAFE_INTEGER;
153
+ if (value >= Number.MAX_SAFE_INTEGER - amount)
154
+ return Number.MAX_SAFE_INTEGER;
155
+ return value + amount;
156
+ }
157
+ function cloneIdentity(identity) {
158
+ return {
159
+ ...identity,
160
+ capabilities: [...identity.capabilities],
161
+ };
162
+ }
163
+ function validateProvider(value) {
164
+ if (value !== 'memory' &&
165
+ value !== 'redis' &&
166
+ value !== 'firestore' &&
167
+ value !== 'cloudflare' &&
168
+ value !== 'custom') {
169
+ throw new TypeError('Unsupported usage runtime provider');
170
+ }
171
+ }
172
+ function validateCapability(value) {
173
+ if (value !== 'progressive' &&
174
+ value !== 'vector' &&
175
+ value !== 'reconciliation' &&
176
+ value !== 'mcp_multi_round') {
177
+ throw new TypeError('Unsupported usage runtime capability');
178
+ }
179
+ }
180
+ function validateStaticIdentifier(value, name, maxLength) {
181
+ if (typeof value !== 'string' ||
182
+ value.length === 0 ||
183
+ value.length > maxLength ||
184
+ !/^[A-Za-z0-9@/._+-]+$/.test(value)) {
185
+ throw new TypeError(`${name} must be a bounded static identifier`);
186
+ }
187
+ }
188
+ function assertNonNegativeSafeInteger(value, name) {
189
+ if (!Number.isSafeInteger(value) || value < 0) {
190
+ throw new RangeError(`${name} must be a non-negative safe integer`);
191
+ }
192
+ }
193
+ //# sourceMappingURL=operational.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operational.js","sourceRoot":"","sources":["../src/operational.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { UsageStoreConformanceHarness, UsageStoreConformanceReport } from './store-conformance.js';
2
+ /** Portable proof suite for the optional progressive reservation growth capability. */
3
+ export declare function runProgressiveUsageStoreConformance(harness: UsageStoreConformanceHarness): Promise<UsageStoreConformanceReport>;
4
+ //# sourceMappingURL=progressive-store-conformance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progressive-store-conformance.d.ts","sourceRoot":"","sources":["../src/progressive-store-conformance.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAEV,4BAA4B,EAC5B,2BAA2B,EAC5B,MAAM,wBAAwB,CAAC;AAEhC,uFAAuF;AACvF,wBAAsB,mCAAmC,CACvD,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,2BAA2B,CAAC,CAsTtC"}
@@ -0,0 +1,333 @@
1
+ /** Portable proof suite for the optional progressive reservation growth capability. */
2
+ export async function runProgressiveUsageStoreConformance(harness) {
3
+ const ttlMs = harness.leaseTtlMs ?? 40;
4
+ assertPositiveInteger(ttlMs, 'leaseTtlMs');
5
+ const cases = [];
6
+ await runCase(harness, cases, 'growth-success-replay-conflict', async (store) => {
7
+ const admission = await reserveGrowable(store, 'growth-success', 1, [
8
+ { key: 'growth:success', limit: 4 },
9
+ ]);
10
+ const cursor = growthCursor(admission);
11
+ const firstInput = {
12
+ reservationId: admission.reservation.id,
13
+ incrementId: 'inc-1',
14
+ expectedGrowthCursor: cursor,
15
+ additionalUnits: 1,
16
+ budgets: [{ key: 'growth:success', limit: 4 }],
17
+ };
18
+ const first = await store.growReservation(firstInput);
19
+ assertAcceptedGrowth(first, 'first growth');
20
+ assert(first.reservedUnits === 2, 'first growth total mismatch');
21
+ const replay = await store.growReservation(firstInput);
22
+ assertAcceptedGrowth(replay, 'growth replay');
23
+ assert(replay.replayed, 'duplicate increment must replay');
24
+ assert(replay.reservedUnits === 2, 'duplicate increment reserved twice');
25
+ await assertRejects(() => store.growReservation({ ...firstInput, additionalUnits: 2 }), 'same incrementId with conflicting parameters must fail');
26
+ const second = await store.growReservation({
27
+ reservationId: admission.reservation.id,
28
+ incrementId: 'inc-2',
29
+ expectedGrowthCursor: first.growthCursor,
30
+ additionalUnits: 2,
31
+ budgets: [{ key: 'growth:success', limit: 4 }],
32
+ });
33
+ assertAcceptedGrowth(second, 'second growth');
34
+ assert(second.reservedUnits === 4, 'sequential growth total mismatch');
35
+ });
36
+ await runCase(harness, cases, 'growth-concurrency', async (store) => {
37
+ const same = await reserveGrowable(store, 'growth-concurrent-same', 1, [
38
+ { key: 'growth:concurrent-same', limit: 2 },
39
+ ]);
40
+ const sameInput = {
41
+ reservationId: same.reservation.id,
42
+ incrementId: 'same-inc',
43
+ expectedGrowthCursor: growthCursor(same),
44
+ additionalUnits: 1,
45
+ budgets: [{ key: 'growth:concurrent-same', limit: 2 }],
46
+ };
47
+ const sameResults = await Promise.all([
48
+ store.growReservation(sameInput),
49
+ store.growReservation(sameInput),
50
+ ]);
51
+ sameResults.forEach(result => assertAcceptedGrowth(result, 'concurrent same increment'));
52
+ assert(sameResults.filter(result => result.replayed).length === 1, 'same increment committed more than once');
53
+ const distinct = await reserveGrowable(store, 'growth-concurrent-distinct', 1, [
54
+ { key: 'growth:concurrent-distinct', limit: 3 },
55
+ ]);
56
+ const cursor = growthCursor(distinct);
57
+ const distinctResults = await Promise.allSettled([
58
+ store.growReservation({
59
+ reservationId: distinct.reservation.id,
60
+ incrementId: 'inc-a',
61
+ expectedGrowthCursor: cursor,
62
+ additionalUnits: 1,
63
+ budgets: [{ key: 'growth:concurrent-distinct', limit: 3 }],
64
+ }),
65
+ store.growReservation({
66
+ reservationId: distinct.reservation.id,
67
+ incrementId: 'inc-b',
68
+ expectedGrowthCursor: cursor,
69
+ additionalUnits: 1,
70
+ budgets: [{ key: 'growth:concurrent-distinct', limit: 3 }],
71
+ }),
72
+ ]);
73
+ assert(distinctResults.filter(result => result.status === 'fulfilled').length === 1, 'one distinct increment must win');
74
+ assert(distinctResults.filter(result => result.status === 'rejected').length === 1, 'stale distinct increment must fail closed');
75
+ });
76
+ await runCase(harness, cases, 'growth-denial-cursor-and-atomic-budgets', async (store) => {
77
+ const admission = await reserveGrowable(store, 'growth-atomic', 1, [
78
+ { key: 'growth:atomic-free', limit: 3 },
79
+ { key: 'growth:atomic-blocked', limit: 2 },
80
+ ]);
81
+ const blocker = await store.reserve({
82
+ request: request('growth-blocker', 'blocker'),
83
+ units: 1,
84
+ budgets: [{ key: 'growth:atomic-blocked', limit: 2 }],
85
+ ttlMs: 5_000,
86
+ });
87
+ assertReserveAccepted(blocker, 'blocking reservation');
88
+ const cursor = growthCursor(admission);
89
+ const deniedInput = {
90
+ reservationId: admission.reservation.id,
91
+ incrementId: 'denied-inc',
92
+ expectedGrowthCursor: cursor,
93
+ additionalUnits: 1,
94
+ budgets: [
95
+ { key: 'growth:atomic-free', limit: 3 },
96
+ { key: 'growth:atomic-blocked', limit: 2 },
97
+ ],
98
+ };
99
+ const denied = await store.growReservation(deniedInput);
100
+ assertDeniedGrowth(denied, 'growth denial');
101
+ assert(denied.growthCursor !== cursor, 'authoritative denial must rotate cursor');
102
+ const replay = await store.growReservation(deniedInput);
103
+ assertDeniedGrowth(replay, 'growth denial replay');
104
+ assert(replay.replayed, 'denied growth retry must replay');
105
+ await assertRejects(() => store.growReservation({
106
+ ...deniedInput,
107
+ incrementId: 'new-id-on-stale-cursor',
108
+ }), 'different increment on stale cursor must fail closed');
109
+ const freeProbe = await store.reserve({
110
+ request: request('growth-free-probe'),
111
+ units: 2,
112
+ budgets: [{ key: 'growth:atomic-free', limit: 3 }],
113
+ ttlMs: 5_000,
114
+ });
115
+ assertReserveAccepted(freeProbe, 'denied multi-budget growth must not partially reserve');
116
+ });
117
+ await runCase(harness, cases, 'growth-pending-and-liable-expiry', async (store) => {
118
+ const pending = await reserveGrowable(store, 'growth-pending-expiry', 1, [{ key: 'growth:pending-expiry', limit: 3 }], ttlMs);
119
+ const pendingGrowth = await store.growReservation({
120
+ reservationId: pending.reservation.id,
121
+ incrementId: 'pending-inc',
122
+ expectedGrowthCursor: growthCursor(pending),
123
+ additionalUnits: 2,
124
+ budgets: [{ key: 'growth:pending-expiry', limit: 3 }],
125
+ });
126
+ assertAcceptedGrowth(pendingGrowth, 'pending growth');
127
+ const pendingCursor = pendingGrowth.growthCursor;
128
+ await harness.waitForLeaseExpiry(ttlMs, 'growth-pending-and-liable-expiry');
129
+ await assertRejects(() => store.growReservation({
130
+ reservationId: pending.reservation.id,
131
+ incrementId: 'pending-inc',
132
+ expectedGrowthCursor: growthCursor(pending),
133
+ additionalUnits: 2,
134
+ budgets: [{ key: 'growth:pending-expiry', limit: 3 }],
135
+ }), 'growth replay after expiry must fail closed');
136
+ assert(typeof pendingCursor === 'string' && pendingCursor.length > 0, 'growth cursor missing');
137
+ const pendingReplacement = await store.reserve({
138
+ request: request('growth-pending-replacement'),
139
+ units: 3,
140
+ budgets: [{ key: 'growth:pending-expiry', limit: 3 }],
141
+ ttlMs: 5_000,
142
+ });
143
+ assertReserveAccepted(pendingReplacement, 'pending grown total must be released');
144
+ const liable = await reserveGrowable(store, 'growth-liable-expiry', 1, [{ key: 'growth:liable-expiry', limit: 2 }], ttlMs);
145
+ await store.markLiable({ reservationId: liable.reservation.id });
146
+ const liableGrowth = await store.growReservation({
147
+ reservationId: liable.reservation.id,
148
+ incrementId: 'liable-inc',
149
+ expectedGrowthCursor: growthCursor(liable),
150
+ additionalUnits: 1,
151
+ budgets: [{ key: 'growth:liable-expiry', limit: 2 }],
152
+ });
153
+ assertAcceptedGrowth(liableGrowth, 'liable growth');
154
+ await harness.waitForLeaseExpiry(ttlMs, 'growth-pending-and-liable-expiry');
155
+ const liableReplacement = await store.reserve({
156
+ request: request('growth-liable-replacement'),
157
+ units: 1,
158
+ budgets: [{ key: 'growth:liable-expiry', limit: 2 }],
159
+ ttlMs: 5_000,
160
+ });
161
+ assertReserveDenied(liableReplacement, 'quota_exceeded', 'liable grown total must be retained');
162
+ });
163
+ await runCase(harness, cases, 'growth-vs-reserve-race', async (store) => {
164
+ const admission = await reserveGrowable(store, 'growth-vs-reserve', 1, [
165
+ { key: 'growth:vs-reserve', limit: 2 },
166
+ ]);
167
+ const [growth, competingReserve] = await Promise.all([
168
+ store.growReservation({
169
+ reservationId: admission.reservation.id,
170
+ incrementId: 'growth-vs-reserve-inc',
171
+ expectedGrowthCursor: growthCursor(admission),
172
+ additionalUnits: 1,
173
+ budgets: [{ key: 'growth:vs-reserve', limit: 2 }],
174
+ }),
175
+ store.reserve({
176
+ request: request('growth-vs-reserve-competitor', 'user-2'),
177
+ units: 1,
178
+ budgets: [{ key: 'growth:vs-reserve', limit: 2 }],
179
+ ttlMs: 5_000,
180
+ }),
181
+ ]);
182
+ const admittedCount = Number(growth.accepted) + Number(competingReserve.accepted);
183
+ assert(admittedCount === 1, 'reserve/growth race oversubscribed or denied both contenders');
184
+ });
185
+ await runCase(harness, cases, 'growth-vs-expiry-recovery-race', async (store) => {
186
+ const admission = await reserveGrowable(store, 'growth-vs-recovery', 1, [{ key: 'growth:vs-recovery', limit: 1 }], ttlMs);
187
+ const cursor = growthCursor(admission);
188
+ await harness.waitForLeaseExpiry(ttlMs, 'growth-vs-expiry-recovery-race');
189
+ const [growth, replacement] = await Promise.allSettled([
190
+ store.growReservation({
191
+ reservationId: admission.reservation.id,
192
+ incrementId: 'expired-growth',
193
+ expectedGrowthCursor: cursor,
194
+ additionalUnits: 1,
195
+ budgets: [{ key: 'growth:vs-recovery', limit: 2 }],
196
+ }),
197
+ store.reserve({
198
+ request: request('growth-vs-recovery-replacement', 'user-2'),
199
+ units: 1,
200
+ budgets: [{ key: 'growth:vs-recovery', limit: 1 }],
201
+ ttlMs: 5_000,
202
+ }),
203
+ ]);
204
+ assert(growth.status === 'rejected', 'expired growth must fail closed during recovery race');
205
+ assert(replacement.status === 'fulfilled', 'replacement reserve must complete after pending expiry');
206
+ if (replacement.status === 'fulfilled') {
207
+ assertReserveAccepted(replacement.value, 'replacement after expiry/recovery race');
208
+ }
209
+ });
210
+ await runCase(harness, cases, 'growth-settlement-bound-and-terminal-state', async (store) => {
211
+ const admission = await reserveGrowable(store, 'growth-settlement', 1, [
212
+ { key: 'growth:settlement', limit: 3 },
213
+ ]);
214
+ const grown = await store.growReservation({
215
+ reservationId: admission.reservation.id,
216
+ incrementId: 'settlement-inc',
217
+ expectedGrowthCursor: growthCursor(admission),
218
+ additionalUnits: 2,
219
+ budgets: [{ key: 'growth:settlement', limit: 3 }],
220
+ });
221
+ assertAcceptedGrowth(grown, 'settlement growth');
222
+ await assertRejects(() => store.settle({ reservationId: admission.reservation.id, actualUnits: 4, outcome: 'invalid' }), 'settlement above grown total must fail');
223
+ const settled = await store.settle({
224
+ reservationId: admission.reservation.id,
225
+ actualUnits: 3,
226
+ outcome: 'exact',
227
+ });
228
+ assert(settled.reservedUnits === 3 && settled.actualUnits === 3, 'exact grown settlement failed');
229
+ await assertRejects(() => store.growReservation({
230
+ reservationId: admission.reservation.id,
231
+ incrementId: 'after-settle',
232
+ expectedGrowthCursor: grown.growthCursor,
233
+ additionalUnits: 1,
234
+ budgets: [{ key: 'growth:settlement', limit: 4 }],
235
+ }), 'new growth after settlement must fail');
236
+ });
237
+ await runCase(harness, cases, 'growth-vs-settle-race', async (store) => {
238
+ const admission = await reserveGrowable(store, 'growth-settle-race', 1, [
239
+ { key: 'growth:settle-race', limit: 2 },
240
+ ]);
241
+ const results = await Promise.allSettled([
242
+ store.growReservation({
243
+ reservationId: admission.reservation.id,
244
+ incrementId: 'race-inc',
245
+ expectedGrowthCursor: growthCursor(admission),
246
+ additionalUnits: 1,
247
+ budgets: [{ key: 'growth:settle-race', limit: 2 }],
248
+ }),
249
+ store.settle({ reservationId: admission.reservation.id, actualUnits: 1, outcome: 'race' }),
250
+ ]);
251
+ assert(results[1].status === 'fulfilled', 'settlement side of race must complete');
252
+ if (results[0].status === 'fulfilled' && results[1].status === 'fulfilled') {
253
+ assertAcceptedGrowth(results[0].value, 'growth side of race');
254
+ assert(results[1].value.reservedUnits === 2, 'settlement did not observe prior growth commit');
255
+ }
256
+ });
257
+ return { passed: cases.every(result => result.passed), cases };
258
+ }
259
+ async function runCase(harness, cases, name, body) {
260
+ try {
261
+ const store = await harness.createStore(name);
262
+ if (!isProgressiveStore(store))
263
+ throw new Error('Store does not support progressive reservation growth');
264
+ await body(store);
265
+ cases.push({ name, passed: true });
266
+ }
267
+ catch (error) {
268
+ cases.push({ name, passed: false, error: errorMessage(error) });
269
+ }
270
+ finally {
271
+ try {
272
+ await harness.cleanup?.(name);
273
+ }
274
+ catch (error) {
275
+ cases.push({ name: `${name}:cleanup`, passed: false, error: errorMessage(error) });
276
+ }
277
+ }
278
+ }
279
+ function isProgressiveStore(store) {
280
+ return typeof store.growReservation === 'function';
281
+ }
282
+ async function reserveGrowable(store, operationId, units, budgets, ttlMs = 5_000) {
283
+ const result = await store.reserve({ request: request(operationId), units, budgets, ttlMs });
284
+ assertReserveAccepted(result, `${operationId} reservation`);
285
+ growthCursor(result);
286
+ return result;
287
+ }
288
+ function growthCursor(result) {
289
+ const cursor = result.reservation.growthCursor;
290
+ assert(typeof cursor === 'string' && cursor.length > 0, 'growable reservation missing growthCursor');
291
+ return cursor;
292
+ }
293
+ function request(operationId, principalId = 'user-1') {
294
+ return {
295
+ operationId,
296
+ principal: { id: principalId, tenantId: 'tenant-1' },
297
+ tool: 'growth-conformance',
298
+ args: { conformance: true },
299
+ };
300
+ }
301
+ function assertReserveAccepted(result, context) {
302
+ assert(result.accepted, `${context}: expected accepted reservation`);
303
+ }
304
+ function assertReserveDenied(result, reason, context) {
305
+ assert(!result.accepted && result.reason === reason, `${context}: expected ${reason}`);
306
+ }
307
+ function assertAcceptedGrowth(result, context) {
308
+ assert(result.accepted, `${context}: expected accepted growth`);
309
+ }
310
+ function assertDeniedGrowth(result, context) {
311
+ assert(!result.accepted && result.reason === 'quota_exceeded', `${context}: expected quota denial`);
312
+ }
313
+ async function assertRejects(action, message) {
314
+ try {
315
+ await action();
316
+ }
317
+ catch {
318
+ return;
319
+ }
320
+ throw new Error(message);
321
+ }
322
+ function assert(condition, message) {
323
+ if (!condition)
324
+ throw new Error(message);
325
+ }
326
+ function assertPositiveInteger(value, name) {
327
+ if (!Number.isSafeInteger(value) || value <= 0)
328
+ throw new RangeError(`${name} must be positive`);
329
+ }
330
+ function errorMessage(error) {
331
+ return error instanceof Error ? `${error.name}: ${error.message}` : String(error);
332
+ }
333
+ //# sourceMappingURL=progressive-store-conformance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progressive-store-conformance.js","sourceRoot":"","sources":["../src/progressive-store-conformance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { OperationReconciliationStore, VectorOperationReconciliationStore } from './index.js';
2
+ type MaybePromise<T> = T | Promise<T>;
3
+ export interface OperationReconciliationConformanceHarness {
4
+ createStore(scenario: string): MaybePromise<OperationReconciliationStore>;
5
+ waitForLeaseExpiry(ttlMs: number, scenario: string): MaybePromise<void>;
6
+ cleanup?(scenario: string): MaybePromise<void>;
7
+ leaseTtlMs?: number;
8
+ }
9
+ export interface OperationReconciliationConformanceCaseResult {
10
+ name: string;
11
+ passed: boolean;
12
+ error?: string;
13
+ }
14
+ export interface OperationReconciliationConformanceReport {
15
+ passed: boolean;
16
+ cases: OperationReconciliationConformanceCaseResult[];
17
+ }
18
+ export declare class OperationReconciliationConformanceError extends Error {
19
+ readonly report: OperationReconciliationConformanceReport;
20
+ constructor(report: OperationReconciliationConformanceReport);
21
+ }
22
+ /** Portable scalar-only read-only reconciliation contract for optional Store implementations. */
23
+ export declare function runOperationReconciliationStoreConformance(harness: OperationReconciliationConformanceHarness): Promise<OperationReconciliationConformanceReport>;
24
+ export interface VectorOperationReconciliationConformanceHarness {
25
+ createStore(scenario: string): MaybePromise<VectorOperationReconciliationStore>;
26
+ waitForLeaseExpiry(ttlMs: number, scenario: string): MaybePromise<void>;
27
+ cleanup?(scenario: string): MaybePromise<void>;
28
+ leaseTtlMs?: number;
29
+ }
30
+ export type VectorOperationReconciliationConformanceReport = OperationReconciliationConformanceReport;
31
+ /** Portable read-only initial-vector-reserve reconciliation contract. */
32
+ export declare function runVectorOperationReconciliationStoreConformance(harness: VectorOperationReconciliationConformanceHarness): Promise<VectorOperationReconciliationConformanceReport>;
33
+ export declare function assertVectorOperationReconciliationStoreConformance(harness: VectorOperationReconciliationConformanceHarness): Promise<void>;
34
+ export declare function assertOperationReconciliationStoreConformance(harness: OperationReconciliationConformanceHarness): Promise<void>;
35
+ export {};
36
+ //# sourceMappingURL=reconciliation-conformance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconciliation-conformance.d.ts","sourceRoot":"","sources":["../src/reconciliation-conformance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,4BAA4B,EAM5B,kCAAkC,EAEnC,MAAM,YAAY,CAAC;AAEpB,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEtC,MAAM,WAAW,yCAAyC;IACxD,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAAC,4BAA4B,CAAC,CAAC;IAC1E,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACxE,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,4CAA4C;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wCAAwC;IACvD,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,4CAA4C,EAAE,CAAC;CACvD;AAED,qBAAa,uCAAwC,SAAQ,KAAK;aACpC,MAAM,EAAE,wCAAwC;gBAAhD,MAAM,EAAE,wCAAwC;CAS7E;AAED,iGAAiG;AACjG,wBAAsB,0CAA0C,CAC9D,OAAO,EAAE,yCAAyC,GACjD,OAAO,CAAC,wCAAwC,CAAC,CAiEnD;AAGD,MAAM,WAAW,+CAA+C;IAC9D,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAAC,kCAAkC,CAAC,CAAC;IAChF,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACxE,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,8CAA8C,GAAG,wCAAwC,CAAC;AAEtG,yEAAyE;AACzE,wBAAsB,gDAAgD,CACpE,OAAO,EAAE,+CAA+C,GACvD,OAAO,CAAC,8CAA8C,CAAC,CAsDzD;AAED,wBAAsB,mDAAmD,CACvE,OAAO,EAAE,+CAA+C,GACvD,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,wBAAsB,6CAA6C,CACjE,OAAO,EAAE,yCAAyC,GACjD,OAAO,CAAC,IAAI,CAAC,CAGf"}