lsp-intelligence 0.1.2 → 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/README.md +48 -15
- package/dist/analysis/pattern/collectSearchFiles.d.ts +6 -0
- package/dist/analysis/pattern/collectSearchFiles.js +38 -0
- package/dist/analysis/pattern/collectSearchFiles.js.map +1 -0
- package/dist/analysis/pattern/runPatternSearch.d.ts +17 -0
- package/dist/analysis/pattern/runPatternSearch.js +65 -0
- package/dist/analysis/pattern/runPatternSearch.js.map +1 -0
- package/dist/analysis/ts/extractDeclarations.d.ts +7 -0
- package/dist/analysis/ts/extractDeclarations.js +93 -0
- package/dist/analysis/ts/extractDeclarations.js.map +1 -0
- package/dist/analysis/ts/extractUsages.d.ts +7 -0
- package/dist/analysis/ts/extractUsages.js +139 -0
- package/dist/analysis/ts/extractUsages.js.map +1 -0
- package/dist/analysis/ts/parseSourceFile.d.ts +11 -0
- package/dist/analysis/ts/parseSourceFile.js +24 -0
- package/dist/analysis/ts/parseSourceFile.js.map +1 -0
- package/dist/analysis/ts/reactState.d.ts +9 -0
- package/dist/analysis/ts/reactState.js +57 -0
- package/dist/analysis/ts/reactState.js.map +1 -0
- package/dist/analysis/ts/snippets.d.ts +14 -0
- package/dist/analysis/ts/snippets.js +29 -0
- package/dist/analysis/ts/snippets.js.map +1 -0
- package/dist/analysis/ts/structuralPredicates.d.ts +10 -0
- package/dist/analysis/ts/structuralPredicates.js +199 -0
- package/dist/analysis/ts/structuralPredicates.js.map +1 -0
- package/dist/ast/diffDeclarationShapes.d.ts +16 -0
- package/dist/ast/diffDeclarationShapes.js +179 -0
- package/dist/ast/diffDeclarationShapes.js.map +1 -0
- package/dist/ast/extractExportDeclarations.d.ts +21 -0
- package/dist/ast/extractExportDeclarations.js +218 -0
- package/dist/ast/extractExportDeclarations.js.map +1 -0
- package/dist/ast/findNodeAtPosition.d.ts +12 -0
- package/dist/ast/findNodeAtPosition.js +75 -0
- package/dist/ast/findNodeAtPosition.js.map +1 -0
- package/dist/ast/parseFile.d.ts +11 -0
- package/dist/ast/parseFile.js +46 -0
- package/dist/ast/parseFile.js.map +1 -0
- package/dist/engine/LspEngine.js +23 -1
- package/dist/engine/LspEngine.js.map +1 -1
- package/dist/engine/waitForDiagnostics.d.ts +7 -0
- package/dist/engine/waitForDiagnostics.js +16 -0
- package/dist/engine/waitForDiagnostics.js.map +1 -0
- package/dist/git/getBaseFileContent.d.ts +6 -0
- package/dist/git/getBaseFileContent.js +23 -0
- package/dist/git/getBaseFileContent.js.map +1 -0
- package/dist/git/getChangedFiles.d.ts +5 -0
- package/dist/git/getChangedFiles.js +27 -0
- package/dist/git/getChangedFiles.js.map +1 -0
- package/dist/git/getChangedHunks.d.ts +14 -0
- package/dist/git/getChangedHunks.js +56 -0
- package/dist/git/getChangedHunks.js.map +1 -0
- package/dist/git/getGitRoot.d.ts +15 -0
- package/dist/git/getGitRoot.js +33 -0
- package/dist/git/getGitRoot.js.map +1 -0
- package/dist/git/getMergeBase.d.ts +5 -0
- package/dist/git/getMergeBase.js +23 -0
- package/dist/git/getMergeBase.js.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/resolve/searchScope.d.ts +17 -0
- package/dist/resolve/searchScope.js +64 -0
- package/dist/resolve/searchScope.js.map +1 -0
- package/dist/resolve/targetResolver.d.ts +33 -0
- package/dist/resolve/targetResolver.js +84 -0
- package/dist/resolve/targetResolver.js.map +1 -0
- package/dist/search/adapters/config.d.ts +5 -0
- package/dist/search/adapters/config.js +56 -0
- package/dist/search/adapters/config.js.map +1 -0
- package/dist/search/adapters/http.d.ts +6 -0
- package/dist/search/adapters/http.js +58 -0
- package/dist/search/adapters/http.js.map +1 -0
- package/dist/search/adapters/react.d.ts +12 -0
- package/dist/search/adapters/react.js +92 -0
- package/dist/search/adapters/react.js.map +1 -0
- package/dist/search/adapters/registry.d.ts +6 -0
- package/dist/search/adapters/registry.js +20 -0
- package/dist/search/adapters/registry.js.map +1 -0
- package/dist/search/adapters/types.d.ts +5 -0
- package/dist/search/adapters/types.js +2 -0
- package/dist/search/adapters/types.js.map +1 -0
- package/dist/search/debug/trace.d.ts +6 -0
- package/dist/search/debug/trace.js +25 -0
- package/dist/search/debug/trace.js.map +1 -0
- package/dist/search/expand/graphExpansion.d.ts +16 -0
- package/dist/search/expand/graphExpansion.js +168 -0
- package/dist/search/expand/graphExpansion.js.map +1 -0
- package/dist/search/families/behaviorFamilies.d.ts +22 -0
- package/dist/search/families/behaviorFamilies.js +90 -0
- package/dist/search/families/behaviorFamilies.js.map +1 -0
- package/dist/search/fileKinds.d.ts +13 -0
- package/dist/search/fileKinds.js +74 -0
- package/dist/search/fileKinds.js.map +1 -0
- package/dist/search/index/configIndex.d.ts +6 -0
- package/dist/search/index/configIndex.js +196 -0
- package/dist/search/index/configIndex.js.map +1 -0
- package/dist/search/index/declarationIndex.d.ts +6 -0
- package/dist/search/index/declarationIndex.js +13 -0
- package/dist/search/index/declarationIndex.js.map +1 -0
- package/dist/search/index/docIndex.d.ts +7 -0
- package/dist/search/index/docIndex.js +116 -0
- package/dist/search/index/docIndex.js.map +1 -0
- package/dist/search/index/types.d.ts +1 -0
- package/dist/search/index/types.js +2 -0
- package/dist/search/index/types.js.map +1 -0
- package/dist/search/index/usageIndex.d.ts +6 -0
- package/dist/search/index/usageIndex.js +13 -0
- package/dist/search/index/usageIndex.js.map +1 -0
- package/dist/search/index/workspaceIndex.d.ts +14 -0
- package/dist/search/index/workspaceIndex.js +127 -0
- package/dist/search/index/workspaceIndex.js.map +1 -0
- package/dist/search/query/compileEffectiveSearchSpec.d.ts +24 -0
- package/dist/search/query/compileEffectiveSearchSpec.js +67 -0
- package/dist/search/query/compileEffectiveSearchSpec.js.map +1 -0
- package/dist/search/query/parseQuery.d.ts +10 -0
- package/dist/search/query/parseQuery.js +284 -0
- package/dist/search/query/parseQuery.js.map +1 -0
- package/dist/search/query/phraseRules.d.ts +10 -0
- package/dist/search/query/phraseRules.js +58 -0
- package/dist/search/query/phraseRules.js.map +1 -0
- package/dist/search/query/planQuery.d.ts +10 -0
- package/dist/search/query/planQuery.js +91 -0
- package/dist/search/query/planQuery.js.map +1 -0
- package/dist/search/ranking/assessConfidence.d.ts +6 -0
- package/dist/search/ranking/assessConfidence.js +31 -0
- package/dist/search/ranking/assessConfidence.js.map +1 -0
- package/dist/search/ranking/candidateIdentity.d.ts +21 -0
- package/dist/search/ranking/candidateIdentity.js +29 -0
- package/dist/search/ranking/candidateIdentity.js.map +1 -0
- package/dist/search/ranking/coalesceCandidates.d.ts +9 -0
- package/dist/search/ranking/coalesceCandidates.js +48 -0
- package/dist/search/ranking/coalesceCandidates.js.map +1 -0
- package/dist/search/ranking/fieldedTextRanker.d.ts +26 -0
- package/dist/search/ranking/fieldedTextRanker.js +79 -0
- package/dist/search/ranking/fieldedTextRanker.js.map +1 -0
- package/dist/search/ranking/mergeCandidates.d.ts +13 -0
- package/dist/search/ranking/mergeCandidates.js +85 -0
- package/dist/search/ranking/mergeCandidates.js.map +1 -0
- package/dist/search/ranking/rankCandidates.d.ts +12 -0
- package/dist/search/ranking/rankCandidates.js +106 -0
- package/dist/search/ranking/rankCandidates.js.map +1 -0
- package/dist/search/retrievers/behaviorRetriever.d.ts +7 -0
- package/dist/search/retrievers/behaviorRetriever.js +86 -0
- package/dist/search/retrievers/behaviorRetriever.js.map +1 -0
- package/dist/search/retrievers/configRetriever.d.ts +7 -0
- package/dist/search/retrievers/configRetriever.js +46 -0
- package/dist/search/retrievers/configRetriever.js.map +1 -0
- package/dist/search/retrievers/docRetriever.d.ts +7 -0
- package/dist/search/retrievers/docRetriever.js +46 -0
- package/dist/search/retrievers/docRetriever.js.map +1 -0
- package/dist/search/retrievers/identifierRetriever.d.ts +7 -0
- package/dist/search/retrievers/identifierRetriever.js +67 -0
- package/dist/search/retrievers/identifierRetriever.js.map +1 -0
- package/dist/search/retrievers/structuralRetriever.d.ts +9 -0
- package/dist/search/retrievers/structuralRetriever.js +104 -0
- package/dist/search/retrievers/structuralRetriever.js.map +1 -0
- package/dist/search/retrievers/textPatternRetriever.d.ts +7 -0
- package/dist/search/retrievers/textPatternRetriever.js +90 -0
- package/dist/search/retrievers/textPatternRetriever.js.map +1 -0
- package/dist/search/structural/locators/callLocator.d.ts +6 -0
- package/dist/search/structural/locators/callLocator.js +57 -0
- package/dist/search/structural/locators/callLocator.js.map +1 -0
- package/dist/search/structural/locators/declarationLocator.d.ts +6 -0
- package/dist/search/structural/locators/declarationLocator.js +57 -0
- package/dist/search/structural/locators/declarationLocator.js.map +1 -0
- package/dist/search/structural/locators/statementLocator.d.ts +6 -0
- package/dist/search/structural/locators/statementLocator.js +65 -0
- package/dist/search/structural/locators/statementLocator.js.map +1 -0
- package/dist/search/structural/locators/types.d.ts +12 -0
- package/dist/search/structural/locators/types.js +2 -0
- package/dist/search/structural/locators/types.js.map +1 -0
- package/dist/search/structural/selectLocators.d.ts +7 -0
- package/dist/search/structural/selectLocators.js +21 -0
- package/dist/search/structural/selectLocators.js.map +1 -0
- package/dist/search/types.d.ts +191 -0
- package/dist/search/types.js +11 -0
- package/dist/search/types.js.map +1 -0
- package/dist/tools/composites/apiGuard.d.ts +1 -0
- package/dist/tools/composites/apiGuard.js +172 -0
- package/dist/tools/composites/apiGuard.js.map +1 -0
- package/dist/tools/composites/explainError.js +3 -2
- package/dist/tools/composites/explainError.js.map +1 -1
- package/dist/tools/composites/findCode.d.ts +1 -0
- package/dist/tools/composites/findCode.js +145 -0
- package/dist/tools/composites/findCode.js.map +1 -0
- package/dist/tools/composites/findPattern.d.ts +5 -0
- package/dist/tools/composites/findPattern.js +41 -0
- package/dist/tools/composites/findPattern.js.map +1 -0
- package/dist/tools/composites/rootCauseTrace.d.ts +1 -0
- package/dist/tools/composites/rootCauseTrace.js +213 -0
- package/dist/tools/composites/rootCauseTrace.js.map +1 -0
- package/dist/tools/composites/semanticDiff.js +24 -77
- package/dist/tools/composites/semanticDiff.js.map +1 -1
- package/dist/tools/live/clearIndex.d.ts +1 -0
- package/dist/tools/live/clearIndex.js +19 -0
- package/dist/tools/live/clearIndex.js.map +1 -0
- package/dist/tools/live/liveDiagnostics.js +3 -2
- package/dist/tools/live/liveDiagnostics.js.map +1 -1
- package/dist/tools/primitives/callHierarchy.js +1 -1
- package/dist/tools/primitives/callHierarchy.js.map +1 -1
- package/dist/tools/primitives/diagnostics.js +2 -2
- package/dist/tools/primitives/diagnostics.js.map +1 -1
- package/dist/tools/registry.d.ts +10 -2
- package/dist/tools/registry.js +7 -2
- package/dist/tools/registry.js.map +1 -1
- package/package.json +11 -5
- package/dist/tools/primitives/typeHierarchy.d.ts +0 -1
- package/dist/tools/primitives/typeHierarchy.js +0 -55
- package/dist/tools/primitives/typeHierarchy.js.map +0 -1
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import { defineTool } from '../registry.js';
|
|
4
|
+
import { relativePath, uriToPath, pathToUri, fromPosition } from '../../engine/positions.js';
|
|
5
|
+
import { formatHover } from '../../format/markdown.js';
|
|
6
|
+
import { parseFile, parseSource } from '../../ast/parseFile.js';
|
|
7
|
+
import { classifyErrorSite } from '../../ast/findNodeAtPosition.js';
|
|
8
|
+
import { extractExportDeclarations } from '../../ast/extractExportDeclarations.js';
|
|
9
|
+
import { diffExportDeclarations } from '../../ast/diffDeclarationShapes.js';
|
|
10
|
+
import { getMergeBase } from '../../git/getMergeBase.js';
|
|
11
|
+
import { getBaseFileContent } from '../../git/getBaseFileContent.js';
|
|
12
|
+
import { fileChangedInBranch } from '../../git/getChangedHunks.js';
|
|
13
|
+
import { resolveTarget, pickDiagnostic } from '../../resolve/targetResolver.js';
|
|
14
|
+
import { DEFAULT_TIMEOUTS } from '../../engine/types.js';
|
|
15
|
+
export const rootCauseTrace = defineTool({
|
|
16
|
+
name: 'root_cause_trace',
|
|
17
|
+
description: 'Trace the root cause of a TypeScript error. Accepts symbol name, file+line, or file+diagnostic_code. Identifies the originating declaration change with evidence chain.',
|
|
18
|
+
schema: z.object({
|
|
19
|
+
symbol: z.string().optional().describe('Symbol at or near the error site'),
|
|
20
|
+
file_path: z.string().optional().describe('File containing the error'),
|
|
21
|
+
line: z.number().optional().describe('1-indexed line number'),
|
|
22
|
+
diagnostic_code: z.string().optional().describe('Diagnostic code, e.g. TS2345'),
|
|
23
|
+
base: z.string().optional().describe('Git base ref'),
|
|
24
|
+
}),
|
|
25
|
+
async handler(params, engine) {
|
|
26
|
+
const timeout = DEFAULT_TIMEOUTS.composite;
|
|
27
|
+
const warnings = [];
|
|
28
|
+
let astUsed = false;
|
|
29
|
+
// Step 1: Resolve target via shared resolver (symbol-first)
|
|
30
|
+
let target;
|
|
31
|
+
try {
|
|
32
|
+
target = await resolveTarget(params, engine);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
return { errorSite: {}, candidates: [], stats: { candidatesConsidered: 0, callerFilesChecked: 0, astUsed: false, baseUsed: false, partialResult: false }, warnings: [`Target resolution failed: ${err instanceof Error ? err.message : String(err)}`] };
|
|
36
|
+
}
|
|
37
|
+
const { filePath, uri, position: targetPosition, symbol: symbolName } = target;
|
|
38
|
+
// Step 2: Anchor the diagnostic (poll for readiness instead of fixed sleep)
|
|
39
|
+
const { waitForDiagnostics } = await import('../../engine/waitForDiagnostics.js');
|
|
40
|
+
await waitForDiagnostics(engine.docManager, uri, 800);
|
|
41
|
+
const allDiags = engine.docManager.getCachedDiagnostics(uri);
|
|
42
|
+
const targetDiag = pickDiagnostic(allDiags, targetPosition, params.diagnostic_code);
|
|
43
|
+
if (!targetDiag) {
|
|
44
|
+
return { errorSite: { symbol: symbolName }, candidates: [], stats: { candidatesConsidered: 0, callerFilesChecked: 0, astUsed: false, baseUsed: false, partialResult: false }, warnings: [`No error diagnostic in ${relativePath(filePath, engine.workspaceRoot)}`] };
|
|
45
|
+
}
|
|
46
|
+
const base = engine.gitAvailable ? getMergeBase(engine.workspaceRoot, params.base) : undefined;
|
|
47
|
+
const errorPosition = targetDiag.range.start;
|
|
48
|
+
const diagPos = fromPosition(errorPosition);
|
|
49
|
+
// Step 3: Error site — LSP + AST (with proper error handling)
|
|
50
|
+
const [hoverResult, defResult] = await Promise.all([
|
|
51
|
+
engine.request('textDocument/hover', { textDocument: { uri }, position: errorPosition }, timeout)
|
|
52
|
+
.catch((err) => { warnings.push(`Hover failed: ${err instanceof Error ? err.message : String(err)}`); return null; }),
|
|
53
|
+
engine.request('textDocument/definition', { textDocument: { uri }, position: errorPosition }, timeout)
|
|
54
|
+
.catch((err) => { warnings.push(`Definition lookup failed: ${err instanceof Error ? err.message : String(err)}`); return null; }),
|
|
55
|
+
]);
|
|
56
|
+
let localPattern = null;
|
|
57
|
+
try {
|
|
58
|
+
const root = parseFile(filePath);
|
|
59
|
+
if (root) {
|
|
60
|
+
astUsed = true;
|
|
61
|
+
localPattern = classifyErrorSite(root, errorPosition.line);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
warnings.push(`AST classification failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
66
|
+
}
|
|
67
|
+
const hoverSummary = hoverResult ? formatHover(hoverResult).substring(0, 200) : undefined;
|
|
68
|
+
const defLocation = defResult ? uriToPath(Array.isArray(defResult) ? defResult[0].uri : defResult.uri) : undefined;
|
|
69
|
+
const errorSite = {
|
|
70
|
+
symbol: symbolName,
|
|
71
|
+
definitionFile: defLocation ? relativePath(defLocation, engine.workspaceRoot) : undefined,
|
|
72
|
+
enclosingNodeKind: localPattern ?? undefined,
|
|
73
|
+
localPattern: localPattern ?? undefined,
|
|
74
|
+
hoverSummary,
|
|
75
|
+
};
|
|
76
|
+
// Step 4: Collect candidates
|
|
77
|
+
const candidates = [];
|
|
78
|
+
// Candidate A: definition site
|
|
79
|
+
if (defLocation && defLocation !== filePath) {
|
|
80
|
+
candidates.push(await buildCandidate(defLocation, 'definition-site', 5, base, engine, warnings));
|
|
81
|
+
}
|
|
82
|
+
// Candidate B: type definition
|
|
83
|
+
try {
|
|
84
|
+
const typeDef = await engine.request('textDocument/typeDefinition', { textDocument: { uri }, position: errorPosition }, timeout);
|
|
85
|
+
if (typeDef) {
|
|
86
|
+
const typeDefPath = uriToPath(Array.isArray(typeDef) ? typeDef[0].uri : typeDef.uri);
|
|
87
|
+
if (typeDefPath !== filePath && typeDefPath !== defLocation) {
|
|
88
|
+
candidates.push(await buildCandidate(typeDefPath, 'type-definition', 4, base, engine, warnings));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
warnings.push(`Type definition lookup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
94
|
+
}
|
|
95
|
+
// Candidate C: upstream callers (cap at 5)
|
|
96
|
+
let callerFilesChecked = 0;
|
|
97
|
+
try {
|
|
98
|
+
const items = await engine.request('textDocument/prepareCallHierarchy', { textDocument: { uri }, position: errorPosition }, timeout);
|
|
99
|
+
if (items?.length) {
|
|
100
|
+
const incomingCalls = await engine.request('callHierarchy/incomingCalls', { item: items[0] }, timeout);
|
|
101
|
+
for (const call of (incomingCalls ?? []).slice(0, 5)) {
|
|
102
|
+
const callerPath = uriToPath(call.from.uri);
|
|
103
|
+
if (callerPath === filePath)
|
|
104
|
+
continue;
|
|
105
|
+
try {
|
|
106
|
+
const changed = base ? fileChangedInBranch(callerPath, base, engine.workspaceRoot) : false;
|
|
107
|
+
await engine.prepareFile(callerPath);
|
|
108
|
+
await waitForDiagnostics(engine.docManager, pathToUri(callerPath), 500);
|
|
109
|
+
const callerDiags = engine.docManager.getCachedDiagnostics(pathToUri(callerPath)).filter((d) => d.severity === 1).length;
|
|
110
|
+
let score = 2;
|
|
111
|
+
const evidence = [`upstream-caller: ${relativePath(callerPath, engine.workspaceRoot)}`];
|
|
112
|
+
if (changed) {
|
|
113
|
+
score += 6;
|
|
114
|
+
evidence.push('changed-in-branch');
|
|
115
|
+
}
|
|
116
|
+
if (callerDiags > 0) {
|
|
117
|
+
score += 3;
|
|
118
|
+
evidence.push(`caller-has-errors: ${callerDiags}`);
|
|
119
|
+
}
|
|
120
|
+
candidates.push({
|
|
121
|
+
symbol: call.from.name, filePath: callerPath,
|
|
122
|
+
reason: changed ? `Upstream caller changed${callerDiags ? ` (${callerDiags} errors)` : ''}` : `Upstream caller${callerDiags ? ` with ${callerDiags} errors` : ''}`,
|
|
123
|
+
confidence: changed && callerDiags > 0 ? 'high' : 'low',
|
|
124
|
+
score, evidence, changedInBranch: changed, diagnosticsNearby: callerDiags,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
warnings.push(`Caller analysis failed for ${call.from.name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
129
|
+
}
|
|
130
|
+
callerFilesChecked++;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
warnings.push(`Call hierarchy failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
136
|
+
}
|
|
137
|
+
// Step 5: Rank + impact
|
|
138
|
+
const sorted = candidates.sort((a, b) => b.score - a.score);
|
|
139
|
+
const topCandidate = sorted[0];
|
|
140
|
+
if (topCandidate) {
|
|
141
|
+
try {
|
|
142
|
+
if (topCandidate.symbol) {
|
|
143
|
+
const resolved = await engine.resolveSymbol(topCandidate.symbol, topCandidate.filePath);
|
|
144
|
+
const refs = await engine.request('textDocument/references', { textDocument: { uri: resolved.uri }, position: resolved.position, context: { includeDeclaration: false } }, timeout);
|
|
145
|
+
if (refs)
|
|
146
|
+
topCandidate.impactSummary = { affectedFiles: new Set(refs.map((r) => uriToPath(r.uri))).size };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
warnings.push(`Impact analysis failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
151
|
+
}
|
|
152
|
+
if (localPattern === 'unhandled_enum_member')
|
|
153
|
+
topCandidate.suggestedFix = 'Add a case for the new enum member';
|
|
154
|
+
else if (localPattern === 'bad_call_argument')
|
|
155
|
+
topCandidate.suggestedFix = 'Check function signature — a parameter type may have changed';
|
|
156
|
+
else if (localPattern === 'missing_property_access')
|
|
157
|
+
topCandidate.suggestedFix = 'A property may have been removed or renamed';
|
|
158
|
+
else if (localPattern === 'incompatible_assignment')
|
|
159
|
+
topCandidate.suggestedFix = 'Source type may have changed — check the definition';
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
diagnostic: { code: targetDiag.code ? `TS${targetDiag.code}` : undefined, message: targetDiag.message, filePath, line: diagPos.line },
|
|
163
|
+
errorSite,
|
|
164
|
+
candidates: sorted,
|
|
165
|
+
topCandidate,
|
|
166
|
+
nextVerificationStep: topCandidate ? `Run impact_trace on ${relativePath(topCandidate.filePath, engine.workspaceRoot)}` : undefined,
|
|
167
|
+
stats: { candidatesConsidered: candidates.length, callerFilesChecked, astUsed, baseUsed: !!base, partialResult: callerFilesChecked >= 5 },
|
|
168
|
+
warnings,
|
|
169
|
+
};
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
async function buildCandidate(candidatePath, source, baseScore, base, engine, warnings) {
|
|
173
|
+
const changed = base ? fileChangedInBranch(candidatePath, base, engine.workspaceRoot) : false;
|
|
174
|
+
let score = baseScore;
|
|
175
|
+
const evidence = [`${source}: ${relativePath(candidatePath, engine.workspaceRoot)}`];
|
|
176
|
+
let structuralChange;
|
|
177
|
+
if (changed) {
|
|
178
|
+
score += 8;
|
|
179
|
+
evidence.push('changed-in-branch');
|
|
180
|
+
if (base) {
|
|
181
|
+
try {
|
|
182
|
+
const sc = classifyDeclarationChange(candidatePath, base, engine.workspaceRoot);
|
|
183
|
+
if (sc) {
|
|
184
|
+
score += 5;
|
|
185
|
+
evidence.push(`structural-change: ${sc}`);
|
|
186
|
+
structuralChange = sc;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
catch (err) {
|
|
190
|
+
warnings.push(`Structural classification failed for ${relativePath(candidatePath, engine.workspaceRoot)}: ${err instanceof Error ? err.message : String(err)}`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
filePath: candidatePath,
|
|
196
|
+
reason: changed ? `${source} changed in this branch` : `${source} — trace upstream`,
|
|
197
|
+
confidence: changed ? 'high' : source === 'definition-site' ? 'medium' : 'low',
|
|
198
|
+
score, evidence, changedInBranch: changed, structuralChange,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
function classifyDeclarationChange(filePath, base, workspaceRoot) {
|
|
202
|
+
const baseContent = getBaseFileContent(filePath, base, workspaceRoot);
|
|
203
|
+
if (!baseContent)
|
|
204
|
+
return null;
|
|
205
|
+
const currentContent = fs.readFileSync(filePath, 'utf-8');
|
|
206
|
+
const baseRoot = parseSource(baseContent, filePath.endsWith('.tsx'));
|
|
207
|
+
const currentRoot = parseSource(currentContent, filePath.endsWith('.tsx'));
|
|
208
|
+
const baseExports = extractExportDeclarations(baseRoot, baseContent);
|
|
209
|
+
const currentExports = extractExportDeclarations(currentRoot, currentContent);
|
|
210
|
+
const diffs = diffExportDeclarations(baseExports, currentExports);
|
|
211
|
+
return diffs.length > 0 ? diffs.map((d) => `${d.kind}: ${d.name}`).join(', ') : null;
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=rootCauseTrace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rootCauseTrace.js","sourceRoot":"","sources":["../../../src/tools/composites/rootCauseTrace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAwB,MAAM,iCAAiC,CAAC;AAEtG,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAkCzD,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;IACvC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,yKAAyK;IACtL,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QAC1E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QACtE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC7D,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC/E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;KACrD,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM;QAC1B,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC;QAC3C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,4DAA4D;QAC5D,IAAI,MAAM,CAAC;QACX,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,aAAa,CAAC,MAAyB,EAAE,MAAM,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,oBAAoB,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,6BAA6B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAiC,CAAC;QACzR,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;QAE/E,4EAA4E;QAC5E,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,oCAAoC,CAAC,CAAC;QAClF,MAAM,kBAAkB,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;QAEpF,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,oBAAoB,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,0BAA0B,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,EAAiC,CAAC;QACtS,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/F,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;QAC7C,MAAM,OAAO,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;QAE5C,8DAA8D;QAC9D,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACjD,MAAM,CAAC,OAAO,CAAe,oBAAoB,EAAE,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC;iBAC5G,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,iBAAiB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;YACvH,MAAM,CAAC,OAAO,CAA+B,yBAAyB,EAAE,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC;iBACjI,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,6BAA6B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;SACpI,CAAC,CAAC;QAEH,IAAI,YAAY,GAAkB,IAAI,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;YACjC,IAAI,IAAI,EAAE,CAAC;gBAAC,OAAO,GAAG,IAAI,CAAC;gBAAC,YAAY,GAAG,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC;QAC3F,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,8BAA8B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClG,CAAC;QAED,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1F,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEnH,MAAM,SAAS,GAAG;YAChB,MAAM,EAAE,UAAU;YAClB,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS;YACzF,iBAAiB,EAAE,YAAY,IAAI,SAAS;YAC5C,YAAY,EAAE,YAAY,IAAI,SAAS;YACvC,YAAY;SACb,CAAC;QAEF,6BAA6B;QAC7B,MAAM,UAAU,GAAyB,EAAE,CAAC;QAE5C,+BAA+B;QAC/B,IAAI,WAAW,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC5C,UAAU,CAAC,IAAI,CAAC,MAAM,cAAc,CAAC,WAAW,EAAE,iBAAiB,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;QACnG,CAAC;QAED,+BAA+B;QAC/B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAClC,6BAA6B,EAAE,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,OAAO,CAC3F,CAAC;YACF,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACrF,IAAI,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,WAAW,EAAE,CAAC;oBAC5D,UAAU,CAAC,IAAI,CAAC,MAAM,cAAc,CAAC,WAAW,EAAE,iBAAiB,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;gBACnG,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,kCAAkC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtG,CAAC;QAED,2CAA2C;QAC3C,IAAI,kBAAkB,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAChC,mCAAmC,EAAE,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,OAAO,CACjG,CAAC;YACF,IAAI,KAAK,EAAE,MAAM,EAAE,CAAC;gBAClB,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,OAAO,CACxC,6BAA6B,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAC3D,CAAC;gBACF,KAAK,MAAM,IAAI,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBACrD,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC5C,IAAI,UAAU,KAAK,QAAQ;wBAAE,SAAS;oBACtC,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;wBAC3F,MAAM,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;wBACrC,MAAM,kBAAkB,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC;wBACxE,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;wBAEzH,IAAI,KAAK,GAAG,CAAC,CAAC;wBACd,MAAM,QAAQ,GAAa,CAAC,oBAAoB,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;wBAClG,IAAI,OAAO,EAAE,CAAC;4BAAC,KAAK,IAAI,CAAC,CAAC;4BAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;wBAAC,CAAC;wBAChE,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;4BAAC,KAAK,IAAI,CAAC,CAAC;4BAAC,QAAQ,CAAC,IAAI,CAAC,sBAAsB,WAAW,EAAE,CAAC,CAAC;wBAAC,CAAC;wBAExF,UAAU,CAAC,IAAI,CAAC;4BACd,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU;4BAC5C,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,0BAA0B,WAAW,CAAC,CAAC,CAAC,KAAK,WAAW,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,WAAW,CAAC,CAAC,CAAC,SAAS,WAAW,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE;4BAClK,UAAU,EAAE,OAAO,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;4BACvD,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW;yBAC1E,CAAC,CAAC;oBACL,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,QAAQ,CAAC,IAAI,CAAC,8BAA8B,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACrH,CAAC;oBACD,kBAAkB,EAAE,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9F,CAAC;QAED,wBAAwB;QACxB,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAE/B,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;oBACxB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;oBACxF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAC/B,yBAAyB,EAAE,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,CACjJ,CAAC;oBACF,IAAI,IAAI;wBAAE,YAAY,CAAC,aAAa,GAAG,EAAE,aAAa,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC5G,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,CAAC,2BAA2B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/F,CAAC;YAED,IAAI,YAAY,KAAK,uBAAuB;gBAAE,YAAY,CAAC,YAAY,GAAG,oCAAoC,CAAC;iBAC1G,IAAI,YAAY,KAAK,mBAAmB;gBAAE,YAAY,CAAC,YAAY,GAAG,8DAA8D,CAAC;iBACrI,IAAI,YAAY,KAAK,yBAAyB;gBAAE,YAAY,CAAC,YAAY,GAAG,6CAA6C,CAAC;iBAC1H,IAAI,YAAY,KAAK,yBAAyB;gBAAE,YAAY,CAAC,YAAY,GAAG,qDAAqD,CAAC;QACzI,CAAC;QAED,OAAO;YACL,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;YACrI,SAAS;YACT,UAAU,EAAE,MAAM;YAClB,YAAY;YACZ,oBAAoB,EAAE,YAAY,CAAC,CAAC,CAAC,uBAAuB,YAAY,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;YACnI,KAAK,EAAE,EAAE,oBAAoB,EAAE,UAAU,CAAC,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,aAAa,EAAE,kBAAkB,IAAI,CAAC,EAAE;YACzI,QAAQ;SACsB,CAAC;IACnC,CAAC;CACF,CAAC,CAAC;AAEH,KAAK,UAAU,cAAc,CAC3B,aAAqB,EACrB,MAAc,EACd,SAAiB,EACjB,IAAwB,EACxB,MAAW,EACX,QAAkB;IAElB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9F,IAAI,KAAK,GAAG,SAAS,CAAC;IACtB,MAAM,QAAQ,GAAa,CAAC,GAAG,MAAM,KAAK,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAC/F,IAAI,gBAAoC,CAAC;IAEzC,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,IAAI,CAAC,CAAC;QACX,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACnC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,yBAAyB,CAAC,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;gBAChF,IAAI,EAAE,EAAE,CAAC;oBAAC,KAAK,IAAI,CAAC,CAAC;oBAAC,QAAQ,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;oBAAC,gBAAgB,GAAG,EAAE,CAAC;gBAAC,CAAC;YAC3F,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,CAAC,wCAAwC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClK,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,aAAa;QACvB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,yBAAyB,CAAC,CAAC,CAAC,GAAG,MAAM,mBAAmB;QACnF,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK;QAC9E,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,gBAAgB;KAC5D,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAAC,QAAgB,EAAE,IAAY,EAAE,aAAqB;IACtF,MAAM,WAAW,GAAG,kBAAkB,CAAC,QAAQ,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;IACtE,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,MAAM,WAAW,GAAG,WAAW,CAAC,cAAc,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,yBAAyB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACrE,MAAM,cAAc,GAAG,yBAAyB,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,sBAAsB,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAClE,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACvF,CAAC"}
|
|
@@ -1,32 +1,16 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { execSync } from 'child_process';
|
|
3
2
|
import { defineTool } from '../registry.js';
|
|
4
3
|
import { relativePath } from '../../engine/positions.js';
|
|
4
|
+
import { getMergeBase } from '../../git/getMergeBase.js';
|
|
5
|
+
import { getChangedHunks } from '../../git/getChangedHunks.js';
|
|
5
6
|
import { LspError, LspErrorCode, DEFAULT_TIMEOUTS } from '../../engine/types.js';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
// +++ b/path/to/file.ts
|
|
11
|
-
const fileMatch = line.match(/^\+\+\+ b\/(.+)/);
|
|
12
|
-
if (fileMatch) {
|
|
13
|
-
currentFile = `${workspaceRoot}/${fileMatch[1]}`;
|
|
14
|
-
continue;
|
|
15
|
-
}
|
|
16
|
-
// @@ -old,count +new,count @@
|
|
17
|
-
const hunkMatch = line.match(/^@@ .+ \+(\d+)(?:,(\d+))? @@/);
|
|
18
|
-
if (hunkMatch && currentFile.match(/\.tsx?$/)) {
|
|
19
|
-
const start = parseInt(hunkMatch[1]);
|
|
20
|
-
const count = parseInt(hunkMatch[2] ?? '1');
|
|
21
|
-
hunks.push({ file: currentFile, startLine: start, endLine: start + count - 1 });
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return hunks;
|
|
25
|
-
}
|
|
7
|
+
const SYMBOL_KINDS = {
|
|
8
|
+
5: 'Class', 6: 'Method', 10: 'Enum', 11: 'Interface',
|
|
9
|
+
12: 'Function', 13: 'Variable', 14: 'Constant',
|
|
10
|
+
};
|
|
26
11
|
function findSymbolAtLine(symbols, line0) {
|
|
27
12
|
for (const sym of symbols) {
|
|
28
13
|
if (line0 >= sym.range.start.line && line0 <= sym.range.end.line) {
|
|
29
|
-
// Check children for more specific match
|
|
30
14
|
if (sym.children) {
|
|
31
15
|
const child = findSymbolAtLine(sym.children, line0);
|
|
32
16
|
if (child)
|
|
@@ -37,51 +21,22 @@ function findSymbolAtLine(symbols, line0) {
|
|
|
37
21
|
}
|
|
38
22
|
return null;
|
|
39
23
|
}
|
|
40
|
-
const SYMBOL_KINDS = {
|
|
41
|
-
5: 'Class', 6: 'Method', 10: 'Enum', 11: 'Interface',
|
|
42
|
-
12: 'Function', 13: 'Variable', 14: 'Constant',
|
|
43
|
-
};
|
|
44
24
|
export const semanticDiff = defineTool({
|
|
45
25
|
name: 'semantic_diff',
|
|
46
|
-
description: 'Analyze git diff semantically: identify changed symbols and their blast radius
|
|
26
|
+
description: 'Analyze git diff semantically: identify changed symbols and their blast radius with risk classification. Requires git.',
|
|
47
27
|
schema: z.object({
|
|
48
|
-
base: z.string().optional().describe('Base ref to diff against. Defaults to merge-base with main
|
|
49
|
-
verbosity: z.enum(['summary', 'normal', 'detailed']).default('normal'),
|
|
28
|
+
base: z.string().optional().describe('Base ref to diff against. Defaults to merge-base with main.'),
|
|
50
29
|
}),
|
|
51
30
|
async handler(params, engine) {
|
|
52
31
|
if (!engine.gitAvailable) {
|
|
53
32
|
throw new LspError(LspErrorCode.GIT_UNAVAILABLE, 'Git is not available in this workspace.');
|
|
54
33
|
}
|
|
55
34
|
const timeout = DEFAULT_TIMEOUTS.composite;
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
if (
|
|
59
|
-
|
|
60
|
-
base = execSync('git merge-base HEAD main', { cwd: engine.workspaceRoot, encoding: 'utf-8' }).trim();
|
|
61
|
-
}
|
|
62
|
-
catch {
|
|
63
|
-
try {
|
|
64
|
-
base = execSync('git merge-base HEAD master', { cwd: engine.workspaceRoot, encoding: 'utf-8' }).trim();
|
|
65
|
-
}
|
|
66
|
-
catch {
|
|
67
|
-
base = 'HEAD~1';
|
|
68
|
-
}
|
|
69
|
-
}
|
|
35
|
+
const base = getMergeBase(engine.workspaceRoot, params.base);
|
|
36
|
+
const hunks = getChangedHunks(engine.workspaceRoot, base);
|
|
37
|
+
if (hunks.length === 0) {
|
|
38
|
+
return { base, changedSymbols: [], totalReferences: 0, stats: { hunksAnalyzed: 0, filesProcessed: 0 }, warnings: ['No TypeScript changes found'] };
|
|
70
39
|
}
|
|
71
|
-
// Get diff
|
|
72
|
-
let diff;
|
|
73
|
-
try {
|
|
74
|
-
diff = execSync(`git diff ${base} --unified=0`, { cwd: engine.workspaceRoot, encoding: 'utf-8' });
|
|
75
|
-
}
|
|
76
|
-
catch {
|
|
77
|
-
return 'No changes found or invalid base ref.';
|
|
78
|
-
}
|
|
79
|
-
if (!diff.trim())
|
|
80
|
-
return 'No changes found.';
|
|
81
|
-
const hunks = parseDiffHunks(diff, engine.workspaceRoot);
|
|
82
|
-
if (hunks.length === 0)
|
|
83
|
-
return 'No TypeScript file changes found.';
|
|
84
|
-
// For each changed hunk, identify the symbol
|
|
85
40
|
const changedSymbols = [];
|
|
86
41
|
const processedFiles = new Set();
|
|
87
42
|
for (const hunk of hunks) {
|
|
@@ -91,21 +46,21 @@ export const semanticDiff = defineTool({
|
|
|
91
46
|
const { uri } = await engine.prepareFile(hunk.file);
|
|
92
47
|
const symbols = await engine.request('textDocument/documentSymbol', { textDocument: { uri } }, timeout);
|
|
93
48
|
if (symbols) {
|
|
94
|
-
// Find symbols affected by this hunk
|
|
95
49
|
for (let line = hunk.startLine - 1; line <= hunk.endLine - 1; line++) {
|
|
96
50
|
const sym = findSymbolAtLine(symbols, line);
|
|
97
|
-
if (sym && !changedSymbols.some((s) => s.name === sym.name && s.file === hunk.file)) {
|
|
98
|
-
// Get reference count for blast radius
|
|
51
|
+
if (sym && !changedSymbols.some((s) => s.name === sym.name && s.file === relativePath(hunk.file, engine.workspaceRoot))) {
|
|
99
52
|
const refs = await engine.request('textDocument/references', {
|
|
100
53
|
textDocument: { uri },
|
|
101
54
|
position: sym.selectionRange.start,
|
|
102
55
|
context: { includeDeclaration: false },
|
|
103
56
|
}, timeout).catch(() => null);
|
|
57
|
+
const refCount = refs?.length ?? 0;
|
|
104
58
|
changedSymbols.push({
|
|
105
59
|
name: sym.name,
|
|
106
60
|
kind: SYMBOL_KINDS[sym.kind] ?? 'Unknown',
|
|
107
61
|
file: relativePath(hunk.file, engine.workspaceRoot),
|
|
108
|
-
refCount
|
|
62
|
+
refCount,
|
|
63
|
+
risk: refCount > 10 ? 'high' : refCount > 3 ? 'medium' : 'low',
|
|
109
64
|
});
|
|
110
65
|
}
|
|
111
66
|
}
|
|
@@ -114,22 +69,14 @@ export const semanticDiff = defineTool({
|
|
|
114
69
|
catch { }
|
|
115
70
|
processedFiles.add(hunk.file);
|
|
116
71
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
if (sym.refCount > 0) {
|
|
126
|
-
lines.push(` → ${sym.refCount} references may need updating`);
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
lines.push(` → No external references (safe to change)`);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
return lines.join('\n');
|
|
72
|
+
const totalReferences = changedSymbols.reduce((s, c) => s + c.refCount, 0);
|
|
73
|
+
return {
|
|
74
|
+
base,
|
|
75
|
+
changedSymbols: changedSymbols.sort((a, b) => b.refCount - a.refCount),
|
|
76
|
+
totalReferences,
|
|
77
|
+
stats: { hunksAnalyzed: hunks.length, filesProcessed: processedFiles.size },
|
|
78
|
+
warnings: [],
|
|
79
|
+
};
|
|
133
80
|
},
|
|
134
81
|
});
|
|
135
82
|
//# sourceMappingURL=semanticDiff.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semanticDiff.js","sourceRoot":"","sources":["../../../src/tools/composites/semanticDiff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"semanticDiff.js","sourceRoot":"","sources":["../../../src/tools/composites/semanticDiff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const clearIndex: import("../registry.js").ToolDef;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { defineTool } from '../registry.js';
|
|
3
|
+
import { clearWorkspaceIndex } from '../../search/index/workspaceIndex.js';
|
|
4
|
+
export const clearIndex = defineTool({
|
|
5
|
+
name: 'clear_index',
|
|
6
|
+
description: 'Clear the in-memory workspace index. The next find_code or find_pattern call will rebuild it from scratch. Use after changing exclusion rules or when results seem stale.',
|
|
7
|
+
schema: z.object({}),
|
|
8
|
+
async handler(_params, _engine) {
|
|
9
|
+
const { cleared, hadEntries } = clearWorkspaceIndex();
|
|
10
|
+
return {
|
|
11
|
+
cleared,
|
|
12
|
+
previousFiles: hadEntries,
|
|
13
|
+
message: hadEntries > 0
|
|
14
|
+
? `Index cleared (had ${hadEntries} files). Next query will rebuild.`
|
|
15
|
+
: 'Index was already empty.',
|
|
16
|
+
};
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=clearIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clearIndex.js","sourceRoot":"","sources":["../../../src/tools/live/clearIndex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAE3E,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;IACnC,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,2KAA2K;IAC7K,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO;QAC5B,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,mBAAmB,EAAE,CAAC;QACtD,OAAO;YACL,OAAO;YACP,aAAa,EAAE,UAAU;YACzB,OAAO,EAAE,UAAU,GAAG,CAAC;gBACrB,CAAC,CAAC,sBAAsB,UAAU,mCAAmC;gBACrE,CAAC,CAAC,0BAA0B;SAC/B,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -15,9 +15,10 @@ export const liveDiagnostics = defineTool({
|
|
|
15
15
|
if (!engine.connection)
|
|
16
16
|
return 'Error: LSP connection not available.';
|
|
17
17
|
await engine.docManager.refreshFromDisk(params.file_path, engine.connection);
|
|
18
|
-
// Wait for TSServer to process changes
|
|
19
|
-
await new Promise((r) => setTimeout(r, 1000));
|
|
18
|
+
// Wait for TSServer to process changes (poll instead of fixed sleep)
|
|
20
19
|
const uri = `file://${params.file_path}`;
|
|
20
|
+
const { waitForDiagnostics } = await import('../../engine/waitForDiagnostics.js');
|
|
21
|
+
await waitForDiagnostics(engine.docManager, uri, 1500);
|
|
21
22
|
const diags = engine.docManager.getCachedDiagnostics(uri);
|
|
22
23
|
const rel = relativePath(params.file_path, engine.workspaceRoot);
|
|
23
24
|
if (diags.length === 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"liveDiagnostics.js","sourceRoot":"","sources":["../../../src/tools/live/liveDiagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEvE,MAAM,QAAQ,GAA2B,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;AAE5F,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;IACxC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,gIAAgI;IAC7I,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;KAC9D,CAAC;IACF,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE;IACpC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM;QAC1B,2CAA2C;QAC3C,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAE,MAAc,CAAC,UAAU;YAAE,OAAO,sCAAsC,CAAC;QAC/E,MAAM,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,EAAG,MAAc,CAAC,UAAU,CAAC,CAAC;QAEtF,
|
|
1
|
+
{"version":3,"file":"liveDiagnostics.js","sourceRoot":"","sources":["../../../src/tools/live/liveDiagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,7 +27,7 @@ export const callHierarchy = defineTool({
|
|
|
27
27
|
return 'Error: Provide either symbol name or file_path + line + column.';
|
|
28
28
|
}
|
|
29
29
|
// Step 1: Prepare call hierarchy
|
|
30
|
-
const items = await engine.request('textDocument/prepareCallHierarchy', { textDocument: { uri }, position });
|
|
30
|
+
const items = await engine.request('textDocument/prepareCallHierarchy', { textDocument: { uri }, position }, 20_000);
|
|
31
31
|
if (!items || items.length === 0)
|
|
32
32
|
return 'No call hierarchy available for this symbol.';
|
|
33
33
|
const item = items[0];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callHierarchy.js","sourceRoot":"","sources":["../../../src/tools/primitives/callHierarchy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAG9F,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;IACtC,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,4HAA4H;IACzI,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;QACzF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAC/D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC7D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACjE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,uDAAuD,CAAC;KAClI,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM;QAC1B,IAAI,GAAW,EAAE,QAA6C,CAAC;QAC/D,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7E,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;YAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACnD,CAAC;aAAM,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAC5D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC5D,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;YAAC,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,OAAO,iEAAiE,CAAC;QAC3E,CAAC;QAED,iCAAiC;QACjC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAChC,mCAAmC,EAAE,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"callHierarchy.js","sourceRoot":"","sources":["../../../src/tools/primitives/callHierarchy.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,8 +10,8 @@ export const diagnostics = defineTool({
|
|
|
10
10
|
}),
|
|
11
11
|
async handler(params, engine) {
|
|
12
12
|
const { uri } = await engine.prepareFile(params.file_path);
|
|
13
|
-
|
|
14
|
-
await
|
|
13
|
+
const { waitForDiagnostics } = await import('../../engine/waitForDiagnostics.js');
|
|
14
|
+
await waitForDiagnostics(engine.docManager, uri, 800);
|
|
15
15
|
const diags = engine.docManager.getCachedDiagnostics(uri);
|
|
16
16
|
if (diags.length === 0) {
|
|
17
17
|
const rel = relativePath(params.file_path, engine.workspaceRoot);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../src/tools/primitives/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAa,YAAY,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAElF,MAAM,QAAQ,GAA2B,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;AAE5F,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;IACpC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,oGAAoG;IACjH,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;KACrD,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM;QAC1B,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC3D,
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../src/tools/primitives/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAa,YAAY,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAElF,MAAM,QAAQ,GAA2B,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;AAE5F,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;IACpC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,oGAAoG;IACjH,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;KACrD,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM;QAC1B,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC3D,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,oCAAoC,CAAC,CAAC;QAClF,MAAM,kBAAkB,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAE1D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;YACjE,OAAO,sBAAsB,GAAG,kBAAkB,CAAC;QACrD,CAAC;QAED,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,CAAC,kBAAkB,GAAG,OAAO,KAAK,CAAC,MAAM,WAAW,CAAC,CAAC;QACpE,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9E,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,OAAO,QAAQ,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC,CAAC,IAAI;gBAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC;QAC1D,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF,CAAC,CAAC"}
|
package/dist/tools/registry.d.ts
CHANGED
|
@@ -2,18 +2,26 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
2
2
|
import type { ZodRawShape } from 'zod';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import type { LspEngine } from '../engine/LspEngine.js';
|
|
5
|
+
/**
|
|
6
|
+
* Tool result: either a formatted string or a structured object.
|
|
7
|
+
* Structured objects are JSON-serialized for the MCP response.
|
|
8
|
+
* Skills and formatting layers consume the structured data.
|
|
9
|
+
*/
|
|
10
|
+
export type ToolResult = string | {
|
|
11
|
+
[key: string]: any;
|
|
12
|
+
};
|
|
5
13
|
export interface ToolDef {
|
|
6
14
|
name: string;
|
|
7
15
|
description: string;
|
|
8
16
|
schema: z.ZodObject<any>;
|
|
9
17
|
annotations?: Record<string, boolean>;
|
|
10
|
-
handler: (params: any, engine: LspEngine) => Promise<
|
|
18
|
+
handler: (params: any, engine: LspEngine) => Promise<ToolResult>;
|
|
11
19
|
}
|
|
12
20
|
export declare function defineTool<S extends ZodRawShape>(def: {
|
|
13
21
|
name: string;
|
|
14
22
|
description: string;
|
|
15
23
|
schema: z.ZodObject<S>;
|
|
16
24
|
annotations?: Record<string, boolean>;
|
|
17
|
-
handler: (params: z.infer<z.ZodObject<S>>, engine: LspEngine) => Promise<
|
|
25
|
+
handler: (params: z.infer<z.ZodObject<S>>, engine: LspEngine) => Promise<ToolResult>;
|
|
18
26
|
}): ToolDef;
|
|
19
27
|
export declare function registerAll(server: McpServer, engine: LspEngine, tools: ToolDef[]): void;
|
package/dist/tools/registry.js
CHANGED
|
@@ -6,8 +6,13 @@ export function registerAll(server, engine, tools) {
|
|
|
6
6
|
server.tool(tool.name, tool.description, tool.schema.shape, async (params) => {
|
|
7
7
|
try {
|
|
8
8
|
const parsed = tool.schema.parse(params);
|
|
9
|
-
const
|
|
10
|
-
|
|
9
|
+
const result = await tool.handler(parsed, engine);
|
|
10
|
+
// Structured object → JSON text
|
|
11
|
+
if (typeof result === 'object' && result !== null) {
|
|
12
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
13
|
+
}
|
|
14
|
+
// String → pass through (backward compat)
|
|
15
|
+
return { content: [{ type: 'text', text: result }] };
|
|
11
16
|
}
|
|
12
17
|
catch (err) {
|
|
13
18
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAoBA,MAAM,UAAU,UAAU,CAAwB,GAMjD;IACC,OAAO,GAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAiB,EAAE,MAAiB,EAAE,KAAgB;IAChF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,MAAM,CAAC,KAAK,EACjB,KAAK,EAAE,MAA+B,EAAE,EAAE;YACxC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAElD,gCAAgC;gBAChC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBAClD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBACzF,CAAC;gBAED,0CAA0C;gBAC1C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;YAChE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACxF,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lsp-intelligence",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "LSP-powered code intelligence MCP server for AI coding agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -8,22 +8,28 @@
|
|
|
8
8
|
},
|
|
9
9
|
"files": [
|
|
10
10
|
"dist",
|
|
11
|
+
".npmrc",
|
|
11
12
|
"README.md",
|
|
12
13
|
"LICENSE"
|
|
13
14
|
],
|
|
14
15
|
"scripts": {
|
|
15
|
-
"
|
|
16
|
-
"
|
|
16
|
+
"clean": "rm -rf dist",
|
|
17
|
+
"build": "rm -rf dist && tsc",
|
|
18
|
+
"prepublishOnly": "rm -rf dist && tsc",
|
|
17
19
|
"start": "tsx src/index.ts",
|
|
18
20
|
"test": "vitest run",
|
|
19
21
|
"test:watch": "vitest",
|
|
20
|
-
"typecheck": "tsc --noEmit"
|
|
22
|
+
"typecheck": "tsc --noEmit",
|
|
23
|
+
"bench": "tsx benchmarks/run.ts",
|
|
24
|
+
"bench:e2e": "tsx benchmarks/run.ts --e2e"
|
|
21
25
|
},
|
|
22
26
|
"dependencies": {
|
|
27
|
+
"@ast-grep/napi": "^0.42.0",
|
|
23
28
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
29
|
+
"typescript": "^5.4.0",
|
|
30
|
+
"typescript-language-server": "^4.0.0",
|
|
24
31
|
"vscode-jsonrpc": "^8.2.0",
|
|
25
32
|
"vscode-languageserver-protocol": "^3.17.5",
|
|
26
|
-
"typescript-language-server": "^4.0.0",
|
|
27
33
|
"zod": "^3.25.0"
|
|
28
34
|
},
|
|
29
35
|
"devDependencies": {
|