ghagga-core 2.8.0 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/acp/adapter.d.ts +91 -0
- package/dist/acp/adapter.d.ts.map +1 -0
- package/dist/acp/adapter.js +315 -0
- package/dist/acp/adapter.js.map +1 -0
- package/dist/acp/index.d.ts +4 -0
- package/dist/acp/index.d.ts.map +1 -0
- package/dist/acp/index.js +2 -0
- package/dist/acp/index.js.map +1 -0
- package/dist/acp/types.d.ts +142 -0
- package/dist/acp/types.d.ts.map +1 -0
- package/dist/acp/types.js +13 -0
- package/dist/acp/types.js.map +1 -0
- package/dist/adversarial-qa.d.ts +60 -0
- package/dist/adversarial-qa.d.ts.map +1 -0
- package/dist/adversarial-qa.js +85 -0
- package/dist/adversarial-qa.js.map +1 -0
- package/dist/agents/audit.d.ts +18 -0
- package/dist/agents/audit.d.ts.map +1 -0
- package/dist/agents/audit.js +78 -0
- package/dist/agents/audit.js.map +1 -0
- package/dist/agents/consensus.d.ts +1 -1
- package/dist/agents/consensus.d.ts.map +1 -1
- package/dist/agents/consensus.js +10 -8
- package/dist/agents/consensus.js.map +1 -1
- package/dist/agents/diagnostic.d.ts.map +1 -1
- package/dist/agents/diagnostic.js +22 -20
- package/dist/agents/diagnostic.js.map +1 -1
- package/dist/agents/fan-out-lenses.d.ts +41 -0
- package/dist/agents/fan-out-lenses.d.ts.map +1 -1
- package/dist/agents/fan-out-lenses.js +117 -3
- package/dist/agents/fan-out-lenses.js.map +1 -1
- package/dist/agents/prompts.d.ts +12 -0
- package/dist/agents/prompts.d.ts.map +1 -1
- package/dist/agents/prompts.js +31 -0
- 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 +10 -6
- package/dist/agents/simple.js.map +1 -1
- package/dist/agents/workflow.d.ts +1 -1
- package/dist/agents/workflow.d.ts.map +1 -1
- package/dist/agents/workflow.js +9 -8
- package/dist/agents/workflow.js.map +1 -1
- package/dist/aisvs.d.ts +44 -0
- package/dist/aisvs.d.ts.map +1 -0
- package/dist/aisvs.js +189 -0
- package/dist/aisvs.js.map +1 -0
- package/dist/checklist/context.d.ts.map +1 -1
- package/dist/checklist/context.js +2 -8
- package/dist/checklist/context.js.map +1 -1
- package/dist/checklist/defaults.d.ts.map +1 -1
- package/dist/checklist/defaults.js.map +1 -1
- package/dist/checklist/scorer.d.ts.map +1 -1
- package/dist/checklist/scorer.js +105 -12
- package/dist/checklist/scorer.js.map +1 -1
- package/dist/code-intel/client.d.ts +30 -0
- package/dist/code-intel/client.d.ts.map +1 -0
- package/dist/code-intel/client.js +91 -0
- package/dist/code-intel/client.js.map +1 -0
- package/dist/code-intel/context.d.ts +21 -0
- package/dist/code-intel/context.d.ts.map +1 -0
- package/dist/code-intel/context.js +72 -0
- package/dist/code-intel/context.js.map +1 -0
- package/dist/code-intel/index.d.ts +10 -0
- package/dist/code-intel/index.d.ts.map +1 -0
- package/dist/code-intel/index.js +11 -0
- package/dist/code-intel/index.js.map +1 -0
- package/dist/code-intel/types.d.ts +63 -0
- package/dist/code-intel/types.d.ts.map +1 -0
- package/dist/code-intel/types.js +9 -0
- package/dist/code-intel/types.js.map +1 -0
- package/dist/compress/index.d.ts +55 -0
- package/dist/compress/index.d.ts.map +1 -0
- package/dist/compress/index.js +166 -0
- package/dist/compress/index.js.map +1 -0
- package/dist/cost-footer.d.ts +38 -0
- package/dist/cost-footer.d.ts.map +1 -0
- package/dist/cost-footer.js +95 -0
- package/dist/cost-footer.js.map +1 -0
- package/dist/critique/critique.d.ts +40 -0
- package/dist/critique/critique.d.ts.map +1 -0
- package/dist/critique/critique.js +194 -0
- package/dist/critique/critique.js.map +1 -0
- package/dist/critique/cross-model.d.ts +123 -0
- package/dist/critique/cross-model.d.ts.map +1 -0
- package/dist/critique/cross-model.js +267 -0
- package/dist/critique/cross-model.js.map +1 -0
- package/dist/critique/index.d.ts +8 -0
- package/dist/critique/index.d.ts.map +1 -0
- package/dist/critique/index.js +6 -0
- package/dist/critique/index.js.map +1 -0
- package/dist/critique/prompts.d.ts +11 -0
- package/dist/critique/prompts.d.ts.map +1 -0
- package/dist/critique/prompts.js +66 -0
- package/dist/critique/prompts.js.map +1 -0
- package/dist/critique/types.d.ts +84 -0
- package/dist/critique/types.d.ts.map +1 -0
- package/dist/critique/types.js +13 -0
- package/dist/critique/types.js.map +1 -0
- package/dist/doc-validation/index.d.ts +9 -0
- package/dist/doc-validation/index.d.ts.map +1 -0
- package/dist/doc-validation/index.js +9 -0
- package/dist/doc-validation/index.js.map +1 -0
- package/dist/doc-validation/scanner.d.ts +40 -0
- package/dist/doc-validation/scanner.d.ts.map +1 -0
- package/dist/doc-validation/scanner.js +163 -0
- package/dist/doc-validation/scanner.js.map +1 -0
- package/dist/doc-validation/types.d.ts +27 -0
- package/dist/doc-validation/types.d.ts.map +1 -0
- package/dist/doc-validation/types.js +8 -0
- package/dist/doc-validation/types.js.map +1 -0
- package/dist/embed.d.ts +27 -0
- package/dist/embed.d.ts.map +1 -0
- package/dist/embed.js +47 -0
- package/dist/embed.js.map +1 -0
- package/dist/enhance/enhance.d.ts.map +1 -1
- package/dist/enhance/enhance.js +7 -25
- package/dist/enhance/enhance.js.map +1 -1
- package/dist/enhance/types.d.ts +5 -0
- package/dist/enhance/types.d.ts.map +1 -1
- package/dist/exploitability/analyzer.d.ts +42 -0
- package/dist/exploitability/analyzer.d.ts.map +1 -1
- package/dist/exploitability/analyzer.js +225 -0
- package/dist/exploitability/analyzer.js.map +1 -1
- package/dist/exploitability/index.d.ts +3 -2
- package/dist/exploitability/index.d.ts.map +1 -1
- package/dist/exploitability/index.js +1 -2
- package/dist/exploitability/index.js.map +1 -1
- package/dist/exploitability/types.d.ts +27 -0
- package/dist/exploitability/types.d.ts.map +1 -1
- package/dist/fetch-fix.d.ts +60 -0
- package/dist/fetch-fix.d.ts.map +1 -0
- package/dist/fetch-fix.js +137 -0
- package/dist/fetch-fix.js.map +1 -0
- package/dist/flood/index.d.ts +34 -0
- package/dist/flood/index.d.ts.map +1 -0
- package/dist/flood/index.js +67 -0
- package/dist/flood/index.js.map +1 -0
- package/dist/format.d.ts.map +1 -1
- package/dist/format.js +6 -1
- package/dist/format.js.map +1 -1
- package/dist/graph/blast-radius.js +2 -2
- package/dist/graph/blast-radius.js.map +1 -1
- package/dist/graph/call-chain.d.ts +36 -0
- package/dist/graph/call-chain.d.ts.map +1 -0
- package/dist/graph/call-chain.js +291 -0
- package/dist/graph/call-chain.js.map +1 -0
- package/dist/graph/index.d.ts +4 -0
- package/dist/graph/index.d.ts.map +1 -1
- package/dist/graph/index.js +2 -0
- package/dist/graph/index.js.map +1 -1
- package/dist/graph/reverse-deps.d.ts +37 -0
- package/dist/graph/reverse-deps.d.ts.map +1 -0
- package/dist/graph/reverse-deps.js +136 -0
- package/dist/graph/reverse-deps.js.map +1 -0
- package/dist/index.d.ts +50 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -7
- package/dist/index.js.map +1 -1
- package/dist/injection-corpus.d.ts +41 -0
- package/dist/injection-corpus.d.ts.map +1 -0
- package/dist/injection-corpus.js +181 -0
- package/dist/injection-corpus.js.map +1 -0
- package/dist/latent-comms.d.ts +31 -0
- package/dist/latent-comms.d.ts.map +1 -0
- package/dist/latent-comms.js +139 -0
- package/dist/latent-comms.js.map +1 -0
- package/dist/memory/pageindex/chunker.d.ts +33 -0
- package/dist/memory/pageindex/chunker.d.ts.map +1 -0
- package/dist/memory/pageindex/chunker.js +112 -0
- package/dist/memory/pageindex/chunker.js.map +1 -0
- package/dist/memory/pageindex/example.d.ts +22 -0
- package/dist/memory/pageindex/example.d.ts.map +1 -0
- package/dist/memory/pageindex/example.js +94 -0
- package/dist/memory/pageindex/example.js.map +1 -0
- package/dist/memory/pageindex/index.d.ts +15 -0
- package/dist/memory/pageindex/index.d.ts.map +1 -0
- package/dist/memory/pageindex/index.js +17 -0
- package/dist/memory/pageindex/index.js.map +1 -0
- package/dist/memory/pageindex/service.d.ts +53 -0
- package/dist/memory/pageindex/service.d.ts.map +1 -0
- package/dist/memory/pageindex/service.js +229 -0
- package/dist/memory/pageindex/service.js.map +1 -0
- package/dist/memory/pageindex/types.d.ts +67 -0
- package/dist/memory/pageindex/types.d.ts.map +1 -0
- package/dist/memory/pageindex/types.js +14 -0
- package/dist/memory/pageindex/types.js.map +1 -0
- package/dist/memory/persist.d.ts.map +1 -1
- package/dist/memory/persist.js +6 -2
- package/dist/memory/persist.js.map +1 -1
- package/dist/memory/sqlite.d.ts +69 -2
- package/dist/memory/sqlite.d.ts.map +1 -1
- package/dist/memory/sqlite.js +312 -5
- package/dist/memory/sqlite.js.map +1 -1
- package/dist/memory/taxonomy.d.ts +34 -0
- package/dist/memory/taxonomy.d.ts.map +1 -0
- package/dist/memory/taxonomy.js +189 -0
- package/dist/memory/taxonomy.js.map +1 -0
- package/dist/memory/versioning.d.ts.map +1 -1
- package/dist/memory/versioning.js.map +1 -1
- package/dist/negative.d.ts +23 -0
- package/dist/negative.d.ts.map +1 -0
- package/dist/negative.js +40 -0
- package/dist/negative.js.map +1 -0
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +455 -46
- package/dist/pipeline.js.map +1 -1
- package/dist/prompt-intel.d.ts +39 -0
- package/dist/prompt-intel.d.ts.map +1 -0
- package/dist/prompt-intel.js +148 -0
- package/dist/prompt-intel.js.map +1 -0
- package/dist/providers/cli-bridge.d.ts +4 -0
- package/dist/providers/cli-bridge.d.ts.map +1 -1
- package/dist/providers/cli-bridge.js +4 -0
- package/dist/providers/cli-bridge.js.map +1 -1
- package/dist/providers/generate-fn.d.ts +3 -15
- package/dist/providers/generate-fn.d.ts.map +1 -1
- package/dist/providers/generate-fn.js +3 -30
- package/dist/providers/generate-fn.js.map +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/ollama.d.ts +15 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +30 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/ranking/index.d.ts +9 -0
- package/dist/ranking/index.d.ts.map +1 -0
- package/dist/ranking/index.js +82 -0
- package/dist/ranking/index.js.map +1 -0
- package/dist/recursive/circuit-breaker.d.ts +36 -0
- package/dist/recursive/circuit-breaker.d.ts.map +1 -0
- package/dist/recursive/circuit-breaker.js +62 -0
- package/dist/recursive/circuit-breaker.js.map +1 -0
- package/dist/recursive/index.d.ts +4 -0
- package/dist/recursive/index.d.ts.map +1 -1
- package/dist/recursive/index.js +18 -1
- package/dist/recursive/index.js.map +1 -1
- package/dist/recursive/types.d.ts +2 -0
- package/dist/recursive/types.d.ts.map +1 -1
- package/dist/recursive/types.js +1 -0
- package/dist/recursive/types.js.map +1 -1
- package/dist/scope/diff-mapper.js.map +1 -1
- package/dist/scope/entity-diff.d.ts +58 -0
- package/dist/scope/entity-diff.d.ts.map +1 -0
- package/dist/scope/entity-diff.js +224 -0
- package/dist/scope/entity-diff.js.map +1 -0
- package/dist/scope/extractor.d.ts.map +1 -1
- package/dist/scope/extractor.js.map +1 -1
- package/dist/scope/index.d.ts +3 -1
- package/dist/scope/index.d.ts.map +1 -1
- package/dist/scope/index.js +3 -0
- package/dist/scope/index.js.map +1 -1
- package/dist/scope/parser.d.ts +1 -1
- package/dist/scope/parser.d.ts.map +1 -1
- package/dist/scope/parser.js.map +1 -1
- package/dist/scope/types.d.ts +32 -0
- package/dist/scope/types.d.ts.map +1 -1
- package/dist/scope/types.js +7 -1
- package/dist/scope/types.js.map +1 -1
- package/dist/search/index.d.ts +11 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +10 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/indexer.d.ts +67 -0
- package/dist/search/indexer.d.ts.map +1 -0
- package/dist/search/indexer.js +196 -0
- package/dist/search/indexer.js.map +1 -0
- package/dist/search/searcher.d.ts +34 -0
- package/dist/search/searcher.d.ts.map +1 -0
- package/dist/search/searcher.js +101 -0
- package/dist/search/searcher.js.map +1 -0
- package/dist/search/types.d.ts +81 -0
- package/dist/search/types.d.ts.map +1 -0
- package/dist/search/types.js +8 -0
- package/dist/search/types.js.map +1 -0
- package/dist/self-improve/index.d.ts +53 -0
- package/dist/self-improve/index.d.ts.map +1 -0
- package/dist/self-improve/index.js +136 -0
- package/dist/self-improve/index.js.map +1 -0
- package/dist/semantic-diff/index.d.ts +31 -0
- package/dist/semantic-diff/index.d.ts.map +1 -0
- package/dist/semantic-diff/index.js +215 -0
- package/dist/semantic-diff/index.js.map +1 -0
- package/dist/testing/index.d.ts +67 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +76 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/vitest-helpers.d.ts +26 -0
- package/dist/testing/vitest-helpers.d.ts.map +1 -0
- package/dist/testing/vitest-helpers.js +37 -0
- package/dist/testing/vitest-helpers.js.map +1 -0
- package/dist/tools/index.d.ts +3 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/remote-query.d.ts +40 -0
- package/dist/tools/remote-query.d.ts.map +1 -0
- package/dist/tools/remote-query.js +71 -0
- package/dist/tools/remote-query.js.map +1 -0
- package/dist/tracing/index.d.ts +39 -0
- package/dist/tracing/index.d.ts.map +1 -0
- package/dist/tracing/index.js +70 -0
- package/dist/tracing/index.js.map +1 -0
- package/dist/trajectory.d.ts +65 -0
- package/dist/trajectory.d.ts.map +1 -0
- package/dist/trajectory.js +126 -0
- package/dist/trajectory.js.map +1 -0
- package/dist/trust/index.d.ts +34 -0
- package/dist/trust/index.d.ts.map +1 -0
- package/dist/trust/index.js +78 -0
- package/dist/trust/index.js.map +1 -0
- package/dist/types.d.ts +144 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -11
- package/dist/types.js.map +1 -1
- package/package.json +1 -3
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ollama provider — calls a local Ollama instance via OpenAI-compatible API.
|
|
3
|
+
*
|
|
4
|
+
* Uses @ai-sdk/openai pointed at http://localhost:11434/v1.
|
|
5
|
+
* No API key required — Ollama accepts 'ollama' as a dummy key.
|
|
6
|
+
*/
|
|
7
|
+
import { createOpenAI } from '@ai-sdk/openai';
|
|
8
|
+
import { generateText } from 'ai';
|
|
9
|
+
/** Default Ollama local inference endpoint (OpenAI-compatible) */
|
|
10
|
+
const DEFAULT_OLLAMA_BASE_URL = 'http://localhost:11434/v1';
|
|
11
|
+
/**
|
|
12
|
+
* Create a GenerateTextFn that calls a local Ollama instance.
|
|
13
|
+
*
|
|
14
|
+
* @param model - Ollama model tag (e.g., 'llama3', 'qwen2.5-coder:7b')
|
|
15
|
+
* @param baseURL - Ollama endpoint. Defaults to 'http://localhost:11434/v1'.
|
|
16
|
+
*/
|
|
17
|
+
export function createOllamaGenerateFn(model, baseURL = DEFAULT_OLLAMA_BASE_URL) {
|
|
18
|
+
const ollama = createOpenAI({ baseURL, apiKey: 'ollama' });
|
|
19
|
+
const ollamaModel = ollama(model);
|
|
20
|
+
return async (system, prompt) => {
|
|
21
|
+
const result = await generateText({ model: ollamaModel, system, prompt });
|
|
22
|
+
return {
|
|
23
|
+
text: result.text,
|
|
24
|
+
tokensUsed: (result.usage?.inputTokens ?? 0) + (result.usage?.outputTokens ?? 0),
|
|
25
|
+
provider: 'ollama',
|
|
26
|
+
model,
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAGlC,kEAAkE;AAClE,MAAM,uBAAuB,GAAG,2BAA2B,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAa,EACb,OAAO,GAAG,uBAAuB;IAEjC,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAElC,OAAO,KAAK,EAAE,MAAc,EAAE,MAAc,EAAE,EAAE;QAC9C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1E,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,UAAU,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC,CAAC;YAChF,QAAQ,EAAE,QAAQ;YAClB,KAAK;SACN,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { EmbeddingProvider } from '../embed.js';
|
|
2
|
+
import type { ReviewFinding } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Rerank findings using embedding similarity to HIGH_PRIORITY_REF.
|
|
5
|
+
* Combined score = severity_weight × (cosine_similarity + context_boost)
|
|
6
|
+
* Falls back to original order if embeddingProvider is not available.
|
|
7
|
+
*/
|
|
8
|
+
export declare function rankFindings(findings: ReviewFinding[], embeddingProvider: EmbeddingProvider | null | undefined): Promise<ReviewFinding[]>;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ranking/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAyDjD;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,aAAa,EAAE,EACzB,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,GACtD,OAAO,CAAC,aAAa,EAAE,CAAC,CA4B1B"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { cosineSimilarity } from '../embed.js';
|
|
2
|
+
// Reference text that represents "high priority review concern"
|
|
3
|
+
// This is a fixed reference — we embed it once and compare all findings to it
|
|
4
|
+
const HIGH_PRIORITY_REF = 'critical security vulnerability authentication bypass memory corruption data exposure injection attack';
|
|
5
|
+
// File paths that get a context boost (auth, security, payment critical paths)
|
|
6
|
+
const HIGH_PRIORITY_PATTERNS = [
|
|
7
|
+
/auth/i,
|
|
8
|
+
/security/i,
|
|
9
|
+
/payment/i,
|
|
10
|
+
/credential/i,
|
|
11
|
+
/token/i,
|
|
12
|
+
/secret/i,
|
|
13
|
+
/password/i,
|
|
14
|
+
/crypto/i,
|
|
15
|
+
/encrypt/i,
|
|
16
|
+
/session/i,
|
|
17
|
+
];
|
|
18
|
+
const CONTEXT_BOOST = 0.2;
|
|
19
|
+
/**
|
|
20
|
+
* Severity numeric weight (higher = more important).
|
|
21
|
+
*/
|
|
22
|
+
function severityWeight(severity) {
|
|
23
|
+
switch (severity?.toLowerCase()) {
|
|
24
|
+
case 'critical':
|
|
25
|
+
return 4;
|
|
26
|
+
case 'high':
|
|
27
|
+
return 3;
|
|
28
|
+
case 'medium':
|
|
29
|
+
return 2;
|
|
30
|
+
case 'low':
|
|
31
|
+
return 1;
|
|
32
|
+
default:
|
|
33
|
+
return 1;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if a file path matches any high-priority pattern.
|
|
38
|
+
*/
|
|
39
|
+
function hasContextBoost(filePath) {
|
|
40
|
+
if (!filePath)
|
|
41
|
+
return false;
|
|
42
|
+
return HIGH_PRIORITY_PATTERNS.some((p) => p.test(filePath));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Build a text representation of a finding for embedding.
|
|
46
|
+
* ReviewFinding uses `message` as the primary text field (no `title` or `description`).
|
|
47
|
+
*/
|
|
48
|
+
function findingToText(f) {
|
|
49
|
+
return [f.message ?? '', f.category ?? '', f.file ?? ''].filter(Boolean).join(' ');
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Rerank findings using embedding similarity to HIGH_PRIORITY_REF.
|
|
53
|
+
* Combined score = severity_weight × (cosine_similarity + context_boost)
|
|
54
|
+
* Falls back to original order if embeddingProvider is not available.
|
|
55
|
+
*/
|
|
56
|
+
export async function rankFindings(findings, embeddingProvider) {
|
|
57
|
+
if (!embeddingProvider || findings.length <= 1) {
|
|
58
|
+
return findings;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
// Embed all findings + reference in one batch
|
|
62
|
+
const texts = [HIGH_PRIORITY_REF, ...findings.map(findingToText)];
|
|
63
|
+
const embeddings = await embeddingProvider.embedBatch(texts);
|
|
64
|
+
const refEmbedding = embeddings[0];
|
|
65
|
+
const findingEmbeddings = embeddings.slice(1);
|
|
66
|
+
const scored = findings.map((finding, i) => {
|
|
67
|
+
const embedding = findingEmbeddings[i];
|
|
68
|
+
const similarity = cosineSimilarity(refEmbedding, embedding);
|
|
69
|
+
const boost = hasContextBoost(finding.file) ? CONTEXT_BOOST : 0;
|
|
70
|
+
const relevance = Math.min(1, similarity + boost);
|
|
71
|
+
const combined = severityWeight(finding.severity) * relevance;
|
|
72
|
+
return { finding, combined };
|
|
73
|
+
});
|
|
74
|
+
scored.sort((a, b) => b.combined - a.combined);
|
|
75
|
+
return scored.map((s) => s.finding);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Non-fatal — return original order on any error
|
|
79
|
+
return findings;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ranking/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,gEAAgE;AAChE,8EAA8E;AAC9E,MAAM,iBAAiB,GACrB,wGAAwG,CAAC;AAE3G,+EAA+E;AAC/E,MAAM,sBAAsB,GAAG;IAC7B,OAAO;IACP,WAAW;IACX,UAAU;IACV,aAAa;IACb,QAAQ;IACR,SAAS;IACT,WAAW;IACX,SAAS;IACT,UAAU;IACV,UAAU;CACX,CAAC;AAEF,MAAM,aAAa,GAAG,GAAG,CAAC;AAE1B;;GAEG;AACH,SAAS,cAAc,CAAC,QAAiB;IACvC,QAAQ,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC;QAChC,KAAK,UAAU;YACb,OAAO,CAAC,CAAC;QACX,KAAK,MAAM;YACT,OAAO,CAAC,CAAC;QACX,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC;QACX,KAAK,KAAK;YACR,OAAO,CAAC,CAAC;QACX;YACE,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,QAAiB;IACxC,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,CAAgB;IACrC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrF,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAyB,EACzB,iBAAuD;IAEvD,IAAI,CAAC,iBAAiB,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC/C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,8CAA8C;QAC9C,MAAM,KAAK,GAAG,CAAC,iBAAiB,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAE7D,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;QACpC,MAAM,iBAAiB,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAE9C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;YACzC,MAAM,SAAS,GAAG,iBAAiB,CAAC,CAAC,CAAE,CAAC;YACxC,MAAM,UAAU,GAAG,gBAAgB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;YAC7D,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YAChE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;YAC9D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;QACjD,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit Breaker — Loop Detection for Recursive Review
|
|
3
|
+
*
|
|
4
|
+
* Detects when the same findings are appearing across iterations
|
|
5
|
+
* by fingerprinting finding sets and tracking consecutive matches.
|
|
6
|
+
*/
|
|
7
|
+
import type { ReviewFinding } from '../types.js';
|
|
8
|
+
export interface CircuitBreakerState {
|
|
9
|
+
previousFingerprints: string[];
|
|
10
|
+
consecutiveSimilarCount: number;
|
|
11
|
+
threshold: number;
|
|
12
|
+
}
|
|
13
|
+
export interface CircuitBreakerResult {
|
|
14
|
+
shouldBreak: boolean;
|
|
15
|
+
reason?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Compute a deterministic fingerprint for a set of findings.
|
|
19
|
+
* Sorts by (file, line, category) before hashing to be order-independent.
|
|
20
|
+
*/
|
|
21
|
+
export declare function fingerprintFindings(findings: ReviewFinding[]): string;
|
|
22
|
+
/**
|
|
23
|
+
* Check if the current findings trigger the circuit breaker.
|
|
24
|
+
* Returns shouldBreak=true if the same fingerprint has appeared
|
|
25
|
+
* `threshold` times consecutively.
|
|
26
|
+
*/
|
|
27
|
+
export declare function checkCircuitBreaker(findings: ReviewFinding[], state: CircuitBreakerState): CircuitBreakerResult;
|
|
28
|
+
/**
|
|
29
|
+
* Update circuit breaker state after an iteration.
|
|
30
|
+
*/
|
|
31
|
+
export declare function updateCircuitBreakerState(findings: ReviewFinding[], state: CircuitBreakerState): CircuitBreakerState;
|
|
32
|
+
/**
|
|
33
|
+
* Create initial circuit breaker state.
|
|
34
|
+
*/
|
|
35
|
+
export declare function createCircuitBreakerState(threshold?: number): CircuitBreakerState;
|
|
36
|
+
//# sourceMappingURL=circuit-breaker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../src/recursive/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,MAAM,WAAW,mBAAmB;IAClC,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,uBAAuB,EAAE,MAAM,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,MAAM,CAMrE;AAID;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,aAAa,EAAE,EACzB,KAAK,EAAE,mBAAmB,GACzB,oBAAoB,CAetB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,aAAa,EAAE,EACzB,KAAK,EAAE,mBAAmB,GACzB,mBAAmB,CAUrB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,SAAI,GAAG,mBAAmB,CAM5E"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit Breaker — Loop Detection for Recursive Review
|
|
3
|
+
*
|
|
4
|
+
* Detects when the same findings are appearing across iterations
|
|
5
|
+
* by fingerprinting finding sets and tracking consecutive matches.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from 'node:crypto';
|
|
8
|
+
// ─── Fingerprinting ────────────────────────────────────────────
|
|
9
|
+
/**
|
|
10
|
+
* Compute a deterministic fingerprint for a set of findings.
|
|
11
|
+
* Sorts by (file, line, category) before hashing to be order-independent.
|
|
12
|
+
*/
|
|
13
|
+
export function fingerprintFindings(findings) {
|
|
14
|
+
const keys = findings
|
|
15
|
+
.map((f) => `${f.file ?? ''}:${f.line ?? 0}:${f.category ?? ''}`)
|
|
16
|
+
.sort()
|
|
17
|
+
.join('|');
|
|
18
|
+
return createHash('sha256').update(keys).digest('hex').slice(0, 16);
|
|
19
|
+
}
|
|
20
|
+
// ─── Circuit Breaker Logic ─────────────────────────────────────
|
|
21
|
+
/**
|
|
22
|
+
* Check if the current findings trigger the circuit breaker.
|
|
23
|
+
* Returns shouldBreak=true if the same fingerprint has appeared
|
|
24
|
+
* `threshold` times consecutively.
|
|
25
|
+
*/
|
|
26
|
+
export function checkCircuitBreaker(findings, state) {
|
|
27
|
+
const fingerprint = fingerprintFindings(findings);
|
|
28
|
+
const lastFingerprint = state.previousFingerprints[state.previousFingerprints.length - 1];
|
|
29
|
+
if (fingerprint === lastFingerprint) {
|
|
30
|
+
const newCount = state.consecutiveSimilarCount + 1;
|
|
31
|
+
if (newCount >= state.threshold) {
|
|
32
|
+
return {
|
|
33
|
+
shouldBreak: true,
|
|
34
|
+
reason: `circuit-break: identical findings (fingerprint ${fingerprint}) in ${newCount} consecutive iterations`,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return { shouldBreak: false };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Update circuit breaker state after an iteration.
|
|
42
|
+
*/
|
|
43
|
+
export function updateCircuitBreakerState(findings, state) {
|
|
44
|
+
const fingerprint = fingerprintFindings(findings);
|
|
45
|
+
const lastFingerprint = state.previousFingerprints[state.previousFingerprints.length - 1];
|
|
46
|
+
return {
|
|
47
|
+
previousFingerprints: [...state.previousFingerprints, fingerprint],
|
|
48
|
+
consecutiveSimilarCount: fingerprint === lastFingerprint ? state.consecutiveSimilarCount + 1 : 0,
|
|
49
|
+
threshold: state.threshold,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Create initial circuit breaker state.
|
|
54
|
+
*/
|
|
55
|
+
export function createCircuitBreakerState(threshold = 2) {
|
|
56
|
+
return {
|
|
57
|
+
previousFingerprints: [],
|
|
58
|
+
consecutiveSimilarCount: 0,
|
|
59
|
+
threshold,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=circuit-breaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../src/recursive/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAgBzC,kEAAkE;AAElE;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAyB;IAC3D,MAAM,IAAI,GAAG,QAAQ;SAClB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;SAChE,IAAI,EAAE;SACN,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,kEAAkE;AAElE;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAyB,EACzB,KAA0B;IAE1B,MAAM,WAAW,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,eAAe,GAAG,KAAK,CAAC,oBAAoB,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE1F,IAAI,WAAW,KAAK,eAAe,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,uBAAuB,GAAG,CAAC,CAAC;QACnD,IAAI,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAChC,OAAO;gBACL,WAAW,EAAE,IAAI;gBACjB,MAAM,EAAE,kDAAkD,WAAW,QAAQ,QAAQ,yBAAyB;aAC/G,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,QAAyB,EACzB,KAA0B;IAE1B,MAAM,WAAW,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,eAAe,GAAG,KAAK,CAAC,oBAAoB,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE1F,OAAO;QACL,oBAAoB,EAAE,CAAC,GAAG,KAAK,CAAC,oBAAoB,EAAE,WAAW,CAAC;QAClE,uBAAuB,EACrB,WAAW,KAAK,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,uBAAuB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,SAAS,GAAG,CAAC;IACrD,OAAO;QACL,oBAAoB,EAAE,EAAE;QACxB,uBAAuB,EAAE,CAAC;QAC1B,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -25,6 +25,10 @@ export interface RecursiveReviewInput {
|
|
|
25
25
|
config?: Partial<RecursiveReviewConfig>;
|
|
26
26
|
/** Optional progress callback */
|
|
27
27
|
onProgress?: (message: string) => void;
|
|
28
|
+
/** Feature flags forwarded from ReviewInput.features */
|
|
29
|
+
features?: {
|
|
30
|
+
circuitBreaker?: boolean;
|
|
31
|
+
};
|
|
28
32
|
}
|
|
29
33
|
/**
|
|
30
34
|
* Run the recursive review loop.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/recursive/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/recursive/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQjD,OAAO,KAAK,EACV,qBAAqB,EACrB,qBAAqB,EAGtB,MAAM,YAAY,CAAC;AAKpB,MAAM,WAAW,oBAAoB;IACnC,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAC;IAErB,qEAAqE;IACrE,QAAQ,EAAE,aAAa,EAAE,CAAC;IAE1B,kDAAkD;IAClD,UAAU,EAAE,cAAc,CAAC;IAE3B,uCAAuC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAExC,iCAAiC;IACjC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAEvC,wDAAwD;IACxD,QAAQ,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACzC;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAqGvC;AA4ED,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC9F,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EACV,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/recursive/index.js
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* 4. Check convergence (max 2 iterations or no new issues)
|
|
12
12
|
* 5. Build regression report
|
|
13
13
|
*/
|
|
14
|
+
import { checkCircuitBreaker, createCircuitBreakerState, updateCircuitBreakerState, } from './circuit-breaker.js';
|
|
14
15
|
import { applyVirtualPatches, buildPatchContext, extractPatches } from './patch-extractor.js';
|
|
15
16
|
import { runReReview } from './re-reviewer.js';
|
|
16
17
|
import { DEFAULT_RECURSIVE_CONFIG } from './types.js';
|
|
@@ -41,6 +42,8 @@ export async function recursiveReview(input) {
|
|
|
41
42
|
let currentPatches = patches;
|
|
42
43
|
let totalNewIssues = 0;
|
|
43
44
|
const allRegressions = [];
|
|
45
|
+
const circuitBreakerEnabled = input.features?.circuitBreaker !== false;
|
|
46
|
+
let cbState = createCircuitBreakerState(config.circuitBreakerThreshold ?? 2);
|
|
44
47
|
for (let iteration = 1; iteration <= config.maxIterations; iteration++) {
|
|
45
48
|
emit(`Recursive review: iteration ${iteration}/${config.maxIterations}`);
|
|
46
49
|
// Step 2: Apply patches virtually
|
|
@@ -54,7 +57,21 @@ export async function recursiveReview(input) {
|
|
|
54
57
|
});
|
|
55
58
|
const newFindings = reReviewResult.findings;
|
|
56
59
|
totalNewIssues += newFindings.length;
|
|
57
|
-
// Step
|
|
60
|
+
// Step 4a: Circuit breaker — detect semantic loops before convergence check
|
|
61
|
+
if (circuitBreakerEnabled) {
|
|
62
|
+
const cbResult = checkCircuitBreaker(newFindings, cbState);
|
|
63
|
+
if (cbResult.shouldBreak) {
|
|
64
|
+
emit(`Recursive review: ${cbResult.reason}`);
|
|
65
|
+
return {
|
|
66
|
+
iterations: iteration,
|
|
67
|
+
converged: false,
|
|
68
|
+
regressions: allRegressions,
|
|
69
|
+
totalNewIssues,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
cbState = updateCircuitBreakerState(newFindings, cbState);
|
|
73
|
+
}
|
|
74
|
+
// Step 4b: Check convergence
|
|
58
75
|
if (newFindings.length === 0) {
|
|
59
76
|
emit(`Recursive review: converged after ${iteration} iteration(s) — no new issues`);
|
|
60
77
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/recursive/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAO/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/recursive/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -56,6 +56,8 @@ export interface RecursiveReviewReport {
|
|
|
56
56
|
export interface RecursiveReviewConfig {
|
|
57
57
|
/** Maximum number of re-review iterations. Default: 2 */
|
|
58
58
|
maxIterations: number;
|
|
59
|
+
/** Number of consecutive identical-fingerprint iterations before circuit breaks. Default: 2 */
|
|
60
|
+
circuitBreakerThreshold?: number;
|
|
59
61
|
}
|
|
60
62
|
/** Default configuration values */
|
|
61
63
|
export declare const DEFAULT_RECURSIVE_CONFIG: RecursiveReviewConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/recursive/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IAEb,uEAAuE;IACvE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAEzB,+CAA+C;IAC/C,eAAe,EAAE,MAAM,CAAC;IAExB,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;IAEnB,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC;CACtB;AAID;;;GAGG;AACH,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,yDAAyD;IACzD,YAAY,EAAE,IAAI,CAAC;IAEnB,0DAA0D;IAC1D,qBAAqB,EAAE;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAID;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IAEnB,qEAAqE;IACrE,SAAS,EAAE,OAAO,CAAC;IAEnB,8DAA8D;IAC9D,WAAW,EAAE,iBAAiB,EAAE,CAAC;IAEjC,6DAA6D;IAC7D,cAAc,EAAE,MAAM,CAAC;CACxB;AAID;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,yDAAyD;IACzD,aAAa,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/recursive/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IAEb,uEAAuE;IACvE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAEzB,+CAA+C;IAC/C,eAAe,EAAE,MAAM,CAAC;IAExB,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;IAEnB,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC;CACtB;AAID;;;GAGG;AACH,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,yDAAyD;IACzD,YAAY,EAAE,IAAI,CAAC;IAEnB,0DAA0D;IAC1D,qBAAqB,EAAE;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAID;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IAEnB,qEAAqE;IACrE,SAAS,EAAE,OAAO,CAAC;IAEnB,8DAA8D;IAC9D,WAAW,EAAE,iBAAiB,EAAE,CAAC;IAEjC,6DAA6D;IAC7D,cAAc,EAAE,MAAM,CAAC;CACxB;AAID;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,yDAAyD;IACzD,aAAa,EAAE,MAAM,CAAC;IACtB,+FAA+F;IAC/F,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,mCAAmC;AACnC,eAAO,MAAM,wBAAwB,EAAE,qBAGtC,CAAC"}
|
package/dist/recursive/types.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/recursive/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/recursive/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA8EH,mCAAmC;AACnC,MAAM,CAAC,MAAM,wBAAwB,GAA0B;IAC7D,aAAa,EAAE,CAAC;IAChB,uBAAuB,EAAE,CAAC;CAC3B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff-mapper.js","sourceRoot":"","sources":["../../src/scope/diff-mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,kEAAkE;AAElE;;;;;;;;GAQG;AACH,MAAM,cAAc,GAAG,mDAAmD,CAAC;AAE3E;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,IAAI,CAAC;gBACT,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC;gBACxC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC;gBACxC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;aACrE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,kEAAkE;AAElE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAiB,EAAE,OAAqB;IACvE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE1D,MAAM,QAAQ,GAAqB,EAAE,CAAC;IAEtC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CACxC,aAAa,CACX,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC,EAC9C,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,OAAO,CACf,CACF,CAAC;QAEF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,kEAAkE;AAElE;;;;;GAKG;AACH,SAAS,aAAa,
|
|
1
|
+
{"version":3,"file":"diff-mapper.js","sourceRoot":"","sources":["../../src/scope/diff-mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,kEAAkE;AAElE;;;;;;;;GAQG;AACH,MAAM,cAAc,GAAG,mDAAmD,CAAC;AAE3E;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,IAAI,CAAC;gBACT,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC;gBACxC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC;gBACxC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;aACrE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,kEAAkE;AAElE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAiB,EAAE,OAAqB;IACvE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE1D,MAAM,QAAQ,GAAqB,EAAE,CAAC;IAEtC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CACxC,aAAa,CACX,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC,EAC9C,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,OAAO,CACf,CACF,CAAC;QAEF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,kEAAkE;AAElE;;;;;GAKG;AACH,SAAS,aAAa,CAAC,MAAc,EAAE,IAAY,EAAE,MAAc,EAAE,IAAY;IAC/E,OAAO,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entity-Level Semantic Diff
|
|
3
|
+
*
|
|
4
|
+
* Classifies affected symbols into cosmetic (whitespace/comments/formatting),
|
|
5
|
+
* logic (actual behavior change), or renamed (name changed, body equivalent).
|
|
6
|
+
*
|
|
7
|
+
* Operates as a post-processing step on top of diff-mapper output.
|
|
8
|
+
* Uses regex heuristics — no AST required for v1.
|
|
9
|
+
*
|
|
10
|
+
* Pure functions with no side effects.
|
|
11
|
+
*/
|
|
12
|
+
import type { AffectedSymbol, EntityChange, EntityDiffOptions, RenameMatch, SymbolInfo } from './types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Extract the actual addition/deletion lines from a diff that fall
|
|
15
|
+
* within a symbol's line range (new-side lines for +, old-side for -).
|
|
16
|
+
*
|
|
17
|
+
* Walks the diff content, tracking the current new-side line number
|
|
18
|
+
* via hunk headers and line prefixes, and collects lines that overlap
|
|
19
|
+
* with the symbol's [startLine, endLine] range.
|
|
20
|
+
*
|
|
21
|
+
* @param diffContent - Raw unified diff content for a single file
|
|
22
|
+
* @param symbol - The symbol whose range to extract lines for
|
|
23
|
+
* @returns Array of raw diff lines (with +/- prefix) within the symbol range
|
|
24
|
+
*/
|
|
25
|
+
export declare function extractEntityDiffLines(diffContent: string, symbol: SymbolInfo): string[];
|
|
26
|
+
/**
|
|
27
|
+
* Classify affected symbols into cosmetic or logic changes based on
|
|
28
|
+
* their diff lines.
|
|
29
|
+
*
|
|
30
|
+
* A change is `cosmetic` if ALL diff lines within the entity are cosmetic
|
|
31
|
+
* (whitespace, comments, formatting). Otherwise it's `logic`.
|
|
32
|
+
*
|
|
33
|
+
* @param affectedSymbols - Symbols affected by the diff (from mapDiffToSymbols)
|
|
34
|
+
* @param diffContent - Raw unified diff content for the file
|
|
35
|
+
* @returns Array of EntityChange with classification
|
|
36
|
+
*/
|
|
37
|
+
export declare function classifyEntityChanges(affectedSymbols: AffectedSymbol[], diffContent: string): EntityChange[];
|
|
38
|
+
/**
|
|
39
|
+
* Detect renamed entities by matching removed symbols with added symbols
|
|
40
|
+
* that have similar bodies.
|
|
41
|
+
*
|
|
42
|
+
* @param removedSymbols - Symbols present in old version but not in new
|
|
43
|
+
* @param addedSymbols - Symbols present in new version but not in old
|
|
44
|
+
* @param oldSource - Full source of the old file version
|
|
45
|
+
* @param newSource - Full source of the new file version
|
|
46
|
+
* @param options - Configuration options
|
|
47
|
+
* @returns Array of rename matches
|
|
48
|
+
*/
|
|
49
|
+
export declare function detectRenames(removedSymbols: SymbolInfo[], addedSymbols: SymbolInfo[], oldSource: string, newSource: string, options?: EntityDiffOptions): RenameMatch[];
|
|
50
|
+
/**
|
|
51
|
+
* Filter entity changes to only those with logic changes.
|
|
52
|
+
* Cosmetic and renamed entities are excluded.
|
|
53
|
+
*
|
|
54
|
+
* @param changes - Classified entity changes
|
|
55
|
+
* @returns Only entities with `logic` classification
|
|
56
|
+
*/
|
|
57
|
+
export declare function filterLogicChanges(changes: EntityChange[]): EntityChange[];
|
|
58
|
+
//# sourceMappingURL=entity-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-diff.d.ts","sourceRoot":"","sources":["../../src/scope/entity-diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,UAAU,EACX,MAAM,YAAY,CAAC;AAuBpB;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CAyCxF;AAcD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,cAAc,EAAE,EACjC,WAAW,EAAE,MAAM,GAClB,YAAY,EAAE,CAqBhB;AA6CD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,cAAc,EAAE,UAAU,EAAE,EAC5B,YAAY,EAAE,UAAU,EAAE,EAC1B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,WAAW,EAAE,CAiDf;AAID;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAE1E"}
|