ghagga-core 2.9.0 → 3.0.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/LICENSE +21 -0
- package/dist/acp/adapter.d.ts.map +1 -1
- package/dist/acp/adapter.js +1 -1
- package/dist/acp/adapter.js.map +1 -1
- package/dist/acp/index.d.ts +1 -1
- package/dist/acp/index.d.ts.map +1 -1
- package/dist/acp/index.js.map +1 -1
- package/dist/acp/types.d.ts.map +1 -1
- package/dist/agents/consensus.d.ts.map +1 -1
- package/dist/agents/consensus.js +7 -2
- package/dist/agents/consensus.js.map +1 -1
- package/dist/agents/diagnostic.d.ts.map +1 -1
- package/dist/agents/diagnostic.js +7 -2
- package/dist/agents/diagnostic.js.map +1 -1
- package/dist/agents/fan-out-lenses.d.ts.map +1 -1
- package/dist/agents/fan-out-lenses.js +7 -2
- package/dist/agents/fan-out-lenses.js.map +1 -1
- package/dist/agents/prompts.d.ts +49 -1
- package/dist/agents/prompts.d.ts.map +1 -1
- package/dist/agents/prompts.js +133 -5
- package/dist/agents/prompts.js.map +1 -1
- package/dist/agents/simple.d.ts +1 -1
- package/dist/agents/simple.d.ts.map +1 -1
- package/dist/agents/simple.js +6 -4
- package/dist/agents/simple.js.map +1 -1
- package/dist/agents/workflow.d.ts.map +1 -1
- package/dist/agents/workflow.js +13 -4
- package/dist/agents/workflow.js.map +1 -1
- package/dist/critique/critique.d.ts.map +1 -1
- package/dist/critique/critique.js +14 -6
- package/dist/critique/critique.js.map +1 -1
- package/dist/critique/cross-model.d.ts.map +1 -1
- package/dist/critique/cross-model.js +1 -3
- package/dist/critique/cross-model.js.map +1 -1
- package/dist/critique/index.d.ts +1 -2
- package/dist/critique/index.d.ts.map +1 -1
- package/dist/critique/index.js +1 -2
- package/dist/critique/index.js.map +1 -1
- package/dist/diff/index.d.ts +12 -0
- package/dist/diff/index.d.ts.map +1 -0
- package/dist/diff/index.js +11 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/diff/parse.d.ts +41 -0
- package/dist/diff/parse.d.ts.map +1 -0
- package/dist/diff/parse.js +303 -0
- package/dist/diff/parse.js.map +1 -0
- package/dist/diff/types.d.ts +106 -0
- package/dist/diff/types.d.ts.map +1 -0
- package/dist/diff/types.js +23 -0
- package/dist/diff/types.js.map +1 -0
- package/dist/embed.d.ts +5 -2
- package/dist/embed.d.ts.map +1 -1
- package/dist/embed.js +7 -3
- package/dist/embed.js.map +1 -1
- package/dist/enhance/prompt.d.ts +5 -1
- package/dist/enhance/prompt.d.ts.map +1 -1
- package/dist/enhance/prompt.js +9 -2
- package/dist/enhance/prompt.js.map +1 -1
- package/dist/format.d.ts +31 -0
- package/dist/format.d.ts.map +1 -1
- package/dist/format.js +256 -15
- package/dist/format.js.map +1 -1
- package/dist/index.d.ts +6 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -8
- package/dist/index.js.map +1 -1
- package/dist/memory/pageindex/chunker.d.ts +1 -1
- package/dist/memory/pageindex/chunker.d.ts.map +1 -1
- package/dist/memory/pageindex/chunker.js +5 -5
- package/dist/memory/pageindex/chunker.js.map +1 -1
- package/dist/memory/pageindex/example.d.ts +1 -1
- package/dist/memory/pageindex/example.d.ts.map +1 -1
- package/dist/memory/pageindex/example.js +1 -2
- package/dist/memory/pageindex/example.js.map +1 -1
- package/dist/memory/pageindex/index.d.ts +3 -3
- package/dist/memory/pageindex/index.d.ts.map +1 -1
- package/dist/memory/pageindex/index.js +1 -1
- package/dist/memory/pageindex/index.js.map +1 -1
- package/dist/memory/pageindex/service.d.ts +11 -2
- package/dist/memory/pageindex/service.d.ts.map +1 -1
- package/dist/memory/pageindex/service.js +12 -11
- package/dist/memory/pageindex/service.js.map +1 -1
- package/dist/memory/persist.d.ts.map +1 -1
- package/dist/memory/persist.js +10 -3
- package/dist/memory/persist.js.map +1 -1
- package/dist/memory/privacy.d.ts.map +1 -1
- package/dist/memory/privacy.js +45 -6
- package/dist/memory/privacy.js.map +1 -1
- package/dist/memory/sqlite.d.ts +1 -13
- package/dist/memory/sqlite.d.ts.map +1 -1
- package/dist/memory/sqlite.js +45 -27
- package/dist/memory/sqlite.js.map +1 -1
- package/dist/memory/taxonomy.d.ts.map +1 -1
- package/dist/memory/taxonomy.js +6 -1
- package/dist/memory/taxonomy.js.map +1 -1
- package/dist/pipeline/degrade.d.ts +61 -0
- package/dist/pipeline/degrade.d.ts.map +1 -0
- package/dist/pipeline/degrade.js +58 -0
- package/dist/pipeline/degrade.js.map +1 -0
- package/dist/pipeline/enrich.d.ts +29 -0
- package/dist/pipeline/enrich.d.ts.map +1 -0
- package/dist/pipeline/enrich.js +271 -0
- package/dist/pipeline/enrich.js.map +1 -0
- package/dist/pipeline/execute.d.ts +22 -0
- package/dist/pipeline/execute.d.ts.map +1 -0
- package/dist/pipeline/execute.js +250 -0
- package/dist/pipeline/execute.js.map +1 -0
- package/dist/pipeline/finalize.d.ts +26 -0
- package/dist/pipeline/finalize.d.ts.map +1 -0
- package/dist/pipeline/finalize.js +52 -0
- package/dist/pipeline/finalize.js.map +1 -0
- package/dist/pipeline/gather-context.d.ts +25 -0
- package/dist/pipeline/gather-context.d.ts.map +1 -0
- package/dist/pipeline/gather-context.js +169 -0
- package/dist/pipeline/gather-context.js.map +1 -0
- package/dist/pipeline/gather-safe.d.ts +39 -0
- package/dist/pipeline/gather-safe.d.ts.map +1 -0
- package/dist/pipeline/gather-safe.js +127 -0
- package/dist/pipeline/gather-safe.js.map +1 -0
- package/dist/pipeline/prepare-graph.d.ts +54 -0
- package/dist/pipeline/prepare-graph.d.ts.map +1 -0
- package/dist/pipeline/prepare-graph.js +174 -0
- package/dist/pipeline/prepare-graph.js.map +1 -0
- package/dist/pipeline/prepare.d.ts +40 -0
- package/dist/pipeline/prepare.d.ts.map +1 -0
- package/dist/pipeline/prepare.js +233 -0
- package/dist/pipeline/prepare.js.map +1 -0
- package/dist/pipeline/providers.d.ts +54 -0
- package/dist/pipeline/providers.d.ts.map +1 -0
- package/dist/pipeline/providers.js +163 -0
- package/dist/pipeline/providers.js.map +1 -0
- package/dist/pipeline/results.d.ts +35 -0
- package/dist/pipeline/results.d.ts.map +1 -0
- package/dist/pipeline/results.js +122 -0
- package/dist/pipeline/results.js.map +1 -0
- package/dist/pipeline/state.d.ts +92 -0
- package/dist/pipeline/state.d.ts.map +1 -0
- package/dist/pipeline/state.js +13 -0
- package/dist/pipeline/state.js.map +1 -0
- package/dist/pipeline.d.ts +10 -9
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +36 -1213
- package/dist/pipeline.js.map +1 -1
- package/dist/providers/gateway.d.ts.map +1 -1
- package/dist/providers/gateway.js +8 -0
- package/dist/providers/gateway.js.map +1 -1
- package/dist/recursive/index.d.ts +1 -0
- package/dist/recursive/index.d.ts.map +1 -1
- package/dist/recursive/index.js +7 -3
- package/dist/recursive/index.js.map +1 -1
- package/dist/recursive/patch-extractor.d.ts +58 -6
- package/dist/recursive/patch-extractor.d.ts.map +1 -1
- package/dist/recursive/patch-extractor.js +207 -26
- package/dist/recursive/patch-extractor.js.map +1 -1
- package/dist/sanitize.d.ts +51 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +90 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/scope/diff-mapper.d.ts +12 -0
- package/dist/scope/diff-mapper.d.ts.map +1 -1
- package/dist/scope/diff-mapper.js +25 -18
- package/dist/scope/diff-mapper.js.map +1 -1
- package/dist/scope/entity-diff.d.ts +21 -4
- package/dist/scope/entity-diff.d.ts.map +1 -1
- package/dist/scope/entity-diff.js +132 -34
- package/dist/scope/entity-diff.js.map +1 -1
- package/dist/scope/types.d.ts +10 -0
- package/dist/scope/types.d.ts.map +1 -1
- package/dist/search/index.d.ts +1 -1
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js.map +1 -1
- package/dist/search/indexer.d.ts.map +1 -1
- package/dist/search/indexer.js +33 -4
- package/dist/search/indexer.js.map +1 -1
- package/dist/search/searcher.d.ts.map +1 -1
- package/dist/search/searcher.js.map +1 -1
- package/dist/semantic-diff/index.d.ts +25 -2
- package/dist/semantic-diff/index.d.ts.map +1 -1
- package/dist/semantic-diff/index.js +147 -53
- package/dist/semantic-diff/index.js.map +1 -1
- package/dist/tools/gitleaks-config.toml +35 -0
- package/dist/tools/plugins/gitleaks.d.ts +10 -0
- package/dist/tools/plugins/gitleaks.d.ts.map +1 -1
- package/dist/tools/plugins/gitleaks.js +29 -2
- package/dist/tools/plugins/gitleaks.js.map +1 -1
- package/dist/tools/plugins/semgrep.d.ts +11 -0
- package/dist/tools/plugins/semgrep.d.ts.map +1 -1
- package/dist/tools/plugins/semgrep.js +30 -1
- package/dist/tools/plugins/semgrep.js.map +1 -1
- package/dist/tools/semgrep-rules.yml +305 -0
- package/dist/types.d.ts +51 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/diff.d.ts +22 -2
- package/dist/utils/diff.d.ts.map +1 -1
- package/dist/utils/diff.js +36 -40
- package/dist/utils/diff.js.map +1 -1
- package/package.json +21 -22
- package/dist/providers/fallback.d.ts +0 -54
- package/dist/providers/fallback.d.ts.map +0 -1
- package/dist/providers/fallback.js +0 -102
- package/dist/providers/fallback.js.map +0 -1
- package/dist/providers/index.d.ts +0 -49
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -146
- package/dist/providers/index.js.map +0 -1
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finalize phase: steps 8 → 9 of the review pipeline.
|
|
3
|
+
*
|
|
4
|
+
* 8 persist review observations to memory (awaited for SQLite correctness)
|
|
5
|
+
* 9 attach failed steps, set coverageComplete, downgrade PASSED → PARTIAL
|
|
6
|
+
*
|
|
7
|
+
* ⚠️ The downgrade is PASSED-only ON PURPOSE: a FAILED review stays
|
|
8
|
+
* FAILED even when steps degraded (pinned by pipeline.test.ts —
|
|
9
|
+
* "preserves FAILED status even when steps fail"). Do NOT "fix" this.
|
|
10
|
+
* The first-class coverage signal for non-PASSED statuses is
|
|
11
|
+
* `coverageComplete` (orthogonal to the verdict), set below for EVERY
|
|
12
|
+
* result that reaches finalize. It accounts for BOTH degradation kinds:
|
|
13
|
+
* tracked failures (`failedSteps`) AND warn-only degradations
|
|
14
|
+
* (`reportFailure: false` sites — call-chain, negative-examples,
|
|
15
|
+
* self-improve, semantic-diff), which never enter `failedSteps`, never trigger the
|
|
16
|
+
* PARTIAL downgrade, and stay internal — but still mean incomplete
|
|
17
|
+
* coverage. SKIPPED early-returns (flood-skip / all-files-filtered)
|
|
18
|
+
* short-circuit in prepare and never reach this phase — they stay
|
|
19
|
+
* `coverageComplete: undefined` (not applicable).
|
|
20
|
+
*/
|
|
21
|
+
import { persistReviewObservations } from '../memory/persist.js';
|
|
22
|
+
import { runDegradable } from './degrade.js';
|
|
23
|
+
/**
|
|
24
|
+
* Run the finalize phase. Mutates `state.result` in-place.
|
|
25
|
+
*/
|
|
26
|
+
export async function finalize(state) {
|
|
27
|
+
const { input, result } = state;
|
|
28
|
+
// ── Step 8: Persist to memory (awaited for SQLite correctness) ──
|
|
29
|
+
if (input.settings.enableMemory && input.memoryStorage && input.context) {
|
|
30
|
+
// Hoisted consts: property narrowing does not survive inside closures.
|
|
31
|
+
const memoryStorage = input.memoryStorage;
|
|
32
|
+
const reviewContext = input.context;
|
|
33
|
+
await runDegradable(state, { step: 'memory-persist', warnLabel: '[ghagga] Memory persist failed (non-fatal):' }, async () => {
|
|
34
|
+
await persistReviewObservations(memoryStorage, reviewContext.repoFullName, reviewContext.prNumber, result);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
// ── Step 9: Attach failed steps and mark as PARTIAL ─────────
|
|
38
|
+
// Coverage is orthogonal to the verdict: every result that reaches
|
|
39
|
+
// finalize gets the signal, including FAILED / NEEDS_HUMAN_REVIEW.
|
|
40
|
+
// Warn-only degradations count too — the boolean tells the WHOLE
|
|
41
|
+
// truth even though the step names stay internal.
|
|
42
|
+
result.coverageComplete =
|
|
43
|
+
state.failedSteps.length === 0 && state.warnOnlyDegradations.length === 0;
|
|
44
|
+
if (state.failedSteps.length > 0) {
|
|
45
|
+
result.failedSteps = state.failedSteps;
|
|
46
|
+
// Only downgrade to PARTIAL if the review otherwise appeared successful
|
|
47
|
+
if (result.status === 'PASSED') {
|
|
48
|
+
result.status = 'PARTIAL';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=finalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finalize.js","sourceRoot":"","sources":["../../src/pipeline/finalize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAoB;IACjD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAEhC,mEAAmE;IACnE,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACxE,uEAAuE;QACvE,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QAC1C,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC;QACpC,MAAM,aAAa,CACjB,KAAK,EACL,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,6CAA6C,EAAE,EACpF,KAAK,IAAI,EAAE;YACT,MAAM,yBAAyB,CAC7B,aAAa,EACb,aAAa,CAAC,YAAY,EAC1B,aAAa,CAAC,QAAQ,EACtB,MAAM,CACP,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,mEAAmE;IACnE,mEAAmE;IACnE,iEAAiE;IACjE,kDAAkD;IAClD,MAAM,CAAC,gBAAgB;QACrB,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC,CAAC;IAC5E,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACvC,wEAAwE;QACxE,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;QAC5B,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gather-context phase: steps 5 → 5.4 of the review pipeline.
|
|
3
|
+
*
|
|
4
|
+
* 5 static analysis ∥ memory search ∥ code-intel — ONE literal
|
|
5
|
+
* `Promise.all` trio: all three start before any resolves.
|
|
6
|
+
* Do NOT sequentialize (pinned by the parallelism golden).
|
|
7
|
+
* 5.0 negative examples (degrades WITHOUT failedSteps — deliberate)
|
|
8
|
+
* 5.0a self-improve rules (degrades WITHOUT failedSteps — deliberate)
|
|
9
|
+
* 5.1 progressive context (static + memory fidelity levels)
|
|
10
|
+
* 5.1b code intelligence context + metadata, then static-results emit
|
|
11
|
+
* 5.4 checklist context
|
|
12
|
+
*
|
|
13
|
+
* Writes the gather-owned state fields (placeholder-initialized by the
|
|
14
|
+
* orchestrator) unconditionally, before any downstream consumer runs.
|
|
15
|
+
* The three `*Safe` degradation helpers live in `gather-safe.ts` —
|
|
16
|
+
* moved byte-intact from pipeline.ts (incl. code-intel's emit-throw-only
|
|
17
|
+
* catch, pinned by the golden suite).
|
|
18
|
+
*/
|
|
19
|
+
import type { PipelineStateBase } from './state.js';
|
|
20
|
+
/**
|
|
21
|
+
* Run the gather-context phase. Mutates the gather-owned fields on
|
|
22
|
+
* `state` (static analysis, memory, code-intel, prompts, checklist).
|
|
23
|
+
*/
|
|
24
|
+
export declare function gatherContext(state: PipelineStateBase): Promise<void>;
|
|
25
|
+
//# sourceMappingURL=gather-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gather-context.d.ts","sourceRoot":"","sources":["../../src/pipeline/gather-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAYH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoK3E"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gather-context phase: steps 5 → 5.4 of the review pipeline.
|
|
3
|
+
*
|
|
4
|
+
* 5 static analysis ∥ memory search ∥ code-intel — ONE literal
|
|
5
|
+
* `Promise.all` trio: all three start before any resolves.
|
|
6
|
+
* Do NOT sequentialize (pinned by the parallelism golden).
|
|
7
|
+
* 5.0 negative examples (degrades WITHOUT failedSteps — deliberate)
|
|
8
|
+
* 5.0a self-improve rules (degrades WITHOUT failedSteps — deliberate)
|
|
9
|
+
* 5.1 progressive context (static + memory fidelity levels)
|
|
10
|
+
* 5.1b code intelligence context + metadata, then static-results emit
|
|
11
|
+
* 5.4 checklist context
|
|
12
|
+
*
|
|
13
|
+
* Writes the gather-owned state fields (placeholder-initialized by the
|
|
14
|
+
* orchestrator) unconditionally, before any downstream consumer runs.
|
|
15
|
+
* The three `*Safe` degradation helpers live in `gather-safe.ts` —
|
|
16
|
+
* moved byte-intact from pipeline.ts (incl. code-intel's emit-throw-only
|
|
17
|
+
* catch, pinned by the golden suite).
|
|
18
|
+
*/
|
|
19
|
+
import { buildCodeIntelSection } from '../agents/prompts.js';
|
|
20
|
+
import { buildChecklistContext, resolveChecklistConfig } from '../checklist/index.js';
|
|
21
|
+
import { buildCodeIntelContext } from '../code-intel/context.js';
|
|
22
|
+
import { SqliteMemoryStorage } from '../memory/sqlite.js';
|
|
23
|
+
import { formatNegativeExamplesPrompt } from '../negative.js';
|
|
24
|
+
import { deriveRules, formatRulesForPrompt, loadFeedback } from '../self-improve/index.js';
|
|
25
|
+
import { formatStaticAnalysisContext } from '../tools/runner.js';
|
|
26
|
+
import { buildProgressiveContext } from '../utils/context-levels.js';
|
|
27
|
+
import { runDegradable } from './degrade.js';
|
|
28
|
+
import { queryCodeIntelSafe, runStaticAnalysisSafe, searchMemorySafe } from './gather-safe.js';
|
|
29
|
+
/**
|
|
30
|
+
* Run the gather-context phase. Mutates the gather-owned fields on
|
|
31
|
+
* `state` (static analysis, memory, code-intel, prompts, checklist).
|
|
32
|
+
*/
|
|
33
|
+
export async function gatherContext(state) {
|
|
34
|
+
const { input, emit, aiEnabled, fileList, failedSteps } = state;
|
|
35
|
+
// ── Step 5: Run static analysis (in parallel with memory) ──
|
|
36
|
+
// If precomputed results are available (from GitHub Actions runner), use those directly.
|
|
37
|
+
// Otherwise, run tools locally (CLI/Action modes).
|
|
38
|
+
emit({
|
|
39
|
+
step: 'static-analysis',
|
|
40
|
+
message: input.precomputedStaticAnalysis
|
|
41
|
+
? 'Using precomputed static analysis from runner...'
|
|
42
|
+
: 'Running static analysis & memory search...',
|
|
43
|
+
});
|
|
44
|
+
const [staticResult, rawMemoryContext, codeIntelResults] = await Promise.all([
|
|
45
|
+
input.precomputedStaticAnalysis
|
|
46
|
+
? Promise.resolve(input.precomputedStaticAnalysis)
|
|
47
|
+
: runStaticAnalysisSafe(fileList, input, failedSteps),
|
|
48
|
+
aiEnabled ? searchMemorySafe(input, fileList, failedSteps) : Promise.resolve(null),
|
|
49
|
+
queryCodeIntelSafe(input, fileList, emit, failedSteps),
|
|
50
|
+
]);
|
|
51
|
+
state.staticResult = staticResult;
|
|
52
|
+
state.rawMemoryContext = rawMemoryContext;
|
|
53
|
+
state.codeIntelResults = codeIntelResults;
|
|
54
|
+
// ── Step 5.0: Negative examples (optional) ────────────────────
|
|
55
|
+
// Load dismissed findings for the files in this diff and prepend them
|
|
56
|
+
// to the memory context so agents suppress known false positives.
|
|
57
|
+
if (input.features?.negativeExamples !== false &&
|
|
58
|
+
input.memoryStorage instanceof SqliteMemoryStorage) {
|
|
59
|
+
// reportFailure: false is DELIBERATE — negative-examples degrades with a warn
|
|
60
|
+
// only and never lands in failedSteps (pinned by the golden degradation suite).
|
|
61
|
+
// It IS recorded in warnOnlyDegradations → coverageComplete reflects it.
|
|
62
|
+
await runDegradable(state, {
|
|
63
|
+
step: 'negative-examples',
|
|
64
|
+
warnLabel: '[ghagga] Negative examples load failed (degrading gracefully):',
|
|
65
|
+
reportFailure: false,
|
|
66
|
+
}, () => {
|
|
67
|
+
const allNegativeExamples = fileList.flatMap((filePath) => input.memoryStorage.getNegativeExamplesForFile(filePath));
|
|
68
|
+
// De-duplicate by findingHash
|
|
69
|
+
const seen = new Set();
|
|
70
|
+
const uniqueExamples = allNegativeExamples.filter((e) => {
|
|
71
|
+
if (seen.has(e.findingHash))
|
|
72
|
+
return false;
|
|
73
|
+
seen.add(e.findingHash);
|
|
74
|
+
return true;
|
|
75
|
+
});
|
|
76
|
+
state.negativeExamplesPrompt = formatNegativeExamplesPrompt(uniqueExamples);
|
|
77
|
+
if (state.negativeExamplesPrompt) {
|
|
78
|
+
emit({
|
|
79
|
+
step: 'negative-examples',
|
|
80
|
+
message: `Loaded ${uniqueExamples.length} dismissed finding(s) — injecting suppression context`,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// ── Step 5.0a: Self-improve rules (optional) ─────────────────
|
|
86
|
+
if (input.settings.selfImprovePath) {
|
|
87
|
+
const selfImprovePath = input.settings.selfImprovePath;
|
|
88
|
+
// reportFailure: false is DELIBERATE — self-improve degrades with a warn only
|
|
89
|
+
// and never lands in failedSteps (pinned by the golden degradation suite).
|
|
90
|
+
// It IS recorded in warnOnlyDegradations → coverageComplete reflects it.
|
|
91
|
+
await runDegradable(state, {
|
|
92
|
+
step: 'self-improve',
|
|
93
|
+
warnLabel: '[ghagga] Self-improve rules load failed (degrading gracefully):',
|
|
94
|
+
reportFailure: false,
|
|
95
|
+
}, async () => {
|
|
96
|
+
const feedback = await loadFeedback(selfImprovePath);
|
|
97
|
+
if (feedback.length > 0) {
|
|
98
|
+
const rules = deriveRules(feedback);
|
|
99
|
+
state.selfImproveRulesPrompt = formatRulesForPrompt(rules);
|
|
100
|
+
if (state.selfImproveRulesPrompt) {
|
|
101
|
+
emit({
|
|
102
|
+
step: 'self-improve',
|
|
103
|
+
message: `Self-improve: loaded ${feedback.length} feedback record(s), derived ${rules.length} rule(s)`,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// Build full (L2) context first, then choose fidelity level based on budget
|
|
110
|
+
const fullStaticContext = formatStaticAnalysisContext(staticResult);
|
|
111
|
+
// Prepend self-improve rules + negative examples to memory context
|
|
112
|
+
const rawMemoryContextWithNegatives = [state.selfImproveRulesPrompt, state.negativeExamplesPrompt, rawMemoryContext]
|
|
113
|
+
.filter(Boolean)
|
|
114
|
+
.join('\n') || null;
|
|
115
|
+
const progressiveContext = buildProgressiveContext({
|
|
116
|
+
staticResult,
|
|
117
|
+
memoryContext: rawMemoryContextWithNegatives,
|
|
118
|
+
stackHints: state.stackHints,
|
|
119
|
+
contextBudget: state.contextBudget,
|
|
120
|
+
fullStaticContext,
|
|
121
|
+
});
|
|
122
|
+
state.staticContext = progressiveContext.staticContext;
|
|
123
|
+
state.memoryContext = progressiveContext.memoryContext;
|
|
124
|
+
// ── Step 5.1b: Build code intelligence context (optional) ───
|
|
125
|
+
const codeIntelContext = codeIntelResults.length > 0
|
|
126
|
+
? buildCodeIntelSection(buildCodeIntelContext(codeIntelResults, input.settings.codeIntelMaxTokens))
|
|
127
|
+
: '';
|
|
128
|
+
state.codeIntelContext = codeIntelContext;
|
|
129
|
+
if (input.settings.enableCodeIntel) {
|
|
130
|
+
state.codeIntelMetadata = {
|
|
131
|
+
enabled: true,
|
|
132
|
+
providerAvailable: !!input.codeIntelProvider,
|
|
133
|
+
filesQueried: fileList.length,
|
|
134
|
+
filesWithData: codeIntelResults.filter((r) => r.callers.length > 0 || r.callees.length > 0 || r.imports.length > 0).length,
|
|
135
|
+
queryDurationMs: 0, // Timing captured in queryCodeIntelSafe
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
{
|
|
139
|
+
const toolsSummary = Object.entries(staticResult)
|
|
140
|
+
.map(([name, result]) => ` ${name}: ${result.status} (${result.findings.length} findings)`)
|
|
141
|
+
.join('\n');
|
|
142
|
+
const levelDetail = ` context levels: static=${progressiveContext.staticLevel}, memory=${progressiveContext.memoryLevel}`;
|
|
143
|
+
const codeIntelDetail = codeIntelContext
|
|
144
|
+
? `\n code-intel: ${codeIntelResults.length} file(s) with structural data`
|
|
145
|
+
: '\n code-intel: disabled or unavailable';
|
|
146
|
+
emit({
|
|
147
|
+
step: 'static-results',
|
|
148
|
+
message: `Static analysis complete (context: static=${progressiveContext.staticLevel}, memory=${progressiveContext.memoryLevel})`,
|
|
149
|
+
detail: toolsSummary +
|
|
150
|
+
(rawMemoryContext ? '\n memory: loaded' : '\n memory: disabled') +
|
|
151
|
+
codeIntelDetail +
|
|
152
|
+
'\n' +
|
|
153
|
+
levelDetail,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
// ── Step 5.4: Build checklist context (optional) ────────────
|
|
157
|
+
const resolvedChecklist = resolveChecklistConfig(input.settings.checklist);
|
|
158
|
+
state.resolvedChecklist = resolvedChecklist;
|
|
159
|
+
if (resolvedChecklist) {
|
|
160
|
+
state.checklistContext = buildChecklistContext(resolvedChecklist);
|
|
161
|
+
if (state.checklistContext) {
|
|
162
|
+
emit({
|
|
163
|
+
step: 'checklist',
|
|
164
|
+
message: `Checklist active: ${resolvedChecklist.dimensions.filter((d) => d.enabled).length} dimensions`,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=gather-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gather-context.js","sourceRoot":"","sources":["../../src/pipeline/gather-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAG/F;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAwB;IAC1D,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAEhE,8DAA8D;IAC9D,yFAAyF;IACzF,mDAAmD;IACnD,IAAI,CAAC;QACH,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,KAAK,CAAC,yBAAyB;YACtC,CAAC,CAAC,kDAAkD;YACpD,CAAC,CAAC,4CAA4C;KACjD,CAAC,CAAC;IACH,MAAM,CAAC,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC3E,KAAK,CAAC,yBAAyB;YAC7B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC;YAClD,CAAC,CAAC,qBAAqB,CAAC,QAAQ,EAAE,KAAK,EAAE,WAAW,CAAC;QACvD,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QAClF,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC;KACvD,CAAC,CAAC;IACH,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC;IAClC,KAAK,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC1C,KAAK,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAE1C,iEAAiE;IACjE,sEAAsE;IACtE,kEAAkE;IAClE,IACE,KAAK,CAAC,QAAQ,EAAE,gBAAgB,KAAK,KAAK;QAC1C,KAAK,CAAC,aAAa,YAAY,mBAAmB,EAClD,CAAC;QACD,8EAA8E;QAC9E,gFAAgF;QAChF,yEAAyE;QACzE,MAAM,aAAa,CACjB,KAAK,EACL;YACE,IAAI,EAAE,mBAAmB;YACzB,SAAS,EAAE,gEAAgE;YAC3E,aAAa,EAAE,KAAK;SACrB,EACD,GAAG,EAAE;YACH,MAAM,mBAAmB,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CACvD,KAAK,CAAC,aAAqC,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAClF,CAAC;YACF,8BAA8B;YAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAC/B,MAAM,cAAc,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBACtD,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;oBAAE,OAAO,KAAK,CAAC;gBAC1C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;gBACxB,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,sBAAsB,GAAG,4BAA4B,CAAC,cAAc,CAAC,CAAC;YAC5E,IAAI,KAAK,CAAC,sBAAsB,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,IAAI,EAAE,mBAAmB;oBACzB,OAAO,EAAE,UAAU,cAAc,CAAC,MAAM,uDAAuD;iBAChG,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAED,gEAAgE;IAChE,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;QACnC,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC;QACvD,8EAA8E;QAC9E,2EAA2E;QAC3E,yEAAyE;QACzE,MAAM,aAAa,CACjB,KAAK,EACL;YACE,IAAI,EAAE,cAAc;YACpB,SAAS,EAAE,iEAAiE;YAC5E,aAAa,EAAE,KAAK;SACrB,EACD,KAAK,IAAI,EAAE;YACT,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,CAAC;YACrD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACpC,KAAK,CAAC,sBAAsB,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;gBAC3D,IAAI,KAAK,CAAC,sBAAsB,EAAE,CAAC;oBACjC,IAAI,CAAC;wBACH,IAAI,EAAE,cAAc;wBACpB,OAAO,EAAE,wBAAwB,QAAQ,CAAC,MAAM,gCAAgC,KAAK,CAAC,MAAM,UAAU;qBACvG,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,MAAM,iBAAiB,GAAG,2BAA2B,CAAC,YAAY,CAAC,CAAC;IAEpE,mEAAmE;IACnE,MAAM,6BAA6B,GACjC,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,sBAAsB,EAAE,gBAAgB,CAAC;SAC3E,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAExB,MAAM,kBAAkB,GAAG,uBAAuB,CAAC;QACjD,YAAY;QACZ,aAAa,EAAE,6BAA6B;QAC5C,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,iBAAiB;KAClB,CAAC,CAAC;IAEH,KAAK,CAAC,aAAa,GAAG,kBAAkB,CAAC,aAAa,CAAC;IACvD,KAAK,CAAC,aAAa,GAAG,kBAAkB,CAAC,aAAa,CAAC;IAEvD,+DAA+D;IAC/D,MAAM,gBAAgB,GACpB,gBAAgB,CAAC,MAAM,GAAG,CAAC;QACzB,CAAC,CAAC,qBAAqB,CACnB,qBAAqB,CAAC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAC3E;QACH,CAAC,CAAC,EAAE,CAAC;IACT,KAAK,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAE1C,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;QACnC,KAAK,CAAC,iBAAiB,GAAG;YACxB,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB;YAC5C,YAAY,EAAE,QAAQ,CAAC,MAAM;YAC7B,aAAa,EAAE,gBAAgB,CAAC,MAAM,CACpC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAC5E,CAAC,MAAM;YACR,eAAe,EAAE,CAAC,EAAE,wCAAwC;SAC7D,CAAC;IACJ,CAAC;IAED,CAAC;QACC,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;aAC9C,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,KAAK,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,QAAQ,CAAC,MAAM,YAAY,CAAC;aAC3F,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,WAAW,GAAG,4BAA4B,kBAAkB,CAAC,WAAW,YAAY,kBAAkB,CAAC,WAAW,EAAE,CAAC;QAC3H,MAAM,eAAe,GAAG,gBAAgB;YACtC,CAAC,CAAC,mBAAmB,gBAAgB,CAAC,MAAM,+BAA+B;YAC3E,CAAC,CAAC,yCAAyC,CAAC;QAC9C,IAAI,CAAC;YACH,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,6CAA6C,kBAAkB,CAAC,WAAW,YAAY,kBAAkB,CAAC,WAAW,GAAG;YACjI,MAAM,EACJ,YAAY;gBACZ,CAAC,gBAAgB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,sBAAsB,CAAC;gBAClE,eAAe;gBACf,IAAI;gBACJ,WAAW;SACd,CAAC,CAAC;IACL,CAAC;IAED,+DAA+D;IAC/D,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC3E,KAAK,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC5C,IAAI,iBAAiB,EAAE,CAAC;QACtB,KAAK,CAAC,gBAAgB,GAAG,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;QAClE,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,qBAAqB,iBAAiB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,aAAa;aACxG,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Graceful-degradation helpers for the gather-context trio (step 5).
|
|
3
|
+
*
|
|
4
|
+
* Moved BYTE-INTACT from pipeline.ts (split-review-pipeline B5) — only
|
|
5
|
+
* `export` was added and relative import paths adjusted. They are
|
|
6
|
+
* private to the gather-context phase.
|
|
7
|
+
*
|
|
8
|
+
* ⚠️ queryCodeIntelSafe's catch is UNREACHABLE via provider failures
|
|
9
|
+
* (Promise.allSettled swallows per-file rejections); it only fires when
|
|
10
|
+
* the emit callback throws on the success message. Pinned by the golden
|
|
11
|
+
* suite — preserve the catch literally.
|
|
12
|
+
*/
|
|
13
|
+
import type { CodeIntelResult } from '../code-intel/types.js';
|
|
14
|
+
import type { ReviewInput } from '../types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Run static analysis with graceful degradation.
|
|
17
|
+
* Returns a result with all tools skipped if anything goes wrong.
|
|
18
|
+
*/
|
|
19
|
+
export declare function runStaticAnalysisSafe(fileList: string[], input: ReviewInput, failedSteps: {
|
|
20
|
+
step: string;
|
|
21
|
+
error: string;
|
|
22
|
+
}[]): Promise<import("../types.js").StaticAnalysisResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Search memory with graceful degradation.
|
|
25
|
+
* Returns null if memory is disabled or unavailable.
|
|
26
|
+
*/
|
|
27
|
+
export declare function searchMemorySafe(input: ReviewInput, fileList: string[], failedSteps: {
|
|
28
|
+
step: string;
|
|
29
|
+
error: string;
|
|
30
|
+
}[]): Promise<string | null>;
|
|
31
|
+
/**
|
|
32
|
+
* Query the code intelligence provider for structural context.
|
|
33
|
+
* Returns an empty array when disabled, unavailable, or on error.
|
|
34
|
+
*/
|
|
35
|
+
export declare function queryCodeIntelSafe(input: ReviewInput, fileList: string[], emit: (event: import('../types.js').ProgressEvent) => void, failedSteps: {
|
|
36
|
+
step: string;
|
|
37
|
+
error: string;
|
|
38
|
+
}[]): Promise<CodeIntelResult[]>;
|
|
39
|
+
//# sourceMappingURL=gather-safe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gather-safe.d.ts","sourceRoot":"","sources":["../../src/pipeline/gather-safe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,WAAW,EAClB,WAAW,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,uDAwC/C;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,EAAE,EAClB,WAAW,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,GAC7C,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkBxB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,EAAE,EAClB,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,aAAa,EAAE,aAAa,KAAK,IAAI,EAC1D,WAAW,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,GAC7C,OAAO,CAAC,eAAe,EAAE,CAAC,CAkE5B"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Graceful-degradation helpers for the gather-context trio (step 5).
|
|
3
|
+
*
|
|
4
|
+
* Moved BYTE-INTACT from pipeline.ts (split-review-pipeline B5) — only
|
|
5
|
+
* `export` was added and relative import paths adjusted. They are
|
|
6
|
+
* private to the gather-context phase.
|
|
7
|
+
*
|
|
8
|
+
* ⚠️ queryCodeIntelSafe's catch is UNREACHABLE via provider failures
|
|
9
|
+
* (Promise.allSettled swallows per-file rejections); it only fires when
|
|
10
|
+
* the emit callback throws on the success message. Pinned by the golden
|
|
11
|
+
* suite — preserve the catch literally.
|
|
12
|
+
*/
|
|
13
|
+
import { searchMemoryForContext } from '../memory/search.js';
|
|
14
|
+
import { runStaticAnalysis } from '../tools/runner.js';
|
|
15
|
+
/**
|
|
16
|
+
* Run static analysis with graceful degradation.
|
|
17
|
+
* Returns a result with all tools skipped if anything goes wrong.
|
|
18
|
+
*/
|
|
19
|
+
export async function runStaticAnalysisSafe(fileList, input, failedSteps) {
|
|
20
|
+
try {
|
|
21
|
+
// Build a file map for static analysis (paths only, content from diff)
|
|
22
|
+
const files = new Map();
|
|
23
|
+
for (const path of fileList) {
|
|
24
|
+
files.set(path, ''); // Content is extracted from diff by the tool runner
|
|
25
|
+
}
|
|
26
|
+
return await runStaticAnalysis(files, '.', {
|
|
27
|
+
enableSemgrep: input.settings.enableSemgrep,
|
|
28
|
+
enableTrivy: input.settings.enableTrivy,
|
|
29
|
+
enableCpd: input.settings.enableCpd,
|
|
30
|
+
customRules: input.settings.customRules,
|
|
31
|
+
enabledTools: input.settings.enabledTools,
|
|
32
|
+
disabledTools: input.settings.disabledTools,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
console.warn('[ghagga] Static analysis failed (degrading gracefully):', error instanceof Error ? error.message : String(error));
|
|
37
|
+
failedSteps.push({
|
|
38
|
+
step: 'static-analysis',
|
|
39
|
+
error: error instanceof Error ? error.message : String(error),
|
|
40
|
+
});
|
|
41
|
+
const errorResult = {
|
|
42
|
+
status: 'error',
|
|
43
|
+
findings: [],
|
|
44
|
+
error: error instanceof Error ? error.message : String(error),
|
|
45
|
+
executionTimeMs: 0,
|
|
46
|
+
};
|
|
47
|
+
return {
|
|
48
|
+
semgrep: errorResult,
|
|
49
|
+
trivy: errorResult,
|
|
50
|
+
cpd: errorResult,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Search memory with graceful degradation.
|
|
56
|
+
* Returns null if memory is disabled or unavailable.
|
|
57
|
+
*/
|
|
58
|
+
export async function searchMemorySafe(input, fileList, failedSteps) {
|
|
59
|
+
if (!input.settings.enableMemory || !input.memoryStorage || !input.context) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
return await searchMemoryForContext(input.memoryStorage, input.context.repoFullName, fileList);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
console.warn('[ghagga] Memory search failed (degrading gracefully):', error instanceof Error ? error.message : String(error));
|
|
67
|
+
failedSteps.push({
|
|
68
|
+
step: 'memory-search',
|
|
69
|
+
error: error instanceof Error ? error.message : String(error),
|
|
70
|
+
});
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Query the code intelligence provider for structural context.
|
|
76
|
+
* Returns an empty array when disabled, unavailable, or on error.
|
|
77
|
+
*/
|
|
78
|
+
export async function queryCodeIntelSafe(input, fileList, emit, failedSteps) {
|
|
79
|
+
if (!input.settings.enableCodeIntel || !input.codeIntelProvider) {
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
const startTime = Date.now();
|
|
83
|
+
emit({
|
|
84
|
+
step: 'code-intel',
|
|
85
|
+
message: `Querying code intelligence for ${fileList.length} file(s)...`,
|
|
86
|
+
});
|
|
87
|
+
try {
|
|
88
|
+
const results = [];
|
|
89
|
+
const provider = input.codeIntelProvider;
|
|
90
|
+
// Query each changed file for structural data (parallel)
|
|
91
|
+
const queries = fileList.map(async (file) => {
|
|
92
|
+
const [imports, exports] = await Promise.all([
|
|
93
|
+
provider.getFileImports(file),
|
|
94
|
+
provider.getFileExports(file),
|
|
95
|
+
]);
|
|
96
|
+
// Query callers/callees for each exported symbol
|
|
97
|
+
const callerResults = await Promise.all(exports.slice(0, 10).map((sym) => provider.getCallers(sym, file)));
|
|
98
|
+
const calleeResults = await Promise.all(exports.slice(0, 10).map((sym) => provider.getCallees(sym, file)));
|
|
99
|
+
const callers = callerResults.flat();
|
|
100
|
+
const callees = calleeResults.flat();
|
|
101
|
+
return { file, callers, callees, imports, exports };
|
|
102
|
+
});
|
|
103
|
+
const settled = await Promise.allSettled(queries);
|
|
104
|
+
for (const outcome of settled) {
|
|
105
|
+
if (outcome.status === 'fulfilled') {
|
|
106
|
+
results.push(outcome.value);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const durationMs = Date.now() - startTime;
|
|
110
|
+
const withData = results.filter((r) => r.callers.length > 0 || r.callees.length > 0 || r.imports.length > 0).length;
|
|
111
|
+
emit({
|
|
112
|
+
step: 'code-intel',
|
|
113
|
+
message: `Code intelligence: ${withData}/${results.length} files with structural data (${durationMs}ms)`,
|
|
114
|
+
});
|
|
115
|
+
return results;
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
console.warn('[ghagga] Code intelligence query failed (degrading gracefully):', error instanceof Error ? error.message : String(error));
|
|
119
|
+
failedSteps.push({
|
|
120
|
+
step: 'code-intel',
|
|
121
|
+
error: error instanceof Error ? error.message : String(error),
|
|
122
|
+
});
|
|
123
|
+
emit({ step: 'code-intel', message: 'Code intelligence: failed — continuing without' });
|
|
124
|
+
return [];
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=gather-safe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gather-safe.js","sourceRoot":"","sources":["../../src/pipeline/gather-safe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGvD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAkB,EAClB,KAAkB,EAClB,WAA8C;IAE9C,IAAI,CAAC;QACH,uEAAuE;QACvE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;QACxC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,oDAAoD;QAC3E,CAAC;QAED,OAAO,MAAM,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE;YACzC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,aAAa;YAC3C,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW;YACvC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS;YACnC,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW;YACvC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,YAAY;YACzC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,aAAa;SAC5C,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CACV,yDAAyD,EACzD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,WAAW,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,iBAAiB;YACvB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG;YAClB,MAAM,EAAE,OAAgB;YACxB,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC7D,eAAe,EAAE,CAAC;SACnB,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,WAAW;YACpB,KAAK,EAAE,WAAW;YAClB,GAAG,EAAE,WAAW;SACjB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAkB,EAClB,QAAkB,EAClB,WAA8C;IAE9C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,sBAAsB,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACjG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CACV,uDAAuD,EACvD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,WAAW,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAkB,EAClB,QAAkB,EAClB,IAA0D,EAC1D,WAA8C;IAE9C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAChE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,kCAAkC,QAAQ,CAAC,MAAM,aAAa;KACxE,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,OAAO,GAAsB,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,iBAAiB,CAAC;QAEzC,yDAAyD;QACzD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAC1C,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC3C,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC;gBAC7B,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC;aAC9B,CAAC,CAAC;YAEH,iDAAiD;YACjD,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,GAAG,CACrC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAClE,CAAC;YACF,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,GAAG,CACrC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAClE,CAAC;YAEF,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;YAErC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAClD,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;YAC9B,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAC5E,CAAC,MAAM,CAAC;QAET,IAAI,CAAC;YACH,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,sBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,gCAAgC,UAAU,KAAK;SACzG,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CACV,iEAAiE,EACjE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,WAAW,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,gDAAgD,EAAE,CAAC,CAAC;QACxF,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Graph-powered prepare steps: 2.5 blast-radius filter + 2.6 call-chain
|
|
3
|
+
* / reverse-deps context.
|
|
4
|
+
*
|
|
5
|
+
* Phase-private sibling of `prepare.ts` — split out so prepare stays under
|
|
6
|
+
* the 300-line module cap (same precedent as `gather-safe.ts` for the
|
|
7
|
+
* gather-context phase). Exported only because TS module boundaries
|
|
8
|
+
* require it; the ONLY intended importer is `prepare.ts`.
|
|
9
|
+
*
|
|
10
|
+
* Step bodies are moved LITERAL from the original `reviewPipeline`:
|
|
11
|
+
* - Blast-radius keeps its BESPOKE catch (sets a fallback
|
|
12
|
+
* `blastRadiusMetadata` and warns with the RAW error, not `.message`) —
|
|
13
|
+
* deliberately NOT migrated to `runDegradable` (see degrade.ts).
|
|
14
|
+
* - Call-chain degrades via `runDegradable` with `reportFailure: false`
|
|
15
|
+
* (DELIBERATE — warn only, never lands in failedSteps; pinned by the
|
|
16
|
+
* golden degradation suite). The degradation IS recorded in
|
|
17
|
+
* `warnOnlyDegradations` so `coverageComplete` reflects it.
|
|
18
|
+
*/
|
|
19
|
+
import type { BlastRadiusMetadata } from '../graph/schema.js';
|
|
20
|
+
import type { ProgressEvent, ReviewInput } from '../types.js';
|
|
21
|
+
import type { DiffFile } from '../utils/diff.js';
|
|
22
|
+
import type { FailedStep } from './state.js';
|
|
23
|
+
interface GraphStepArgs {
|
|
24
|
+
input: ReviewInput;
|
|
25
|
+
emit: (event: ProgressEvent) => void;
|
|
26
|
+
failedSteps: FailedStep[];
|
|
27
|
+
/** ⚠️ PRE-blast-radius file list (see state.ts — load-bearing). */
|
|
28
|
+
fileList: string[];
|
|
29
|
+
filteredDiff: string;
|
|
30
|
+
}
|
|
31
|
+
/** Outcome of the blast-radius filter (step 2.5). */
|
|
32
|
+
export interface BlastRadiusOutcome {
|
|
33
|
+
filteredFiles: DiffFile[];
|
|
34
|
+
filteredDiff: string;
|
|
35
|
+
blastRadiusMetadata: BlastRadiusMetadata | undefined;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Step 2.5: Blast-radius filter (optional).
|
|
39
|
+
* Narrows `filteredFiles`/`filteredDiff` to the blast radius when a
|
|
40
|
+
* dependency graph is available; falls back to the full diff otherwise.
|
|
41
|
+
*/
|
|
42
|
+
export declare function applyBlastRadius(args: GraphStepArgs & {
|
|
43
|
+
filteredFiles: DiffFile[];
|
|
44
|
+
}): Promise<BlastRadiusOutcome>;
|
|
45
|
+
/**
|
|
46
|
+
* Step 2.6: Call-chain + reverse-deps context (optional, runs when
|
|
47
|
+
* blast-radius is enabled). Returns the prompt context string ('' when
|
|
48
|
+
* disabled, no symbols affected, or degraded).
|
|
49
|
+
*/
|
|
50
|
+
export declare function buildCallChainContext(args: GraphStepArgs & {
|
|
51
|
+
warnOnlyDegradations: string[];
|
|
52
|
+
}): Promise<string>;
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=prepare-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepare-graph.d.ts","sourceRoot":"","sources":["../../src/pipeline/prepare-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,UAAU,aAAa;IACrB,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACrC,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,mEAAmE;IACnE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qDAAqD;AACrD,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,QAAQ,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,mBAAmB,GAAG,SAAS,CAAC;CACtD;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,aAAa,GAAG;IAAE,aAAa,EAAE,QAAQ,EAAE,CAAA;CAAE,GAClD,OAAO,CAAC,kBAAkB,CAAC,CAsF7B;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,aAAa,GAAG;IAAE,oBAAoB,EAAE,MAAM,EAAE,CAAA;CAAE,GACvD,OAAO,CAAC,MAAM,CAAC,CA+DjB"}
|