secondpair 0.1.4 → 0.1.6
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/bitbucket/comments.d.ts +17 -1
- package/dist/bitbucket/comments.js +54 -9
- package/dist/bitbucket/comments.js.map +1 -1
- package/dist/cli.js +76 -18
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/diff/github.d.ts +2 -0
- package/dist/diff/github.js +10 -0
- package/dist/diff/github.js.map +1 -1
- package/dist/finding-id.d.ts +4 -2
- package/dist/finding-id.js +14 -7
- package/dist/finding-id.js.map +1 -1
- package/dist/github/comments.d.ts +8 -1
- package/dist/github/comments.js +22 -3
- package/dist/github/comments.js.map +1 -1
- package/dist/gitlab/comments.d.ts +9 -0
- package/dist/gitlab/comments.js +33 -7
- package/dist/gitlab/comments.js.map +1 -1
- package/dist/llm/prompt.d.ts +15 -0
- package/dist/llm/prompt.js +15 -0
- package/dist/llm/prompt.js.map +1 -1
- package/dist/reconcile.d.ts +2 -0
- package/dist/reconcile.js +2 -1
- package/dist/reconcile.js.map +1 -1
- package/dist/report/cli.js +4 -0
- package/dist/report/cli.js.map +1 -1
- package/dist/review-state.d.ts +16 -0
- package/dist/review-state.js +24 -0
- package/dist/review-state.js.map +1 -0
- package/dist/review.d.ts +13 -0
- package/dist/review.js +96 -12
- package/dist/review.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/package.json +2 -2
package/dist/github/comments.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { collectIdsFromBodies, embedFindingId, parseFindingId } from "../finding-id.js";
|
|
2
|
+
import { embedReviewState, parseReviewState } from "../review-state.js";
|
|
2
3
|
import { collectWontFixIds } from "../suppress-signals.js";
|
|
3
4
|
// Reference-link definition, not an HTML comment: some renderers (Bitbucket)
|
|
4
5
|
// HTML-escape raw comments instead of hiding them, leaving `<!-- -->` visible
|
|
@@ -28,7 +29,7 @@ export function formatCommentBody(f) {
|
|
|
28
29
|
body = embedFindingId(body, f.id);
|
|
29
30
|
return body;
|
|
30
31
|
}
|
|
31
|
-
export function formatReviewBody(result, failed) {
|
|
32
|
+
export function formatReviewBody(result, failed, headSha) {
|
|
32
33
|
const counts = countBySeverity(result.findings);
|
|
33
34
|
const countLine = result.findings.length === 0
|
|
34
35
|
? "No findings."
|
|
@@ -42,7 +43,7 @@ export function formatReviewBody(result, failed) {
|
|
|
42
43
|
const reconLine = recon
|
|
43
44
|
? `\n_Lifecycle:_ ${recon.new.length} new · ${recon.persistent.length} persistent · ${recon.resolved.length} resolved · ${recon.suppressed.length} suppressed`
|
|
44
45
|
: "";
|
|
45
|
-
|
|
46
|
+
let body = [
|
|
46
47
|
`## PR Review Agent`,
|
|
47
48
|
"",
|
|
48
49
|
result.summary.trim(),
|
|
@@ -53,6 +54,24 @@ export function formatReviewBody(result, failed) {
|
|
|
53
54
|
failed ? "\n❌ **Check failed**: findings at or above the configured severity threshold." : "",
|
|
54
55
|
AGENT_MARKER,
|
|
55
56
|
].join("\n");
|
|
57
|
+
if (headSha)
|
|
58
|
+
body = embedReviewState(body, { headSha, findings: result.findings });
|
|
59
|
+
return body;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Recover the full review state (head sha + every active finding) embedded
|
|
63
|
+
* in the agent's most recent PR review body — the source of truth for
|
|
64
|
+
* soft-match reconciliation and incremental (changed-files-only) re-review.
|
|
65
|
+
*/
|
|
66
|
+
export async function getReviewState(octokit, pr) {
|
|
67
|
+
const reviews = await octokit.paginate(octokit.pulls.listReviews, { ...pr, per_page: 100 });
|
|
68
|
+
const mine = reviews.filter((r) => r.body?.includes(AGENT_MARKER));
|
|
69
|
+
for (let i = mine.length - 1; i >= 0; i--) {
|
|
70
|
+
const state = parseReviewState(mine[i].body ?? "");
|
|
71
|
+
if (state)
|
|
72
|
+
return state;
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
56
75
|
}
|
|
57
76
|
function countBySeverity(findings) {
|
|
58
77
|
const counts = {};
|
|
@@ -164,7 +183,7 @@ export async function postReview(opts) {
|
|
|
164
183
|
}
|
|
165
184
|
if (skipped)
|
|
166
185
|
log(`Skipping ${skipped} comment(s) already posted (same finding id).`);
|
|
167
|
-
const body = formatReviewBody(result, opts.failed);
|
|
186
|
+
const body = formatReviewBody(result, opts.failed, opts.headSha);
|
|
168
187
|
try {
|
|
169
188
|
await octokit.pulls.createReview({
|
|
170
189
|
...pr,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/github/comments.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,6EAA6E;AAC7E,8EAA8E;AAC9E,uEAAuE;AACvE,MAAM,CAAC,MAAM,YAAY,GAAG,gCAAgC,CAAC;AAE7D,MAAM,CAAC,MAAM,cAAc,GAA6B;IACtD,QAAQ,EAAE,IAAI;IACd,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,IAAI;IACZ,GAAG,EAAE,IAAI;IACT,IAAI,EAAE,GAAG;CACV,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,CAAU;IAC1C,MAAM,KAAK,GAAG;QACZ,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,QAAQ,mBAAmB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG;QACnI,EAAE;QACF,KAAK,CAAC,CAAC,KAAK,IAAI;QAChB,EAAE;QACF,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;KACd,CAAC;IACF,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1E,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IAC7B,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,CAAC,EAAE;QAAE,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAAoD,EACpD,MAAe;
|
|
1
|
+
{"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/github/comments.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type ReviewState } from "../review-state.js";
|
|
1
2
|
import type { ReviewResult } from "../types.js";
|
|
2
3
|
import { type GlRef } from "./auth.js";
|
|
3
4
|
export interface GlDiffRefs {
|
|
@@ -20,6 +21,14 @@ interface GlNote {
|
|
|
20
21
|
}
|
|
21
22
|
export declare function listGlNotes(ref: GlRef): Promise<GlNote[]>;
|
|
22
23
|
export declare function listGlFindingIds(ref: GlRef): Promise<Set<string>>;
|
|
24
|
+
/**
|
|
25
|
+
* Recover the full review state (head sha + every active finding) embedded
|
|
26
|
+
* in the most recent summary note — the source of truth for soft-match
|
|
27
|
+
* reconciliation and incremental (changed-files-only) re-review.
|
|
28
|
+
*/
|
|
29
|
+
export declare function getGlReviewState(ref: GlRef): Promise<ReviewState | null>;
|
|
30
|
+
/** Paths changed between two commits in a GitLab project. */
|
|
31
|
+
export declare function listGlChangedFiles(ref: GlRef, from: string, to: string): Promise<Set<string>>;
|
|
23
32
|
export declare function listGlWontFixFindingIds(ref: GlRef): Promise<Set<string>>;
|
|
24
33
|
/** Resolve unresolved MR discussions whose notes contain one of the finding ids. */
|
|
25
34
|
export declare function resolveGlDiscussionsForIds(ref: GlRef, ids: Iterable<string>, log?: (msg: string) => void): Promise<number>;
|
package/dist/gitlab/comments.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { formatBbCommentBody, formatBbSummaryBody } from "../bitbucket/comments.js";
|
|
2
2
|
import { collectIdsFromBodies, parseFindingId } from "../finding-id.js";
|
|
3
3
|
import { AGENT_MARKER, SEVERITY_EMOJI } from "../github/comments.js";
|
|
4
|
+
import { parseReviewState } from "../review-state.js";
|
|
4
5
|
import { collectWontFixIds } from "../suppress-signals.js";
|
|
5
6
|
import { resolveGlToken } from "./auth.js";
|
|
6
7
|
function glApi(ref) {
|
|
@@ -53,6 +54,34 @@ export async function listGlFindingIds(ref) {
|
|
|
53
54
|
const notes = await listGlNotes(ref);
|
|
54
55
|
return collectIdsFromBodies(notes.filter((n) => n.body?.includes(AGENT_MARKER)).map((n) => n.body ?? ""));
|
|
55
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Recover the full review state (head sha + every active finding) embedded
|
|
59
|
+
* in the most recent summary note — the source of truth for soft-match
|
|
60
|
+
* reconciliation and incremental (changed-files-only) re-review.
|
|
61
|
+
*/
|
|
62
|
+
export async function getGlReviewState(ref) {
|
|
63
|
+
const notes = await listGlNotes(ref);
|
|
64
|
+
const summaries = notes.filter((n) => n.body?.includes(AGENT_MARKER) && n.type == null);
|
|
65
|
+
for (let i = summaries.length - 1; i >= 0; i--) {
|
|
66
|
+
const state = parseReviewState(summaries[i].body ?? "");
|
|
67
|
+
if (state)
|
|
68
|
+
return state;
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
/** Paths changed between two commits in a GitLab project. */
|
|
73
|
+
export async function listGlChangedFiles(ref, from, to) {
|
|
74
|
+
const res = await glFetch(`${ref.serverUrl}/api/v4/projects/${ref.projectId}/repository/compare?from=${from}&to=${to}`);
|
|
75
|
+
const data = (await res.json());
|
|
76
|
+
const paths = new Set();
|
|
77
|
+
for (const d of data.diffs ?? []) {
|
|
78
|
+
if (d.new_path)
|
|
79
|
+
paths.add(d.new_path);
|
|
80
|
+
if (d.old_path)
|
|
81
|
+
paths.add(d.old_path);
|
|
82
|
+
}
|
|
83
|
+
return paths;
|
|
84
|
+
}
|
|
56
85
|
export async function listGlWontFixFindingIds(ref) {
|
|
57
86
|
const notes = await listGlNotes(ref);
|
|
58
87
|
const byId = new Map(notes.flatMap((note) => (note.id == null ? [] : [[note.id, note]])));
|
|
@@ -134,13 +163,10 @@ export async function postGlReview(opts) {
|
|
|
134
163
|
const notes = await listGlNotes(ref);
|
|
135
164
|
const mine = notes.filter((n) => n.body?.includes(AGENT_MARKER));
|
|
136
165
|
const existingIds = collectIdsFromBodies(mine.map((n) => n.body ?? ""));
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
body: JSON.stringify({ body: formatBbSummaryBody(result, opts.failed) }),
|
|
142
|
-
});
|
|
143
|
-
}
|
|
166
|
+
await glFetch(`${glApi(ref)}/notes`, {
|
|
167
|
+
method: "POST",
|
|
168
|
+
body: JSON.stringify({ body: formatBbSummaryBody(result, opts.failed, diffRefs.head_sha) }),
|
|
169
|
+
});
|
|
144
170
|
const toPost = result.findingsToPost ?? result.findings;
|
|
145
171
|
let posted = 0;
|
|
146
172
|
let skipped = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/gitlab/comments.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/gitlab/comments.ts"],"names":[],"mappings":"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"}
|
package/dist/llm/prompt.d.ts
CHANGED
|
@@ -16,6 +16,21 @@ export declare function buildCritiqueUserPrompt(input: {
|
|
|
16
16
|
}[];
|
|
17
17
|
changeDescription: string;
|
|
18
18
|
}): string;
|
|
19
|
+
export declare const DEDUP_SYSTEM_PROMPT = "You are comparing NEW pull-request review findings against PRIOR findings already posted as comments on the same PR. Findings can be worded very differently (different title, different body) yet describe the exact same underlying issue in the exact same code.\n\nRules:\n1. Match a new finding to a prior one ONLY when they are in the same file and describe the same root cause \u2014 not merely the same category or nearby lines.\n2. A new finding about a genuinely different problem in the same file/lines is NOT a duplicate, even if related.\n3. Return only the pairs you are confident are duplicates.";
|
|
20
|
+
export declare function buildDedupUserPrompt(input: {
|
|
21
|
+
newFindings: {
|
|
22
|
+
id?: string;
|
|
23
|
+
file: string;
|
|
24
|
+
start_line: number;
|
|
25
|
+
title: string;
|
|
26
|
+
body: string;
|
|
27
|
+
}[];
|
|
28
|
+
priorFindings: {
|
|
29
|
+
id?: string;
|
|
30
|
+
file: string;
|
|
31
|
+
title: string;
|
|
32
|
+
}[];
|
|
33
|
+
}): string;
|
|
19
34
|
export interface ReviewPromptInput {
|
|
20
35
|
files: FileDiff[];
|
|
21
36
|
/** Rendered repository context from the codemap; empty when no index exists. */
|
package/dist/llm/prompt.js
CHANGED
|
@@ -72,6 +72,21 @@ export function buildCritiqueUserPrompt(input) {
|
|
|
72
72
|
.join("\n");
|
|
73
73
|
return `Change under review: ${input.changeDescription}\n\n# FINDINGS\n${list}\n\nReturn the ids to keep.`;
|
|
74
74
|
}
|
|
75
|
+
export const DEDUP_SYSTEM_PROMPT = `You are comparing NEW pull-request review findings against PRIOR findings already posted as comments on the same PR. Findings can be worded very differently (different title, different body) yet describe the exact same underlying issue in the exact same code.
|
|
76
|
+
|
|
77
|
+
Rules:
|
|
78
|
+
1. Match a new finding to a prior one ONLY when they are in the same file and describe the same root cause — not merely the same category or nearby lines.
|
|
79
|
+
2. A new finding about a genuinely different problem in the same file/lines is NOT a duplicate, even if related.
|
|
80
|
+
3. Return only the pairs you are confident are duplicates.`;
|
|
81
|
+
export function buildDedupUserPrompt(input) {
|
|
82
|
+
const prior = input.priorFindings
|
|
83
|
+
.map((f) => `- id: ${f.id}\n file: ${f.file}\n title: ${f.title}`)
|
|
84
|
+
.join("\n");
|
|
85
|
+
const news = input.newFindings
|
|
86
|
+
.map((f) => `- id: ${f.id}\n location: ${f.file}:${f.start_line}\n title: ${f.title}\n body: ${f.body}`)
|
|
87
|
+
.join("\n");
|
|
88
|
+
return `# PRIOR FINDINGS (already posted on this PR)\n${prior}\n\n# NEW FINDINGS (candidates to post)\n${news}\n\nReturn the new_id/prior_id pairs that are duplicates.`;
|
|
89
|
+
}
|
|
75
90
|
export function buildReviewUserPrompt(input) {
|
|
76
91
|
const parts = [];
|
|
77
92
|
parts.push(`Reviewing: ${input.changeDescription}`);
|
package/dist/llm/prompt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/llm/prompt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;8aAsB0Y,CAAC;AAE/a,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;;;;;yIAQiG,CAAC;AAE1I,MAAM,YAAY,GAAG;;;;;;;;;;;;yIAYoH,CAAC;AAE1I,MAAM,CAAC,MAAM,2BAA2B,GAAG;;EAEzC,YAAY,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,8BAA8B,GAAG;;;;;EAK5C,YAAY,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;EAMxC,YAAY,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;2CAKK,CAAC;AAE5C,MAAM,UAAU,uBAAuB,CAAC,KAGvC;IACC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ;SACxB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,SAAS,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,QAAQ,eAAe,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,IAAI,EAAE,CACjH;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,wBAAwB,KAAK,CAAC,iBAAiB,mBAAmB,IAAI,6BAA6B,CAAC;AAC7G,CAAC;AAaD,MAAM,UAAU,qBAAqB,CAAC,KAAwB;IAC5D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAEpD,IAAI,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,uDAAuD,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/G,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,uJAAuJ,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACrL,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAC;IACtG,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CACR,4LAA4L,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CACnN,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1E,KAAK,CAAC,IAAI,CAAC,mGAAmG,KAAK,EAAE,CAAC,CAAC;IAEvH,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC"}
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/llm/prompt.ts"],"names":[],"mappings":"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"}
|
package/dist/reconcile.d.ts
CHANGED
|
@@ -17,4 +17,6 @@ export declare function reconcileFindings(findings: Finding[], opts?: {
|
|
|
17
17
|
previousIds?: Iterable<string>;
|
|
18
18
|
previousFindings?: PreviousFinding[];
|
|
19
19
|
suppressedIds?: Iterable<string>;
|
|
20
|
+
/** Prior ids still active but absent from this LLM pass (e.g. carry-forward on unchanged files). */
|
|
21
|
+
retainedIds?: Iterable<string>;
|
|
20
22
|
}): ReconcileResult;
|
package/dist/reconcile.js
CHANGED
|
@@ -11,6 +11,7 @@ export function reconcileFindings(findings, opts = {}) {
|
|
|
11
11
|
previous.add(pf.id.toLowerCase());
|
|
12
12
|
}
|
|
13
13
|
const suppressed = new Set([...(opts.suppressedIds ?? [])].map((id) => id.toLowerCase()));
|
|
14
|
+
const retained = new Set([...(opts.retainedIds ?? [])].map((id) => id.toLowerCase()));
|
|
14
15
|
const previousFindings = [...(opts.previousFindings ?? [])].filter((p) => p.id);
|
|
15
16
|
const reconciliation = {
|
|
16
17
|
new: [],
|
|
@@ -61,7 +62,7 @@ export function reconcileFindings(findings, opts = {}) {
|
|
|
61
62
|
}
|
|
62
63
|
}
|
|
63
64
|
for (const id of previous) {
|
|
64
|
-
if (!currentIds.has(id) && !suppressed.has(id)) {
|
|
65
|
+
if (!currentIds.has(id) && !suppressed.has(id) && !retained.has(id)) {
|
|
65
66
|
reconciliation.resolved.push(id);
|
|
66
67
|
}
|
|
67
68
|
}
|
package/dist/reconcile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAkBpD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAmB,EACnB,
|
|
1
|
+
{"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAkBpD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAmB,EACnB,OAMI,EAAE;IAEN,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACtF,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,gBAAgB,IAAI,EAAE,EAAE,CAAC;QAC7C,IAAI,EAAE,CAAC,EAAE;YAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC1F,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACtF,MAAM,gBAAgB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEhF,MAAM,cAAc,GAAmB;QACrC,GAAG,EAAE,EAAE;QACP,UAAU,EAAE,EAAE;QACd,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,EAAE;KACf,CAAC;IAEF,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,GAAG,CAAC;QACZ,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,EAAE;YAAE,SAAS;QAElB,gEAAgE;QAChE,IAAI,eAAe,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAChC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,EAAE;gBACJ,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;gBACxC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;gBACnC,iBAAiB,CAAC,CAAC,EAAE,CAAY,CAAC,CACrC,CAAC;YACF,IAAI,IAAI,EAAE,EAAE,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;gBACtC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;gBAC1B,EAAE,GAAG,OAAO,CAAC;gBACb,eAAe,GAAG,IAAI,CAAC;gBACvB,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;QAED,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEnB,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACvB,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,SAAS;QACX,CAAC;QAED,IAAI,eAAe,EAAE,CAAC;YACpB,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACpE,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;AAC5C,CAAC"}
|
package/dist/report/cli.js
CHANGED
|
@@ -23,6 +23,10 @@ export function formatReport(result) {
|
|
|
23
23
|
}
|
|
24
24
|
if (result.findings.length === 0) {
|
|
25
25
|
lines.push(pc.green("✓ No findings."));
|
|
26
|
+
if (result.reconciliation) {
|
|
27
|
+
const r = result.reconciliation;
|
|
28
|
+
lines.push(pc.dim(`lifecycle: ${r.new.length} new · ${r.persistent.length} persistent · ${r.resolved.length} resolved · ${r.suppressed.length} suppressed`));
|
|
29
|
+
}
|
|
26
30
|
return lines.join("\n");
|
|
27
31
|
}
|
|
28
32
|
const byFile = new Map();
|
package/dist/report/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/report/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/report/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Finding } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Full review state (head sha + every active finding) embedded in the
|
|
4
|
+
* summary comment, so the next CI run — a fresh checkout with no local
|
|
5
|
+
* report file — can recover exactly what was found last time without
|
|
6
|
+
* scraping/re-parsing individual inline comments. Same encoding on every
|
|
7
|
+
* platform: only "fetch the latest agent summary comment" differs.
|
|
8
|
+
*/
|
|
9
|
+
export interface ReviewState {
|
|
10
|
+
headSha: string;
|
|
11
|
+
findings: Finding[];
|
|
12
|
+
}
|
|
13
|
+
/** Append (or replace) the hidden state blob at the end of a summary comment body. */
|
|
14
|
+
export declare function embedReviewState(body: string, state: ReviewState): string;
|
|
15
|
+
/** Recover the previously embedded state, or null if absent/corrupt. */
|
|
16
|
+
export declare function parseReviewState(body: string): ReviewState | null;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const STATE_MARKER_PREFIX = "[secondpair-state]: # (";
|
|
2
|
+
const STATE_RE = /\[secondpair-state\]:\s*#\s*\(([A-Za-z0-9+/=]+)\)/;
|
|
3
|
+
/** Append (or replace) the hidden state blob at the end of a summary comment body. */
|
|
4
|
+
export function embedReviewState(body, state) {
|
|
5
|
+
const encoded = Buffer.from(JSON.stringify(state), "utf8").toString("base64");
|
|
6
|
+
const stripped = body.replace(STATE_RE, "").trimEnd();
|
|
7
|
+
return `${stripped}\n\n${STATE_MARKER_PREFIX}${encoded})`;
|
|
8
|
+
}
|
|
9
|
+
/** Recover the previously embedded state, or null if absent/corrupt. */
|
|
10
|
+
export function parseReviewState(body) {
|
|
11
|
+
const m = STATE_RE.exec(body);
|
|
12
|
+
if (!m)
|
|
13
|
+
return null;
|
|
14
|
+
try {
|
|
15
|
+
const parsed = JSON.parse(Buffer.from(m[1], "base64").toString("utf8"));
|
|
16
|
+
if (typeof parsed?.headSha === "string" && Array.isArray(parsed.findings))
|
|
17
|
+
return parsed;
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=review-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-state.js","sourceRoot":"","sources":["../src/review-state.ts"],"names":[],"mappings":"AAcA,MAAM,mBAAmB,GAAG,yBAAyB,CAAC;AACtD,MAAM,QAAQ,GAAG,mDAAmD,CAAC;AAErE,sFAAsF;AACtF,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,KAAkB;IAC/D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IACtD,OAAO,GAAG,QAAQ,OAAO,mBAAmB,GAAG,OAAO,GAAG,CAAC;AAC5D,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACxE,IAAI,OAAO,MAAM,EAAE,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;YAAE,OAAO,MAAM,CAAC;QACzF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/review.d.ts
CHANGED
|
@@ -13,6 +13,19 @@ export interface RunReviewOptions {
|
|
|
13
13
|
previousFindings?: import("./reconcile.js").PreviousFinding[];
|
|
14
14
|
/** Ids listed in `.pr-review-suppressions.yml`. */
|
|
15
15
|
suppressedIds?: Iterable<string>;
|
|
16
|
+
/**
|
|
17
|
+
* Paths changed since the last reviewed commit. When set, only these
|
|
18
|
+
* files are sent to the LLM — everything else in the diff is assumed
|
|
19
|
+
* untouched since the last review and skipped entirely (see
|
|
20
|
+
* `carryForwardFindings`). Undefined means a full review of every file.
|
|
21
|
+
*/
|
|
22
|
+
changedFiles?: Set<string>;
|
|
23
|
+
/**
|
|
24
|
+
* Findings from files NOT in `changedFiles` (untouched since the last
|
|
25
|
+
* review) — merged straight into the result as persistent, without any
|
|
26
|
+
* LLM call, since nothing about them could have changed.
|
|
27
|
+
*/
|
|
28
|
+
carryForwardFindings?: Finding[];
|
|
16
29
|
log?: (msg: string) => void;
|
|
17
30
|
}
|
|
18
31
|
export interface RunReviewOutput extends ReviewResult {
|
package/dist/review.js
CHANGED
|
@@ -5,7 +5,7 @@ import { detectSignals, estimateTokens, getModel, loadIndex, selectContext, stru
|
|
|
5
5
|
import { isIgnored } from "./config.js";
|
|
6
6
|
import { parseDiff } from "./diff/parse.js";
|
|
7
7
|
import { withFindingId } from "./finding-id.js";
|
|
8
|
-
import { CRITIQUE_SYSTEM_PROMPT, HIGH_LEVEL_SYSTEM_PROMPT, REVIEW_SYSTEM_PROMPT, buildCritiqueUserPrompt, buildReviewUserPrompt, } from "./llm/prompt.js";
|
|
8
|
+
import { CRITIQUE_SYSTEM_PROMPT, DEDUP_SYSTEM_PROMPT, HIGH_LEVEL_SYSTEM_PROMPT, REVIEW_SYSTEM_PROMPT, buildCritiqueUserPrompt, buildDedupUserPrompt, buildReviewUserPrompt, } from "./llm/prompt.js";
|
|
9
9
|
import { reviewOutputSchema, validateFindings } from "./llm/schema.js";
|
|
10
10
|
import { reconcileFindings } from "./reconcile.js";
|
|
11
11
|
import { compileRedactPatterns, redactSecrets } from "./redact.js";
|
|
@@ -62,8 +62,17 @@ export async function runReview(opts) {
|
|
|
62
62
|
reviewBrief: { files: [], blastRadius: [], signals: [], totalTokens: 0 },
|
|
63
63
|
};
|
|
64
64
|
}
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
const filesToAnalyze = opts.changedFiles
|
|
66
|
+
? files.filter((f) => opts.changedFiles.has(f.path))
|
|
67
|
+
: files;
|
|
68
|
+
if (opts.changedFiles) {
|
|
69
|
+
log(`Reviewing ${filesToAnalyze.length} changed file(s); ${files.length - filesToAnalyze.length} unchanged since the last review are carried forward.`);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
log(`Reviewing ${files.length} changed file(s).`);
|
|
73
|
+
}
|
|
74
|
+
const highLevelReview = opts.config.huge_pr_token_threshold != null &&
|
|
75
|
+
totalDiffTokens(filesToAnalyze) > opts.config.huge_pr_token_threshold;
|
|
67
76
|
if (highLevelReview) {
|
|
68
77
|
log(`Diff exceeds huge_pr_token_threshold (${opts.config.huge_pr_token_threshold} tokens) — running a critical/high-only, split-recommending review.`);
|
|
69
78
|
}
|
|
@@ -94,7 +103,7 @@ export async function runReview(opts) {
|
|
|
94
103
|
signals,
|
|
95
104
|
totalTokens: totalDiffTokens(files),
|
|
96
105
|
};
|
|
97
|
-
const chunks = chunkFiles(
|
|
106
|
+
const chunks = chunkFiles(filesToAnalyze);
|
|
98
107
|
if (chunks.length > 1)
|
|
99
108
|
log(`Large diff — splitting into ${chunks.length} review calls.`);
|
|
100
109
|
const runParallel = opts.config.parallel_agents && !highLevelReview;
|
|
@@ -150,7 +159,7 @@ export async function runReview(opts) {
|
|
|
150
159
|
summary: outputs.map((o) => o.summary).join(" "),
|
|
151
160
|
findings: outputs.flatMap((o) => o.findings),
|
|
152
161
|
};
|
|
153
|
-
const validated = validateFindings(merged,
|
|
162
|
+
const validated = validateFindings(merged, filesToAnalyze, opts.config);
|
|
154
163
|
stats.droppedValidation = validated.dropped.length;
|
|
155
164
|
if (validated.dropped.length > 0) {
|
|
156
165
|
log(`Dropped ${validated.dropped.length} finding(s) failing validation (outside diff, low confidence, or disabled category).`);
|
|
@@ -192,21 +201,96 @@ export async function runReview(opts) {
|
|
|
192
201
|
log(`Self-critique dropped ${droppedCritique.length} finding(s) it would not defend.`);
|
|
193
202
|
}
|
|
194
203
|
}
|
|
195
|
-
|
|
204
|
+
// Carry-forward only applies to files we did not re-analyze. Findings on
|
|
205
|
+
// changed files belong in previousFindings — if the LLM no longer reports
|
|
206
|
+
// them they are resolved, not carried forward.
|
|
207
|
+
const carryForwardRaw = opts.carryForwardFindings ?? [];
|
|
208
|
+
const carryForward = carryForwardRaw.filter((f) => !opts.changedFiles || !opts.changedFiles.has(f.file));
|
|
209
|
+
if (carryForwardRaw.length > carryForward.length) {
|
|
210
|
+
log(`Dropped ${carryForwardRaw.length - carryForward.length} carry-forward finding(s) on re-analyzed file(s).`);
|
|
211
|
+
}
|
|
212
|
+
const carryForwardIds = carryForward.map((f) => f.id).filter((id) => !!id);
|
|
213
|
+
const { active, toPost: toPostRaw, reconciliation: reconciliationRaw } = reconcileFindings(identified, {
|
|
196
214
|
previousIds: opts.previousIds,
|
|
197
215
|
previousFindings: opts.previousFindings,
|
|
198
216
|
suppressedIds: opts.suppressedIds,
|
|
217
|
+
retainedIds: carryForwardIds,
|
|
199
218
|
});
|
|
200
|
-
|
|
201
|
-
|
|
219
|
+
// Exact-id and soft-match reconciliation can both miss a reworded finding
|
|
220
|
+
// (same issue, different title/body) — catch those with an LLM comparison
|
|
221
|
+
// against everything already posted, so we don't post a second comment for
|
|
222
|
+
// an issue someone edited around without fixing.
|
|
223
|
+
let dedupMatched = new Set();
|
|
224
|
+
if (opts.config.semantic_dedup && reconciliationRaw.new.length > 0) {
|
|
225
|
+
const newFindings = active.filter((f) => f.id && reconciliationRaw.new.includes(f.id));
|
|
226
|
+
const newFiles = new Set(newFindings.map((f) => f.file));
|
|
227
|
+
// DEDUP_SYSTEM_PROMPT only ever matches within the same file, so prior
|
|
228
|
+
// findings from files the new candidates don't touch can't match —
|
|
229
|
+
// sending them just burns tokens (and on a PR where the touched files
|
|
230
|
+
// never had prior findings, this empties the pool and skips the call).
|
|
231
|
+
const priorPool = [...(opts.previousFindings ?? []), ...(opts.carryForwardFindings ?? [])].filter((f) => newFiles.has(f.file));
|
|
232
|
+
if (priorPool.length > 0 && newFindings.length > 0) {
|
|
233
|
+
const dedupSchema = z.object({
|
|
234
|
+
duplicates: z
|
|
235
|
+
.array(z.object({ new_id: z.string(), prior_id: z.string() }))
|
|
236
|
+
.describe("New finding ids that describe the same issue as a prior finding"),
|
|
237
|
+
});
|
|
238
|
+
const dedup = await withRetry(() => structuredCall({
|
|
239
|
+
system: DEDUP_SYSTEM_PROMPT,
|
|
240
|
+
user: buildDedupUserPrompt({
|
|
241
|
+
newFindings: newFindings.map((f) => ({
|
|
242
|
+
id: f.id,
|
|
243
|
+
file: f.file,
|
|
244
|
+
start_line: f.start_line,
|
|
245
|
+
title: f.title,
|
|
246
|
+
body: f.body,
|
|
247
|
+
})),
|
|
248
|
+
priorFindings: priorPool.map((f) => ({ id: f.id, file: f.file, title: f.title })),
|
|
249
|
+
}),
|
|
250
|
+
schema: dedupSchema,
|
|
251
|
+
schemaName: "dedup_output",
|
|
252
|
+
temperature,
|
|
253
|
+
onUsage,
|
|
254
|
+
}));
|
|
255
|
+
stats.llmCalls += 1;
|
|
256
|
+
dedupMatched = new Set(dedup.duplicates.map((d) => d.new_id));
|
|
257
|
+
if (dedupMatched.size > 0) {
|
|
258
|
+
log(`Semantic dedup: ${dedupMatched.size} "new" finding(s) already covered by an existing comment.`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
const reconciliation = dedupMatched.size > 0
|
|
263
|
+
? {
|
|
264
|
+
...reconciliationRaw,
|
|
265
|
+
new: reconciliationRaw.new.filter((id) => !dedupMatched.has(id)),
|
|
266
|
+
persistent: [...reconciliationRaw.persistent, ...reconciliationRaw.new.filter((id) => dedupMatched.has(id))],
|
|
267
|
+
}
|
|
268
|
+
: reconciliationRaw;
|
|
269
|
+
const toPost = toPostRaw.filter((f) => !(f.id && dedupMatched.has(f.id)));
|
|
270
|
+
// Files untouched since the last review were never re-analyzed — their
|
|
271
|
+
// prior findings carry forward as persistent without going through
|
|
272
|
+
// reconciliation (nothing could have been "resolved" in code nobody edited).
|
|
273
|
+
if (carryForward.length > 0) {
|
|
274
|
+
log(`Carrying forward ${carryForward.length} finding(s) from unchanged file(s) (no re-analysis).`);
|
|
275
|
+
}
|
|
276
|
+
const finalActive = [...active, ...carryForward];
|
|
277
|
+
const finalReconciliation = {
|
|
278
|
+
...reconciliation,
|
|
279
|
+
persistent: [...reconciliation.persistent, ...carryForwardIds],
|
|
280
|
+
};
|
|
281
|
+
log(`Reconciliation: ${finalReconciliation.new.length} new, ${finalReconciliation.persistent.length} persistent, ${finalReconciliation.resolved.length} resolved, ${finalReconciliation.suppressed.length} suppressed.`);
|
|
282
|
+
for (const f of finalActive)
|
|
202
283
|
stats.findingsBySeverity[f.severity] += 1;
|
|
203
284
|
stats.suppressed = reconciliation.suppressed.length;
|
|
204
|
-
stats.persistent =
|
|
285
|
+
stats.persistent = finalReconciliation.persistent.length;
|
|
286
|
+
const summary = filesToAnalyze.length === 0 && carryForward.length > 0
|
|
287
|
+
? `No changes since the last review. ${carryForward.length} previous finding(s) carried forward.`
|
|
288
|
+
: validated.summary;
|
|
205
289
|
return {
|
|
206
|
-
findings:
|
|
207
|
-
summary
|
|
290
|
+
findings: finalActive,
|
|
291
|
+
summary,
|
|
208
292
|
dropped: [...validated.dropped, ...capped, ...duplicates, ...droppedCritique],
|
|
209
|
-
reconciliation,
|
|
293
|
+
reconciliation: finalReconciliation,
|
|
210
294
|
findingsToPost: toPost,
|
|
211
295
|
files,
|
|
212
296
|
usedContext,
|