ghagga-core 2.8.1 → 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,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adversarial QA loop — a critic agent finds issues, a fixer agent
|
|
3
|
+
* resolves them, they iterate until the review score exceeds a
|
|
4
|
+
* threshold or max rounds are reached.
|
|
5
|
+
*
|
|
6
|
+
* The critic produces a quality score (0-100) and a list of issues.
|
|
7
|
+
* The fixer attempts to resolve each issue. The loop continues until
|
|
8
|
+
* the critic is satisfied or the round limit is hit.
|
|
9
|
+
*/
|
|
10
|
+
// ── Defaults ──
|
|
11
|
+
export const DEFAULT_QA_CONFIG = {
|
|
12
|
+
maxRounds: 3,
|
|
13
|
+
passThreshold: 80,
|
|
14
|
+
stopOnNoProgress: true,
|
|
15
|
+
};
|
|
16
|
+
// ── Loop ──
|
|
17
|
+
export async function runQALoop(initialContent, critic, fixer, config = DEFAULT_QA_CONFIG) {
|
|
18
|
+
const rounds = [];
|
|
19
|
+
let content = initialContent;
|
|
20
|
+
let totalFound = 0;
|
|
21
|
+
let totalResolved = 0;
|
|
22
|
+
for (let round = 1; round <= config.maxRounds; round++) {
|
|
23
|
+
// Critic pass
|
|
24
|
+
const previousIssues = rounds.length > 0 ? rounds[rounds.length - 1]?.criticResult.issues : undefined;
|
|
25
|
+
const criticResult = await critic(content, previousIssues);
|
|
26
|
+
totalFound += criticResult.issues.length;
|
|
27
|
+
// Check if we pass
|
|
28
|
+
if (criticResult.score >= config.passThreshold) {
|
|
29
|
+
rounds.push({ round, criticResult, fixerResult: null });
|
|
30
|
+
return {
|
|
31
|
+
rounds,
|
|
32
|
+
finalScore: criticResult.score,
|
|
33
|
+
passed: true,
|
|
34
|
+
totalIssuesFound: totalFound,
|
|
35
|
+
totalIssuesResolved: totalResolved,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// Last round — no more fixing
|
|
39
|
+
if (round === config.maxRounds) {
|
|
40
|
+
rounds.push({ round, criticResult, fixerResult: null });
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
// Fixer pass
|
|
44
|
+
const unresolvedIssues = criticResult.issues.filter((i) => !i.resolved);
|
|
45
|
+
const { content: fixedContent, result: fixerResult } = await fixer(content, unresolvedIssues);
|
|
46
|
+
content = fixedContent;
|
|
47
|
+
totalResolved += fixerResult.issuesResolved;
|
|
48
|
+
rounds.push({ round, criticResult, fixerResult });
|
|
49
|
+
// Stop if no progress
|
|
50
|
+
if (config.stopOnNoProgress && fixerResult.issuesResolved === 0) {
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const finalScore = rounds[rounds.length - 1]?.criticResult.score ?? 0;
|
|
55
|
+
return {
|
|
56
|
+
rounds,
|
|
57
|
+
finalScore,
|
|
58
|
+
passed: finalScore >= config.passThreshold,
|
|
59
|
+
totalIssuesFound: totalFound,
|
|
60
|
+
totalIssuesResolved: totalResolved,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// ── Formatting ──
|
|
64
|
+
export function formatQAResult(result) {
|
|
65
|
+
const lines = [];
|
|
66
|
+
const status = result.passed ? '✅ PASSED' : '❌ FAILED';
|
|
67
|
+
lines.push(`## Adversarial QA: ${status} (score: ${result.finalScore}/100)\n`);
|
|
68
|
+
lines.push(`**Rounds**: ${result.rounds.length} | **Issues found**: ${result.totalIssuesFound} | **Resolved**: ${result.totalIssuesResolved}\n`);
|
|
69
|
+
for (const round of result.rounds) {
|
|
70
|
+
lines.push(`### Round ${round.round}`);
|
|
71
|
+
lines.push(`Critic score: ${round.criticResult.score}/100 — ${round.criticResult.summary}`);
|
|
72
|
+
if (round.criticResult.issues.length > 0) {
|
|
73
|
+
for (const issue of round.criticResult.issues) {
|
|
74
|
+
const icon = issue.resolved ? '✓' : '✗';
|
|
75
|
+
lines.push(` ${icon} [${issue.severity}] ${issue.description}${issue.file ? ` (${issue.file}${issue.line ? `:${issue.line}` : ''})` : ''}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (round.fixerResult) {
|
|
79
|
+
lines.push(`Fixer: ${round.fixerResult.issuesResolved}/${round.fixerResult.issuesAttempted} resolved`);
|
|
80
|
+
}
|
|
81
|
+
lines.push('');
|
|
82
|
+
}
|
|
83
|
+
return lines.join('\n');
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=adversarial-qa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adversarial-qa.js","sourceRoot":"","sources":["../src/adversarial-qa.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA8CH,iBAAiB;AAEjB,MAAM,CAAC,MAAM,iBAAiB,GAAiB;IAC7C,SAAS,EAAE,CAAC;IACZ,aAAa,EAAE,EAAE;IACjB,gBAAgB,EAAE,IAAI;CACvB,CAAC;AAcF,aAAa;AAEb,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,cAAsB,EACtB,MAAgB,EAChB,KAAc,EACd,SAAuB,iBAAiB;IAExC,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,IAAI,OAAO,GAAG,cAAc,CAAC;IAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC;QACvD,cAAc;QACd,MAAM,cAAc,GAClB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACjF,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC3D,UAAU,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC;QAEzC,mBAAmB;QACnB,IAAI,YAAY,CAAC,KAAK,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,OAAO;gBACL,MAAM;gBACN,UAAU,EAAE,YAAY,CAAC,KAAK;gBAC9B,MAAM,EAAE,IAAI;gBACZ,gBAAgB,EAAE,UAAU;gBAC5B,mBAAmB,EAAE,aAAa;aACnC,CAAC;QACJ,CAAC;QAED,8BAA8B;QAC9B,IAAI,KAAK,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM;QACR,CAAC;QAED,aAAa;QACb,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACxE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QAC9F,OAAO,GAAG,YAAY,CAAC;QACvB,aAAa,IAAI,WAAW,CAAC,cAAc,CAAC;QAE5C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;QAElD,sBAAsB;QACtB,IAAI,MAAM,CAAC,gBAAgB,IAAI,WAAW,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;YAChE,MAAM;QACR,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,KAAK,IAAI,CAAC,CAAC;IAEtE,OAAO;QACL,MAAM;QACN,UAAU;QACV,MAAM,EAAE,UAAU,IAAI,MAAM,CAAC,aAAa;QAC1C,gBAAgB,EAAE,UAAU;QAC5B,mBAAmB,EAAE,aAAa;KACnC,CAAC;AACJ,CAAC;AAED,mBAAmB;AAEnB,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;IACvD,KAAK,CAAC,IAAI,CAAC,sBAAsB,MAAM,YAAY,MAAM,CAAC,UAAU,SAAS,CAAC,CAAC;IAC/E,KAAK,CAAC,IAAI,CACR,eAAe,MAAM,CAAC,MAAM,CAAC,MAAM,wBAAwB,MAAM,CAAC,gBAAgB,oBAAoB,MAAM,CAAC,mBAAmB,IAAI,CACrI,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,YAAY,CAAC,KAAK,UAAU,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;QAE5F,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBACxC,KAAK,CAAC,IAAI,CACR,KAAK,IAAI,KAAK,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACjI,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CACR,UAAU,KAAK,CAAC,WAAW,CAAC,cAAc,IAAI,KAAK,CAAC,WAAW,CAAC,eAAe,WAAW,CAC3F,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit agent.
|
|
3
|
+
*
|
|
4
|
+
* Runs a single LLM call over pre-collected static analysis findings
|
|
5
|
+
* to produce an executive security and code-quality report.
|
|
6
|
+
*/
|
|
7
|
+
import type { AuditInput, AuditResult } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Run a full-project audit using static analysis findings as input.
|
|
10
|
+
*
|
|
11
|
+
* Sends the pre-formatted staticContext to the LLM auditor and returns
|
|
12
|
+
* a structured AuditResult with an executive report.
|
|
13
|
+
*
|
|
14
|
+
* @param input - Audit input with repo path, static context, and provider config
|
|
15
|
+
* @returns Parsed AuditResult
|
|
16
|
+
*/
|
|
17
|
+
export declare function runAuditReport(input: AuditInput): Promise<AuditResult>;
|
|
18
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/agents/audit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAwB,MAAM,aAAa,CAAC;AAgBjF;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CA4D5E"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit agent.
|
|
3
|
+
*
|
|
4
|
+
* Runs a single LLM call over pre-collected static analysis findings
|
|
5
|
+
* to produce an executive security and code-quality report.
|
|
6
|
+
*/
|
|
7
|
+
import { AUDIT_SYSTEM } from './prompts.js';
|
|
8
|
+
// ─── Helpers ────────────────────────────────────────────────────
|
|
9
|
+
/**
|
|
10
|
+
* Build an empty StaticAnalysisResult for use when none is available.
|
|
11
|
+
* Mirrors the skipped-tool pattern used throughout the codebase.
|
|
12
|
+
*/
|
|
13
|
+
function emptyStaticAnalysis() {
|
|
14
|
+
const skipped = { status: 'skipped', findings: [], executionTimeMs: 0 };
|
|
15
|
+
return { semgrep: skipped, trivy: skipped, cpd: skipped };
|
|
16
|
+
}
|
|
17
|
+
// ─── Main Function ──────────────────────────────────────────────
|
|
18
|
+
/**
|
|
19
|
+
* Run a full-project audit using static analysis findings as input.
|
|
20
|
+
*
|
|
21
|
+
* Sends the pre-formatted staticContext to the LLM auditor and returns
|
|
22
|
+
* a structured AuditResult with an executive report.
|
|
23
|
+
*
|
|
24
|
+
* @param input - Audit input with repo path, static context, and provider config
|
|
25
|
+
* @returns Parsed AuditResult
|
|
26
|
+
*/
|
|
27
|
+
export async function runAuditReport(input) {
|
|
28
|
+
const { staticContext, provider, model, apiKey } = input;
|
|
29
|
+
const emit = input.onProgress ?? (() => { });
|
|
30
|
+
const timestamp = new Date().toISOString();
|
|
31
|
+
// Short-circuit: nothing to audit
|
|
32
|
+
if (!staticContext || staticContext.trim().length === 0) {
|
|
33
|
+
return {
|
|
34
|
+
status: 'no-findings',
|
|
35
|
+
report: 'No static analysis findings to report.',
|
|
36
|
+
findings: emptyStaticAnalysis(),
|
|
37
|
+
timestamp,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// Resolve the generation function (required — must be injected by caller)
|
|
41
|
+
if (!input.generateFn) {
|
|
42
|
+
throw new Error('runAuditReport requires generateFn to be provided in AuditInput. ' +
|
|
43
|
+
'The caller must resolve the backend and pass a GenerateTextFn instance.');
|
|
44
|
+
}
|
|
45
|
+
const generateFn = input.generateFn;
|
|
46
|
+
emit({
|
|
47
|
+
step: 'audit-call',
|
|
48
|
+
message: `Calling ${provider}/${model} for audit report...`,
|
|
49
|
+
});
|
|
50
|
+
try {
|
|
51
|
+
const result = await generateFn(AUDIT_SYSTEM, staticContext);
|
|
52
|
+
emit({
|
|
53
|
+
step: 'audit-done',
|
|
54
|
+
message: `Audit complete — ${result.tokensUsed} tokens`,
|
|
55
|
+
});
|
|
56
|
+
return {
|
|
57
|
+
status: 'completed',
|
|
58
|
+
report: result.text,
|
|
59
|
+
findings: emptyStaticAnalysis(),
|
|
60
|
+
timestamp,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
65
|
+
emit({
|
|
66
|
+
step: 'audit-done',
|
|
67
|
+
message: `Audit LLM call failed: ${message}`,
|
|
68
|
+
});
|
|
69
|
+
return {
|
|
70
|
+
status: 'error',
|
|
71
|
+
report: '',
|
|
72
|
+
findings: emptyStaticAnalysis(),
|
|
73
|
+
timestamp,
|
|
74
|
+
error: message,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/agents/audit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,mEAAmE;AAEnE;;;GAGG;AACH,SAAS,mBAAmB;IAC1B,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,SAAkB,EAAE,QAAQ,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC;IACjF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAC5D,CAAC;AAED,mEAAmE;AAEnE;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAiB;IACpD,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACzD,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAE5C,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE3C,kCAAkC;IAClC,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,wCAAwC;YAChD,QAAQ,EAAE,mBAAmB,EAAE;YAC/B,SAAS;SACV,CAAC;IACJ,CAAC;IAED,0EAA0E;IAC1E,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,mEAAmE;YACjE,yEAAyE,CAC5E,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAmB,KAAK,CAAC,UAAU,CAAC;IAEpD,IAAI,CAAC;QACH,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,WAAW,QAAQ,IAAI,KAAK,sBAAsB;KAC5D,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QAE7D,IAAI,CAAC;YACH,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,oBAAoB,MAAM,CAAC,UAAU,SAAS;SACxD,CAAC,CAAC;QAEH,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,MAAM,CAAC,IAAI;YACnB,QAAQ,EAAE,mBAAmB,EAAE;YAC/B,SAAS;SACV,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEvE,IAAI,CAAC;YACH,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,0BAA0B,OAAO,EAAE;SAC7C,CAAC,CAAC;QAEH,OAAO;YACL,MAAM,EAAE,OAAO;YACf,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,mBAAmB,EAAE;YAC/B,SAAS;YACT,KAAK,EAAE,OAAO;SACf,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* - 30% minimum confidence gap between approve and reject
|
|
12
12
|
* - If thresholds not met → NEEDS_HUMAN_REVIEW
|
|
13
13
|
*/
|
|
14
|
-
import {
|
|
14
|
+
import type { GenerateTextFn } from '../providers/generate-fn.js';
|
|
15
15
|
import type { ConsensusStance, ConsensusVote, LLMProvider, ProgressCallback, ReviewLevel, ReviewResult, ReviewStatus } from '../types.js';
|
|
16
16
|
export interface ConsensusModelConfig {
|
|
17
17
|
provider: LLMProvider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consensus.d.ts","sourceRoot":"","sources":["../../src/agents/consensus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"consensus.d.ts","sourceRoot":"","sources":["../../src/agents/consensus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,YAAY,EACb,MAAM,aAAa,CAAC;AAiBrB,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAE9B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAE/B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAmBD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,eAAe,GACtB,aAAa,CAef;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG;IAC1D,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB,CAuDA;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC,CA2I3F"}
|
package/dist/agents/consensus.js
CHANGED
|
@@ -11,10 +11,9 @@
|
|
|
11
11
|
* - 30% minimum confidence gap between approve and reject
|
|
12
12
|
* - If thresholds not met → NEEDS_HUMAN_REVIEW
|
|
13
13
|
*/
|
|
14
|
-
import { createAISDKGenerateFn } from '../providers/generate-fn.js';
|
|
15
14
|
import { runWithConcurrency } from '../utils/concurrency.js';
|
|
16
15
|
import { calculateRateSchedule } from '../utils/token-budget.js';
|
|
17
|
-
import { buildMemoryContext, buildReviewLevelInstruction, COMPACT_CALIBRATION, CONSENSUS_AGAINST_SYSTEM, CONSENSUS_FOR_SYSTEM, CONSENSUS_NEUTRAL_SYSTEM, REVIEW_CALIBRATION, } from './prompts.js';
|
|
16
|
+
import { buildMemoryContext, buildReviewLevelInstruction, COMPACT_CALIBRATION, CONSENSUS_AGAINST_SYSTEM, CONSENSUS_FOR_SYSTEM, CONSENSUS_NEUTRAL_SYSTEM, REVIEW_CALIBRATION, UNTRUSTED_CONTENT_POLICY, wrapUntrustedDiff, } from './prompts.js';
|
|
18
17
|
// ─── Constants ──────────────────────────────────────────────────
|
|
19
18
|
/** Minimum percentage of weighted votes to decide approve/reject */
|
|
20
19
|
const DECISION_THRESHOLD = 0.6;
|
|
@@ -129,10 +128,12 @@ export async function runConsensusReview(input) {
|
|
|
129
128
|
const { diff, models, staticContext, memoryContext, stackHints, reviewLevel } = input;
|
|
130
129
|
const emit = input.onProgress ?? (() => { });
|
|
131
130
|
// ── Resolve GenerateTextFn array ──────────────────────────
|
|
132
|
-
//
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
131
|
+
// generateFns must be provided by the pipeline (required).
|
|
132
|
+
if (!input.generateFns || input.generateFns.length === 0) {
|
|
133
|
+
throw new Error('runConsensusReview requires generateFns to be provided. ' +
|
|
134
|
+
'The pipeline must resolve the backend and pass GenerateTextFn instances.');
|
|
135
|
+
}
|
|
136
|
+
const resolvedGenerateFns = input.generateFns;
|
|
136
137
|
// Auto-calculate scheduling from primary model's TPM.
|
|
137
138
|
// For CLI bridge/gateway (single generateFn), force concurrency=1.
|
|
138
139
|
const primaryModel = models[0]?.model ?? 'gpt-4o-mini';
|
|
@@ -142,8 +143,8 @@ export async function runConsensusReview(input) {
|
|
|
142
143
|
: (input.concurrency ?? rateSchedule.concurrency);
|
|
143
144
|
const delayMs = input.delayMs ?? rateSchedule.delayMs;
|
|
144
145
|
const startTime = Date.now();
|
|
145
|
-
// Build the user prompt (same for all models)
|
|
146
|
-
const userPrompt = `Review the following code changes:\n\n
|
|
146
|
+
// Build the user prompt (same for all models, wrapped in untrusted-content delimiters)
|
|
147
|
+
const userPrompt = `Review the following code changes:\n\n${wrapUntrustedDiff(diff)}`;
|
|
147
148
|
emit({
|
|
148
149
|
step: 'consensus-start',
|
|
149
150
|
message: `Launching ${models.length} model votes (concurrency: ${concurrency}, delay: ${Math.round(delayMs / 1000)}s)`,
|
|
@@ -159,6 +160,7 @@ export async function runConsensusReview(input) {
|
|
|
159
160
|
const isFirst = index === 0;
|
|
160
161
|
const system = [
|
|
161
162
|
STANCE_PROMPTS[config.stance],
|
|
163
|
+
UNTRUSTED_CONTENT_POLICY,
|
|
162
164
|
isFirst ? staticContext : '',
|
|
163
165
|
isFirst ? buildMemoryContext(memoryContext) : '',
|
|
164
166
|
isFirst ? stackHints : '',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consensus.js","sourceRoot":"","sources":["../../src/agents/consensus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"consensus.js","sourceRoot":"","sources":["../../src/agents/consensus.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostic.d.ts","sourceRoot":"","sources":["../../src/agents/diagnostic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EACV,UAAU,EAEV,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,YAAY,EACb,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"diagnostic.d.ts","sourceRoot":"","sources":["../../src/agents/diagnostic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EACV,UAAU,EAEV,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,YAAY,EACb,MAAM,aAAa,CAAC;AAarB,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAE9B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAOD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAqD1D;AAID;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC,CAoF7F"}
|
|
@@ -11,9 +11,8 @@
|
|
|
11
11
|
* - Each with conditions, verification steps, and confidence
|
|
12
12
|
* - Standard FINDINGS block for compatibility with parseReviewResponse()
|
|
13
13
|
*/
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import { buildMemoryContext, buildReviewLevelInstruction, DIAGNOSTIC_SYSTEM, REVIEW_CALIBRATION, } from './prompts.js';
|
|
14
|
+
import { createOllamaGenerateFn } from '../providers/ollama.js';
|
|
15
|
+
import { buildMemoryContext, buildReviewLevelInstruction, DIAGNOSTIC_SYSTEM, REVIEW_CALIBRATION, UNTRUSTED_CONTENT_POLICY, wrapUntrustedDiff, } from './prompts.js';
|
|
17
16
|
import { parseReviewResponse } from './simple.js';
|
|
18
17
|
// ─── Hypothesis Parsing ─────────────────────────────────────────
|
|
19
18
|
/** Valid confidence values for type-safe parsing */
|
|
@@ -94,6 +93,7 @@ export async function runDiagnosticReview(input) {
|
|
|
94
93
|
// Build the full system prompt with all context layers
|
|
95
94
|
const system = [
|
|
96
95
|
DIAGNOSTIC_SYSTEM,
|
|
96
|
+
UNTRUSTED_CONTENT_POLICY,
|
|
97
97
|
staticContext,
|
|
98
98
|
buildMemoryContext(memoryContext),
|
|
99
99
|
stackHints,
|
|
@@ -103,42 +103,44 @@ export async function runDiagnosticReview(input) {
|
|
|
103
103
|
]
|
|
104
104
|
.filter(Boolean)
|
|
105
105
|
.join('\n');
|
|
106
|
-
// Build the user prompt with the diff
|
|
107
|
-
const prompt = `Please perform a diagnostic analysis of the following code changes. Generate testable hypotheses for any potential issues:\n\n
|
|
108
|
-
|
|
106
|
+
// Build the user prompt with the diff (wrapped in untrusted-content delimiters)
|
|
107
|
+
const prompt = `Please perform a diagnostic analysis of the following code changes. Generate testable hypotheses for any potential issues:\n\n${wrapUntrustedDiff(diff)}`;
|
|
108
|
+
// Only Ollama reaches diagnostic mode (gateway/cli-bridge are redirected to simple).
|
|
109
|
+
// Use createOllamaGenerateFn for the single AI SDK path still available.
|
|
110
|
+
const generateFn = createOllamaGenerateFn(model);
|
|
109
111
|
emit({
|
|
110
112
|
step: 'diagnostic-call',
|
|
111
113
|
message: `Calling ${provider}/${model} for diagnostic hypothesis analysis...`,
|
|
112
114
|
});
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
prompt
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
115
|
+
let responseText;
|
|
116
|
+
let tokensUsed;
|
|
117
|
+
try {
|
|
118
|
+
const callResult = await generateFn(system, prompt);
|
|
119
|
+
responseText = callResult.text;
|
|
120
|
+
tokensUsed = callResult.tokensUsed;
|
|
121
|
+
}
|
|
122
|
+
catch (_err) {
|
|
123
|
+
const executionTimeMs = Date.now() - startTime;
|
|
122
124
|
emit({
|
|
123
125
|
step: 'diagnostic-done',
|
|
124
|
-
message: `LLM
|
|
126
|
+
message: `LLM call failed — falling back to static-analysis-only results`,
|
|
125
127
|
});
|
|
126
|
-
const reviewResult = parseReviewResponse('STATUS: NEEDS_HUMAN_REVIEW\nSUMMARY: LLM call
|
|
128
|
+
const reviewResult = parseReviewResponse('STATUS: NEEDS_HUMAN_REVIEW\nSUMMARY: LLM call failed. Only static analysis results are available.\nFINDINGS:\n', provider, model, 0, executionTimeMs, memoryContext);
|
|
127
129
|
reviewResult.metadata.mode = 'diagnostic';
|
|
128
130
|
reviewResult.hypotheses = [];
|
|
129
131
|
return reviewResult;
|
|
130
132
|
}
|
|
131
|
-
const
|
|
133
|
+
const executionTimeMs = Date.now() - startTime;
|
|
132
134
|
emit({
|
|
133
135
|
step: 'diagnostic-done',
|
|
134
136
|
message: `Diagnostic analysis complete — ${tokensUsed} tokens, ${(executionTimeMs / 1000).toFixed(1)}s`,
|
|
135
137
|
});
|
|
136
138
|
// Parse the standard review response (STATUS, SUMMARY, FINDINGS)
|
|
137
|
-
const reviewResult = parseReviewResponse(
|
|
139
|
+
const reviewResult = parseReviewResponse(responseText, provider, model, tokensUsed, executionTimeMs, memoryContext);
|
|
138
140
|
// Override mode in metadata
|
|
139
141
|
reviewResult.metadata.mode = 'diagnostic';
|
|
140
142
|
// Parse hypotheses from the response and attach to result
|
|
141
|
-
reviewResult.hypotheses = parseHypotheses(
|
|
143
|
+
reviewResult.hypotheses = parseHypotheses(responseText);
|
|
142
144
|
return reviewResult;
|
|
143
145
|
}
|
|
144
146
|
//# sourceMappingURL=diagnostic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../../src/agents/diagnostic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../../src/agents/diagnostic.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,17 @@ export interface ReviewLens {
|
|
|
28
28
|
/** Focused system prompt for this lens */
|
|
29
29
|
system: string;
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Result of validating and loading lenses from a directory.
|
|
33
|
+
* `valid` contains successfully loaded lenses; `errors` lists any files that failed validation.
|
|
34
|
+
*/
|
|
35
|
+
export interface LensValidationResult {
|
|
36
|
+
valid: ReviewLens[];
|
|
37
|
+
errors: Array<{
|
|
38
|
+
file: string;
|
|
39
|
+
reason: string;
|
|
40
|
+
}>;
|
|
41
|
+
}
|
|
31
42
|
export declare const LENS_SECURITY: ReviewLens;
|
|
32
43
|
export declare const LENS_PERFORMANCE: ReviewLens;
|
|
33
44
|
export declare const LENS_ERROR_HANDLING: ReviewLens;
|
|
@@ -43,6 +54,36 @@ export declare function getLens(name: string): ReviewLens | undefined;
|
|
|
43
54
|
export declare function getAllLenses(): ReviewLens[];
|
|
44
55
|
/** Reset custom registrations (for testing). */
|
|
45
56
|
export declare function resetLensRegistry(): void;
|
|
57
|
+
/**
|
|
58
|
+
* Validate raw data as a ReviewLens definition.
|
|
59
|
+
*
|
|
60
|
+
* Checks:
|
|
61
|
+
* - `name` is a non-empty string matching alphanumeric + hyphens pattern
|
|
62
|
+
* - `label` is a non-empty string
|
|
63
|
+
* - `system` is a non-empty string with max 4000 characters
|
|
64
|
+
*
|
|
65
|
+
* @param data - Unknown data to validate (typically parsed JSON)
|
|
66
|
+
* @returns The validated ReviewLens if valid, or null with reason string
|
|
67
|
+
*/
|
|
68
|
+
export declare function validateLens(data: unknown): {
|
|
69
|
+
lens: ReviewLens;
|
|
70
|
+
error: null;
|
|
71
|
+
} | {
|
|
72
|
+
lens: null;
|
|
73
|
+
error: string;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Load and validate lens definitions from a directory.
|
|
77
|
+
*
|
|
78
|
+
* Reads all `*.json` files from the given directory, validates each as a ReviewLens,
|
|
79
|
+
* registers valid lenses via `registerLens()`, and collects errors for invalid files.
|
|
80
|
+
* Invalid files are skipped with a warning — they do not crash the pipeline.
|
|
81
|
+
*
|
|
82
|
+
* @param dirPath - Absolute path to the lens definitions directory
|
|
83
|
+
* @param onProgress - Optional progress callback for warnings
|
|
84
|
+
* @returns LensValidationResult with valid lenses and any errors
|
|
85
|
+
*/
|
|
86
|
+
export declare function loadLensesFromDir(dirPath: string, onProgress?: ProgressCallback): Promise<LensValidationResult>;
|
|
46
87
|
export interface FanOutReviewInput {
|
|
47
88
|
diff: string;
|
|
48
89
|
provider: LLMProvider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fan-out-lenses.d.ts","sourceRoot":"","sources":["../../src/agents/fan-out-lenses.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAEV,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,YAAY,EAEb,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"fan-out-lenses.d.ts","sourceRoot":"","sources":["../../src/agents/fan-out-lenses.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAEV,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,YAAY,EAEb,MAAM,aAAa,CAAC;AAcrB;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IAEb,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IAEd,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD;AAID,eAAO,MAAM,aAAa,EAAE,UA6B3B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,UA6B9B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,UA6BjC,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,UA6BzB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,UA+BhC,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,cAAc,EAAE,UAAU,EAMtC,CAAC;AAMF,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAEnD;AAED,yDAAyD;AACzD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAE5D;AAED,yEAAyE;AACzE,wBAAgB,YAAY,IAAI,UAAU,EAAE,CAK3C;AAED,gDAAgD;AAChD,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAUD;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,OAAO,GACZ;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAsCnE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,oBAAoB,CAAC,CAuD/B;AAcD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAE9B,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAElB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAE/B,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAID;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,OAAO,aAAa,EAAE,aAAa,EAAE,GACjD,OAAO,aAAa,EAAE,aAAa,EAAE,CA6BvC;AAID;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAiMrF"}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* - accessibility — a11y attributes, ARIA, keyboard navigation
|
|
15
15
|
*/
|
|
16
16
|
import { runWithConcurrency } from '../utils/concurrency.js';
|
|
17
|
-
import { buildMemoryContext, buildReviewLevelInstruction, COMPACT_CALIBRATION, REVIEW_CALIBRATION, } from './prompts.js';
|
|
17
|
+
import { buildMemoryContext, buildReviewLevelInstruction, COMPACT_CALIBRATION, REVIEW_CALIBRATION, UNTRUSTED_CONTENT_POLICY, wrapUntrustedDiff, } from './prompts.js';
|
|
18
18
|
import { parseFindingsBlock } from './simple.js';
|
|
19
19
|
// ─── Default Lenses ────────────────────────────────────────────
|
|
20
20
|
export const LENS_SECURITY = {
|
|
@@ -200,6 +200,119 @@ export function getAllLenses() {
|
|
|
200
200
|
export function resetLensRegistry() {
|
|
201
201
|
lensMap.clear();
|
|
202
202
|
}
|
|
203
|
+
// ─── Lens Validation & Loading ────────────────────────────────
|
|
204
|
+
/** Maximum allowed length for a lens system prompt. */
|
|
205
|
+
const MAX_SYSTEM_LENGTH = 4000;
|
|
206
|
+
/** Pattern for valid lens names: alphanumeric, hyphens, underscores. */
|
|
207
|
+
const LENS_NAME_PATTERN = /^[a-z0-9][a-z0-9_-]*$/i;
|
|
208
|
+
/**
|
|
209
|
+
* Validate raw data as a ReviewLens definition.
|
|
210
|
+
*
|
|
211
|
+
* Checks:
|
|
212
|
+
* - `name` is a non-empty string matching alphanumeric + hyphens pattern
|
|
213
|
+
* - `label` is a non-empty string
|
|
214
|
+
* - `system` is a non-empty string with max 4000 characters
|
|
215
|
+
*
|
|
216
|
+
* @param data - Unknown data to validate (typically parsed JSON)
|
|
217
|
+
* @returns The validated ReviewLens if valid, or null with reason string
|
|
218
|
+
*/
|
|
219
|
+
export function validateLens(data) {
|
|
220
|
+
if (data == null || typeof data !== 'object') {
|
|
221
|
+
return { lens: null, error: 'Lens definition must be a JSON object' };
|
|
222
|
+
}
|
|
223
|
+
const obj = data;
|
|
224
|
+
// Validate name
|
|
225
|
+
if (typeof obj.name !== 'string' || obj.name.trim().length === 0) {
|
|
226
|
+
return { lens: null, error: 'Missing or invalid "name" field (must be a non-empty string)' };
|
|
227
|
+
}
|
|
228
|
+
if (!LENS_NAME_PATTERN.test(obj.name)) {
|
|
229
|
+
return {
|
|
230
|
+
lens: null,
|
|
231
|
+
error: `Invalid "name" "${obj.name}" — must match ${LENS_NAME_PATTERN.source}`,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
// Validate label
|
|
235
|
+
if (typeof obj.label !== 'string' || obj.label.trim().length === 0) {
|
|
236
|
+
return { lens: null, error: 'Missing or invalid "label" field (must be a non-empty string)' };
|
|
237
|
+
}
|
|
238
|
+
// Validate system
|
|
239
|
+
if (typeof obj.system !== 'string' || obj.system.trim().length === 0) {
|
|
240
|
+
return { lens: null, error: 'Missing or invalid "system" field (must be a non-empty string)' };
|
|
241
|
+
}
|
|
242
|
+
if (obj.system.length > MAX_SYSTEM_LENGTH) {
|
|
243
|
+
return {
|
|
244
|
+
lens: null,
|
|
245
|
+
error: `"system" prompt exceeds ${MAX_SYSTEM_LENGTH} characters (got ${obj.system.length})`,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
lens: { name: obj.name, label: obj.label, system: obj.system },
|
|
250
|
+
error: null,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Load and validate lens definitions from a directory.
|
|
255
|
+
*
|
|
256
|
+
* Reads all `*.json` files from the given directory, validates each as a ReviewLens,
|
|
257
|
+
* registers valid lenses via `registerLens()`, and collects errors for invalid files.
|
|
258
|
+
* Invalid files are skipped with a warning — they do not crash the pipeline.
|
|
259
|
+
*
|
|
260
|
+
* @param dirPath - Absolute path to the lens definitions directory
|
|
261
|
+
* @param onProgress - Optional progress callback for warnings
|
|
262
|
+
* @returns LensValidationResult with valid lenses and any errors
|
|
263
|
+
*/
|
|
264
|
+
export async function loadLensesFromDir(dirPath, onProgress) {
|
|
265
|
+
const { existsSync, readdirSync, readFileSync } = await import('node:fs');
|
|
266
|
+
const { join, basename } = await import('node:path');
|
|
267
|
+
const emit = onProgress ?? (() => { });
|
|
268
|
+
const result = { valid: [], errors: [] };
|
|
269
|
+
if (!existsSync(dirPath)) {
|
|
270
|
+
return result; // Directory doesn't exist — not an error, just no custom lenses
|
|
271
|
+
}
|
|
272
|
+
let files;
|
|
273
|
+
try {
|
|
274
|
+
files = readdirSync(dirPath).filter((f) => f.endsWith('.json'));
|
|
275
|
+
}
|
|
276
|
+
catch (err) {
|
|
277
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
278
|
+
emit({ step: 'lens-loader', message: `Failed to read lens directory: ${msg}` });
|
|
279
|
+
return result;
|
|
280
|
+
}
|
|
281
|
+
for (const file of files) {
|
|
282
|
+
const filePath = join(dirPath, file);
|
|
283
|
+
try {
|
|
284
|
+
const raw = readFileSync(filePath, 'utf-8');
|
|
285
|
+
const parsed = JSON.parse(raw);
|
|
286
|
+
const validation = validateLens(parsed);
|
|
287
|
+
if (validation.lens) {
|
|
288
|
+
registerLens(validation.lens);
|
|
289
|
+
result.valid.push(validation.lens);
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
result.errors.push({ file: basename(file), reason: validation.error });
|
|
293
|
+
emit({
|
|
294
|
+
step: 'lens-loader',
|
|
295
|
+
message: `Skipping invalid lens "${basename(file)}": ${validation.error}`,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
catch (err) {
|
|
300
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
301
|
+
result.errors.push({ file: basename(file), reason: `JSON parse error: ${msg}` });
|
|
302
|
+
emit({
|
|
303
|
+
step: 'lens-loader',
|
|
304
|
+
message: `Skipping invalid lens "${basename(file)}": JSON parse error`,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
if (result.valid.length > 0) {
|
|
309
|
+
emit({
|
|
310
|
+
step: 'lens-loader',
|
|
311
|
+
message: `Loaded ${result.valid.length} custom lens(es): ${result.valid.map((l) => l.name).join(', ')}`,
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
return result;
|
|
315
|
+
}
|
|
203
316
|
// ─── Severity Ranking ──────────────────────────────────────────
|
|
204
317
|
const SEVERITY_RANK = {
|
|
205
318
|
critical: 5,
|
|
@@ -288,8 +401,8 @@ export async function runFanOutReview(input) {
|
|
|
288
401
|
message: `Launching ${resolvedLenses.length} review lenses (concurrency: ${concurrency})`,
|
|
289
402
|
detail: resolvedLenses.map((l) => ` → ${l.label}`).join('\n'),
|
|
290
403
|
});
|
|
291
|
-
// Build the user prompt (same for all lenses)
|
|
292
|
-
const userPrompt = `Review the following code changes:\n\n
|
|
404
|
+
// Build the user prompt (same for all lenses, wrapped in untrusted-content delimiters)
|
|
405
|
+
const userPrompt = `Review the following code changes:\n\n${wrapUntrustedDiff(diff)}`;
|
|
293
406
|
// ── Step 1: Run lenses with bounded concurrency ─────────────
|
|
294
407
|
const lensTasks = resolvedLenses.map((lens, index) => {
|
|
295
408
|
return async () => {
|
|
@@ -303,6 +416,7 @@ export async function runFanOutReview(input) {
|
|
|
303
416
|
const isFirst = index === 0;
|
|
304
417
|
const system = [
|
|
305
418
|
lens.system,
|
|
419
|
+
UNTRUSTED_CONTENT_POLICY,
|
|
306
420
|
isFirst ? staticContext : '',
|
|
307
421
|
isFirst ? buildMemoryContext(memoryContext) : '',
|
|
308
422
|
isFirst ? stackHints : '',
|