audit-tools 0.30.49 → 0.30.53

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 (165) hide show
  1. package/dist/audit/cli/advanceAuditCommand.d.ts.map +1 -1
  2. package/dist/audit/cli/advanceAuditCommand.js +8 -4
  3. package/dist/audit/cli/advanceAuditCommand.js.map +1 -1
  4. package/dist/audit/cli/args.d.ts.map +1 -1
  5. package/dist/audit/cli/args.js +9 -2
  6. package/dist/audit/cli/args.js.map +1 -1
  7. package/dist/audit/cli/mergeAndIngestCommand.d.ts.map +1 -1
  8. package/dist/audit/cli/mergeAndIngestCommand.js +6 -22
  9. package/dist/audit/cli/mergeAndIngestCommand.js.map +1 -1
  10. package/dist/audit/cli/prompts.d.ts.map +1 -1
  11. package/dist/audit/cli/prompts.js +3 -1
  12. package/dist/audit/cli/prompts.js.map +1 -1
  13. package/dist/audit/cli/validateResultCommand.d.ts.map +1 -1
  14. package/dist/audit/cli/validateResultCommand.js +19 -6
  15. package/dist/audit/cli/validateResultCommand.js.map +1 -1
  16. package/dist/audit/cli/workerRunCommand.d.ts.map +1 -1
  17. package/dist/audit/cli/workerRunCommand.js +6 -21
  18. package/dist/audit/cli/workerRunCommand.js.map +1 -1
  19. package/dist/audit/contracts/workerSchemas.d.ts +27 -3
  20. package/dist/audit/contracts/workerSchemas.d.ts.map +1 -1
  21. package/dist/audit/contracts/workerSchemas.js +5 -1
  22. package/dist/audit/contracts/workerSchemas.js.map +1 -1
  23. package/dist/audit/extractors/analyzers/html.d.ts +1 -0
  24. package/dist/audit/extractors/analyzers/html.d.ts.map +1 -1
  25. package/dist/audit/extractors/analyzers/html.js +5 -3
  26. package/dist/audit/extractors/analyzers/html.js.map +1 -1
  27. package/dist/audit/extractors/browserExtension.d.ts.map +1 -1
  28. package/dist/audit/extractors/browserExtension.js +1 -8
  29. package/dist/audit/extractors/browserExtension.js.map +1 -1
  30. package/dist/audit/extractors/graphRoutes.d.ts.map +1 -1
  31. package/dist/audit/extractors/graphRoutes.js +4 -1
  32. package/dist/audit/extractors/graphRoutes.js.map +1 -1
  33. package/dist/audit/orchestrator/autoFixExecutor.d.ts +8 -0
  34. package/dist/audit/orchestrator/autoFixExecutor.d.ts.map +1 -1
  35. package/dist/audit/orchestrator/autoFixExecutor.js +68 -35
  36. package/dist/audit/orchestrator/autoFixExecutor.js.map +1 -1
  37. package/dist/audit/orchestrator/rollingDispatch.d.ts +2 -2
  38. package/dist/audit/orchestrator/rollingDispatch.d.ts.map +1 -1
  39. package/dist/audit/orchestrator/runtimeCommand.d.ts.map +1 -1
  40. package/dist/audit/orchestrator/runtimeCommand.js +7 -1
  41. package/dist/audit/orchestrator/runtimeCommand.js.map +1 -1
  42. package/dist/audit/orchestrator/selectiveDeepening/index.d.ts.map +1 -1
  43. package/dist/audit/orchestrator/selectiveDeepening/index.js +12 -8
  44. package/dist/audit/orchestrator/selectiveDeepening/index.js.map +1 -1
  45. package/dist/audit/orchestrator/taskBuilder.d.ts.map +1 -1
  46. package/dist/audit/orchestrator/taskBuilder.js +0 -32
  47. package/dist/audit/orchestrator/taskBuilder.js.map +1 -1
  48. package/dist/audit/quota/discoveredLimits.d.ts +12 -0
  49. package/dist/audit/quota/discoveredLimits.d.ts.map +1 -1
  50. package/dist/audit/quota/discoveredLimits.js +30 -25
  51. package/dist/audit/quota/discoveredLimits.js.map +1 -1
  52. package/dist/audit/quota/index.d.ts +120 -18
  53. package/dist/audit/quota/index.d.ts.map +1 -1
  54. package/dist/audit/types/auditScope.d.ts +2 -2
  55. package/dist/audit/validation/auditResults.d.ts +16 -0
  56. package/dist/audit/validation/auditResults.d.ts.map +1 -1
  57. package/dist/audit/validation/auditResults.js +35 -1
  58. package/dist/audit/validation/auditResults.js.map +1 -1
  59. package/dist/remediate/phases/close.d.ts.map +1 -1
  60. package/dist/remediate/phases/close.js +16 -6
  61. package/dist/remediate/phases/close.js.map +1 -1
  62. package/dist/remediate/steps/contractPipeline.d.ts +4 -1
  63. package/dist/remediate/steps/contractPipeline.d.ts.map +1 -1
  64. package/dist/remediate/steps/contractPipeline.js +63 -47
  65. package/dist/remediate/steps/contractPipeline.js.map +1 -1
  66. package/dist/remediate/steps/contractPipelinePrompts.d.ts +12 -1
  67. package/dist/remediate/steps/contractPipelinePrompts.d.ts.map +1 -1
  68. package/dist/remediate/steps/contractPipelinePrompts.js +29 -18
  69. package/dist/remediate/steps/contractPipelinePrompts.js.map +1 -1
  70. package/dist/remediate/steps/dispatch.d.ts +20 -3
  71. package/dist/remediate/steps/dispatch.d.ts.map +1 -1
  72. package/dist/remediate/steps/dispatch.js +221 -117
  73. package/dist/remediate/steps/dispatch.js.map +1 -1
  74. package/dist/remediate/steps/finalGate.d.ts +88 -0
  75. package/dist/remediate/steps/finalGate.d.ts.map +1 -0
  76. package/dist/remediate/steps/finalGate.js +171 -0
  77. package/dist/remediate/steps/finalGate.js.map +1 -0
  78. package/dist/remediate/steps/leanFastPath.d.ts.map +1 -1
  79. package/dist/remediate/steps/leanFastPath.js +12 -0
  80. package/dist/remediate/steps/leanFastPath.js.map +1 -1
  81. package/dist/remediate/steps/nextStep.d.ts +12 -82
  82. package/dist/remediate/steps/nextStep.d.ts.map +1 -1
  83. package/dist/remediate/steps/nextStep.js +142 -170
  84. package/dist/remediate/steps/nextStep.js.map +1 -1
  85. package/dist/remediate/steps/types.d.ts +1 -1
  86. package/dist/remediate/steps/types.d.ts.map +1 -1
  87. package/dist/remediate/steps/types.js.map +1 -1
  88. package/dist/remediate/validation/contractPipeline.d.ts.map +1 -1
  89. package/dist/remediate/validation/contractPipeline.js +17 -3
  90. package/dist/remediate/validation/contractPipeline.js.map +1 -1
  91. package/dist/shared/dispatch/rollingDispatch.d.ts +22 -1
  92. package/dist/shared/dispatch/rollingDispatch.d.ts.map +1 -1
  93. package/dist/shared/dispatch/rollingDispatch.js +147 -7
  94. package/dist/shared/dispatch/rollingDispatch.js.map +1 -1
  95. package/dist/shared/index.d.ts +6 -4
  96. package/dist/shared/index.d.ts.map +1 -1
  97. package/dist/shared/index.js +5 -3
  98. package/dist/shared/index.js.map +1 -1
  99. package/dist/shared/io/frictionCapture.d.ts +14 -1
  100. package/dist/shared/io/frictionCapture.d.ts.map +1 -1
  101. package/dist/shared/io/frictionCapture.js +28 -3
  102. package/dist/shared/io/frictionCapture.js.map +1 -1
  103. package/dist/shared/observability/runLog.d.ts +1 -1
  104. package/dist/shared/observability/runLog.d.ts.map +1 -1
  105. package/dist/shared/observability/runLog.js.map +1 -1
  106. package/dist/shared/providers/providerConfirmation.d.ts +16 -1
  107. package/dist/shared/providers/providerConfirmation.d.ts.map +1 -1
  108. package/dist/shared/providers/providerConfirmation.js +13 -13
  109. package/dist/shared/providers/providerConfirmation.js.map +1 -1
  110. package/dist/shared/providers/providerFactory.d.ts.map +1 -1
  111. package/dist/shared/providers/providerFactory.js +10 -14
  112. package/dist/shared/providers/providerFactory.js.map +1 -1
  113. package/dist/shared/providers/providerPathGuard.d.ts +21 -0
  114. package/dist/shared/providers/providerPathGuard.d.ts.map +1 -0
  115. package/dist/shared/providers/providerPathGuard.js +69 -0
  116. package/dist/shared/providers/providerPathGuard.js.map +1 -0
  117. package/dist/shared/providers/sharedProviderConfirmation.d.ts +14 -2
  118. package/dist/shared/providers/sharedProviderConfirmation.d.ts.map +1 -1
  119. package/dist/shared/providers/sharedProviderConfirmation.js +26 -5
  120. package/dist/shared/providers/sharedProviderConfirmation.js.map +1 -1
  121. package/dist/shared/quota/apiPool.d.ts +6 -1
  122. package/dist/shared/quota/apiPool.d.ts.map +1 -1
  123. package/dist/shared/quota/apiPool.js +13 -2
  124. package/dist/shared/quota/apiPool.js.map +1 -1
  125. package/dist/shared/quota/capacity.d.ts +87 -8
  126. package/dist/shared/quota/capacity.d.ts.map +1 -1
  127. package/dist/shared/quota/capacity.js +27 -2
  128. package/dist/shared/quota/capacity.js.map +1 -1
  129. package/dist/shared/quota/claudeOAuthQuotaSource.d.ts.map +1 -1
  130. package/dist/shared/quota/claudeOAuthQuotaSource.js +56 -0
  131. package/dist/shared/quota/claudeOAuthQuotaSource.js.map +1 -1
  132. package/dist/shared/quota/fileLock.d.ts +17 -2
  133. package/dist/shared/quota/fileLock.d.ts.map +1 -1
  134. package/dist/shared/quota/fileLock.js +21 -19
  135. package/dist/shared/quota/fileLock.js.map +1 -1
  136. package/dist/shared/quota/quotaSource.d.ts +62 -2
  137. package/dist/shared/quota/quotaSource.d.ts.map +1 -1
  138. package/dist/shared/quota/quotaSource.js +24 -0
  139. package/dist/shared/quota/quotaSource.js.map +1 -1
  140. package/dist/shared/quota/scheduler.d.ts +19 -2
  141. package/dist/shared/quota/scheduler.d.ts.map +1 -1
  142. package/dist/shared/quota/scheduler.js +162 -86
  143. package/dist/shared/quota/scheduler.js.map +1 -1
  144. package/dist/shared/quota/state.d.ts +22 -0
  145. package/dist/shared/quota/state.d.ts.map +1 -1
  146. package/dist/shared/quota/state.js +59 -0
  147. package/dist/shared/quota/state.js.map +1 -1
  148. package/dist/shared/quota/tokenBudgetView.d.ts +17 -0
  149. package/dist/shared/quota/tokenBudgetView.d.ts.map +1 -0
  150. package/dist/shared/quota/tokenBudgetView.js +77 -0
  151. package/dist/shared/quota/tokenBudgetView.js.map +1 -0
  152. package/dist/shared/quota/types.d.ts +19 -1
  153. package/dist/shared/quota/types.d.ts.map +1 -1
  154. package/dist/shared/quota/types.js +1 -2
  155. package/dist/shared/quota/types.js.map +1 -1
  156. package/dist/shared/repair/brokeredDispatch.d.ts.map +1 -1
  157. package/dist/shared/repair/brokeredDispatch.js +5 -3
  158. package/dist/shared/repair/brokeredDispatch.js.map +1 -1
  159. package/dist/shared/types/providerConfirmation.d.ts +9 -0
  160. package/dist/shared/types/providerConfirmation.d.ts.map +1 -1
  161. package/dist/shared/types/sessionConfig.d.ts +0 -3
  162. package/dist/shared/types/sessionConfig.d.ts.map +1 -1
  163. package/dist/shared/types/sessionConfig.js.map +1 -1
  164. package/package.json +2 -2
  165. package/scripts/audit/postinstall.mjs +22 -14
@@ -79,22 +79,23 @@ export const DEFAULT_SAFETY_MARGIN = 0.8;
79
79
  /** Half-life (hours) for decaying learned concurrency evidence. */
80
80
  export const DEFAULT_EMPIRICAL_HALF_LIFE_HOURS = 24;
81
81
  /**
82
- * Conservative cold-start ceiling applied on first contact with an unconfigured
83
- * provider. Private to this module: it is NOT a separable public export — the
84
- * resolved cold-start / agent-host floor is surfaced ONLY via the
85
- * {@link classifyProvider} struct's `concurrencyFloor`
86
- * (INV-BROKER-CLASSIFY-SINGLE-SOURCE / CE-005), so a call site cannot re-derive
87
- * a floor from a standalone constant.
82
+ * Reference cold-start floor for the capable-vs-cold host CLASSIFICATION (no
83
+ * longer a scheduler wave cap the token-budget gate replaced the invented
84
+ * caps). Private to this module: NOT a separable public export — the resolved
85
+ * cold-start / agent-host floor is surfaced ONLY via the {@link classifyProvider}
86
+ * struct's `concurrencyFloor` (INV-BROKER-CLASSIFY-SINGLE-SOURCE / CE-005), so a
87
+ * call site cannot re-derive a floor from a standalone constant.
88
88
  */
89
89
  const COLD_START_CONCURRENCY = 3;
90
90
  /**
91
91
  * Parallel cold-start floor for a capable agent host that fans out to fresh
92
92
  * subagent sessions (each with its own context window). Private — surfaced only
93
- * through {@link classifyProvider}'s `concurrencyFloor`. Collapsing such a host
94
- * to serial dispatch (1) is pathological for the conversation-first flow, so the
95
- * floor is lifted when nothing else constrains concurrency. The host's own
96
- * reported cap still binds at dispatch time, and an explicit
97
- * `quota.unknown_hosted_concurrency` still overrides it.
93
+ * through {@link classifyProvider}'s `concurrencyFloor`. This floor is NO LONGER a
94
+ * scheduler wave-sizing cap (the invented cold-start/fallback caps were removed in
95
+ * favour of the token-budget gate); it survives solely as the reference point for
96
+ * the capable-vs-cold host CLASSIFICATION in `classifyCapableHost`
97
+ * (brokeredDispatch): a host reporting a ceiling above this floor, or learned
98
+ * evidence above it, is "capable".
98
99
  */
99
100
  const AGENT_HOST_CONCURRENCY = 8;
100
101
  /**
@@ -175,39 +176,95 @@ export function selectDispatchDriver(input) {
175
176
  };
176
177
  }
177
178
  /**
178
- * Real-time quota-source `remaining_pct` thresholds. At/under CRITICAL we throttle
179
- * to a single request; at/under LOW we halve the wave.
179
+ * Real-time quota-source `remaining_pct` thresholds retained for consumers that
180
+ * classify a pool's health from its live snapshot (e.g. the rolling engine's
181
+ * proactive cross-pool spill, INV-QD-14). These are NO LONGER wave-sizing
182
+ * cliffs: the scheduler sizes the wave against the learned token BUDGET gate
183
+ * ({@link deriveTokenBudget}), not a fixed remaining_pct step function.
180
184
  */
181
185
  export const QUOTA_REMAINING_PCT_CRITICAL = 0.1;
182
186
  export const QUOTA_REMAINING_PCT_LOW = 0.3;
183
- /** Multiplier applied to the wave when remaining quota is in the LOW band. */
184
- const QUOTA_LOW_WAVE_MULTIPLIER = 0.5;
185
187
  /**
186
- * Apply a real-time quota-source snapshot to the current wave size. The snapshot
187
- * is the strongest live signal: when quota is near-exhausted we throttle to 1 and
188
- * record the reset time as a cooldown; when it is low (but not critical) we halve
189
- * the wave.
190
- *
191
- * Returns the adjusted wave size, binding cap, and cooldown timestamp. When no
192
- * adjustment is needed the inputs are returned unchanged.
188
+ * Cold-start per-window calibration batch: with no learned tokens_per_pct slope
189
+ * for a window and no absolute tokens_remaining, admit at most this many slots so
190
+ * the run can OBSERVE Δutilization and seed the slope. This is a BOOTSTRAP, not a
191
+ * permanent cap — once even one slope sample lands, the learned budget governs.
193
192
  */
194
- function applyQuotaSourceAdjustment(waveSize, bindingCap, cooldownUntil, quotaSourceSnapshot) {
195
- if (quotaSourceSnapshot.remaining_pct != null &&
196
- quotaSourceSnapshot.remaining_pct < QUOTA_REMAINING_PCT_CRITICAL) {
197
- return {
198
- waveSize: 1,
199
- bindingCap: waveSize > 1 ? "cooldown" : bindingCap,
200
- cooldownUntil: quotaSourceSnapshot.reset_at ?? cooldownUntil,
201
- };
193
+ export const TOKEN_BUDGET_COLD_START_SLOTS = 2;
194
+ /**
195
+ * Derive a single window's remaining token budget, in learned/absolute priority:
196
+ * 1. absolute `tokens_remaining` when the window reports one;
197
+ * 2. else the learned `tokens_per_pct[label]` × remaining_pct × 100;
198
+ * 3. else `null` (cold start the caller applies the calibration bootstrap).
199
+ */
200
+ function deriveWindowTokenBudget(windowLabel, remainingPct, tokensRemaining, learnedSlopes) {
201
+ if (typeof tokensRemaining === "number" && Number.isFinite(tokensRemaining)) {
202
+ return Math.max(0, tokensRemaining);
203
+ }
204
+ // A window reported as fully consumed (remaining fraction 0) has a KNOWN budget
205
+ // of 0 for ANY positive slope — 0 × slope = 0 — so it is knowable even with no
206
+ // learned slope. This is NOT the removed 0.1 cliff: it fires only at genuine
207
+ // emptiness (a HostSessionQuotaSource hard-limit reading, or an exhausted
208
+ // absolute count), and lets the gate throttle + persist a cooldown so a later
209
+ // transiently-null snapshot cannot re-expand a walled pool (anti-flap).
210
+ if (remainingPct != null && Number.isFinite(remainingPct) && remainingPct <= 0) {
211
+ return 0;
212
+ }
213
+ const slope = learnedSlopes?.[windowLabel];
214
+ if (typeof slope === "number" &&
215
+ Number.isFinite(slope) &&
216
+ slope > 0 &&
217
+ remainingPct != null &&
218
+ Number.isFinite(remainingPct)) {
219
+ return Math.max(0, remainingPct * 100 * slope);
202
220
  }
203
- if (quotaSourceSnapshot.remaining_pct != null &&
204
- quotaSourceSnapshot.remaining_pct < QUOTA_REMAINING_PCT_LOW) {
205
- const reduced = Math.max(1, Math.floor(waveSize * QUOTA_LOW_WAVE_MULTIPLIER));
206
- if (reduced < waveSize) {
207
- return { waveSize: reduced, bindingCap: "cooldown", cooldownUntil };
221
+ return null;
222
+ }
223
+ /**
224
+ * Resolve the pool's remaining token budget from its snapshot, reducing across
225
+ * the pool's OWN windows with MIN (the binding window governs). Uses the
226
+ * per-window breakdown when present, else the flat top-level snapshot as a
227
+ * single implicit window. Per-window: absolute → learned-slope → cold-start.
228
+ */
229
+ function deriveTokenBudget(snapshot, learnedSlopes) {
230
+ const windows = snapshot.windows && snapshot.windows.length > 0
231
+ ? snapshot.windows.map((w) => ({
232
+ label: w.label,
233
+ remaining_pct: w.remaining_pct,
234
+ tokens_remaining: w.tokens_remaining ?? null,
235
+ reset_at: w.reset_at,
236
+ }))
237
+ : [
238
+ {
239
+ label: "default",
240
+ remaining_pct: snapshot.remaining_pct,
241
+ tokens_remaining: snapshot.tokens_remaining,
242
+ reset_at: snapshot.reset_at,
243
+ },
244
+ ];
245
+ let budget = null;
246
+ let calibrating = false;
247
+ let exhaustedResetAt = null;
248
+ for (const w of windows) {
249
+ const windowBudget = deriveWindowTokenBudget(w.label, w.remaining_pct, w.tokens_remaining, learnedSlopes);
250
+ if (windowBudget == null) {
251
+ calibrating = true;
252
+ continue;
208
253
  }
254
+ // A near-empty window needs no special-case cliff: its own budget
255
+ // (remaining_pct × slope, or an absolute tokens_remaining) is already tiny,
256
+ // so the MIN reduction and the K-clamp below throttle it naturally. A
257
+ // GENUINELY empty window (budget 0) additionally records its reset so the gate
258
+ // can persist a cooldown (anti-flap).
259
+ if (windowBudget === 0 && w.reset_at != null) {
260
+ const reset = w.reset_at;
261
+ if (exhaustedResetAt == null || reset < exhaustedResetAt) {
262
+ exhaustedResetAt = reset;
263
+ }
264
+ }
265
+ budget = budget == null ? windowBudget : Math.min(budget, windowBudget);
209
266
  }
210
- return { waveSize, bindingCap, cooldownUntil };
267
+ return { budget, calibrating, exhaustedResetAt };
211
268
  }
212
269
  function sumTopN(sorted, n) {
213
270
  let sum = 0;
@@ -216,7 +273,7 @@ function sumTopN(sorted, n) {
216
273
  return sum;
217
274
  }
218
275
  function computeUncappedWaveSize(input) {
219
- const { waveSize: initialSize, limits, safetyMargin, avgTokens, slotsSorted, quotaStateEntry, hostConcurrencyLimit, providerName, quota, halfLifeHours, } = input;
276
+ const { waveSize: initialSize, limits, safetyMargin, avgTokens, slotsSorted, quotaStateEntry, quota, halfLifeHours, } = input;
220
277
  let current = initialSize;
221
278
  let bindingCap = "none";
222
279
  // Cap by requests-per-minute
@@ -249,6 +306,11 @@ function computeUncappedWaveSize(input) {
249
306
  }
250
307
  }
251
308
  }
309
+ // Learned concurrency cap (from recorded safe/failure buckets). With no learned
310
+ // history there is NO invented ceiling here: concurrency is governed solely by
311
+ // real provider limits (RPM/TPM above), the host-reported subagent ceiling
312
+ // (applied at the call site), and the token-budget gate (applied by
313
+ // scheduleWave). An unconfigured provider with no signals stays uncapped.
252
314
  if (quotaStateEntry) {
253
315
  const rampUp = quota.ramp_up_enabled !== false;
254
316
  const cap = rampUp
@@ -258,52 +320,11 @@ function computeUncappedWaveSize(input) {
258
320
  current = cap;
259
321
  bindingCap = "learned";
260
322
  }
261
- return { size: current, binding_cap: bindingCap };
262
- }
263
- else if (hostConcurrencyLimit !== null) {
264
- // The host explicitly reported its active-subagent capacity. That is a real
265
- // concurrency signal, so it supersedes the conservative unknown-provider
266
- // fallback. The reported limit is enforced as the hard ceiling by
267
- // applyHostConcurrencyLimit() at the call site, so nothing is capped here.
268
- return { size: current, binding_cap: bindingCap };
269
- }
270
- else {
271
- const classification = classifyProvider(providerName);
272
- const agentHostFloor = isCapableAgentHost(providerName)
273
- ? classification.concurrencyFloor
274
- : 1;
275
- const fallbackCap = classification.hostClass === "local"
276
- ? quota.unknown_local_concurrency
277
- : (quota.unknown_hosted_concurrency ?? agentHostFloor);
278
- if (fallbackCap === "unlimited") {
279
- // no cap — "unlimited" intentionally skips clamping
280
- }
281
- else if (typeof fallbackCap === "number" && Number.isFinite(fallbackCap)) {
282
- const cap = Math.max(1, Math.floor(fallbackCap));
283
- if (cap < current) {
284
- current = cap;
285
- bindingCap = "fallback";
286
- }
287
- }
288
- // First-contact cap: when no learned history, no configured fallback, AND
289
- // no RPM/TPM limits from any source, apply a conservative ceiling.
290
- // This triggers only for unconfigured local providers (fallbackCap is
291
- // undefined). Hosted providers default to 1 via unknown_hosted_concurrency,
292
- // and "unlimited" is an explicit opt-out.
293
- if (fallbackCap == null &&
294
- limits.requests_per_minute == null &&
295
- limits.input_tokens_per_minute == null) {
296
- const firstContactCap = Math.max(1, quota.first_contact_concurrency ?? classification.concurrencyFloor);
297
- if (firstContactCap < current) {
298
- current = firstContactCap;
299
- bindingCap = "first_contact";
300
- }
301
- }
302
- return { size: current, binding_cap: bindingCap };
303
323
  }
324
+ return { size: current, binding_cap: bindingCap };
304
325
  }
305
326
  export function scheduleWave(options) {
306
- const { providerName, sessionConfig, hostModel, requestedConcurrency, estimatedSlotTokens, quotaStateEntry = null, hostConcurrencyLimit = null, quotaSourceSnapshot = null, discoveredLimits = null, } = options;
327
+ const { providerName, sessionConfig, hostModel, requestedConcurrency, estimatedSlotTokens, quotaStateEntry = null, hostConcurrencyLimit = null, quotaSourceSnapshot = null, discoveredLimits = null, inFlightTokens = 0, } = options;
307
328
  // Descending sort so sumTopN picks the largest slots
308
329
  const slotsSorted = estimatedSlotTokens
309
330
  ? [...estimatedSlotTokens].sort((a, b) => b - a)
@@ -356,8 +377,8 @@ export function scheduleWave(options) {
356
377
  }
357
378
  }
358
379
  // During an active cooldown we throttle to a single request and skip all cap
359
- // logic; otherwise apply RPM/TPM and learned/fallback caps. The host-concurrency
360
- // ceiling is enforced uniformly below by applyHostConcurrencyLimit().
380
+ // logic; otherwise apply RPM/TPM and learned caps. The token-budget gate and
381
+ // host-concurrency ceiling are applied below.
361
382
  let waveSize = requestedConcurrency;
362
383
  let bindingCap = "none";
363
384
  if (cooldownUntil) {
@@ -372,17 +393,70 @@ export function scheduleWave(options) {
372
393
  avgTokens,
373
394
  slotsSorted,
374
395
  quotaStateEntry,
375
- hostConcurrencyLimit,
376
- providerName,
377
396
  quota,
378
397
  halfLifeHours,
379
398
  });
380
399
  waveSize = uncapped.size;
381
400
  bindingCap = uncapped.binding_cap;
382
401
  }
383
- // Apply real-time quota source data if available (strongest live signal).
402
+ // Token-budget gate (the everything-agnostic live cap). When a live snapshot is
403
+ // present and no cooldown is active, cap concurrency to the largest K whose
404
+ // top-K slot tokens plus the pool's in-flight tokens fit the pool's remaining
405
+ // token budget (MIN across the pool's own windows), safety-scaled. A window
406
+ // that is (near) exhausted forces cooldown to its reset_at. A cold-start window
407
+ // (no absolute tokens, no learned slope) admits a small calibration batch so
408
+ // the run can observe Δutilization and seed the slope.
409
+ // The remaining token budget the gate spent against (MIN across the pool's own
410
+ // windows), stamped on the schedule so the host-facing summary surfaces the SAME
411
+ // number the gate used — never a re-derived one. null when no live snapshot, or
412
+ // cold-start (no absolute/learned budget for any window yet).
413
+ let remainingTokenBudget = null;
384
414
  if (quotaSourceSnapshot && !cooldownUntil) {
385
- ({ waveSize, bindingCap, cooldownUntil } = applyQuotaSourceAdjustment(waveSize, bindingCap, cooldownUntil, quotaSourceSnapshot));
415
+ const { budget, calibrating, exhaustedResetAt } = deriveTokenBudget(quotaSourceSnapshot, quotaStateEntry?.tokens_per_pct);
416
+ remainingTokenBudget = budget;
417
+ if (budget === 0) {
418
+ // A genuinely empty window (remaining fraction 0 / absolute count 0):
419
+ // throttle to 1 and persist a cooldown to its reset so a later transiently
420
+ // -null snapshot cannot re-expand the walled pool (anti-flap, CE-010).
421
+ const beforeBudget = waveSize;
422
+ waveSize = 1;
423
+ cooldownUntil = exhaustedResetAt ?? quotaSourceSnapshot.reset_at ?? cooldownUntil;
424
+ if (cooldownUntil)
425
+ bindingCap = "cooldown";
426
+ else if (beforeBudget > 1)
427
+ bindingCap = "token_budget";
428
+ }
429
+ else if (budget != null) {
430
+ const budgetTokens = budget * safetyMargin;
431
+ let k = waveSize;
432
+ if (slotsSorted && slotsSorted.length > 0) {
433
+ while (k > 1 && sumTopN(slotsSorted, k) + inFlightTokens > budgetTokens)
434
+ k--;
435
+ }
436
+ else if (avgTokens > 0) {
437
+ k = Math.max(1, Math.floor((budgetTokens - inFlightTokens) / avgTokens));
438
+ }
439
+ // If another of the pool's own windows is still cold (no absolute + no
440
+ // learned slope), that window can't be budgeted yet — clamp to the
441
+ // per-window cold-start batch too so a healthy window's budget can't
442
+ // over-dispatch an un-calibrated one (MIN across the pool's windows).
443
+ if (calibrating)
444
+ k = Math.min(k, TOKEN_BUDGET_COLD_START_SLOTS);
445
+ k = Math.max(1, k);
446
+ if (k < waveSize) {
447
+ waveSize = k;
448
+ bindingCap = "token_budget";
449
+ }
450
+ }
451
+ else if (calibrating) {
452
+ // Cold start: no window has an absolute or learned budget. Admit a small
453
+ // bounded batch to observe Δutilization and seed the slope — a bootstrap,
454
+ // not a permanent ceiling.
455
+ if (TOKEN_BUDGET_COLD_START_SLOTS < waveSize) {
456
+ waveSize = TOKEN_BUDGET_COLD_START_SLOTS;
457
+ bindingCap = "token_budget";
458
+ }
459
+ }
386
460
  }
387
461
  const beforeHostCap = waveSize;
388
462
  waveSize = applyHostConcurrencyLimit(waveSize);
@@ -400,6 +474,8 @@ export function scheduleWave(options) {
400
474
  model: hostModel,
401
475
  quota_source_snapshot: quotaSourceSnapshot,
402
476
  binding_cap: bindingCap,
477
+ remaining_token_budget: remainingTokenBudget,
478
+ in_flight_tokens: inFlightTokens,
403
479
  };
404
480
  }
405
481
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../src/shared/quota/scheduler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../src/shared/quota/scheduler.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,28 @@ export declare function readQuotaState(): Promise<QuotaState>;
8
8
  export declare function writeQuotaState(state: QuotaState): Promise<void>;
9
9
  export declare function computeMaxSafeConcurrency(entry: QuotaStateEntry, halfLifeHours: number, maxToCheck?: number): number;
10
10
  export declare function computeRampUpConcurrency(entry: QuotaStateEntry, halfLifeHours: number, maxToCheck?: number): number;
11
+ export declare const TOKENS_PER_PCT_EWMA_ALPHA = 0.3;
12
+ export declare const MIN_SLOPE_DELTA_PERCENT = 0.5;
13
+ /**
14
+ * Fold one tokens→percent slope observation into a window's learned EWMA slope,
15
+ * returning the updated map (pure — never mutates the input). Given a prior and
16
+ * new remaining_pct (0–1 fractions) for the SAME window label plus the tokens
17
+ * dispatched between the two readings, computes `slope = Δtokens / Δpercent`
18
+ * (percent = remaining_pct*100) and blends it into the label's EWMA.
19
+ *
20
+ * Degrade-safe: returns the prior map unchanged when Δpercent is not meaningfully
21
+ * positive (≥ {@link MIN_SLOPE_DELTA_PERCENT}), when tokens are non-positive, or
22
+ * when any input is non-finite. Never throws.
23
+ */
24
+ export declare function foldTokensPerPctObservation(prior: Record<string, number> | undefined, windowLabel: string, priorRemainingPct: number, newRemainingPct: number, tokensDispatched: number): Record<string, number>;
25
+ /**
26
+ * Persist a folded tokens_per_pct observation for a pool's quota-state entry,
27
+ * under the shared quota-state file lock. Reads the current entry (or a blank
28
+ * one), folds the observation via {@link foldTokensPerPctObservation}, and writes
29
+ * back. Degrade-safe: a missing/unreadable state file falls to a blank entry;
30
+ * an observation that doesn't move the slope leaves the file untouched-in-value.
31
+ */
32
+ export declare function recordTokensPerPctObservation(providerModelKey: string, windowLabel: string, priorRemainingPct: number, newRemainingPct: number, tokensDispatched: number): Promise<void>;
11
33
  export declare const BASE_COOLDOWN_MS = 60000;
12
34
  export declare const MAX_COOLDOWN_MS: number;
13
35
  export declare function computeBackoffCooldownMs(consecutive429Count: number): number;
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/state.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAqB,mBAAmB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAWtG,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAKnC,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAGlD;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAG1C;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,MAAM,CAGR;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,eAAe,EACtB,aAAa,EAAE,MAAM,GACpB,eAAe,CAWjB;AASD,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC,CA2B1D;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtE;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,eAAe,EACtB,aAAa,EAAE,MAAM,EACrB,UAAU,SAAmB,GAC5B,MAAM,CAgBR;AAID,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,eAAe,EACtB,aAAa,EAAE,MAAM,EACrB,UAAU,SAAmB,GAC5B,MAAM,CAYR;AAMD,eAAO,MAAM,gBAAgB,QAAS,CAAC;AACvC,eAAO,MAAM,eAAe,QAAc,CAAC;AAE3C,wBAAgB,wBAAwB,CAAC,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAG5E;AAED,wBAAgB,2BAA2B,CAAC,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED,wBAAsB,iBAAiB,CACrC,gBAAgB,EAAE,MAAM,EACxB,OAAO,EAAE,mBAAmB,EAC5B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;;;;;;;;GASG;AACH,wBAAsB,0BAA0B,CAC9C,gBAAgB,EAAE,MAAM,EACxB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAaf"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/state.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAqB,mBAAmB,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAWtG,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAKnC,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAGlD;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAG1C;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,MAAM,CAGR;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,eAAe,EACtB,aAAa,EAAE,MAAM,GACpB,eAAe,CAWjB;AASD,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,CAAC,CA2B1D;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtE;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,eAAe,EACtB,aAAa,EAAE,MAAM,EACrB,UAAU,SAAmB,GAC5B,MAAM,CAgBR;AAID,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,eAAe,EACtB,aAAa,EAAE,MAAM,EACrB,UAAU,SAAmB,GAC5B,MAAM,CAYR;AAKD,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAI7C,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAE3C;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACzC,WAAW,EAAE,MAAM,EACnB,iBAAiB,EAAE,MAAM,EACzB,eAAe,EAAE,MAAM,EACvB,gBAAgB,EAAE,MAAM,GACvB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqBxB;AAED;;;;;;GAMG;AACH,wBAAsB,6BAA6B,CACjD,gBAAgB,EAAE,MAAM,EACxB,WAAW,EAAE,MAAM,EACnB,iBAAiB,EAAE,MAAM,EACzB,eAAe,EAAE,MAAM,EACvB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,IAAI,CAAC,CAiBf;AAMD,eAAO,MAAM,gBAAgB,QAAS,CAAC;AACvC,eAAO,MAAM,eAAe,QAAc,CAAC;AAE3C,wBAAgB,wBAAwB,CAAC,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAG5E;AAED,wBAAgB,2BAA2B,CAAC,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED,wBAAsB,iBAAiB,CACrC,gBAAgB,EAAE,MAAM,EACxB,OAAO,EAAE,mBAAmB,EAC5B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;;;;;;;;GASG;AACH,wBAAsB,0BAA0B,CAC9C,gBAAgB,EAAE,MAAM,EACxB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAaf"}
@@ -106,6 +106,65 @@ export function computeRampUpConcurrency(entry, halfLifeHours, maxToCheck = MAX_
106
106
  }
107
107
  return maxSafe;
108
108
  }
109
+ // EWMA weight for a new tokens_per_pct observation folded into the running
110
+ // slope. 0.3 = responsive but not jumpy; a run flipping between windows still
111
+ // converges each window's own slope within a few observations.
112
+ export const TOKENS_PER_PCT_EWMA_ALPHA = 0.3;
113
+ // Minimum meaningful Δpercent (percent = remaining_pct*100) before we trust a
114
+ // slope sample. Below this the denominator is noise (rounding / a snapshot that
115
+ // barely moved) and Δtokens/Δpercent explodes — skip it.
116
+ export const MIN_SLOPE_DELTA_PERCENT = 0.5;
117
+ /**
118
+ * Fold one tokens→percent slope observation into a window's learned EWMA slope,
119
+ * returning the updated map (pure — never mutates the input). Given a prior and
120
+ * new remaining_pct (0–1 fractions) for the SAME window label plus the tokens
121
+ * dispatched between the two readings, computes `slope = Δtokens / Δpercent`
122
+ * (percent = remaining_pct*100) and blends it into the label's EWMA.
123
+ *
124
+ * Degrade-safe: returns the prior map unchanged when Δpercent is not meaningfully
125
+ * positive (≥ {@link MIN_SLOPE_DELTA_PERCENT}), when tokens are non-positive, or
126
+ * when any input is non-finite. Never throws.
127
+ */
128
+ export function foldTokensPerPctObservation(prior, windowLabel, priorRemainingPct, newRemainingPct, tokensDispatched) {
129
+ const base = prior ?? {};
130
+ if (!Number.isFinite(priorRemainingPct) ||
131
+ !Number.isFinite(newRemainingPct) ||
132
+ !Number.isFinite(tokensDispatched) ||
133
+ tokensDispatched <= 0) {
134
+ return base;
135
+ }
136
+ // Percent DROP as quota is consumed: prior − new, on the 0–100 scale.
137
+ const deltaPercent = (priorRemainingPct - newRemainingPct) * 100;
138
+ if (deltaPercent < MIN_SLOPE_DELTA_PERCENT)
139
+ return base;
140
+ const sampleSlope = tokensDispatched / deltaPercent;
141
+ if (!Number.isFinite(sampleSlope) || sampleSlope <= 0)
142
+ return base;
143
+ const previous = base[windowLabel];
144
+ const blended = typeof previous === "number" && Number.isFinite(previous) && previous > 0
145
+ ? previous * (1 - TOKENS_PER_PCT_EWMA_ALPHA) + sampleSlope * TOKENS_PER_PCT_EWMA_ALPHA
146
+ : sampleSlope;
147
+ return { ...base, [windowLabel]: blended };
148
+ }
149
+ /**
150
+ * Persist a folded tokens_per_pct observation for a pool's quota-state entry,
151
+ * under the shared quota-state file lock. Reads the current entry (or a blank
152
+ * one), folds the observation via {@link foldTokensPerPctObservation}, and writes
153
+ * back. Degrade-safe: a missing/unreadable state file falls to a blank entry;
154
+ * an observation that doesn't move the slope leaves the file untouched-in-value.
155
+ */
156
+ export async function recordTokensPerPctObservation(providerModelKey, windowLabel, priorRemainingPct, newRemainingPct, tokensDispatched) {
157
+ const lockPath = getQuotaStatePath() + ".lock";
158
+ await withFileLock(lockPath, async () => {
159
+ const state = await readQuotaState();
160
+ const entry = state.entries[providerModelKey] ?? blankEntry();
161
+ const updated = foldTokensPerPctObservation(entry.tokens_per_pct, windowLabel, priorRemainingPct, newRemainingPct, tokensDispatched);
162
+ entry.tokens_per_pct = updated;
163
+ entry.updated_at = new Date().toISOString();
164
+ state.entries[providerModelKey] = entry;
165
+ await writeQuotaState(state);
166
+ });
167
+ }
109
168
  function blankEntry() {
110
169
  return { updated_at: new Date().toISOString(), buckets: {}, cooldown_until: null, last_429_at: null };
111
170
  }
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/shared/quota/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,+EAA+E;AAC/E,gFAAgF;AAChF,mDAAmD;AACnD,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACjC,iFAAiF;AACjF,gFAAgF;AAChF,+DAA+D;AAC/D,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC,IAAI,SAA6B,CAAC;AAClC,IAAI,UAA8B,CAAC;AAEnC,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,SAAS,GAAG,GAAG,CAAC;IAChB,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,MAAM,UAAU,WAAW,CACzB,MAAc,EACd,YAAoB,EACpB,aAAqB;IAErB,IAAI,aAAa,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAChD,OAAO,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,GAAG,aAAa,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,KAAsB,EACtB,aAAqB;IAErB,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5F,IAAI,YAAY,GAAG,KAAK;QAAE,OAAO,KAAK,CAAC;IACvC,MAAM,OAAO,GAAsC,EAAE,CAAC;IACtD,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,GAAG;YACb,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,cAAc,EAAE,YAAY,EAAE,aAAa,CAAC;YAC/E,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,cAAc,EAAE,YAAY,EAAE,aAAa,CAAC;SAChF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACxC,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,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;gBACzB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;oBAClD,KAAK,CAAC,qBAAqB,KAAK,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,2CAA2C,SAAS,gDAAgD,CACrG,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACrC,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,8CAA8C,SAAS,KACrD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,IAAI,CACL,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAiB;IACrD,MAAM,QAAQ,GAAG,SAAS,CAAC;IAC3B,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC3F,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAe,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACxD,MAAM,SAAS,CAAC,iBAAiB,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,KAAsB,EACtB,aAAqB,EACrB,UAAU,GAAG,gBAAgB;IAE7B,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACxD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,MAAM;QACnB,IACE,MAAM,CAAC,cAAc,IAAI,mBAAmB;YAC5C,MAAM,CAAC,cAAc,GAAG,mBAAmB,EAC3C,CAAC;YACD,OAAO,GAAG,CAAC,CAAC;QACd,CAAC;aAAM,CAAC;YACN,MAAM;QACR,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEhC,MAAM,UAAU,wBAAwB,CACtC,KAAsB,EACtB,aAAqB,EACrB,UAAU,GAAG,gBAAgB;IAE7B,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAChD,IACE,MAAM;QACN,MAAM,CAAC,cAAc,IAAI,qBAAqB;QAC9C,MAAM,CAAC,cAAc,GAAG,mBAAmB,EAC3C,CAAC;QACD,OAAO,OAAO,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AACxG,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,MAAM,UAAU,2BAA2B,CAAC,mBAA2B;IACrE,OAAO,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,mBAAmB,GAAG,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,gBAAwB,EACxB,OAA4B,EAC5B,aAAqB;IAErB,MAAM,QAAQ,GAAG,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAC/C,MAAM,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,uBAAuB,CAAC,gBAAgB,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;AACxG,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,gBAAwB,EACxB,WAAmB;IAEnB,MAAM,QAAQ,GAAG,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAC/C,MAAM,YAAY,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC;QAC1B,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,KAAK,UAAU,uBAAuB,CACpC,gBAAwB,EACxB,OAA4B,EAC5B,aAAqB;IAErB,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,UAAU,EAAE,EAAE,aAAa,CAAC,CAAC;IAEhG,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAClC,KAAK,CAAC,qBAAqB,GAAG,CAAC,CAAC;QAChC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;QAC5B,oEAAoE;QACpE,uEAAuE;QACvE,8DAA8D;QAC9D,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;QACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;YACpF,MAAM,CAAC,cAAc,IAAI,GAAG,CAAC;YAC7B,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QACpC,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;QAED,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,KAAK,cAAc;YACtD,CAAC,CAAC,2BAA2B,CAAC,WAAW,CAAC;YAC1C,CAAC,CAAC,GAAG,CAAC;QACR,2DAA2D;QAC3D,2DAA2D;QAC3D,sEAAsE;QACtE,yEAAyE;QACzE,+BAA+B;QAC/B,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAC7B,OAAO,CAAC,WAAW,GAAG,sBAAsB,EAC5C,gBAAgB,GAAG,sBAAsB,CAC1C,CAAC;QACF,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;YACpF,MAAM,CAAC,cAAc,IAAI,aAAa,CAAC;YACvC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QACpC,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"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/shared/quota/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Render the per-dispatch-target TOKEN BUDGET VIEW for the orchestrating host, from
3
+ * a written `dispatch-quota.json`. This surfaces the real constraints the host
4
+ * driver dispatches against — per pool: the remaining quota %, the remaining token
5
+ * budget the gate spent against (MIN across that pool's own windows), the tokens
6
+ * already in flight, the reset horizon, and which cap bound the wave — plus the
7
+ * total upcoming (pending) token load. Concurrency is governed ONLY by the
8
+ * provider/IDE subagent allowance and this token budget; the view makes both
9
+ * legible instead of an opaque slot count.
10
+ *
11
+ * Shared so both orchestrators surface the IDENTICAL block (no drift). Reads the
12
+ * contract's `capacity_pools[]` defensively; returns "" when the file is
13
+ * absent/unreadable or no pool carries any quota/budget signal (a quota-disabled
14
+ * or no-snapshot run adds nothing to the prompt).
15
+ */
16
+ export declare function renderTokenBudgetView(quotaPath: string | null | undefined): string;
17
+ //# sourceMappingURL=tokenBudgetView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenBudgetView.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/tokenBudgetView.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAuElF"}
@@ -0,0 +1,77 @@
1
+ import { readFileSync } from "node:fs";
2
+ /**
3
+ * Render the per-dispatch-target TOKEN BUDGET VIEW for the orchestrating host, from
4
+ * a written `dispatch-quota.json`. This surfaces the real constraints the host
5
+ * driver dispatches against — per pool: the remaining quota %, the remaining token
6
+ * budget the gate spent against (MIN across that pool's own windows), the tokens
7
+ * already in flight, the reset horizon, and which cap bound the wave — plus the
8
+ * total upcoming (pending) token load. Concurrency is governed ONLY by the
9
+ * provider/IDE subagent allowance and this token budget; the view makes both
10
+ * legible instead of an opaque slot count.
11
+ *
12
+ * Shared so both orchestrators surface the IDENTICAL block (no drift). Reads the
13
+ * contract's `capacity_pools[]` defensively; returns "" when the file is
14
+ * absent/unreadable or no pool carries any quota/budget signal (a quota-disabled
15
+ * or no-snapshot run adds nothing to the prompt).
16
+ */
17
+ export function renderTokenBudgetView(quotaPath) {
18
+ if (!quotaPath)
19
+ return "";
20
+ let pools;
21
+ let upcomingTokens;
22
+ try {
23
+ const data = JSON.parse(readFileSync(quotaPath, "utf8"));
24
+ pools = Array.isArray(data?.capacity_pools) ? data.capacity_pools : [];
25
+ upcomingTokens =
26
+ typeof data?.estimated_wave_tokens === "number" ? data.estimated_wave_tokens : null;
27
+ }
28
+ catch {
29
+ return "";
30
+ }
31
+ // Only render when at least one pool carries a live snapshot or a derived budget
32
+ // — otherwise there is no token-budget signal worth showing.
33
+ const rows = pools.filter((p) => p?.quota_source_snapshot != null ||
34
+ (typeof p?.remaining_token_budget === "number" && p.remaining_token_budget != null));
35
+ if (rows.length === 0)
36
+ return "";
37
+ const lines = [];
38
+ lines.push("### Dispatch token budget (per target)");
39
+ lines.push("Concurrency is governed by your provider/IDE subagent allowance and the token " +
40
+ "budget below — dispatch within these, not a fixed slot count. A pool's budget is " +
41
+ "the MIN across its own quota windows; when a budget is unknown (cold start) the " +
42
+ "tool admits a small calibration batch to learn it.");
43
+ lines.push("");
44
+ lines.push("| Target | Slots | Remaining | Budget (tok) | In-flight (tok) | Resets | Bound by |");
45
+ lines.push("|---|---|---|---|---|---|---|");
46
+ for (const p of rows) {
47
+ const snap = p.quota_source_snapshot ?? null;
48
+ const remainingPct = snap && typeof snap.remaining_pct === "number"
49
+ ? `${Math.round(snap.remaining_pct * 100)}%`
50
+ : "—";
51
+ const budget = typeof p.remaining_token_budget === "number" && p.remaining_token_budget != null
52
+ ? Math.round(p.remaining_token_budget).toLocaleString("en-US")
53
+ : "cold-start";
54
+ const inFlight = typeof p.in_flight_tokens === "number"
55
+ ? Math.round(p.in_flight_tokens).toLocaleString("en-US")
56
+ : "0";
57
+ const reset = snap?.reset_at ?? "—";
58
+ lines.push(`| \`${String(p.pool_id ?? "?")}\` | ${p.slots ?? "?"} | ${remainingPct} | ${budget} | ` +
59
+ `${inFlight} | ${reset} | ${p.binding_cap ?? "none"} |`);
60
+ // Per-window breakdown when the provider exposes multiple windows that scale
61
+ // differently (e.g. a 5-hour session vs a 7-day weekly window).
62
+ const windows = Array.isArray(snap?.windows) ? snap.windows : [];
63
+ if (windows.length > 1) {
64
+ const parts = windows
65
+ .filter((w) => w && typeof w.remaining_pct === "number")
66
+ .map((w) => `${w.label}: ${Math.round(w.remaining_pct * 100)}%`);
67
+ if (parts.length > 0)
68
+ lines.push(`| ↳ windows | | ${parts.join(", ")} | | | | |`);
69
+ }
70
+ }
71
+ if (upcomingTokens != null) {
72
+ lines.push("");
73
+ lines.push(`Upcoming (this wave) estimated input load: **~${Math.round(upcomingTokens).toLocaleString("en-US")} tok**.`);
74
+ }
75
+ return lines.join("\n");
76
+ }
77
+ //# sourceMappingURL=tokenBudgetView.js.map