codesift-mcp 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +66 -21
- package/README.md +402 -56
- package/dist/cli/args.d.ts +2 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +11 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +177 -67
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/help.d.ts +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +157 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/hooks.d.ts +3 -0
- package/dist/cli/hooks.d.ts.map +1 -0
- package/dist/cli/hooks.js +163 -0
- package/dist/cli/hooks.js.map +1 -0
- package/dist/cli/setup.d.ts +25 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +400 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/formatters-shortening.d.ts +7 -0
- package/dist/formatters-shortening.d.ts.map +1 -0
- package/dist/formatters-shortening.js +68 -0
- package/dist/formatters-shortening.js.map +1 -0
- package/dist/formatters.d.ts +314 -0
- package/dist/formatters.d.ts.map +1 -0
- package/dist/formatters.js +396 -0
- package/dist/formatters.js.map +1 -0
- package/dist/instructions.d.ts +6 -0
- package/dist/instructions.d.ts.map +1 -0
- package/dist/instructions.js +72 -0
- package/dist/instructions.js.map +1 -0
- package/dist/lsp/lsp-client.d.ts +21 -0
- package/dist/lsp/lsp-client.d.ts.map +1 -0
- package/dist/lsp/lsp-client.js +122 -0
- package/dist/lsp/lsp-client.js.map +1 -0
- package/dist/lsp/lsp-manager.d.ts +12 -0
- package/dist/lsp/lsp-manager.d.ts.map +1 -0
- package/dist/lsp/lsp-manager.js +82 -0
- package/dist/lsp/lsp-manager.js.map +1 -0
- package/dist/lsp/lsp-servers.d.ts +13 -0
- package/dist/lsp/lsp-servers.d.ts.map +1 -0
- package/dist/lsp/lsp-servers.js +57 -0
- package/dist/lsp/lsp-servers.js.map +1 -0
- package/dist/lsp/lsp-tools.d.ts +67 -0
- package/dist/lsp/lsp-tools.d.ts.map +1 -0
- package/dist/lsp/lsp-tools.js +359 -0
- package/dist/lsp/lsp-tools.js.map +1 -0
- package/dist/parser/extractors/_shared.d.ts +11 -0
- package/dist/parser/extractors/_shared.d.ts.map +1 -0
- package/dist/parser/extractors/_shared.js +38 -0
- package/dist/parser/extractors/_shared.js.map +1 -0
- package/dist/parser/extractors/astro.d.ts +15 -0
- package/dist/parser/extractors/astro.d.ts.map +1 -0
- package/dist/parser/extractors/astro.js +104 -0
- package/dist/parser/extractors/astro.js.map +1 -0
- package/dist/parser/extractors/conversation.d.ts +16 -0
- package/dist/parser/extractors/conversation.d.ts.map +1 -0
- package/dist/parser/extractors/conversation.js +196 -0
- package/dist/parser/extractors/conversation.js.map +1 -0
- package/dist/parser/extractors/go.d.ts.map +1 -1
- package/dist/parser/extractors/go.js +22 -45
- package/dist/parser/extractors/go.js.map +1 -1
- package/dist/parser/extractors/python.d.ts +1 -1
- package/dist/parser/extractors/python.d.ts.map +1 -1
- package/dist/parser/extractors/python.js +19 -50
- package/dist/parser/extractors/python.js.map +1 -1
- package/dist/parser/extractors/rust.d.ts +1 -1
- package/dist/parser/extractors/rust.d.ts.map +1 -1
- package/dist/parser/extractors/rust.js +7 -34
- package/dist/parser/extractors/rust.js.map +1 -1
- package/dist/parser/extractors/typescript.d.ts +1 -1
- package/dist/parser/extractors/typescript.d.ts.map +1 -1
- package/dist/parser/extractors/typescript.js +99 -68
- package/dist/parser/extractors/typescript.js.map +1 -1
- package/dist/parser/parser-manager.d.ts.map +1 -1
- package/dist/parser/parser-manager.js +12 -2
- package/dist/parser/parser-manager.js.map +1 -1
- package/dist/parser/symbol-extractor.d.ts +2 -0
- package/dist/parser/symbol-extractor.d.ts.map +1 -1
- package/dist/parser/symbol-extractor.js +2 -0
- package/dist/parser/symbol-extractor.js.map +1 -1
- package/dist/register-tools.d.ts +127 -0
- package/dist/register-tools.d.ts.map +1 -0
- package/dist/register-tools.js +1453 -0
- package/dist/register-tools.js.map +1 -0
- package/dist/retrieval/codebase-retrieval.d.ts +4 -26
- package/dist/retrieval/codebase-retrieval.d.ts.map +1 -1
- package/dist/retrieval/codebase-retrieval.js +105 -403
- package/dist/retrieval/codebase-retrieval.js.map +1 -1
- package/dist/retrieval/retrieval-constants.d.ts +27 -0
- package/dist/retrieval/retrieval-constants.d.ts.map +1 -0
- package/dist/retrieval/retrieval-constants.js +27 -0
- package/dist/retrieval/retrieval-constants.js.map +1 -0
- package/dist/retrieval/retrieval-schemas.d.ts +107 -0
- package/dist/retrieval/retrieval-schemas.d.ts.map +1 -0
- package/dist/retrieval/retrieval-schemas.js +102 -0
- package/dist/retrieval/retrieval-schemas.js.map +1 -0
- package/dist/retrieval/retrieval-utils.d.ts +40 -0
- package/dist/retrieval/retrieval-utils.d.ts.map +1 -0
- package/dist/retrieval/retrieval-utils.js +139 -0
- package/dist/retrieval/retrieval-utils.js.map +1 -0
- package/dist/retrieval/semantic-handlers.d.ts +8 -0
- package/dist/retrieval/semantic-handlers.d.ts.map +1 -0
- package/dist/retrieval/semantic-handlers.js +152 -0
- package/dist/retrieval/semantic-handlers.js.map +1 -0
- package/dist/search/bm25.d.ts +6 -1
- package/dist/search/bm25.d.ts.map +1 -1
- package/dist/search/bm25.js +95 -32
- package/dist/search/bm25.js.map +1 -1
- package/dist/search/chunker.d.ts +10 -0
- package/dist/search/chunker.d.ts.map +1 -1
- package/dist/search/chunker.js +63 -11
- package/dist/search/chunker.js.map +1 -1
- package/dist/search/reranker.d.ts +15 -0
- package/dist/search/reranker.d.ts.map +1 -0
- package/dist/search/reranker.js +126 -0
- package/dist/search/reranker.js.map +1 -0
- package/dist/search/semantic.d.ts +1 -1
- package/dist/search/semantic.d.ts.map +1 -1
- package/dist/search/semantic.js +40 -45
- package/dist/search/semantic.js.map +1 -1
- package/dist/server-helpers.d.ts +29 -0
- package/dist/server-helpers.d.ts.map +1 -0
- package/dist/server-helpers.js +312 -0
- package/dist/server-helpers.js.map +1 -0
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +11 -271
- package/dist/server.js.map +1 -1
- package/dist/storage/_shared.d.ts +9 -0
- package/dist/storage/_shared.d.ts.map +1 -0
- package/dist/storage/_shared.js +26 -0
- package/dist/storage/_shared.js.map +1 -0
- package/dist/storage/chunk-store.d.ts.map +1 -1
- package/dist/storage/chunk-store.js +23 -63
- package/dist/storage/chunk-store.js.map +1 -1
- package/dist/storage/embedding-store.d.ts +6 -3
- package/dist/storage/embedding-store.d.ts.map +1 -1
- package/dist/storage/embedding-store.js +54 -30
- package/dist/storage/embedding-store.js.map +1 -1
- package/dist/storage/graph-store.d.ts +48 -0
- package/dist/storage/graph-store.d.ts.map +1 -0
- package/dist/storage/graph-store.js +52 -0
- package/dist/storage/graph-store.js.map +1 -0
- package/dist/storage/index-store.d.ts +5 -0
- package/dist/storage/index-store.d.ts.map +1 -1
- package/dist/storage/index-store.js +28 -16
- package/dist/storage/index-store.js.map +1 -1
- package/dist/storage/registry.d.ts +4 -0
- package/dist/storage/registry.d.ts.map +1 -1
- package/dist/storage/registry.js +16 -16
- package/dist/storage/registry.js.map +1 -1
- package/dist/storage/usage-stats.d.ts +6 -0
- package/dist/storage/usage-stats.d.ts.map +1 -1
- package/dist/storage/usage-stats.js +59 -11
- package/dist/storage/usage-stats.js.map +1 -1
- package/dist/storage/usage-tracker.d.ts +3 -0
- package/dist/storage/usage-tracker.d.ts.map +1 -1
- package/dist/storage/usage-tracker.js +50 -132
- package/dist/storage/usage-tracker.js.map +1 -1
- package/dist/storage/watcher.d.ts +2 -1
- package/dist/storage/watcher.d.ts.map +1 -1
- package/dist/storage/watcher.js +16 -16
- package/dist/storage/watcher.js.map +1 -1
- package/dist/tools/ast-query-tools.d.ts +29 -0
- package/dist/tools/ast-query-tools.d.ts.map +1 -0
- package/dist/tools/ast-query-tools.js +110 -0
- package/dist/tools/ast-query-tools.js.map +1 -0
- package/dist/tools/boundary-tools.d.ts +31 -0
- package/dist/tools/boundary-tools.d.ts.map +1 -0
- package/dist/tools/boundary-tools.js +62 -0
- package/dist/tools/boundary-tools.js.map +1 -0
- package/dist/tools/clone-tools.d.ts +35 -0
- package/dist/tools/clone-tools.d.ts.map +1 -0
- package/dist/tools/clone-tools.js +181 -0
- package/dist/tools/clone-tools.js.map +1 -0
- package/dist/tools/community-tools.d.ts +23 -0
- package/dist/tools/community-tools.d.ts.map +1 -0
- package/dist/tools/community-tools.js +297 -0
- package/dist/tools/community-tools.js.map +1 -0
- package/dist/tools/complexity-tools.d.ts +34 -0
- package/dist/tools/complexity-tools.d.ts.map +1 -0
- package/dist/tools/complexity-tools.js +135 -0
- package/dist/tools/complexity-tools.js.map +1 -0
- package/dist/tools/context-tools.d.ts +44 -3
- package/dist/tools/context-tools.d.ts.map +1 -1
- package/dist/tools/context-tools.js +329 -99
- package/dist/tools/context-tools.js.map +1 -1
- package/dist/tools/conversation-tools.d.ts +107 -0
- package/dist/tools/conversation-tools.d.ts.map +1 -0
- package/dist/tools/conversation-tools.js +419 -0
- package/dist/tools/conversation-tools.js.map +1 -0
- package/dist/tools/coordinator-tools.d.ts +73 -0
- package/dist/tools/coordinator-tools.d.ts.map +1 -0
- package/dist/tools/coordinator-tools.js +153 -0
- package/dist/tools/coordinator-tools.js.map +1 -0
- package/dist/tools/cross-repo-tools.d.ts +43 -0
- package/dist/tools/cross-repo-tools.d.ts.map +1 -0
- package/dist/tools/cross-repo-tools.js +55 -0
- package/dist/tools/cross-repo-tools.js.map +1 -0
- package/dist/tools/diff-tools.d.ts +4 -1
- package/dist/tools/diff-tools.d.ts.map +1 -1
- package/dist/tools/diff-tools.js +23 -5
- package/dist/tools/diff-tools.js.map +1 -1
- package/dist/tools/frequency-tools.d.ts +46 -0
- package/dist/tools/frequency-tools.d.ts.map +1 -0
- package/dist/tools/frequency-tools.js +184 -0
- package/dist/tools/frequency-tools.js.map +1 -0
- package/dist/tools/generate-tools.d.ts.map +1 -1
- package/dist/tools/generate-tools.js +13 -2
- package/dist/tools/generate-tools.js.map +1 -1
- package/dist/tools/graph-tools.d.ts +44 -11
- package/dist/tools/graph-tools.d.ts.map +1 -1
- package/dist/tools/graph-tools.js +147 -104
- package/dist/tools/graph-tools.js.map +1 -1
- package/dist/tools/hotspot-tools.d.ts +24 -0
- package/dist/tools/hotspot-tools.d.ts.map +1 -0
- package/dist/tools/hotspot-tools.js +122 -0
- package/dist/tools/hotspot-tools.js.map +1 -0
- package/dist/tools/impact-tools.d.ts +13 -0
- package/dist/tools/impact-tools.d.ts.map +1 -0
- package/dist/tools/impact-tools.js +238 -0
- package/dist/tools/impact-tools.js.map +1 -0
- package/dist/tools/index-tools.d.ts +44 -3
- package/dist/tools/index-tools.d.ts.map +1 -1
- package/dist/tools/index-tools.js +530 -222
- package/dist/tools/index-tools.js.map +1 -1
- package/dist/tools/memory-tools.d.ts +35 -0
- package/dist/tools/memory-tools.d.ts.map +1 -0
- package/dist/tools/memory-tools.js +229 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/outline-tools.d.ts +24 -13
- package/dist/tools/outline-tools.d.ts.map +1 -1
- package/dist/tools/outline-tools.js +113 -87
- package/dist/tools/outline-tools.js.map +1 -1
- package/dist/tools/pattern-tools.d.ts +32 -0
- package/dist/tools/pattern-tools.d.ts.map +1 -0
- package/dist/tools/pattern-tools.js +116 -0
- package/dist/tools/pattern-tools.js.map +1 -0
- package/dist/tools/report-tools.d.ts +5 -0
- package/dist/tools/report-tools.d.ts.map +1 -0
- package/dist/tools/report-tools.js +167 -0
- package/dist/tools/report-tools.js.map +1 -0
- package/dist/tools/review-diff-tools.d.ts +148 -0
- package/dist/tools/review-diff-tools.d.ts.map +1 -0
- package/dist/tools/review-diff-tools.js +852 -0
- package/dist/tools/review-diff-tools.js.map +1 -0
- package/dist/tools/route-tools.d.ts +32 -0
- package/dist/tools/route-tools.d.ts.map +1 -0
- package/dist/tools/route-tools.js +276 -0
- package/dist/tools/route-tools.js.map +1 -0
- package/dist/tools/search-ranker.d.ts +5 -0
- package/dist/tools/search-ranker.d.ts.map +1 -0
- package/dist/tools/search-ranker.js +142 -0
- package/dist/tools/search-ranker.js.map +1 -0
- package/dist/tools/search-tools.d.ts +24 -1
- package/dist/tools/search-tools.d.ts.map +1 -1
- package/dist/tools/search-tools.js +459 -225
- package/dist/tools/search-tools.js.map +1 -1
- package/dist/tools/secret-tools.d.ts +104 -0
- package/dist/tools/secret-tools.d.ts.map +1 -0
- package/dist/tools/secret-tools.js +410 -0
- package/dist/tools/secret-tools.js.map +1 -0
- package/dist/tools/symbol-tools.d.ts +90 -2
- package/dist/tools/symbol-tools.d.ts.map +1 -1
- package/dist/tools/symbol-tools.js +576 -42
- package/dist/tools/symbol-tools.js.map +1 -1
- package/dist/types.d.ts +34 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/framework-detect.d.ts +5 -0
- package/dist/utils/framework-detect.d.ts.map +1 -0
- package/dist/utils/framework-detect.js +36 -0
- package/dist/utils/framework-detect.js.map +1 -0
- package/dist/utils/glob.d.ts +19 -0
- package/dist/utils/glob.d.ts.map +1 -0
- package/dist/utils/glob.js +74 -0
- package/dist/utils/glob.js.map +1 -0
- package/dist/utils/import-graph.d.ts +29 -0
- package/dist/utils/import-graph.d.ts.map +1 -0
- package/dist/utils/import-graph.js +125 -0
- package/dist/utils/import-graph.js.map +1 -0
- package/dist/utils/test-file.d.ts.map +1 -1
- package/dist/utils/test-file.js +1 -0
- package/dist/utils/test-file.js.map +1 -1
- package/dist/utils/walk.d.ts +45 -0
- package/dist/utils/walk.d.ts.map +1 -0
- package/dist/utils/walk.js +87 -0
- package/dist/utils/walk.js.map +1 -0
- package/package.json +12 -5
- package/rules/codesift.md +187 -0
- package/rules/codesift.mdc +192 -0
- package/rules/codex.md +187 -0
- package/rules/gemini.md +187 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { getCodeIndex } from "./index-tools.js";
|
|
3
|
+
const DEFAULT_SINCE_DAYS = 90;
|
|
4
|
+
const MAX_HOTSPOTS = 30;
|
|
5
|
+
/**
|
|
6
|
+
* Get git log numstat for a repo: file → { commits, linesChanged }.
|
|
7
|
+
*/
|
|
8
|
+
function getGitChurn(repoRoot, sinceDays) {
|
|
9
|
+
const since = `${sinceDays} days ago`;
|
|
10
|
+
let output;
|
|
11
|
+
try {
|
|
12
|
+
output = execFileSync("git", [
|
|
13
|
+
"log", "--numstat", "--format=%H", `--since=${since}`,
|
|
14
|
+
], {
|
|
15
|
+
cwd: repoRoot,
|
|
16
|
+
encoding: "utf-8",
|
|
17
|
+
timeout: 30_000,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
22
|
+
console.error(`[hotspot] git log failed for ${repoRoot}: ${message}`);
|
|
23
|
+
return new Map();
|
|
24
|
+
}
|
|
25
|
+
const churn = new Map();
|
|
26
|
+
const lines = output.split("\n");
|
|
27
|
+
const commitFiles = new Set();
|
|
28
|
+
let inCommit = false;
|
|
29
|
+
for (const line of lines) {
|
|
30
|
+
const trimmed = line.trim();
|
|
31
|
+
if (!trimmed) {
|
|
32
|
+
// End of a commit's stats — record commit counts
|
|
33
|
+
for (const file of commitFiles) {
|
|
34
|
+
const entry = churn.get(file);
|
|
35
|
+
if (entry)
|
|
36
|
+
entry.commits++;
|
|
37
|
+
}
|
|
38
|
+
commitFiles.clear();
|
|
39
|
+
inCommit = false;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
// Commit hash line (40 hex chars)
|
|
43
|
+
if (/^[0-9a-f]{40}$/.test(trimmed)) {
|
|
44
|
+
inCommit = true;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (!inCommit)
|
|
48
|
+
continue;
|
|
49
|
+
// Numstat line: "added\tremoved\tfile"
|
|
50
|
+
const parts = trimmed.split("\t");
|
|
51
|
+
if (parts.length !== 3)
|
|
52
|
+
continue;
|
|
53
|
+
const added = parseInt(parts[0], 10);
|
|
54
|
+
const removed = parseInt(parts[1], 10);
|
|
55
|
+
const file = parts[2];
|
|
56
|
+
if (isNaN(added) || isNaN(removed))
|
|
57
|
+
continue; // binary file
|
|
58
|
+
let entry = churn.get(file);
|
|
59
|
+
if (!entry) {
|
|
60
|
+
entry = { commits: 0, linesAdded: 0, linesRemoved: 0 };
|
|
61
|
+
churn.set(file, entry);
|
|
62
|
+
}
|
|
63
|
+
entry.linesAdded += added;
|
|
64
|
+
entry.linesRemoved += removed;
|
|
65
|
+
commitFiles.add(file);
|
|
66
|
+
}
|
|
67
|
+
// Handle last commit
|
|
68
|
+
for (const file of commitFiles) {
|
|
69
|
+
const entry = churn.get(file);
|
|
70
|
+
if (entry)
|
|
71
|
+
entry.commits++;
|
|
72
|
+
}
|
|
73
|
+
return churn;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Analyze git churn hotspots: files with high change frequency × complexity.
|
|
77
|
+
* Higher hotspot_score = more likely to contain bugs and need refactoring.
|
|
78
|
+
*/
|
|
79
|
+
export async function analyzeHotspots(repo, options) {
|
|
80
|
+
const index = await getCodeIndex(repo);
|
|
81
|
+
if (!index) {
|
|
82
|
+
throw new Error(`Repository "${repo}" not found. Index it first with index_folder.`);
|
|
83
|
+
}
|
|
84
|
+
const sinceDays = options?.since_days ?? DEFAULT_SINCE_DAYS;
|
|
85
|
+
const topN = options?.top_n ?? MAX_HOTSPOTS;
|
|
86
|
+
const filePattern = options?.file_pattern;
|
|
87
|
+
const churn = getGitChurn(index.root, sinceDays);
|
|
88
|
+
// Build symbol count lookup
|
|
89
|
+
const symbolCounts = new Map();
|
|
90
|
+
for (const file of index.files) {
|
|
91
|
+
symbolCounts.set(file.path, file.symbol_count);
|
|
92
|
+
}
|
|
93
|
+
const hotspots = [];
|
|
94
|
+
let totalCommits = 0;
|
|
95
|
+
for (const [file, stats] of churn) {
|
|
96
|
+
if (filePattern && !file.includes(filePattern))
|
|
97
|
+
continue;
|
|
98
|
+
// Skip non-indexed files (node_modules, etc.)
|
|
99
|
+
const symCount = symbolCounts.get(file) ?? 0;
|
|
100
|
+
const linesChanged = stats.linesAdded + stats.linesRemoved;
|
|
101
|
+
const churnScore = stats.commits * linesChanged;
|
|
102
|
+
const hotspotScore = churnScore * Math.max(symCount, 1);
|
|
103
|
+
totalCommits += stats.commits;
|
|
104
|
+
hotspots.push({
|
|
105
|
+
file,
|
|
106
|
+
commits: stats.commits,
|
|
107
|
+
lines_changed: linesChanged,
|
|
108
|
+
symbol_count: symCount,
|
|
109
|
+
churn_score: churnScore,
|
|
110
|
+
hotspot_score: hotspotScore,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
// Sort by hotspot_score descending
|
|
114
|
+
hotspots.sort((a, b) => b.hotspot_score - a.hotspot_score);
|
|
115
|
+
return {
|
|
116
|
+
hotspots: hotspots.slice(0, topN),
|
|
117
|
+
period: `last ${sinceDays} days`,
|
|
118
|
+
total_files: hotspots.length,
|
|
119
|
+
total_commits: Math.round(totalCommits / Math.max(hotspots.length, 1)),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=hotspot-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hotspot-tools.js","sourceRoot":"","sources":["../../src/tools/hotspot-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ImpactResult } from "../types.js";
|
|
2
|
+
export interface ImpactOptions {
|
|
3
|
+
depth?: number | undefined;
|
|
4
|
+
until?: string | undefined;
|
|
5
|
+
include_source?: boolean | undefined;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Analyze the impact of recent git changes on a repository.
|
|
9
|
+
* Finds changed files, affected symbols, and builds a dependency graph.
|
|
10
|
+
* By default, source code is stripped from symbols to keep output compact.
|
|
11
|
+
*/
|
|
12
|
+
export declare function impactAnalysis(repo: string, since: string, depthOrOptions?: number | ImpactOptions, until?: string): Promise<ImpactResult>;
|
|
13
|
+
//# sourceMappingURL=impact-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact-tools.d.ts","sourceRoot":"","sources":["../../src/tools/impact-tools.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAkD,YAAY,EAAE,MAAM,aAAa,CAAC;AAkHhG,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACtC;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,cAAc,CAAC,EAAE,MAAM,GAAG,aAAa,EACvC,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,CAAC,CAiEvB"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { getCodeIndex } from "./index-tools.js";
|
|
3
|
+
import { buildAdjacencyIndex, stripSource } from "./graph-tools.js";
|
|
4
|
+
import { validateGitRef } from "../utils/git-validation.js";
|
|
5
|
+
import { isTestFileStrict as isTestFile } from "../utils/test-file.js";
|
|
6
|
+
const DEFAULT_IMPACT_DEPTH = 2;
|
|
7
|
+
const MAX_AFFECTED_SYMBOLS = 20;
|
|
8
|
+
const MAX_DEPENDENCY_GRAPH_FILES = 15;
|
|
9
|
+
const MAX_SOURCE_CHARS = 300; // Truncate source in impact results
|
|
10
|
+
/**
|
|
11
|
+
* Find all callers of the given symbols, recursing up to depth levels.
|
|
12
|
+
* Uses pre-built adjacency index for efficient lookups.
|
|
13
|
+
*/
|
|
14
|
+
function findAffectedSymbols(changedSymbols, adjacency, maxDepth) {
|
|
15
|
+
const affected = new Map();
|
|
16
|
+
for (const sym of changedSymbols) {
|
|
17
|
+
affected.set(sym.id, sym);
|
|
18
|
+
}
|
|
19
|
+
let frontier = changedSymbols;
|
|
20
|
+
for (let d = 0; d < maxDepth; d++) {
|
|
21
|
+
const nextFrontier = [];
|
|
22
|
+
for (const sym of frontier) {
|
|
23
|
+
const symCallers = adjacency.callers.get(sym.id) ?? [];
|
|
24
|
+
for (const caller of symCallers) {
|
|
25
|
+
if (!affected.has(caller.id)) {
|
|
26
|
+
affected.set(caller.id, caller);
|
|
27
|
+
nextFrontier.push(caller);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (nextFrontier.length === 0)
|
|
32
|
+
break;
|
|
33
|
+
frontier = nextFrontier;
|
|
34
|
+
}
|
|
35
|
+
return [...affected.values()];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Build a file-level dependency graph scoped to relevant files only.
|
|
39
|
+
* Only includes changed files + their direct dependents (not the entire repo graph).
|
|
40
|
+
* Capped at MAX_DEPENDENCY_GRAPH_FILES to prevent 2.6M token responses.
|
|
41
|
+
*/
|
|
42
|
+
function buildFileDependencyGraph(index, adjacency, relevantFiles) {
|
|
43
|
+
const graph = {};
|
|
44
|
+
const symbolsByFile = new Map();
|
|
45
|
+
// Only index symbols from relevant files
|
|
46
|
+
for (const sym of index.symbols) {
|
|
47
|
+
if (!relevantFiles.has(sym.file))
|
|
48
|
+
continue;
|
|
49
|
+
const existing = symbolsByFile.get(sym.file);
|
|
50
|
+
if (existing)
|
|
51
|
+
existing.push(sym);
|
|
52
|
+
else
|
|
53
|
+
symbolsByFile.set(sym.file, [sym]);
|
|
54
|
+
}
|
|
55
|
+
let fileCount = 0;
|
|
56
|
+
for (const [file, fileSymbols] of symbolsByFile) {
|
|
57
|
+
if (fileCount >= MAX_DEPENDENCY_GRAPH_FILES)
|
|
58
|
+
break;
|
|
59
|
+
const dependentFiles = new Set();
|
|
60
|
+
for (const sym of fileSymbols) {
|
|
61
|
+
const symCallers = adjacency.callers.get(sym.id) ?? [];
|
|
62
|
+
for (const caller of symCallers) {
|
|
63
|
+
if (caller.file !== file) {
|
|
64
|
+
dependentFiles.add(caller.file);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (dependentFiles.size > 0) {
|
|
69
|
+
graph[file] = [...dependentFiles];
|
|
70
|
+
fileCount++;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return graph;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Run git diff to find changed files between two refs.
|
|
77
|
+
*/
|
|
78
|
+
function getChangedFiles(repoRoot, since, until) {
|
|
79
|
+
validateGitRef(since);
|
|
80
|
+
validateGitRef(until);
|
|
81
|
+
try {
|
|
82
|
+
// SEC-002: Use execFileSync (array form) to prevent shell injection — R-1 pattern
|
|
83
|
+
const output = execFileSync("git", ["diff", "--name-only", `${since}..${until}`], {
|
|
84
|
+
cwd: repoRoot,
|
|
85
|
+
encoding: "utf-8",
|
|
86
|
+
timeout: 10_000,
|
|
87
|
+
});
|
|
88
|
+
return output
|
|
89
|
+
.split("\n")
|
|
90
|
+
.map((line) => line.trim())
|
|
91
|
+
.filter((line) => line.length > 0);
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
95
|
+
throw new Error(`Git diff failed: ${message}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Analyze the impact of recent git changes on a repository.
|
|
100
|
+
* Finds changed files, affected symbols, and builds a dependency graph.
|
|
101
|
+
* By default, source code is stripped from symbols to keep output compact.
|
|
102
|
+
*/
|
|
103
|
+
export async function impactAnalysis(repo, since, depthOrOptions, until) {
|
|
104
|
+
const index = await getCodeIndex(repo);
|
|
105
|
+
if (!index) {
|
|
106
|
+
throw new Error(`Repository not found: ${repo}`);
|
|
107
|
+
}
|
|
108
|
+
// Support both legacy (depth: number, until: string) and new (options: ImpactOptions) signatures
|
|
109
|
+
let maxDepth;
|
|
110
|
+
let untilRef;
|
|
111
|
+
let includeSource;
|
|
112
|
+
if (typeof depthOrOptions === "object" && depthOrOptions !== null) {
|
|
113
|
+
maxDepth = depthOrOptions.depth ?? DEFAULT_IMPACT_DEPTH;
|
|
114
|
+
untilRef = depthOrOptions.until ?? until ?? "HEAD";
|
|
115
|
+
includeSource = depthOrOptions.include_source ?? false;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
maxDepth = depthOrOptions ?? DEFAULT_IMPACT_DEPTH;
|
|
119
|
+
untilRef = until ?? "HEAD";
|
|
120
|
+
includeSource = false;
|
|
121
|
+
}
|
|
122
|
+
const changedFiles = getChangedFiles(index.root, since, untilRef);
|
|
123
|
+
// Find all symbols in changed files — use Set for O(1) lookup (CQ17 fix)
|
|
124
|
+
const changedFileSet = new Set(changedFiles);
|
|
125
|
+
const changedSymbols = index.symbols.filter((s) => changedFileSet.has(s.file));
|
|
126
|
+
// Build adjacency index once, reuse for both affected + dependency graph
|
|
127
|
+
// Include test files for impact analysis (want to know which tests are affected)
|
|
128
|
+
const adjacency = buildAdjacencyIndex(index.symbols, false);
|
|
129
|
+
const allAffected = findAffectedSymbols(changedSymbols, adjacency, maxDepth);
|
|
130
|
+
// Cap affected symbols to prevent massive responses
|
|
131
|
+
const affectedSymbols = allAffected.slice(0, MAX_AFFECTED_SYMBOLS);
|
|
132
|
+
// Build dependency graph scoped to changed + affected files only (not entire repo)
|
|
133
|
+
const relevantFiles = new Set([
|
|
134
|
+
...changedFiles,
|
|
135
|
+
...affectedSymbols.map((s) => s.file),
|
|
136
|
+
]);
|
|
137
|
+
const dependencyGraph = buildFileDependencyGraph(index, adjacency, relevantFiles);
|
|
138
|
+
// Find affected test files: test files that import changed symbols/files
|
|
139
|
+
const affectedTests = findAffectedTests(changedFiles, affectedSymbols, index, adjacency);
|
|
140
|
+
// Calculate risk scores per changed file
|
|
141
|
+
const riskScores = calculateRiskScores(changedFiles, changedSymbols, affectedTests, adjacency);
|
|
142
|
+
return {
|
|
143
|
+
changed_files: changedFiles,
|
|
144
|
+
affected_symbols: includeSource
|
|
145
|
+
? affectedSymbols.map((s) => s.source && s.source.length > MAX_SOURCE_CHARS
|
|
146
|
+
? { ...s, source: s.source.slice(0, MAX_SOURCE_CHARS) + "..." }
|
|
147
|
+
: s)
|
|
148
|
+
: affectedSymbols.map(stripSource),
|
|
149
|
+
affected_tests: affectedTests,
|
|
150
|
+
risk_scores: riskScores,
|
|
151
|
+
dependency_graph: dependencyGraph,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Calculate risk scores for changed files.
|
|
156
|
+
* Score = f(callers, test_coverage, symbols_changed).
|
|
157
|
+
*/
|
|
158
|
+
function calculateRiskScores(changedFiles, changedSymbols, affectedTests, adjacency) {
|
|
159
|
+
// Pre-build symbol lookup per file (CQ17 fix: avoid .filter() per file)
|
|
160
|
+
const symbolsByFile = new Map();
|
|
161
|
+
for (const sym of changedSymbols) {
|
|
162
|
+
const existing = symbolsByFile.get(sym.file);
|
|
163
|
+
if (existing)
|
|
164
|
+
existing.push(sym);
|
|
165
|
+
else
|
|
166
|
+
symbolsByFile.set(sym.file, [sym]);
|
|
167
|
+
}
|
|
168
|
+
return changedFiles.map((file) => {
|
|
169
|
+
const fileSymbols = symbolsByFile.get(file) ?? [];
|
|
170
|
+
const symbolsChanged = fileSymbols.length;
|
|
171
|
+
// Count callers (other symbols that depend on symbols in this file)
|
|
172
|
+
let callers = 0;
|
|
173
|
+
for (const sym of fileSymbols) {
|
|
174
|
+
const symCallers = adjacency.callers.get(sym.id) ?? [];
|
|
175
|
+
callers += symCallers.filter((c) => c.file !== file).length;
|
|
176
|
+
}
|
|
177
|
+
// Count test files covering this file
|
|
178
|
+
const shortName = file.split("/").pop();
|
|
179
|
+
const baseName = file.replace(/\.ts$/, "");
|
|
180
|
+
const testCoverage = affectedTests.filter((t) => t.reason.includes(shortName) || t.test_file.includes(baseName)).length;
|
|
181
|
+
// Score: 0-100
|
|
182
|
+
// High callers + low test coverage = high risk
|
|
183
|
+
const callerWeight = Math.min(callers * 10, 40);
|
|
184
|
+
const coverageWeight = testCoverage > 0 ? 0 : 30; // No tests = +30 risk
|
|
185
|
+
const sizeWeight = Math.min(symbolsChanged * 5, 30);
|
|
186
|
+
const score = Math.min(100, callerWeight + coverageWeight + sizeWeight);
|
|
187
|
+
let risk;
|
|
188
|
+
if (score >= 70)
|
|
189
|
+
risk = "critical";
|
|
190
|
+
else if (score >= 50)
|
|
191
|
+
risk = "high";
|
|
192
|
+
else if (score >= 25)
|
|
193
|
+
risk = "medium";
|
|
194
|
+
else
|
|
195
|
+
risk = "low";
|
|
196
|
+
return { file, risk, score, callers, test_coverage: testCoverage, symbols_changed: symbolsChanged };
|
|
197
|
+
}).sort((a, b) => b.score - a.score);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Find test files that would be affected by the changed symbols/files.
|
|
201
|
+
* A test is affected if it imports (directly or transitively) any changed symbol.
|
|
202
|
+
*/
|
|
203
|
+
function findAffectedTests(changedFiles, affectedSymbols, index, adjacency) {
|
|
204
|
+
const affectedFileSet = new Set([
|
|
205
|
+
...changedFiles,
|
|
206
|
+
...affectedSymbols.map((s) => s.file),
|
|
207
|
+
]);
|
|
208
|
+
const tests = [];
|
|
209
|
+
const seenTestFiles = new Set();
|
|
210
|
+
// Direct: test files in changed files
|
|
211
|
+
for (const file of changedFiles) {
|
|
212
|
+
if (isTestFile(file) && !seenTestFiles.has(file)) {
|
|
213
|
+
seenTestFiles.add(file);
|
|
214
|
+
tests.push({ test_file: file, reason: "directly changed" });
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Indirect: test files that call/import symbols from affected files
|
|
218
|
+
for (const sym of index.symbols) {
|
|
219
|
+
if (!isTestFile(sym.file))
|
|
220
|
+
continue;
|
|
221
|
+
if (seenTestFiles.has(sym.file))
|
|
222
|
+
continue;
|
|
223
|
+
// Check if this test symbol calls anything in affected files
|
|
224
|
+
const callees = adjacency.callees.get(sym.id) ?? [];
|
|
225
|
+
for (const callee of callees) {
|
|
226
|
+
if (affectedFileSet.has(callee.file)) {
|
|
227
|
+
seenTestFiles.add(sym.file);
|
|
228
|
+
tests.push({
|
|
229
|
+
test_file: sym.file,
|
|
230
|
+
reason: `imports ${callee.name} (${callee.file.split("/").pop()})`,
|
|
231
|
+
});
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return tests;
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=impact-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact-tools.js","sourceRoot":"","sources":["../../src/tools/impact-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { type BM25Index } from "../search/bm25.js";
|
|
2
|
-
import
|
|
2
|
+
import { loadConfig } from "../config.js";
|
|
3
|
+
import type { CodeSymbol, CodeIndex, RepoMeta } from "../types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Embed symbols using the configured embedding provider.
|
|
6
|
+
* Non-fatal — BM25 search still works if embedding fails.
|
|
7
|
+
*/
|
|
8
|
+
export declare function embedSymbols(symbols: CodeSymbol[], indexPath: string, repoName: string, config: ReturnType<typeof loadConfig>): Promise<void>;
|
|
3
9
|
export interface IndexFolderResult {
|
|
4
10
|
repo: string;
|
|
5
11
|
root: string;
|
|
@@ -20,15 +26,50 @@ export declare function indexRepo(url: string, options?: {
|
|
|
20
26
|
branch?: string | undefined;
|
|
21
27
|
include_paths?: string[] | undefined;
|
|
22
28
|
}): Promise<IndexFolderResult>;
|
|
23
|
-
export
|
|
29
|
+
export interface RepoSummary {
|
|
30
|
+
name: string;
|
|
31
|
+
file_count: number;
|
|
32
|
+
symbol_count: number;
|
|
33
|
+
}
|
|
34
|
+
export declare function listAllRepos(options?: {
|
|
35
|
+
compact?: boolean;
|
|
36
|
+
}): Promise<RepoMeta[] | RepoSummary[] | string[]>;
|
|
24
37
|
export declare function invalidateCache(repoName: string): Promise<boolean>;
|
|
38
|
+
/**
|
|
39
|
+
* Re-index a single file instantly. Finds the repo by matching the file
|
|
40
|
+
* path against indexed repo roots. Updates symbols, BM25 index, and
|
|
41
|
+
* invalidates embedding cache — no full repo walk needed.
|
|
42
|
+
*/
|
|
43
|
+
export declare function indexFile(filePath: string): Promise<{
|
|
44
|
+
repo: string;
|
|
45
|
+
file: string;
|
|
46
|
+
symbol_count: number;
|
|
47
|
+
duration_ms: number;
|
|
48
|
+
skipped?: boolean;
|
|
49
|
+
secrets_warning?: string;
|
|
50
|
+
}>;
|
|
51
|
+
/**
|
|
52
|
+
* Ensure the index for a repo is fresh relative to git HEAD.
|
|
53
|
+
* Throttled to once per minute per repo. Reindexes changed files if HEAD moved.
|
|
54
|
+
* No-op for non-git repos.
|
|
55
|
+
*/
|
|
56
|
+
export declare function ensureIndexFresh(repoName: string): Promise<{
|
|
57
|
+
status: "fresh" | "refreshed" | "skipped";
|
|
58
|
+
files_updated?: number;
|
|
59
|
+
}>;
|
|
60
|
+
/** Reset freshness throttle cache. Exported for testing. */
|
|
61
|
+
export declare function resetFreshnessCache(): void;
|
|
25
62
|
/**
|
|
26
63
|
* Get the in-memory BM25 index for a repo.
|
|
27
|
-
* Loads from disk if not cached.
|
|
64
|
+
* Loads from disk if not cached. Auto-refreshes if git HEAD moved.
|
|
28
65
|
*/
|
|
29
66
|
export declare function getBM25Index(repoName: string): Promise<BM25Index | null>;
|
|
30
67
|
/**
|
|
31
68
|
* Get the code index for a repo from disk.
|
|
69
|
+
* Starts watcher if not running (lazy start after server restart).
|
|
70
|
+
*/
|
|
71
|
+
/**
|
|
72
|
+
* Get the code index for a repo from disk. Auto-refreshes if git HEAD moved.
|
|
32
73
|
*/
|
|
33
74
|
export declare function getCodeIndex(repoName: string): Promise<CodeIndex | null>;
|
|
34
75
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-tools.d.ts","sourceRoot":"","sources":["../../src/tools/index-tools.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index-tools.d.ts","sourceRoot":"","sources":["../../src/tools/index-tools.ts"],"names":[],"mappings":"AAUA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAKnE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAa,QAAQ,EAAa,MAAM,aAAa,CAAC;AAsKzF;;;GAGG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,UAAU,EAAE,EACrB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CAuBf;AAmFD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IACR,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACrC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC7B,GACA,OAAO,CAAC,iBAAiB,CAAC,CAyJ5B;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CACtC,GACA,OAAO,CAAC,iBAAiB,CAAC,CAgE5B;AA0FD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,YAAY,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,WAAW,EAAE,GAAG,MAAM,EAAE,CAAC,CAMlH;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA8BxE;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC,CAuED;AAUD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAChE,MAAM,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC,CAiED;AAED,4DAA4D;AAC5D,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAMD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAgB9E;AAED;;;GAGG;AACH;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAe9E;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,IAAI,CAAC,CAc3C"}
|