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.
Files changed (208) hide show
  1. package/README.md +48 -15
  2. package/dist/analysis/pattern/collectSearchFiles.d.ts +6 -0
  3. package/dist/analysis/pattern/collectSearchFiles.js +38 -0
  4. package/dist/analysis/pattern/collectSearchFiles.js.map +1 -0
  5. package/dist/analysis/pattern/runPatternSearch.d.ts +17 -0
  6. package/dist/analysis/pattern/runPatternSearch.js +65 -0
  7. package/dist/analysis/pattern/runPatternSearch.js.map +1 -0
  8. package/dist/analysis/ts/extractDeclarations.d.ts +7 -0
  9. package/dist/analysis/ts/extractDeclarations.js +93 -0
  10. package/dist/analysis/ts/extractDeclarations.js.map +1 -0
  11. package/dist/analysis/ts/extractUsages.d.ts +7 -0
  12. package/dist/analysis/ts/extractUsages.js +139 -0
  13. package/dist/analysis/ts/extractUsages.js.map +1 -0
  14. package/dist/analysis/ts/parseSourceFile.d.ts +11 -0
  15. package/dist/analysis/ts/parseSourceFile.js +24 -0
  16. package/dist/analysis/ts/parseSourceFile.js.map +1 -0
  17. package/dist/analysis/ts/reactState.d.ts +9 -0
  18. package/dist/analysis/ts/reactState.js +57 -0
  19. package/dist/analysis/ts/reactState.js.map +1 -0
  20. package/dist/analysis/ts/snippets.d.ts +14 -0
  21. package/dist/analysis/ts/snippets.js +29 -0
  22. package/dist/analysis/ts/snippets.js.map +1 -0
  23. package/dist/analysis/ts/structuralPredicates.d.ts +10 -0
  24. package/dist/analysis/ts/structuralPredicates.js +199 -0
  25. package/dist/analysis/ts/structuralPredicates.js.map +1 -0
  26. package/dist/ast/diffDeclarationShapes.d.ts +16 -0
  27. package/dist/ast/diffDeclarationShapes.js +179 -0
  28. package/dist/ast/diffDeclarationShapes.js.map +1 -0
  29. package/dist/ast/extractExportDeclarations.d.ts +21 -0
  30. package/dist/ast/extractExportDeclarations.js +218 -0
  31. package/dist/ast/extractExportDeclarations.js.map +1 -0
  32. package/dist/ast/findNodeAtPosition.d.ts +12 -0
  33. package/dist/ast/findNodeAtPosition.js +75 -0
  34. package/dist/ast/findNodeAtPosition.js.map +1 -0
  35. package/dist/ast/parseFile.d.ts +11 -0
  36. package/dist/ast/parseFile.js +46 -0
  37. package/dist/ast/parseFile.js.map +1 -0
  38. package/dist/engine/LspEngine.js +23 -1
  39. package/dist/engine/LspEngine.js.map +1 -1
  40. package/dist/engine/waitForDiagnostics.d.ts +7 -0
  41. package/dist/engine/waitForDiagnostics.js +16 -0
  42. package/dist/engine/waitForDiagnostics.js.map +1 -0
  43. package/dist/git/getBaseFileContent.d.ts +6 -0
  44. package/dist/git/getBaseFileContent.js +23 -0
  45. package/dist/git/getBaseFileContent.js.map +1 -0
  46. package/dist/git/getChangedFiles.d.ts +5 -0
  47. package/dist/git/getChangedFiles.js +27 -0
  48. package/dist/git/getChangedFiles.js.map +1 -0
  49. package/dist/git/getChangedHunks.d.ts +14 -0
  50. package/dist/git/getChangedHunks.js +56 -0
  51. package/dist/git/getChangedHunks.js.map +1 -0
  52. package/dist/git/getGitRoot.d.ts +15 -0
  53. package/dist/git/getGitRoot.js +33 -0
  54. package/dist/git/getGitRoot.js.map +1 -0
  55. package/dist/git/getMergeBase.d.ts +5 -0
  56. package/dist/git/getMergeBase.js +23 -0
  57. package/dist/git/getMergeBase.js.map +1 -0
  58. package/dist/index.js +10 -0
  59. package/dist/index.js.map +1 -1
  60. package/dist/resolve/searchScope.d.ts +17 -0
  61. package/dist/resolve/searchScope.js +64 -0
  62. package/dist/resolve/searchScope.js.map +1 -0
  63. package/dist/resolve/targetResolver.d.ts +33 -0
  64. package/dist/resolve/targetResolver.js +84 -0
  65. package/dist/resolve/targetResolver.js.map +1 -0
  66. package/dist/search/adapters/config.d.ts +5 -0
  67. package/dist/search/adapters/config.js +56 -0
  68. package/dist/search/adapters/config.js.map +1 -0
  69. package/dist/search/adapters/http.d.ts +6 -0
  70. package/dist/search/adapters/http.js +58 -0
  71. package/dist/search/adapters/http.js.map +1 -0
  72. package/dist/search/adapters/react.d.ts +12 -0
  73. package/dist/search/adapters/react.js +92 -0
  74. package/dist/search/adapters/react.js.map +1 -0
  75. package/dist/search/adapters/registry.d.ts +6 -0
  76. package/dist/search/adapters/registry.js +20 -0
  77. package/dist/search/adapters/registry.js.map +1 -0
  78. package/dist/search/adapters/types.d.ts +5 -0
  79. package/dist/search/adapters/types.js +2 -0
  80. package/dist/search/adapters/types.js.map +1 -0
  81. package/dist/search/debug/trace.d.ts +6 -0
  82. package/dist/search/debug/trace.js +25 -0
  83. package/dist/search/debug/trace.js.map +1 -0
  84. package/dist/search/expand/graphExpansion.d.ts +16 -0
  85. package/dist/search/expand/graphExpansion.js +168 -0
  86. package/dist/search/expand/graphExpansion.js.map +1 -0
  87. package/dist/search/families/behaviorFamilies.d.ts +22 -0
  88. package/dist/search/families/behaviorFamilies.js +90 -0
  89. package/dist/search/families/behaviorFamilies.js.map +1 -0
  90. package/dist/search/fileKinds.d.ts +13 -0
  91. package/dist/search/fileKinds.js +74 -0
  92. package/dist/search/fileKinds.js.map +1 -0
  93. package/dist/search/index/configIndex.d.ts +6 -0
  94. package/dist/search/index/configIndex.js +196 -0
  95. package/dist/search/index/configIndex.js.map +1 -0
  96. package/dist/search/index/declarationIndex.d.ts +6 -0
  97. package/dist/search/index/declarationIndex.js +13 -0
  98. package/dist/search/index/declarationIndex.js.map +1 -0
  99. package/dist/search/index/docIndex.d.ts +7 -0
  100. package/dist/search/index/docIndex.js +116 -0
  101. package/dist/search/index/docIndex.js.map +1 -0
  102. package/dist/search/index/types.d.ts +1 -0
  103. package/dist/search/index/types.js +2 -0
  104. package/dist/search/index/types.js.map +1 -0
  105. package/dist/search/index/usageIndex.d.ts +6 -0
  106. package/dist/search/index/usageIndex.js +13 -0
  107. package/dist/search/index/usageIndex.js.map +1 -0
  108. package/dist/search/index/workspaceIndex.d.ts +14 -0
  109. package/dist/search/index/workspaceIndex.js +127 -0
  110. package/dist/search/index/workspaceIndex.js.map +1 -0
  111. package/dist/search/query/compileEffectiveSearchSpec.d.ts +24 -0
  112. package/dist/search/query/compileEffectiveSearchSpec.js +67 -0
  113. package/dist/search/query/compileEffectiveSearchSpec.js.map +1 -0
  114. package/dist/search/query/parseQuery.d.ts +10 -0
  115. package/dist/search/query/parseQuery.js +284 -0
  116. package/dist/search/query/parseQuery.js.map +1 -0
  117. package/dist/search/query/phraseRules.d.ts +10 -0
  118. package/dist/search/query/phraseRules.js +58 -0
  119. package/dist/search/query/phraseRules.js.map +1 -0
  120. package/dist/search/query/planQuery.d.ts +10 -0
  121. package/dist/search/query/planQuery.js +91 -0
  122. package/dist/search/query/planQuery.js.map +1 -0
  123. package/dist/search/ranking/assessConfidence.d.ts +6 -0
  124. package/dist/search/ranking/assessConfidence.js +31 -0
  125. package/dist/search/ranking/assessConfidence.js.map +1 -0
  126. package/dist/search/ranking/candidateIdentity.d.ts +21 -0
  127. package/dist/search/ranking/candidateIdentity.js +29 -0
  128. package/dist/search/ranking/candidateIdentity.js.map +1 -0
  129. package/dist/search/ranking/coalesceCandidates.d.ts +9 -0
  130. package/dist/search/ranking/coalesceCandidates.js +48 -0
  131. package/dist/search/ranking/coalesceCandidates.js.map +1 -0
  132. package/dist/search/ranking/fieldedTextRanker.d.ts +26 -0
  133. package/dist/search/ranking/fieldedTextRanker.js +79 -0
  134. package/dist/search/ranking/fieldedTextRanker.js.map +1 -0
  135. package/dist/search/ranking/mergeCandidates.d.ts +13 -0
  136. package/dist/search/ranking/mergeCandidates.js +85 -0
  137. package/dist/search/ranking/mergeCandidates.js.map +1 -0
  138. package/dist/search/ranking/rankCandidates.d.ts +12 -0
  139. package/dist/search/ranking/rankCandidates.js +106 -0
  140. package/dist/search/ranking/rankCandidates.js.map +1 -0
  141. package/dist/search/retrievers/behaviorRetriever.d.ts +7 -0
  142. package/dist/search/retrievers/behaviorRetriever.js +86 -0
  143. package/dist/search/retrievers/behaviorRetriever.js.map +1 -0
  144. package/dist/search/retrievers/configRetriever.d.ts +7 -0
  145. package/dist/search/retrievers/configRetriever.js +46 -0
  146. package/dist/search/retrievers/configRetriever.js.map +1 -0
  147. package/dist/search/retrievers/docRetriever.d.ts +7 -0
  148. package/dist/search/retrievers/docRetriever.js +46 -0
  149. package/dist/search/retrievers/docRetriever.js.map +1 -0
  150. package/dist/search/retrievers/identifierRetriever.d.ts +7 -0
  151. package/dist/search/retrievers/identifierRetriever.js +67 -0
  152. package/dist/search/retrievers/identifierRetriever.js.map +1 -0
  153. package/dist/search/retrievers/structuralRetriever.d.ts +9 -0
  154. package/dist/search/retrievers/structuralRetriever.js +104 -0
  155. package/dist/search/retrievers/structuralRetriever.js.map +1 -0
  156. package/dist/search/retrievers/textPatternRetriever.d.ts +7 -0
  157. package/dist/search/retrievers/textPatternRetriever.js +90 -0
  158. package/dist/search/retrievers/textPatternRetriever.js.map +1 -0
  159. package/dist/search/structural/locators/callLocator.d.ts +6 -0
  160. package/dist/search/structural/locators/callLocator.js +57 -0
  161. package/dist/search/structural/locators/callLocator.js.map +1 -0
  162. package/dist/search/structural/locators/declarationLocator.d.ts +6 -0
  163. package/dist/search/structural/locators/declarationLocator.js +57 -0
  164. package/dist/search/structural/locators/declarationLocator.js.map +1 -0
  165. package/dist/search/structural/locators/statementLocator.d.ts +6 -0
  166. package/dist/search/structural/locators/statementLocator.js +65 -0
  167. package/dist/search/structural/locators/statementLocator.js.map +1 -0
  168. package/dist/search/structural/locators/types.d.ts +12 -0
  169. package/dist/search/structural/locators/types.js +2 -0
  170. package/dist/search/structural/locators/types.js.map +1 -0
  171. package/dist/search/structural/selectLocators.d.ts +7 -0
  172. package/dist/search/structural/selectLocators.js +21 -0
  173. package/dist/search/structural/selectLocators.js.map +1 -0
  174. package/dist/search/types.d.ts +191 -0
  175. package/dist/search/types.js +11 -0
  176. package/dist/search/types.js.map +1 -0
  177. package/dist/tools/composites/apiGuard.d.ts +1 -0
  178. package/dist/tools/composites/apiGuard.js +172 -0
  179. package/dist/tools/composites/apiGuard.js.map +1 -0
  180. package/dist/tools/composites/explainError.js +3 -2
  181. package/dist/tools/composites/explainError.js.map +1 -1
  182. package/dist/tools/composites/findCode.d.ts +1 -0
  183. package/dist/tools/composites/findCode.js +145 -0
  184. package/dist/tools/composites/findCode.js.map +1 -0
  185. package/dist/tools/composites/findPattern.d.ts +5 -0
  186. package/dist/tools/composites/findPattern.js +41 -0
  187. package/dist/tools/composites/findPattern.js.map +1 -0
  188. package/dist/tools/composites/rootCauseTrace.d.ts +1 -0
  189. package/dist/tools/composites/rootCauseTrace.js +213 -0
  190. package/dist/tools/composites/rootCauseTrace.js.map +1 -0
  191. package/dist/tools/composites/semanticDiff.js +24 -77
  192. package/dist/tools/composites/semanticDiff.js.map +1 -1
  193. package/dist/tools/live/clearIndex.d.ts +1 -0
  194. package/dist/tools/live/clearIndex.js +19 -0
  195. package/dist/tools/live/clearIndex.js.map +1 -0
  196. package/dist/tools/live/liveDiagnostics.js +3 -2
  197. package/dist/tools/live/liveDiagnostics.js.map +1 -1
  198. package/dist/tools/primitives/callHierarchy.js +1 -1
  199. package/dist/tools/primitives/callHierarchy.js.map +1 -1
  200. package/dist/tools/primitives/diagnostics.js +2 -2
  201. package/dist/tools/primitives/diagnostics.js.map +1 -1
  202. package/dist/tools/registry.d.ts +10 -2
  203. package/dist/tools/registry.js +7 -2
  204. package/dist/tools/registry.js.map +1 -1
  205. package/package.json +11 -5
  206. package/dist/tools/primitives/typeHierarchy.d.ts +0 -1
  207. package/dist/tools/primitives/typeHierarchy.js +0 -55
  208. package/dist/tools/primitives/typeHierarchy.js.map +0 -1
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Coalesce candidates that represent the same logical match.
3
+ * Merges doc + declaration, usage + pattern, etc. at the same location/symbol.
4
+ *
5
+ * This runs after retriever merge and before ranking, preventing
6
+ * duplicate entries for the same symbol from different retriever types.
7
+ */
8
+ export function coalesceCandidates(candidates) {
9
+ const coalesced = new Map();
10
+ for (const c of candidates) {
11
+ const key = coalesceKey(c);
12
+ const existing = coalesced.get(key);
13
+ if (existing) {
14
+ // Merge: keep the higher score, combine evidence and sources
15
+ existing.score = Math.max(existing.score, c.score) + 2; // coalesce bonus
16
+ existing.evidence.push(...c.evidence, `coalesced: ${c.candidateType}`);
17
+ for (const s of c.sources) {
18
+ if (!existing.sources.includes(s))
19
+ existing.sources.push(s);
20
+ }
21
+ // Prefer longer snippet/context
22
+ if (c.snippet && (!existing.snippet || c.snippet.length > existing.snippet.length)) {
23
+ existing.snippet = c.snippet;
24
+ existing.context = c.context;
25
+ }
26
+ // Prefer declaration type over doc type
27
+ if (c.candidateType === 'declaration' && existing.candidateType === 'doc') {
28
+ existing.candidateType = 'declaration';
29
+ existing.kind = c.kind;
30
+ }
31
+ }
32
+ else {
33
+ coalesced.set(key, { ...c });
34
+ }
35
+ }
36
+ return [...coalesced.values()];
37
+ }
38
+ /**
39
+ * Coalesce key: same file + same line (within 2 lines) + same symbol.
40
+ * Does NOT include candidateType — that's the whole point.
41
+ */
42
+ function coalesceKey(c) {
43
+ // Round line to nearest 2 to catch doc comments 1-2 lines above the declaration
44
+ const roundedLine = Math.floor(c.line / 3) * 3;
45
+ const symbol = c.symbol ?? c.matchedIdentifier ?? '';
46
+ return `${c.filePath}:${roundedLine}:${symbol}`;
47
+ }
48
+ //# sourceMappingURL=coalesceCandidates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coalesceCandidates.js","sourceRoot":"","sources":["../../../src/search/ranking/coalesceCandidates.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAA2B;IAC5D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEnD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEpC,IAAI,QAAQ,EAAE,CAAC;YACb,6DAA6D;YAC7D,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAiB;YACzE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;YACvE,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;YACD,gCAAgC;YAChC,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnF,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;gBAC7B,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;YAC/B,CAAC;YACD,wCAAwC;YACxC,IAAI,CAAC,CAAC,aAAa,KAAK,aAAa,IAAI,QAAQ,CAAC,aAAa,KAAK,KAAK,EAAE,CAAC;gBAC1E,QAAQ,CAAC,aAAa,GAAG,aAAa,CAAC;gBACvC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;YACzB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,CAAgB;IACnC,gFAAgF;IAChF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,iBAAiB,IAAI,EAAE,CAAC;IACrD,OAAO,GAAG,CAAC,CAAC,QAAQ,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;AAClD,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Fielded text scorer — lightweight BM25-inspired local ranker.
3
+ * Scores documents with multiple named fields against query tokens.
4
+ */
5
+ export interface FieldedDocument {
6
+ id: string;
7
+ fields: Record<string, string[]>;
8
+ }
9
+ export interface FieldedScore {
10
+ id: string;
11
+ score: number;
12
+ evidence: string[];
13
+ }
14
+ export interface FieldWeights {
15
+ symbol: number;
16
+ path: number;
17
+ docs: number;
18
+ tests: number;
19
+ config?: number;
20
+ }
21
+ /**
22
+ * Score query tokens against fielded documents.
23
+ * Uses a simplified BM25-like scoring: term frequency within fields,
24
+ * weighted by field importance, with length normalization.
25
+ */
26
+ export declare function scoreFieldedQuery(queryTokens: string[], docs: FieldedDocument[], weights?: Partial<FieldWeights>, limit?: number): FieldedScore[];
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Fielded text scorer — lightweight BM25-inspired local ranker.
3
+ * Scores documents with multiple named fields against query tokens.
4
+ */
5
+ const DEFAULT_WEIGHTS = {
6
+ symbol: 8,
7
+ path: 3,
8
+ docs: 5,
9
+ tests: 4,
10
+ config: 3,
11
+ };
12
+ /**
13
+ * Score query tokens against fielded documents.
14
+ * Uses a simplified BM25-like scoring: term frequency within fields,
15
+ * weighted by field importance, with length normalization.
16
+ */
17
+ export function scoreFieldedQuery(queryTokens, docs, weights, limit = 100) {
18
+ const w = { ...DEFAULT_WEIGHTS, ...weights };
19
+ const results = [];
20
+ // Compute average field lengths for normalization
21
+ const avgLengths = {};
22
+ const fieldNames = new Set();
23
+ for (const doc of docs) {
24
+ for (const [field, tokens] of Object.entries(doc.fields)) {
25
+ fieldNames.add(field);
26
+ avgLengths[field] = (avgLengths[field] ?? 0) + tokens.length;
27
+ }
28
+ }
29
+ for (const field of fieldNames) {
30
+ avgLengths[field] = docs.length > 0 ? avgLengths[field] / docs.length : 1;
31
+ }
32
+ // IDF: tokens that appear in fewer docs are more valuable
33
+ const docFreq = {};
34
+ for (const tok of queryTokens) {
35
+ docFreq[tok] = 0;
36
+ for (const doc of docs) {
37
+ const allTokens = Object.values(doc.fields).flat();
38
+ if (allTokens.some((t) => t === tok || t.startsWith(tok) || tok.startsWith(t))) {
39
+ docFreq[tok]++;
40
+ }
41
+ }
42
+ }
43
+ const N = docs.length || 1;
44
+ for (const doc of docs) {
45
+ let totalScore = 0;
46
+ const evidence = [];
47
+ for (const tok of queryTokens) {
48
+ const idf = Math.log((N - docFreq[tok] + 0.5) / (docFreq[tok] + 0.5) + 1);
49
+ for (const [field, tokens] of Object.entries(doc.fields)) {
50
+ const fieldWeight = w[field] ?? 1;
51
+ const avgLen = avgLengths[field] || 1;
52
+ const k1 = 1.2;
53
+ const b = 0.75;
54
+ // Count matches (exact + prefix)
55
+ let tf = 0;
56
+ for (const t of tokens) {
57
+ if (t === tok)
58
+ tf += 1;
59
+ else if (t.startsWith(tok) || tok.startsWith(t))
60
+ tf += 0.5;
61
+ }
62
+ if (tf === 0)
63
+ continue;
64
+ // BM25 TF component with length normalization
65
+ const lenNorm = 1 - b + b * (tokens.length / avgLen);
66
+ const tfScore = (tf * (k1 + 1)) / (tf + k1 * lenNorm);
67
+ const fieldScore = idf * tfScore * fieldWeight;
68
+ totalScore += fieldScore;
69
+ evidence.push(`${field}:${tok}(${fieldScore.toFixed(1)})`);
70
+ }
71
+ }
72
+ if (totalScore > 0) {
73
+ results.push({ id: doc.id, score: totalScore, evidence });
74
+ }
75
+ }
76
+ results.sort((a, b) => b.score - a.score);
77
+ return results.slice(0, limit);
78
+ }
79
+ //# sourceMappingURL=fieldedTextRanker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fieldedTextRanker.js","sourceRoot":"","sources":["../../../src/search/ranking/fieldedTextRanker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { CodeCandidate } from '../types.js';
2
+ /**
3
+ * Merge candidates from all retrievers, deduplicating by match identity.
4
+ * Overlapping candidates get a score boost.
5
+ */
6
+ export declare function mergeCandidates(inputs: {
7
+ behavior: CodeCandidate[];
8
+ identifier: CodeCandidate[];
9
+ structural: CodeCandidate[];
10
+ regex: CodeCandidate[];
11
+ doc: CodeCandidate[];
12
+ config: CodeCandidate[];
13
+ }): CodeCandidate[];
@@ -0,0 +1,85 @@
1
+ import { candidateKey } from '../types.js';
2
+ /**
3
+ * Merge candidates from all retrievers, deduplicating by match identity.
4
+ * Overlapping candidates get a score boost.
5
+ */
6
+ export function mergeCandidates(inputs) {
7
+ const merged = new Map();
8
+ // Add behavior candidates
9
+ for (const c of inputs.behavior) {
10
+ merged.set(candidateKey(c), { ...c });
11
+ }
12
+ // Merge identifier candidates — boost on overlap
13
+ for (const c of inputs.identifier) {
14
+ const key = candidateKey(c);
15
+ const existing = merged.get(key);
16
+ if (existing) {
17
+ existing.score += c.score + 3; // overlap bonus
18
+ existing.evidence.push(...c.evidence, 'multi-retriever-overlap');
19
+ for (const s of c.sources) {
20
+ if (!existing.sources.includes(s))
21
+ existing.sources.push(s);
22
+ }
23
+ }
24
+ else {
25
+ merged.set(key, { ...c });
26
+ }
27
+ }
28
+ // Merge structural candidates — boost on overlap
29
+ for (const c of inputs.structural) {
30
+ const key = candidateKey(c);
31
+ const existing = merged.get(key);
32
+ if (existing) {
33
+ existing.score += c.score + 3;
34
+ existing.evidence.push(...c.evidence, 'structural-overlap');
35
+ for (const s of c.sources) {
36
+ if (!existing.sources.includes(s))
37
+ existing.sources.push(s);
38
+ }
39
+ }
40
+ else {
41
+ merged.set(key, { ...c });
42
+ }
43
+ }
44
+ // Merge regex candidates — boost on overlap
45
+ for (const c of inputs.regex) {
46
+ const key = candidateKey(c);
47
+ const existing = merged.get(key);
48
+ if (existing) {
49
+ existing.score += c.score + 2;
50
+ existing.evidence.push(...c.evidence, 'regex-overlap');
51
+ for (const s of c.sources) {
52
+ if (!existing.sources.includes(s))
53
+ existing.sources.push(s);
54
+ }
55
+ }
56
+ else {
57
+ merged.set(key, { ...c });
58
+ }
59
+ }
60
+ // Merge doc candidates — boost on overlap with behavior/identifier
61
+ for (const c of inputs.doc) {
62
+ const key = candidateKey(c);
63
+ const existing = merged.get(key);
64
+ if (existing) {
65
+ existing.score += Math.round(c.score * 0.5) + 2; // lighter boost for doc overlap
66
+ existing.evidence.push(...c.evidence, 'doc-overlap');
67
+ for (const s of c.sources) {
68
+ if (!existing.sources.includes(s))
69
+ existing.sources.push(s);
70
+ }
71
+ }
72
+ else {
73
+ merged.set(key, { ...c });
74
+ }
75
+ }
76
+ // Add config candidates (typically no overlap with code candidates)
77
+ for (const c of inputs.config) {
78
+ const key = candidateKey(c);
79
+ if (!merged.has(key)) {
80
+ merged.set(key, { ...c });
81
+ }
82
+ }
83
+ return [...merged.values()];
84
+ }
85
+ //# sourceMappingURL=mergeCandidates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeCandidates.js","sourceRoot":"","sources":["../../../src/search/ranking/mergeCandidates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { CodeCandidate, QueryIR, SearchPlan, SearchScope } from '../types.js';
2
+ import type { LspEngine } from '../../engine/LspEngine.js';
3
+ /**
4
+ * Rank candidates with mode-aware scoring + LSP enrichment.
5
+ * First filters excluded paths, then applies penalties, enriches top candidates.
6
+ */
7
+ export declare function rankCandidates(candidates: CodeCandidate[], ctx: {
8
+ ir: QueryIR;
9
+ plan: SearchPlan;
10
+ engine: LspEngine;
11
+ scope: SearchScope;
12
+ }): Promise<CodeCandidate[]>;
@@ -0,0 +1,106 @@
1
+ import { formatHover } from '../../format/markdown.js';
2
+ import { relativePath } from '../../engine/positions.js';
3
+ import { shouldSkipDir, shouldSkipFile } from '../fileKinds.js';
4
+ import * as path from 'path';
5
+ const TEST_PATTERN = /\.(spec|test|stories)\.(ts|tsx|js|jsx)$/;
6
+ const GENERATED_PATTERN = /\/(dist|es|build|generated|__generated__|\.cache)\//;
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
+ }
22
+ /**
23
+ * Rank candidates with mode-aware scoring + LSP enrichment.
24
+ * First filters excluded paths, then applies penalties, enriches top candidates.
25
+ */
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));
29
+ // Apply penalties
30
+ for (const c of clean) {
31
+ if (TEST_PATTERN.test(c.filePath)) {
32
+ c.score -= 3;
33
+ c.evidence.push('penalty: test-file');
34
+ }
35
+ if (GENERATED_PATTERN.test(c.filePath)) {
36
+ c.score -= 10;
37
+ c.evidence.push('penalty: generated');
38
+ }
39
+ if (DEMO_PATTERN.test(c.filePath)) {
40
+ c.score -= 4;
41
+ c.evidence.push('penalty: demo');
42
+ }
43
+ if (c.filePath.endsWith('.d.ts')) {
44
+ c.score -= 6;
45
+ c.evidence.push('penalty: declaration-file');
46
+ }
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
+ }
78
+ // Filter out negative scores
79
+ const filtered = clean.filter((c) => c.score > 0);
80
+ // Sort by score
81
+ filtered.sort((a, b) => b.score - a.score);
82
+ // LSP enrichment for top candidates (use actual match position, not line 0)
83
+ const enrichLimit = Math.min(15, filtered.length);
84
+ for (let i = 0; i < enrichLimit; i++) {
85
+ const c = filtered[i];
86
+ try {
87
+ const { uri } = await ctx.engine.prepareFile(c.filePath);
88
+ const position = { line: c.line - 1, character: c.column ?? 0 };
89
+ const hover = await ctx.engine.request('textDocument/hover', { textDocument: { uri }, position }, 5000);
90
+ if (hover) {
91
+ c.signature = formatHover(hover).substring(0, 200);
92
+ if (!c.sources.includes('lsp'))
93
+ c.sources.push('lsp');
94
+ }
95
+ }
96
+ catch (err) {
97
+ c.evidence.push(`lsp-enrich-failed: ${err?.message ?? 'unknown'}`);
98
+ }
99
+ }
100
+ // Relativize file paths
101
+ for (const c of filtered) {
102
+ c.filePath = relativePath(c.filePath, ctx.engine.workspaceRoot);
103
+ }
104
+ return filtered;
105
+ }
106
+ //# sourceMappingURL=rankCandidates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rankCandidates.js","sourceRoot":"","sources":["../../../src/search/ranking/rankCandidates.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 declaration-oriented candidates based on behavior family matching.
5
+ * Uses the compiled spec's behaviorTerms (merged from parser + recipes).
6
+ */
7
+ export declare function retrieveBehaviorCandidates(ir: QueryIR, scope: SearchScope, index: WorkspaceIndex, spec?: EffectiveSearchSpec): CodeCandidate[];
@@ -0,0 +1,86 @@
1
+ import { BEHAVIOR_FAMILIES } from '../families/behaviorFamilies.js';
2
+ import { scoreFieldedQuery } from '../ranking/fieldedTextRanker.js';
3
+ import { buildSnippetFromFile } from '../../analysis/ts/snippets.js';
4
+ /**
5
+ * Retrieve declaration-oriented candidates based on behavior family matching.
6
+ * Uses the compiled spec's behaviorTerms (merged from parser + recipes).
7
+ */
8
+ export function retrieveBehaviorCandidates(ir, scope, index, spec) {
9
+ const matchedFamilies = BEHAVIOR_FAMILIES.filter((f) => ir.familyScores[f.id] > 0);
10
+ if (matchedFamilies.length === 0 && ir.nlTokens.length === 0)
11
+ return [];
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 = [];
49
+ for (const family of matchedFamilies) {
50
+ for (const hint of family.symbolHints) {
51
+ if (decl.symbolTokens.some((t) => t === hint)) {
52
+ familyBonus += 3;
53
+ familyEvidence.push(`family-hint: ${family.id}:${hint}`);
54
+ }
55
+ }
56
+ for (const hint of family.fileHints) {
57
+ if (decl.pathTokens.some((t) => t.includes(hint))) {
58
+ familyBonus += 2;
59
+ familyEvidence.push(`family-file: ${family.id}:${hint}`);
60
+ }
61
+ }
62
+ }
63
+ // Export bonus
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)
68
+ evidence.push('exported');
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
+ });
83
+ }
84
+ return candidates.sort((a, b) => b.score - a.score);
85
+ }
86
+ //# sourceMappingURL=behaviorRetriever.js.map
@@ -0,0 +1 @@
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"}
@@ -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 usage-oriented candidates based on exact identifier matching.
5
+ * Uses the compiled spec's identifiers (merged from parser + recipes).
6
+ */
7
+ export declare function retrieveIdentifierCandidates(ir: QueryIR, scope: SearchScope, index: WorkspaceIndex, spec?: EffectiveSearchSpec): CodeCandidate[];