secondpair 0.1.3 → 0.1.5

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 (56) hide show
  1. package/README.md +26 -3
  2. package/dist/bitbucket/auth.d.ts +13 -0
  3. package/dist/bitbucket/auth.js +37 -0
  4. package/dist/bitbucket/auth.js.map +1 -0
  5. package/dist/bitbucket/comments.d.ts +20 -14
  6. package/dist/bitbucket/comments.js +59 -45
  7. package/dist/bitbucket/comments.js.map +1 -1
  8. package/dist/cli.js +104 -43
  9. package/dist/cli.js.map +1 -1
  10. package/dist/config.d.ts +11 -0
  11. package/dist/config.js +68 -4
  12. package/dist/config.js.map +1 -1
  13. package/dist/diff/github.d.ts +2 -0
  14. package/dist/diff/github.js +10 -0
  15. package/dist/diff/github.js.map +1 -1
  16. package/dist/finding-id.d.ts +5 -3
  17. package/dist/finding-id.js +18 -11
  18. package/dist/finding-id.js.map +1 -1
  19. package/dist/github/auth.d.ts +4 -0
  20. package/dist/github/auth.js +16 -0
  21. package/dist/github/auth.js.map +1 -0
  22. package/dist/github/comments.d.ts +11 -2
  23. package/dist/github/comments.js +30 -4
  24. package/dist/github/comments.js.map +1 -1
  25. package/dist/gitlab/auth.d.ts +11 -0
  26. package/dist/gitlab/auth.js +22 -0
  27. package/dist/gitlab/auth.js.map +1 -0
  28. package/dist/gitlab/comments.d.ts +10 -9
  29. package/dist/gitlab/comments.js +34 -27
  30. package/dist/gitlab/comments.js.map +1 -1
  31. package/dist/host.d.ts +3 -0
  32. package/dist/host.js +15 -0
  33. package/dist/host.js.map +1 -0
  34. package/dist/llm/prompt.d.ts +21 -0
  35. package/dist/llm/prompt.js +57 -1
  36. package/dist/llm/prompt.js.map +1 -1
  37. package/dist/report/cli.d.ts +8 -3
  38. package/dist/report/cli.js +11 -1
  39. package/dist/report/cli.js.map +1 -1
  40. package/dist/report/json.d.ts +5 -0
  41. package/dist/report/json.js +2 -0
  42. package/dist/report/json.js.map +1 -1
  43. package/dist/retry.d.ts +1 -0
  44. package/dist/retry.js +16 -0
  45. package/dist/retry.js.map +1 -0
  46. package/dist/review-state.d.ts +16 -0
  47. package/dist/review-state.js +24 -0
  48. package/dist/review-state.js.map +1 -0
  49. package/dist/review.d.ts +29 -0
  50. package/dist/review.js +165 -29
  51. package/dist/review.js.map +1 -1
  52. package/dist/specialized-review.d.ts +29 -0
  53. package/dist/specialized-review.js +50 -0
  54. package/dist/specialized-review.js.map +1 -0
  55. package/dist/types.d.ts +18 -1
  56. package/package.json +3 -3
package/dist/review.js CHANGED
@@ -1,17 +1,23 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import path from "node:path";
3
3
  import { z } from "zod";
4
- import { estimateTokens, getModel, loadIndex, selectContext, structuredCall } from "repocairn";
4
+ import { detectSignals, estimateTokens, getModel, loadIndex, selectContext, structuredCall } from "repocairn";
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, 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";
12
+ import { withRetry } from "./retry.js";
13
+ import { runSpecializedReview } from "./specialized-review.js";
12
14
  import { SEVERITIES, severityRank } from "./types.js";
13
15
  /** Cap on the prompt tokens spent on diff text per LLM call; larger diffs are chunked by file. */
14
16
  const DIFF_TOKENS_PER_CALL = 60_000;
17
+ /** Sum of the same per-file token cost `chunkFiles` uses, across the whole diff. */
18
+ export function totalDiffTokens(files) {
19
+ return files.reduce((sum, f) => sum + estimateTokens(JSON.stringify(f.hunks)), 0);
20
+ }
15
21
  /** Token cap per inlined source snippet (~4 chars/token). */
16
22
  const SNIPPET_TOKENS_PER_FILE = 2000;
17
23
  export async function runReview(opts) {
@@ -51,11 +57,28 @@ export async function runReview(opts) {
51
57
  reconciliation: emptyReconciliation(),
52
58
  findingsToPost: [],
53
59
  stats,
60
+ blastRadius: [],
61
+ highLevelReview: false,
62
+ reviewBrief: { files: [], blastRadius: [], signals: [], totalTokens: 0 },
54
63
  };
55
64
  }
56
- log(`Reviewing ${files.length} changed file(s).`);
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;
76
+ if (highLevelReview) {
77
+ log(`Diff exceeds huge_pr_token_threshold (${opts.config.huge_pr_token_threshold} tokens) — running a critical/high-only, split-recommending review.`);
78
+ }
57
79
  let context = "";
58
80
  let usedContext = false;
81
+ let blastRadius = [];
59
82
  if (opts.useContext !== false) {
60
83
  const index = await loadIndex(opts.cwd);
61
84
  if (index) {
@@ -63,6 +86,7 @@ export async function runReview(opts) {
63
86
  const snippets = await renderSnippets(opts.cwd, selection.entries, opts.config.context_snippets);
64
87
  context = [selection.rendered, snippets].filter(Boolean).join("\n\n");
65
88
  usedContext = selection.entries.length > 0;
89
+ blastRadius = selection.entries.filter((e) => e.relation === "importer");
66
90
  log(`Injecting context from ${selection.entries.length} codemap entries.`);
67
91
  }
68
92
  else {
@@ -70,19 +94,56 @@ export async function runReview(opts) {
70
94
  }
71
95
  }
72
96
  context = maybeRedact(context);
73
- const chunks = chunkFiles(files);
97
+ const signals = opts.config.signal_detector ? await collectSignals(opts.cwd, files) : [];
98
+ if (signals.length > 0)
99
+ log(`Signal detector found ${signals.length} signal(s) in added lines.`);
100
+ const reviewBrief = {
101
+ files: files.map((f) => f.path),
102
+ blastRadius: blastRadius.map((e) => e.path),
103
+ signals,
104
+ totalTokens: totalDiffTokens(files),
105
+ };
106
+ const chunks = chunkFiles(filesToAnalyze);
74
107
  if (chunks.length > 1)
75
108
  log(`Large diff — splitting into ${chunks.length} review calls.`);
109
+ const runParallel = opts.config.parallel_agents && !highLevelReview;
110
+ if (runParallel)
111
+ log("Running security/correctness/quality lenses in parallel.");
76
112
  const outputs = [];
113
+ const lensStats = {};
77
114
  for (const chunk of chunks) {
115
+ const chunkPaths = new Set(chunk.map((f) => f.path));
116
+ const signalsText = renderSignals(signals.filter((s) => chunkPaths.has(s.file)));
117
+ if (runParallel) {
118
+ const specialized = await runSpecializedReview({
119
+ files: chunk,
120
+ context,
121
+ signalsText,
122
+ config: opts.config,
123
+ changeDescription: opts.changeDescription,
124
+ temperature,
125
+ });
126
+ outputs.push(...specialized.outputs);
127
+ for (const [key, stat] of Object.entries(specialized.lensStats)) {
128
+ const acc = (lensStats[key] ??= { calls: 0, inputTokens: 0, outputTokens: 0 });
129
+ acc.calls += stat.calls;
130
+ acc.inputTokens += stat.inputTokens;
131
+ acc.outputTokens += stat.outputTokens;
132
+ stats.llmCalls += stat.calls;
133
+ stats.inputTokens += stat.inputTokens;
134
+ stats.outputTokens += stat.outputTokens;
135
+ }
136
+ continue;
137
+ }
78
138
  const user = buildReviewUserPrompt({
79
139
  files: chunk,
80
140
  context,
81
141
  config: opts.config,
82
142
  changeDescription: opts.changeDescription,
143
+ signals: signalsText,
83
144
  });
84
145
  const output = await withRetry(() => structuredCall({
85
- system: REVIEW_SYSTEM_PROMPT,
146
+ system: highLevelReview ? HIGH_LEVEL_SYSTEM_PROMPT : REVIEW_SYSTEM_PROMPT,
86
147
  user,
87
148
  schema: reviewOutputSchema,
88
149
  schemaName: "review_output",
@@ -92,11 +153,13 @@ export async function runReview(opts) {
92
153
  stats.llmCalls += 1;
93
154
  outputs.push(output);
94
155
  }
156
+ if (Object.keys(lensStats).length > 0)
157
+ stats.lensStats = lensStats;
95
158
  const merged = {
96
159
  summary: outputs.map((o) => o.summary).join(" "),
97
160
  findings: outputs.flatMap((o) => o.findings),
98
161
  };
99
- const validated = validateFindings(merged, files, opts.config);
162
+ const validated = validateFindings(merged, filesToAnalyze, opts.config);
100
163
  stats.droppedValidation = validated.dropped.length;
101
164
  if (validated.dropped.length > 0) {
102
165
  log(`Dropped ${validated.dropped.length} finding(s) failing validation (outside diff, low confidence, or disabled category).`);
@@ -113,7 +176,7 @@ export async function runReview(opts) {
113
176
  }
114
177
  let identified = deduped;
115
178
  let droppedCritique = [];
116
- if (opts.config.self_critique && identified.length > 0) {
179
+ if (opts.config.self_critique && identified.length > 0 && !highLevelReview) {
117
180
  const keepSchema = z.object({
118
181
  keep_ids: z.array(z.string()).describe("Ids of the findings to keep"),
119
182
  });
@@ -138,25 +201,94 @@ export async function runReview(opts) {
138
201
  log(`Self-critique dropped ${droppedCritique.length} finding(s) it would not defend.`);
139
202
  }
140
203
  }
141
- const { active, toPost, reconciliation } = reconcileFindings(identified, {
204
+ const { active, toPost: toPostRaw, reconciliation: reconciliationRaw } = reconcileFindings(identified, {
142
205
  previousIds: opts.previousIds,
143
206
  previousFindings: opts.previousFindings,
144
207
  suppressedIds: opts.suppressedIds,
145
208
  });
146
- log(`Reconciliation: ${reconciliation.new.length} new, ${reconciliation.persistent.length} persistent, ${reconciliation.resolved.length} resolved, ${reconciliation.suppressed.length} suppressed.`);
147
- for (const f of active)
209
+ // Exact-id and soft-match reconciliation can both miss a reworded finding
210
+ // (same issue, different title/body) — catch those with an LLM comparison
211
+ // against everything already posted, so we don't post a second comment for
212
+ // an issue someone edited around without fixing.
213
+ let dedupMatched = new Set();
214
+ if (opts.config.semantic_dedup && reconciliationRaw.new.length > 0) {
215
+ const newFindings = active.filter((f) => f.id && reconciliationRaw.new.includes(f.id));
216
+ const newFiles = new Set(newFindings.map((f) => f.file));
217
+ // DEDUP_SYSTEM_PROMPT only ever matches within the same file, so prior
218
+ // findings from files the new candidates don't touch can't match —
219
+ // sending them just burns tokens (and on a PR where the touched files
220
+ // never had prior findings, this empties the pool and skips the call).
221
+ const priorPool = [...(opts.previousFindings ?? []), ...(opts.carryForwardFindings ?? [])].filter((f) => newFiles.has(f.file));
222
+ if (priorPool.length > 0 && newFindings.length > 0) {
223
+ const dedupSchema = z.object({
224
+ duplicates: z
225
+ .array(z.object({ new_id: z.string(), prior_id: z.string() }))
226
+ .describe("New finding ids that describe the same issue as a prior finding"),
227
+ });
228
+ const dedup = await withRetry(() => structuredCall({
229
+ system: DEDUP_SYSTEM_PROMPT,
230
+ user: buildDedupUserPrompt({
231
+ newFindings: newFindings.map((f) => ({
232
+ id: f.id,
233
+ file: f.file,
234
+ start_line: f.start_line,
235
+ title: f.title,
236
+ body: f.body,
237
+ })),
238
+ priorFindings: priorPool.map((f) => ({ id: f.id, file: f.file, title: f.title })),
239
+ }),
240
+ schema: dedupSchema,
241
+ schemaName: "dedup_output",
242
+ temperature,
243
+ onUsage,
244
+ }));
245
+ stats.llmCalls += 1;
246
+ dedupMatched = new Set(dedup.duplicates.map((d) => d.new_id));
247
+ if (dedupMatched.size > 0) {
248
+ log(`Semantic dedup: ${dedupMatched.size} "new" finding(s) already covered by an existing comment.`);
249
+ }
250
+ }
251
+ }
252
+ const reconciliation = dedupMatched.size > 0
253
+ ? {
254
+ ...reconciliationRaw,
255
+ new: reconciliationRaw.new.filter((id) => !dedupMatched.has(id)),
256
+ persistent: [...reconciliationRaw.persistent, ...reconciliationRaw.new.filter((id) => dedupMatched.has(id))],
257
+ }
258
+ : reconciliationRaw;
259
+ const toPost = toPostRaw.filter((f) => !(f.id && dedupMatched.has(f.id)));
260
+ // Files untouched since the last review were never re-analyzed — their
261
+ // prior findings carry forward as persistent without going through
262
+ // reconciliation (nothing could have been "resolved" in code nobody edited).
263
+ const carryForward = opts.carryForwardFindings ?? [];
264
+ if (carryForward.length > 0) {
265
+ log(`Carrying forward ${carryForward.length} finding(s) from unchanged file(s) (no re-analysis).`);
266
+ }
267
+ const finalActive = [...active, ...carryForward];
268
+ const finalReconciliation = {
269
+ ...reconciliation,
270
+ persistent: [...reconciliation.persistent, ...carryForward.map((f) => f.id).filter((id) => !!id)],
271
+ };
272
+ log(`Reconciliation: ${reconciliation.new.length} new, ${finalReconciliation.persistent.length} persistent, ${reconciliation.resolved.length} resolved, ${reconciliation.suppressed.length} suppressed.`);
273
+ for (const f of finalActive)
148
274
  stats.findingsBySeverity[f.severity] += 1;
149
275
  stats.suppressed = reconciliation.suppressed.length;
150
- stats.persistent = reconciliation.persistent.length;
276
+ stats.persistent = finalReconciliation.persistent.length;
277
+ const summary = filesToAnalyze.length === 0 && carryForward.length > 0
278
+ ? `No changes since the last review. ${carryForward.length} previous finding(s) carried forward.`
279
+ : validated.summary;
151
280
  return {
152
- findings: active,
153
- summary: validated.summary,
281
+ findings: finalActive,
282
+ summary,
154
283
  dropped: [...validated.dropped, ...capped, ...duplicates, ...droppedCritique],
155
- reconciliation,
284
+ reconciliation: finalReconciliation,
156
285
  findingsToPost: toPost,
157
286
  files,
158
287
  usedContext,
159
288
  stats,
289
+ blastRadius,
290
+ highLevelReview,
291
+ reviewBrief,
160
292
  };
161
293
  }
162
294
  /**
@@ -235,6 +367,25 @@ async function renderSnippets(cwd, entries, count) {
235
367
  }
236
368
  return parts.join("\n\n");
237
369
  }
370
+ /** Run the deterministic signal detector on each changed file's current content. */
371
+ async function collectSignals(cwd, files) {
372
+ const signals = [];
373
+ for (const f of files) {
374
+ if (f.status === "deleted" || f.changedLines.length === 0)
375
+ continue;
376
+ try {
377
+ const content = await readFile(path.join(cwd, f.path), "utf8");
378
+ signals.push(...detectSignals(f.path, content, f.changedLines));
379
+ }
380
+ catch {
381
+ // file unreadable (e.g. sparse checkout) — skip, same as renderSnippets
382
+ }
383
+ }
384
+ return signals;
385
+ }
386
+ function renderSignals(signals) {
387
+ return signals.map((s) => `- ${s.file}:${s.line} [${s.kind}] ${s.detail}`).join("\n");
388
+ }
238
389
  function emptyReconciliation() {
239
390
  return { new: [], persistent: [], resolved: [], suppressed: [] };
240
391
  }
@@ -256,19 +407,4 @@ function chunkFiles(files) {
256
407
  chunks.push(current);
257
408
  return chunks;
258
409
  }
259
- async function withRetry(fn, attempts = 3) {
260
- let last;
261
- for (let i = 0; i < attempts; i++) {
262
- try {
263
- return await fn();
264
- }
265
- catch (err) {
266
- last = err;
267
- if (i < attempts - 1) {
268
- await new Promise((r) => setTimeout(r, 500 * 2 ** i));
269
- }
270
- }
271
- }
272
- throw last;
273
- }
274
410
  //# sourceMappingURL=review.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"review.js","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type ReviewOutput } from "./llm/schema.js";
2
+ import type { Category, FileDiff, ReviewConfig } from "./types.js";
3
+ export interface LensDefinition {
4
+ key: string;
5
+ categories: Category[];
6
+ systemPrompt: string;
7
+ /** Whether this lens receives repository context and signals, or the diff alone. */
8
+ includeContext: boolean;
9
+ }
10
+ /** Partitions the frozen Category enum three ways so lens outputs can never collide on dedupeById's file|category|title fingerprint. */
11
+ export declare const LENS_DEFINITIONS: LensDefinition[];
12
+ export interface LensStat {
13
+ calls: number;
14
+ inputTokens: number;
15
+ outputTokens: number;
16
+ }
17
+ export interface SpecializedReviewInput {
18
+ files: FileDiff[];
19
+ context: string;
20
+ signalsText: string;
21
+ config: ReviewConfig;
22
+ changeDescription: string;
23
+ temperature: number | undefined;
24
+ }
25
+ /** Runs the 3 category lenses concurrently over one chunk of files, each scoped to its own category slice. */
26
+ export declare function runSpecializedReview(input: SpecializedReviewInput): Promise<{
27
+ outputs: ReviewOutput[];
28
+ lensStats: Record<string, LensStat>;
29
+ }>;
@@ -0,0 +1,50 @@
1
+ import { structuredCall } from "repocairn";
2
+ import { CORRECTNESS_LENS_SYSTEM_PROMPT, QUALITY_LENS_SYSTEM_PROMPT, SECURITY_LENS_SYSTEM_PROMPT, buildReviewUserPrompt, } from "./llm/prompt.js";
3
+ import { reviewOutputSchema } from "./llm/schema.js";
4
+ import { withRetry } from "./retry.js";
5
+ /** Partitions the frozen Category enum three ways so lens outputs can never collide on dedupeById's file|category|title fingerprint. */
6
+ export const LENS_DEFINITIONS = [
7
+ { key: "security", categories: ["security"], systemPrompt: SECURITY_LENS_SYSTEM_PROMPT, includeContext: true },
8
+ {
9
+ key: "correctness",
10
+ categories: ["bug", "missing-tests"],
11
+ systemPrompt: CORRECTNESS_LENS_SYSTEM_PROMPT,
12
+ includeContext: true,
13
+ },
14
+ {
15
+ key: "quality",
16
+ categories: ["naming", "complexity", "custom"],
17
+ systemPrompt: QUALITY_LENS_SYSTEM_PROMPT,
18
+ includeContext: false,
19
+ },
20
+ ];
21
+ /** Runs the 3 category lenses concurrently over one chunk of files, each scoped to its own category slice. */
22
+ export async function runSpecializedReview(input) {
23
+ const lensStats = {};
24
+ const outputs = await Promise.all(LENS_DEFINITIONS.map(async (lens) => {
25
+ const stat = { calls: 0, inputTokens: 0, outputTokens: 0 };
26
+ lensStats[lens.key] = stat;
27
+ const user = buildReviewUserPrompt({
28
+ files: input.files,
29
+ context: lens.includeContext ? input.context : "",
30
+ config: input.config,
31
+ changeDescription: input.changeDescription,
32
+ signals: lens.includeContext ? input.signalsText : undefined,
33
+ });
34
+ const output = await withRetry(() => structuredCall({
35
+ system: lens.systemPrompt,
36
+ user,
37
+ schema: reviewOutputSchema,
38
+ schemaName: "review_output",
39
+ temperature: input.temperature,
40
+ onUsage: (u) => {
41
+ stat.inputTokens += u.inputTokens;
42
+ stat.outputTokens += u.outputTokens;
43
+ },
44
+ }));
45
+ stat.calls += 1;
46
+ return { ...output, findings: output.findings.filter((f) => lens.categories.includes(f.category)) };
47
+ }));
48
+ return { outputs, lensStats };
49
+ }
50
+ //# sourceMappingURL=specialized-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specialized-review.js","sourceRoot":"","sources":["../src/specialized-review.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EACL,8BAA8B,EAC9B,0BAA0B,EAC1B,2BAA2B,EAC3B,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAAqB,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAWvC,wIAAwI;AACxI,MAAM,CAAC,MAAM,gBAAgB,GAAqB;IAChD,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,UAAU,CAAC,EAAE,YAAY,EAAE,2BAA2B,EAAE,cAAc,EAAE,IAAI,EAAE;IAC9G;QACE,GAAG,EAAE,aAAa;QAClB,UAAU,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC;QACpC,YAAY,EAAE,8BAA8B;QAC5C,cAAc,EAAE,IAAI;KACrB;IACD;QACE,GAAG,EAAE,SAAS;QACd,UAAU,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC;QAC9C,YAAY,EAAE,0BAA0B;QACxC,cAAc,EAAE,KAAK;KACtB;CACF,CAAC;AAiBF,8GAA8G;AAC9G,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAA6B;IAE7B,MAAM,SAAS,GAA6B,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAClC,MAAM,IAAI,GAAa,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;QACrE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QAC3B,MAAM,IAAI,GAAG,qBAAqB,CAAC;YACjC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACjD,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;YAC1C,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;SAC7D,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAClC,cAAc,CAAC;YACb,MAAM,EAAE,IAAI,CAAC,YAAY;YACzB,IAAI;YACJ,MAAM,EAAE,kBAAkB;YAC1B,UAAU,EAAE,eAAe;YAC3B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,CAAC;gBAClC,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,YAAY,CAAC;YACtC,CAAC;SACF,CAAC,CACH,CAAC;QACF,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAChB,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;IACtG,CAAC,CAAC,CACH,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAChC,CAAC"}
package/dist/types.d.ts CHANGED
@@ -46,13 +46,16 @@ export interface FileDiff {
46
46
  changedLines: number[];
47
47
  }
48
48
  export interface ReviewConfig {
49
- fail_on: Severity;
49
+ /** "off" disables the CI gate entirely — findings still get reported/posted, exit code stays 0. */
50
+ fail_on: Severity | "off";
50
51
  min_confidence: number;
51
52
  ignore: string[];
52
53
  context_token_budget: number;
53
54
  /** Number of related files whose exact source is inlined into the prompt (0 disables). */
54
55
  context_snippets: number;
55
56
  custom_instructions: string;
57
+ /** Path to a markdown/mdc guide (repo-relative). If it exists, its content replaces custom_instructions. */
58
+ custom_instructions_file: string;
56
59
  categories: Record<Category, boolean>;
57
60
  /** Sampling temperature; null = provider default (openai-compat: 0; anthropic: adaptive thinking). */
58
61
  temperature: number | null;
@@ -65,6 +68,14 @@ export interface ReviewConfig {
65
68
  redact_secrets: boolean;
66
69
  redact_patterns: string[];
67
70
  write_suppressions: boolean;
71
+ /** Total diff tokens above which the review switches to a high-level-only pass and suggests splitting the PR. null disables the branch. */
72
+ huge_pr_token_threshold: number | null;
73
+ /** Run the deterministic pre-LLM hook/error-handling/control-flow detector and inject its output as a prompt section. */
74
+ signal_detector: boolean;
75
+ /** Split each chunk's review into concurrent security/correctness/quality lens calls instead of one call. */
76
+ parallel_agents: boolean;
77
+ /** Extra LLM pass comparing "new" findings against previously posted ones (same-file only), to catch reworded duplicates exact/soft-match reconciliation misses. On by default. */
78
+ semantic_dedup: boolean;
68
79
  }
69
80
  export interface RunStats {
70
81
  model: string;
@@ -78,6 +89,12 @@ export interface RunStats {
78
89
  droppedCritique: number;
79
90
  suppressed: number;
80
91
  persistent: number;
92
+ /** Per-lens call/token counts, present only when parallel_agents ran. */
93
+ lensStats?: Record<string, {
94
+ calls: number;
95
+ inputTokens: number;
96
+ outputTokens: number;
97
+ }>;
81
98
  }
82
99
  export interface ReviewResult {
83
100
  findings: Finding[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "secondpair",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "LLM-powered pull request reviewer with whole-repo context from a persistent repocairn codemap",
5
5
  "type": "module",
6
6
  "bin": {
@@ -36,13 +36,13 @@
36
36
  "dev": "tsx src/cli.ts"
37
37
  },
38
38
  "engines": {
39
- "node": ">=20"
39
+ "node": ">=24"
40
40
  },
41
41
  "dependencies": {
42
42
  "@octokit/rest": "^21.0.0",
43
43
  "commander": "^12.1.0",
44
44
  "picocolors": "^1.1.0",
45
- "repocairn": "^0.1.3",
45
+ "repocairn": "^0.1.5",
46
46
  "yaml": "^2.5.0",
47
47
  "zod": "^4.4.3"
48
48
  }