lsp-intelligence 0.2.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/README.md +41 -13
- package/dist/analysis/pattern/collectSearchFiles.d.ts +2 -1
- package/dist/analysis/pattern/collectSearchFiles.js +6 -6
- package/dist/analysis/pattern/collectSearchFiles.js.map +1 -1
- package/dist/analysis/pattern/runPatternSearch.d.ts +1 -1
- package/dist/analysis/pattern/runPatternSearch.js +4 -2
- package/dist/analysis/pattern/runPatternSearch.js.map +1 -1
- package/dist/analysis/ts/extractUsages.js +19 -0
- package/dist/analysis/ts/extractUsages.js.map +1 -1
- package/dist/analysis/ts/parseSourceFile.d.ts +2 -1
- package/dist/analysis/ts/parseSourceFile.js +5 -9
- package/dist/analysis/ts/parseSourceFile.js.map +1 -1
- 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/structuralPredicates.js +31 -2
- package/dist/analysis/ts/structuralPredicates.js.map +1 -1
- package/dist/ast/parseFile.d.ts +4 -3
- package/dist/ast/parseFile.js +22 -5
- package/dist/ast/parseFile.js.map +1 -1
- package/dist/engine/LspEngine.js +23 -1
- package/dist/engine/LspEngine.js.map +1 -1
- package/dist/git/getBaseFileContent.d.ts +1 -0
- package/dist/git/getBaseFileContent.js +10 -3
- package/dist/git/getBaseFileContent.js.map +1 -1
- package/dist/git/getChangedFiles.d.ts +2 -1
- package/dist/git/getChangedFiles.js +11 -5
- package/dist/git/getChangedFiles.js.map +1 -1
- package/dist/git/getChangedHunks.d.ts +1 -0
- package/dist/git/getChangedHunks.js +15 -10
- package/dist/git/getChangedHunks.js.map +1 -1
- 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/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/resolve/searchScope.d.ts +8 -2
- package/dist/resolve/searchScope.js +26 -14
- package/dist/resolve/searchScope.js.map +1 -1
- 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/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/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/workspaceIndex.d.ts +6 -0
- package/dist/search/index/workspaceIndex.js +50 -14
- package/dist/search/index/workspaceIndex.js.map +1 -1
- 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 +1 -0
- package/dist/search/query/parseQuery.js +40 -0
- package/dist/search/query/parseQuery.js.map +1 -1
- 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 +4 -3
- package/dist/search/query/planQuery.js +39 -6
- package/dist/search/query/planQuery.js.map +1 -1
- package/dist/search/ranking/assessConfidence.js +6 -0
- package/dist/search/ranking/assessConfidence.js.map +1 -1
- 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 +3 -0
- package/dist/search/ranking/mergeCandidates.js +39 -0
- package/dist/search/ranking/mergeCandidates.js.map +1 -1
- package/dist/search/ranking/rankCandidates.d.ts +1 -1
- package/dist/search/ranking/rankCandidates.js +51 -3
- package/dist/search/ranking/rankCandidates.js.map +1 -1
- package/dist/search/retrievers/behaviorRetriever.d.ts +3 -3
- package/dist/search/retrievers/behaviorRetriever.js +64 -69
- package/dist/search/retrievers/behaviorRetriever.js.map +1 -1
- 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 +3 -3
- package/dist/search/retrievers/identifierRetriever.js +7 -6
- package/dist/search/retrievers/identifierRetriever.js.map +1 -1
- package/dist/search/retrievers/structuralRetriever.d.ts +4 -6
- package/dist/search/retrievers/structuralRetriever.js +47 -84
- package/dist/search/retrievers/structuralRetriever.js.map +1 -1
- 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 +77 -7
- package/dist/search/types.js.map +1 -1
- package/dist/tools/composites/apiGuard.js +6 -28
- package/dist/tools/composites/apiGuard.js.map +1 -1
- package/dist/tools/composites/findCode.js +92 -15
- package/dist/tools/composites/findCode.js.map +1 -1
- package/dist/tools/composites/findPattern.js +1 -1
- package/dist/tools/composites/findPattern.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/primitives/callHierarchy.js +1 -1
- package/dist/tools/primitives/callHierarchy.js.map +1 -1
- package/package.json +4 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeCandidates.js","sourceRoot":"","sources":["../../../src/search/ranking/mergeCandidates.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"mergeCandidates.js","sourceRoot":"","sources":["../../../src/search/ranking/mergeCandidates.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import type { CodeCandidate, QueryIR, SearchPlan, SearchScope } from '../types.j
|
|
|
2
2
|
import type { LspEngine } from '../../engine/LspEngine.js';
|
|
3
3
|
/**
|
|
4
4
|
* Rank candidates with mode-aware scoring + LSP enrichment.
|
|
5
|
-
*
|
|
5
|
+
* First filters excluded paths, then applies penalties, enriches top candidates.
|
|
6
6
|
*/
|
|
7
7
|
export declare function rankCandidates(candidates: CodeCandidate[], ctx: {
|
|
8
8
|
ir: QueryIR;
|
|
@@ -1,15 +1,33 @@
|
|
|
1
1
|
import { formatHover } from '../../format/markdown.js';
|
|
2
2
|
import { relativePath } from '../../engine/positions.js';
|
|
3
|
+
import { shouldSkipDir, shouldSkipFile } from '../fileKinds.js';
|
|
4
|
+
import * as path from 'path';
|
|
3
5
|
const TEST_PATTERN = /\.(spec|test|stories)\.(ts|tsx|js|jsx)$/;
|
|
4
6
|
const GENERATED_PATTERN = /\/(dist|es|build|generated|__generated__|\.cache)\//;
|
|
5
7
|
const DEMO_PATTERN = /\/(demo|example|storybook|stories|fixtures)\//;
|
|
8
|
+
/**
|
|
9
|
+
* Check if a candidate's file path should be excluded.
|
|
10
|
+
* Applied at ranking time as a safety net — catches files from stale indexes.
|
|
11
|
+
*/
|
|
12
|
+
function isExcludedPath(filePath) {
|
|
13
|
+
const parts = filePath.split(path.sep);
|
|
14
|
+
for (const part of parts) {
|
|
15
|
+
if (shouldSkipDir(part))
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
if (shouldSkipFile(filePath))
|
|
19
|
+
return true;
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
6
22
|
/**
|
|
7
23
|
* Rank candidates with mode-aware scoring + LSP enrichment.
|
|
8
|
-
*
|
|
24
|
+
* First filters excluded paths, then applies penalties, enriches top candidates.
|
|
9
25
|
*/
|
|
10
26
|
export async function rankCandidates(candidates, ctx) {
|
|
27
|
+
// Post-filter: remove candidates from excluded paths (safety net for stale indexes)
|
|
28
|
+
const clean = candidates.filter((c) => !isExcludedPath(c.filePath));
|
|
11
29
|
// Apply penalties
|
|
12
|
-
for (const c of
|
|
30
|
+
for (const c of clean) {
|
|
13
31
|
if (TEST_PATTERN.test(c.filePath)) {
|
|
14
32
|
c.score -= 3;
|
|
15
33
|
c.evidence.push('penalty: test-file');
|
|
@@ -27,8 +45,38 @@ export async function rankCandidates(candidates, ctx) {
|
|
|
27
45
|
c.evidence.push('penalty: declaration-file');
|
|
28
46
|
}
|
|
29
47
|
}
|
|
48
|
+
// Recipe-aware scoring: boost candidates from multiple backends, downweight identifier-only when recipes exist
|
|
49
|
+
const hasRecipes = ctx.ir.recipes.length > 0;
|
|
50
|
+
for (const c of clean) {
|
|
51
|
+
// Multi-source bonus
|
|
52
|
+
if (c.sources.length >= 3) {
|
|
53
|
+
c.score += 3;
|
|
54
|
+
c.evidence.push('multi-source-bonus');
|
|
55
|
+
}
|
|
56
|
+
// Recipe score boost
|
|
57
|
+
for (const recipe of ctx.ir.recipes) {
|
|
58
|
+
if (recipe.scoreBoost && recipe.scoreBoost > 0) {
|
|
59
|
+
// Boost if candidate matches recipe's identifiers
|
|
60
|
+
const recipeIds = recipe.exactIdentifiers ?? [];
|
|
61
|
+
if (recipeIds.length === 0 || recipeIds.some((id) => c.matchedIdentifier === id || c.symbol === id)) {
|
|
62
|
+
// Extra boost if candidate has structural evidence matching recipe
|
|
63
|
+
const hasStructural = c.sources.includes('structural');
|
|
64
|
+
const hasRegex = c.evidence.some((e) => e.startsWith('regex-match'));
|
|
65
|
+
if (hasStructural || hasRegex) {
|
|
66
|
+
c.score += recipe.scoreBoost;
|
|
67
|
+
c.evidence.push(`recipe-boost: ${recipe.id}(+${recipe.scoreBoost})`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Downweight identifier-only hits when recipes demand richer evidence
|
|
73
|
+
if (hasRecipes && c.sources.length === 1 && c.sources[0] === 'identifier') {
|
|
74
|
+
c.score -= 2;
|
|
75
|
+
c.evidence.push('penalty: identifier-only-with-recipe');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
30
78
|
// Filter out negative scores
|
|
31
|
-
const filtered =
|
|
79
|
+
const filtered = clean.filter((c) => c.score > 0);
|
|
32
80
|
// Sort by score
|
|
33
81
|
filtered.sort((a, b) => b.score - a.score);
|
|
34
82
|
// LSP enrichment for top candidates (use actual match position, not line 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rankCandidates.js","sourceRoot":"","sources":["../../../src/search/ranking/rankCandidates.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"rankCandidates.js","sourceRoot":"","sources":["../../../src/search/ranking/rankCandidates.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { QueryIR, SearchScope, WorkspaceIndex, CodeCandidate } from '../types.js';
|
|
2
|
+
import type { EffectiveSearchSpec } from '../query/compileEffectiveSearchSpec.js';
|
|
2
3
|
/**
|
|
3
4
|
* Retrieve declaration-oriented candidates based on behavior family matching.
|
|
4
|
-
* Uses
|
|
5
|
-
* Does NOT use exact identifier matching — that's the identifier retriever's job.
|
|
5
|
+
* Uses the compiled spec's behaviorTerms (merged from parser + recipes).
|
|
6
6
|
*/
|
|
7
|
-
export declare function retrieveBehaviorCandidates(ir: QueryIR, scope: SearchScope, index: WorkspaceIndex): CodeCandidate[];
|
|
7
|
+
export declare function retrieveBehaviorCandidates(ir: QueryIR, scope: SearchScope, index: WorkspaceIndex, spec?: EffectiveSearchSpec): CodeCandidate[];
|
|
@@ -1,90 +1,85 @@
|
|
|
1
1
|
import { BEHAVIOR_FAMILIES } from '../families/behaviorFamilies.js';
|
|
2
|
+
import { scoreFieldedQuery } from '../ranking/fieldedTextRanker.js';
|
|
2
3
|
import { buildSnippetFromFile } from '../../analysis/ts/snippets.js';
|
|
3
|
-
/**
|
|
4
|
-
* Prefix-based partial match with minimum length guard.
|
|
5
|
-
* Prevents false positives like 'permission'.includes('is').
|
|
6
|
-
*/
|
|
7
|
-
function isStrongPartialMatch(a, b) {
|
|
8
|
-
if (a.length < 4 || b.length < 4)
|
|
9
|
-
return false;
|
|
10
|
-
return a.startsWith(b) || b.startsWith(a);
|
|
11
|
-
}
|
|
12
4
|
/**
|
|
13
5
|
* Retrieve declaration-oriented candidates based on behavior family matching.
|
|
14
|
-
* Uses
|
|
15
|
-
* Does NOT use exact identifier matching — that's the identifier retriever's job.
|
|
6
|
+
* Uses the compiled spec's behaviorTerms (merged from parser + recipes).
|
|
16
7
|
*/
|
|
17
|
-
export function retrieveBehaviorCandidates(ir, scope, index) {
|
|
18
|
-
const candidates = [];
|
|
8
|
+
export function retrieveBehaviorCandidates(ir, scope, index, spec) {
|
|
19
9
|
const matchedFamilies = BEHAVIOR_FAMILIES.filter((f) => ir.familyScores[f.id] > 0);
|
|
20
10
|
if (matchedFamilies.length === 0 && ir.nlTokens.length === 0)
|
|
21
11
|
return [];
|
|
22
|
-
//
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
12
|
+
// Expand query tokens with family expansion terms
|
|
13
|
+
const expansionTerms = [];
|
|
14
|
+
for (const family of matchedFamilies) {
|
|
15
|
+
expansionTerms.push(...family.expansionTerms);
|
|
16
|
+
}
|
|
17
|
+
// Build fielded documents from declarations + their attached docs
|
|
18
|
+
const docsBySymbol = new Map();
|
|
19
|
+
for (const d of index.docs) {
|
|
20
|
+
if (d.attachedSymbol) {
|
|
21
|
+
const existing = docsBySymbol.get(`${d.filePath}:${d.attachedSymbol}`) ?? [];
|
|
22
|
+
existing.push(...d.tokens);
|
|
23
|
+
docsBySymbol.set(`${d.filePath}:${d.attachedSymbol}`, existing);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const docs = index.declarations.map((decl, i) => {
|
|
27
|
+
const docTokens = docsBySymbol.get(`${decl.filePath}:${decl.symbol}`) ?? [];
|
|
28
|
+
return {
|
|
29
|
+
id: String(i),
|
|
30
|
+
fields: {
|
|
31
|
+
symbol: decl.symbolTokens,
|
|
32
|
+
path: decl.pathTokens,
|
|
33
|
+
docs: docTokens,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
// Query tokens: use spec behaviorTerms if available, plus family expansion
|
|
38
|
+
const baseTerms = spec?.behaviorTerms ?? [...ir.nlTokens, ...ir.codeTokens];
|
|
39
|
+
const queryTokens = [...new Set([...baseTerms, ...expansionTerms])];
|
|
40
|
+
const scored = scoreFieldedQuery(queryTokens, docs, { symbol: 8, path: 3, docs: 5 }, 100);
|
|
41
|
+
const candidates = [];
|
|
42
|
+
for (const s of scored) {
|
|
43
|
+
const decl = index.declarations[parseInt(s.id)];
|
|
44
|
+
if (!decl)
|
|
45
|
+
continue;
|
|
46
|
+
// Family hint bonus (additive, on top of fielded score)
|
|
47
|
+
let familyBonus = 0;
|
|
48
|
+
const familyEvidence = [];
|
|
27
49
|
for (const family of matchedFamilies) {
|
|
28
50
|
for (const hint of family.symbolHints) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
evidence.push(`symbol-hint: ${hint}`);
|
|
33
|
-
break;
|
|
34
|
-
}
|
|
35
|
-
if (isStrongPartialMatch(tok, hint)) {
|
|
36
|
-
score += 2;
|
|
37
|
-
evidence.push(`symbol-partial: ${hint}~${tok}`);
|
|
38
|
-
break;
|
|
39
|
-
}
|
|
51
|
+
if (decl.symbolTokens.some((t) => t === hint)) {
|
|
52
|
+
familyBonus += 3;
|
|
53
|
+
familyEvidence.push(`family-hint: ${family.id}:${hint}`);
|
|
40
54
|
}
|
|
41
55
|
}
|
|
42
56
|
for (const hint of family.fileHints) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
evidence.push(`file-hint: ${hint}`);
|
|
47
|
-
break;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
// NL token matching against symbol tokens
|
|
53
|
-
for (const nlTok of ir.nlTokens) {
|
|
54
|
-
for (const symTok of decl.symbolTokens) {
|
|
55
|
-
if (symTok === nlTok) {
|
|
56
|
-
score += 4;
|
|
57
|
-
evidence.push(`nl-match: ${nlTok}`);
|
|
58
|
-
break;
|
|
59
|
-
}
|
|
60
|
-
if (isStrongPartialMatch(symTok, nlTok)) {
|
|
61
|
-
score += 2;
|
|
62
|
-
evidence.push(`nl-partial: ${nlTok}~${symTok}`);
|
|
63
|
-
break;
|
|
57
|
+
if (decl.pathTokens.some((t) => t.includes(hint))) {
|
|
58
|
+
familyBonus += 2;
|
|
59
|
+
familyEvidence.push(`family-file: ${family.id}:${hint}`);
|
|
64
60
|
}
|
|
65
61
|
}
|
|
66
62
|
}
|
|
67
63
|
// Export bonus
|
|
68
|
-
|
|
69
|
-
|
|
64
|
+
const exportBonus = decl.isExported ? 2 : 0;
|
|
65
|
+
const totalScore = Math.round(s.score) + familyBonus + exportBonus;
|
|
66
|
+
const evidence = [...s.evidence, ...familyEvidence];
|
|
67
|
+
if (decl.isExported)
|
|
70
68
|
evidence.push('exported');
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
sources: ['behavior'],
|
|
86
|
-
});
|
|
87
|
-
}
|
|
69
|
+
const { snippet, context } = buildSnippetFromFile(decl.filePath, decl.line, 1);
|
|
70
|
+
candidates.push({
|
|
71
|
+
candidateType: 'declaration',
|
|
72
|
+
filePath: decl.filePath,
|
|
73
|
+
line: decl.line,
|
|
74
|
+
column: decl.column,
|
|
75
|
+
symbol: decl.symbol,
|
|
76
|
+
kind: decl.kind,
|
|
77
|
+
snippet,
|
|
78
|
+
context,
|
|
79
|
+
score: totalScore,
|
|
80
|
+
evidence,
|
|
81
|
+
sources: ['behavior'],
|
|
82
|
+
});
|
|
88
83
|
}
|
|
89
84
|
return candidates.sort((a, b) => b.score - a.score);
|
|
90
85
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"behaviorRetriever.js","sourceRoot":"","sources":["../../../src/search/retrievers/behaviorRetriever.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"behaviorRetriever.js","sourceRoot":"","sources":["../../../src/search/retrievers/behaviorRetriever.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { QueryIR, SearchScope, WorkspaceIndex, CodeCandidate } from '../types.js';
|
|
2
|
+
import type { EffectiveSearchSpec } from '../query/compileEffectiveSearchSpec.js';
|
|
3
|
+
/**
|
|
4
|
+
* Retrieve candidates from the config/registry index.
|
|
5
|
+
* Uses the compiled spec's configTerms and routeTerms for boosted scoring.
|
|
6
|
+
*/
|
|
7
|
+
export declare function retrieveConfigCandidates(ir: QueryIR, scope: SearchScope, index: WorkspaceIndex, spec?: EffectiveSearchSpec): CodeCandidate[];
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { scoreFieldedQuery } from '../ranking/fieldedTextRanker.js';
|
|
2
|
+
import { buildSnippetFromFile } from '../../analysis/ts/snippets.js';
|
|
3
|
+
/**
|
|
4
|
+
* Retrieve candidates from the config/registry index.
|
|
5
|
+
* Uses the compiled spec's configTerms and routeTerms for boosted scoring.
|
|
6
|
+
*/
|
|
7
|
+
export function retrieveConfigCandidates(ir, scope, index, spec) {
|
|
8
|
+
if (index.configs.length === 0)
|
|
9
|
+
return [];
|
|
10
|
+
const baseTerms = spec?.behaviorTerms ?? [...ir.nlTokens, ...ir.codeTokens];
|
|
11
|
+
const extraTerms = [...(spec?.routeTerms ?? []), ...(spec?.configTerms ?? [])];
|
|
12
|
+
const idTerms = (spec?.exactIdentifiers ?? ir.exactIdentifiers).map((s) => s.toLowerCase());
|
|
13
|
+
const queryTokens = [...new Set([...baseTerms, ...extraTerms, ...idTerms])];
|
|
14
|
+
if (queryTokens.length === 0)
|
|
15
|
+
return [];
|
|
16
|
+
const docs = index.configs.map((c, i) => ({
|
|
17
|
+
id: String(i),
|
|
18
|
+
fields: {
|
|
19
|
+
config: c.tokens,
|
|
20
|
+
path: c.keyPath ?? [],
|
|
21
|
+
},
|
|
22
|
+
}));
|
|
23
|
+
const scored = scoreFieldedQuery(queryTokens, docs, { config: 6, path: 4 }, 30);
|
|
24
|
+
const candidates = [];
|
|
25
|
+
for (const s of scored) {
|
|
26
|
+
const entry = index.configs[parseInt(s.id)];
|
|
27
|
+
if (!entry)
|
|
28
|
+
continue;
|
|
29
|
+
const { snippet, context } = buildSnippetFromFile(entry.filePath, entry.line, 1);
|
|
30
|
+
candidates.push({
|
|
31
|
+
candidateType: 'config',
|
|
32
|
+
filePath: entry.filePath,
|
|
33
|
+
line: entry.line,
|
|
34
|
+
symbol: entry.keyPath?.join('.'),
|
|
35
|
+
kind: 'config',
|
|
36
|
+
snippet,
|
|
37
|
+
context,
|
|
38
|
+
score: Math.round(s.score) + (entry.kind === 'route' && spec?.routeTerms.length ? 3 : 0)
|
|
39
|
+
+ (entry.kind === 'env' && spec?.configTerms.length ? 2 : 0),
|
|
40
|
+
evidence: [`config-${entry.kind}: "${entry.text.substring(0, 80)}"`, ...s.evidence],
|
|
41
|
+
sources: ['config'],
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return candidates;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=configRetriever.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configRetriever.js","sourceRoot":"","sources":["../../../src/search/retrievers/configRetriever.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { QueryIR, SearchScope, WorkspaceIndex, CodeCandidate } from '../types.js';
|
|
2
|
+
import type { EffectiveSearchSpec } from '../query/compileEffectiveSearchSpec.js';
|
|
3
|
+
/**
|
|
4
|
+
* Retrieve candidates from the doc/narrative index.
|
|
5
|
+
* Uses the compiled spec's behaviorTerms for BM25 scoring.
|
|
6
|
+
*/
|
|
7
|
+
export declare function retrieveDocCandidates(ir: QueryIR, scope: SearchScope, index: WorkspaceIndex, spec?: EffectiveSearchSpec): CodeCandidate[];
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { scoreFieldedQuery } from '../ranking/fieldedTextRanker.js';
|
|
2
|
+
import { buildSnippetFromFile } from '../../analysis/ts/snippets.js';
|
|
3
|
+
/**
|
|
4
|
+
* Retrieve candidates from the doc/narrative index.
|
|
5
|
+
* Uses the compiled spec's behaviorTerms for BM25 scoring.
|
|
6
|
+
*/
|
|
7
|
+
export function retrieveDocCandidates(ir, scope, index, spec) {
|
|
8
|
+
const terms = spec?.behaviorTerms ?? [...ir.nlTokens, ...ir.codeTokens];
|
|
9
|
+
if (terms.length === 0 && ir.phrases.length === 0)
|
|
10
|
+
return [];
|
|
11
|
+
if (index.docs.length === 0)
|
|
12
|
+
return [];
|
|
13
|
+
// Build fielded documents from doc entries
|
|
14
|
+
const docs = index.docs.map((d, i) => ({
|
|
15
|
+
id: String(i),
|
|
16
|
+
fields: {
|
|
17
|
+
docs: d.tokens,
|
|
18
|
+
symbol: d.attachedSymbol
|
|
19
|
+
? d.attachedSymbol.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase().split(/\s+/)
|
|
20
|
+
: [],
|
|
21
|
+
},
|
|
22
|
+
}));
|
|
23
|
+
const queryTokens = terms;
|
|
24
|
+
const scored = scoreFieldedQuery(queryTokens, docs, { docs: 6, symbol: 4 }, 50);
|
|
25
|
+
const candidates = [];
|
|
26
|
+
for (const s of scored) {
|
|
27
|
+
const entry = index.docs[parseInt(s.id)];
|
|
28
|
+
if (!entry)
|
|
29
|
+
continue;
|
|
30
|
+
const { snippet, context } = buildSnippetFromFile(entry.filePath, entry.line, 1);
|
|
31
|
+
candidates.push({
|
|
32
|
+
candidateType: 'doc',
|
|
33
|
+
filePath: entry.filePath,
|
|
34
|
+
line: entry.line,
|
|
35
|
+
symbol: entry.attachedSymbol,
|
|
36
|
+
kind: 'doc',
|
|
37
|
+
snippet,
|
|
38
|
+
context,
|
|
39
|
+
score: Math.round(s.score),
|
|
40
|
+
evidence: [`doc-${entry.kind}: "${entry.text.substring(0, 60)}"`, ...s.evidence],
|
|
41
|
+
sources: ['doc'],
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return candidates;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=docRetriever.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docRetriever.js","sourceRoot":"","sources":["../../../src/search/retrievers/docRetriever.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAwB,MAAM,iCAAiC,CAAC;AAC1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,EAAW,EACX,KAAkB,EAClB,KAAqB,EACrB,IAA0B;IAE1B,MAAM,KAAK,GAAG,IAAI,EAAE,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC;IACxE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7D,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEvC,2CAA2C;IAC3C,MAAM,IAAI,GAAsB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACxD,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACb,MAAM,EAAE;YACN,IAAI,EAAE,CAAC,CAAC,MAAM;YACd,MAAM,EAAE,CAAC,CAAC,cAAc;gBACtB,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;gBACjF,CAAC,CAAC,EAAE;SACP;KACF,CAAC,CAAC,CAAC;IAEJ,MAAM,WAAW,GAAG,KAAK,CAAC;IAC1B,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAEhF,MAAM,UAAU,GAAoB,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,oBAAoB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACjF,UAAU,CAAC,IAAI,CAAC;YACd,aAAa,EAAE,KAAK;YACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,cAAc;YAC5B,IAAI,EAAE,KAAK;YACX,OAAO;YACP,OAAO;YACP,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;YAC1B,QAAQ,EAAE,CAAC,OAAO,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC;YAChF,OAAO,EAAE,CAAC,KAAK,CAAC;SACjB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { QueryIR, SearchScope, WorkspaceIndex, CodeCandidate } from '../types.js';
|
|
2
|
+
import type { EffectiveSearchSpec } from '../query/compileEffectiveSearchSpec.js';
|
|
2
3
|
/**
|
|
3
4
|
* Retrieve usage-oriented candidates based on exact identifier matching.
|
|
4
|
-
* Uses
|
|
5
|
-
* This is the missing backend that makes useEffect, Promise.all queries work.
|
|
5
|
+
* Uses the compiled spec's identifiers (merged from parser + recipes).
|
|
6
6
|
*/
|
|
7
|
-
export declare function retrieveIdentifierCandidates(ir: QueryIR, scope: SearchScope, index: WorkspaceIndex): CodeCandidate[];
|
|
7
|
+
export declare function retrieveIdentifierCandidates(ir: QueryIR, scope: SearchScope, index: WorkspaceIndex, spec?: EffectiveSearchSpec): CodeCandidate[];
|
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
import { buildSnippetFromFile } from '../../analysis/ts/snippets.js';
|
|
2
2
|
/**
|
|
3
3
|
* Retrieve usage-oriented candidates based on exact identifier matching.
|
|
4
|
-
* Uses
|
|
5
|
-
* This is the missing backend that makes useEffect, Promise.all queries work.
|
|
4
|
+
* Uses the compiled spec's identifiers (merged from parser + recipes).
|
|
6
5
|
*/
|
|
7
|
-
export function retrieveIdentifierCandidates(ir, scope, index) {
|
|
6
|
+
export function retrieveIdentifierCandidates(ir, scope, index, spec) {
|
|
8
7
|
const candidates = [];
|
|
9
|
-
|
|
8
|
+
const exactIds = spec?.exactIdentifiers ?? ir.exactIdentifiers;
|
|
9
|
+
const dottedIds = spec?.dottedIdentifiers ?? ir.dottedIdentifiers;
|
|
10
|
+
if (exactIds.length === 0 && dottedIds.length === 0)
|
|
10
11
|
return [];
|
|
11
12
|
for (const usage of index.usages) {
|
|
12
13
|
let score = 0;
|
|
13
14
|
const evidence = [];
|
|
14
15
|
// Exact identifier match
|
|
15
|
-
for (const id of
|
|
16
|
+
for (const id of exactIds) {
|
|
16
17
|
if (usage.identifier === id || usage.normalizedIdentifier === id) {
|
|
17
18
|
score += 10;
|
|
18
19
|
evidence.push(`exact-identifier: ${id}`);
|
|
19
20
|
}
|
|
20
21
|
}
|
|
21
22
|
// Dotted identifier match (Promise.all, React.useEffect)
|
|
22
|
-
for (const id of
|
|
23
|
+
for (const id of dottedIds) {
|
|
23
24
|
if (usage.identifier === id) {
|
|
24
25
|
score += 10;
|
|
25
26
|
evidence.push(`dotted-identifier: ${id}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identifierRetriever.js","sourceRoot":"","sources":["../../../src/search/retrievers/identifierRetriever.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"identifierRetriever.js","sourceRoot":"","sources":["../../../src/search/retrievers/identifierRetriever.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import type { QueryIR, SearchScope, WorkspaceIndex, CodeCandidate } from '../types.js';
|
|
2
|
+
import type { EffectiveSearchSpec } from '../query/compileEffectiveSearchSpec.js';
|
|
2
3
|
/**
|
|
3
4
|
* Retrieve candidates using structural predicate evaluation.
|
|
4
5
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Step 2: Evaluate structural predicates on each candidate node
|
|
8
|
-
*
|
|
9
|
-
* This is NOT recipe-only string patterns — it uses TS AST node evaluation.
|
|
6
|
+
* When an EffectiveSearchSpec is provided, uses its merged predicates/identifiers
|
|
7
|
+
* (which include recipe contributions). Falls back to raw IR otherwise.
|
|
10
8
|
*/
|
|
11
|
-
export declare function retrieveStructuralCandidates(ir: QueryIR, scope: SearchScope, index: WorkspaceIndex): CodeCandidate[];
|
|
9
|
+
export declare function retrieveStructuralCandidates(ir: QueryIR, scope: SearchScope, index: WorkspaceIndex, spec?: EffectiveSearchSpec): CodeCandidate[];
|