audit-tools 0.32.28 → 0.32.30

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 (103) hide show
  1. package/dist/audit/cli/args.d.ts +10 -1
  2. package/dist/audit/cli/args.d.ts.map +1 -1
  3. package/dist/audit/cli/args.js +18 -1
  4. package/dist/audit/cli/args.js.map +1 -1
  5. package/dist/audit/cli/dispatch/quotaPool.d.ts.map +1 -1
  6. package/dist/audit/cli/dispatch/quotaPool.js +3 -6
  7. package/dist/audit/cli/dispatch/quotaPool.js.map +1 -1
  8. package/dist/audit/cli/hybridDispatch.d.ts.map +1 -1
  9. package/dist/audit/cli/hybridDispatch.js +3 -12
  10. package/dist/audit/cli/hybridDispatch.js.map +1 -1
  11. package/dist/audit/cli/nextStepCommand.d.ts.map +1 -1
  12. package/dist/audit/cli/nextStepCommand.js +9 -2
  13. package/dist/audit/cli/nextStepCommand.js.map +1 -1
  14. package/dist/audit/cli/nextStepHelpers.d.ts.map +1 -1
  15. package/dist/audit/cli/nextStepHelpers.js +8 -2
  16. package/dist/audit/cli/nextStepHelpers.js.map +1 -1
  17. package/dist/audit/cli/quotaCommand.d.ts.map +1 -1
  18. package/dist/audit/cli/quotaCommand.js +7 -8
  19. package/dist/audit/cli/quotaCommand.js.map +1 -1
  20. package/dist/audit/cli/rollingAuditDispatch.d.ts +6 -0
  21. package/dist/audit/cli/rollingAuditDispatch.d.ts.map +1 -1
  22. package/dist/audit/cli/rollingAuditDispatch.js +10 -3
  23. package/dist/audit/cli/rollingAuditDispatch.js.map +1 -1
  24. package/dist/audit/quota/index.d.ts +10 -15
  25. package/dist/audit/quota/index.d.ts.map +1 -1
  26. package/dist/audit/quota/index.js +1 -1
  27. package/dist/audit/quota/index.js.map +1 -1
  28. package/dist/audit/supervisor/sessionConfig.d.ts +9 -1
  29. package/dist/audit/supervisor/sessionConfig.d.ts.map +1 -1
  30. package/dist/audit/supervisor/sessionConfig.js +28 -0
  31. package/dist/audit/supervisor/sessionConfig.js.map +1 -1
  32. package/dist/audit/validation/sessionConfig.d.ts.map +1 -1
  33. package/dist/audit/validation/sessionConfig.js +9 -0
  34. package/dist/audit/validation/sessionConfig.js.map +1 -1
  35. package/dist/remediate/index.d.ts.map +1 -1
  36. package/dist/remediate/index.js +14 -1
  37. package/dist/remediate/index.js.map +1 -1
  38. package/dist/remediate/quota/index.d.ts +2 -2
  39. package/dist/remediate/quota/index.d.ts.map +1 -1
  40. package/dist/remediate/quota/index.js +1 -1
  41. package/dist/remediate/quota/index.js.map +1 -1
  42. package/dist/remediate/steps/dispatch/waveScheduling.d.ts.map +1 -1
  43. package/dist/remediate/steps/dispatch/waveScheduling.js +9 -17
  44. package/dist/remediate/steps/dispatch/waveScheduling.js.map +1 -1
  45. package/dist/remediate/steps/nextStep.d.ts +7 -1
  46. package/dist/remediate/steps/nextStep.d.ts.map +1 -1
  47. package/dist/remediate/steps/nextStep.js +20 -6
  48. package/dist/remediate/steps/nextStep.js.map +1 -1
  49. package/dist/shared/dispatch/rollingDispatch.d.ts +0 -5
  50. package/dist/shared/dispatch/rollingDispatch.d.ts.map +1 -1
  51. package/dist/shared/dispatch/rollingDispatch.js +25 -19
  52. package/dist/shared/dispatch/rollingDispatch.js.map +1 -1
  53. package/dist/shared/index.d.ts +6 -6
  54. package/dist/shared/index.d.ts.map +1 -1
  55. package/dist/shared/index.js +5 -5
  56. package/dist/shared/index.js.map +1 -1
  57. package/dist/shared/providers/providerPathGuard.d.ts +52 -1
  58. package/dist/shared/providers/providerPathGuard.d.ts.map +1 -1
  59. package/dist/shared/providers/providerPathGuard.js +62 -0
  60. package/dist/shared/providers/providerPathGuard.js.map +1 -1
  61. package/dist/shared/quota/apiPool.d.ts +22 -0
  62. package/dist/shared/quota/apiPool.d.ts.map +1 -1
  63. package/dist/shared/quota/apiPool.js +30 -0
  64. package/dist/shared/quota/apiPool.js.map +1 -1
  65. package/dist/shared/quota/capacity.d.ts +6 -6
  66. package/dist/shared/quota/capacity.d.ts.map +1 -1
  67. package/dist/shared/quota/capacity.js +3 -4
  68. package/dist/shared/quota/capacity.js.map +1 -1
  69. package/dist/shared/quota/claimRegistry.d.ts.map +1 -1
  70. package/dist/shared/quota/claimRegistry.js +8 -4
  71. package/dist/shared/quota/claimRegistry.js.map +1 -1
  72. package/dist/shared/quota/compositeQuotaSource.d.ts +0 -1
  73. package/dist/shared/quota/compositeQuotaSource.d.ts.map +1 -1
  74. package/dist/shared/quota/compositeQuotaSource.js +1 -1
  75. package/dist/shared/quota/compositeQuotaSource.js.map +1 -1
  76. package/dist/shared/quota/learnedQuotaSource.d.ts +9 -3
  77. package/dist/shared/quota/learnedQuotaSource.d.ts.map +1 -1
  78. package/dist/shared/quota/learnedQuotaSource.js +18 -9
  79. package/dist/shared/quota/learnedQuotaSource.js.map +1 -1
  80. package/dist/shared/quota/reservationLedger.d.ts.map +1 -1
  81. package/dist/shared/quota/reservationLedger.js +10 -3
  82. package/dist/shared/quota/reservationLedger.js.map +1 -1
  83. package/dist/shared/quota/scheduler.d.ts +0 -2
  84. package/dist/shared/quota/scheduler.d.ts.map +1 -1
  85. package/dist/shared/quota/scheduler.js +9 -27
  86. package/dist/shared/quota/scheduler.js.map +1 -1
  87. package/dist/shared/quota/state.d.ts +88 -19
  88. package/dist/shared/quota/state.d.ts.map +1 -1
  89. package/dist/shared/quota/state.js +182 -135
  90. package/dist/shared/quota/state.js.map +1 -1
  91. package/dist/shared/quota/types.d.ts +10 -15
  92. package/dist/shared/quota/types.d.ts.map +1 -1
  93. package/dist/shared/quota/types.js +0 -2
  94. package/dist/shared/quota/types.js.map +1 -1
  95. package/dist/shared/repair/brokeredDispatch.d.ts +9 -6
  96. package/dist/shared/repair/brokeredDispatch.d.ts.map +1 -1
  97. package/dist/shared/repair/brokeredDispatch.js +12 -20
  98. package/dist/shared/repair/brokeredDispatch.js.map +1 -1
  99. package/dist/shared/types/sessionConfig.d.ts +13 -12
  100. package/dist/shared/types/sessionConfig.d.ts.map +1 -1
  101. package/dist/shared/types/sessionConfig.js +0 -13
  102. package/dist/shared/types/sessionConfig.js.map +1 -1
  103. package/package.json +1 -1
@@ -1,19 +1,9 @@
1
- import { mkdir, readFile, writeFile } from "node:fs/promises";
1
+ import { readFile, rename } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import { withFileLock } from "./fileLock.js";
4
- const MIN_EVIDENCE_WEIGHT = 0.5;
5
- // A failure at concurrency N is evidence against N and the few levels above it
6
- // (a failure at 5 makes 6, 7, 8, 9 suspect too), so failure weight spreads over
7
- // this many buckets past the observed concurrency.
8
- const FAILURE_SPREAD_BUCKETS = 4;
9
- // computeMaxSafeConcurrency (and computeRampUpConcurrency) scans up to this many
10
- // levels. Bucket writes are capped at this ceiling so quota-state.json does not
11
- // grow indefinitely with entries that will never be read back.
12
- export const MAX_BUCKET_LEVEL = 32;
13
- let _stateDir;
4
+ import { writeJsonFile } from "../io/json.js";
14
5
  let _statePath;
15
6
  export function setQuotaStateDir(dir) {
16
- _stateDir = dir;
17
7
  _statePath = join(dir, "quota-state.json");
18
8
  }
19
9
  export function getQuotaStatePath() {
@@ -21,24 +11,6 @@ export function getQuotaStatePath() {
21
11
  throw new Error("Quota state dir not set — call setQuotaStateDir() first.");
22
12
  return _statePath;
23
13
  }
24
- export function decayWeight(weight, elapsedHours, halfLifeHours) {
25
- if (halfLifeHours <= 0 || weight <= 0)
26
- return 0;
27
- return weight * Math.pow(0.5, elapsedHours / halfLifeHours);
28
- }
29
- export function applyDecayToEntry(entry, halfLifeHours) {
30
- const elapsedHours = (Date.now() - new Date(entry.updated_at).getTime()) / (1000 * 60 * 60);
31
- if (elapsedHours < 0.001)
32
- return entry;
33
- const decayed = {};
34
- for (const [key, bucket] of Object.entries(entry.buckets)) {
35
- decayed[key] = {
36
- success_weight: decayWeight(bucket.success_weight, elapsedHours, halfLifeHours),
37
- failure_weight: decayWeight(bucket.failure_weight, elapsedHours, halfLifeHours),
38
- };
39
- }
40
- return { ...entry, buckets: decayed };
41
- }
42
14
  function isQuotaState(value) {
43
15
  if (value === null || typeof value !== "object" || Array.isArray(value))
44
16
  return false;
@@ -46,65 +18,170 @@ function isQuotaState(value) {
46
18
  const version = obj["version"];
47
19
  return (version === 1 || version === 2) && typeof obj["entries"] === "object";
48
20
  }
21
+ /**
22
+ * The cold-start quota state. This is the ONLY value that legitimately means
23
+ * "nothing learned yet" — it must never be manufactured from a read failure.
24
+ * An empty state carries no `cooldown_until`, no learned limits, and no
25
+ * concurrency evidence, so silently substituting it for an unreadable file
26
+ * degrades the engine in the **fail-open** direction (unbounded dispatch).
27
+ */
28
+ export function emptyQuotaState() {
29
+ return { version: 2, entries: {} };
30
+ }
31
+ /**
32
+ * The quota state file exists but could not be read or is not a valid
33
+ * {@link QuotaState}. Distinct from "absent" (cold start → {@link emptyQuotaState}).
34
+ *
35
+ * Thrown rather than degraded-to-empty for two reasons: a reader that swallows
36
+ * it dispatches with no throttle at all, and a read-modify-write path that
37
+ * swallows it overwrites the file with an empty state, destroying every learned
38
+ * limit and live cooldown. Callers that genuinely want a degrade must opt in
39
+ * explicitly and say so (see `learnedQuotaSource.probeUsage`, which reports
40
+ * `degraded`, and the read-only reporting commands).
41
+ */
42
+ export class QuotaStateUnavailableError extends Error {
43
+ statePath;
44
+ kind;
45
+ reason;
46
+ constructor(statePath,
47
+ /**
48
+ * `corrupt` — the bytes are there but are not a valid QuotaState. Terminal
49
+ * for that file: re-reading will fail identically, so a write-path may
50
+ * quarantine it (see {@link readQuotaStateForUpdate}).
51
+ * `unreadable` — the file could not be opened (EACCES, EBUSY, EIO). Possibly
52
+ * transient, and the content may be perfectly good — NEVER destroy it.
53
+ */
54
+ kind, reason) {
55
+ super(`Quota state at ${statePath} is unusable (${kind}): ${reason}`);
56
+ this.statePath = statePath;
57
+ this.kind = kind;
58
+ this.reason = reason;
59
+ this.name = "QuotaStateUnavailableError";
60
+ }
61
+ }
49
62
  export async function readQuotaState() {
50
63
  const statePath = getQuotaStatePath();
64
+ let raw;
51
65
  try {
52
- const raw = await readFile(statePath, "utf8");
53
- const parsed = JSON.parse(raw);
54
- if (isQuotaState(parsed)) {
55
- if (parsed.version === 1) {
56
- for (const entry of Object.values(parsed.entries)) {
57
- entry.consecutive_429_count ??= 0;
58
- }
59
- }
60
- return parsed;
61
- }
62
- process.stderr.write(`[quota] ignoring invalid quota state at ${statePath}: expected { version: 1|2, entries: object }\n`);
66
+ raw = await readFile(statePath, "utf8");
63
67
  }
64
68
  catch (error) {
65
69
  if (error.code === "ENOENT") {
66
- return { version: 2, entries: {} };
70
+ return emptyQuotaState();
67
71
  }
68
- process.stderr.write(`[quota] ignoring unreadable quota state at ${statePath}: ${error instanceof Error ? error.message : String(error)}\n`);
72
+ throw new QuotaStateUnavailableError(statePath, "unreadable", error instanceof Error ? error.message : String(error));
69
73
  }
70
- return { version: 2, entries: {} };
74
+ let parsed;
75
+ try {
76
+ parsed = JSON.parse(raw);
77
+ }
78
+ catch (error) {
79
+ throw new QuotaStateUnavailableError(statePath, "corrupt", `not valid JSON (${error instanceof Error ? error.message : String(error)})`);
80
+ }
81
+ if (!isQuotaState(parsed)) {
82
+ throw new QuotaStateUnavailableError(statePath, "corrupt", "expected { version: 1|2, entries: object }");
83
+ }
84
+ if (parsed.version === 1) {
85
+ for (const entry of Object.values(parsed.entries)) {
86
+ entry.consecutive_429_count ??= 0;
87
+ }
88
+ }
89
+ return parsed;
71
90
  }
72
- export async function writeQuotaState(state) {
73
- const stateDir = _stateDir;
74
- if (!stateDir)
75
- throw new Error("Quota state dir not set call setQuotaStateDir() first.");
76
- await mkdir(stateDir, { recursive: true });
77
- const normalized = { ...state, version: 2 };
78
- await writeFile(getQuotaStatePath(), JSON.stringify(normalized, null, 2) + "\n", "utf8");
91
+ /**
92
+ * The ONE opt-in degrade for {@link readQuotaState}: return the cold-start state
93
+ * when the file is unusable, after saying so on stderr. Use only where losing
94
+ * every cooldown and learned limit is survivable (pool construction, read-only
95
+ * reporting) never on a path that would then WRITE the degraded state back.
96
+ * The degrade is loud by construction so a corrupt file cannot look like a cold
97
+ * start.
98
+ */
99
+ export async function readQuotaStateOrDegrade(context) {
100
+ try {
101
+ return await readQuotaState();
102
+ }
103
+ catch (error) {
104
+ process.stderr.write(`[quota] ${context}: ${error instanceof Error ? error.message : String(error)}; degrading to no learned quota state (no cooldowns, no learned limits)\n`);
105
+ return emptyQuotaState();
106
+ }
79
107
  }
80
- export function computeMaxSafeConcurrency(entry, halfLifeHours, maxToCheck = MAX_BUCKET_LEVEL) {
81
- const decayed = applyDecayToEntry(entry, halfLifeHours);
82
- let maxSafe = 1;
83
- for (let n = 1; n <= maxToCheck; n++) {
84
- const bucket = decayed.buckets[String(n)];
85
- if (!bucket)
86
- break;
87
- if (bucket.success_weight >= MIN_EVIDENCE_WEIGHT &&
88
- bucket.failure_weight < MIN_EVIDENCE_WEIGHT) {
89
- maxSafe = n;
108
+ /**
109
+ * Read quota state for a read-modify-write whose caller ALREADY HOLDS
110
+ * `quota-state.json.lock`. Every RMW helper in this module goes through it.
111
+ *
112
+ * A `corrupt` file is terminal — every future read fails the same way — so
113
+ * without a repair path the first bad byte would permanently disable cooldown
114
+ * persistence and limit learning for the life of that file, with nothing but one
115
+ * stderr line to show for it. So: quarantine the bad bytes aside (evidence is
116
+ * preserved, never deleted), say so loudly, and continue from cold state, which
117
+ * the caller's write then re-establishes. Safe to do here precisely because the
118
+ * lock is held.
119
+ *
120
+ * An `unreadable` file (EACCES/EBUSY/EIO) is NOT quarantined and NOT swallowed —
121
+ * the content may be perfectly good and the failure transient, so the rejection
122
+ * propagates and the caller leaves the file untouched.
123
+ */
124
+ export async function readQuotaStateForUpdate(context) {
125
+ try {
126
+ return await readQuotaState();
127
+ }
128
+ catch (error) {
129
+ if (!(error instanceof QuotaStateUnavailableError) || error.kind !== "corrupt") {
130
+ throw error;
131
+ }
132
+ const statePath = getQuotaStatePath();
133
+ const quarantinePath = `${statePath}.corrupt-${new Date()
134
+ .toISOString()
135
+ .replace(/[:.]/g, "-")}`;
136
+ let quarantined = true;
137
+ try {
138
+ await rename(statePath, quarantinePath);
90
139
  }
91
- else {
92
- break;
140
+ catch {
141
+ // A peer healed it first, or the rename itself is blocked. Either way the
142
+ // caller's write recreates a valid file; don't fail the run over it.
143
+ quarantined = false;
93
144
  }
145
+ process.stderr.write(`[quota] ${context}: ${error.message}; ${quarantined ? `quarantined to ${quarantinePath}` : "could not quarantine it"}, continuing from cold state (learned limits and cooldowns are lost)\n`);
146
+ return emptyQuotaState();
147
+ }
148
+ }
149
+ /**
150
+ * Persist quota state atomically (temp file + rename, via the shared
151
+ * `writeJsonFile`). Atomicity is load-bearing: `refreshQuotaStateIfNeeded`
152
+ * reads this file WITHOUT taking `quota-state.json.lock`, so a truncating
153
+ * in-place write would expose a torn file to a co-located peer. With
154
+ * rename-over-destination a reader observes either the whole old file or the
155
+ * whole new one, never a prefix.
156
+ */
157
+ export async function writeQuotaState(state) {
158
+ const entries = {};
159
+ for (const [key, entry] of Object.entries(state.entries)) {
160
+ entries[key] = normalizeEntry(entry);
94
161
  }
95
- return maxSafe;
162
+ await writeJsonFile(getQuotaStatePath(), { version: 2, entries });
96
163
  }
97
- const RAMP_UP_MIN_SUCCESSES = 2;
98
- export function computeRampUpConcurrency(entry, halfLifeHours, maxToCheck = MAX_BUCKET_LEVEL) {
99
- const maxSafe = computeMaxSafeConcurrency(entry, halfLifeHours, maxToCheck);
100
- const decayed = applyDecayToEntry(entry, halfLifeHours);
101
- const bucket = decayed.buckets[String(maxSafe)];
102
- if (bucket &&
103
- bucket.success_weight >= RAMP_UP_MIN_SUCCESSES &&
104
- bucket.failure_weight < MIN_EVIDENCE_WEIGHT) {
105
- return maxSafe + 1;
164
+ /**
165
+ * Project an entry onto the v2 field set. A file written by an older build carries
166
+ * a `buckets` blob from the deleted concurrency learner; reading it round-trips
167
+ * harmlessly, but persisting it back under a `version: 2` stamp — which is
168
+ * supposed to mean "no bucket learner" — would keep the dead field alive forever.
169
+ * Writing is the migration.
170
+ */
171
+ function normalizeEntry(entry) {
172
+ const normalized = {
173
+ updated_at: entry.updated_at,
174
+ cooldown_until: entry.cooldown_until,
175
+ last_429_at: entry.last_429_at,
176
+ };
177
+ if (entry.consecutive_429_count !== undefined) {
178
+ normalized.consecutive_429_count = entry.consecutive_429_count;
106
179
  }
107
- return maxSafe;
180
+ if (entry.tokens_per_pct !== undefined)
181
+ normalized.tokens_per_pct = entry.tokens_per_pct;
182
+ if (entry.output_per_input !== undefined)
183
+ normalized.output_per_input = entry.output_per_input;
184
+ return normalized;
108
185
  }
109
186
  // EWMA weight for a new tokens_per_pct observation folded into the running
110
187
  // slope. 0.3 = responsive but not jumpy; a run flipping between windows still
@@ -181,13 +258,14 @@ export function foldOutputRatioObservation(prior, lens, actualInputTokens, actua
181
258
  * Persist a folded output/input ratio observation for a pool's quota-state entry,
182
259
  * under the shared quota-state file lock. Reads the current entry (or a blank one),
183
260
  * folds the observation via {@link foldOutputRatioObservation}, and writes back.
184
- * Degrade-safe: a missing/unreadable state file falls to a blank entry; an
261
+ * A missing state file is cold start; a CORRUPT one is quarantined and rebuilt
262
+ * ({@link readQuotaStateForUpdate}); a transient-unreadable one rejects. An
185
263
  * observation carrying no ratio signal leaves the file untouched-in-value.
186
264
  */
187
265
  export async function recordOutputRatioObservation(providerModelKey, lens, actualInputTokens, actualOutputTokens) {
188
266
  const lockPath = getQuotaStatePath() + ".lock";
189
267
  await withFileLock(lockPath, async () => {
190
- const state = await readQuotaState();
268
+ const state = await readQuotaStateForUpdate("recordOutputRatioObservation");
191
269
  const entry = state.entries[providerModelKey] ?? blankEntry();
192
270
  const updated = foldOutputRatioObservation(entry.output_per_input, lens, actualInputTokens, actualOutputTokens);
193
271
  entry.output_per_input = updated;
@@ -200,13 +278,14 @@ export async function recordOutputRatioObservation(providerModelKey, lens, actua
200
278
  * Persist a folded tokens_per_pct observation for a pool's quota-state entry,
201
279
  * under the shared quota-state file lock. Reads the current entry (or a blank
202
280
  * one), folds the observation via {@link foldTokensPerPctObservation}, and writes
203
- * back. Degrade-safe: a missing/unreadable state file falls to a blank entry;
204
- * an observation that doesn't move the slope leaves the file untouched-in-value.
281
+ * back. A missing state file is cold start; a CORRUPT one is quarantined and
282
+ * rebuilt ({@link readQuotaStateForUpdate}); a transient-unreadable one rejects.
283
+ * An observation that doesn't move the slope leaves the file untouched-in-value.
205
284
  */
206
285
  export async function recordTokensPerPctObservation(providerModelKey, windowLabel, priorRemainingPct, newRemainingPct, tokensDispatched) {
207
286
  const lockPath = getQuotaStatePath() + ".lock";
208
287
  await withFileLock(lockPath, async () => {
209
- const state = await readQuotaState();
288
+ const state = await readQuotaStateForUpdate("recordTokensPerPctObservation");
210
289
  const entry = state.entries[providerModelKey] ?? blankEntry();
211
290
  const updated = foldTokensPerPctObservation(entry.tokens_per_pct, windowLabel, priorRemainingPct, newRemainingPct, tokensDispatched);
212
291
  entry.tokens_per_pct = updated;
@@ -216,7 +295,7 @@ export async function recordTokensPerPctObservation(providerModelKey, windowLabe
216
295
  });
217
296
  }
218
297
  function blankEntry() {
219
- return { updated_at: new Date().toISOString(), buckets: {}, cooldown_until: null, last_429_at: null };
298
+ return { updated_at: new Date().toISOString(), cooldown_until: null, last_429_at: null };
220
299
  }
221
300
  export const BASE_COOLDOWN_MS = 60_000;
222
301
  export const MAX_COOLDOWN_MS = 15 * 60_000;
@@ -224,53 +303,35 @@ export function computeBackoffCooldownMs(consecutive429Count) {
224
303
  const ms = BASE_COOLDOWN_MS * Math.pow(2, Math.max(0, consecutive429Count - 1));
225
304
  return Math.min(ms, MAX_COOLDOWN_MS);
226
305
  }
227
- export function computeBackoffFailureWeight(consecutive429Count) {
228
- return 1.0 + 0.5 * Math.max(0, consecutive429Count - 1);
229
- }
230
- export async function recordWaveOutcome(providerModelKey, outcome, halfLifeHours) {
231
- const lockPath = getQuotaStatePath() + ".lock";
232
- await withFileLock(lockPath, () => recordWaveOutcomeUnsafe(providerModelKey, outcome, halfLifeHours));
233
- }
234
306
  /**
235
- * Targeted recovery: zero out the failure_weight on a single concurrency bucket
236
- * for a given provider-model key. Use this when a sparse or stale failure entry
237
- * at level `concurrency` is permanently capping the inferred safe concurrency —
238
- * the scan in computeMaxSafeConcurrency breaks at the first bucket whose
239
- * failure_weight dominates, so clearing one bad entry unblocks all higher levels.
307
+ * Record the outcome of a dispatched wave against a pool's quota entry: a success
308
+ * clears the cooldown and the 429 streak; a 429 extends both.
240
309
  *
241
- * This is faster than waiting for the 24-hour decay half-life to clear bad entries.
242
- * success_weight is preserved; only the failure evidence is removed.
310
+ * It records no concurrency evidence. Concurrency is DECLARED by the provider
311
+ * (`source.quota.max_concurrent` `CapacityPool.concurrencyCap`) or ABSENT, in
312
+ * which case quota headroom and rate limits are the only throttle. Inferring a
313
+ * safe concurrency from an outcome stream is a category error — see
314
+ * `spec/audit/dispatch-admission-control.md`.
243
315
  */
244
- export async function clearBucketFailureEvidence(providerModelKey, concurrency) {
316
+ export async function recordWaveOutcome(providerModelKey, outcome) {
245
317
  const lockPath = getQuotaStatePath() + ".lock";
246
- await withFileLock(lockPath, async () => {
247
- const state = await readQuotaState();
248
- const entry = state.entries[providerModelKey];
249
- if (!entry)
250
- return;
251
- const bucket = entry.buckets[String(concurrency)];
252
- if (!bucket)
253
- return;
254
- bucket.failure_weight = 0;
255
- entry.updated_at = new Date().toISOString();
256
- state.entries[providerModelKey] = entry;
257
- await writeQuotaState(state);
258
- });
318
+ await withFileLock(lockPath, () => recordWaveOutcomeUnsafe(providerModelKey, outcome));
259
319
  }
260
- async function recordWaveOutcomeUnsafe(providerModelKey, outcome, halfLifeHours) {
261
- const state = await readQuotaState();
262
- const entry = applyDecayToEntry(state.entries[providerModelKey] ?? blankEntry(), halfLifeHours);
320
+ async function recordWaveOutcomeUnsafe(providerModelKey, outcome) {
321
+ const state = await readQuotaStateForUpdate("recordWaveOutcome");
322
+ const entry = state.entries[providerModelKey] ?? blankEntry();
263
323
  if (outcome.outcome === "success") {
264
- entry.consecutive_429_count = 0;
265
- entry.cooldown_until = null;
266
- // Cap at MAX_BUCKET_LEVEL: levels above this are never read back by
267
- // computeMaxSafeConcurrency, so writing them would grow the state file
268
- // indefinitely without ever influencing scheduling decisions.
269
- const successCeiling = Math.min(outcome.concurrency, MAX_BUCKET_LEVEL);
270
- for (let n = 1; n <= successCeiling; n++) {
271
- const bucket = entry.buckets[String(n)] ?? { success_weight: 0, failure_weight: 0 };
272
- bucket.success_weight += 1.0;
273
- entry.buckets[String(n)] = bucket;
324
+ // A success does NOT cancel a live cooldown. Packets run concurrently, so a
325
+ // success completing at T+2s was almost certainly dispatched BEFORE the 429
326
+ // at T it is not evidence the rate limit is over. Clearing the cooldown
327
+ // here would let the very next invocation schedule a full-width wave into a
328
+ // still-throttled pool AND restart the exponential backoff from its base.
329
+ // Only an already-expired cooldown is cleared (which also self-heals an
330
+ // unparseable timestamp, since NaN > now is false).
331
+ const cooldownActive = entry.cooldown_until != null && new Date(entry.cooldown_until).getTime() > Date.now();
332
+ if (!cooldownActive) {
333
+ entry.consecutive_429_count = 0;
334
+ entry.cooldown_until = null;
274
335
  }
275
336
  }
276
337
  else {
@@ -291,20 +352,6 @@ async function recordWaveOutcomeUnsafe(providerModelKey, outcome, halfLifeHours)
291
352
  else if (outcome.cooldown_until) {
292
353
  entry.cooldown_until = outcome.cooldown_until;
293
354
  }
294
- const failureWeight = outcome.outcome === "rate_limited"
295
- ? computeBackoffFailureWeight(new429Count)
296
- : 1.0;
297
- // Spread failure evidence from outcome.concurrency through
298
- // outcome.concurrency + FAILURE_SPREAD_BUCKETS, but cap at
299
- // MAX_BUCKET_LEVEL + FAILURE_SPREAD_BUCKETS — beyond this ceiling the
300
- // scan loop in computeMaxSafeConcurrency will never reach, so additional
301
- // entries only bloat the file.
302
- const failureCeiling = Math.min(outcome.concurrency + FAILURE_SPREAD_BUCKETS, MAX_BUCKET_LEVEL + FAILURE_SPREAD_BUCKETS);
303
- for (let n = outcome.concurrency; n <= failureCeiling; n++) {
304
- const bucket = entry.buckets[String(n)] ?? { success_weight: 0, failure_weight: 0 };
305
- bucket.failure_weight += failureWeight;
306
- entry.buckets[String(n)] = bucket;
307
- }
308
355
  }
309
356
  entry.updated_at = new Date().toISOString();
310
357
  state.entries[providerModelKey] = entry;
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/shared/quota/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/shared/quota/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,IAAI,UAA8B,CAAC;AAEnC,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC7F,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtF,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/B,OAAO,CAAC,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC;AAChF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AACrC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAExC;IAQA;IACA;IAVX,YACW,SAAiB;IAC1B;;;;;;OAMG;IACM,IAA8B,EAC9B,MAAc;QAEvB,KAAK,CAAC,kBAAkB,SAAS,iBAAiB,IAAI,MAAM,MAAM,EAAE,CAAC,CAAC;QAX7D,cAAS,GAAT,SAAS,CAAQ;QAQjB,SAAI,GAAJ,IAAI,CAA0B;QAC9B,WAAM,GAAN,MAAM,CAAQ;QAGvB,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;IACtC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,eAAe,EAAE,CAAC;QAC3B,CAAC;QACD,MAAM,IAAI,0BAA0B,CAClC,SAAS,EACT,YAAY,EACZ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;IACJ,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,0BAA0B,CAClC,SAAS,EACT,SAAS,EACT,mBAAmB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAC7E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,0BAA0B,CAClC,SAAS,EACT,SAAS,EACT,4CAA4C,CAC7C,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAClD,KAAK,CAAC,qBAAqB,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAAe;IAC3D,IAAI,CAAC;QACH,OAAO,MAAM,cAAc,EAAE,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,WAAW,OAAO,KAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,2EAA2E,CAC5E,CAAC;QACF,OAAO,eAAe,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAAe;IAC3D,IAAI,CAAC;QACH,OAAO,MAAM,cAAc,EAAE,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,KAAK,YAAY,0BAA0B,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/E,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;QACtC,MAAM,cAAc,GAAG,GAAG,SAAS,YAAY,IAAI,IAAI,EAAE;aACtD,WAAW,EAAE;aACb,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;QAC3B,IAAI,WAAW,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,0EAA0E;YAC1E,qEAAqE;YACrE,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,WAAW,OAAO,KAAK,KAAK,CAAC,OAAO,KAClC,WAAW,CAAC,CAAC,CAAC,kBAAkB,cAAc,EAAE,CAAC,CAAC,CAAC,yBACrD,wEAAwE,CACzE,CAAC;QACF,OAAO,eAAe,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAiB;IACrD,MAAM,OAAO,GAAoC,EAAE,CAAC;IACpD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,aAAa,CAAC,iBAAiB,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAuB,CAAC,CAAC;AACzF,CAAC;AAED;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,KAAsB;IAC5C,MAAM,UAAU,GAAoB;QAClC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,WAAW,EAAE,KAAK,CAAC,WAAW;KAC/B,CAAC;IACF,IAAI,KAAK,CAAC,qBAAqB,KAAK,SAAS,EAAE,CAAC;QAC9C,UAAU,CAAC,qBAAqB,GAAG,KAAK,CAAC,qBAAqB,CAAC;IACjE,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS;QAAE,UAAU,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;IACzF,IAAI,KAAK,CAAC,gBAAgB,KAAK,SAAS;QAAE,UAAU,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;IAC/F,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,2EAA2E;AAC3E,8EAA8E;AAC9E,+DAA+D;AAC/D,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAC7C,8EAA8E;AAC9E,gFAAgF;AAChF,yDAAyD;AACzD,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,2BAA2B,CACzC,KAAyC,EACzC,WAAmB,EACnB,iBAAyB,EACzB,eAAuB,EACvB,gBAAwB;IAExB,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;IACzB,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACnC,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC;QACjC,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAClC,gBAAgB,IAAI,CAAC,EACrB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,sEAAsE;IACtE,MAAM,YAAY,GAAG,CAAC,iBAAiB,GAAG,eAAe,CAAC,GAAG,GAAG,CAAC;IACjE,IAAI,YAAY,GAAG,uBAAuB;QAAE,OAAO,IAAI,CAAC;IACxD,MAAM,WAAW,GAAG,gBAAgB,GAAG,YAAY,CAAC;IACpD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IACnC,MAAM,OAAO,GACX,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC;QACvE,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,yBAAyB,CAAC,GAAG,WAAW,GAAG,yBAAyB;QACtF,CAAC,CAAC,WAAW,CAAC;IAClB,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;AAC7C,CAAC;AAED,mFAAmF;AACnF,mFAAmF;AACnF,qFAAqF;AACrF,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C;;;;;;;;;GASG;AACH,MAAM,UAAU,0BAA0B,CACxC,KAAyC,EACzC,IAAY,EACZ,iBAAyB,EACzB,kBAA0B;IAE1B,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;IACzB,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACnC,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QACpC,iBAAiB,IAAI,CAAC;QACtB,kBAAkB,IAAI,CAAC,EACvB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,WAAW,GAAG,kBAAkB,GAAG,iBAAiB,CAAC;IAC3D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,OAAO,GACX,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC;QACvE,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,uBAAuB,CAAC,GAAG,WAAW,GAAG,uBAAuB;QAClF,CAAC,CAAC,WAAW,CAAC;IAClB,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;AACtC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,gBAAwB,EACxB,IAAY,EACZ,iBAAyB,EACzB,kBAA0B;IAE1B,MAAM,QAAQ,GAAG,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAC/C,MAAM,YAAY,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,KAAK,GAAG,MAAM,uBAAuB,CAAC,8BAA8B,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,UAAU,EAAE,CAAC;QAC9D,MAAM,OAAO,GAAG,0BAA0B,CACxC,KAAK,CAAC,gBAAgB,EACtB,IAAI,EACJ,iBAAiB,EACjB,kBAAkB,CACnB,CAAC;QACF,KAAK,CAAC,gBAAgB,GAAG,OAAO,CAAC;QACjC,KAAK,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC5C,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC;QACxC,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,gBAAwB,EACxB,WAAmB,EACnB,iBAAyB,EACzB,eAAuB,EACvB,gBAAwB;IAExB,MAAM,QAAQ,GAAG,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAC/C,MAAM,YAAY,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,KAAK,GAAG,MAAM,uBAAuB,CAAC,+BAA+B,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,UAAU,EAAE,CAAC;QAC9D,MAAM,OAAO,GAAG,2BAA2B,CACzC,KAAK,CAAC,cAAc,EACpB,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,gBAAgB,CACjB,CAAC;QACF,KAAK,CAAC,cAAc,GAAG,OAAO,CAAC;QAC/B,KAAK,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC5C,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC;QACxC,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC3F,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AACvC,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,GAAG,MAAM,CAAC;AAE3C,MAAM,UAAU,wBAAwB,CAAC,mBAA2B;IAClE,MAAM,EAAE,GAAG,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,mBAAmB,GAAG,CAAC,CAAC,CAAC,CAAC;IAChF,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,gBAAwB,EACxB,OAA4B;IAE5B,MAAM,QAAQ,GAAG,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAC/C,MAAM,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,uBAAuB,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC;AACzF,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,gBAAwB,EACxB,OAA4B;IAE5B,MAAM,KAAK,GAAG,MAAM,uBAAuB,CAAC,mBAAmB,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,UAAU,EAAE,CAAC;IAE9D,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAClC,4EAA4E;QAC5E,4EAA4E;QAC5E,0EAA0E;QAC1E,4EAA4E;QAC5E,0EAA0E;QAC1E,wEAAwE;QACxE,oDAAoD;QACpD,MAAM,cAAc,GAClB,KAAK,CAAC,cAAc,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxF,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,KAAK,CAAC,qBAAqB,GAAG,CAAC,CAAC;YAChC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,YAAY,GAAG,KAAK,CAAC,qBAAqB,IAAI,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,KAAK,cAAc,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;QACzF,KAAK,CAAC,qBAAqB,GAAG,WAAW,CAAC;QAC1C,6EAA6E;QAC7E,yEAAyE;QACzE,0EAA0E;QAC1E,iEAAiE;QACjE,IAAI,OAAO,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;YACvC,KAAK,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC/C,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,KAAK,cAAc,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YAC1D,MAAM,SAAS,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;YACxD,KAAK,CAAC,cAAc,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QACxE,CAAC;aAAM,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAClC,KAAK,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QAChD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC;IACxC,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC"}
@@ -39,13 +39,8 @@ export declare const ResolvedLimitsSchema: z.ZodObject<{
39
39
  output_tokens_per_minute: number | null;
40
40
  }>;
41
41
  export type ResolvedLimits = z.infer<typeof ResolvedLimitsSchema>;
42
- export interface ConcurrencyBucket {
43
- success_weight: number;
44
- failure_weight: number;
45
- }
46
42
  export interface QuotaStateEntry {
47
43
  updated_at: string;
48
- buckets: Record<string, ConcurrencyBucket>;
49
44
  cooldown_until: string | null;
50
45
  last_429_at: string | null;
51
46
  consecutive_429_count?: number;
@@ -80,7 +75,7 @@ export interface QuotaState {
80
75
  * re-deriving the decision. Set by `scheduleWave`; logged by callers that hold a
81
76
  * RunLogger as a `kind:"scope"` event.
82
77
  */
83
- export declare const WaveBindingCapSchema: z.ZodEnum<["rpm", "tpm", "token_budget", "learned", "cooldown", "host_concurrency", "none"]>;
78
+ export declare const WaveBindingCapSchema: z.ZodEnum<["rpm", "tpm", "token_budget", "cooldown", "host_concurrency", "none"]>;
84
79
  export type WaveBindingCap = z.infer<typeof WaveBindingCapSchema>;
85
80
  export interface WaveSchedule {
86
81
  max_concurrent: number;
@@ -110,26 +105,26 @@ export interface WaveSchedule {
110
105
  export declare const BackoffStateSchema: z.ZodObject<{
111
106
  consecutive_429_count: z.ZodNumber;
112
107
  current_cooldown_ms: z.ZodNumber;
113
- current_failure_weight: z.ZodNumber;
114
108
  }, "strict", z.ZodTypeAny, {
115
109
  consecutive_429_count: number;
116
110
  current_cooldown_ms: number;
117
- current_failure_weight: number;
118
111
  }, {
119
112
  consecutive_429_count: number;
120
113
  current_cooldown_ms: number;
121
- current_failure_weight: number;
122
114
  }>;
123
115
  export type BackoffState = z.infer<typeof BackoffStateSchema>;
124
116
  export interface ObservedWaveOutcome {
125
- concurrency: number;
126
- estimated_tokens: number;
127
117
  /**
128
- * - `success`: wave completed without error.
118
+ * - `success`: wave completed without error — clears the 429 streak and cooldown,
119
+ * but NEVER a still-live cooldown (a concurrent success is not evidence a 429
120
+ * is over).
129
121
  * - `rate_limited`: provider signalled 429 / quota exhaustion — applies cooldown + backoff.
130
- * - `timeout`: execution deadline exceeded — records failure weight but no rate-limit cooldown.
131
- * - `error`: provider returned a non-quota error (crash, network failure) — records failure
132
- * weight only; does NOT apply rate-limit cooldown (distinct from quota exhaustion).
122
+ * - `timeout`: execution deadline exceeded — no rate-limit cooldown.
123
+ * - `error`: provider returned a non-quota error (crash, network failure) — no
124
+ * rate-limit cooldown (distinct from quota exhaustion).
125
+ *
126
+ * The outcome carries no `concurrency`: concurrency is DECLARED by the provider
127
+ * or ABSENT, never inferred from an outcome stream.
133
128
  */
134
129
  outcome: "success" | "rate_limited" | "timeout" | "error";
135
130
  cooldown_until?: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/types.ts"],"names":[],"mappings":"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"}
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;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC1C;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,mFAO/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,eAAe,CAAC;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB,eAAe,EAAE,cAAc,CAAC;IAChC,sBAAsB,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACpD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,qBAAqB,CAAC,EAAE,OAAO,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC7E;;;OAGG;IACH,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,kBAAkB;;;;;;;;;EAKpB,CAAC;AACZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,MAAM,WAAW,mBAAmB;IAClC;;;;;;;;;;;OAWG;IACH,OAAO,EAAE,SAAS,GAAG,cAAc,GAAG,SAAS,GAAG,OAAO,CAAC;IAC1D,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B"}
@@ -48,7 +48,6 @@ export const WaveBindingCapSchema = z.enum([
48
48
  "rpm",
49
49
  "tpm",
50
50
  "token_budget",
51
- "learned",
52
51
  "cooldown",
53
52
  "host_concurrency",
54
53
  "none",
@@ -57,7 +56,6 @@ export const BackoffStateSchema = z
57
56
  .object({
58
57
  consecutive_429_count: z.number().int().min(0),
59
58
  current_cooldown_ms: z.number().int().min(0),
60
- current_failure_weight: z.number().min(0),
61
59
  })
62
60
  .strict();
63
61
  //# sourceMappingURL=types.js.map
@@ -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;AAyCZ;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,IAAI,CAAC;IACzC,KAAK;IACL,KAAK;IACL,cAAc;IACd,SAAS;IACT,UAAU;IACV,kBAAkB;IAClB,MAAM;CACP,CAAC,CAAC;AA6BH,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;IAC5C,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC1C,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;AAmCZ;;;;;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;AA6BH,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"}
@@ -116,18 +116,21 @@ export interface BrokeredRepairDispatch {
116
116
  */
117
117
  export declare function estimateSlotTokens(slot: BrokeredDispatchSlot): number;
118
118
  /**
119
- * Classify whether a host is "capable" — i.e. it advertises real concurrency
119
+ * Classify whether a host is "capable" — i.e. it DECLARES real concurrency
120
120
  * head-room ABOVE the conservative cold-start (first-contact) floor. On first
121
- * contact, with no learned evidence and no reported host ceiling, a host sits AT
122
- * the floor and is NOT yet capable; once it reports an active-subagent ceiling
123
- * (or learned evidence lifts the cap) above the floor, it is. Single-sourced
124
- * here so both halves classify identically off the SAME floor.
121
+ * contact, with no reported host ceiling, a host sits AT the floor and is NOT yet
122
+ * capable; once it reports an active-subagent ceiling above the floor, it is.
123
+ * Single-sourced here so both halves classify identically off the SAME floor.
124
+ *
125
+ * Capability is DECLARED, never inferred: there is no observational evidence that
126
+ * can lift a host off the floor. (The former "any recorded safe concurrency
127
+ * bucket lifts the host" branch was a learned-concurrency inference — see
128
+ * `spec/audit/dispatch-admission-control.md`.)
125
129
  */
126
130
  export declare function classifyCapableHost(input: {
127
131
  providerName: ResolvedProviderName;
128
132
  sessionConfig: SessionConfig;
129
133
  hostConcurrencyLimit?: HostConcurrencyLimit | null;
130
- quotaStateEntry?: QuotaStateEntry | null;
131
134
  }): boolean;
132
135
  /**
133
136
  * Create the concrete broker. The single gated chokepoint: it sizes the wave
@@ -1 +1 @@
1
- {"version":3,"file":"brokeredDispatch.d.ts","sourceRoot":"","sources":["../../../src/shared/repair/brokeredDispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,KAAK,EACV,oBAAoB,EACpB,eAAe,EAEf,cAAc,EACd,YAAY,EACb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAOvE;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,2EAA2E;AAC3E,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,qBAAqB,GAAG,UAAU,CAAC;AAE9E;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,SAAS,EAAE,eAAe,CAAC;IAC3B,+EAA+E;IAC/E,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iEAAiE;IACjE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,uEAAuE;IACvE,UAAU,EAAE,cAAc,CAAC;IAC3B,4EAA4E;IAC5E,WAAW,EAAE,OAAO,CAAC;IACrB,4EAA4E;IAC5E,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,oBAAoB,CAAC;IACnC,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,2CAA2C;IAC3C,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,+EAA+E;IAC/E,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,uDAAuD;IACvD,oBAAoB,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACnD,mEAAmE;IACnE,mBAAmB,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAChD,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAC;CACrD;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,wBAAwB,CAAC;IAC7D;;;OAGG;IACH,mBAAmB,CAAC,UAAU,EAAE,kBAAkB,GAAG,kBAAkB,CAAC;CACzE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAErE;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,YAAY,EAAE,oBAAoB,CAAC;IACnC,aAAa,EAAE,aAAa,CAAC;IAC7B,oBAAoB,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACnD,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CAC1C,GAAG,OAAO,CAgBV;AAyFD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,4BAA4B,IAAI,sBAAsB,CAiGrE"}
1
+ {"version":3,"file":"brokeredDispatch.d.ts","sourceRoot":"","sources":["../../../src/shared/repair/brokeredDispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,KAAK,EACV,oBAAoB,EACpB,eAAe,EAEf,cAAc,EACd,YAAY,EACb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAOvE;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,2EAA2E;AAC3E,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,qBAAqB,GAAG,UAAU,CAAC;AAE9E;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,SAAS,EAAE,eAAe,CAAC;IAC3B,+EAA+E;IAC/E,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iEAAiE;IACjE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,uEAAuE;IACvE,UAAU,EAAE,cAAc,CAAC;IAC3B,4EAA4E;IAC5E,WAAW,EAAE,OAAO,CAAC;IACrB,4EAA4E;IAC5E,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,oBAAoB,CAAC;IACnC,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,2CAA2C;IAC3C,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,+EAA+E;IAC/E,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,uDAAuD;IACvD,oBAAoB,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACnD,mEAAmE;IACnE,mBAAmB,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAChD,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAC;CACrD;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,wBAAwB,CAAC;IAC7D;;;OAGG;IACH,mBAAmB,CAAC,UAAU,EAAE,kBAAkB,GAAG,kBAAkB,CAAC;CACzE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAErE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,YAAY,EAAE,oBAAoB,CAAC;IACnC,aAAa,EAAE,aAAa,CAAC;IAC7B,oBAAoB,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;CACpD,GAAG,OAAO,CASV;AAwFD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,4BAA4B,IAAI,sBAAsB,CA+FrE"}