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.
Files changed (148) hide show
  1. package/README.md +41 -13
  2. package/dist/analysis/pattern/collectSearchFiles.d.ts +2 -1
  3. package/dist/analysis/pattern/collectSearchFiles.js +6 -6
  4. package/dist/analysis/pattern/collectSearchFiles.js.map +1 -1
  5. package/dist/analysis/pattern/runPatternSearch.d.ts +1 -1
  6. package/dist/analysis/pattern/runPatternSearch.js +4 -2
  7. package/dist/analysis/pattern/runPatternSearch.js.map +1 -1
  8. package/dist/analysis/ts/extractUsages.js +19 -0
  9. package/dist/analysis/ts/extractUsages.js.map +1 -1
  10. package/dist/analysis/ts/parseSourceFile.d.ts +2 -1
  11. package/dist/analysis/ts/parseSourceFile.js +5 -9
  12. package/dist/analysis/ts/parseSourceFile.js.map +1 -1
  13. package/dist/analysis/ts/reactState.d.ts +9 -0
  14. package/dist/analysis/ts/reactState.js +57 -0
  15. package/dist/analysis/ts/reactState.js.map +1 -0
  16. package/dist/analysis/ts/structuralPredicates.js +31 -2
  17. package/dist/analysis/ts/structuralPredicates.js.map +1 -1
  18. package/dist/ast/parseFile.d.ts +4 -3
  19. package/dist/ast/parseFile.js +22 -5
  20. package/dist/ast/parseFile.js.map +1 -1
  21. package/dist/engine/LspEngine.js +23 -1
  22. package/dist/engine/LspEngine.js.map +1 -1
  23. package/dist/git/getBaseFileContent.d.ts +1 -0
  24. package/dist/git/getBaseFileContent.js +10 -3
  25. package/dist/git/getBaseFileContent.js.map +1 -1
  26. package/dist/git/getChangedFiles.d.ts +2 -1
  27. package/dist/git/getChangedFiles.js +11 -5
  28. package/dist/git/getChangedFiles.js.map +1 -1
  29. package/dist/git/getChangedHunks.d.ts +1 -0
  30. package/dist/git/getChangedHunks.js +15 -10
  31. package/dist/git/getChangedHunks.js.map +1 -1
  32. package/dist/git/getGitRoot.d.ts +15 -0
  33. package/dist/git/getGitRoot.js +33 -0
  34. package/dist/git/getGitRoot.js.map +1 -0
  35. package/dist/index.js +2 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/resolve/searchScope.d.ts +8 -2
  38. package/dist/resolve/searchScope.js +26 -14
  39. package/dist/resolve/searchScope.js.map +1 -1
  40. package/dist/search/adapters/config.d.ts +5 -0
  41. package/dist/search/adapters/config.js +56 -0
  42. package/dist/search/adapters/config.js.map +1 -0
  43. package/dist/search/adapters/http.d.ts +6 -0
  44. package/dist/search/adapters/http.js +58 -0
  45. package/dist/search/adapters/http.js.map +1 -0
  46. package/dist/search/adapters/react.d.ts +12 -0
  47. package/dist/search/adapters/react.js +92 -0
  48. package/dist/search/adapters/react.js.map +1 -0
  49. package/dist/search/adapters/registry.d.ts +6 -0
  50. package/dist/search/adapters/registry.js +20 -0
  51. package/dist/search/adapters/registry.js.map +1 -0
  52. package/dist/search/adapters/types.d.ts +5 -0
  53. package/dist/search/adapters/types.js +2 -0
  54. package/dist/search/adapters/types.js.map +1 -0
  55. package/dist/search/debug/trace.d.ts +6 -0
  56. package/dist/search/debug/trace.js +25 -0
  57. package/dist/search/debug/trace.js.map +1 -0
  58. package/dist/search/expand/graphExpansion.d.ts +16 -0
  59. package/dist/search/expand/graphExpansion.js +168 -0
  60. package/dist/search/expand/graphExpansion.js.map +1 -0
  61. package/dist/search/fileKinds.d.ts +13 -0
  62. package/dist/search/fileKinds.js +74 -0
  63. package/dist/search/fileKinds.js.map +1 -0
  64. package/dist/search/index/configIndex.d.ts +6 -0
  65. package/dist/search/index/configIndex.js +196 -0
  66. package/dist/search/index/configIndex.js.map +1 -0
  67. package/dist/search/index/docIndex.d.ts +7 -0
  68. package/dist/search/index/docIndex.js +116 -0
  69. package/dist/search/index/docIndex.js.map +1 -0
  70. package/dist/search/index/workspaceIndex.d.ts +6 -0
  71. package/dist/search/index/workspaceIndex.js +50 -14
  72. package/dist/search/index/workspaceIndex.js.map +1 -1
  73. package/dist/search/query/compileEffectiveSearchSpec.d.ts +24 -0
  74. package/dist/search/query/compileEffectiveSearchSpec.js +67 -0
  75. package/dist/search/query/compileEffectiveSearchSpec.js.map +1 -0
  76. package/dist/search/query/parseQuery.d.ts +1 -0
  77. package/dist/search/query/parseQuery.js +40 -0
  78. package/dist/search/query/parseQuery.js.map +1 -1
  79. package/dist/search/query/phraseRules.d.ts +10 -0
  80. package/dist/search/query/phraseRules.js +58 -0
  81. package/dist/search/query/phraseRules.js.map +1 -0
  82. package/dist/search/query/planQuery.d.ts +4 -3
  83. package/dist/search/query/planQuery.js +39 -6
  84. package/dist/search/query/planQuery.js.map +1 -1
  85. package/dist/search/ranking/assessConfidence.js +6 -0
  86. package/dist/search/ranking/assessConfidence.js.map +1 -1
  87. package/dist/search/ranking/candidateIdentity.d.ts +21 -0
  88. package/dist/search/ranking/candidateIdentity.js +29 -0
  89. package/dist/search/ranking/candidateIdentity.js.map +1 -0
  90. package/dist/search/ranking/coalesceCandidates.d.ts +9 -0
  91. package/dist/search/ranking/coalesceCandidates.js +48 -0
  92. package/dist/search/ranking/coalesceCandidates.js.map +1 -0
  93. package/dist/search/ranking/fieldedTextRanker.d.ts +26 -0
  94. package/dist/search/ranking/fieldedTextRanker.js +79 -0
  95. package/dist/search/ranking/fieldedTextRanker.js.map +1 -0
  96. package/dist/search/ranking/mergeCandidates.d.ts +3 -0
  97. package/dist/search/ranking/mergeCandidates.js +39 -0
  98. package/dist/search/ranking/mergeCandidates.js.map +1 -1
  99. package/dist/search/ranking/rankCandidates.d.ts +1 -1
  100. package/dist/search/ranking/rankCandidates.js +51 -3
  101. package/dist/search/ranking/rankCandidates.js.map +1 -1
  102. package/dist/search/retrievers/behaviorRetriever.d.ts +3 -3
  103. package/dist/search/retrievers/behaviorRetriever.js +64 -69
  104. package/dist/search/retrievers/behaviorRetriever.js.map +1 -1
  105. package/dist/search/retrievers/configRetriever.d.ts +7 -0
  106. package/dist/search/retrievers/configRetriever.js +46 -0
  107. package/dist/search/retrievers/configRetriever.js.map +1 -0
  108. package/dist/search/retrievers/docRetriever.d.ts +7 -0
  109. package/dist/search/retrievers/docRetriever.js +46 -0
  110. package/dist/search/retrievers/docRetriever.js.map +1 -0
  111. package/dist/search/retrievers/identifierRetriever.d.ts +3 -3
  112. package/dist/search/retrievers/identifierRetriever.js +7 -6
  113. package/dist/search/retrievers/identifierRetriever.js.map +1 -1
  114. package/dist/search/retrievers/structuralRetriever.d.ts +4 -6
  115. package/dist/search/retrievers/structuralRetriever.js +47 -84
  116. package/dist/search/retrievers/structuralRetriever.js.map +1 -1
  117. package/dist/search/retrievers/textPatternRetriever.d.ts +7 -0
  118. package/dist/search/retrievers/textPatternRetriever.js +90 -0
  119. package/dist/search/retrievers/textPatternRetriever.js.map +1 -0
  120. package/dist/search/structural/locators/callLocator.d.ts +6 -0
  121. package/dist/search/structural/locators/callLocator.js +57 -0
  122. package/dist/search/structural/locators/callLocator.js.map +1 -0
  123. package/dist/search/structural/locators/declarationLocator.d.ts +6 -0
  124. package/dist/search/structural/locators/declarationLocator.js +57 -0
  125. package/dist/search/structural/locators/declarationLocator.js.map +1 -0
  126. package/dist/search/structural/locators/statementLocator.d.ts +6 -0
  127. package/dist/search/structural/locators/statementLocator.js +65 -0
  128. package/dist/search/structural/locators/statementLocator.js.map +1 -0
  129. package/dist/search/structural/locators/types.d.ts +12 -0
  130. package/dist/search/structural/locators/types.js +2 -0
  131. package/dist/search/structural/locators/types.js.map +1 -0
  132. package/dist/search/structural/selectLocators.d.ts +7 -0
  133. package/dist/search/structural/selectLocators.js +21 -0
  134. package/dist/search/structural/selectLocators.js.map +1 -0
  135. package/dist/search/types.d.ts +77 -7
  136. package/dist/search/types.js.map +1 -1
  137. package/dist/tools/composites/apiGuard.js +6 -28
  138. package/dist/tools/composites/apiGuard.js.map +1 -1
  139. package/dist/tools/composites/findCode.js +92 -15
  140. package/dist/tools/composites/findCode.js.map +1 -1
  141. package/dist/tools/composites/findPattern.js +1 -1
  142. package/dist/tools/composites/findPattern.js.map +1 -1
  143. package/dist/tools/live/clearIndex.d.ts +1 -0
  144. package/dist/tools/live/clearIndex.js +19 -0
  145. package/dist/tools/live/clearIndex.js.map +1 -0
  146. package/dist/tools/primitives/callHierarchy.js +1 -1
  147. package/dist/tools/primitives/callHierarchy.js.map +1 -1
  148. 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,MAI/B;IACC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEhD,0BAA0B;IAC1B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,iDAAiD;IACjD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,gBAAgB;YAC/C,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC;YACjE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC1B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;YAC9B,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;YAC5D,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC1B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9B,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
- * Applies penalties, enriches top candidates with hover signatures.
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
- * Applies penalties, enriches top candidates with hover signatures.
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 candidates) {
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 = candidates.filter((c) => c.score > 0);
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":"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"}
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 declaration index + family classifier/expansion terms + file/symbol hints.
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 declaration index + family classifier/expansion terms + file/symbol hints.
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
- // Score each declaration against NL tokens + family hints
23
- for (const decl of index.declarations) {
24
- let score = 0;
25
- const evidence = [];
26
- // Family symbol hints
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
- for (const tok of decl.symbolTokens) {
30
- if (tok === hint) {
31
- score += 5;
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
- for (const tok of decl.pathTokens) {
44
- if (tok.includes(hint)) {
45
- score += 3;
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
- if (decl.isExported && score > 0) {
69
- score += 2;
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
- if (score > 0) {
73
- const { snippet, context } = buildSnippetFromFile(decl.filePath, decl.line, 1);
74
- candidates.push({
75
- candidateType: 'declaration',
76
- filePath: decl.filePath,
77
- line: decl.line,
78
- column: decl.column,
79
- symbol: decl.symbol,
80
- kind: decl.kind,
81
- snippet,
82
- context,
83
- score,
84
- evidence,
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":"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"}
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 usage index call expressions, member calls, imports, JSX tags.
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 usage index call expressions, member calls, imports, JSX tags.
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
- if (ir.exactIdentifiers.length === 0 && ir.dottedIdentifiers.length === 0)
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 ir.exactIdentifiers) {
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 ir.dottedIdentifiers) {
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":"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"}
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
- * Two-step design:
6
- * Step 1: Locate candidate nodes (prefer usage sites of exact identifiers)
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[];