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.
Files changed (206) hide show
  1. package/LICENSE +21 -0
  2. package/dist/acp/adapter.d.ts.map +1 -1
  3. package/dist/acp/adapter.js +1 -1
  4. package/dist/acp/adapter.js.map +1 -1
  5. package/dist/acp/index.d.ts +1 -1
  6. package/dist/acp/index.d.ts.map +1 -1
  7. package/dist/acp/index.js.map +1 -1
  8. package/dist/acp/types.d.ts.map +1 -1
  9. package/dist/agents/consensus.d.ts.map +1 -1
  10. package/dist/agents/consensus.js +7 -2
  11. package/dist/agents/consensus.js.map +1 -1
  12. package/dist/agents/diagnostic.d.ts.map +1 -1
  13. package/dist/agents/diagnostic.js +7 -2
  14. package/dist/agents/diagnostic.js.map +1 -1
  15. package/dist/agents/fan-out-lenses.d.ts.map +1 -1
  16. package/dist/agents/fan-out-lenses.js +7 -2
  17. package/dist/agents/fan-out-lenses.js.map +1 -1
  18. package/dist/agents/prompts.d.ts +49 -1
  19. package/dist/agents/prompts.d.ts.map +1 -1
  20. package/dist/agents/prompts.js +133 -5
  21. package/dist/agents/prompts.js.map +1 -1
  22. package/dist/agents/simple.d.ts +1 -1
  23. package/dist/agents/simple.d.ts.map +1 -1
  24. package/dist/agents/simple.js +6 -4
  25. package/dist/agents/simple.js.map +1 -1
  26. package/dist/agents/workflow.d.ts.map +1 -1
  27. package/dist/agents/workflow.js +13 -4
  28. package/dist/agents/workflow.js.map +1 -1
  29. package/dist/critique/critique.d.ts.map +1 -1
  30. package/dist/critique/critique.js +14 -6
  31. package/dist/critique/critique.js.map +1 -1
  32. package/dist/critique/cross-model.d.ts.map +1 -1
  33. package/dist/critique/cross-model.js +1 -3
  34. package/dist/critique/cross-model.js.map +1 -1
  35. package/dist/critique/index.d.ts +1 -2
  36. package/dist/critique/index.d.ts.map +1 -1
  37. package/dist/critique/index.js +1 -2
  38. package/dist/critique/index.js.map +1 -1
  39. package/dist/diff/index.d.ts +12 -0
  40. package/dist/diff/index.d.ts.map +1 -0
  41. package/dist/diff/index.js +11 -0
  42. package/dist/diff/index.js.map +1 -0
  43. package/dist/diff/parse.d.ts +41 -0
  44. package/dist/diff/parse.d.ts.map +1 -0
  45. package/dist/diff/parse.js +303 -0
  46. package/dist/diff/parse.js.map +1 -0
  47. package/dist/diff/types.d.ts +106 -0
  48. package/dist/diff/types.d.ts.map +1 -0
  49. package/dist/diff/types.js +23 -0
  50. package/dist/diff/types.js.map +1 -0
  51. package/dist/embed.d.ts +5 -2
  52. package/dist/embed.d.ts.map +1 -1
  53. package/dist/embed.js +7 -3
  54. package/dist/embed.js.map +1 -1
  55. package/dist/enhance/prompt.d.ts +5 -1
  56. package/dist/enhance/prompt.d.ts.map +1 -1
  57. package/dist/enhance/prompt.js +9 -2
  58. package/dist/enhance/prompt.js.map +1 -1
  59. package/dist/format.d.ts +31 -0
  60. package/dist/format.d.ts.map +1 -1
  61. package/dist/format.js +256 -15
  62. package/dist/format.js.map +1 -1
  63. package/dist/index.d.ts +6 -7
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +4 -8
  66. package/dist/index.js.map +1 -1
  67. package/dist/memory/pageindex/chunker.d.ts +1 -1
  68. package/dist/memory/pageindex/chunker.d.ts.map +1 -1
  69. package/dist/memory/pageindex/chunker.js +5 -5
  70. package/dist/memory/pageindex/chunker.js.map +1 -1
  71. package/dist/memory/pageindex/example.d.ts +1 -1
  72. package/dist/memory/pageindex/example.d.ts.map +1 -1
  73. package/dist/memory/pageindex/example.js +1 -2
  74. package/dist/memory/pageindex/example.js.map +1 -1
  75. package/dist/memory/pageindex/index.d.ts +3 -3
  76. package/dist/memory/pageindex/index.d.ts.map +1 -1
  77. package/dist/memory/pageindex/index.js +1 -1
  78. package/dist/memory/pageindex/index.js.map +1 -1
  79. package/dist/memory/pageindex/service.d.ts +11 -2
  80. package/dist/memory/pageindex/service.d.ts.map +1 -1
  81. package/dist/memory/pageindex/service.js +12 -11
  82. package/dist/memory/pageindex/service.js.map +1 -1
  83. package/dist/memory/persist.d.ts.map +1 -1
  84. package/dist/memory/persist.js +10 -3
  85. package/dist/memory/persist.js.map +1 -1
  86. package/dist/memory/privacy.d.ts.map +1 -1
  87. package/dist/memory/privacy.js +45 -6
  88. package/dist/memory/privacy.js.map +1 -1
  89. package/dist/memory/sqlite.d.ts +1 -13
  90. package/dist/memory/sqlite.d.ts.map +1 -1
  91. package/dist/memory/sqlite.js +45 -27
  92. package/dist/memory/sqlite.js.map +1 -1
  93. package/dist/memory/taxonomy.d.ts.map +1 -1
  94. package/dist/memory/taxonomy.js +6 -1
  95. package/dist/memory/taxonomy.js.map +1 -1
  96. package/dist/pipeline/degrade.d.ts +61 -0
  97. package/dist/pipeline/degrade.d.ts.map +1 -0
  98. package/dist/pipeline/degrade.js +58 -0
  99. package/dist/pipeline/degrade.js.map +1 -0
  100. package/dist/pipeline/enrich.d.ts +29 -0
  101. package/dist/pipeline/enrich.d.ts.map +1 -0
  102. package/dist/pipeline/enrich.js +271 -0
  103. package/dist/pipeline/enrich.js.map +1 -0
  104. package/dist/pipeline/execute.d.ts +22 -0
  105. package/dist/pipeline/execute.d.ts.map +1 -0
  106. package/dist/pipeline/execute.js +250 -0
  107. package/dist/pipeline/execute.js.map +1 -0
  108. package/dist/pipeline/finalize.d.ts +26 -0
  109. package/dist/pipeline/finalize.d.ts.map +1 -0
  110. package/dist/pipeline/finalize.js +52 -0
  111. package/dist/pipeline/finalize.js.map +1 -0
  112. package/dist/pipeline/gather-context.d.ts +25 -0
  113. package/dist/pipeline/gather-context.d.ts.map +1 -0
  114. package/dist/pipeline/gather-context.js +169 -0
  115. package/dist/pipeline/gather-context.js.map +1 -0
  116. package/dist/pipeline/gather-safe.d.ts +39 -0
  117. package/dist/pipeline/gather-safe.d.ts.map +1 -0
  118. package/dist/pipeline/gather-safe.js +127 -0
  119. package/dist/pipeline/gather-safe.js.map +1 -0
  120. package/dist/pipeline/prepare-graph.d.ts +54 -0
  121. package/dist/pipeline/prepare-graph.d.ts.map +1 -0
  122. package/dist/pipeline/prepare-graph.js +174 -0
  123. package/dist/pipeline/prepare-graph.js.map +1 -0
  124. package/dist/pipeline/prepare.d.ts +40 -0
  125. package/dist/pipeline/prepare.d.ts.map +1 -0
  126. package/dist/pipeline/prepare.js +233 -0
  127. package/dist/pipeline/prepare.js.map +1 -0
  128. package/dist/pipeline/providers.d.ts +54 -0
  129. package/dist/pipeline/providers.d.ts.map +1 -0
  130. package/dist/pipeline/providers.js +163 -0
  131. package/dist/pipeline/providers.js.map +1 -0
  132. package/dist/pipeline/results.d.ts +35 -0
  133. package/dist/pipeline/results.d.ts.map +1 -0
  134. package/dist/pipeline/results.js +122 -0
  135. package/dist/pipeline/results.js.map +1 -0
  136. package/dist/pipeline/state.d.ts +92 -0
  137. package/dist/pipeline/state.d.ts.map +1 -0
  138. package/dist/pipeline/state.js +13 -0
  139. package/dist/pipeline/state.js.map +1 -0
  140. package/dist/pipeline.d.ts +10 -9
  141. package/dist/pipeline.d.ts.map +1 -1
  142. package/dist/pipeline.js +36 -1213
  143. package/dist/pipeline.js.map +1 -1
  144. package/dist/providers/gateway.d.ts.map +1 -1
  145. package/dist/providers/gateway.js +8 -0
  146. package/dist/providers/gateway.js.map +1 -1
  147. package/dist/recursive/index.d.ts +1 -0
  148. package/dist/recursive/index.d.ts.map +1 -1
  149. package/dist/recursive/index.js +7 -3
  150. package/dist/recursive/index.js.map +1 -1
  151. package/dist/recursive/patch-extractor.d.ts +58 -6
  152. package/dist/recursive/patch-extractor.d.ts.map +1 -1
  153. package/dist/recursive/patch-extractor.js +207 -26
  154. package/dist/recursive/patch-extractor.js.map +1 -1
  155. package/dist/sanitize.d.ts +51 -0
  156. package/dist/sanitize.d.ts.map +1 -0
  157. package/dist/sanitize.js +90 -0
  158. package/dist/sanitize.js.map +1 -0
  159. package/dist/scope/diff-mapper.d.ts +12 -0
  160. package/dist/scope/diff-mapper.d.ts.map +1 -1
  161. package/dist/scope/diff-mapper.js +25 -18
  162. package/dist/scope/diff-mapper.js.map +1 -1
  163. package/dist/scope/entity-diff.d.ts +21 -4
  164. package/dist/scope/entity-diff.d.ts.map +1 -1
  165. package/dist/scope/entity-diff.js +132 -34
  166. package/dist/scope/entity-diff.js.map +1 -1
  167. package/dist/scope/types.d.ts +10 -0
  168. package/dist/scope/types.d.ts.map +1 -1
  169. package/dist/search/index.d.ts +1 -1
  170. package/dist/search/index.d.ts.map +1 -1
  171. package/dist/search/index.js.map +1 -1
  172. package/dist/search/indexer.d.ts.map +1 -1
  173. package/dist/search/indexer.js +33 -4
  174. package/dist/search/indexer.js.map +1 -1
  175. package/dist/search/searcher.d.ts.map +1 -1
  176. package/dist/search/searcher.js.map +1 -1
  177. package/dist/semantic-diff/index.d.ts +25 -2
  178. package/dist/semantic-diff/index.d.ts.map +1 -1
  179. package/dist/semantic-diff/index.js +147 -53
  180. package/dist/semantic-diff/index.js.map +1 -1
  181. package/dist/tools/gitleaks-config.toml +35 -0
  182. package/dist/tools/plugins/gitleaks.d.ts +10 -0
  183. package/dist/tools/plugins/gitleaks.d.ts.map +1 -1
  184. package/dist/tools/plugins/gitleaks.js +29 -2
  185. package/dist/tools/plugins/gitleaks.js.map +1 -1
  186. package/dist/tools/plugins/semgrep.d.ts +11 -0
  187. package/dist/tools/plugins/semgrep.d.ts.map +1 -1
  188. package/dist/tools/plugins/semgrep.js +30 -1
  189. package/dist/tools/plugins/semgrep.js.map +1 -1
  190. package/dist/tools/semgrep-rules.yml +305 -0
  191. package/dist/types.d.ts +51 -1
  192. package/dist/types.d.ts.map +1 -1
  193. package/dist/types.js.map +1 -1
  194. package/dist/utils/diff.d.ts +22 -2
  195. package/dist/utils/diff.d.ts.map +1 -1
  196. package/dist/utils/diff.js +36 -40
  197. package/dist/utils/diff.js.map +1 -1
  198. package/package.json +21 -22
  199. package/dist/providers/fallback.d.ts +0 -54
  200. package/dist/providers/fallback.d.ts.map +0 -1
  201. package/dist/providers/fallback.js +0 -102
  202. package/dist/providers/fallback.js.map +0 -1
  203. package/dist/providers/index.d.ts +0 -49
  204. package/dist/providers/index.d.ts.map +0 -1
  205. package/dist/providers/index.js +0 -146
  206. 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":"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"}
@@ -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":"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"}
@@ -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"}