audit-tools 0.32.55 → 0.32.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/audit/cli/dispatch/pausePersist.d.ts +60 -0
- package/dist/audit/cli/dispatch/pausePersist.d.ts.map +1 -0
- package/dist/audit/cli/dispatch/pausePersist.js +110 -0
- package/dist/audit/cli/dispatch/pausePersist.js.map +1 -0
- package/dist/audit/cli/dispatch/types.d.ts +12 -0
- package/dist/audit/cli/dispatch/types.d.ts.map +1 -1
- package/dist/audit/cli/dispatch.d.ts.map +1 -1
- package/dist/audit/cli/dispatch.js +49 -1
- package/dist/audit/cli/dispatch.js.map +1 -1
- package/dist/audit/cli/mergeAndIngestCommand.d.ts +9 -0
- package/dist/audit/cli/mergeAndIngestCommand.d.ts.map +1 -1
- package/dist/audit/cli/mergeAndIngestCommand.js +2 -27
- package/dist/audit/cli/mergeAndIngestCommand.js.map +1 -1
- package/dist/audit/cli/nextStepCommand.d.ts +0 -10
- package/dist/audit/cli/nextStepCommand.d.ts.map +1 -1
- package/dist/audit/cli/nextStepCommand.js +3 -33
- package/dist/audit/cli/nextStepCommand.js.map +1 -1
- package/dist/audit/cli/rollingAuditDispatch.d.ts.map +1 -1
- package/dist/audit/cli/rollingAuditDispatch.js +55 -115
- package/dist/audit/cli/rollingAuditDispatch.js.map +1 -1
- package/dist/audit/cli/semanticReviewStep.d.ts.map +1 -1
- package/dist/audit/cli/semanticReviewStep.js +41 -0
- package/dist/audit/cli/semanticReviewStep.js.map +1 -1
- package/dist/audit/orchestrator/intentScopeDisposition.d.ts +14 -24
- package/dist/audit/orchestrator/intentScopeDisposition.d.ts.map +1 -1
- package/dist/audit/orchestrator/intentScopeDisposition.js +17 -35
- package/dist/audit/orchestrator/intentScopeDisposition.js.map +1 -1
- package/dist/audit/orchestrator/scope.d.ts +0 -1
- package/dist/audit/orchestrator/scope.d.ts.map +1 -1
- package/dist/audit/orchestrator/scope.js +2 -4
- package/dist/audit/orchestrator/scope.js.map +1 -1
- package/dist/audit/reporting/mergeFindings.d.ts.map +1 -1
- package/dist/audit/reporting/mergeFindings.js +17 -222
- package/dist/audit/reporting/mergeFindings.js.map +1 -1
- package/dist/audit/systemic/systemicChallengeLoop.d.ts.map +1 -1
- package/dist/audit/systemic/systemicChallengeLoop.js +3 -8
- package/dist/audit/systemic/systemicChallengeLoop.js.map +1 -1
- package/dist/remediate/dedup/crossLensDedup.d.ts +11 -4
- package/dist/remediate/dedup/crossLensDedup.d.ts.map +1 -1
- package/dist/remediate/dedup/crossLensDedup.js +27 -146
- package/dist/remediate/dedup/crossLensDedup.js.map +1 -1
- package/dist/remediate/index.d.ts +0 -10
- package/dist/remediate/index.d.ts.map +1 -1
- package/dist/remediate/index.js +1 -32
- package/dist/remediate/index.js.map +1 -1
- package/dist/remediate/intent/checkpointFilter.d.ts +4 -3
- package/dist/remediate/intent/checkpointFilter.d.ts.map +1 -1
- package/dist/remediate/intent/checkpointFilter.js +12 -53
- package/dist/remediate/intent/checkpointFilter.js.map +1 -1
- package/dist/remediate/steps/dispatch/marshal.d.ts.map +1 -1
- package/dist/remediate/steps/dispatch/marshal.js +2 -29
- package/dist/remediate/steps/dispatch/marshal.js.map +1 -1
- package/dist/remediate/steps/nextStep.d.ts.map +1 -1
- package/dist/remediate/steps/nextStep.js +48 -4
- package/dist/remediate/steps/nextStep.js.map +1 -1
- package/dist/remediate/steps/providerNodeDispatch.d.ts.map +1 -1
- package/dist/remediate/steps/providerNodeDispatch.js +12 -53
- package/dist/remediate/steps/providerNodeDispatch.js.map +1 -1
- package/dist/remediate/steps/rollingSession.d.ts +13 -0
- package/dist/remediate/steps/rollingSession.d.ts.map +1 -1
- package/dist/remediate/steps/rollingSession.js +35 -1
- package/dist/remediate/steps/rollingSession.js.map +1 -1
- package/dist/remediate/validation/contractPipelineGates.d.ts.map +1 -1
- package/dist/remediate/validation/contractPipelineGates.js +13 -4
- package/dist/remediate/validation/contractPipelineGates.js.map +1 -1
- package/dist/shared/dispatch/admissionLeaseReconcile.d.ts +20 -0
- package/dist/shared/dispatch/admissionLeaseReconcile.d.ts.map +1 -0
- package/dist/shared/dispatch/admissionLeaseReconcile.js +36 -0
- package/dist/shared/dispatch/admissionLeaseReconcile.js.map +1 -0
- package/dist/shared/dispatch/admissionLoop.d.ts +7 -0
- package/dist/shared/dispatch/admissionLoop.d.ts.map +1 -1
- package/dist/shared/dispatch/admissionLoop.js +6 -0
- package/dist/shared/dispatch/admissionLoop.js.map +1 -1
- package/dist/shared/dispatch/hostDispatchWall.d.ts +34 -0
- package/dist/shared/dispatch/hostDispatchWall.d.ts.map +1 -0
- package/dist/shared/dispatch/hostDispatchWall.js +15 -0
- package/dist/shared/dispatch/hostDispatchWall.js.map +1 -0
- package/dist/shared/dispatch/providerLaunchFinalize.d.ts +49 -0
- package/dist/shared/dispatch/providerLaunchFinalize.d.ts.map +1 -0
- package/dist/shared/dispatch/providerLaunchFinalize.js +90 -0
- package/dist/shared/dispatch/providerLaunchFinalize.js.map +1 -0
- package/dist/shared/dispatch/rollingDispatch.d.ts +0 -15
- package/dist/shared/dispatch/rollingDispatch.d.ts.map +1 -1
- package/dist/shared/dispatch/rollingDispatch.js +5 -0
- package/dist/shared/dispatch/rollingDispatch.js.map +1 -1
- package/dist/shared/findings/dedupe.d.ts +106 -0
- package/dist/shared/findings/dedupe.d.ts.map +1 -0
- package/dist/shared/findings/dedupe.js +304 -0
- package/dist/shared/findings/dedupe.js.map +1 -0
- package/dist/shared/index.d.ts +9 -1
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +7 -1
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/intake/guidanceBootstrap.d.ts +13 -0
- package/dist/shared/intake/guidanceBootstrap.d.ts.map +1 -0
- package/dist/shared/intake/guidanceBootstrap.js +36 -0
- package/dist/shared/intake/guidanceBootstrap.js.map +1 -0
- package/dist/shared/intent/pathScope.d.ts +27 -0
- package/dist/shared/intent/pathScope.d.ts.map +1 -0
- package/dist/shared/intent/pathScope.js +99 -0
- package/dist/shared/intent/pathScope.js.map +1 -0
- package/dist/shared/quota/reservationLedger.d.ts +11 -0
- package/dist/shared/quota/reservationLedger.d.ts.map +1 -1
- package/dist/shared/quota/reservationLedger.js +40 -0
- package/dist/shared/quota/reservationLedger.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single authority for intent path-scope matching + structured-exclusion policy,
|
|
3
|
+
* shared by both orchestrators so their scope decisions can never drift. Audit
|
|
4
|
+
* (review scope: `intentScopeDisposition.ts`) and remediate (write scope:
|
|
5
|
+
* `checkpointFilter.ts`) previously carried byte-identical prefix predicates AND
|
|
6
|
+
* consulted DIFFERENT checkpoint fields (audit honored `disposition_overrides` but
|
|
7
|
+
* ignored `must_not_touch`; remediate the reverse) — the exact latent scope-policy
|
|
8
|
+
* drift the auditor-agnostic-robustness rule bans. Both now consume this module, so
|
|
9
|
+
* a checkpoint yields the SAME per-file exclusion on both sides.
|
|
10
|
+
*
|
|
11
|
+
* All matching is case-sensitive and OS-agnostic (separators normalized to "/").
|
|
12
|
+
*/
|
|
13
|
+
function normalize(p) {
|
|
14
|
+
return p.replace(/\\/g, "/");
|
|
15
|
+
}
|
|
16
|
+
/** Exact path or directory-prefix match (e.g. "src/api" matches "src/api/x.ts"). */
|
|
17
|
+
export function pathMatchesPrefix(filePath, entryPath) {
|
|
18
|
+
const f = normalize(filePath);
|
|
19
|
+
const p = normalize(entryPath).replace(/\/+$/, "");
|
|
20
|
+
if (!p)
|
|
21
|
+
return false;
|
|
22
|
+
return f === p || f.startsWith(`${p}/`);
|
|
23
|
+
}
|
|
24
|
+
/** Minimal glob match supporting `*` (within a segment), `**` (across segments), `?`. */
|
|
25
|
+
export function globMatches(filePath, glob) {
|
|
26
|
+
const f = normalize(filePath);
|
|
27
|
+
const g = normalize(glob);
|
|
28
|
+
if (!g.includes("*") && !g.includes("?")) {
|
|
29
|
+
return pathMatchesPrefix(f, g);
|
|
30
|
+
}
|
|
31
|
+
// Translate the glob to a regex char-by-char so `*` / `**` / `?` are handled
|
|
32
|
+
// and every other character is escaped — no placeholder substitution.
|
|
33
|
+
let re = "";
|
|
34
|
+
for (let i = 0; i < g.length; i++) {
|
|
35
|
+
const c = g[i];
|
|
36
|
+
if (c === "*") {
|
|
37
|
+
if (g[i + 1] === "*") {
|
|
38
|
+
re += ".*";
|
|
39
|
+
i++;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
re += "[^/]*";
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else if (c === "?") {
|
|
46
|
+
re += "[^/]";
|
|
47
|
+
}
|
|
48
|
+
else if (/[.+^${}()|[\]\\]/.test(c)) {
|
|
49
|
+
re += `\\${c}`;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
re += c;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return new RegExp(`^${re}$`).test(f);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* `disposition_overrides` statuses that mean "out of scope" for BOTH orchestrators.
|
|
59
|
+
* `binary` / `doc_only` are dispositions but not exclusions, so they are absent.
|
|
60
|
+
*/
|
|
61
|
+
export const EXCLUDED_OVERRIDE_STATUSES = new Set([
|
|
62
|
+
"excluded",
|
|
63
|
+
"generated",
|
|
64
|
+
"vendor",
|
|
65
|
+
]);
|
|
66
|
+
/**
|
|
67
|
+
* Whether a single file is excluded by the checkpoint's STRUCTURED scope, and the
|
|
68
|
+
* human reason when it is (null when in scope). Consults ALL exclusion fields so the
|
|
69
|
+
* two orchestrators cover the same scope:
|
|
70
|
+
* - `excluded_scope` (path/prefix + its reason),
|
|
71
|
+
* - `disposition_overrides` with an excluded status (path/prefix + its reason),
|
|
72
|
+
* - `must_not_touch` globs (write-forbidden ⇒ also out of review/remediation scope;
|
|
73
|
+
* a synthesized reason since the entry is a bare glob).
|
|
74
|
+
* Precedence follows that field order (first match wins). Never reads
|
|
75
|
+
* `free_form_intent` (interpreted into priority/lens signals, never verbatim, INV-S04).
|
|
76
|
+
*
|
|
77
|
+
* The AGGREGATION over a unit's / finding's files (audit: excluded only when EVERY
|
|
78
|
+
* file is excluded; remediate: dropped when ANY file is excluded) stays the caller's
|
|
79
|
+
* domain policy — only the per-file field coverage is single-sourced here.
|
|
80
|
+
*/
|
|
81
|
+
export function fileExclusionReason(filePath, checkpoint) {
|
|
82
|
+
if (!checkpoint)
|
|
83
|
+
return null;
|
|
84
|
+
for (const entry of checkpoint.excluded_scope ?? []) {
|
|
85
|
+
if (pathMatchesPrefix(filePath, entry.path))
|
|
86
|
+
return entry.reason;
|
|
87
|
+
}
|
|
88
|
+
for (const ov of checkpoint.disposition_overrides ?? []) {
|
|
89
|
+
if (EXCLUDED_OVERRIDE_STATUSES.has(ov.status) && pathMatchesPrefix(filePath, ov.path)) {
|
|
90
|
+
return ov.reason;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
for (const glob of checkpoint.must_not_touch ?? []) {
|
|
94
|
+
if (globMatches(filePath, glob))
|
|
95
|
+
return `must-not-touch scope (${glob})`;
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=pathScope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathScope.js","sourceRoot":"","sources":["../../../src/shared/intent/pathScope.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lease TTL for a live LLM dispatch — a host-subagent wave grant or an in-process
|
|
3
|
+
* packet run. Real dispatches run MINUTES, not the seconds-scale `STALE_LOCK_MS`
|
|
4
|
+
* default: an expired lease stops counting toward both the pool budget AND the
|
|
5
|
+
* declared-cap in-flight COUNT (`admitBatch` seeds the count from the pruned
|
|
6
|
+
* snapshot), so a mid-flight expiry hands a concurrent co-located admitter a
|
|
7
|
+
* double-grant window on the same account. Normal completion reconciles the lease
|
|
8
|
+
* long before this TTL; it only bounds how long a CRASHED consumer's orphan lease
|
|
9
|
+
* can depress headroom (20 min — the task-claims execution-lease envelope).
|
|
10
|
+
*/
|
|
11
|
+
export declare const DISPATCH_LEASE_TTL_MS: number;
|
|
1
12
|
export interface ReservationLease {
|
|
2
13
|
/** Opaque token minted at admit; required to reconcile (free) the reservation. */
|
|
3
14
|
leaseId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reservationLedger.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/reservationLedger.ts"],"names":[],"mappings":"AAqCA,MAAM,WAAW,gBAAgB;IAC/B,kFAAkF;IAClF,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,4EAA4E;IAC5E,cAAc,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,iFAAiF;IACjF,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,oGAAoG;IACpG,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;AA+EpD;;;;;;;;;;;;GAYG;AACH,qBAAa,iBAAiB;IAK1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG;IALtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAGnB,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,MAAyB,EACrD,YAAY,GAAE,MAAsB;IAMtC;;;;;;;;;OASG;IACG,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IA6BtD;;;;;;OAMG;IACG,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBvE,4FAA4F;IACtF,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQvD;;;;OAIG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IASvC;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC;CAOrC;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAUjD;AAED,kEAAkE;AAClE,wBAAgB,uBAAuB,IAAI,iBAAiB,CAE3D"}
|
|
1
|
+
{"version":3,"file":"reservationLedger.d.ts","sourceRoot":"","sources":["../../../src/shared/quota/reservationLedger.ts"],"names":[],"mappings":"AAqCA;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,QAAc,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,kFAAkF;IAClF,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,4EAA4E;IAC5E,cAAc,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,iFAAiF;IACjF,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,oGAAoG;IACpG,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;AA+EpD;;;;;;;;;;;;GAYG;AACH,qBAAa,iBAAiB;IAK1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG;IALtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAGnB,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,MAAyB,EACrD,YAAY,GAAE,MAAsB;IAMtC;;;;;;;;;OASG;IACG,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IA6BtD;;;;;;OAMG;IACG,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBvE,4FAA4F;IACtF,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQvD;;;;OAIG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IASvC;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC;CAOrC;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAUjD;AAED,kEAAkE;AAClE,wBAAgB,uBAAuB,IAAI,iBAAiB,CAE3D"}
|
|
@@ -4,6 +4,46 @@ import { dirname, join } from "node:path";
|
|
|
4
4
|
import { writeJsonFile } from "../io/json.js";
|
|
5
5
|
import { withFileLock, STALE_LOCK_MS } from "./fileLock.js";
|
|
6
6
|
import { getQuotaStatePath } from "./state.js";
|
|
7
|
+
// Shared, lock-guarded token-reservation ledger — the proactive layer of the
|
|
8
|
+
// dispatch admission-control model (spec/audit/dispatch-admission-control.md).
|
|
9
|
+
// This is the ClaimRegistry pattern generalized from TASK claiming to QUOTA
|
|
10
|
+
// claiming: instead of `nodeId → single claim`, it holds `resourceKey → leases[]`,
|
|
11
|
+
// where a lease reserves an estimated token cost against a shared rate-limit meter
|
|
12
|
+
// BEFORE the request is dispatched. Every co-located admission loop leases against
|
|
13
|
+
// the SAME file, keyed by `resourceKey = provider#account/model` (the real metered
|
|
14
|
+
// account), so two loops on one account cannot each optimistically assume the full
|
|
15
|
+
// budget — each sees the others' outstanding leases and serializes on the lock.
|
|
16
|
+
//
|
|
17
|
+
// SCOPE — proactive only. This ledger is the in-flight reservation layer, NOT the
|
|
18
|
+
// safety floor. The always-correct floor is the REACTIVE shared backoff that
|
|
19
|
+
// already lives in quota-state (`cooldown_until` per `providerModelKey`, honored by
|
|
20
|
+
// the dispatch loop) — a 429 anyone hits collapses admission for every consumer on
|
|
21
|
+
// that key. The ledger only reduces co-located OVERSHOOT among consumers that see
|
|
22
|
+
// the same file; it is a proxy, never the meter (non-audit-tools clients on the
|
|
23
|
+
// same account never touch it), and must never be presented as a hard guarantee.
|
|
24
|
+
//
|
|
25
|
+
// `budget` is supplied by the caller (the live remaining tokens for the
|
|
26
|
+
// resourceKey, derived from the pool's quota snapshot / learned slope) — the
|
|
27
|
+
// ledger never discovers limits itself. It subtracts ONLY outstanding in-flight
|
|
28
|
+
// leases from that budget, so recorded consumption (already reflected in the
|
|
29
|
+
// caller's live budget) is never double-counted. On completion the lease is
|
|
30
|
+
// reconciled away; its real cost then surfaces in the next provider snapshot.
|
|
31
|
+
//
|
|
32
|
+
// Leases carry a TTL and expire (default `STALE_LOCK_MS`, longer for long LLM
|
|
33
|
+
// work): a crashed/timed-out consumer never strands budget — the expired lease
|
|
34
|
+
// stops counting toward outstanding and the reservation returns automatically,
|
|
35
|
+
// exactly mirroring the file lock's own abandoned-holder recovery.
|
|
36
|
+
/**
|
|
37
|
+
* Lease TTL for a live LLM dispatch — a host-subagent wave grant or an in-process
|
|
38
|
+
* packet run. Real dispatches run MINUTES, not the seconds-scale `STALE_LOCK_MS`
|
|
39
|
+
* default: an expired lease stops counting toward both the pool budget AND the
|
|
40
|
+
* declared-cap in-flight COUNT (`admitBatch` seeds the count from the pruned
|
|
41
|
+
* snapshot), so a mid-flight expiry hands a concurrent co-located admitter a
|
|
42
|
+
* double-grant window on the same account. Normal completion reconciles the lease
|
|
43
|
+
* long before this TTL; it only bounds how long a CRASHED consumer's orphan lease
|
|
44
|
+
* can depress headroom (20 min — the task-claims execution-lease envelope).
|
|
45
|
+
*/
|
|
46
|
+
export const DISPATCH_LEASE_TTL_MS = 20 * 60_000;
|
|
7
47
|
function mintLeaseId() {
|
|
8
48
|
return `${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
9
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reservationLedger.js","sourceRoot":"","sources":["../../../src/shared/quota/reservationLedger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"reservationLedger.js","sourceRoot":"","sources":["../../../src/shared/quota/reservationLedger.ts"],"names":[],"mappings":"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"}
|