nexus-agents 8.126.10 → 8.126.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-EBUEO6CF.js → chunk-3MPOWY7G.js} +2 -2
- package/dist/{chunk-3ZGJNWDR.js → chunk-4XEOJW4R.js} +65 -25
- package/dist/{chunk-3ZGJNWDR.js.map → chunk-4XEOJW4R.js.map} +1 -1
- package/dist/{chunk-DD2AJPXY.js → chunk-EHFQLQYS.js} +3 -4
- package/dist/chunk-EHFQLQYS.js.map +1 -0
- package/dist/{chunk-F6SWQGX3.js → chunk-EVSKQI4B.js} +14 -17
- package/dist/{chunk-F6SWQGX3.js.map → chunk-EVSKQI4B.js.map} +1 -1
- package/dist/{chunk-PM2WWLGD.js → chunk-N4GU3UQA.js} +7 -7
- package/dist/chunk-N4GU3UQA.js.map +1 -0
- package/dist/{chunk-N46NDISC.js → chunk-OTQKPLRU.js} +2 -2
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +7 -7
- package/dist/{consensus-vote-PWTEON3H.js → consensus-vote-HE44XQ7I.js} +4 -4
- package/dist/{consensus-vote-types-CXZHVE1M.d.ts → consensus-vote-types-CKdKL6FP.d.ts} +2 -0
- package/dist/{improvement-review-KDW4Q5A2.js → improvement-review-D3COUC2O.js} +4 -4
- package/dist/index.d.ts +30 -30
- package/dist/index.js +6 -6
- package/dist/{setup-data-dir-HEMPLD6U.js → setup-data-dir-UC2E5BN3.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-DD2AJPXY.js.map +0 -1
- package/dist/chunk-PM2WWLGD.js.map +0 -1
- /package/dist/{chunk-EBUEO6CF.js.map → chunk-3MPOWY7G.js.map} +0 -0
- /package/dist/{chunk-N46NDISC.js.map → chunk-OTQKPLRU.js.map} +0 -0
- /package/dist/{consensus-vote-PWTEON3H.js.map → consensus-vote-HE44XQ7I.js.map} +0 -0
- /package/dist/{improvement-review-KDW4Q5A2.js.map → improvement-review-D3COUC2O.js.map} +0 -0
- /package/dist/{setup-data-dir-HEMPLD6U.js.map → setup-data-dir-UC2E5BN3.js.map} +0 -0
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
toolStructuredError,
|
|
8
8
|
toolSuccessStructured,
|
|
9
9
|
wrapToolWithTimeout
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-EVSKQI4B.js";
|
|
11
11
|
import {
|
|
12
12
|
JsonlStore,
|
|
13
13
|
SECURITY_KEYWORDS,
|
|
@@ -2428,4 +2428,4 @@ export {
|
|
|
2428
2428
|
runImprovementReview,
|
|
2429
2429
|
registerImprovementReviewTool
|
|
2430
2430
|
};
|
|
2431
|
-
//# sourceMappingURL=chunk-
|
|
2431
|
+
//# sourceMappingURL=chunk-3MPOWY7G.js.map
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
} from "./chunk-UVQIYBDK.js";
|
|
10
10
|
import {
|
|
11
11
|
withPrerequisite
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-3MPOWY7G.js";
|
|
13
13
|
import {
|
|
14
14
|
generateSecurityPlan
|
|
15
15
|
} from "./chunk-MBQ7YDWZ.js";
|
|
@@ -41,7 +41,7 @@ import {
|
|
|
41
41
|
import {
|
|
42
42
|
DEFAULT_TASK_TTL_MS,
|
|
43
43
|
clampTaskTtl
|
|
44
|
-
} from "./chunk-
|
|
44
|
+
} from "./chunk-EHFQLQYS.js";
|
|
45
45
|
import {
|
|
46
46
|
executeExpert
|
|
47
47
|
} from "./chunk-SRLSTOJL.js";
|
|
@@ -96,7 +96,7 @@ import {
|
|
|
96
96
|
withFileLock,
|
|
97
97
|
withWarnings,
|
|
98
98
|
writeJobCancelled
|
|
99
|
-
} from "./chunk-
|
|
99
|
+
} from "./chunk-N4GU3UQA.js";
|
|
100
100
|
import {
|
|
101
101
|
NOOP_NOTIFIER,
|
|
102
102
|
RateLimiter,
|
|
@@ -122,12 +122,12 @@ import {
|
|
|
122
122
|
toolSuccessStructured,
|
|
123
123
|
withProgressHeartbeat,
|
|
124
124
|
wrapToolWithTimeout
|
|
125
|
-
} from "./chunk-
|
|
125
|
+
} from "./chunk-EVSKQI4B.js";
|
|
126
126
|
import {
|
|
127
127
|
VERSION,
|
|
128
128
|
createRequestContext,
|
|
129
129
|
measuredTrustTier
|
|
130
|
-
} from "./chunk-
|
|
130
|
+
} from "./chunk-OTQKPLRU.js";
|
|
131
131
|
import {
|
|
132
132
|
allOf,
|
|
133
133
|
anyOf
|
|
@@ -47060,7 +47060,7 @@ function buildVotingInput(plan, config) {
|
|
|
47060
47060
|
}
|
|
47061
47061
|
async function executeSingleVote(plan, config, log) {
|
|
47062
47062
|
try {
|
|
47063
|
-
const { executeVoting } = await import("./consensus-vote-
|
|
47063
|
+
const { executeVoting } = await import("./consensus-vote-HE44XQ7I.js");
|
|
47064
47064
|
const input = buildVotingInput(plan, config);
|
|
47065
47065
|
const result = await executeVoting(input, log);
|
|
47066
47066
|
return parseVotingResult(result);
|
|
@@ -48207,7 +48207,7 @@ function createVoteStage({ config, startStage }) {
|
|
|
48207
48207
|
const strategy = config.votingStrategy ?? "higher_order";
|
|
48208
48208
|
await postProgress(config, "Vote", `Running consensus with ${strategy} strategy...`);
|
|
48209
48209
|
try {
|
|
48210
|
-
const { executeVoting } = await import("./consensus-vote-
|
|
48210
|
+
const { executeVoting } = await import("./consensus-vote-HE44XQ7I.js");
|
|
48211
48211
|
const proposal = buildVoteProposal(plan, research);
|
|
48212
48212
|
const votingResult = await executeVoting(
|
|
48213
48213
|
{
|
|
@@ -49867,6 +49867,18 @@ function createAuditStageRegistry() {
|
|
|
49867
49867
|
// src/mcp/tools/pr-review-findings.ts
|
|
49868
49868
|
import { posix } from "node:path";
|
|
49869
49869
|
import { parse as parseYaml3 } from "yaml";
|
|
49870
|
+
var FINDING_SEVERITY_ORDER = {
|
|
49871
|
+
info: 0,
|
|
49872
|
+
low: 1,
|
|
49873
|
+
medium: 2,
|
|
49874
|
+
high: 3,
|
|
49875
|
+
critical: 4
|
|
49876
|
+
};
|
|
49877
|
+
var BLOCKING_SEVERITY_FLOOR = "medium";
|
|
49878
|
+
function isBlockingSeverity(severity, role) {
|
|
49879
|
+
if (role === "security") return true;
|
|
49880
|
+
return FINDING_SEVERITY_ORDER[coerceSeverity(severity)] >= FINDING_SEVERITY_ORDER[BLOCKING_SEVERITY_FLOOR];
|
|
49881
|
+
}
|
|
49870
49882
|
function findingsAgree(left, right, leftRole, rightRole, repoPath) {
|
|
49871
49883
|
if (leftRole === rightRole || !left.verified || !right.verified) return false;
|
|
49872
49884
|
const a = normalizeFindingLocation(left.location, repoPath);
|
|
@@ -49961,7 +49973,8 @@ function coerceGateCheck(raw) {
|
|
|
49961
49973
|
return "skipped";
|
|
49962
49974
|
}
|
|
49963
49975
|
function coerceSeverity(raw) {
|
|
49964
|
-
if (raw === "critical" || raw === "high" || raw === "medium" || raw === "low"
|
|
49976
|
+
if (raw === "critical" || raw === "high" || raw === "medium" || raw === "low" || raw === "info")
|
|
49977
|
+
return raw;
|
|
49965
49978
|
return "medium";
|
|
49966
49979
|
}
|
|
49967
49980
|
var FINDINGS_FORMAT_INSTRUCTIONS = `If you have one or more findings (claims that justify request_changes), emit them in a fenced YAML block at the END of your reasoning, exactly as below. If you're approving, OMIT the block entirely.
|
|
@@ -49969,7 +49982,7 @@ var FINDINGS_FORMAT_INSTRUCTIONS = `If you have one or more findings (claims tha
|
|
|
49969
49982
|
\`\`\`yaml findings
|
|
49970
49983
|
- summary: 'One-line summary of the issue'
|
|
49971
49984
|
location: path/file.ext:LINE
|
|
49972
|
-
severity: critical | high | medium | low
|
|
49985
|
+
severity: critical | high | medium | low | info
|
|
49973
49986
|
gate:
|
|
49974
49987
|
reread_cited_line: passed
|
|
49975
49988
|
traced_call_path: passed
|
|
@@ -49978,7 +49991,7 @@ var FINDINGS_FORMAT_INSTRUCTIONS = `If you have one or more findings (claims tha
|
|
|
49978
49991
|
claim: 'What is wrong and why it justifies blocking the merge.'
|
|
49979
49992
|
\`\`\`
|
|
49980
49993
|
|
|
49981
|
-
A finding only triggers
|
|
49994
|
+
A finding only triggers the verified-finding tier if its severity is ${BLOCKING_SEVERITY_FLOOR} or higher, ALL FOUR gate checks are 'passed' AND named_assertion is substantive (>10 chars, naming a concrete failure). Non-security low/info findings are reported but do not corroborate a verified blocker. Security-role findings are treated as at least medium. Request_changes votes still count toward soft blocking regardless of severity. Missing/unknown severity in legacy YAML defaults to medium (fail closed); structured JSON rejects unknown severity. Findings missing any gate checks surface as informational only \u2014 they do not verify a blocker on their own. This is the #2225 verification gate; the 2026-04-25 audit found a 100% false-positive rate when this gate was not enforced.`;
|
|
49982
49995
|
|
|
49983
49996
|
// src/mcp/tools/pr-review-proposal.ts
|
|
49984
49997
|
function sanitizationNote(sanitizeResult, removedBefore) {
|
|
@@ -50687,33 +50700,34 @@ function mapVoteDecisionToPrDecision(voteDecision) {
|
|
|
50687
50700
|
var SOFT_BLOCK_REQUEST_CHANGES_THRESHOLD = 3;
|
|
50688
50701
|
function aggregatePrDecisions(reviews, errorPolicy = "standard", repoPath) {
|
|
50689
50702
|
const valid = reviews.filter((r) => !isAbsentSeat(r));
|
|
50690
|
-
const
|
|
50691
|
-
const incompleteReason = `incomplete panel: ${String(valid.length)} of ${String(reviews.length)} voters responded`;
|
|
50692
|
-
const panelVerdict = (decision) => complete() ? { decision, verified: true } : { decision, verified: false, reason: incompleteReason };
|
|
50703
|
+
const panelVerdict = (decision) => aggregatePanelVerdict(reviews, valid, decision);
|
|
50693
50704
|
if (valid.length === 0) return panelVerdict("abstain");
|
|
50694
50705
|
const findingBlocker = aggregateBlockingFindings(valid, repoPath);
|
|
50695
|
-
if (findingBlocker !== void 0) return findingBlocker;
|
|
50706
|
+
if (findingBlocker !== void 0) return discloseSeverityFloor(findingBlocker, valid);
|
|
50696
50707
|
const requestChangesVoters = valid.filter((r) => r.decision === "request_changes").length;
|
|
50697
50708
|
if (requestChangesVoters >= SOFT_BLOCK_REQUEST_CHANGES_THRESHOLD) {
|
|
50698
|
-
return { decision: "request_changes", verified: false };
|
|
50709
|
+
return discloseSeverityFloor({ decision: "request_changes", verified: false }, valid);
|
|
50699
50710
|
}
|
|
50700
50711
|
if (valid.every((r) => r.decision === "approve")) {
|
|
50701
50712
|
if (errorPolicy === "absolute_quorum") {
|
|
50702
|
-
return absoluteQuorumApprove(reviews, valid);
|
|
50713
|
+
return discloseSeverityFloor(absoluteQuorumApprove(reviews, valid), valid);
|
|
50703
50714
|
}
|
|
50704
50715
|
if (valid.length < 2)
|
|
50705
|
-
return
|
|
50706
|
-
|
|
50707
|
-
|
|
50708
|
-
|
|
50709
|
-
|
|
50716
|
+
return discloseSeverityFloor(
|
|
50717
|
+
{
|
|
50718
|
+
decision: "abstain",
|
|
50719
|
+
verified: false,
|
|
50720
|
+
reason: "insufficient reviewers: 1 reviewer; needs second reviewer"
|
|
50721
|
+
},
|
|
50722
|
+
valid
|
|
50723
|
+
);
|
|
50710
50724
|
return panelVerdict("approve");
|
|
50711
50725
|
}
|
|
50712
50726
|
return panelVerdict("abstain");
|
|
50713
50727
|
}
|
|
50714
50728
|
function resolveAggregate(reviews, input, absent, coverage, logger58) {
|
|
50715
50729
|
const preGate = aggregatePrDecisions(reviews, input.errorPolicy, input.repoPath);
|
|
50716
|
-
if (preGate.reason !== void 0) {
|
|
50730
|
+
if (!preGate.verified && preGate.reason !== void 0) {
|
|
50717
50731
|
logger58.warn("pr_review aggregate is unverified", {
|
|
50718
50732
|
reason: preGate.reason,
|
|
50719
50733
|
absentCount: absent.errorCount + absent.unverifiableCount,
|
|
@@ -50728,7 +50742,10 @@ function resolveAggregate(reviews, input, absent, coverage, logger58) {
|
|
|
50728
50742
|
{ reason: aggregate.reason }
|
|
50729
50743
|
);
|
|
50730
50744
|
}
|
|
50731
|
-
return aggregate
|
|
50745
|
+
return aggregate === preGate ? aggregate : discloseSeverityFloor(
|
|
50746
|
+
aggregate,
|
|
50747
|
+
reviews.filter((r) => !isAbsentSeat(r))
|
|
50748
|
+
);
|
|
50732
50749
|
}
|
|
50733
50750
|
function rollUpDecisionCost(voteResults, logger58, jobId) {
|
|
50734
50751
|
try {
|
|
@@ -50943,7 +50960,7 @@ function describeUnconfirmedFindings(reviewers) {
|
|
|
50943
50960
|
}
|
|
50944
50961
|
function aggregateBlockingFindings(valid, repoPath) {
|
|
50945
50962
|
const blockers = valid.filter((r) => r.decision === "request_changes").flatMap(
|
|
50946
|
-
(r) => r.findings.filter((f) => f.verified).map((finding) => ({ role: r.role, finding }))
|
|
50963
|
+
(r) => r.findings.filter((f) => f.verified && isBlockingSeverity(f.severity, r.role)).map((finding) => ({ role: r.role, finding }))
|
|
50947
50964
|
);
|
|
50948
50965
|
const first = blockers[0];
|
|
50949
50966
|
if (first === void 0) return void 0;
|
|
@@ -50964,6 +50981,29 @@ function aggregateBlockingFindings(valid, repoPath) {
|
|
|
50964
50981
|
reason: describeUnconfirmedFindings([...reviewers.values()])
|
|
50965
50982
|
};
|
|
50966
50983
|
}
|
|
50984
|
+
function discloseSeverityFloor(aggregate, valid) {
|
|
50985
|
+
const findings = valid.filter((r) => r.decision === "request_changes").flatMap((r) => r.findings.filter((f) => !isBlockingSeverity(f.severity, r.role)));
|
|
50986
|
+
const count = findings.length;
|
|
50987
|
+
if (count === 0) return aggregate;
|
|
50988
|
+
const verifiedCount = findings.filter((f) => f.verified).length;
|
|
50989
|
+
const unverifiedCount = count - verifiedCount;
|
|
50990
|
+
const disclosure = `${String(count)} low/info ${count === 1 ? "finding" : "findings"} from request_changes voters below the blocking floor (${BLOCKING_SEVERITY_FLOOR}): ${String(verifiedCount)} verified, ${String(unverifiedCount)} unverified`;
|
|
50991
|
+
return {
|
|
50992
|
+
...aggregate,
|
|
50993
|
+
reason: aggregate.reason === void 0 ? disclosure : `${aggregate.reason}; ${disclosure}`
|
|
50994
|
+
};
|
|
50995
|
+
}
|
|
50996
|
+
function aggregatePanelVerdict(reviews, valid, decision) {
|
|
50997
|
+
const complete = valid.length === reviews.length;
|
|
50998
|
+
return discloseSeverityFloor(
|
|
50999
|
+
complete ? { decision, verified: true } : {
|
|
51000
|
+
decision,
|
|
51001
|
+
verified: false,
|
|
51002
|
+
reason: `incomplete panel: ${String(valid.length)} of ${String(reviews.length)} voters responded`
|
|
51003
|
+
},
|
|
51004
|
+
valid
|
|
51005
|
+
);
|
|
51006
|
+
}
|
|
50967
51007
|
function absoluteQuorumApprove(reviews, valid) {
|
|
50968
51008
|
const errorCount = reviews.length - valid.length;
|
|
50969
51009
|
const erroredRoles = reviews.filter(isAbsentSeat).map((r) => r.role);
|
|
@@ -57851,4 +57891,4 @@ export {
|
|
|
57851
57891
|
initializeSandbox,
|
|
57852
57892
|
getSandboxMode
|
|
57853
57893
|
};
|
|
57854
|
-
//# sourceMappingURL=chunk-
|
|
57894
|
+
//# sourceMappingURL=chunk-4XEOJW4R.js.map
|