ghagga-core 2.8.0 → 2.9.0

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 (316) hide show
  1. package/dist/acp/adapter.d.ts +91 -0
  2. package/dist/acp/adapter.d.ts.map +1 -0
  3. package/dist/acp/adapter.js +315 -0
  4. package/dist/acp/adapter.js.map +1 -0
  5. package/dist/acp/index.d.ts +4 -0
  6. package/dist/acp/index.d.ts.map +1 -0
  7. package/dist/acp/index.js +2 -0
  8. package/dist/acp/index.js.map +1 -0
  9. package/dist/acp/types.d.ts +142 -0
  10. package/dist/acp/types.d.ts.map +1 -0
  11. package/dist/acp/types.js +13 -0
  12. package/dist/acp/types.js.map +1 -0
  13. package/dist/adversarial-qa.d.ts +60 -0
  14. package/dist/adversarial-qa.d.ts.map +1 -0
  15. package/dist/adversarial-qa.js +85 -0
  16. package/dist/adversarial-qa.js.map +1 -0
  17. package/dist/agents/audit.d.ts +18 -0
  18. package/dist/agents/audit.d.ts.map +1 -0
  19. package/dist/agents/audit.js +78 -0
  20. package/dist/agents/audit.js.map +1 -0
  21. package/dist/agents/consensus.d.ts +1 -1
  22. package/dist/agents/consensus.d.ts.map +1 -1
  23. package/dist/agents/consensus.js +10 -8
  24. package/dist/agents/consensus.js.map +1 -1
  25. package/dist/agents/diagnostic.d.ts.map +1 -1
  26. package/dist/agents/diagnostic.js +22 -20
  27. package/dist/agents/diagnostic.js.map +1 -1
  28. package/dist/agents/fan-out-lenses.d.ts +41 -0
  29. package/dist/agents/fan-out-lenses.d.ts.map +1 -1
  30. package/dist/agents/fan-out-lenses.js +117 -3
  31. package/dist/agents/fan-out-lenses.js.map +1 -1
  32. package/dist/agents/prompts.d.ts +12 -0
  33. package/dist/agents/prompts.d.ts.map +1 -1
  34. package/dist/agents/prompts.js +31 -0
  35. package/dist/agents/prompts.js.map +1 -1
  36. package/dist/agents/simple.d.ts +1 -1
  37. package/dist/agents/simple.d.ts.map +1 -1
  38. package/dist/agents/simple.js +10 -6
  39. package/dist/agents/simple.js.map +1 -1
  40. package/dist/agents/workflow.d.ts +1 -1
  41. package/dist/agents/workflow.d.ts.map +1 -1
  42. package/dist/agents/workflow.js +9 -8
  43. package/dist/agents/workflow.js.map +1 -1
  44. package/dist/aisvs.d.ts +44 -0
  45. package/dist/aisvs.d.ts.map +1 -0
  46. package/dist/aisvs.js +189 -0
  47. package/dist/aisvs.js.map +1 -0
  48. package/dist/checklist/context.d.ts.map +1 -1
  49. package/dist/checklist/context.js +2 -8
  50. package/dist/checklist/context.js.map +1 -1
  51. package/dist/checklist/defaults.d.ts.map +1 -1
  52. package/dist/checklist/defaults.js.map +1 -1
  53. package/dist/checklist/scorer.d.ts.map +1 -1
  54. package/dist/checklist/scorer.js +105 -12
  55. package/dist/checklist/scorer.js.map +1 -1
  56. package/dist/code-intel/client.d.ts +30 -0
  57. package/dist/code-intel/client.d.ts.map +1 -0
  58. package/dist/code-intel/client.js +91 -0
  59. package/dist/code-intel/client.js.map +1 -0
  60. package/dist/code-intel/context.d.ts +21 -0
  61. package/dist/code-intel/context.d.ts.map +1 -0
  62. package/dist/code-intel/context.js +72 -0
  63. package/dist/code-intel/context.js.map +1 -0
  64. package/dist/code-intel/index.d.ts +10 -0
  65. package/dist/code-intel/index.d.ts.map +1 -0
  66. package/dist/code-intel/index.js +11 -0
  67. package/dist/code-intel/index.js.map +1 -0
  68. package/dist/code-intel/types.d.ts +63 -0
  69. package/dist/code-intel/types.d.ts.map +1 -0
  70. package/dist/code-intel/types.js +9 -0
  71. package/dist/code-intel/types.js.map +1 -0
  72. package/dist/compress/index.d.ts +55 -0
  73. package/dist/compress/index.d.ts.map +1 -0
  74. package/dist/compress/index.js +166 -0
  75. package/dist/compress/index.js.map +1 -0
  76. package/dist/cost-footer.d.ts +38 -0
  77. package/dist/cost-footer.d.ts.map +1 -0
  78. package/dist/cost-footer.js +95 -0
  79. package/dist/cost-footer.js.map +1 -0
  80. package/dist/critique/critique.d.ts +40 -0
  81. package/dist/critique/critique.d.ts.map +1 -0
  82. package/dist/critique/critique.js +194 -0
  83. package/dist/critique/critique.js.map +1 -0
  84. package/dist/critique/cross-model.d.ts +123 -0
  85. package/dist/critique/cross-model.d.ts.map +1 -0
  86. package/dist/critique/cross-model.js +267 -0
  87. package/dist/critique/cross-model.js.map +1 -0
  88. package/dist/critique/index.d.ts +8 -0
  89. package/dist/critique/index.d.ts.map +1 -0
  90. package/dist/critique/index.js +6 -0
  91. package/dist/critique/index.js.map +1 -0
  92. package/dist/critique/prompts.d.ts +11 -0
  93. package/dist/critique/prompts.d.ts.map +1 -0
  94. package/dist/critique/prompts.js +66 -0
  95. package/dist/critique/prompts.js.map +1 -0
  96. package/dist/critique/types.d.ts +84 -0
  97. package/dist/critique/types.d.ts.map +1 -0
  98. package/dist/critique/types.js +13 -0
  99. package/dist/critique/types.js.map +1 -0
  100. package/dist/doc-validation/index.d.ts +9 -0
  101. package/dist/doc-validation/index.d.ts.map +1 -0
  102. package/dist/doc-validation/index.js +9 -0
  103. package/dist/doc-validation/index.js.map +1 -0
  104. package/dist/doc-validation/scanner.d.ts +40 -0
  105. package/dist/doc-validation/scanner.d.ts.map +1 -0
  106. package/dist/doc-validation/scanner.js +163 -0
  107. package/dist/doc-validation/scanner.js.map +1 -0
  108. package/dist/doc-validation/types.d.ts +27 -0
  109. package/dist/doc-validation/types.d.ts.map +1 -0
  110. package/dist/doc-validation/types.js +8 -0
  111. package/dist/doc-validation/types.js.map +1 -0
  112. package/dist/embed.d.ts +27 -0
  113. package/dist/embed.d.ts.map +1 -0
  114. package/dist/embed.js +47 -0
  115. package/dist/embed.js.map +1 -0
  116. package/dist/enhance/enhance.d.ts.map +1 -1
  117. package/dist/enhance/enhance.js +7 -25
  118. package/dist/enhance/enhance.js.map +1 -1
  119. package/dist/enhance/types.d.ts +5 -0
  120. package/dist/enhance/types.d.ts.map +1 -1
  121. package/dist/exploitability/analyzer.d.ts +42 -0
  122. package/dist/exploitability/analyzer.d.ts.map +1 -1
  123. package/dist/exploitability/analyzer.js +225 -0
  124. package/dist/exploitability/analyzer.js.map +1 -1
  125. package/dist/exploitability/index.d.ts +3 -2
  126. package/dist/exploitability/index.d.ts.map +1 -1
  127. package/dist/exploitability/index.js +1 -2
  128. package/dist/exploitability/index.js.map +1 -1
  129. package/dist/exploitability/types.d.ts +27 -0
  130. package/dist/exploitability/types.d.ts.map +1 -1
  131. package/dist/fetch-fix.d.ts +60 -0
  132. package/dist/fetch-fix.d.ts.map +1 -0
  133. package/dist/fetch-fix.js +137 -0
  134. package/dist/fetch-fix.js.map +1 -0
  135. package/dist/flood/index.d.ts +34 -0
  136. package/dist/flood/index.d.ts.map +1 -0
  137. package/dist/flood/index.js +67 -0
  138. package/dist/flood/index.js.map +1 -0
  139. package/dist/format.d.ts.map +1 -1
  140. package/dist/format.js +6 -1
  141. package/dist/format.js.map +1 -1
  142. package/dist/graph/blast-radius.js +2 -2
  143. package/dist/graph/blast-radius.js.map +1 -1
  144. package/dist/graph/call-chain.d.ts +36 -0
  145. package/dist/graph/call-chain.d.ts.map +1 -0
  146. package/dist/graph/call-chain.js +291 -0
  147. package/dist/graph/call-chain.js.map +1 -0
  148. package/dist/graph/index.d.ts +4 -0
  149. package/dist/graph/index.d.ts.map +1 -1
  150. package/dist/graph/index.js +2 -0
  151. package/dist/graph/index.js.map +1 -1
  152. package/dist/graph/reverse-deps.d.ts +37 -0
  153. package/dist/graph/reverse-deps.d.ts.map +1 -0
  154. package/dist/graph/reverse-deps.js +136 -0
  155. package/dist/graph/reverse-deps.js.map +1 -0
  156. package/dist/index.d.ts +50 -11
  157. package/dist/index.d.ts.map +1 -1
  158. package/dist/index.js +34 -7
  159. package/dist/index.js.map +1 -1
  160. package/dist/injection-corpus.d.ts +41 -0
  161. package/dist/injection-corpus.d.ts.map +1 -0
  162. package/dist/injection-corpus.js +181 -0
  163. package/dist/injection-corpus.js.map +1 -0
  164. package/dist/latent-comms.d.ts +31 -0
  165. package/dist/latent-comms.d.ts.map +1 -0
  166. package/dist/latent-comms.js +139 -0
  167. package/dist/latent-comms.js.map +1 -0
  168. package/dist/memory/pageindex/chunker.d.ts +33 -0
  169. package/dist/memory/pageindex/chunker.d.ts.map +1 -0
  170. package/dist/memory/pageindex/chunker.js +112 -0
  171. package/dist/memory/pageindex/chunker.js.map +1 -0
  172. package/dist/memory/pageindex/example.d.ts +22 -0
  173. package/dist/memory/pageindex/example.d.ts.map +1 -0
  174. package/dist/memory/pageindex/example.js +94 -0
  175. package/dist/memory/pageindex/example.js.map +1 -0
  176. package/dist/memory/pageindex/index.d.ts +15 -0
  177. package/dist/memory/pageindex/index.d.ts.map +1 -0
  178. package/dist/memory/pageindex/index.js +17 -0
  179. package/dist/memory/pageindex/index.js.map +1 -0
  180. package/dist/memory/pageindex/service.d.ts +53 -0
  181. package/dist/memory/pageindex/service.d.ts.map +1 -0
  182. package/dist/memory/pageindex/service.js +229 -0
  183. package/dist/memory/pageindex/service.js.map +1 -0
  184. package/dist/memory/pageindex/types.d.ts +67 -0
  185. package/dist/memory/pageindex/types.d.ts.map +1 -0
  186. package/dist/memory/pageindex/types.js +14 -0
  187. package/dist/memory/pageindex/types.js.map +1 -0
  188. package/dist/memory/persist.d.ts.map +1 -1
  189. package/dist/memory/persist.js +6 -2
  190. package/dist/memory/persist.js.map +1 -1
  191. package/dist/memory/sqlite.d.ts +69 -2
  192. package/dist/memory/sqlite.d.ts.map +1 -1
  193. package/dist/memory/sqlite.js +312 -5
  194. package/dist/memory/sqlite.js.map +1 -1
  195. package/dist/memory/taxonomy.d.ts +34 -0
  196. package/dist/memory/taxonomy.d.ts.map +1 -0
  197. package/dist/memory/taxonomy.js +189 -0
  198. package/dist/memory/taxonomy.js.map +1 -0
  199. package/dist/memory/versioning.d.ts.map +1 -1
  200. package/dist/memory/versioning.js.map +1 -1
  201. package/dist/negative.d.ts +23 -0
  202. package/dist/negative.d.ts.map +1 -0
  203. package/dist/negative.js +40 -0
  204. package/dist/negative.js.map +1 -0
  205. package/dist/pipeline.d.ts.map +1 -1
  206. package/dist/pipeline.js +455 -46
  207. package/dist/pipeline.js.map +1 -1
  208. package/dist/prompt-intel.d.ts +39 -0
  209. package/dist/prompt-intel.d.ts.map +1 -0
  210. package/dist/prompt-intel.js +148 -0
  211. package/dist/prompt-intel.js.map +1 -0
  212. package/dist/providers/cli-bridge.d.ts +4 -0
  213. package/dist/providers/cli-bridge.d.ts.map +1 -1
  214. package/dist/providers/cli-bridge.js +4 -0
  215. package/dist/providers/cli-bridge.js.map +1 -1
  216. package/dist/providers/generate-fn.d.ts +3 -15
  217. package/dist/providers/generate-fn.d.ts.map +1 -1
  218. package/dist/providers/generate-fn.js +3 -30
  219. package/dist/providers/generate-fn.js.map +1 -1
  220. package/dist/providers/index.d.ts.map +1 -1
  221. package/dist/providers/index.js.map +1 -1
  222. package/dist/providers/ollama.d.ts +15 -0
  223. package/dist/providers/ollama.d.ts.map +1 -0
  224. package/dist/providers/ollama.js +30 -0
  225. package/dist/providers/ollama.js.map +1 -0
  226. package/dist/ranking/index.d.ts +9 -0
  227. package/dist/ranking/index.d.ts.map +1 -0
  228. package/dist/ranking/index.js +82 -0
  229. package/dist/ranking/index.js.map +1 -0
  230. package/dist/recursive/circuit-breaker.d.ts +36 -0
  231. package/dist/recursive/circuit-breaker.d.ts.map +1 -0
  232. package/dist/recursive/circuit-breaker.js +62 -0
  233. package/dist/recursive/circuit-breaker.js.map +1 -0
  234. package/dist/recursive/index.d.ts +4 -0
  235. package/dist/recursive/index.d.ts.map +1 -1
  236. package/dist/recursive/index.js +18 -1
  237. package/dist/recursive/index.js.map +1 -1
  238. package/dist/recursive/types.d.ts +2 -0
  239. package/dist/recursive/types.d.ts.map +1 -1
  240. package/dist/recursive/types.js +1 -0
  241. package/dist/recursive/types.js.map +1 -1
  242. package/dist/scope/diff-mapper.js.map +1 -1
  243. package/dist/scope/entity-diff.d.ts +58 -0
  244. package/dist/scope/entity-diff.d.ts.map +1 -0
  245. package/dist/scope/entity-diff.js +224 -0
  246. package/dist/scope/entity-diff.js.map +1 -0
  247. package/dist/scope/extractor.d.ts.map +1 -1
  248. package/dist/scope/extractor.js.map +1 -1
  249. package/dist/scope/index.d.ts +3 -1
  250. package/dist/scope/index.d.ts.map +1 -1
  251. package/dist/scope/index.js +3 -0
  252. package/dist/scope/index.js.map +1 -1
  253. package/dist/scope/parser.d.ts +1 -1
  254. package/dist/scope/parser.d.ts.map +1 -1
  255. package/dist/scope/parser.js.map +1 -1
  256. package/dist/scope/types.d.ts +32 -0
  257. package/dist/scope/types.d.ts.map +1 -1
  258. package/dist/scope/types.js +7 -1
  259. package/dist/scope/types.js.map +1 -1
  260. package/dist/search/index.d.ts +11 -0
  261. package/dist/search/index.d.ts.map +1 -0
  262. package/dist/search/index.js +10 -0
  263. package/dist/search/index.js.map +1 -0
  264. package/dist/search/indexer.d.ts +67 -0
  265. package/dist/search/indexer.d.ts.map +1 -0
  266. package/dist/search/indexer.js +196 -0
  267. package/dist/search/indexer.js.map +1 -0
  268. package/dist/search/searcher.d.ts +34 -0
  269. package/dist/search/searcher.d.ts.map +1 -0
  270. package/dist/search/searcher.js +101 -0
  271. package/dist/search/searcher.js.map +1 -0
  272. package/dist/search/types.d.ts +81 -0
  273. package/dist/search/types.d.ts.map +1 -0
  274. package/dist/search/types.js +8 -0
  275. package/dist/search/types.js.map +1 -0
  276. package/dist/self-improve/index.d.ts +53 -0
  277. package/dist/self-improve/index.d.ts.map +1 -0
  278. package/dist/self-improve/index.js +136 -0
  279. package/dist/self-improve/index.js.map +1 -0
  280. package/dist/semantic-diff/index.d.ts +31 -0
  281. package/dist/semantic-diff/index.d.ts.map +1 -0
  282. package/dist/semantic-diff/index.js +215 -0
  283. package/dist/semantic-diff/index.js.map +1 -0
  284. package/dist/testing/index.d.ts +67 -0
  285. package/dist/testing/index.d.ts.map +1 -0
  286. package/dist/testing/index.js +76 -0
  287. package/dist/testing/index.js.map +1 -0
  288. package/dist/testing/vitest-helpers.d.ts +26 -0
  289. package/dist/testing/vitest-helpers.d.ts.map +1 -0
  290. package/dist/testing/vitest-helpers.js +37 -0
  291. package/dist/testing/vitest-helpers.js.map +1 -0
  292. package/dist/tools/index.d.ts +3 -1
  293. package/dist/tools/index.d.ts.map +1 -1
  294. package/dist/tools/index.js +2 -1
  295. package/dist/tools/index.js.map +1 -1
  296. package/dist/tools/remote-query.d.ts +40 -0
  297. package/dist/tools/remote-query.d.ts.map +1 -0
  298. package/dist/tools/remote-query.js +71 -0
  299. package/dist/tools/remote-query.js.map +1 -0
  300. package/dist/tracing/index.d.ts +39 -0
  301. package/dist/tracing/index.d.ts.map +1 -0
  302. package/dist/tracing/index.js +70 -0
  303. package/dist/tracing/index.js.map +1 -0
  304. package/dist/trajectory.d.ts +65 -0
  305. package/dist/trajectory.d.ts.map +1 -0
  306. package/dist/trajectory.js +126 -0
  307. package/dist/trajectory.js.map +1 -0
  308. package/dist/trust/index.d.ts +34 -0
  309. package/dist/trust/index.d.ts.map +1 -0
  310. package/dist/trust/index.js +78 -0
  311. package/dist/trust/index.js.map +1 -0
  312. package/dist/types.d.ts +144 -5
  313. package/dist/types.d.ts.map +1 -1
  314. package/dist/types.js +2 -11
  315. package/dist/types.js.map +1 -1
  316. package/package.json +1 -3
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Cross-model review: run the same PR through multiple models,
3
+ * then surface disagreements as high-confidence findings.
4
+ *
5
+ * Where both models agree on an issue → confidence is high.
6
+ * Where they disagree → flagged for human review.
7
+ *
8
+ * Builds on the dual-critique loop: each model's review goes through
9
+ * self-critique before comparison, ensuring cleaner signal.
10
+ */
11
+ import type { GenerateTextFn } from '../providers/generate-fn.js';
12
+ import type { ProgressCallback, ReviewFinding, ReviewResult } from '../types.js';
13
+ export type AgreementLevel = 'agreed' | 'model-a-only' | 'model-b-only' | 'disagreed';
14
+ /**
15
+ * A finding annotated with cross-model agreement information.
16
+ */
17
+ export interface CrossModelFinding extends ReviewFinding {
18
+ /** Which models produced this finding */
19
+ agreementLevel: AgreementLevel;
20
+ /** Confidence derived from cross-model agreement (0.0–1.0) */
21
+ crossModelConfidence: number;
22
+ /** Which model(s) reported this finding */
23
+ reportedBy: string[];
24
+ }
25
+ export interface CrossModelConfig {
26
+ /**
27
+ * Similarity threshold for matching findings across models.
28
+ * Two findings are considered "the same" if they share the same file
29
+ * and their messages have a similarity score above this threshold.
30
+ * Default: 0.6
31
+ */
32
+ similarityThreshold: number;
33
+ /**
34
+ * Whether to run dual-critique on each model's review before comparison.
35
+ * Default: true (recommended — reduces noise before cross-model diff)
36
+ */
37
+ enableCritique: boolean;
38
+ /**
39
+ * Confidence boost for agreed findings (added to base confidence).
40
+ * Default: 0.3
41
+ */
42
+ agreementBoost: number;
43
+ /**
44
+ * Confidence penalty for single-model-only findings.
45
+ * Default: 0.2
46
+ */
47
+ disagreementPenalty: number;
48
+ }
49
+ export declare const DEFAULT_CROSS_MODEL_CONFIG: CrossModelConfig;
50
+ export interface CrossModelInput {
51
+ /** The code diff */
52
+ diff: string;
53
+ /** Static analysis context */
54
+ staticContext: string;
55
+ /** Memory context */
56
+ memoryContext: string | null;
57
+ /** Stack hints */
58
+ stackHints: string;
59
+ /** Optional checklist context */
60
+ checklistContext?: string;
61
+ /** Label for model A (e.g., "claude-sonnet") */
62
+ modelALabel: string;
63
+ /** Label for model B (e.g., "gpt-4o") */
64
+ modelBLabel: string;
65
+ /** Configuration */
66
+ config?: Partial<CrossModelConfig>;
67
+ }
68
+ export interface CrossModelResult {
69
+ /** Final status based on cross-model consensus */
70
+ status: ReviewResult['status'];
71
+ /** Summary incorporating cross-model analysis */
72
+ summary: string;
73
+ /** All findings with agreement annotations */
74
+ findings: CrossModelFinding[];
75
+ /** Metadata about the cross-model comparison */
76
+ metadata: {
77
+ modelALabel: string;
78
+ modelBLabel: string;
79
+ modelAFindingCount: number;
80
+ modelBFindingCount: number;
81
+ agreedCount: number;
82
+ modelAOnlyCount: number;
83
+ modelBOnlyCount: number;
84
+ disagreedCount: number;
85
+ };
86
+ }
87
+ /**
88
+ * Simple word-overlap similarity between two strings.
89
+ * Returns a score between 0.0 and 1.0.
90
+ *
91
+ * This is intentionally simple — we're comparing review finding
92
+ * messages that should share significant vocabulary if they describe
93
+ * the same issue.
94
+ */
95
+ export declare function computeSimilarity(a: string, b: string): number;
96
+ interface FindingMatch {
97
+ indexA: number;
98
+ indexB: number;
99
+ similarity: number;
100
+ }
101
+ /**
102
+ * Match findings from two reviews based on file + message similarity.
103
+ * Uses greedy matching: best match first, no finding matched twice.
104
+ */
105
+ export declare function matchFindings(findingsA: ReviewFinding[], findingsB: ReviewFinding[], threshold: number): {
106
+ matches: FindingMatch[];
107
+ unmatchedA: number[];
108
+ unmatchedB: number[];
109
+ };
110
+ /**
111
+ * Run cross-model review: two models review the same diff,
112
+ * then their findings are compared and annotated with agreement levels.
113
+ *
114
+ * @param reviewA - Review result from model A
115
+ * @param reviewB - Review result from model B
116
+ * @param input - Context for the cross-model comparison
117
+ * @param generateFnA - LLM generation function for model A (used by critique)
118
+ * @param generateFnB - LLM generation function for model B (used by critique)
119
+ * @param onProgress - Optional progress callback
120
+ */
121
+ export declare function runCrossModelReview(reviewA: ReviewResult, reviewB: ReviewResult, input: CrossModelInput, generateFnA: GenerateTextFn, generateFnB: GenerateTextFn, onProgress?: ProgressCallback): Promise<CrossModelResult>;
122
+ export {};
123
+ //# sourceMappingURL=cross-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-model.d.ts","sourceRoot":"","sources":["../../src/critique/cross-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAmB,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMlG,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,cAAc,GAAG,cAAc,GAAG,WAAW,CAAC;AAEtF;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,yCAAyC;IACzC,cAAc,EAAE,cAAc,CAAC;IAE/B,8DAA8D;IAC9D,oBAAoB,EAAE,MAAM,CAAC;IAE7B,2CAA2C;IAC3C,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAE5B;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAC;IAExB;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,0BAA0B,EAAE,gBAKxC,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IAEb,8BAA8B;IAC9B,aAAa,EAAE,MAAM,CAAC;IAEtB,qBAAqB;IACrB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAC;IAEnB,iCAAiC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IAEpB,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IAEpB,oBAAoB;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IAE/B,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAEhB,8CAA8C;IAC9C,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAE9B,gDAAgD;IAChD,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,kBAAkB,EAAE,MAAM,CAAC;QAC3B,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;QACxB,eAAe,EAAE,MAAM,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAID;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAuB9D;AAID,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,aAAa,EAAE,EAC1B,SAAS,EAAE,aAAa,EAAE,EAC1B,SAAS,EAAE,MAAM,GAChB;IACD,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAiCA;AA0BD;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,YAAY,EACrB,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,cAAc,EAC3B,WAAW,EAAE,cAAc,EAC3B,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CA+J3B"}
@@ -0,0 +1,267 @@
1
+ /**
2
+ * Cross-model review: run the same PR through multiple models,
3
+ * then surface disagreements as high-confidence findings.
4
+ *
5
+ * Where both models agree on an issue → confidence is high.
6
+ * Where they disagree → flagged for human review.
7
+ *
8
+ * Builds on the dual-critique loop: each model's review goes through
9
+ * self-critique before comparison, ensuring cleaner signal.
10
+ */
11
+ import { runDualCritique } from './critique.js';
12
+ export const DEFAULT_CROSS_MODEL_CONFIG = {
13
+ similarityThreshold: 0.6,
14
+ enableCritique: true,
15
+ agreementBoost: 0.3,
16
+ disagreementPenalty: 0.2,
17
+ };
18
+ // ─── Similarity ────────────────────────────────────────────────
19
+ /**
20
+ * Simple word-overlap similarity between two strings.
21
+ * Returns a score between 0.0 and 1.0.
22
+ *
23
+ * This is intentionally simple — we're comparing review finding
24
+ * messages that should share significant vocabulary if they describe
25
+ * the same issue.
26
+ */
27
+ export function computeSimilarity(a, b) {
28
+ const tokenize = (s) => new Set(s
29
+ .toLowerCase()
30
+ .replace(/[^a-z0-9\s]/g, ' ')
31
+ .split(/\s+/)
32
+ .filter((w) => w.length > 2));
33
+ const tokensA = tokenize(a);
34
+ const tokensB = tokenize(b);
35
+ if (tokensA.size === 0 || tokensB.size === 0)
36
+ return 0;
37
+ let intersection = 0;
38
+ for (const token of tokensA) {
39
+ if (tokensB.has(token))
40
+ intersection++;
41
+ }
42
+ // Jaccard similarity
43
+ const union = new Set([...tokensA, ...tokensB]).size;
44
+ return union === 0 ? 0 : intersection / union;
45
+ }
46
+ /**
47
+ * Match findings from two reviews based on file + message similarity.
48
+ * Uses greedy matching: best match first, no finding matched twice.
49
+ */
50
+ export function matchFindings(findingsA, findingsB, threshold) {
51
+ const candidates = [];
52
+ for (let i = 0; i < findingsA.length; i++) {
53
+ for (let j = 0; j < findingsB.length; j++) {
54
+ // Must be about the same file
55
+ if (findingsA[i].file !== findingsB[j].file)
56
+ continue;
57
+ const sim = computeSimilarity(findingsA[i].message, findingsB[j].message);
58
+ if (sim >= threshold) {
59
+ candidates.push({ indexA: i, indexB: j, similarity: sim });
60
+ }
61
+ }
62
+ }
63
+ // Greedy matching: sort by similarity desc, take best non-overlapping
64
+ candidates.sort((a, b) => b.similarity - a.similarity);
65
+ const usedA = new Set();
66
+ const usedB = new Set();
67
+ const matches = [];
68
+ for (const candidate of candidates) {
69
+ if (usedA.has(candidate.indexA) || usedB.has(candidate.indexB))
70
+ continue;
71
+ matches.push(candidate);
72
+ usedA.add(candidate.indexA);
73
+ usedB.add(candidate.indexB);
74
+ }
75
+ const unmatchedA = findingsA.map((_, i) => i).filter((i) => !usedA.has(i));
76
+ const unmatchedB = findingsB.map((_, i) => i).filter((i) => !usedB.has(i));
77
+ return { matches, unmatchedA, unmatchedB };
78
+ }
79
+ // ─── Confidence ────────────────────────────────────────────────
80
+ /**
81
+ * Compute confidence for a finding based on its severity and agreement.
82
+ */
83
+ function baseConfidence(severity) {
84
+ switch (severity) {
85
+ case 'critical':
86
+ return 0.9;
87
+ case 'high':
88
+ return 0.8;
89
+ case 'medium':
90
+ return 0.6;
91
+ case 'low':
92
+ return 0.4;
93
+ case 'info':
94
+ return 0.3;
95
+ default:
96
+ return 0.5;
97
+ }
98
+ }
99
+ // ─── Main Function ─────────────────────────────────────────────
100
+ /**
101
+ * Run cross-model review: two models review the same diff,
102
+ * then their findings are compared and annotated with agreement levels.
103
+ *
104
+ * @param reviewA - Review result from model A
105
+ * @param reviewB - Review result from model B
106
+ * @param input - Context for the cross-model comparison
107
+ * @param generateFnA - LLM generation function for model A (used by critique)
108
+ * @param generateFnB - LLM generation function for model B (used by critique)
109
+ * @param onProgress - Optional progress callback
110
+ */
111
+ export async function runCrossModelReview(reviewA, reviewB, input, generateFnA, generateFnB, onProgress) {
112
+ const emit = onProgress ?? (() => { });
113
+ const config = { ...DEFAULT_CROSS_MODEL_CONFIG, ...input.config };
114
+ // ── Step 1: Optionally run dual-critique on each review ──────
115
+ let critiquedA = reviewA;
116
+ let critiquedB = reviewB;
117
+ if (config.enableCritique) {
118
+ emit({
119
+ step: 'cross-model',
120
+ message: `Running dual-critique on both models in parallel...`,
121
+ });
122
+ const critiqueInput = {
123
+ diff: input.diff,
124
+ staticContext: input.staticContext,
125
+ memoryContext: input.memoryContext,
126
+ stackHints: input.stackHints,
127
+ checklistContext: input.checklistContext,
128
+ };
129
+ [critiquedA, critiquedB] = await Promise.all([
130
+ runDualCritique(reviewA, critiqueInput, generateFnA, (event) => emit({ ...event, message: `[${input.modelALabel}] ${event.message}` })),
131
+ runDualCritique(reviewB, critiqueInput, generateFnB, (event) => emit({ ...event, message: `[${input.modelBLabel}] ${event.message}` })),
132
+ ]);
133
+ }
134
+ // ── Step 2: Extract AI findings from each model ──────────────
135
+ const findingsA = critiquedA.findings.filter((f) => f.source === 'ai');
136
+ const findingsB = critiquedB.findings.filter((f) => f.source === 'ai');
137
+ emit({
138
+ step: 'cross-model',
139
+ message: `Comparing ${findingsA.length} findings from ${input.modelALabel} vs ${findingsB.length} from ${input.modelBLabel}...`,
140
+ });
141
+ // ── Step 3: Match findings across models ─────────────────────
142
+ const { matches, unmatchedA, unmatchedB } = matchFindings(findingsA, findingsB, config.similarityThreshold);
143
+ // ── Step 4: Build annotated findings ─────────────────────────
144
+ const crossFindings = [];
145
+ // Agreed findings (both models flagged the same issue)
146
+ for (const match of matches) {
147
+ const fA = findingsA[match.indexA];
148
+ const fB = findingsB[match.indexB];
149
+ // Use the higher severity between the two
150
+ const severity = severityRank(fA.severity) >= severityRank(fB.severity)
151
+ ? fA.severity
152
+ : fB.severity;
153
+ const conf = Math.min(1.0, baseConfidence(severity) + config.agreementBoost);
154
+ crossFindings.push({
155
+ ...fA,
156
+ severity,
157
+ agreementLevel: 'agreed',
158
+ crossModelConfidence: conf,
159
+ reportedBy: [input.modelALabel, input.modelBLabel],
160
+ });
161
+ }
162
+ // Model A only
163
+ for (const idx of unmatchedA) {
164
+ const f = findingsA[idx];
165
+ const conf = Math.max(0.1, baseConfidence(f.severity) - config.disagreementPenalty);
166
+ crossFindings.push({
167
+ ...f,
168
+ agreementLevel: 'model-a-only',
169
+ crossModelConfidence: conf,
170
+ reportedBy: [input.modelALabel],
171
+ });
172
+ }
173
+ // Model B only
174
+ for (const idx of unmatchedB) {
175
+ const f = findingsB[idx];
176
+ const conf = Math.max(0.1, baseConfidence(f.severity) - config.disagreementPenalty);
177
+ crossFindings.push({
178
+ ...f,
179
+ agreementLevel: 'model-b-only',
180
+ crossModelConfidence: conf,
181
+ reportedBy: [input.modelBLabel],
182
+ });
183
+ }
184
+ // Sort by confidence descending
185
+ crossFindings.sort((a, b) => b.crossModelConfidence - a.crossModelConfidence);
186
+ // ── Step 5: Merge static findings (untouched) ────────────────
187
+ // Collect static findings from model A only (avoid duplicates)
188
+ const staticFindings = critiquedA.findings
189
+ .filter((f) => f.source !== 'ai')
190
+ .map((f) => ({
191
+ ...f,
192
+ agreementLevel: 'agreed',
193
+ crossModelConfidence: 1.0,
194
+ reportedBy: ['static-analysis'],
195
+ }));
196
+ const allFindings = [...crossFindings, ...staticFindings];
197
+ // ── Step 6: Determine status ─────────────────────────────────
198
+ const agreedCount = matches.length;
199
+ const hasHighConfidenceCritical = crossFindings.some((f) => f.agreementLevel === 'agreed' && (f.severity === 'critical' || f.severity === 'high'));
200
+ let status;
201
+ if (hasHighConfidenceCritical) {
202
+ status = 'FAILED';
203
+ }
204
+ else if (crossFindings.some((f) => f.agreementLevel !== 'agreed')) {
205
+ status = 'NEEDS_HUMAN_REVIEW';
206
+ }
207
+ else if (crossFindings.length === 0) {
208
+ status = 'PASSED';
209
+ }
210
+ else {
211
+ status = 'PASSED';
212
+ }
213
+ const summary = buildCrossModelSummary(input.modelALabel, input.modelBLabel, agreedCount, unmatchedA.length, unmatchedB.length);
214
+ emit({
215
+ step: 'cross-model',
216
+ message: `Cross-model complete: ${agreedCount} agreed, ${unmatchedA.length} ${input.modelALabel}-only, ${unmatchedB.length} ${input.modelBLabel}-only`,
217
+ });
218
+ return {
219
+ status,
220
+ summary,
221
+ findings: allFindings,
222
+ metadata: {
223
+ modelALabel: input.modelALabel,
224
+ modelBLabel: input.modelBLabel,
225
+ modelAFindingCount: findingsA.length,
226
+ modelBFindingCount: findingsB.length,
227
+ agreedCount,
228
+ modelAOnlyCount: unmatchedA.length,
229
+ modelBOnlyCount: unmatchedB.length,
230
+ disagreedCount: 0,
231
+ },
232
+ };
233
+ }
234
+ // ─── Helpers ───────────────────────────────────────────────────
235
+ function severityRank(severity) {
236
+ switch (severity) {
237
+ case 'critical':
238
+ return 5;
239
+ case 'high':
240
+ return 4;
241
+ case 'medium':
242
+ return 3;
243
+ case 'low':
244
+ return 2;
245
+ case 'info':
246
+ return 1;
247
+ default:
248
+ return 0;
249
+ }
250
+ }
251
+ function buildCrossModelSummary(modelA, modelB, agreed, aOnly, bOnly) {
252
+ const parts = [];
253
+ if (agreed > 0) {
254
+ parts.push(`${agreed} finding(s) confirmed by both ${modelA} and ${modelB} (high confidence)`);
255
+ }
256
+ if (aOnly > 0) {
257
+ parts.push(`${aOnly} finding(s) reported only by ${modelA} (needs human verification)`);
258
+ }
259
+ if (bOnly > 0) {
260
+ parts.push(`${bOnly} finding(s) reported only by ${modelB} (needs human verification)`);
261
+ }
262
+ if (parts.length === 0) {
263
+ return `Cross-model review by ${modelA} and ${modelB}: no issues found.`;
264
+ }
265
+ return `Cross-model review: ${parts.join('; ')}.`;
266
+ }
267
+ //# sourceMappingURL=cross-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-model.js","sourceRoot":"","sources":["../../src/critique/cross-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export { applyCritique, parseCritiqueResponse, runDualCritique } from './critique.js';
2
+ export { computeSimilarity, matchFindings, runCrossModelReview, } from './cross-model.js';
3
+ export type { AgreementLevel, CrossModelConfig, CrossModelFinding, CrossModelInput, CrossModelResult, } from './cross-model.js';
4
+ export { DEFAULT_CROSS_MODEL_CONFIG } from './cross-model.js';
5
+ export { REFINED_REVIEW_SYSTEM, SELF_CRITIQUE_SYSTEM } from './prompts.js';
6
+ export type { CritiqueResult, CritiqueVerdict, DualCritiqueConfig, DualCritiqueInput, DualCritiqueResult, FindingCritique, } from './types.js';
7
+ export { DEFAULT_DUAL_CRITIQUE_CONFIG } from './types.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/critique/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACtF,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC3E,YAAY,EACV,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { applyCritique, parseCritiqueResponse, runDualCritique } from './critique.js';
2
+ export { computeSimilarity, matchFindings, runCrossModelReview, } from './cross-model.js';
3
+ export { DEFAULT_CROSS_MODEL_CONFIG } from './cross-model.js';
4
+ export { REFINED_REVIEW_SYSTEM, SELF_CRITIQUE_SYSTEM } from './prompts.js';
5
+ export { DEFAULT_DUAL_CRITIQUE_CONFIG } from './types.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/critique/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACtF,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAQ1B,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAS3E,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Prompts for the dual-critique review loop.
3
+ *
4
+ * Three distinct system prompts for the 3-agent pattern:
5
+ * 1. INITIAL_REVIEW_SYSTEM — standard review (delegates to existing agents)
6
+ * 2. SELF_CRITIQUE_SYSTEM — evaluates the initial review for quality
7
+ * 3. REFINED_REVIEW_SYSTEM — produces the final review incorporating critique
8
+ */
9
+ export declare const SELF_CRITIQUE_SYSTEM = "You are a senior code review CRITIC. Your job is NOT to review the code \u2014 it has already been reviewed. Your job is to evaluate the QUALITY of the review itself.\n\nYou will receive:\n1. A code diff\n2. An initial review with findings\n\nFor EACH finding in the initial review, assign a verdict:\n- **valid**: The finding is accurate, actionable, and correctly scoped\n- **false-positive**: The finding is wrong \u2014 the code is actually correct\n- **overreaction**: The finding identifies a real issue but the severity is too high\n- **vague**: The finding is too generic to be actionable\n- **redundant**: The finding duplicates another finding in the same review\n\nCommon patterns to watch for:\n- Flagging standard library usage as \"potential issues\"\n- Reporting style preferences as bugs\n- Flagging intentional patterns (e.g., early returns, guard clauses) as problems\n- Over-reporting on generated/vendored code\n- Raising theoretical concerns without evidence in the diff\n\nOUTPUT FORMAT:\nOVERALL_ASSESSMENT: <1-2 sentences about the review quality>\n\nCRITIQUES:\n- FINDING_INDEX: <0-based index>\n VERDICT: <valid|false-positive|overreaction|vague|redundant>\n REASONING: <why this verdict>\n SUGGESTED_SEVERITY: <only when verdict is overreaction \u2014 one of: critical, high, medium, low, info>\n";
10
+ export declare const REFINED_REVIEW_SYSTEM = "You are a senior code reviewer producing a REFINED review. You have access to:\n1. The original code diff\n2. An initial review with findings\n3. A self-critique of that review\n\nYour job is to produce the FINAL review by:\n- KEEPING findings marked as \"valid\" (unchanged)\n- REMOVING findings marked as \"false-positive\" or \"redundant\"\n- ADJUSTING severity for findings marked as \"overreaction\"\n- IMPROVING findings marked as \"vague\" to be more specific and actionable\n- Synthesizing a new summary that reflects the refined findings\n\nDo NOT add new findings that weren't in the initial review.\nDo NOT change the meaning of valid findings.\n\nOUTPUT FORMAT (same as standard review):\nSTATUS: <PASSED|FAILED|NEEDS_HUMAN_REVIEW>\nSUMMARY: <refined summary reflecting the actual issues>\nFINDINGS:\n- SEVERITY: <severity>\n CATEGORY: <category>\n FILE: <file path>\n LINE: <line number or N/A>\n MESSAGE: <message>\n SUGGESTION: <suggestion>\n";
11
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/critique/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,eAAO,MAAM,oBAAoB,mzCA4BhC,CAAC;AAIF,eAAO,MAAM,qBAAqB,u8BAyBjC,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Prompts for the dual-critique review loop.
3
+ *
4
+ * Three distinct system prompts for the 3-agent pattern:
5
+ * 1. INITIAL_REVIEW_SYSTEM — standard review (delegates to existing agents)
6
+ * 2. SELF_CRITIQUE_SYSTEM — evaluates the initial review for quality
7
+ * 3. REFINED_REVIEW_SYSTEM — produces the final review incorporating critique
8
+ */
9
+ // ─── Self-Critique Prompt ──────────────────────────────────────
10
+ export const SELF_CRITIQUE_SYSTEM = `You are a senior code review CRITIC. Your job is NOT to review the code — it has already been reviewed. Your job is to evaluate the QUALITY of the review itself.
11
+
12
+ You will receive:
13
+ 1. A code diff
14
+ 2. An initial review with findings
15
+
16
+ For EACH finding in the initial review, assign a verdict:
17
+ - **valid**: The finding is accurate, actionable, and correctly scoped
18
+ - **false-positive**: The finding is wrong — the code is actually correct
19
+ - **overreaction**: The finding identifies a real issue but the severity is too high
20
+ - **vague**: The finding is too generic to be actionable
21
+ - **redundant**: The finding duplicates another finding in the same review
22
+
23
+ Common patterns to watch for:
24
+ - Flagging standard library usage as "potential issues"
25
+ - Reporting style preferences as bugs
26
+ - Flagging intentional patterns (e.g., early returns, guard clauses) as problems
27
+ - Over-reporting on generated/vendored code
28
+ - Raising theoretical concerns without evidence in the diff
29
+
30
+ OUTPUT FORMAT:
31
+ OVERALL_ASSESSMENT: <1-2 sentences about the review quality>
32
+
33
+ CRITIQUES:
34
+ - FINDING_INDEX: <0-based index>
35
+ VERDICT: <valid|false-positive|overreaction|vague|redundant>
36
+ REASONING: <why this verdict>
37
+ SUGGESTED_SEVERITY: <only when verdict is overreaction — one of: critical, high, medium, low, info>
38
+ `;
39
+ // ─── Refined Review Prompt ─────────────────────────────────────
40
+ export const REFINED_REVIEW_SYSTEM = `You are a senior code reviewer producing a REFINED review. You have access to:
41
+ 1. The original code diff
42
+ 2. An initial review with findings
43
+ 3. A self-critique of that review
44
+
45
+ Your job is to produce the FINAL review by:
46
+ - KEEPING findings marked as "valid" (unchanged)
47
+ - REMOVING findings marked as "false-positive" or "redundant"
48
+ - ADJUSTING severity for findings marked as "overreaction"
49
+ - IMPROVING findings marked as "vague" to be more specific and actionable
50
+ - Synthesizing a new summary that reflects the refined findings
51
+
52
+ Do NOT add new findings that weren't in the initial review.
53
+ Do NOT change the meaning of valid findings.
54
+
55
+ OUTPUT FORMAT (same as standard review):
56
+ STATUS: <PASSED|FAILED|NEEDS_HUMAN_REVIEW>
57
+ SUMMARY: <refined summary reflecting the actual issues>
58
+ FINDINGS:
59
+ - SEVERITY: <severity>
60
+ CATEGORY: <category>
61
+ FILE: <file path>
62
+ LINE: <line number or N/A>
63
+ MESSAGE: <message>
64
+ SUGGESTION: <suggestion>
65
+ `;
66
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/critique/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,kEAAkE;AAElE,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BnC,CAAC;AAEF,kEAAkE;AAElE,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CAyBpC,CAAC"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Types for the dual-critique review loop.
3
+ *
4
+ * The 3-agent pattern:
5
+ * 1. Initial Review — standard code review producing findings
6
+ * 2. Self-Critique — evaluates the review for false positives, overreactions, vagueness
7
+ * 3. Refined Review — produces a final review incorporating the critique feedback
8
+ */
9
+ import type { ReviewFinding, ReviewStatus } from '../types.js';
10
+ export type CritiqueVerdict = 'valid' | 'false-positive' | 'overreaction' | 'vague' | 'redundant';
11
+ /**
12
+ * A critique of a single finding from the initial review.
13
+ * The self-critique agent evaluates each finding and assigns a verdict.
14
+ */
15
+ export interface FindingCritique {
16
+ /** Index of the finding in the initial review's findings array */
17
+ findingIndex: number;
18
+ /** The verdict on this finding */
19
+ verdict: CritiqueVerdict;
20
+ /** Explanation of why this verdict was assigned */
21
+ reasoning: string;
22
+ /** Suggested severity adjustment (only when verdict is 'overreaction') */
23
+ suggestedSeverity?: ReviewFinding['severity'];
24
+ }
25
+ export interface CritiqueResult {
26
+ /** Individual critiques for each finding */
27
+ critiques: FindingCritique[];
28
+ /** Overall assessment of the initial review quality */
29
+ overallAssessment: string;
30
+ /** Count of findings flagged as false positives */
31
+ falsePositiveCount: number;
32
+ /** Count of findings flagged as overreactions */
33
+ overreactionCount: number;
34
+ }
35
+ export interface DualCritiqueConfig {
36
+ /**
37
+ * Minimum number of findings in the initial review to trigger self-critique.
38
+ * Below this threshold, the initial review is returned as-is.
39
+ * Default: 1
40
+ */
41
+ minFindingsForCritique: number;
42
+ /**
43
+ * Whether to include the critique metadata in the final result.
44
+ * Default: true
45
+ */
46
+ includeCritiqueMetadata: boolean;
47
+ }
48
+ export declare const DEFAULT_DUAL_CRITIQUE_CONFIG: DualCritiqueConfig;
49
+ export interface DualCritiqueInput {
50
+ /** The code diff being reviewed */
51
+ diff: string;
52
+ /** Static analysis context */
53
+ staticContext: string;
54
+ /** Memory context (if available) */
55
+ memoryContext: string | null;
56
+ /** Stack hints for the codebase */
57
+ stackHints: string;
58
+ /** Optional checklist context */
59
+ checklistContext?: string;
60
+ /** Configuration for the dual-critique loop */
61
+ config?: Partial<DualCritiqueConfig>;
62
+ }
63
+ export interface DualCritiqueResult {
64
+ /** The final refined review status */
65
+ status: ReviewStatus;
66
+ /** The final refined summary */
67
+ summary: string;
68
+ /** The final refined findings (after false-positive removal) */
69
+ findings: ReviewFinding[];
70
+ /** Critique metadata (present when includeCritiqueMetadata is true) */
71
+ critiqueMetadata?: {
72
+ /** How many findings the initial review produced */
73
+ initialFindingCount: number;
74
+ /** How many findings survived the critique */
75
+ finalFindingCount: number;
76
+ /** How many were removed as false positives */
77
+ removedAsFalsePositive: number;
78
+ /** How many had severity adjusted */
79
+ severityAdjusted: number;
80
+ /** The full critique result */
81
+ critiqueResult: CritiqueResult;
82
+ };
83
+ }
84
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/critique/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI/D,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,gBAAgB,GAAG,cAAc,GAAG,OAAO,GAAG,WAAW,CAAC;AAElG;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAC;IAErB,kCAAkC;IAClC,OAAO,EAAE,eAAe,CAAC;IAEzB,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAElB,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CAC/C;AAID,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,SAAS,EAAE,eAAe,EAAE,CAAC;IAE7B,uDAAuD;IACvD,iBAAiB,EAAE,MAAM,CAAC;IAE1B,mDAAmD;IACnD,kBAAkB,EAAE,MAAM,CAAC;IAE3B,iDAAiD;IACjD,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAID,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,sBAAsB,EAAE,MAAM,CAAC;IAE/B;;;OAGG;IACH,uBAAuB,EAAE,OAAO,CAAC;CAClC;AAED,eAAO,MAAM,4BAA4B,EAAE,kBAG1C,CAAC;AAIF,MAAM,WAAW,iBAAiB;IAChC,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IAEb,8BAA8B;IAC9B,aAAa,EAAE,MAAM,CAAC;IAEtB,oCAAoC;IACpC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IAEnB,iCAAiC;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,+CAA+C;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACtC;AAID,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,MAAM,EAAE,YAAY,CAAC;IAErB,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAEhB,gEAAgE;IAChE,QAAQ,EAAE,aAAa,EAAE,CAAC;IAE1B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE;QACjB,oDAAoD;QACpD,mBAAmB,EAAE,MAAM,CAAC;QAE5B,8CAA8C;QAC9C,iBAAiB,EAAE,MAAM,CAAC;QAE1B,+CAA+C;QAC/C,sBAAsB,EAAE,MAAM,CAAC;QAE/B,qCAAqC;QACrC,gBAAgB,EAAE,MAAM,CAAC;QAEzB,+BAA+B;QAC/B,cAAc,EAAE,cAAc,CAAC;KAChC,CAAC;CACH"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Types for the dual-critique review loop.
3
+ *
4
+ * The 3-agent pattern:
5
+ * 1. Initial Review — standard code review producing findings
6
+ * 2. Self-Critique — evaluates the review for false positives, overreactions, vagueness
7
+ * 3. Refined Review — produces a final review incorporating the critique feedback
8
+ */
9
+ export const DEFAULT_DUAL_CRITIQUE_CONFIG = {
10
+ minFindingsForCritique: 1,
11
+ includeCritiqueMetadata: true,
12
+ };
13
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/critique/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA2DH,MAAM,CAAC,MAAM,4BAA4B,GAAuB;IAC9D,sBAAsB,EAAE,CAAC;IACzB,uBAAuB,EAAE,IAAI;CAC9B,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Doc-Validation module barrel export.
3
+ *
4
+ * Bidirectional code-doc validation that detects stale
5
+ * documentation references when code symbols change.
6
+ */
7
+ export type { DocReference, DocValidationResult } from './types.js';
8
+ export { extractChangedSymbols, isDocFile, scanDocsForSymbols } from './scanner.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/doc-validation/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAIpE,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC"}