ghagga-core 2.6.1 → 2.8.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.
- package/dist/agents/consensus.d.ts +2 -0
- package/dist/agents/consensus.d.ts.map +1 -1
- package/dist/agents/consensus.js +1 -0
- package/dist/agents/consensus.js.map +1 -1
- package/dist/agents/diagnostic.d.ts +2 -0
- package/dist/agents/diagnostic.d.ts.map +1 -1
- package/dist/agents/diagnostic.js +1 -0
- package/dist/agents/diagnostic.js.map +1 -1
- package/dist/agents/fan-out-lenses.d.ts +92 -0
- package/dist/agents/fan-out-lenses.d.ts.map +1 -0
- package/dist/agents/fan-out-lenses.js +424 -0
- package/dist/agents/fan-out-lenses.js.map +1 -0
- package/dist/agents/simple.d.ts +2 -0
- package/dist/agents/simple.d.ts.map +1 -1
- package/dist/agents/simple.js +1 -0
- package/dist/agents/simple.js.map +1 -1
- package/dist/agents/workflow.d.ts +2 -0
- package/dist/agents/workflow.d.ts.map +1 -1
- package/dist/agents/workflow.js +2 -1
- package/dist/agents/workflow.js.map +1 -1
- package/dist/checklist/config.d.ts +22 -0
- package/dist/checklist/config.d.ts.map +1 -0
- package/dist/checklist/config.js +85 -0
- package/dist/checklist/config.js.map +1 -0
- package/dist/checklist/context.d.ts +22 -0
- package/dist/checklist/context.d.ts.map +1 -0
- package/dist/checklist/context.js +76 -0
- package/dist/checklist/context.js.map +1 -0
- package/dist/checklist/defaults.d.ts +12 -0
- package/dist/checklist/defaults.d.ts.map +1 -0
- package/dist/checklist/defaults.js +172 -0
- package/dist/checklist/defaults.js.map +1 -0
- package/dist/checklist/index.d.ts +14 -0
- package/dist/checklist/index.d.ts.map +1 -0
- package/dist/checklist/index.js +15 -0
- package/dist/checklist/index.js.map +1 -0
- package/dist/checklist/scorer.d.ts +58 -0
- package/dist/checklist/scorer.d.ts.map +1 -0
- package/dist/checklist/scorer.js +142 -0
- package/dist/checklist/scorer.js.map +1 -0
- package/dist/checklist/types.d.ts +39 -0
- package/dist/checklist/types.d.ts.map +1 -0
- package/dist/checklist/types.js +17 -0
- package/dist/checklist/types.js.map +1 -0
- package/dist/exploitability/analyzer.d.ts +75 -0
- package/dist/exploitability/analyzer.d.ts.map +1 -0
- package/dist/exploitability/analyzer.js +299 -0
- package/dist/exploitability/analyzer.js.map +1 -0
- package/dist/exploitability/index.d.ts +10 -0
- package/dist/exploitability/index.d.ts.map +1 -0
- package/dist/exploitability/index.js +10 -0
- package/dist/exploitability/index.js.map +1 -0
- package/dist/exploitability/types.d.ts +32 -0
- package/dist/exploitability/types.d.ts.map +1 -0
- package/dist/exploitability/types.js +9 -0
- package/dist/exploitability/types.js.map +1 -0
- package/dist/index.d.ts +15 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/memory/context.d.ts +2 -0
- package/dist/memory/context.d.ts.map +1 -1
- package/dist/memory/context.js +2 -1
- package/dist/memory/context.js.map +1 -1
- package/dist/memory/contradiction.d.ts +46 -0
- package/dist/memory/contradiction.d.ts.map +1 -0
- package/dist/memory/contradiction.js +110 -0
- package/dist/memory/contradiction.js.map +1 -0
- package/dist/memory/decay.d.ts +25 -0
- package/dist/memory/decay.d.ts.map +1 -0
- package/dist/memory/decay.js +51 -0
- package/dist/memory/decay.js.map +1 -0
- package/dist/memory/search.d.ts.map +1 -1
- package/dist/memory/search.js +1 -0
- package/dist/memory/search.js.map +1 -1
- package/dist/memory/sqlite.d.ts +21 -0
- package/dist/memory/sqlite.d.ts.map +1 -1
- package/dist/memory/sqlite.js +77 -6
- package/dist/memory/sqlite.js.map +1 -1
- package/dist/memory/versioning.d.ts +94 -0
- package/dist/memory/versioning.d.ts.map +1 -0
- package/dist/memory/versioning.js +350 -0
- package/dist/memory/versioning.js.map +1 -0
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +117 -0
- package/dist/pipeline.js.map +1 -1
- package/dist/recursive/index.d.ts +45 -0
- package/dist/recursive/index.d.ts.map +1 -0
- package/dist/recursive/index.js +159 -0
- package/dist/recursive/index.js.map +1 -0
- package/dist/recursive/patch-extractor.d.ts +49 -0
- package/dist/recursive/patch-extractor.d.ts.map +1 -0
- package/dist/recursive/patch-extractor.js +133 -0
- package/dist/recursive/patch-extractor.js.map +1 -0
- package/dist/recursive/re-reviewer.d.ts +31 -0
- package/dist/recursive/re-reviewer.d.ts.map +1 -0
- package/dist/recursive/re-reviewer.js +66 -0
- package/dist/recursive/re-reviewer.js.map +1 -0
- package/dist/recursive/types.d.ts +62 -0
- package/dist/recursive/types.d.ts.map +1 -0
- package/dist/recursive/types.js +11 -0
- package/dist/recursive/types.js.map +1 -0
- package/dist/scope/context-builder.d.ts +37 -0
- package/dist/scope/context-builder.d.ts.map +1 -0
- package/dist/scope/context-builder.js +108 -0
- package/dist/scope/context-builder.js.map +1 -0
- package/dist/scope/diff-mapper.d.ts +29 -0
- package/dist/scope/diff-mapper.d.ts.map +1 -0
- package/dist/scope/diff-mapper.js +76 -0
- package/dist/scope/diff-mapper.js.map +1 -0
- package/dist/scope/extractor.d.ts +25 -0
- package/dist/scope/extractor.d.ts.map +1 -0
- package/dist/scope/extractor.js +264 -0
- package/dist/scope/extractor.js.map +1 -0
- package/dist/scope/index.d.ts +13 -0
- package/dist/scope/index.d.ts.map +1 -0
- package/dist/scope/index.js +16 -0
- package/dist/scope/index.js.map +1 -0
- package/dist/scope/parser.d.ts +47 -0
- package/dist/scope/parser.d.ts.map +1 -0
- package/dist/scope/parser.js +97 -0
- package/dist/scope/parser.js.map +1 -0
- package/dist/scope/queries.d.ts +23 -0
- package/dist/scope/queries.d.ts.map +1 -0
- package/dist/scope/queries.js +134 -0
- package/dist/scope/queries.js.map +1 -0
- package/dist/scope/types.d.ts +55 -0
- package/dist/scope/types.d.ts.map +1 -0
- package/dist/scope/types.js +8 -0
- package/dist/scope/types.js.map +1 -0
- package/dist/tools/execution.d.ts.map +1 -1
- package/dist/tools/execution.js +2 -0
- package/dist/tools/execution.js.map +1 -1
- package/dist/tools/plugins/index.d.ts +1 -0
- package/dist/tools/plugins/index.d.ts.map +1 -1
- package/dist/tools/plugins/index.js +6 -5
- package/dist/tools/plugins/index.js.map +1 -1
- package/dist/tools/plugins/sonarqube.d.ts +54 -0
- package/dist/tools/plugins/sonarqube.d.ts.map +1 -0
- package/dist/tools/plugins/sonarqube.js +145 -0
- package/dist/tools/plugins/sonarqube.js.map +1 -0
- package/dist/tools/plugins/trivy.js +1 -1
- package/dist/tools/plugins/trivy.js.map +1 -1
- package/dist/tools/types.d.ts +7 -1
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/types.d.ts +80 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -1
- package/package.json +3 -1
|
@@ -42,6 +42,8 @@ export interface ConsensusReviewInput {
|
|
|
42
42
|
* When omitted, functions are created from models config (backward compat).
|
|
43
43
|
*/
|
|
44
44
|
generateFns?: GenerateTextFn[];
|
|
45
|
+
/** Optional SOLID/boundary checklist context for structured review. */
|
|
46
|
+
checklistContext?: string;
|
|
45
47
|
}
|
|
46
48
|
/**
|
|
47
49
|
* Parse a single model's vote from its response text.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consensus.d.ts","sourceRoot":"","sources":["../../src/agents/consensus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAC;AACzF,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,YAAY,EACb,MAAM,aAAa,CAAC;AAerB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAE9B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"consensus.d.ts","sourceRoot":"","sources":["../../src/agents/consensus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAC;AACzF,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,YAAY,EACb,MAAM,aAAa,CAAC;AAerB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAE9B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAE/B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAmBD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,eAAe,GACtB,aAAa,CAef;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG;IAC1D,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB,CAuDA;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC,CAuI3F"}
|
package/dist/agents/consensus.js
CHANGED
|
@@ -162,6 +162,7 @@ export async function runConsensusReview(input) {
|
|
|
162
162
|
isFirst ? staticContext : '',
|
|
163
163
|
isFirst ? buildMemoryContext(memoryContext) : '',
|
|
164
164
|
isFirst ? stackHints : '',
|
|
165
|
+
input.checklistContext ?? '',
|
|
165
166
|
buildReviewLevelInstruction(reviewLevel),
|
|
166
167
|
isFirst ? REVIEW_CALIBRATION : COMPACT_CALIBRATION,
|
|
167
168
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consensus.js","sourceRoot":"","sources":["../../src/agents/consensus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,qBAAqB,EAAuB,MAAM,6BAA6B,CAAC;AAUzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EACL,kBAAkB,EAClB,2BAA2B,EAC3B,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"consensus.js","sourceRoot":"","sources":["../../src/agents/consensus.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,8 @@ export interface DiagnosticReviewInput {
|
|
|
22
22
|
stackHints: string;
|
|
23
23
|
reviewLevel: ReviewLevel;
|
|
24
24
|
onProgress?: ProgressCallback;
|
|
25
|
+
/** Optional SOLID/boundary checklist context for structured review. */
|
|
26
|
+
checklistContext?: string;
|
|
25
27
|
}
|
|
26
28
|
/**
|
|
27
29
|
* Parse hypothesis blocks from the LLM response text.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostic.d.ts","sourceRoot":"","sources":["../../src/agents/diagnostic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EACV,UAAU,EAEV,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,YAAY,EACb,MAAM,aAAa,CAAC;AAYrB,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,CAAC,EAAE,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"diagnostic.d.ts","sourceRoot":"","sources":["../../src/agents/diagnostic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EACV,UAAU,EAEV,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,YAAY,EACb,MAAM,aAAa,CAAC;AAYrB,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAE9B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAOD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAqD1D;AAID;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC,CAsF7F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../../src/agents/diagnostic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AASpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EACL,kBAAkB,EAClB,2BAA2B,EAC3B,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../../src/agents/diagnostic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fan-out lenses review agent.
|
|
3
|
+
*
|
|
4
|
+
* Launches N specialized review "lenses" in parallel, each with
|
|
5
|
+
* a focused system prompt. After all lenses complete, findings
|
|
6
|
+
* are merged: deduplicated by file+line, severity takes the
|
|
7
|
+
* highest when conflicts exist.
|
|
8
|
+
*
|
|
9
|
+
* Default lenses:
|
|
10
|
+
* - security — injection, auth, data exposure
|
|
11
|
+
* - performance — complexity, memory, N+1
|
|
12
|
+
* - error-handling — null safety, edge cases, exceptions
|
|
13
|
+
* - typing — type safety, generics, strict mode
|
|
14
|
+
* - accessibility — a11y attributes, ARIA, keyboard navigation
|
|
15
|
+
*/
|
|
16
|
+
import type { GenerateTextFn } from '../providers/generate-fn.js';
|
|
17
|
+
import type { LLMProvider, ProgressCallback, ReviewLevel, ReviewResult } from '../types.js';
|
|
18
|
+
/**
|
|
19
|
+
* A review lens: a focused perspective for code review.
|
|
20
|
+
* Each lens gets its own system prompt that constrains the LLM
|
|
21
|
+
* to only analyze from that perspective.
|
|
22
|
+
*/
|
|
23
|
+
export interface ReviewLens {
|
|
24
|
+
/** Unique identifier (e.g., "security", "performance") */
|
|
25
|
+
name: string;
|
|
26
|
+
/** Human-readable label (e.g., "Security Audit") */
|
|
27
|
+
label: string;
|
|
28
|
+
/** Focused system prompt for this lens */
|
|
29
|
+
system: string;
|
|
30
|
+
}
|
|
31
|
+
export declare const LENS_SECURITY: ReviewLens;
|
|
32
|
+
export declare const LENS_PERFORMANCE: ReviewLens;
|
|
33
|
+
export declare const LENS_ERROR_HANDLING: ReviewLens;
|
|
34
|
+
export declare const LENS_TYPING: ReviewLens;
|
|
35
|
+
export declare const LENS_ACCESSIBILITY: ReviewLens;
|
|
36
|
+
/** All built-in lenses, in order. */
|
|
37
|
+
export declare const DEFAULT_LENSES: ReviewLens[];
|
|
38
|
+
/** Register a custom lens (overwrites if name already exists). */
|
|
39
|
+
export declare function registerLens(lens: ReviewLens): void;
|
|
40
|
+
/** Get a lens by name. Falls back to built-in lenses. */
|
|
41
|
+
export declare function getLens(name: string): ReviewLens | undefined;
|
|
42
|
+
/** Get all registered + built-in lenses (registered take precedence). */
|
|
43
|
+
export declare function getAllLenses(): ReviewLens[];
|
|
44
|
+
/** Reset custom registrations (for testing). */
|
|
45
|
+
export declare function resetLensRegistry(): void;
|
|
46
|
+
export interface FanOutReviewInput {
|
|
47
|
+
diff: string;
|
|
48
|
+
provider: LLMProvider;
|
|
49
|
+
model: string;
|
|
50
|
+
apiKey: string;
|
|
51
|
+
staticContext: string;
|
|
52
|
+
memoryContext: string | null;
|
|
53
|
+
stackHints: string;
|
|
54
|
+
reviewLevel: ReviewLevel;
|
|
55
|
+
onProgress?: ProgressCallback;
|
|
56
|
+
/** Lens names to use (resolved via registry). Default: first 3 from DEFAULT_LENSES. */
|
|
57
|
+
lenses?: string[];
|
|
58
|
+
/** Max concurrent lens calls. Default: 3. */
|
|
59
|
+
concurrency?: number;
|
|
60
|
+
/** Delay in ms between batches. Default: 0. */
|
|
61
|
+
delayMs?: number;
|
|
62
|
+
/**
|
|
63
|
+
* Backend-agnostic generation functions for lenses (round-robin).
|
|
64
|
+
* When provided, each lens uses generateFns[index % generateFns.length].
|
|
65
|
+
* When omitted, pipeline creates them from provider/model/apiKey.
|
|
66
|
+
*/
|
|
67
|
+
generateFns?: GenerateTextFn[];
|
|
68
|
+
/** Optional SOLID/boundary checklist context for structured review. */
|
|
69
|
+
checklistContext?: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Deduplicate findings by file+line, taking the highest severity
|
|
73
|
+
* when the same location is flagged by multiple lenses.
|
|
74
|
+
*
|
|
75
|
+
* Findings without a line number are keyed by file+message hash
|
|
76
|
+
* to avoid false deduplication.
|
|
77
|
+
*/
|
|
78
|
+
export declare function mergeFindings(allFindings: import('../types.js').ReviewFinding[]): import('../types.js').ReviewFinding[];
|
|
79
|
+
/**
|
|
80
|
+
* Run a fan-out (multi-lens) code review.
|
|
81
|
+
*
|
|
82
|
+
* 1. Resolve which lenses to use (default: first 3)
|
|
83
|
+
* 2. Launch all lenses in parallel with bounded concurrency
|
|
84
|
+
* 3. Parse each response for STATUS/SUMMARY/FINDINGS
|
|
85
|
+
* 4. Merge findings: deduplicate by file+line, take highest severity
|
|
86
|
+
* 5. Determine overall status from merged findings
|
|
87
|
+
*
|
|
88
|
+
* @param input - Review input with diff, provider config, and lenses
|
|
89
|
+
* @returns ReviewResult with merged findings from all lenses
|
|
90
|
+
*/
|
|
91
|
+
export declare function runFanOutReview(input: FanOutReviewInput): Promise<ReviewResult>;
|
|
92
|
+
//# sourceMappingURL=fan-out-lenses.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fan-out-lenses.d.ts","sourceRoot":"","sources":["../../src/agents/fan-out-lenses.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAEV,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,YAAY,EAEb,MAAM,aAAa,CAAC;AAYrB;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IAEb,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IAEd,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;CAChB;AAID,eAAO,MAAM,aAAa,EAAE,UA6B3B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,UA6B9B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,UA6BjC,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,UA6BzB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,UA+BhC,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,cAAc,EAAE,UAAU,EAMtC,CAAC;AAMF,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAEnD;AAED,yDAAyD;AACzD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAE5D;AAED,yEAAyE;AACzE,wBAAgB,YAAY,IAAI,UAAU,EAAE,CAK3C;AAED,gDAAgD;AAChD,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAcD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAE9B,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAElB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAE/B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAID;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,OAAO,aAAa,EAAE,aAAa,EAAE,GACjD,OAAO,aAAa,EAAE,aAAa,EAAE,CA6BvC;AAID;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAgMrF"}
|
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fan-out lenses review agent.
|
|
3
|
+
*
|
|
4
|
+
* Launches N specialized review "lenses" in parallel, each with
|
|
5
|
+
* a focused system prompt. After all lenses complete, findings
|
|
6
|
+
* are merged: deduplicated by file+line, severity takes the
|
|
7
|
+
* highest when conflicts exist.
|
|
8
|
+
*
|
|
9
|
+
* Default lenses:
|
|
10
|
+
* - security — injection, auth, data exposure
|
|
11
|
+
* - performance — complexity, memory, N+1
|
|
12
|
+
* - error-handling — null safety, edge cases, exceptions
|
|
13
|
+
* - typing — type safety, generics, strict mode
|
|
14
|
+
* - accessibility — a11y attributes, ARIA, keyboard navigation
|
|
15
|
+
*/
|
|
16
|
+
import { runWithConcurrency } from '../utils/concurrency.js';
|
|
17
|
+
import { buildMemoryContext, buildReviewLevelInstruction, COMPACT_CALIBRATION, REVIEW_CALIBRATION, } from './prompts.js';
|
|
18
|
+
import { parseFindingsBlock } from './simple.js';
|
|
19
|
+
// ─── Default Lenses ────────────────────────────────────────────
|
|
20
|
+
export const LENS_SECURITY = {
|
|
21
|
+
name: 'security',
|
|
22
|
+
label: 'Security',
|
|
23
|
+
system: `You are a security-focused code reviewer. Analyze ONLY security aspects of the code changes.
|
|
24
|
+
|
|
25
|
+
Focus exclusively on:
|
|
26
|
+
- SQL injection, XSS, CSRF vulnerabilities
|
|
27
|
+
- Authentication and authorization flaws
|
|
28
|
+
- Sensitive data exposure (API keys, tokens, PII in logs)
|
|
29
|
+
- Insecure cryptographic patterns
|
|
30
|
+
- Path traversal and file inclusion risks
|
|
31
|
+
- Dependency vulnerabilities
|
|
32
|
+
|
|
33
|
+
Ignore: performance, style, naming, error handling (other lenses cover those).
|
|
34
|
+
|
|
35
|
+
Format your response EXACTLY as:
|
|
36
|
+
|
|
37
|
+
STATUS: [PASSED or FAILED]
|
|
38
|
+
SUMMARY: [1-2 sentence security assessment]
|
|
39
|
+
FINDINGS:
|
|
40
|
+
- SEVERITY: [critical|high|medium|low|info]
|
|
41
|
+
CATEGORY: security
|
|
42
|
+
FILE: [file path]
|
|
43
|
+
LINE: [line number or "N/A"]
|
|
44
|
+
MESSAGE: [clear description of the security issue]
|
|
45
|
+
SUGGESTION: [specific security fix]
|
|
46
|
+
|
|
47
|
+
FAILED if: Any critical or high security issues. PASSED otherwise.
|
|
48
|
+
Report ONLY security findings you are 90%+ confident about.`,
|
|
49
|
+
};
|
|
50
|
+
export const LENS_PERFORMANCE = {
|
|
51
|
+
name: 'performance',
|
|
52
|
+
label: 'Performance',
|
|
53
|
+
system: `You are a performance-focused code reviewer. Analyze ONLY performance aspects of the code changes.
|
|
54
|
+
|
|
55
|
+
Focus exclusively on:
|
|
56
|
+
- Algorithm complexity (O(n^2) loops, unnecessary iterations)
|
|
57
|
+
- N+1 query patterns, missing indexes, excessive DB calls
|
|
58
|
+
- Memory leaks (unclosed resources, growing collections, missing cleanup)
|
|
59
|
+
- Unnecessary re-renders or recomputations
|
|
60
|
+
- Bundle size impact (large imports, tree-shaking blockers)
|
|
61
|
+
- Caching opportunities missed
|
|
62
|
+
|
|
63
|
+
Ignore: security, style, naming, error handling (other lenses cover those).
|
|
64
|
+
|
|
65
|
+
Format your response EXACTLY as:
|
|
66
|
+
|
|
67
|
+
STATUS: [PASSED or FAILED]
|
|
68
|
+
SUMMARY: [1-2 sentence performance assessment]
|
|
69
|
+
FINDINGS:
|
|
70
|
+
- SEVERITY: [critical|high|medium|low|info]
|
|
71
|
+
CATEGORY: performance
|
|
72
|
+
FILE: [file path]
|
|
73
|
+
LINE: [line number or "N/A"]
|
|
74
|
+
MESSAGE: [clear description of the performance issue]
|
|
75
|
+
SUGGESTION: [specific performance improvement]
|
|
76
|
+
|
|
77
|
+
FAILED if: Any critical or high performance issues. PASSED otherwise.
|
|
78
|
+
Report ONLY performance findings you are 90%+ confident about.`,
|
|
79
|
+
};
|
|
80
|
+
export const LENS_ERROR_HANDLING = {
|
|
81
|
+
name: 'error-handling',
|
|
82
|
+
label: 'Error Handling',
|
|
83
|
+
system: `You are an error-handling-focused code reviewer. Analyze ONLY error handling aspects of the code changes.
|
|
84
|
+
|
|
85
|
+
Focus exclusively on:
|
|
86
|
+
- Null/undefined safety — unchecked access, missing optional chaining
|
|
87
|
+
- Missing try/catch around fallible operations
|
|
88
|
+
- Swallowed errors (empty catch blocks, ignored rejections)
|
|
89
|
+
- Error propagation correctness (re-throwing with context)
|
|
90
|
+
- Input validation gaps
|
|
91
|
+
- Edge cases and boundary conditions
|
|
92
|
+
|
|
93
|
+
Ignore: security, performance, style, naming (other lenses cover those).
|
|
94
|
+
|
|
95
|
+
Format your response EXACTLY as:
|
|
96
|
+
|
|
97
|
+
STATUS: [PASSED or FAILED]
|
|
98
|
+
SUMMARY: [1-2 sentence error handling assessment]
|
|
99
|
+
FINDINGS:
|
|
100
|
+
- SEVERITY: [critical|high|medium|low|info]
|
|
101
|
+
CATEGORY: error-handling
|
|
102
|
+
FILE: [file path]
|
|
103
|
+
LINE: [line number or "N/A"]
|
|
104
|
+
MESSAGE: [clear description of the error handling issue]
|
|
105
|
+
SUGGESTION: [specific error handling fix]
|
|
106
|
+
|
|
107
|
+
FAILED if: Any critical or high error handling issues. PASSED otherwise.
|
|
108
|
+
Report ONLY error handling findings you are 90%+ confident about.`,
|
|
109
|
+
};
|
|
110
|
+
export const LENS_TYPING = {
|
|
111
|
+
name: 'typing',
|
|
112
|
+
label: 'Typing',
|
|
113
|
+
system: `You are a type-safety-focused code reviewer. Analyze ONLY type safety aspects of the code changes.
|
|
114
|
+
|
|
115
|
+
Focus exclusively on:
|
|
116
|
+
- Type assertions (as) that bypass safety
|
|
117
|
+
- Missing or overly broad types (any, unknown without narrowing)
|
|
118
|
+
- Generic constraints that are too loose or too tight
|
|
119
|
+
- Interface/type mismatches between modules
|
|
120
|
+
- Unsafe type coercion
|
|
121
|
+
- Missing discriminated unions or exhaustive checks
|
|
122
|
+
|
|
123
|
+
Ignore: security, performance, style, error handling (other lenses cover those).
|
|
124
|
+
|
|
125
|
+
Format your response EXACTLY as:
|
|
126
|
+
|
|
127
|
+
STATUS: [PASSED or FAILED]
|
|
128
|
+
SUMMARY: [1-2 sentence type safety assessment]
|
|
129
|
+
FINDINGS:
|
|
130
|
+
- SEVERITY: [critical|high|medium|low|info]
|
|
131
|
+
CATEGORY: typing
|
|
132
|
+
FILE: [file path]
|
|
133
|
+
LINE: [line number or "N/A"]
|
|
134
|
+
MESSAGE: [clear description of the typing issue]
|
|
135
|
+
SUGGESTION: [specific type safety fix]
|
|
136
|
+
|
|
137
|
+
FAILED if: Any critical or high typing issues. PASSED otherwise.
|
|
138
|
+
Report ONLY typing findings you are 90%+ confident about.`,
|
|
139
|
+
};
|
|
140
|
+
export const LENS_ACCESSIBILITY = {
|
|
141
|
+
name: 'accessibility',
|
|
142
|
+
label: 'Accessibility',
|
|
143
|
+
system: `You are an accessibility-focused code reviewer. Analyze ONLY accessibility aspects of the code changes.
|
|
144
|
+
|
|
145
|
+
Focus exclusively on:
|
|
146
|
+
- Missing ARIA attributes on interactive elements
|
|
147
|
+
- Incorrect role assignments
|
|
148
|
+
- Missing alt text on images
|
|
149
|
+
- Keyboard navigation gaps (missing tabIndex, key handlers)
|
|
150
|
+
- Color contrast and visual accessibility
|
|
151
|
+
- Screen reader compatibility issues
|
|
152
|
+
- Focus management problems
|
|
153
|
+
|
|
154
|
+
Ignore: security, performance, style, error handling (other lenses cover those).
|
|
155
|
+
If the code has no UI/frontend components, return STATUS: PASSED with empty FINDINGS.
|
|
156
|
+
|
|
157
|
+
Format your response EXACTLY as:
|
|
158
|
+
|
|
159
|
+
STATUS: [PASSED or FAILED]
|
|
160
|
+
SUMMARY: [1-2 sentence accessibility assessment]
|
|
161
|
+
FINDINGS:
|
|
162
|
+
- SEVERITY: [critical|high|medium|low|info]
|
|
163
|
+
CATEGORY: accessibility
|
|
164
|
+
FILE: [file path]
|
|
165
|
+
LINE: [line number or "N/A"]
|
|
166
|
+
MESSAGE: [clear description of the accessibility issue]
|
|
167
|
+
SUGGESTION: [specific accessibility fix]
|
|
168
|
+
|
|
169
|
+
FAILED if: Any critical or high accessibility issues. PASSED otherwise.
|
|
170
|
+
Report ONLY accessibility findings you are 90%+ confident about.`,
|
|
171
|
+
};
|
|
172
|
+
/** All built-in lenses, in order. */
|
|
173
|
+
export const DEFAULT_LENSES = [
|
|
174
|
+
LENS_SECURITY,
|
|
175
|
+
LENS_PERFORMANCE,
|
|
176
|
+
LENS_ERROR_HANDLING,
|
|
177
|
+
LENS_TYPING,
|
|
178
|
+
LENS_ACCESSIBILITY,
|
|
179
|
+
];
|
|
180
|
+
// ─── Lens Registry ─────────────────────────────────────────────
|
|
181
|
+
const lensMap = new Map();
|
|
182
|
+
/** Register a custom lens (overwrites if name already exists). */
|
|
183
|
+
export function registerLens(lens) {
|
|
184
|
+
lensMap.set(lens.name, lens);
|
|
185
|
+
}
|
|
186
|
+
/** Get a lens by name. Falls back to built-in lenses. */
|
|
187
|
+
export function getLens(name) {
|
|
188
|
+
return lensMap.get(name) ?? DEFAULT_LENSES.find((l) => l.name === name);
|
|
189
|
+
}
|
|
190
|
+
/** Get all registered + built-in lenses (registered take precedence). */
|
|
191
|
+
export function getAllLenses() {
|
|
192
|
+
const merged = new Map();
|
|
193
|
+
for (const lens of DEFAULT_LENSES)
|
|
194
|
+
merged.set(lens.name, lens);
|
|
195
|
+
for (const [name, lens] of lensMap)
|
|
196
|
+
merged.set(name, lens);
|
|
197
|
+
return Array.from(merged.values());
|
|
198
|
+
}
|
|
199
|
+
/** Reset custom registrations (for testing). */
|
|
200
|
+
export function resetLensRegistry() {
|
|
201
|
+
lensMap.clear();
|
|
202
|
+
}
|
|
203
|
+
// ─── Severity Ranking ──────────────────────────────────────────
|
|
204
|
+
const SEVERITY_RANK = {
|
|
205
|
+
critical: 5,
|
|
206
|
+
high: 4,
|
|
207
|
+
medium: 3,
|
|
208
|
+
low: 2,
|
|
209
|
+
info: 1,
|
|
210
|
+
};
|
|
211
|
+
// ─── Merge Logic ───────────────────────────────────────────────
|
|
212
|
+
/**
|
|
213
|
+
* Deduplicate findings by file+line, taking the highest severity
|
|
214
|
+
* when the same location is flagged by multiple lenses.
|
|
215
|
+
*
|
|
216
|
+
* Findings without a line number are keyed by file+message hash
|
|
217
|
+
* to avoid false deduplication.
|
|
218
|
+
*/
|
|
219
|
+
export function mergeFindings(allFindings) {
|
|
220
|
+
const deduped = new Map();
|
|
221
|
+
for (const finding of allFindings) {
|
|
222
|
+
// Key: file + line (or message for line-less findings)
|
|
223
|
+
const key = finding.line != null
|
|
224
|
+
? `${finding.file}:${finding.line}`
|
|
225
|
+
: `${finding.file}::${finding.message}`;
|
|
226
|
+
const existing = deduped.get(key);
|
|
227
|
+
if (!existing) {
|
|
228
|
+
deduped.set(key, finding);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
// Take the highest severity
|
|
232
|
+
const existingRank = SEVERITY_RANK[existing.severity] ?? 0;
|
|
233
|
+
const newRank = SEVERITY_RANK[finding.severity] ?? 0;
|
|
234
|
+
if (newRank > existingRank) {
|
|
235
|
+
deduped.set(key, finding);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Sort by severity (highest first), then by file
|
|
240
|
+
return Array.from(deduped.values()).sort((a, b) => {
|
|
241
|
+
const sevDiff = (SEVERITY_RANK[b.severity] ?? 0) - (SEVERITY_RANK[a.severity] ?? 0);
|
|
242
|
+
if (sevDiff !== 0)
|
|
243
|
+
return sevDiff;
|
|
244
|
+
return a.file.localeCompare(b.file);
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
// ─── Main Function ─────────────────────────────────────────────
|
|
248
|
+
/**
|
|
249
|
+
* Run a fan-out (multi-lens) code review.
|
|
250
|
+
*
|
|
251
|
+
* 1. Resolve which lenses to use (default: first 3)
|
|
252
|
+
* 2. Launch all lenses in parallel with bounded concurrency
|
|
253
|
+
* 3. Parse each response for STATUS/SUMMARY/FINDINGS
|
|
254
|
+
* 4. Merge findings: deduplicate by file+line, take highest severity
|
|
255
|
+
* 5. Determine overall status from merged findings
|
|
256
|
+
*
|
|
257
|
+
* @param input - Review input with diff, provider config, and lenses
|
|
258
|
+
* @returns ReviewResult with merged findings from all lenses
|
|
259
|
+
*/
|
|
260
|
+
export async function runFanOutReview(input) {
|
|
261
|
+
const { diff, provider, model, staticContext, memoryContext, stackHints, reviewLevel } = input;
|
|
262
|
+
const emit = input.onProgress ?? (() => { });
|
|
263
|
+
// ── Resolve lenses ──────────────────────────────────────────
|
|
264
|
+
const lensNames = input.lenses ?? DEFAULT_LENSES.slice(0, 3).map((l) => l.name);
|
|
265
|
+
const resolvedLenses = [];
|
|
266
|
+
for (const name of lensNames) {
|
|
267
|
+
const lens = getLens(name);
|
|
268
|
+
if (lens) {
|
|
269
|
+
resolvedLenses.push(lens);
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
emit({
|
|
273
|
+
step: 'fan-out-warning',
|
|
274
|
+
message: `Unknown lens "${name}" — skipping`,
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
if (resolvedLenses.length === 0) {
|
|
279
|
+
throw new Error('No valid lenses resolved for fan-out review');
|
|
280
|
+
}
|
|
281
|
+
// ── Resolve GenerateTextFn array ────────────────────────────
|
|
282
|
+
const resolvedGenerateFns = input.generateFns ?? [];
|
|
283
|
+
const concurrency = input.concurrency ?? 3;
|
|
284
|
+
const delayMs = input.delayMs ?? 0;
|
|
285
|
+
const startTime = Date.now();
|
|
286
|
+
emit({
|
|
287
|
+
step: 'fan-out-start',
|
|
288
|
+
message: `Launching ${resolvedLenses.length} review lenses (concurrency: ${concurrency})`,
|
|
289
|
+
detail: resolvedLenses.map((l) => ` → ${l.label}`).join('\n'),
|
|
290
|
+
});
|
|
291
|
+
// Build the user prompt (same for all lenses)
|
|
292
|
+
const userPrompt = `Review the following code changes:\n\n\`\`\`diff\n${diff}\n\`\`\``;
|
|
293
|
+
// ── Step 1: Run lenses with bounded concurrency ─────────────
|
|
294
|
+
const lensTasks = resolvedLenses.map((lens, index) => {
|
|
295
|
+
return async () => {
|
|
296
|
+
// Round-robin generateFn assignment (fall back to first if provided)
|
|
297
|
+
const generateFn = resolvedGenerateFns.length > 0
|
|
298
|
+
? resolvedGenerateFns[index % resolvedGenerateFns.length]
|
|
299
|
+
: null;
|
|
300
|
+
if (!generateFn) {
|
|
301
|
+
throw new Error(`No generateFn available for lens "${lens.name}" at index ${index}`);
|
|
302
|
+
}
|
|
303
|
+
const isFirst = index === 0;
|
|
304
|
+
const system = [
|
|
305
|
+
lens.system,
|
|
306
|
+
isFirst ? staticContext : '',
|
|
307
|
+
isFirst ? buildMemoryContext(memoryContext) : '',
|
|
308
|
+
isFirst ? stackHints : '',
|
|
309
|
+
input.checklistContext ?? '',
|
|
310
|
+
buildReviewLevelInstruction(reviewLevel),
|
|
311
|
+
isFirst ? REVIEW_CALIBRATION : COMPACT_CALIBRATION,
|
|
312
|
+
]
|
|
313
|
+
.filter(Boolean)
|
|
314
|
+
.join('\n');
|
|
315
|
+
const result = await generateFn(system, userPrompt);
|
|
316
|
+
return {
|
|
317
|
+
name: lens.name,
|
|
318
|
+
label: lens.label,
|
|
319
|
+
text: result.text,
|
|
320
|
+
tokensUsed: result.tokensUsed,
|
|
321
|
+
providerUsed: result.provider,
|
|
322
|
+
modelUsed: result.model,
|
|
323
|
+
};
|
|
324
|
+
};
|
|
325
|
+
});
|
|
326
|
+
const results = await runWithConcurrency(lensTasks, { concurrency, delayMs });
|
|
327
|
+
// ── Step 2: Collect findings from all lenses ────────────────
|
|
328
|
+
let totalTokens = 0;
|
|
329
|
+
const allFindings = [];
|
|
330
|
+
const modelsUsed = [];
|
|
331
|
+
const lensStatuses = [];
|
|
332
|
+
for (let i = 0; i < results.length; i++) {
|
|
333
|
+
const result = results[i];
|
|
334
|
+
const lens = resolvedLenses[i];
|
|
335
|
+
if (!result || !lens)
|
|
336
|
+
continue;
|
|
337
|
+
if (result.status === 'fulfilled') {
|
|
338
|
+
totalTokens += result.value.tokensUsed;
|
|
339
|
+
modelsUsed.push(`${result.value.name}:${result.value.providerUsed}/${result.value.modelUsed}`);
|
|
340
|
+
// Parse the lens response for findings
|
|
341
|
+
const findings = parseFindingsBlock(result.value.text);
|
|
342
|
+
// Tag each finding with source=ai and the lens name for traceability
|
|
343
|
+
for (const finding of findings) {
|
|
344
|
+
finding.source = 'ai';
|
|
345
|
+
// Prefix category with lens name for disambiguation
|
|
346
|
+
if (!finding.category.includes(lens.name)) {
|
|
347
|
+
finding.category = `${lens.name}`;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
allFindings.push(...findings);
|
|
351
|
+
// Track individual lens status
|
|
352
|
+
const statusMatch = /STATUS:\s*(PASSED|FAILED|NEEDS_HUMAN_REVIEW|SKIPPED)/i.exec(result.value.text);
|
|
353
|
+
const lensStatus = (statusMatch?.[1]?.toUpperCase() ?? 'NEEDS_HUMAN_REVIEW');
|
|
354
|
+
lensStatuses.push(lensStatus);
|
|
355
|
+
emit({
|
|
356
|
+
step: `lens-${lens.name}`,
|
|
357
|
+
message: `✓ ${lens.label} — ${findings.length} finding(s), ${result.value.tokensUsed} tokens`,
|
|
358
|
+
detail: result.value.text,
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
const reason = result.reason instanceof Error ? result.reason.message : String(result.reason);
|
|
363
|
+
modelsUsed.push(`${lens.name}:FAILED`);
|
|
364
|
+
emit({
|
|
365
|
+
step: `lens-${lens.name}`,
|
|
366
|
+
message: `✗ ${lens.label} — FAILED: ${reason}`,
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
emit({
|
|
371
|
+
step: 'fan-out-merge',
|
|
372
|
+
message: `Merging ${allFindings.length} findings from ${resolvedLenses.length} lenses...`,
|
|
373
|
+
});
|
|
374
|
+
// ── Step 3: Merge and deduplicate ───────────────────────────
|
|
375
|
+
const mergedFindings = mergeFindings(allFindings);
|
|
376
|
+
// ── Step 4: Determine overall status ────────────────────────
|
|
377
|
+
const hasCritical = mergedFindings.some((f) => f.severity === 'critical');
|
|
378
|
+
const highCount = mergedFindings.filter((f) => f.severity === 'high').length;
|
|
379
|
+
const anyFailed = lensStatuses.includes('FAILED');
|
|
380
|
+
let status;
|
|
381
|
+
if (hasCritical || highCount >= 3) {
|
|
382
|
+
status = 'FAILED';
|
|
383
|
+
}
|
|
384
|
+
else if (anyFailed || highCount > 0) {
|
|
385
|
+
status = 'NEEDS_HUMAN_REVIEW';
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
status = 'PASSED';
|
|
389
|
+
}
|
|
390
|
+
const executionTimeMs = Date.now() - startTime;
|
|
391
|
+
// Build lens summary
|
|
392
|
+
const lensSummaryParts = resolvedLenses.map((lens, i) => {
|
|
393
|
+
const result = results[i];
|
|
394
|
+
if (!result || result.status !== 'fulfilled')
|
|
395
|
+
return `${lens.label}: failed`;
|
|
396
|
+
const lensStatus = lensStatuses[i] ?? 'unknown';
|
|
397
|
+
return `${lens.label}: ${lensStatus}`;
|
|
398
|
+
});
|
|
399
|
+
const summary = mergedFindings.length > 0
|
|
400
|
+
? `Fan-out review with ${resolvedLenses.length} lenses found ${mergedFindings.length} unique finding(s). Lenses: ${lensSummaryParts.join(', ')}.`
|
|
401
|
+
: `Fan-out review with ${resolvedLenses.length} lenses found no issues. All lenses passed.`;
|
|
402
|
+
return {
|
|
403
|
+
status,
|
|
404
|
+
summary,
|
|
405
|
+
findings: mergedFindings,
|
|
406
|
+
staticAnalysis: {
|
|
407
|
+
semgrep: { status: 'skipped', findings: [], executionTimeMs: 0 },
|
|
408
|
+
trivy: { status: 'skipped', findings: [], executionTimeMs: 0 },
|
|
409
|
+
cpd: { status: 'skipped', findings: [], executionTimeMs: 0 },
|
|
410
|
+
},
|
|
411
|
+
memoryContext,
|
|
412
|
+
metadata: {
|
|
413
|
+
mode: 'fan-out',
|
|
414
|
+
provider: modelsUsed.length > 0 ? provider : 'none',
|
|
415
|
+
model,
|
|
416
|
+
tokensUsed: totalTokens,
|
|
417
|
+
executionTimeMs,
|
|
418
|
+
toolsRun: [],
|
|
419
|
+
toolsSkipped: [],
|
|
420
|
+
modelsUsed,
|
|
421
|
+
},
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
//# sourceMappingURL=fan-out-lenses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fan-out-lenses.js","sourceRoot":"","sources":["../../src/agents/fan-out-lenses.ts"],"names":[],"mappings":"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"}
|