@lzehrung/codegraph 3.0.1 → 3.1.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 (684) hide show
  1. package/README.md +17 -17
  2. package/codegraph-skill/codegraph/SKILL.md +6 -2
  3. package/dist/agent/artifact.d.ts.map +1 -1
  4. package/dist/agent/artifact.js +4 -9
  5. package/dist/agent/artifact.js.map +1 -1
  6. package/dist/agent/call-hierarchy.d.ts +4 -2
  7. package/dist/agent/call-hierarchy.d.ts.map +1 -1
  8. package/dist/agent/call-hierarchy.js +20 -29
  9. package/dist/agent/call-hierarchy.js.map +1 -1
  10. package/dist/agent/explain.d.ts.map +1 -1
  11. package/dist/agent/explain.js +24 -18
  12. package/dist/agent/explain.js.map +1 -1
  13. package/dist/agent/explore.d.ts.map +1 -1
  14. package/dist/agent/explore.js +2 -11
  15. package/dist/agent/explore.js.map +1 -1
  16. package/dist/agent/file-view.d.ts.map +1 -1
  17. package/dist/agent/file-view.js +4 -12
  18. package/dist/agent/file-view.js.map +1 -1
  19. package/dist/agent/normalize.d.ts +0 -3
  20. package/dist/agent/normalize.d.ts.map +1 -1
  21. package/dist/agent/normalize.js +1 -7
  22. package/dist/agent/normalize.js.map +1 -1
  23. package/dist/agent/orient.d.ts.map +1 -1
  24. package/dist/agent/orient.js +2 -6
  25. package/dist/agent/orient.js.map +1 -1
  26. package/dist/agent/packet.d.ts.map +1 -1
  27. package/dist/agent/packet.js +2 -5
  28. package/dist/agent/packet.js.map +1 -1
  29. package/dist/agent/query-index/content.d.ts.map +1 -1
  30. package/dist/agent/query-index/content.js +2 -6
  31. package/dist/agent/query-index/content.js.map +1 -1
  32. package/dist/agent/query-index/update.d.ts.map +1 -1
  33. package/dist/agent/query-index/update.js +8 -45
  34. package/dist/agent/query-index/update.js.map +1 -1
  35. package/dist/agent/query-index/worker-pool.d.ts.map +1 -1
  36. package/dist/agent/query-index/worker-pool.js +2 -1
  37. package/dist/agent/query-index/worker-pool.js.map +1 -1
  38. package/dist/agent/refactor-plan.d.ts +2 -2
  39. package/dist/agent/refactor-plan.d.ts.map +1 -1
  40. package/dist/agent/refactor-plan.js +11 -57
  41. package/dist/agent/refactor-plan.js.map +1 -1
  42. package/dist/agent/rename-preview.d.ts.map +1 -1
  43. package/dist/agent/rename-preview.js +166 -23
  44. package/dist/agent/rename-preview.js.map +1 -1
  45. package/dist/agent/search.d.ts +13 -0
  46. package/dist/agent/search.d.ts.map +1 -1
  47. package/dist/agent/search.js +17 -26
  48. package/dist/agent/search.js.map +1 -1
  49. package/dist/agent/semantic-symbols.d.ts +1 -1
  50. package/dist/agent/semantic-symbols.d.ts.map +1 -1
  51. package/dist/agent/semantic-symbols.js +2 -5
  52. package/dist/agent/semantic-symbols.js.map +1 -1
  53. package/dist/agent/semantic.d.ts +5 -0
  54. package/dist/agent/semantic.d.ts.map +1 -1
  55. package/dist/agent/semantic.js +12 -1
  56. package/dist/agent/semantic.js.map +1 -1
  57. package/dist/agent/session.d.ts +9 -0
  58. package/dist/agent/session.d.ts.map +1 -1
  59. package/dist/agent/session.js +59 -41
  60. package/dist/agent/session.js.map +1 -1
  61. package/dist/agent/type-hierarchy.d.ts +4 -2
  62. package/dist/agent/type-hierarchy.d.ts.map +1 -1
  63. package/dist/agent/type-hierarchy.js +19 -31
  64. package/dist/agent/type-hierarchy.js.map +1 -1
  65. package/dist/agent/workspace-symbols.d.ts +1 -1
  66. package/dist/agent/workspace-symbols.d.ts.map +1 -1
  67. package/dist/agent/workspace-symbols.js +7 -15
  68. package/dist/agent/workspace-symbols.js.map +1 -1
  69. package/dist/analysis-summary.d.ts +1 -4
  70. package/dist/analysis-summary.d.ts.map +1 -1
  71. package/dist/analysis-summary.js +58 -19
  72. package/dist/analysis-summary.js.map +1 -1
  73. package/dist/bin/cli.js +41060 -27641
  74. package/dist/bin/query-index-worker.js +268 -241
  75. package/dist/bootstrap/tree-sitter-languages.d.ts +2 -0
  76. package/dist/bootstrap/tree-sitter-languages.d.ts.map +1 -1
  77. package/dist/bootstrap/tree-sitter-languages.js +6 -19
  78. package/dist/bootstrap/tree-sitter-languages.js.map +1 -1
  79. package/dist/chunking/chunk-matches.d.ts.map +1 -1
  80. package/dist/chunking/chunk-matches.js +6 -42
  81. package/dist/chunking/chunk-matches.js.map +1 -1
  82. package/dist/chunking/chunk-split.d.ts +7 -0
  83. package/dist/chunking/chunk-split.d.ts.map +1 -1
  84. package/dist/chunking/chunk-split.js +3 -3
  85. package/dist/chunking/chunk-split.js.map +1 -1
  86. package/dist/chunking/chunk-text-file.js +2 -30
  87. package/dist/chunking/chunk-text-file.js.map +1 -1
  88. package/dist/cli/affected.d.ts.map +1 -1
  89. package/dist/cli/affected.js +1 -9
  90. package/dist/cli/affected.js.map +1 -1
  91. package/dist/cli/call-hierarchy.js +3 -6
  92. package/dist/cli/call-hierarchy.js.map +1 -1
  93. package/dist/cli/chunk.d.ts.map +1 -1
  94. package/dist/cli/chunk.js +4 -11
  95. package/dist/cli/chunk.js.map +1 -1
  96. package/dist/cli/command-table.d.ts.map +1 -1
  97. package/dist/cli/command-table.js +7 -0
  98. package/dist/cli/command-table.js.map +1 -1
  99. package/dist/cli/context.d.ts +1 -0
  100. package/dist/cli/context.d.ts.map +1 -1
  101. package/dist/cli/context.js +1 -1
  102. package/dist/cli/context.js.map +1 -1
  103. package/dist/cli/doctor.d.ts.map +1 -1
  104. package/dist/cli/doctor.js +1 -11
  105. package/dist/cli/doctor.js.map +1 -1
  106. package/dist/cli/duplicates.d.ts +5 -0
  107. package/dist/cli/duplicates.d.ts.map +1 -1
  108. package/dist/cli/duplicates.js +15 -2
  109. package/dist/cli/duplicates.js.map +1 -1
  110. package/dist/cli/graph.d.ts +4 -12
  111. package/dist/cli/graph.d.ts.map +1 -1
  112. package/dist/cli/graph.js +17 -8
  113. package/dist/cli/graph.js.map +1 -1
  114. package/dist/cli/help.d.ts +4 -4
  115. package/dist/cli/help.d.ts.map +1 -1
  116. package/dist/cli/help.js +17 -9
  117. package/dist/cli/help.js.map +1 -1
  118. package/dist/cli/index.d.ts +2 -12
  119. package/dist/cli/index.d.ts.map +1 -1
  120. package/dist/cli/index.js +2 -5
  121. package/dist/cli/index.js.map +1 -1
  122. package/dist/cli/links.d.ts.map +1 -1
  123. package/dist/cli/links.js +4 -10
  124. package/dist/cli/links.js.map +1 -1
  125. package/dist/cli/mcp.d.ts.map +1 -1
  126. package/dist/cli/mcp.js +5 -0
  127. package/dist/cli/mcp.js.map +1 -1
  128. package/dist/cli/module-locals.d.ts +8 -0
  129. package/dist/cli/module-locals.d.ts.map +1 -0
  130. package/dist/cli/module-locals.js +9 -0
  131. package/dist/cli/module-locals.js.map +1 -0
  132. package/dist/cli/navigation.d.ts +2 -0
  133. package/dist/cli/navigation.d.ts.map +1 -1
  134. package/dist/cli/navigation.js +3 -5
  135. package/dist/cli/navigation.js.map +1 -1
  136. package/dist/cli/options.d.ts.map +1 -1
  137. package/dist/cli/options.js +6 -1
  138. package/dist/cli/options.js.map +1 -1
  139. package/dist/cli/pretty.d.ts +1 -0
  140. package/dist/cli/pretty.d.ts.map +1 -1
  141. package/dist/cli/pretty.js +6 -8
  142. package/dist/cli/pretty.js.map +1 -1
  143. package/dist/cli/progress.d.ts.map +1 -1
  144. package/dist/cli/progress.js +42 -16
  145. package/dist/cli/progress.js.map +1 -1
  146. package/dist/cli/refactor-plan.js +2 -5
  147. package/dist/cli/refactor-plan.js.map +1 -1
  148. package/dist/cli/rename-preview.js +2 -5
  149. package/dist/cli/rename-preview.js.map +1 -1
  150. package/dist/cli/review.d.ts +6 -16
  151. package/dist/cli/review.d.ts.map +1 -1
  152. package/dist/cli/review.js +2 -0
  153. package/dist/cli/review.js.map +1 -1
  154. package/dist/cli/server.d.ts.map +1 -1
  155. package/dist/cli/server.js +9 -10
  156. package/dist/cli/server.js.map +1 -1
  157. package/dist/cli/type-hierarchy.js +8 -8
  158. package/dist/cli/type-hierarchy.js.map +1 -1
  159. package/dist/cli/viewer.js +1 -1
  160. package/dist/cli/viewer.js.map +1 -1
  161. package/dist/document-links/asciidoc.d.ts.map +1 -1
  162. package/dist/document-links/asciidoc.js +4 -16
  163. package/dist/document-links/asciidoc.js.map +1 -1
  164. package/dist/document-links/check.d.ts.map +1 -1
  165. package/dist/document-links/check.js +1 -3
  166. package/dist/document-links/check.js.map +1 -1
  167. package/dist/document-links/html.d.ts.map +1 -1
  168. package/dist/document-links/html.js +6 -44
  169. package/dist/document-links/html.js.map +1 -1
  170. package/dist/document-links/markdown.d.ts.map +1 -1
  171. package/dist/document-links/markdown.js +4 -13
  172. package/dist/document-links/markdown.js.map +1 -1
  173. package/dist/document-links/rst.d.ts.map +1 -1
  174. package/dist/document-links/rst.js +7 -31
  175. package/dist/document-links/rst.js.map +1 -1
  176. package/dist/document-links/sfc.d.ts.map +1 -1
  177. package/dist/document-links/sfc.js +2 -5
  178. package/dist/document-links/sfc.js.map +1 -1
  179. package/dist/document-links/shared.d.ts +2 -0
  180. package/dist/document-links/shared.d.ts.map +1 -1
  181. package/dist/document-links/shared.js +13 -0
  182. package/dist/document-links/shared.js.map +1 -1
  183. package/dist/drift/artifact.d.ts.map +1 -1
  184. package/dist/drift/artifact.js +4 -27
  185. package/dist/drift/artifact.js.map +1 -1
  186. package/dist/drift/git.d.ts.map +1 -1
  187. package/dist/drift/git.js +10 -2
  188. package/dist/drift/git.js.map +1 -1
  189. package/dist/drift/graph-edges.d.ts +4 -0
  190. package/dist/drift/graph-edges.d.ts.map +1 -0
  191. package/dist/drift/graph-edges.js +15 -0
  192. package/dist/drift/graph-edges.js.map +1 -0
  193. package/dist/drift/snapshot.d.ts.map +1 -1
  194. package/dist/drift/snapshot.js +2 -17
  195. package/dist/drift/snapshot.js.map +1 -1
  196. package/dist/duplicates/candidates.d.ts +61 -0
  197. package/dist/duplicates/candidates.d.ts.map +1 -0
  198. package/dist/duplicates/candidates.js +873 -0
  199. package/dist/duplicates/candidates.js.map +1 -0
  200. package/dist/duplicates/progress.d.ts +17 -0
  201. package/dist/duplicates/progress.d.ts.map +1 -0
  202. package/dist/duplicates/progress.js +57 -0
  203. package/dist/duplicates/progress.js.map +1 -0
  204. package/dist/duplicates/scoring.d.ts +9 -40
  205. package/dist/duplicates/scoring.d.ts.map +1 -1
  206. package/dist/duplicates/scoring.js +34 -414
  207. package/dist/duplicates/scoring.js.map +1 -1
  208. package/dist/duplicates/types.d.ts +30 -1
  209. package/dist/duplicates/types.d.ts.map +1 -1
  210. package/dist/duplicates/unit-cache.d.ts +11 -1
  211. package/dist/duplicates/unit-cache.d.ts.map +1 -1
  212. package/dist/duplicates/unit-cache.js +20 -2
  213. package/dist/duplicates/unit-cache.js.map +1 -1
  214. package/dist/duplicates/units.d.ts +4 -2
  215. package/dist/duplicates/units.d.ts.map +1 -1
  216. package/dist/duplicates/units.js +47 -25
  217. package/dist/duplicates/units.js.map +1 -1
  218. package/dist/duplicates.d.ts +1 -0
  219. package/dist/duplicates.d.ts.map +1 -1
  220. package/dist/duplicates.js +116 -62
  221. package/dist/duplicates.js.map +1 -1
  222. package/dist/graph-builder.d.ts +1 -1
  223. package/dist/graph-builder.d.ts.map +1 -1
  224. package/dist/graph-builder.js +3 -2
  225. package/dist/graph-builder.js.map +1 -1
  226. package/dist/graph-edge-collector.d.ts +3 -1
  227. package/dist/graph-edge-collector.d.ts.map +1 -1
  228. package/dist/graph-edge-collector.js +38 -6
  229. package/dist/graph-edge-collector.js.map +1 -1
  230. package/dist/graphs/angularjs.d.ts.map +1 -1
  231. package/dist/graphs/angularjs.js +2 -9
  232. package/dist/graphs/angularjs.js.map +1 -1
  233. package/dist/graphs/edge-resolution.d.ts +4 -0
  234. package/dist/graphs/edge-resolution.d.ts.map +1 -1
  235. package/dist/graphs/edge-resolution.js +2 -0
  236. package/dist/graphs/edge-resolution.js.map +1 -1
  237. package/dist/graphs/external/manifests.d.ts.map +1 -1
  238. package/dist/graphs/external/manifests.js +1 -6
  239. package/dist/graphs/external/manifests.js.map +1 -1
  240. package/dist/graphs/specifiers.d.ts.map +1 -1
  241. package/dist/graphs/specifiers.js +47 -26
  242. package/dist/graphs/specifiers.js.map +1 -1
  243. package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts +2 -0
  244. package/dist/graphs/symbol-graph-detailed/edge-passes.d.ts.map +1 -1
  245. package/dist/graphs/symbol-graph-detailed/edge-passes.js +9 -3
  246. package/dist/graphs/symbol-graph-detailed/edge-passes.js.map +1 -1
  247. package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts +3 -3
  248. package/dist/graphs/symbol-graph-detailed/receiver-calls.d.ts.map +1 -1
  249. package/dist/graphs/symbol-graph-detailed/receiver-calls.js +2 -26
  250. package/dist/graphs/symbol-graph-detailed/receiver-calls.js.map +1 -1
  251. package/dist/graphs/symbol-graph-detailed.d.ts.map +1 -1
  252. package/dist/graphs/symbol-graph-detailed.js +38 -1
  253. package/dist/graphs/symbol-graph-detailed.js.map +1 -1
  254. package/dist/impact/analyzer.d.ts.map +1 -1
  255. package/dist/impact/analyzer.js +23 -17
  256. package/dist/impact/analyzer.js.map +1 -1
  257. package/dist/impact/budgets.d.ts.map +1 -1
  258. package/dist/impact/budgets.js +3 -9
  259. package/dist/impact/budgets.js.map +1 -1
  260. package/dist/impact/call-compatibility.d.ts.map +1 -1
  261. package/dist/impact/call-compatibility.js +3 -12
  262. package/dist/impact/call-compatibility.js.map +1 -1
  263. package/dist/impact/context.d.ts +6 -0
  264. package/dist/impact/context.d.ts.map +1 -1
  265. package/dist/impact/context.js +2 -2
  266. package/dist/impact/context.js.map +1 -1
  267. package/dist/impact/direct.d.ts.map +1 -1
  268. package/dist/impact/direct.js +2 -6
  269. package/dist/impact/direct.js.map +1 -1
  270. package/dist/impact/map.d.ts +3 -1
  271. package/dist/impact/map.d.ts.map +1 -1
  272. package/dist/impact/map.js +12 -5
  273. package/dist/impact/map.js.map +1 -1
  274. package/dist/impact/providers/base.js +1 -1
  275. package/dist/impact/providers/base.js.map +1 -1
  276. package/dist/impact/reference-cache.d.ts.map +1 -1
  277. package/dist/impact/reference-cache.js +1 -24
  278. package/dist/impact/reference-cache.js.map +1 -1
  279. package/dist/impact/report-shared.d.ts +2 -1
  280. package/dist/impact/report-shared.d.ts.map +1 -1
  281. package/dist/impact/report-shared.js +10 -0
  282. package/dist/impact/report-shared.js.map +1 -1
  283. package/dist/impact/report-suggestions.d.ts.map +1 -1
  284. package/dist/impact/report-suggestions.js +2 -8
  285. package/dist/impact/report-suggestions.js.map +1 -1
  286. package/dist/impact/report.d.ts.map +1 -1
  287. package/dist/impact/report.js +2 -8
  288. package/dist/impact/report.js.map +1 -1
  289. package/dist/impact/streaming.d.ts.map +1 -1
  290. package/dist/impact/streaming.js +3 -8
  291. package/dist/impact/streaming.js.map +1 -1
  292. package/dist/indexer/build-cache/manifest.d.ts.map +1 -1
  293. package/dist/indexer/build-cache/manifest.js +10 -108
  294. package/dist/indexer/build-cache/manifest.js.map +1 -1
  295. package/dist/indexer/build-cache/module-cache.d.ts +6 -1
  296. package/dist/indexer/build-cache/module-cache.d.ts.map +1 -1
  297. package/dist/indexer/build-cache/module-cache.js +25 -2
  298. package/dist/indexer/build-cache/module-cache.js.map +1 -1
  299. package/dist/indexer/build-cache/options.d.ts +38 -1
  300. package/dist/indexer/build-cache/options.d.ts.map +1 -1
  301. package/dist/indexer/build-cache/options.js +38 -1
  302. package/dist/indexer/build-cache/options.js.map +1 -1
  303. package/dist/indexer/build-cache/project-snapshot.d.ts.map +1 -1
  304. package/dist/indexer/build-cache/project-snapshot.js +48 -99
  305. package/dist/indexer/build-cache/project-snapshot.js.map +1 -1
  306. package/dist/indexer/build-cache/reports.d.ts +1 -0
  307. package/dist/indexer/build-cache/reports.d.ts.map +1 -1
  308. package/dist/indexer/build-cache/reports.js +10 -0
  309. package/dist/indexer/build-cache/reports.js.map +1 -1
  310. package/dist/indexer/build-index.d.ts +2 -0
  311. package/dist/indexer/build-index.d.ts.map +1 -1
  312. package/dist/indexer/build-index.js +187 -57
  313. package/dist/indexer/build-index.js.map +1 -1
  314. package/dist/indexer/build-workers.d.ts +7 -1
  315. package/dist/indexer/build-workers.d.ts.map +1 -1
  316. package/dist/indexer/build-workers.js +12 -0
  317. package/dist/indexer/build-workers.js.map +1 -1
  318. package/dist/indexer/call-hierarchy.d.ts.map +1 -1
  319. package/dist/indexer/call-hierarchy.js +5 -17
  320. package/dist/indexer/call-hierarchy.js.map +1 -1
  321. package/dist/indexer/compilation-units.d.ts +32 -20
  322. package/dist/indexer/compilation-units.d.ts.map +1 -1
  323. package/dist/indexer/compilation-units.js +139 -145
  324. package/dist/indexer/compilation-units.js.map +1 -1
  325. package/dist/indexer/cpp-callables.d.ts.map +1 -1
  326. package/dist/indexer/cpp-callables.js +2 -7
  327. package/dist/indexer/cpp-callables.js.map +1 -1
  328. package/dist/indexer/import-types.d.ts +5 -0
  329. package/dist/indexer/import-types.d.ts.map +1 -1
  330. package/dist/indexer/import-types.js.map +1 -1
  331. package/dist/indexer/imports/binding-ranges.d.ts +5 -12
  332. package/dist/indexer/imports/binding-ranges.d.ts.map +1 -1
  333. package/dist/indexer/imports/binding-ranges.js +13 -19
  334. package/dist/indexer/imports/binding-ranges.js.map +1 -1
  335. package/dist/indexer/imports/context.d.ts +6 -0
  336. package/dist/indexer/imports/context.d.ts.map +1 -1
  337. package/dist/indexer/imports/import-binding-tables.d.ts +28 -13
  338. package/dist/indexer/imports/import-binding-tables.d.ts.map +1 -1
  339. package/dist/indexer/imports/import-binding-tables.js +179 -178
  340. package/dist/indexer/imports/import-binding-tables.js.map +1 -1
  341. package/dist/indexer/imports/js-text-imports.d.ts +0 -1
  342. package/dist/indexer/imports/js-text-imports.d.ts.map +1 -1
  343. package/dist/indexer/imports/js-text-imports.js +0 -176
  344. package/dist/indexer/imports/js-text-imports.js.map +1 -1
  345. package/dist/indexer/imports/language-specific.d.ts.map +1 -1
  346. package/dist/indexer/imports/language-specific.js +4 -8
  347. package/dist/indexer/imports/language-specific.js.map +1 -1
  348. package/dist/indexer/imports/python.d.ts +0 -1
  349. package/dist/indexer/imports/python.d.ts.map +1 -1
  350. package/dist/indexer/imports/python.js +1 -29
  351. package/dist/indexer/imports/python.js.map +1 -1
  352. package/dist/indexer/imports/text-import-extractors.d.ts +2 -9
  353. package/dist/indexer/imports/text-import-extractors.d.ts.map +1 -1
  354. package/dist/indexer/imports/text-import-extractors.js +0 -284
  355. package/dist/indexer/imports/text-import-extractors.js.map +1 -1
  356. package/dist/indexer/imports.d.ts +15 -0
  357. package/dist/indexer/imports.d.ts.map +1 -1
  358. package/dist/indexer/imports.js +82 -44
  359. package/dist/indexer/imports.js.map +1 -1
  360. package/dist/indexer/incremental-plan.d.ts +0 -1
  361. package/dist/indexer/incremental-plan.d.ts.map +1 -1
  362. package/dist/indexer/incremental-plan.js +6 -12
  363. package/dist/indexer/incremental-plan.js.map +1 -1
  364. package/dist/indexer/name-lookup-policies/implicit-self.d.ts.map +1 -1
  365. package/dist/indexer/name-lookup-policies/implicit-self.js +25 -4
  366. package/dist/indexer/name-lookup-policies/implicit-self.js.map +1 -1
  367. package/dist/indexer/name-resolution-types.d.ts +5 -0
  368. package/dist/indexer/name-resolution-types.d.ts.map +1 -1
  369. package/dist/indexer/name-resolution.d.ts.map +1 -1
  370. package/dist/indexer/name-resolution.js +2 -0
  371. package/dist/indexer/name-resolution.js.map +1 -1
  372. package/dist/indexer/navigation-cpp.d.ts.map +1 -1
  373. package/dist/indexer/navigation-cpp.js +3 -5
  374. package/dist/indexer/navigation-cpp.js.map +1 -1
  375. package/dist/indexer/navigation-goto.d.ts +49 -3
  376. package/dist/indexer/navigation-goto.d.ts.map +1 -1
  377. package/dist/indexer/navigation-goto.js +500 -106
  378. package/dist/indexer/navigation-goto.js.map +1 -1
  379. package/dist/indexer/navigation-local.d.ts +7 -0
  380. package/dist/indexer/navigation-local.d.ts.map +1 -1
  381. package/dist/indexer/navigation-local.js +22 -2
  382. package/dist/indexer/navigation-local.js.map +1 -1
  383. package/dist/indexer/navigation-php.d.ts +0 -1
  384. package/dist/indexer/navigation-php.d.ts.map +1 -1
  385. package/dist/indexer/navigation-php.js +1 -7
  386. package/dist/indexer/navigation-php.js.map +1 -1
  387. package/dist/indexer/navigation-references.d.ts +1 -0
  388. package/dist/indexer/navigation-references.d.ts.map +1 -1
  389. package/dist/indexer/navigation-references.js +134 -23
  390. package/dist/indexer/navigation-references.js.map +1 -1
  391. package/dist/indexer/navigation-resolve.d.ts +22 -0
  392. package/dist/indexer/navigation-resolve.d.ts.map +1 -1
  393. package/dist/indexer/navigation-resolve.js +73 -8
  394. package/dist/indexer/navigation-resolve.js.map +1 -1
  395. package/dist/indexer/navigation.d.ts +4 -1
  396. package/dist/indexer/navigation.d.ts.map +1 -1
  397. package/dist/indexer/navigation.js +398 -95
  398. package/dist/indexer/navigation.js.map +1 -1
  399. package/dist/indexer/python-property-decorator.d.ts +11 -0
  400. package/dist/indexer/python-property-decorator.d.ts.map +1 -0
  401. package/dist/indexer/python-property-decorator.js +30 -0
  402. package/dist/indexer/python-property-decorator.js.map +1 -0
  403. package/dist/indexer/shared-owner-identity.d.ts +3 -1
  404. package/dist/indexer/shared-owner-identity.d.ts.map +1 -1
  405. package/dist/indexer/shared-owner-identity.js +40 -12
  406. package/dist/indexer/shared-owner-identity.js.map +1 -1
  407. package/dist/indexer/shared.d.ts +10 -0
  408. package/dist/indexer/shared.d.ts.map +1 -1
  409. package/dist/indexer/shared.js +8 -0
  410. package/dist/indexer/shared.js.map +1 -1
  411. package/dist/indexer/star-import-precedence.d.ts +5 -1
  412. package/dist/indexer/star-import-precedence.d.ts.map +1 -1
  413. package/dist/indexer/star-import-precedence.js +12 -19
  414. package/dist/indexer/star-import-precedence.js.map +1 -1
  415. package/dist/indexer/type-hierarchy.d.ts.map +1 -1
  416. package/dist/indexer/type-hierarchy.js +8 -9
  417. package/dist/indexer/type-hierarchy.js.map +1 -1
  418. package/dist/indexer/types.d.ts +49 -1
  419. package/dist/indexer/types.d.ts.map +1 -1
  420. package/dist/indexer/types.js.map +1 -1
  421. package/dist/indexer/workspace-symbols.d.ts.map +1 -1
  422. package/dist/indexer/workspace-symbols.js +3 -13
  423. package/dist/indexer/workspace-symbols.js.map +1 -1
  424. package/dist/installer/locks.d.ts +1 -0
  425. package/dist/installer/locks.d.ts.map +1 -1
  426. package/dist/installer/locks.js +4 -8
  427. package/dist/installer/locks.js.map +1 -1
  428. package/dist/installer/registry.d.ts.map +1 -1
  429. package/dist/installer/registry.js +9 -15
  430. package/dist/installer/registry.js.map +1 -1
  431. package/dist/languages/callable-arity.d.ts.map +1 -1
  432. package/dist/languages/callable-arity.js +1 -38
  433. package/dist/languages/callable-arity.js.map +1 -1
  434. package/dist/languages/definitions/csharp.d.ts.map +1 -1
  435. package/dist/languages/definitions/csharp.js +5 -13
  436. package/dist/languages/definitions/csharp.js.map +1 -1
  437. package/dist/languages/definitions/java.d.ts.map +1 -1
  438. package/dist/languages/definitions/java.js +4 -13
  439. package/dist/languages/definitions/java.js.map +1 -1
  440. package/dist/languages/definitions/kotlin.d.ts.map +1 -1
  441. package/dist/languages/definitions/kotlin.js +4 -8
  442. package/dist/languages/definitions/kotlin.js.map +1 -1
  443. package/dist/languages/definitions/python.d.ts.map +1 -1
  444. package/dist/languages/definitions/python.js +5 -3
  445. package/dist/languages/definitions/python.js.map +1 -1
  446. package/dist/languages/import-statement-parsers.d.ts +0 -30
  447. package/dist/languages/import-statement-parsers.d.ts.map +1 -1
  448. package/dist/languages/import-statement-parsers.js +1 -81
  449. package/dist/languages/import-statement-parsers.js.map +1 -1
  450. package/dist/languages/sfc.d.ts.map +1 -1
  451. package/dist/languages/sfc.js +8 -43
  452. package/dist/languages/sfc.js.map +1 -1
  453. package/dist/lifecycle/manifest.d.ts.map +1 -1
  454. package/dist/lifecycle/manifest.js +11 -29
  455. package/dist/lifecycle/manifest.js.map +1 -1
  456. package/dist/mcp/cancellation.d.ts +6 -0
  457. package/dist/mcp/cancellation.d.ts.map +1 -0
  458. package/dist/mcp/cancellation.js +11 -0
  459. package/dist/mcp/cancellation.js.map +1 -0
  460. package/dist/mcp/handlers.d.ts +54 -3
  461. package/dist/mcp/handlers.d.ts.map +1 -1
  462. package/dist/mcp/handlers.js +186 -42
  463. package/dist/mcp/handlers.js.map +1 -1
  464. package/dist/mcp/http-transport.d.ts.map +1 -1
  465. package/dist/mcp/http-transport.js +9 -2
  466. package/dist/mcp/http-transport.js.map +1 -1
  467. package/dist/mcp/index-readiness.d.ts +114 -0
  468. package/dist/mcp/index-readiness.d.ts.map +1 -0
  469. package/dist/mcp/index-readiness.js +264 -0
  470. package/dist/mcp/index-readiness.js.map +1 -0
  471. package/dist/mcp/project-watcher.d.ts +125 -0
  472. package/dist/mcp/project-watcher.d.ts.map +1 -0
  473. package/dist/mcp/project-watcher.js +643 -0
  474. package/dist/mcp/project-watcher.js.map +1 -0
  475. package/dist/mcp/protocol.d.ts.map +1 -1
  476. package/dist/mcp/protocol.js +23 -10
  477. package/dist/mcp/protocol.js.map +1 -1
  478. package/dist/mcp/server.d.ts +2 -0
  479. package/dist/mcp/server.d.ts.map +1 -1
  480. package/dist/mcp/server.js +11 -2
  481. package/dist/mcp/server.js.map +1 -1
  482. package/dist/mcp/stale-install.d.ts +13 -0
  483. package/dist/mcp/stale-install.d.ts.map +1 -0
  484. package/dist/mcp/stale-install.js +30 -0
  485. package/dist/mcp/stale-install.js.map +1 -0
  486. package/dist/native/byte-index.d.ts +1 -0
  487. package/dist/native/byte-index.d.ts.map +1 -1
  488. package/dist/native/byte-index.js +1 -1
  489. package/dist/native/byte-index.js.map +1 -1
  490. package/dist/native/contracts.d.ts +1 -0
  491. package/dist/native/contracts.d.ts.map +1 -1
  492. package/dist/native/native-backend-report.d.ts +2 -1
  493. package/dist/native/native-backend-report.d.ts.map +1 -1
  494. package/dist/native/native-backend-report.js +23 -0
  495. package/dist/native/native-backend-report.js.map +1 -1
  496. package/dist/native/tree-shape.d.ts +5 -7
  497. package/dist/native/tree-shape.d.ts.map +1 -1
  498. package/dist/native/tree-shape.js +11 -10
  499. package/dist/native/tree-shape.js.map +1 -1
  500. package/dist/presentation/bounds.d.ts +2 -0
  501. package/dist/presentation/bounds.d.ts.map +1 -1
  502. package/dist/presentation/bounds.js +8 -0
  503. package/dist/presentation/bounds.js.map +1 -1
  504. package/dist/review/candidates.d.ts.map +1 -1
  505. package/dist/review/candidates.js +4 -25
  506. package/dist/review/candidates.js.map +1 -1
  507. package/dist/review/deleted.js +1 -1
  508. package/dist/review/deleted.js.map +1 -1
  509. package/dist/review/report.d.ts.map +1 -1
  510. package/dist/review/report.js +4 -2
  511. package/dist/review/report.js.map +1 -1
  512. package/dist/review/summaries.d.ts.map +1 -1
  513. package/dist/review/summaries.js +14 -35
  514. package/dist/review/summaries.js.map +1 -1
  515. package/dist/review.d.ts +6 -0
  516. package/dist/review.d.ts.map +1 -1
  517. package/dist/review.js +5 -6
  518. package/dist/review.js.map +1 -1
  519. package/dist/scss/navigation.d.ts +13 -0
  520. package/dist/scss/navigation.d.ts.map +1 -0
  521. package/dist/scss/navigation.js +150 -0
  522. package/dist/scss/navigation.js.map +1 -0
  523. package/dist/scss/resolution.d.ts +190 -0
  524. package/dist/scss/resolution.d.ts.map +1 -0
  525. package/dist/scss/resolution.js +1802 -0
  526. package/dist/scss/resolution.js.map +1 -0
  527. package/dist/scss/syntax.d.ts +181 -0
  528. package/dist/scss/syntax.d.ts.map +1 -0
  529. package/dist/scss/syntax.js +1436 -0
  530. package/dist/scss/syntax.js.map +1 -0
  531. package/dist/sql/classify-sql-file.d.ts +7 -0
  532. package/dist/sql/classify-sql-file.d.ts.map +1 -1
  533. package/dist/sql/classify-sql-file.js +9 -0
  534. package/dist/sql/classify-sql-file.js.map +1 -1
  535. package/dist/sql/extract-facts.d.ts.map +1 -1
  536. package/dist/sql/extract-facts.js +517 -77
  537. package/dist/sql/extract-facts.js.map +1 -1
  538. package/dist/sql/lex.d.ts +100 -1
  539. package/dist/sql/lex.d.ts.map +1 -1
  540. package/dist/sql/lex.js +473 -11
  541. package/dist/sql/lex.js.map +1 -1
  542. package/dist/sql/lookup.d.ts +17 -0
  543. package/dist/sql/lookup.d.ts.map +1 -1
  544. package/dist/sql/lookup.js +21 -0
  545. package/dist/sql/lookup.js.map +1 -1
  546. package/dist/sql/navigation.d.ts +28 -1
  547. package/dist/sql/navigation.d.ts.map +1 -1
  548. package/dist/sql/navigation.js +474 -84
  549. package/dist/sql/navigation.js.map +1 -1
  550. package/dist/sql/object-mentions.d.ts +24 -0
  551. package/dist/sql/object-mentions.d.ts.map +1 -0
  552. package/dist/sql/object-mentions.js +233 -0
  553. package/dist/sql/object-mentions.js.map +1 -0
  554. package/dist/sql/review.d.ts +3 -0
  555. package/dist/sql/review.d.ts.map +1 -1
  556. package/dist/sql/review.js +15 -14
  557. package/dist/sql/review.js.map +1 -1
  558. package/dist/sql/routine-mentions.d.ts +61 -0
  559. package/dist/sql/routine-mentions.d.ts.map +1 -0
  560. package/dist/sql/routine-mentions.js +868 -0
  561. package/dist/sql/routine-mentions.js.map +1 -0
  562. package/dist/sql/source-graph.d.ts +18 -3
  563. package/dist/sql/source-graph.d.ts.map +1 -1
  564. package/dist/sql/source-graph.js +109 -32
  565. package/dist/sql/source-graph.js.map +1 -1
  566. package/dist/sqlite/raw-query-worker-pool.d.ts.map +1 -1
  567. package/dist/sqlite/raw-query-worker-pool.js +2 -0
  568. package/dist/sqlite/raw-query-worker-pool.js.map +1 -1
  569. package/dist/sqlite/types.d.ts +6 -5
  570. package/dist/sqlite/types.d.ts.map +1 -1
  571. package/dist/sqlite/write.d.ts.map +1 -1
  572. package/dist/sqlite/write.js.map +1 -1
  573. package/dist/sqlite-driver.d.ts +0 -1
  574. package/dist/sqlite-driver.d.ts.map +1 -1
  575. package/dist/sqlite-driver.js +0 -11
  576. package/dist/sqlite-driver.js.map +1 -1
  577. package/dist/terraform/navigation.d.ts.map +1 -1
  578. package/dist/terraform/navigation.js +1 -3
  579. package/dist/terraform/navigation.js.map +1 -1
  580. package/dist/terraform/syntax.d.ts.map +1 -1
  581. package/dist/terraform/syntax.js +1 -4
  582. package/dist/terraform/syntax.js.map +1 -1
  583. package/dist/types.d.ts +2 -0
  584. package/dist/types.d.ts.map +1 -1
  585. package/dist/util/ast.d.ts +5 -0
  586. package/dist/util/ast.d.ts.map +1 -1
  587. package/dist/util/ast.js +10 -0
  588. package/dist/util/ast.js.map +1 -1
  589. package/dist/util/atomic-file.d.ts +22 -0
  590. package/dist/util/atomic-file.d.ts.map +1 -0
  591. package/dist/util/atomic-file.js +106 -0
  592. package/dist/util/atomic-file.js.map +1 -0
  593. package/dist/util/collections.d.ts +5 -0
  594. package/dist/util/collections.d.ts.map +1 -1
  595. package/dist/util/collections.js +26 -0
  596. package/dist/util/collections.js.map +1 -1
  597. package/dist/util/concurrency.d.ts +8 -0
  598. package/dist/util/concurrency.d.ts.map +1 -1
  599. package/dist/util/concurrency.js +16 -0
  600. package/dist/util/concurrency.js.map +1 -1
  601. package/dist/util/confined-file.d.ts.map +1 -1
  602. package/dist/util/confined-file.js +1 -3
  603. package/dist/util/confined-file.js.map +1 -1
  604. package/dist/util/csharp-tree.d.ts +65 -0
  605. package/dist/util/csharp-tree.d.ts.map +1 -0
  606. package/dist/util/csharp-tree.js +266 -0
  607. package/dist/util/csharp-tree.js.map +1 -0
  608. package/dist/util/errors.d.ts +1 -0
  609. package/dist/util/errors.d.ts.map +1 -1
  610. package/dist/util/errors.js +3 -0
  611. package/dist/util/errors.js.map +1 -1
  612. package/dist/util/graph-edges.d.ts +2 -0
  613. package/dist/util/graph-edges.d.ts.map +1 -1
  614. package/dist/util/graph-edges.js +11 -0
  615. package/dist/util/graph-edges.js.map +1 -1
  616. package/dist/util/guards.d.ts +1 -0
  617. package/dist/util/guards.d.ts.map +1 -1
  618. package/dist/util/guards.js +6 -0
  619. package/dist/util/guards.js.map +1 -1
  620. package/dist/util/identifiers.d.ts +0 -24
  621. package/dist/util/identifiers.d.ts.map +1 -1
  622. package/dist/util/identifiers.js +0 -24
  623. package/dist/util/identifiers.js.map +1 -1
  624. package/dist/util/jvm-tree.d.ts +58 -0
  625. package/dist/util/jvm-tree.d.ts.map +1 -0
  626. package/dist/util/jvm-tree.js +153 -0
  627. package/dist/util/jvm-tree.js.map +1 -0
  628. package/dist/util/package-exports.d.ts +0 -22
  629. package/dist/util/package-exports.d.ts.map +1 -1
  630. package/dist/util/package-exports.js +25 -5
  631. package/dist/util/package-exports.js.map +1 -1
  632. package/dist/util/paths.d.ts +1 -0
  633. package/dist/util/paths.d.ts.map +1 -1
  634. package/dist/util/paths.js +10 -4
  635. package/dist/util/paths.js.map +1 -1
  636. package/dist/util/resolution/csharp.d.ts +20 -8
  637. package/dist/util/resolution/csharp.d.ts.map +1 -1
  638. package/dist/util/resolution/csharp.js +126 -127
  639. package/dist/util/resolution/csharp.js.map +1 -1
  640. package/dist/util/resolution/files.d.ts +6 -0
  641. package/dist/util/resolution/files.d.ts.map +1 -1
  642. package/dist/util/resolution/files.js +74 -21
  643. package/dist/util/resolution/files.js.map +1 -1
  644. package/dist/util/resolution/jvm.d.ts +21 -1
  645. package/dist/util/resolution/jvm.d.ts.map +1 -1
  646. package/dist/util/resolution/jvm.js +168 -100
  647. package/dist/util/resolution/jvm.js.map +1 -1
  648. package/dist/util/resolution/project-symbols.d.ts +1 -1
  649. package/dist/util/resolution/project-symbols.d.ts.map +1 -1
  650. package/dist/util/resolution/project-symbols.js.map +1 -1
  651. package/dist/util/resolution/specifier-targets.d.ts +4 -0
  652. package/dist/util/resolution/specifier-targets.d.ts.map +1 -1
  653. package/dist/util/resolution/specifier-targets.js +11 -3
  654. package/dist/util/resolution/specifier-targets.js.map +1 -1
  655. package/dist/util/resolution.d.ts.map +1 -1
  656. package/dist/util/resolution.js +21 -7
  657. package/dist/util/resolution.js.map +1 -1
  658. package/dist/util/syntax-tree.d.ts +16 -0
  659. package/dist/util/syntax-tree.d.ts.map +1 -0
  660. package/dist/util/syntax-tree.js +34 -0
  661. package/dist/util/syntax-tree.js.map +1 -0
  662. package/dist/util/text-scanning.d.ts +6 -0
  663. package/dist/util/text-scanning.d.ts.map +1 -0
  664. package/dist/util/text-scanning.js +35 -0
  665. package/dist/util/text-scanning.js.map +1 -0
  666. package/dist/util/trivia-tables.d.ts +13 -8
  667. package/dist/util/trivia-tables.d.ts.map +1 -1
  668. package/dist/util/trivia-tables.js +13 -72
  669. package/dist/util/trivia-tables.js.map +1 -1
  670. package/dist/util/trivia.d.ts +10 -3
  671. package/dist/util/trivia.d.ts.map +1 -1
  672. package/dist/util/trivia.js +209 -79
  673. package/dist/util/trivia.js.map +1 -1
  674. package/dist/util/windows-process-drain.d.ts.map +1 -1
  675. package/dist/util/windows-process-drain.js.map +1 -1
  676. package/dist/util/worker-threads.d.ts +16 -0
  677. package/dist/util/worker-threads.d.ts.map +1 -1
  678. package/dist/util/worker-threads.js +118 -0
  679. package/dist/util/worker-threads.js.map +1 -1
  680. package/dist/worker/native-worker-pool.d.ts.map +1 -1
  681. package/dist/worker/native-worker-pool.js +2 -1
  682. package/dist/worker/native-worker-pool.js.map +1 -1
  683. package/docs/mcp.md +82 -8
  684. package/package.json +7 -7
@@ -1,15 +1,17 @@
1
1
  import { appendToArrayMap } from "../util/collections.js";
2
- import { lineSpan, normalizeDetectionFile, shortHashText } from "./units.js";
2
+ import { lineSpan, shortHashText } from "./units.js";
3
3
  export const DEFAULT_MIN_TOKENS = 40;
4
4
  export const DEFAULT_MAX_TOKENS = 800;
5
5
  export const DEFAULT_LIMIT = 50;
6
6
  export const DEFAULT_MAX_BUCKET_SIZE = 200;
7
+ export const DEFAULT_MAX_CANDIDATE_PAIRS = 2_000_000;
8
+ /** Below the 2^24 entries a JavaScript Map holds, which a larger candidate pair table would overflow. */
9
+ export const MAX_CANDIDATE_PAIRS_LIMIT = 16_000_000;
7
10
  export const DEFAULT_GROUP_VARIANT_LIMIT = 5;
8
11
  export const DEFAULT_SHINGLE_SIZE = 5;
9
12
  export const DEFAULT_WINDOW_SIZE = 4;
10
13
  export const GROUP_PRIMARY_LENGTH_RATIO_FLOOR = 0.7;
11
14
  export const NEARBY_CHUNK_VARIANT_MAX_GAP = 2;
12
- export const MIN_SIMILARITY_HINT_INDEX = 80;
13
15
  export const confidenceRank = {
14
16
  low: 1,
15
17
  medium: 2,
@@ -56,14 +58,6 @@ function ratio(left, right) {
56
58
  return 0;
57
59
  return Math.min(left, right) / Math.max(left, right);
58
60
  }
59
- function normalizeSimilarityIndex(value) {
60
- if (!Number.isFinite(value))
61
- return undefined;
62
- const bounded = Math.max(0, Math.min(100, Math.round(value)));
63
- if (bounded < MIN_SIMILARITY_HINT_INDEX)
64
- return undefined;
65
- return bounded;
66
- }
67
61
  /** Measures set similarity as intersection divided by union. */
68
62
  function jaccard(left, right) {
69
63
  if (!left.size && !right.size)
@@ -94,6 +88,13 @@ export function normalizePositiveIntegerOption(value, optionName, fallback) {
94
88
  export function normalizeNonNegativeIntegerOption(value, optionName, fallback) {
95
89
  return normalizeIntegerOption(value, optionName, fallback, 0, "a non-negative integer");
96
90
  }
91
+ export function normalizeMaxCandidatePairsOption(value) {
92
+ const resolved = normalizePositiveIntegerOption(value, "maxCandidatePairs", DEFAULT_MAX_CANDIDATE_PAIRS);
93
+ if (resolved > MAX_CANDIDATE_PAIRS_LIMIT) {
94
+ throw new Error(`Invalid maxCandidatePairs value "${resolved}". Expected an integer from 1 to ${MAX_CANDIDATE_PAIRS_LIMIT}.`);
95
+ }
96
+ return resolved;
97
+ }
97
98
  export function bestConfidence(left, right) {
98
99
  if (confidenceRank[left] >= confidenceRank[right])
99
100
  return left;
@@ -130,192 +131,20 @@ export function shouldScoreSignatureEvidence(evidence, metrics) {
130
131
  }
131
132
  return metrics.shingleOverlap >= 0.55;
132
133
  }
133
- export function pairKey(left, right) {
134
- if (left.id < right.id)
135
- return `${left.id}\u0000${right.id}`;
136
- return `${right.id}\u0000${left.id}`;
137
- }
138
- export function orderedPair(left, right) {
139
- if (left.absoluteFile < right.absoluteFile)
140
- return [left, right];
141
- if (left.absoluteFile > right.absoluteFile)
142
- return [right, left];
143
- if (left.startLine <= right.startLine)
144
- return [left, right];
145
- return [right, left];
146
- }
147
- export function hasLineOverlap(left, right) {
134
+ function hasLineOverlap(left, right) {
148
135
  if (left.absoluteFile !== right.absoluteFile)
149
136
  return false;
150
137
  return left.startLine <= right.endLine && right.startLine <= left.endLine;
151
138
  }
152
- export function addPairEvidence(pairs, evidenceKind, left, right) {
153
- const key = pairKey(left, right);
154
- const existing = pairs.get(key);
155
- if (existing) {
156
- if (evidenceKind === "signature") {
157
- existing.signatureMatches++;
158
- }
159
- else {
160
- existing[evidenceKind] = true;
161
- }
162
- return;
163
- }
164
- pairs.set(key, {
165
- left,
166
- right,
167
- rawHash: evidenceKind === "rawHash",
168
- normalizedHash: evidenceKind === "normalizedHash",
169
- astShape: evidenceKind === "astShape",
170
- signature: false,
171
- signatureMatches: evidenceKind === "signature" ? 1 : 0,
172
- });
173
- }
174
- /** Visits every unique pair from one shared-evidence bucket. */
175
- export function forEachBucketPair(bucket, pairFilter, unitFilter, visit) {
176
- if (unitFilter) {
177
- const targetUnits = bucket.filter(unitFilter);
178
- const seenPairs = new Set();
179
- for (const targetUnit of targetUnits) {
180
- for (const otherUnit of bucket) {
181
- if (targetUnit.id === otherUnit.id)
182
- continue;
183
- const [left, right] = orderedPair(targetUnit, otherUnit);
184
- const key = pairKey(left, right);
185
- if (seenPairs.has(key))
186
- continue;
187
- seenPairs.add(key);
188
- if (pairFilter && !pairFilter(left, right))
189
- continue;
190
- visit(left, right);
191
- }
192
- }
193
- return;
194
- }
195
- for (let i = 0; i < bucket.length; i++) {
196
- for (let j = i + 1; j < bucket.length; j++) {
197
- const [left, right] = orderedPair(bucket[i], bucket[j]);
198
- if (pairFilter && !pairFilter(left, right))
199
- continue;
200
- visit(left, right);
201
- }
202
- }
203
- }
204
- /** Adds every unique pair from one shared-evidence bucket. */
205
- export function addBucketPairs(bucket, pairs, evidenceKind, pairFilter, unitFilter) {
206
- forEachBucketPair(bucket, pairFilter, unitFilter, (left, right) => {
207
- addPairEvidence(pairs, evidenceKind, left, right);
208
- });
209
- }
210
- export function bucketPairCountExceeds(bucket, limit, pairFilter, unitFilter) {
211
- let count = 0;
212
- const leftUnits = unitFilter ? bucket.filter(unitFilter) : bucket;
213
- if (!leftUnits.length)
214
- return false;
215
- const seenPairs = new Set();
216
- for (const leftUnit of leftUnits) {
217
- for (const rightUnit of bucket) {
218
- if (leftUnit.id === rightUnit.id)
219
- continue;
220
- const [left, right] = orderedPair(leftUnit, rightUnit);
221
- const key = pairKey(left, right);
222
- if (seenPairs.has(key))
223
- continue;
224
- seenPairs.add(key);
225
- if (!pairFilter(left, right))
226
- continue;
227
- count++;
228
- if (count > limit)
229
- return true;
230
- }
231
- }
232
- return false;
233
- }
234
- /** Adds bounded buckets and counts skipped high-fanout buckets. */
235
- export function addBucketsToPairs(buckets, pairs, evidenceKind, maxBucketSize, pairFilter, unitFilter) {
236
- let oversizedBuckets = 0;
237
- for (const bucket of buckets.values()) {
238
- if (bucket.length < 2)
239
- continue;
240
- if (unitFilter && !bucket.some(unitFilter))
241
- continue;
242
- if (bucket.length > maxBucketSize) {
243
- if (!pairFilter || bucketPairCountExceeds(bucket, maxBucketSize, pairFilter, unitFilter)) {
244
- oversizedBuckets++;
245
- continue;
246
- }
247
- }
248
- addBucketPairs(bucket, pairs, evidenceKind, pairFilter, unitFilter);
249
- }
250
- return oversizedBuckets;
251
- }
252
- export function addConsideredSignature(consideredSignaturesByUnit, unit, signature) {
253
- const signatures = consideredSignaturesByUnit.get(unit.id);
254
- if (signatures) {
255
- signatures.add(signature);
256
- return;
257
- }
258
- consideredSignaturesByUnit.set(unit.id, new Set([signature]));
259
- }
260
139
  /**
261
- * Two-pass signature prefilter: count shared fingerprints first, then allocate
262
- * PairEvidence only for pairs that already have stronger evidence or meet the
263
- * shared-fingerprint threshold (at least 2).
140
+ * Whether the scorers can ever score a pair of units. A cross-file run skips two units of one file, and no run scores two
141
+ * units that overlap. The candidate builder admits only pairs that pass, so the pair limit is never spent on a pair that
142
+ * cannot reach a result, and the scorers need not check again.
264
143
  */
265
- export function addSignatureBucketsToPairs(buckets, pairs, consideredSignaturesByUnit, maxBucketSize, pairFilter, unitFilter) {
266
- const signatureMatchCounts = new Map();
267
- const signatureMatchUnits = new Map();
268
- let oversizedBuckets = 0;
269
- for (const [signature, bucket] of buckets) {
270
- if (bucket.length < 2)
271
- continue;
272
- if (unitFilter && !bucket.some(unitFilter))
273
- continue;
274
- if (bucket.length > maxBucketSize) {
275
- if (!pairFilter || bucketPairCountExceeds(bucket, maxBucketSize, pairFilter, unitFilter)) {
276
- oversizedBuckets++;
277
- continue;
278
- }
279
- }
280
- for (const unit of bucket) {
281
- addConsideredSignature(consideredSignaturesByUnit, unit, signature);
282
- }
283
- forEachBucketPair(bucket, pairFilter, unitFilter, (left, right) => {
284
- const key = pairKey(left, right);
285
- const next = (signatureMatchCounts.get(key) ?? 0) + 1;
286
- signatureMatchCounts.set(key, next);
287
- // Threshold floor is >= 2; keep unit refs only once a pair can qualify.
288
- if (next === 2 && !pairs.has(key) && !signatureMatchUnits.has(key)) {
289
- signatureMatchUnits.set(key, [left, right]);
290
- }
291
- });
292
- }
293
- for (const [key, count] of signatureMatchCounts) {
294
- const existing = pairs.get(key);
295
- if (existing) {
296
- existing.signatureMatches = count;
297
- continue;
298
- }
299
- if (count < 2)
300
- continue;
301
- const units = signatureMatchUnits.get(key);
302
- if (!units)
303
- continue;
304
- const [left, right] = units;
305
- if (!hasEnoughSharedFingerprintsFor(count, left.id, right.id, consideredSignaturesByUnit)) {
306
- continue;
307
- }
308
- pairs.set(key, {
309
- left,
310
- right,
311
- rawHash: false,
312
- normalizedHash: false,
313
- astShape: false,
314
- signature: false,
315
- signatureMatches: count,
316
- });
317
- }
318
- return oversizedBuckets;
144
+ export function isScorablePair(left, right, crossFileOnly) {
145
+ if (crossFileOnly && left.absoluteFile === right.absoluteFile)
146
+ return false;
147
+ return !hasLineOverlap(left, right);
319
148
  }
320
149
  /** Combines exact, normalized, fingerprint, size, and complexity signals. */
321
150
  export function scorePair(evidence, metrics) {
@@ -375,226 +204,6 @@ export function metricsForPair(evidence) {
375
204
  }
376
205
  return metrics;
377
206
  }
378
- export function addToBucket(buckets, key, unit) {
379
- appendToArrayMap(buckets, key, unit);
380
- }
381
- export function prepareDuplicateCandidateBuckets(units) {
382
- const rawHashBuckets = new Map();
383
- const normalizedHashBuckets = new Map();
384
- const astShapeBuckets = new Map();
385
- const signatureBuckets = new Map();
386
- for (const unit of units) {
387
- const languagePrefix = `${unit.languageId}:`;
388
- addToBucket(rawHashBuckets, `${languagePrefix}${unit.rawHash}`, unit);
389
- addToBucket(normalizedHashBuckets, `${languagePrefix}${unit.normalizedHash}`, unit);
390
- if (unit.astShapeHash !== undefined) {
391
- addToBucket(astShapeBuckets, `${languagePrefix}${unit.astShapeHash}`, unit);
392
- }
393
- for (const signature of unit.signatures) {
394
- addToBucket(signatureBuckets, `${languagePrefix}${signature}`, unit);
395
- }
396
- }
397
- return {
398
- units,
399
- rawHashBuckets,
400
- normalizedHashBuckets,
401
- astShapeBuckets,
402
- signatureBuckets,
403
- };
404
- }
405
- export function filterPreparedDuplicateBucketMap(buckets, unitFilter) {
406
- const filteredBuckets = new Map();
407
- for (const [key, bucket] of buckets) {
408
- const filteredBucket = bucket.filter(unitFilter);
409
- if (filteredBucket.length)
410
- filteredBuckets.set(key, filteredBucket);
411
- }
412
- return filteredBuckets;
413
- }
414
- export function filterPreparedDuplicateBuckets(preparedBuckets, unitFilter) {
415
- return {
416
- units: preparedBuckets.units.filter(unitFilter),
417
- rawHashBuckets: filterPreparedDuplicateBucketMap(preparedBuckets.rawHashBuckets, unitFilter),
418
- normalizedHashBuckets: filterPreparedDuplicateBucketMap(preparedBuckets.normalizedHashBuckets, unitFilter),
419
- astShapeBuckets: filterPreparedDuplicateBucketMap(preparedBuckets.astShapeBuckets, unitFilter),
420
- signatureBuckets: filterPreparedDuplicateBucketMap(preparedBuckets.signatureBuckets, unitFilter),
421
- };
422
- }
423
- /** Groups units by cheap fingerprints before expensive pair scoring. */
424
- export function buildCandidatePairsFromPreparedBuckets(preparedBuckets, maxBucketSize, similarityHints, projectRoot, pairFilter, unitFilter) {
425
- const pairs = new Map();
426
- const consideredSignaturesByUnit = new Map();
427
- let oversizedBuckets = 0;
428
- oversizedBuckets += addBucketsToPairs(preparedBuckets.rawHashBuckets, pairs, "rawHash", maxBucketSize, pairFilter, unitFilter);
429
- oversizedBuckets += addBucketsToPairs(preparedBuckets.normalizedHashBuckets, pairs, "normalizedHash", maxBucketSize, pairFilter, unitFilter);
430
- oversizedBuckets += addBucketsToPairs(preparedBuckets.astShapeBuckets, pairs, "astShape", maxBucketSize, pairFilter, unitFilter);
431
- oversizedBuckets += addSimilarityHintPairs(preparedBuckets.units, pairs, similarityHints, projectRoot, maxBucketSize, pairFilter);
432
- oversizedBuckets += addSignatureBucketsToPairs(preparedBuckets.signatureBuckets, pairs, consideredSignaturesByUnit, maxBucketSize, pairFilter, unitFilter);
433
- for (const [key, evidence] of pairs) {
434
- if (hasEnoughSharedFingerprints(evidence, consideredSignaturesByUnit)) {
435
- evidence.signature = true;
436
- continue;
437
- }
438
- if (!evidence.rawHash && !evidence.normalizedHash && !evidence.astShape && evidence.gitSimilarity === undefined) {
439
- pairs.delete(key);
440
- }
441
- }
442
- return { pairs, oversizedBuckets };
443
- }
444
- export function buildCandidatePairs(units, maxBucketSize, similarityHints, projectRoot, pairFilter, unitFilter) {
445
- return buildCandidatePairsFromPreparedBuckets(prepareDuplicateCandidateBuckets(units), maxBucketSize, similarityHints, projectRoot, pairFilter, unitFilter);
446
- }
447
- export function addSimilarityHintPairs(units, pairs, similarityHints, projectRoot, maxBucketSize, pairFilter) {
448
- if (!similarityHints?.length)
449
- return 0;
450
- const unitsByFile = new Map();
451
- for (const unit of units) {
452
- const bucket = unitsByFile.get(unit.absoluteFile);
453
- if (bucket) {
454
- bucket.push(unit);
455
- }
456
- else {
457
- unitsByFile.set(unit.absoluteFile, [unit]);
458
- }
459
- }
460
- let oversizedHints = 0;
461
- for (const hint of similarityHints) {
462
- const similarityIndex = normalizeSimilarityIndex(hint.similarityIndex);
463
- if (similarityIndex === undefined)
464
- continue;
465
- const leftFile = normalizeSimilarityHintFile(hint.leftFile, projectRoot);
466
- const rightFile = normalizeSimilarityHintFile(hint.rightFile, projectRoot);
467
- if (!leftFile || !rightFile || leftFile === rightFile)
468
- continue;
469
- const leftUnits = unitsByFile.get(leftFile);
470
- const rightUnits = unitsByFile.get(rightFile);
471
- if (!leftUnits?.length || !rightUnits?.length)
472
- continue;
473
- if (similarityHintPairCountExceeds(leftUnits, rightUnits, maxBucketSize, pairFilter)) {
474
- oversizedHints++;
475
- addAlignedSimilarityHintPairs(pairs, leftUnits, rightUnits, similarityIndex, maxBucketSize, pairFilter);
476
- continue;
477
- }
478
- for (const leftUnit of leftUnits) {
479
- for (const rightUnit of rightUnits) {
480
- if (leftUnit.languageId !== rightUnit.languageId)
481
- continue;
482
- const [left, right] = orderedPair(leftUnit, rightUnit);
483
- if (pairFilter && !pairFilter(left, right))
484
- continue;
485
- addSimilarityHintPair(pairs, left, right, similarityIndex);
486
- }
487
- }
488
- }
489
- return oversizedHints;
490
- }
491
- export function similarityHintPairCountExceeds(leftUnits, rightUnits, limit, pairFilter) {
492
- let count = 0;
493
- for (const leftUnit of leftUnits) {
494
- for (const rightUnit of rightUnits) {
495
- if (leftUnit.languageId !== rightUnit.languageId)
496
- continue;
497
- const [left, right] = orderedPair(leftUnit, rightUnit);
498
- if (pairFilter && !pairFilter(left, right))
499
- continue;
500
- count++;
501
- if (count > limit)
502
- return true;
503
- }
504
- }
505
- return false;
506
- }
507
- export function similarityAlignmentKey(unit) {
508
- return [unit.languageId, unit.kind, unit.symbolKind ?? ""].join(":");
509
- }
510
- export function addAlignedSimilarityHintPairs(pairs, leftUnits, rightUnits, similarityIndex, maxPairs, pairFilter) {
511
- const rightByKey = new Map();
512
- for (const unit of rightUnits) {
513
- const key = similarityAlignmentKey(unit);
514
- const bucket = rightByKey.get(key);
515
- if (bucket)
516
- bucket.push(unit);
517
- else
518
- rightByKey.set(key, [unit]);
519
- }
520
- for (const bucket of rightByKey.values()) {
521
- bucket.sort(compareUnitRefs);
522
- }
523
- const leftByKey = new Map();
524
- for (const unit of leftUnits) {
525
- const key = similarityAlignmentKey(unit);
526
- const bucket = leftByKey.get(key);
527
- if (bucket)
528
- bucket.push(unit);
529
- else
530
- leftByKey.set(key, [unit]);
531
- }
532
- for (const bucket of leftByKey.values()) {
533
- bucket.sort(compareUnitRefs);
534
- }
535
- const seenPairs = new Set();
536
- let addedPairs = 0;
537
- for (const [key, sortedLeftUnits] of Array.from(leftByKey.entries()).sort(([left], [right]) => left.localeCompare(right))) {
538
- const sortedRightUnits = rightByKey.get(key);
539
- if (!sortedRightUnits?.length)
540
- continue;
541
- const limit = Math.min(sortedLeftUnits.length, sortedRightUnits.length);
542
- for (let index = 0; index < limit; index++) {
543
- if (addedPairs >= maxPairs)
544
- return;
545
- const [left, right] = orderedPair(sortedLeftUnits[index], sortedRightUnits[index]);
546
- const pairId = pairKey(left, right);
547
- if (seenPairs.has(pairId))
548
- continue;
549
- seenPairs.add(pairId);
550
- if (pairFilter && !pairFilter(left, right))
551
- continue;
552
- addSimilarityHintPair(pairs, left, right, similarityIndex);
553
- addedPairs++;
554
- }
555
- }
556
- }
557
- export function normalizeSimilarityHintFile(file, projectRoot) {
558
- try {
559
- return normalizeDetectionFile(file, projectRoot);
560
- }
561
- catch {
562
- return undefined;
563
- }
564
- }
565
- export function addSimilarityHintPair(pairs, left, right, similarityIndex) {
566
- const key = pairKey(left, right);
567
- const existing = pairs.get(key);
568
- if (existing) {
569
- existing.gitSimilarity = Math.max(existing.gitSimilarity ?? 0, similarityIndex);
570
- return;
571
- }
572
- pairs.set(key, {
573
- left,
574
- right,
575
- rawHash: false,
576
- normalizedHash: false,
577
- astShape: false,
578
- gitSimilarity: similarityIndex,
579
- signature: false,
580
- signatureMatches: 0,
581
- });
582
- }
583
- /** Requires enough shared fingerprints to avoid incidental syntax matches. */
584
- export function hasEnoughSharedFingerprintsFor(signatureMatches, leftUnitId, rightUnitId, consideredSignaturesByUnit) {
585
- if (!signatureMatches)
586
- return false;
587
- const leftConsideredSignatures = consideredSignaturesByUnit.get(leftUnitId)?.size ?? 0;
588
- const rightConsideredSignatures = consideredSignaturesByUnit.get(rightUnitId)?.size ?? 0;
589
- const smallerConsideredSignatureCount = Math.min(leftConsideredSignatures, rightConsideredSignatures);
590
- if (!smallerConsideredSignatureCount)
591
- return false;
592
- const minimumShared = Math.max(2, Math.ceil(smallerConsideredSignatureCount * 0.25));
593
- return signatureMatches >= minimumShared;
594
- }
595
- export function hasEnoughSharedFingerprints(evidence, consideredSignaturesByUnit) {
596
- return hasEnoughSharedFingerprintsFor(evidence.signatureMatches, evidence.left.id, evidence.right.id, consideredSignaturesByUnit);
597
- }
598
207
  export function suggestionForPair(evidence) {
599
208
  const metrics = metricsForPair(evidence);
600
209
  const { score, reasons } = scorePair(evidence, metrics);
@@ -1066,15 +675,26 @@ export function enrichDuplicateGroups(groups) {
1066
675
  continue;
1067
676
  appendToArrayMap(groupIdsByComponentId, componentId, group.id);
1068
677
  }
678
+ // A component's cluster summary depends only on the component, so it is built once and shared by
679
+ // its groups. Rebuilding it per group made a component of G groups cost G sorts of G ids each.
680
+ const clusterByComponentId = new Map();
1069
681
  return groups.map((group) => {
1070
682
  const localLocations = locationsByGroupId.get(group.id) ?? groupLocations(group);
1071
683
  const primaryKey = unitRefRangeIdentity(group.primaryLeft);
1072
684
  const componentLocations = componentByKey.get(primaryKey) ?? localLocations;
1073
685
  const componentId = componentIdByKey.get(primaryKey);
1074
- const groupIds = componentId
1075
- ? Array.from(new Set(groupIdsByComponentId.get(componentId) ?? [group.id])).sort()
1076
- : [group.id];
1077
- const cluster = groupClusterSummary(componentLocations, groupIds, coveredPairs);
686
+ let cluster;
687
+ if (!componentId) {
688
+ cluster = groupClusterSummary(componentLocations, [group.id], coveredPairs);
689
+ }
690
+ else if (clusterByComponentId.has(componentId)) {
691
+ cluster = clusterByComponentId.get(componentId);
692
+ }
693
+ else {
694
+ const groupIds = Array.from(new Set(groupIdsByComponentId.get(componentId) ?? [group.id])).sort();
695
+ cluster = groupClusterSummary(componentLocations, groupIds, coveredPairs);
696
+ clusterByComponentId.set(componentId, cluster);
697
+ }
1078
698
  const cleanupLabels = cleanupLabelsForGroup(group, localLocations);
1079
699
  if (!cleanupLabels.includes("test-helper-extraction") && cluster) {
1080
700
  if (cluster.files.length && cluster.files.every(isTestFile) && cluster.locationCount >= 3) {