@monoes/monograph 1.2.0 → 1.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 (460) hide show
  1. package/__tests__/mcp-tools/cypher.test.ts +10 -6
  2. package/__tests__/mcp-tools/detect-changes.test.ts +14 -11
  3. package/__tests__/pipeline/phases/wildcard-synthesis.test.ts +4 -4
  4. package/__tests__/search/embed-batch-config.test.ts +7 -7
  5. package/__tests__/search/hybrid-query.test.ts +3 -1
  6. package/__tests__/web/api.test.ts +1 -1
  7. package/dist/src/analysis/churn-cache.d.ts.map +1 -1
  8. package/dist/src/analysis/churn-cache.js +19 -6
  9. package/dist/src/analysis/churn-cache.js.map +1 -1
  10. package/dist/src/analysis/churn-trend.d.ts.map +1 -1
  11. package/dist/src/analysis/churn-trend.js +50 -6
  12. package/dist/src/analysis/churn-trend.js.map +1 -1
  13. package/dist/src/analysis/cluster-quality.d.ts +3 -0
  14. package/dist/src/analysis/cluster-quality.d.ts.map +1 -1
  15. package/dist/src/analysis/cluster-quality.js +18 -12
  16. package/dist/src/analysis/cluster-quality.js.map +1 -1
  17. package/dist/src/analysis/coverage-gaps.d.ts +3 -0
  18. package/dist/src/analysis/coverage-gaps.d.ts.map +1 -1
  19. package/dist/src/analysis/coverage-gaps.js +40 -1
  20. package/dist/src/analysis/coverage-gaps.js.map +1 -1
  21. package/dist/src/analysis/dep-classification.d.ts +2 -0
  22. package/dist/src/analysis/dep-classification.d.ts.map +1 -1
  23. package/dist/src/analysis/dep-classification.js +30 -0
  24. package/dist/src/analysis/dep-classification.js.map +1 -1
  25. package/dist/src/analysis/dependency-health.d.ts +4 -0
  26. package/dist/src/analysis/dependency-health.d.ts.map +1 -1
  27. package/dist/src/analysis/dependency-health.js +28 -0
  28. package/dist/src/analysis/dependency-health.js.map +1 -1
  29. package/dist/src/analysis/duplicate-exports.d.ts +9 -5
  30. package/dist/src/analysis/duplicate-exports.d.ts.map +1 -1
  31. package/dist/src/analysis/duplicate-exports.js +26 -2
  32. package/dist/src/analysis/duplicate-exports.js.map +1 -1
  33. package/dist/src/analysis/feature-flags.d.ts.map +1 -1
  34. package/dist/src/analysis/feature-flags.js +36 -17
  35. package/dist/src/analysis/feature-flags.js.map +1 -1
  36. package/dist/src/analysis/node-similarity.d.ts +19 -0
  37. package/dist/src/analysis/node-similarity.d.ts.map +1 -1
  38. package/dist/src/analysis/node-similarity.js +34 -3
  39. package/dist/src/analysis/node-similarity.js.map +1 -1
  40. package/dist/src/analysis/private-type-leaks.d.ts +4 -0
  41. package/dist/src/analysis/private-type-leaks.d.ts.map +1 -1
  42. package/dist/src/analysis/private-type-leaks.js +43 -2
  43. package/dist/src/analysis/private-type-leaks.js.map +1 -1
  44. package/dist/src/analysis/project-state.d.ts +2 -0
  45. package/dist/src/analysis/project-state.d.ts.map +1 -1
  46. package/dist/src/analysis/project-state.js +18 -7
  47. package/dist/src/analysis/project-state.js.map +1 -1
  48. package/dist/src/analysis/suppressions.d.ts.map +1 -1
  49. package/dist/src/analysis/suppressions.js +3 -1
  50. package/dist/src/analysis/suppressions.js.map +1 -1
  51. package/dist/src/analysis/trace.d.ts +5 -3
  52. package/dist/src/analysis/trace.d.ts.map +1 -1
  53. package/dist/src/analysis/trace.js +59 -53
  54. package/dist/src/analysis/trace.js.map +1 -1
  55. package/dist/src/analysis/unused-class-members.d.ts.map +1 -1
  56. package/dist/src/analysis/unused-class-members.js +7 -1
  57. package/dist/src/analysis/unused-class-members.js.map +1 -1
  58. package/dist/src/analysis/worker-pool.d.ts +3 -0
  59. package/dist/src/analysis/worker-pool.d.ts.map +1 -1
  60. package/dist/src/analysis/worker-pool.js +30 -8
  61. package/dist/src/analysis/worker-pool.js.map +1 -1
  62. package/dist/src/cli/augment.d.ts.map +1 -1
  63. package/dist/src/cli/augment.js +10 -3
  64. package/dist/src/cli/augment.js.map +1 -1
  65. package/dist/src/export/sarif.js +5 -5
  66. package/dist/src/export/sarif.js.map +1 -1
  67. package/dist/src/graph/analyzer.d.ts.map +1 -1
  68. package/dist/src/graph/analyzer.js +17 -2
  69. package/dist/src/graph/analyzer.js.map +1 -1
  70. package/dist/src/graph/author-analytics.d.ts +2 -0
  71. package/dist/src/graph/author-analytics.d.ts.map +1 -1
  72. package/dist/src/graph/author-analytics.js +39 -5
  73. package/dist/src/graph/author-analytics.js.map +1 -1
  74. package/dist/src/graph/baseline.d.ts +5 -0
  75. package/dist/src/graph/baseline.d.ts.map +1 -1
  76. package/dist/src/graph/baseline.js +65 -18
  77. package/dist/src/graph/baseline.js.map +1 -1
  78. package/dist/src/graph/clone-detector.d.ts.map +1 -1
  79. package/dist/src/graph/clone-detector.js +19 -33
  80. package/dist/src/graph/clone-detector.js.map +1 -1
  81. package/dist/src/graph/clone-families.d.ts +2 -0
  82. package/dist/src/graph/clone-families.d.ts.map +1 -1
  83. package/dist/src/graph/clone-families.js +38 -10
  84. package/dist/src/graph/clone-families.js.map +1 -1
  85. package/dist/src/graph/codeowners-extended.d.ts +17 -0
  86. package/dist/src/graph/codeowners-extended.d.ts.map +1 -1
  87. package/dist/src/graph/codeowners-extended.js +42 -0
  88. package/dist/src/graph/codeowners-extended.js.map +1 -1
  89. package/dist/src/graph/codeowners-gitlab.d.ts +21 -0
  90. package/dist/src/graph/codeowners-gitlab.d.ts.map +1 -1
  91. package/dist/src/graph/codeowners-gitlab.js +37 -0
  92. package/dist/src/graph/codeowners-gitlab.js.map +1 -1
  93. package/dist/src/graph/codeowners.d.ts +10 -0
  94. package/dist/src/graph/codeowners.d.ts.map +1 -1
  95. package/dist/src/graph/codeowners.js +24 -2
  96. package/dist/src/graph/codeowners.js.map +1 -1
  97. package/dist/src/graph/complexity.d.ts +10 -0
  98. package/dist/src/graph/complexity.d.ts.map +1 -1
  99. package/dist/src/graph/complexity.js +93 -43
  100. package/dist/src/graph/complexity.js.map +1 -1
  101. package/dist/src/graph/cross-reference-findings.d.ts.map +1 -1
  102. package/dist/src/graph/cross-reference-findings.js +19 -2
  103. package/dist/src/graph/cross-reference-findings.js.map +1 -1
  104. package/dist/src/graph/cross-reference.d.ts +4 -0
  105. package/dist/src/graph/cross-reference.d.ts.map +1 -1
  106. package/dist/src/graph/cross-reference.js +23 -0
  107. package/dist/src/graph/cross-reference.js.map +1 -1
  108. package/dist/src/graph/cycle-detection.d.ts +2 -0
  109. package/dist/src/graph/cycle-detection.d.ts.map +1 -1
  110. package/dist/src/graph/cycle-detection.js +26 -3
  111. package/dist/src/graph/cycle-detection.js.map +1 -1
  112. package/dist/src/graph/cycles.d.ts +11 -3
  113. package/dist/src/graph/cycles.d.ts.map +1 -1
  114. package/dist/src/graph/cycles.js +121 -83
  115. package/dist/src/graph/cycles.js.map +1 -1
  116. package/dist/src/graph/dead-code.d.ts +23 -0
  117. package/dist/src/graph/dead-code.d.ts.map +1 -1
  118. package/dist/src/graph/dead-code.js +53 -13
  119. package/dist/src/graph/dead-code.js.map +1 -1
  120. package/dist/src/graph/dependency-closure.d.ts.map +1 -1
  121. package/dist/src/graph/dependency-closure.js +20 -4
  122. package/dist/src/graph/dependency-closure.js.map +1 -1
  123. package/dist/src/graph/dfs.d.ts +14 -0
  124. package/dist/src/graph/dfs.d.ts.map +1 -1
  125. package/dist/src/graph/dfs.js +61 -0
  126. package/dist/src/graph/dfs.js.map +1 -1
  127. package/dist/src/graph/duplication-stats.d.ts.map +1 -1
  128. package/dist/src/graph/duplication-stats.js +19 -3
  129. package/dist/src/graph/duplication-stats.js.map +1 -1
  130. package/dist/src/graph/edge-filter.d.ts +2 -0
  131. package/dist/src/graph/edge-filter.d.ts.map +1 -1
  132. package/dist/src/graph/edge-filter.js +26 -12
  133. package/dist/src/graph/edge-filter.js.map +1 -1
  134. package/dist/src/graph/health-score.d.ts +8 -0
  135. package/dist/src/graph/health-score.d.ts.map +1 -1
  136. package/dist/src/graph/health-score.js +48 -17
  137. package/dist/src/graph/health-score.js.map +1 -1
  138. package/dist/src/graph/hotspots.d.ts +7 -0
  139. package/dist/src/graph/hotspots.d.ts.map +1 -1
  140. package/dist/src/graph/hotspots.js +50 -5
  141. package/dist/src/graph/hotspots.js.map +1 -1
  142. package/dist/src/graph/import-chain.d.ts +17 -1
  143. package/dist/src/graph/import-chain.d.ts.map +1 -1
  144. package/dist/src/graph/import-chain.js +68 -19
  145. package/dist/src/graph/import-chain.js.map +1 -1
  146. package/dist/src/graph/loader.d.ts.map +1 -1
  147. package/dist/src/graph/loader.js +9 -10
  148. package/dist/src/graph/loader.js.map +1 -1
  149. package/dist/src/graph/maintainability.d.ts +8 -0
  150. package/dist/src/graph/maintainability.d.ts.map +1 -1
  151. package/dist/src/graph/maintainability.js +65 -10
  152. package/dist/src/graph/maintainability.js.map +1 -1
  153. package/dist/src/graph/mirrored-dirs.d.ts +4 -0
  154. package/dist/src/graph/mirrored-dirs.d.ts.map +1 -1
  155. package/dist/src/graph/mirrored-dirs.js +48 -13
  156. package/dist/src/graph/mirrored-dirs.js.map +1 -1
  157. package/dist/src/graph/narrowing.d.ts +15 -0
  158. package/dist/src/graph/narrowing.d.ts.map +1 -1
  159. package/dist/src/graph/narrowing.js +33 -0
  160. package/dist/src/graph/narrowing.js.map +1 -1
  161. package/dist/src/graph/node-search.d.ts +3 -0
  162. package/dist/src/graph/node-search.d.ts.map +1 -1
  163. package/dist/src/graph/node-search.js +37 -4
  164. package/dist/src/graph/node-search.js.map +1 -1
  165. package/dist/src/graph/normalize-id.d.ts +4 -0
  166. package/dist/src/graph/normalize-id.d.ts.map +1 -1
  167. package/dist/src/graph/normalize-id.js +25 -2
  168. package/dist/src/graph/normalize-id.js.map +1 -1
  169. package/dist/src/graph/pagerank.d.ts +7 -0
  170. package/dist/src/graph/pagerank.d.ts.map +1 -1
  171. package/dist/src/graph/pagerank.js +49 -2
  172. package/dist/src/graph/pagerank.js.map +1 -1
  173. package/dist/src/graph/prune.d.ts +31 -0
  174. package/dist/src/graph/prune.d.ts.map +1 -1
  175. package/dist/src/graph/prune.js +65 -0
  176. package/dist/src/graph/prune.js.map +1 -1
  177. package/dist/src/graph/regex-search.d.ts +10 -2
  178. package/dist/src/graph/regex-search.d.ts.map +1 -1
  179. package/dist/src/graph/regex-search.js +33 -4
  180. package/dist/src/graph/regex-search.js.map +1 -1
  181. package/dist/src/graph/regression.d.ts +5 -0
  182. package/dist/src/graph/regression.d.ts.map +1 -1
  183. package/dist/src/graph/regression.js +45 -23
  184. package/dist/src/graph/regression.js.map +1 -1
  185. package/dist/src/graph/ripple-impact.d.ts +27 -0
  186. package/dist/src/graph/ripple-impact.d.ts.map +1 -1
  187. package/dist/src/graph/ripple-impact.js +55 -7
  188. package/dist/src/graph/ripple-impact.js.map +1 -1
  189. package/dist/src/graph/risk-profile.d.ts +7 -0
  190. package/dist/src/graph/risk-profile.d.ts.map +1 -1
  191. package/dist/src/graph/risk-profile.js +82 -48
  192. package/dist/src/graph/risk-profile.js.map +1 -1
  193. package/dist/src/graph/shingle-filter.d.ts.map +1 -1
  194. package/dist/src/graph/shingle-filter.js +25 -26
  195. package/dist/src/graph/shingle-filter.js.map +1 -1
  196. package/dist/src/graph/statistics.d.ts +19 -0
  197. package/dist/src/graph/statistics.d.ts.map +1 -1
  198. package/dist/src/graph/statistics.js +53 -40
  199. package/dist/src/graph/statistics.js.map +1 -1
  200. package/dist/src/graph/stats.d.ts +2 -0
  201. package/dist/src/graph/stats.d.ts.map +1 -1
  202. package/dist/src/graph/stats.js +54 -8
  203. package/dist/src/graph/stats.js.map +1 -1
  204. package/dist/src/graph/subgraph.d.ts +5 -0
  205. package/dist/src/graph/subgraph.d.ts.map +1 -1
  206. package/dist/src/graph/subgraph.js +73 -9
  207. package/dist/src/graph/subgraph.js.map +1 -1
  208. package/dist/src/graph/topo-sort.d.ts +15 -0
  209. package/dist/src/graph/topo-sort.d.ts.map +1 -1
  210. package/dist/src/graph/topo-sort.js +83 -10
  211. package/dist/src/graph/topo-sort.js.map +1 -1
  212. package/dist/src/graph/wcc.d.ts +29 -0
  213. package/dist/src/graph/wcc.d.ts.map +1 -1
  214. package/dist/src/graph/wcc.js +122 -39
  215. package/dist/src/graph/wcc.js.map +1 -1
  216. package/dist/src/index.js +1 -1
  217. package/dist/src/index.js.map +1 -1
  218. package/dist/src/mcp-tools/api-impact.d.ts.map +1 -1
  219. package/dist/src/mcp-tools/api-impact.js +13 -6
  220. package/dist/src/mcp-tools/api-impact.js.map +1 -1
  221. package/dist/src/mcp-tools/context.d.ts.map +1 -1
  222. package/dist/src/mcp-tools/context.js +19 -29
  223. package/dist/src/mcp-tools/context.js.map +1 -1
  224. package/dist/src/mcp-tools/cypher.d.ts +11 -0
  225. package/dist/src/mcp-tools/cypher.d.ts.map +1 -1
  226. package/dist/src/mcp-tools/cypher.js +13 -1
  227. package/dist/src/mcp-tools/cypher.js.map +1 -1
  228. package/dist/src/mcp-tools/detect-changes.d.ts.map +1 -1
  229. package/dist/src/mcp-tools/detect-changes.js +35 -20
  230. package/dist/src/mcp-tools/detect-changes.js.map +1 -1
  231. package/dist/src/mcp-tools/explain.d.ts.map +1 -1
  232. package/dist/src/mcp-tools/explain.js +4 -1
  233. package/dist/src/mcp-tools/explain.js.map +1 -1
  234. package/dist/src/mcp-tools/graph-query.d.ts +2 -0
  235. package/dist/src/mcp-tools/graph-query.d.ts.map +1 -1
  236. package/dist/src/mcp-tools/graph-query.js +20 -3
  237. package/dist/src/mcp-tools/graph-query.js.map +1 -1
  238. package/dist/src/mcp-tools/group-list.d.ts +1 -0
  239. package/dist/src/mcp-tools/group-list.d.ts.map +1 -1
  240. package/dist/src/mcp-tools/group-list.js +7 -9
  241. package/dist/src/mcp-tools/group-list.js.map +1 -1
  242. package/dist/src/mcp-tools/impact.d.ts.map +1 -1
  243. package/dist/src/mcp-tools/impact.js +20 -59
  244. package/dist/src/mcp-tools/impact.js.map +1 -1
  245. package/dist/src/mcp-tools/neighbors.d.ts.map +1 -1
  246. package/dist/src/mcp-tools/neighbors.js +24 -33
  247. package/dist/src/mcp-tools/neighbors.js.map +1 -1
  248. package/dist/src/mcp-tools/query.d.ts +2 -0
  249. package/dist/src/mcp-tools/query.d.ts.map +1 -1
  250. package/dist/src/mcp-tools/query.js +1 -0
  251. package/dist/src/mcp-tools/query.js.map +1 -1
  252. package/dist/src/mcp-tools/rename.d.ts.map +1 -1
  253. package/dist/src/mcp-tools/rename.js +12 -7
  254. package/dist/src/mcp-tools/rename.js.map +1 -1
  255. package/dist/src/mcp-tools/route-map.d.ts.map +1 -1
  256. package/dist/src/mcp-tools/route-map.js +19 -23
  257. package/dist/src/mcp-tools/route-map.js.map +1 -1
  258. package/dist/src/mcp-tools/shape-check.d.ts.map +1 -1
  259. package/dist/src/mcp-tools/shape-check.js +17 -13
  260. package/dist/src/mcp-tools/shape-check.js.map +1 -1
  261. package/dist/src/parsers/loader.js +6 -5
  262. package/dist/src/parsers/loader.js.map +1 -1
  263. package/dist/src/pipeline/cluster-only.d.ts.map +1 -1
  264. package/dist/src/pipeline/cluster-only.js +8 -4
  265. package/dist/src/pipeline/cluster-only.js.map +1 -1
  266. package/dist/src/pipeline/orchestrator.d.ts.map +1 -1
  267. package/dist/src/pipeline/orchestrator.js +19 -0
  268. package/dist/src/pipeline/orchestrator.js.map +1 -1
  269. package/dist/src/pipeline/phases/boundary.d.ts +2 -0
  270. package/dist/src/pipeline/phases/boundary.d.ts.map +1 -1
  271. package/dist/src/pipeline/phases/boundary.js +31 -2
  272. package/dist/src/pipeline/phases/boundary.js.map +1 -1
  273. package/dist/src/pipeline/phases/communities.d.ts +14 -0
  274. package/dist/src/pipeline/phases/communities.d.ts.map +1 -1
  275. package/dist/src/pipeline/phases/communities.js +58 -5
  276. package/dist/src/pipeline/phases/communities.js.map +1 -1
  277. package/dist/src/pipeline/phases/contextual-proximity.d.ts.map +1 -1
  278. package/dist/src/pipeline/phases/contextual-proximity.js +21 -14
  279. package/dist/src/pipeline/phases/contextual-proximity.js.map +1 -1
  280. package/dist/src/pipeline/phases/cross-file.d.ts.map +1 -1
  281. package/dist/src/pipeline/phases/cross-file.js +35 -14
  282. package/dist/src/pipeline/phases/cross-file.js.map +1 -1
  283. package/dist/src/pipeline/phases/field-access.d.ts.map +1 -1
  284. package/dist/src/pipeline/phases/field-access.js +9 -4
  285. package/dist/src/pipeline/phases/field-access.js.map +1 -1
  286. package/dist/src/pipeline/phases/god-nodes.d.ts +4 -0
  287. package/dist/src/pipeline/phases/god-nodes.d.ts.map +1 -1
  288. package/dist/src/pipeline/phases/god-nodes.js +43 -9
  289. package/dist/src/pipeline/phases/god-nodes.js.map +1 -1
  290. package/dist/src/pipeline/phases/import-resolver.d.ts +11 -0
  291. package/dist/src/pipeline/phases/import-resolver.d.ts.map +1 -1
  292. package/dist/src/pipeline/phases/import-resolver.js +34 -7
  293. package/dist/src/pipeline/phases/import-resolver.js.map +1 -1
  294. package/dist/src/pipeline/phases/leiden.d.ts.map +1 -1
  295. package/dist/src/pipeline/phases/leiden.js +27 -19
  296. package/dist/src/pipeline/phases/leiden.js.map +1 -1
  297. package/dist/src/pipeline/phases/markdown.d.ts.map +1 -1
  298. package/dist/src/pipeline/phases/markdown.js +10 -5
  299. package/dist/src/pipeline/phases/markdown.js.map +1 -1
  300. package/dist/src/pipeline/phases/pdf-parse.d.ts.map +1 -1
  301. package/dist/src/pipeline/phases/pdf-parse.js +18 -3
  302. package/dist/src/pipeline/phases/pdf-parse.js.map +1 -1
  303. package/dist/src/pipeline/phases/processes.d.ts.map +1 -1
  304. package/dist/src/pipeline/phases/processes.js +26 -9
  305. package/dist/src/pipeline/phases/processes.js.map +1 -1
  306. package/dist/src/pipeline/phases/re-export-propagation.d.ts.map +1 -1
  307. package/dist/src/pipeline/phases/re-export-propagation.js +33 -14
  308. package/dist/src/pipeline/phases/re-export-propagation.js.map +1 -1
  309. package/dist/src/pipeline/phases/reachability.d.ts.map +1 -1
  310. package/dist/src/pipeline/phases/reachability.js +42 -26
  311. package/dist/src/pipeline/phases/reachability.js.map +1 -1
  312. package/dist/src/pipeline/phases/routes.d.ts.map +1 -1
  313. package/dist/src/pipeline/phases/routes.js +30 -21
  314. package/dist/src/pipeline/phases/routes.js.map +1 -1
  315. package/dist/src/pipeline/phases/scope-resolution.d.ts.map +1 -1
  316. package/dist/src/pipeline/phases/scope-resolution.js +93 -63
  317. package/dist/src/pipeline/phases/scope-resolution.js.map +1 -1
  318. package/dist/src/pipeline/runner.d.ts +4 -0
  319. package/dist/src/pipeline/runner.d.ts.map +1 -1
  320. package/dist/src/pipeline/runner.js +30 -11
  321. package/dist/src/pipeline/runner.js.map +1 -1
  322. package/dist/src/query/cypher-parser.d.ts +20 -0
  323. package/dist/src/query/cypher-parser.d.ts.map +1 -1
  324. package/dist/src/query/cypher-parser.js +73 -0
  325. package/dist/src/query/cypher-parser.js.map +1 -1
  326. package/dist/src/search/embed-batch.d.ts.map +1 -1
  327. package/dist/src/search/embed-batch.js +4 -1
  328. package/dist/src/search/embed-batch.js.map +1 -1
  329. package/dist/src/search/hybrid-query.d.ts +4 -0
  330. package/dist/src/search/hybrid-query.d.ts.map +1 -1
  331. package/dist/src/search/hybrid-query.js +5 -1
  332. package/dist/src/search/hybrid-query.js.map +1 -1
  333. package/dist/src/staleness/git-staleness.js +3 -3
  334. package/dist/src/staleness/git-staleness.js.map +1 -1
  335. package/dist/src/storage/db.d.ts.map +1 -1
  336. package/dist/src/storage/db.js +12 -0
  337. package/dist/src/storage/db.js.map +1 -1
  338. package/dist/src/storage/edge-store.d.ts +2 -0
  339. package/dist/src/storage/edge-store.d.ts.map +1 -1
  340. package/dist/src/storage/edge-store.js +26 -1
  341. package/dist/src/storage/edge-store.js.map +1 -1
  342. package/dist/src/storage/embedding-store.d.ts +16 -0
  343. package/dist/src/storage/embedding-store.d.ts.map +1 -1
  344. package/dist/src/storage/embedding-store.js +26 -2
  345. package/dist/src/storage/embedding-store.js.map +1 -1
  346. package/dist/src/storage/file-cache.d.ts +5 -0
  347. package/dist/src/storage/file-cache.d.ts.map +1 -1
  348. package/dist/src/storage/file-cache.js +35 -9
  349. package/dist/src/storage/file-cache.js.map +1 -1
  350. package/dist/src/storage/fts-store.d.ts +4 -0
  351. package/dist/src/storage/fts-store.d.ts.map +1 -1
  352. package/dist/src/storage/fts-store.js +8 -3
  353. package/dist/src/storage/fts-store.js.map +1 -1
  354. package/dist/src/storage/node-store.d.ts +2 -0
  355. package/dist/src/storage/node-store.d.ts.map +1 -1
  356. package/dist/src/storage/node-store.js +28 -1
  357. package/dist/src/storage/node-store.js.map +1 -1
  358. package/dist/tsconfig.tsbuildinfo +1 -1
  359. package/package.json +1 -1
  360. package/src/__tests__/pipeline/runner.parallel.test.ts +2 -2
  361. package/src/analysis/churn-cache.ts +18 -7
  362. package/src/analysis/churn-trend.ts +35 -6
  363. package/src/analysis/cluster-quality.ts +20 -11
  364. package/src/analysis/coverage-gaps.ts +44 -1
  365. package/src/analysis/dep-classification.ts +34 -0
  366. package/src/analysis/dependency-health.ts +25 -0
  367. package/src/analysis/duplicate-exports.ts +40 -4
  368. package/src/analysis/feature-flags.ts +37 -17
  369. package/src/analysis/node-similarity.ts +45 -4
  370. package/src/analysis/private-type-leaks.ts +49 -2
  371. package/src/analysis/project-state.ts +19 -9
  372. package/src/analysis/suppressions.ts +4 -1
  373. package/src/analysis/trace.ts +73 -54
  374. package/src/analysis/unused-class-members.ts +8 -1
  375. package/src/analysis/worker-pool.ts +40 -8
  376. package/src/cli/augment.ts +10 -3
  377. package/src/export/sarif.ts +5 -5
  378. package/src/graph/analyzer.ts +26 -2
  379. package/src/graph/author-analytics.ts +45 -5
  380. package/src/graph/baseline.ts +78 -24
  381. package/src/graph/clone-detector.ts +22 -36
  382. package/src/graph/clone-families.ts +34 -10
  383. package/src/graph/codeowners-extended.ts +54 -0
  384. package/src/graph/codeowners-gitlab.ts +46 -0
  385. package/src/graph/codeowners.ts +33 -2
  386. package/src/graph/complexity.ts +102 -47
  387. package/src/graph/cross-reference-findings.ts +23 -2
  388. package/src/graph/cross-reference.ts +26 -0
  389. package/src/graph/cycle-detection.ts +22 -3
  390. package/src/graph/cycles.ts +155 -96
  391. package/src/graph/dead-code.ts +76 -17
  392. package/src/graph/dependency-closure.ts +24 -7
  393. package/src/graph/dfs.ts +78 -0
  394. package/src/graph/duplication-stats.ts +17 -6
  395. package/src/graph/edge-filter.ts +26 -12
  396. package/src/graph/health-score.ts +47 -17
  397. package/src/graph/hotspots.ts +57 -8
  398. package/src/graph/import-chain.ts +89 -19
  399. package/src/graph/loader.ts +10 -7
  400. package/src/graph/maintainability.ts +72 -22
  401. package/src/graph/mirrored-dirs.ts +45 -14
  402. package/src/graph/narrowing.ts +44 -0
  403. package/src/graph/node-search.ts +49 -4
  404. package/src/graph/normalize-id.ts +26 -2
  405. package/src/graph/pagerank.ts +69 -2
  406. package/src/graph/prune.ts +76 -0
  407. package/src/graph/regex-search.ts +38 -4
  408. package/src/graph/regression.ts +48 -23
  409. package/src/graph/ripple-impact.ts +71 -11
  410. package/src/graph/risk-profile.ts +98 -53
  411. package/src/graph/shingle-filter.ts +33 -27
  412. package/src/graph/statistics.ts +73 -45
  413. package/src/graph/stats.ts +50 -16
  414. package/src/graph/subgraph.ts +96 -25
  415. package/src/graph/topo-sort.ts +101 -16
  416. package/src/graph/wcc.ts +146 -37
  417. package/src/index.ts +1 -1
  418. package/src/mcp-tools/api-impact.ts +13 -6
  419. package/src/mcp-tools/context.ts +31 -40
  420. package/src/mcp-tools/cypher.ts +14 -1
  421. package/src/mcp-tools/detect-changes.ts +38 -23
  422. package/src/mcp-tools/explain.ts +4 -1
  423. package/src/mcp-tools/graph-query.ts +24 -3
  424. package/src/mcp-tools/group-list.ts +9 -11
  425. package/src/mcp-tools/impact.ts +26 -66
  426. package/src/mcp-tools/neighbors.ts +34 -39
  427. package/src/mcp-tools/query.ts +3 -0
  428. package/src/mcp-tools/rename.ts +9 -8
  429. package/src/mcp-tools/route-map.ts +21 -23
  430. package/src/mcp-tools/shape-check.ts +18 -14
  431. package/src/parsers/loader.ts +5 -5
  432. package/src/pipeline/cluster-only.ts +8 -4
  433. package/src/pipeline/orchestrator.ts +22 -0
  434. package/src/pipeline/phases/boundary.ts +40 -2
  435. package/src/pipeline/phases/communities.ts +66 -5
  436. package/src/pipeline/phases/contextual-proximity.ts +15 -14
  437. package/src/pipeline/phases/cross-file.ts +35 -14
  438. package/src/pipeline/phases/field-access.ts +11 -4
  439. package/src/pipeline/phases/god-nodes.ts +47 -10
  440. package/src/pipeline/phases/import-resolver.ts +37 -5
  441. package/src/pipeline/phases/leiden.ts +25 -18
  442. package/src/pipeline/phases/markdown.ts +12 -7
  443. package/src/pipeline/phases/pdf-parse.ts +19 -2
  444. package/src/pipeline/phases/processes.ts +27 -15
  445. package/src/pipeline/phases/re-export-propagation.ts +40 -18
  446. package/src/pipeline/phases/reachability.ts +39 -24
  447. package/src/pipeline/phases/routes.ts +32 -21
  448. package/src/pipeline/phases/scope-resolution.ts +110 -71
  449. package/src/pipeline/runner.ts +28 -11
  450. package/src/query/cypher-parser.ts +83 -0
  451. package/src/search/embed-batch.ts +4 -1
  452. package/src/search/hybrid-query.ts +11 -1
  453. package/src/staleness/git-staleness.ts +3 -3
  454. package/src/storage/db.ts +11 -0
  455. package/src/storage/edge-store.ts +34 -1
  456. package/src/storage/embedding-store.ts +38 -6
  457. package/src/storage/file-cache.ts +35 -21
  458. package/src/storage/fts-store.ts +12 -3
  459. package/src/storage/node-store.ts +39 -1
  460. package/src/coverage/runtime.ts +0 -249
@@ -60,6 +60,19 @@ const FINDING_TYPE_TO_METRIC = {
60
60
  unreachable_export: 'unreachableExportCount',
61
61
  ambiguous_edge: 'ambiguousEdgeCount',
62
62
  };
63
+ /** Canonical metric names — defined once to avoid duplicating the same literal Set/Object. */
64
+ const METRIC_NAMES = Object.values(FINDING_TYPE_TO_METRIC);
65
+ const METRIC_NAME_SET = new Set(METRIC_NAMES);
66
+ /** Module-level cache for parsed Tolerance objects — avoids re-parsing identical specs. */
67
+ const toleranceCache = new Map();
68
+ function parseTolerance(spec) {
69
+ let t = toleranceCache.get(spec);
70
+ if (!t) {
71
+ t = Tolerance.parse(spec);
72
+ toleranceCache.set(spec, t);
73
+ }
74
+ return t;
75
+ }
63
76
  // ── checkRegression ───────────────────────────────────────────────────────────
64
77
  /**
65
78
  * Compare current DB state against a named baseline.
@@ -71,47 +84,35 @@ const FINDING_TYPE_TO_METRIC = {
71
84
  */
72
85
  export function checkRegression(db, baselinePath, toleranceSpec, metricTolerances) {
73
86
  const baseline = loadBaseline(baselinePath);
74
- // Compute current counts from DB
87
+ // Compute current counts from DB using shared METRIC_NAMES init
75
88
  const currentFindings = extractFindingsFromDb(db, '');
76
- const currentCounts = {
77
- godNodeCount: 0,
78
- surpriseCount: 0,
79
- bridgeNodeCount: 0,
80
- unreachableExportCount: 0,
81
- ambiguousEdgeCount: 0,
82
- };
89
+ const currentCounts = Object.fromEntries(METRIC_NAMES.map(m => [m, 0]));
83
90
  for (const f of currentFindings) {
84
91
  const metricName = FINDING_TYPE_TO_METRIC[f.type];
85
- if (metricName && metricName in currentCounts) {
92
+ if (metricName && METRIC_NAME_SET.has(metricName)) {
86
93
  currentCounts[metricName]++;
87
94
  }
88
95
  }
89
- // Compute baseline counts
90
- const baselineCounts = {
91
- godNodeCount: 0,
92
- surpriseCount: 0,
93
- bridgeNodeCount: 0,
94
- unreachableExportCount: 0,
95
- ambiguousEdgeCount: 0,
96
- };
96
+ // Compute baseline counts using shared METRIC_NAMES init
97
+ const baselineCounts = Object.fromEntries(METRIC_NAMES.map(m => [m, 0]));
97
98
  if (baseline) {
98
99
  for (const f of baseline.findings) {
99
100
  const metricName = FINDING_TYPE_TO_METRIC[f.type];
100
- if (metricName && metricName in baselineCounts) {
101
+ if (metricName && METRIC_NAME_SET.has(metricName)) {
101
102
  baselineCounts[metricName]++;
102
103
  }
103
104
  }
104
105
  }
105
- // Default tolerance
106
- const defaultTolerance = Tolerance.parse(toleranceSpec);
107
- // Check each metric
106
+ // Default tolerance — use cached parse to avoid rebuilding on repeated calls with same spec
107
+ const defaultTolerance = parseTolerance(toleranceSpec);
108
+ // Check each metric — per-metric tolerances also cached
108
109
  const checkedMetrics = [];
109
- for (const metric of Object.keys(currentCounts)) {
110
+ for (const metric of METRIC_NAMES) {
110
111
  const baselineVal = baselineCounts[metric] ?? 0;
111
112
  const currentVal = currentCounts[metric] ?? 0;
112
113
  const delta = currentVal - baselineVal;
113
114
  const metricSpec = metricTolerances?.[metric];
114
- const tol = metricSpec ? Tolerance.parse(metricSpec) : defaultTolerance;
115
+ const tol = metricSpec ? parseTolerance(metricSpec) : defaultTolerance;
115
116
  const tolStr = tol.toString();
116
117
  const violated = tol.exceeded(baselineVal, currentVal);
117
118
  checkedMetrics.push({
@@ -131,4 +132,25 @@ export function checkRegression(db, baselinePath, toleranceSpec, metricTolerance
131
132
  : `Regression check FAILED — ${violations.length} violation(s) against baseline "${baselineName}" (tolerance: ${toleranceSpec})`;
132
133
  return { passed, violations, checkedMetrics, summary };
133
134
  }
135
+ /**
136
+ * Format a RegressionOutcome as structured text for LLM consumption.
137
+ * Shows pass/fail status, per-metric results, and actionable violation details.
138
+ */
139
+ export function formatRegressionOutcome(outcome) {
140
+ const lines = [outcome.summary];
141
+ lines.push('\nMetrics:');
142
+ for (const m of outcome.checkedMetrics) {
143
+ const sign = m.delta > 0 ? `+${m.delta}` : String(m.delta);
144
+ const status = m.violated ? 'VIOLATED' : 'ok';
145
+ lines.push(` ${m.metric}: baseline=${m.baseline} current=${m.current} delta=${sign} tolerance=${m.tolerance} [${status}]`);
146
+ }
147
+ if (outcome.violations.length > 0) {
148
+ lines.push('\nViolations requiring attention:');
149
+ for (const v of outcome.violations) {
150
+ const sign = v.delta > 0 ? `+${v.delta}` : String(v.delta);
151
+ lines.push(` ${v.metric} exceeded tolerance ${v.tolerance} (delta ${sign}): investigate new ${v.metric.replace(/Count$/, '')} introductions`);
152
+ }
153
+ }
154
+ return lines.join('\n');
155
+ }
134
156
  //# sourceMappingURL=regression.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"regression.js","sourceRoot":"","sources":["../../../src/graph/regression.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"regression.js","sourceRoot":"","sources":["../../../src/graph/regression.ts"],"names":[],"mappings":"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"}
@@ -18,13 +18,40 @@ export interface RippleResult {
18
18
  /** Weighted sum: Σ(count_at_depth * decay^depth). */
19
19
  totalScore: number;
20
20
  }
21
+ /**
22
+ * Build a directed outgoing adjacency map from an edge list.
23
+ *
24
+ * Callers that run rippleImpact for multiple starting nodes on the same edge set
25
+ * should build once and pass the map directly to `rippleImpactFromMap`.
26
+ */
27
+ export declare function buildOutgoingMap(edges: RippleEdge[]): Map<string, string[]>;
28
+ /**
29
+ * Compute the ripple impact of changing `startNodeId` using a pre-built
30
+ * outgoing adjacency map.
31
+ *
32
+ * Use this variant when querying multiple start nodes on the same edge set —
33
+ * build the map once with `buildOutgoingMap` and reuse it across calls.
34
+ *
35
+ * @param startNodeId The node whose change we are propagating.
36
+ * @param outgoing Pre-built directed adjacency map (source → targets).
37
+ * @param maxDepth Maximum BFS depth (default 3).
38
+ * @param decayFactor Weight multiplier per depth level (default 0.5).
39
+ */
40
+ export declare function rippleImpactFromMap(startNodeId: string, outgoing: Map<string, string[]>, maxDepth?: number, decayFactor?: number): RippleResult;
21
41
  /**
22
42
  * Compute the ripple impact of changing `startNodeId`.
23
43
  *
44
+ * Builds the adjacency map from `edges` on each call. For repeated queries
45
+ * over the same edge set, prefer `buildOutgoingMap` + `rippleImpactFromMap`.
46
+ *
24
47
  * @param startNodeId The node whose change we are propagating.
25
48
  * @param edges Directed edges in the graph.
26
49
  * @param maxDepth Maximum BFS depth (default 3).
27
50
  * @param decayFactor Weight multiplier per depth level (default 0.5).
28
51
  */
29
52
  export declare function rippleImpact(startNodeId: string, edges: RippleEdge[], maxDepth?: number, decayFactor?: number): RippleResult;
53
+ /**
54
+ * Format ripple impact results as structured text for LLM consumption.
55
+ */
56
+ export declare function formatRippleImpact(startNodeId: string, result: RippleResult, nodeLabels?: Map<string, string>): string;
30
57
  //# sourceMappingURL=ripple-impact.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ripple-impact.d.ts","sourceRoot":"","sources":["../../../src/graph/ripple-impact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,UAAU,EAAE,EACnB,QAAQ,SAAI,EACZ,WAAW,SAAM,GAChB,YAAY,CAkCd"}
1
+ {"version":3,"file":"ripple-impact.d.ts","sourceRoot":"","sources":["../../../src/graph/ripple-impact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAO3E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAC/B,QAAQ,SAAI,EACZ,WAAW,SAAM,GAChB,YAAY,CA2Bd;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,UAAU,EAAE,EACnB,QAAQ,SAAI,EACZ,WAAW,SAAM,GAChB,YAAY,CAEd;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,YAAY,EACpB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,MAAM,CAmBR"}
@@ -9,21 +9,33 @@
9
9
  * Default decay factor: 0.5 per hop (configurable).
10
10
  */
11
11
  /**
12
- * Compute the ripple impact of changing `startNodeId`.
12
+ * Build a directed outgoing adjacency map from an edge list.
13
13
  *
14
- * @param startNodeId The node whose change we are propagating.
15
- * @param edges Directed edges in the graph.
16
- * @param maxDepth Maximum BFS depth (default 3).
17
- * @param decayFactor Weight multiplier per depth level (default 0.5).
14
+ * Callers that run rippleImpact for multiple starting nodes on the same edge set
15
+ * should build once and pass the map directly to `rippleImpactFromMap`.
18
16
  */
19
- export function rippleImpact(startNodeId, edges, maxDepth = 3, decayFactor = 0.5) {
20
- // Build directed adjacency (source → targets)
17
+ export function buildOutgoingMap(edges) {
21
18
  const outgoing = new Map();
22
19
  for (const { sourceId, targetId } of edges) {
23
20
  if (!outgoing.has(sourceId))
24
21
  outgoing.set(sourceId, []);
25
22
  outgoing.get(sourceId).push(targetId);
26
23
  }
24
+ return outgoing;
25
+ }
26
+ /**
27
+ * Compute the ripple impact of changing `startNodeId` using a pre-built
28
+ * outgoing adjacency map.
29
+ *
30
+ * Use this variant when querying multiple start nodes on the same edge set —
31
+ * build the map once with `buildOutgoingMap` and reuse it across calls.
32
+ *
33
+ * @param startNodeId The node whose change we are propagating.
34
+ * @param outgoing Pre-built directed adjacency map (source → targets).
35
+ * @param maxDepth Maximum BFS depth (default 3).
36
+ * @param decayFactor Weight multiplier per depth level (default 0.5).
37
+ */
38
+ export function rippleImpactFromMap(startNodeId, outgoing, maxDepth = 3, decayFactor = 0.5) {
27
39
  if (!outgoing.has(startNodeId)) {
28
40
  return { byDepth: {}, totalScore: 0 };
29
41
  }
@@ -49,4 +61,40 @@ export function rippleImpact(startNodeId, edges, maxDepth = 3, decayFactor = 0.5
49
61
  }
50
62
  return { byDepth, totalScore };
51
63
  }
64
+ /**
65
+ * Compute the ripple impact of changing `startNodeId`.
66
+ *
67
+ * Builds the adjacency map from `edges` on each call. For repeated queries
68
+ * over the same edge set, prefer `buildOutgoingMap` + `rippleImpactFromMap`.
69
+ *
70
+ * @param startNodeId The node whose change we are propagating.
71
+ * @param edges Directed edges in the graph.
72
+ * @param maxDepth Maximum BFS depth (default 3).
73
+ * @param decayFactor Weight multiplier per depth level (default 0.5).
74
+ */
75
+ export function rippleImpact(startNodeId, edges, maxDepth = 3, decayFactor = 0.5) {
76
+ return rippleImpactFromMap(startNodeId, buildOutgoingMap(edges), maxDepth, decayFactor);
77
+ }
78
+ /**
79
+ * Format ripple impact results as structured text for LLM consumption.
80
+ */
81
+ export function formatRippleImpact(startNodeId, result, nodeLabels) {
82
+ const depths = Object.keys(result.byDepth).map(Number).sort((a, b) => a - b);
83
+ if (depths.length === 0) {
84
+ return `No ripple impact found for: ${startNodeId} (isolated or leaf node)`;
85
+ }
86
+ const lines = [
87
+ `Ripple impact of changing: ${startNodeId}`,
88
+ ` Total score: ${result.totalScore.toFixed(3)} (weighted cascade depth)`,
89
+ ];
90
+ for (const depth of depths) {
91
+ const nodes = result.byDepth[depth];
92
+ lines.push(` Depth ${depth} (${nodes.length} node${nodes.length === 1 ? '' : 's'}):`);
93
+ for (const id of nodes) {
94
+ const label = nodeLabels?.get(id);
95
+ lines.push(` - ${id}${label ? ` [${label}]` : ''}`);
96
+ }
97
+ }
98
+ return lines.join('\n');
99
+ }
52
100
  //# sourceMappingURL=ripple-impact.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ripple-impact.js","sourceRoot":"","sources":["../../../src/graph/ripple-impact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAcH;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC1B,WAAmB,EACnB,KAAmB,EACnB,QAAQ,GAAG,CAAC,EACZ,WAAW,GAAG,GAAG;IAEjB,8CAA8C;IAC9C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C,KAAK,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,KAAK,EAAE,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACxD,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IAC/C,MAAM,OAAO,GAA6B,EAAE,CAAC;IAC7C,IAAI,QAAQ,GAAG,CAAC,WAAW,CAAC,CAAC;IAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;QAC/C,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACtB,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;QACrC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC;QAC9B,UAAU,IAAI,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACjE,QAAQ,GAAG,YAAY,CAAC;IAC1B,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"ripple-impact.js","sourceRoot":"","sources":["../../../src/graph/ripple-impact.ts"],"names":[],"mappings":"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"}
@@ -19,4 +19,11 @@ export interface RiskProfileReport {
19
19
  p95loc: number;
20
20
  }
21
21
  export declare function computeRiskProfile(db: MonographDb): RiskProfileReport;
22
+ /**
23
+ * Format a RiskProfileReport as structured text with distribution tables for LLM navigation.
24
+ *
25
+ * @param report - RiskProfileReport from computeRiskProfile()
26
+ * @returns structured text suitable for LLM consumption
27
+ */
28
+ export declare function formatRiskProfile(report: RiskProfileReport): string;
22
29
  //# sourceMappingURL=risk-profile.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"risk-profile.d.ts","sourceRoot":"","sources":["../../../src/graph/risk-profile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,wBAAwB,EAAE,OAAO,EAAE,CAAC;IACpC,sBAAsB,EAAE,OAAO,EAAE,CAAC;IAClC,WAAW,EAAE;QACX,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AA8BD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,WAAW,GAAG,iBAAiB,CAkFrE"}
1
+ {"version":3,"file":"risk-profile.d.ts","sourceRoot":"","sources":["../../../src/graph/risk-profile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,wBAAwB,EAAE,OAAO,EAAE,CAAC;IACpC,sBAAsB,EAAE,OAAO,EAAE,CAAC;IAClC,WAAW,EAAE;QACX,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AA8BD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,WAAW,GAAG,iBAAiB,CAqFrE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAkCnE"}
@@ -19,64 +19,47 @@ function percentile(sorted, p) {
19
19
  return sorted[Math.min(idx, sorted.length - 1)];
20
20
  }
21
21
  export function computeRiskProfile(db) {
22
+ // Push paramCount extraction to SQL with json_extract to avoid per-row JSON.parse
22
23
  const rows = db.prepare(`
23
- SELECT start_line, end_line, properties
24
+ SELECT
25
+ start_line,
26
+ end_line,
27
+ CAST(json_extract(properties, '$.paramCount') AS INTEGER) AS param_count
24
28
  FROM nodes
25
29
  WHERE label IN ('Function', 'Method')
30
+ AND start_line IS NOT NULL
31
+ AND end_line IS NOT NULL
26
32
  `).all();
27
- const locs = [];
28
- const params = [];
33
+ // ── Single-pass: compute LOC, assign to bins, accumulate risk summary ─────
34
+ const locBinCounts = new Array(LOC_BINS.length).fill(0);
35
+ const paramBinCounts = new Array(PARAM_BINS.length).fill(0);
36
+ const sortedLocs = [];
37
+ let largeFunction = 0;
38
+ let longParamList = 0;
39
+ let highRisk = 0;
29
40
  for (const row of rows) {
30
- if (row.start_line === null || row.end_line === null)
31
- continue;
32
41
  const loc = row.end_line - row.start_line + 1;
33
42
  if (loc < 1)
34
43
  continue;
35
- locs.push(loc);
36
- let paramCount = 0;
37
- if (row.properties) {
38
- try {
39
- const props = JSON.parse(row.properties);
40
- if (typeof props['paramCount'] === 'number') {
41
- paramCount = props['paramCount'];
42
- }
44
+ sortedLocs.push(loc);
45
+ // Assign to LOC bin in O(bins) rather than O(N×bins) via filter
46
+ for (let i = 0; i < LOC_BINS.length; i++) {
47
+ const bin = LOC_BINS[i];
48
+ if (loc >= bin.min && loc <= bin.max) {
49
+ locBinCounts[i]++;
50
+ break;
43
51
  }
44
- catch {
45
- // ignore malformed JSON
52
+ }
53
+ const pc = row.param_count ?? 0;
54
+ for (let i = 0; i < PARAM_BINS.length; i++) {
55
+ const bin = PARAM_BINS[i];
56
+ if (pc >= bin.min && pc <= bin.max) {
57
+ paramBinCounts[i]++;
58
+ break;
46
59
  }
47
60
  }
48
- params.push(paramCount);
49
- }
50
- const total = locs.length;
51
- // ── LOC distribution ───────────────────────────────────────────────────────
52
- const functionSizeDistribution = LOC_BINS.map(bin => {
53
- const count = locs.filter(l => l >= bin.min && l <= bin.max).length;
54
- return {
55
- label: bin.label,
56
- min: bin.min,
57
- max: bin.max === Infinity ? 999999 : bin.max,
58
- count,
59
- percentage: total > 0 ? Math.round((count / total) * 1000) / 10 : 0,
60
- };
61
- });
62
- // ── Param distribution ─────────────────────────────────────────────────────
63
- const paramCountDistribution = PARAM_BINS.map(bin => {
64
- const count = params.filter(p => p >= bin.min && p <= bin.max).length;
65
- return {
66
- label: bin.label,
67
- min: bin.min,
68
- max: bin.max === Infinity ? 999999 : bin.max,
69
- count,
70
- percentage: total > 0 ? Math.round((count / total) * 1000) / 10 : 0,
71
- };
72
- });
73
- // ── Risk summary ───────────────────────────────────────────────────────────
74
- let largeFunction = 0;
75
- let longParamList = 0;
76
- let highRisk = 0;
77
- for (let i = 0; i < locs.length; i++) {
78
- const large = locs[i] > 100;
79
- const longParam = (params[i] ?? 0) > 5;
61
+ const large = loc > 100;
62
+ const longParam = pc > 5;
80
63
  if (large)
81
64
  largeFunction++;
82
65
  if (longParam)
@@ -84,8 +67,24 @@ export function computeRiskProfile(db) {
84
67
  if (large && longParam)
85
68
  highRisk++;
86
69
  }
70
+ const total = sortedLocs.length;
71
+ // ── Build bin result arrays ───────────────────────────────────────────────
72
+ const functionSizeDistribution = LOC_BINS.map((bin, i) => ({
73
+ label: bin.label,
74
+ min: bin.min,
75
+ max: bin.max === Infinity ? 999999 : bin.max,
76
+ count: locBinCounts[i],
77
+ percentage: total > 0 ? Math.round((locBinCounts[i] / total) * 1000) / 10 : 0,
78
+ }));
79
+ const paramCountDistribution = PARAM_BINS.map((bin, i) => ({
80
+ label: bin.label,
81
+ min: bin.min,
82
+ max: bin.max === Infinity ? 999999 : bin.max,
83
+ count: paramBinCounts[i],
84
+ percentage: total > 0 ? Math.round((paramBinCounts[i] / total) * 1000) / 10 : 0,
85
+ }));
87
86
  // ── Percentiles ────────────────────────────────────────────────────────────
88
- const sortedLocs = [...locs].sort((a, b) => a - b);
87
+ sortedLocs.sort((a, b) => a - b);
89
88
  const p50loc = percentile(sortedLocs, 0.50);
90
89
  const p90loc = percentile(sortedLocs, 0.90);
91
90
  const p95loc = percentile(sortedLocs, 0.95);
@@ -98,4 +97,39 @@ export function computeRiskProfile(db) {
98
97
  p95loc,
99
98
  };
100
99
  }
100
+ /**
101
+ * Format a RiskProfileReport as structured text with distribution tables for LLM navigation.
102
+ *
103
+ * @param report - RiskProfileReport from computeRiskProfile()
104
+ * @returns structured text suitable for LLM consumption
105
+ */
106
+ export function formatRiskProfile(report) {
107
+ const { functionSizeDistribution, paramCountDistribution, riskSummary, p50loc, p90loc, p95loc } = report;
108
+ const total = functionSizeDistribution.reduce((s, b) => s + b.count, 0);
109
+ if (total === 0) {
110
+ return 'risk_profile: no Function/Method nodes with line info found\n';
111
+ }
112
+ const lines = [
113
+ `risk_profile: ${total} functions analysed`,
114
+ ` p50_loc: ${p50loc} p90_loc: ${p90loc} p95_loc: ${p95loc}`,
115
+ ` large_functions(loc>100): ${riskSummary.largeFunction} long_param_list(params>5): ${riskSummary.longParamList} high_risk(both): ${riskSummary.highRisk}`,
116
+ '',
117
+ 'function_size_distribution:',
118
+ ];
119
+ for (const bin of functionSizeDistribution) {
120
+ const bar = '#'.repeat(Math.round(bin.percentage / 5)); // 1 char per 5%
121
+ lines.push(` ${bin.label.padEnd(15)} ${String(bin.count).padStart(5)} (${String(bin.percentage).padStart(5)}%) ${bar}`);
122
+ }
123
+ lines.push('');
124
+ lines.push('param_count_distribution:');
125
+ for (const bin of paramCountDistribution) {
126
+ const bar = '#'.repeat(Math.round(bin.percentage / 5));
127
+ lines.push(` ${bin.label.padEnd(15)} ${String(bin.count).padStart(5)} (${String(bin.percentage).padStart(5)}%) ${bar}`);
128
+ }
129
+ if (riskSummary.highRisk > 0) {
130
+ lines.push('');
131
+ lines.push(`high_risk_note: ${riskSummary.highRisk} function(s) have both loc>100 AND params>5 — prime refactor candidates`);
132
+ }
133
+ return lines.join('\n');
134
+ }
101
135
  //# sourceMappingURL=risk-profile.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"risk-profile.js","sourceRoot":"","sources":["../../../src/graph/risk-profile.ts"],"names":[],"mappings":"AA6BA,MAAM,QAAQ,GAAuD;IACnE,EAAE,KAAK,EAAE,YAAY,EAAI,GAAG,EAAE,CAAC,EAAI,GAAG,EAAE,EAAE,EAAG;IAC7C,EAAE,KAAK,EAAE,aAAa,EAAG,GAAG,EAAE,EAAE,EAAG,GAAG,EAAE,EAAE,EAAG;IAC7C,EAAE,KAAK,EAAE,aAAa,EAAG,GAAG,EAAE,EAAE,EAAG,GAAG,EAAE,EAAE,EAAG;IAC7C,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,EAAE,EAAG,GAAG,EAAE,GAAG,EAAE;IAC7C,EAAE,KAAK,EAAE,eAAe,EAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;IAC7C,EAAE,KAAK,EAAE,YAAY,EAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE;CACnD,CAAC;AAEF,MAAM,UAAU,GAAuD;IACrE,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;IACvC,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;IACvC,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;IACvC,EAAE,KAAK,EAAE,WAAW,EAAG,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE;CAC/C,CAAC;AAEF,SAAS,UAAU,CAAC,MAAgB,EAAE,CAAS;IAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAe;IAChD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;GAIvB,CAAC,CAAC,GAAG,EAAoB,CAAC;IAE3B,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,UAAU,KAAK,IAAI,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI;YAAE,SAAS;QAC/D,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC;QAC9C,IAAI,GAAG,GAAG,CAAC;YAAE,SAAS;QACtB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEf,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAA4B,CAAC;gBACpE,IAAI,OAAO,KAAK,CAAC,YAAY,CAAC,KAAK,QAAQ,EAAE,CAAC;oBAC5C,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;IAE1B,8EAA8E;IAC9E,MAAM,wBAAwB,GAAc,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QACpE,OAAO;YACL,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG;YAC5C,KAAK;YACL,UAAU,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;SACpE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,8EAA8E;IAC9E,MAAM,sBAAsB,GAAc,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QACtE,OAAO;YACL,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG;YAC5C,KAAK;YACL,UAAU,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;SACpE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,8EAA8E;IAC9E,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAC5B,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,KAAK;YAAE,aAAa,EAAE,CAAC;QAC3B,IAAI,SAAS;YAAE,aAAa,EAAE,CAAC;QAC/B,IAAI,KAAK,IAAI,SAAS;YAAE,QAAQ,EAAE,CAAC;IACrC,CAAC;IAED,8EAA8E;IAC9E,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAE5C,OAAO;QACL,wBAAwB;QACxB,sBAAsB;QACtB,WAAW,EAAE,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE;QACvD,MAAM;QACN,MAAM;QACN,MAAM;KACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"risk-profile.js","sourceRoot":"","sources":["../../../src/graph/risk-profile.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"shingle-filter.d.ts","sourceRoot":"","sources":["../../../src/graph/shingle-filter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACvD;AAqDD,wBAAgB,mBAAmB,CAAC,CAAC,SAAI,EAAE,SAAS,SAAM,GAAG,aAAa,CAsFzE"}
1
+ {"version":3,"file":"shingle-filter.d.ts","sourceRoot":"","sources":["../../../src/graph/shingle-filter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACvD;AAwDD,wBAAgB,mBAAmB,CAAC,CAAC,SAAI,EAAE,SAAS,SAAM,GAAG,aAAa,CAyFzE"}
@@ -23,25 +23,23 @@ function hashString(s) {
23
23
  }
24
24
  return h;
25
25
  }
26
+ const MINHASH_PRIME = BigInt(4294967311); // first prime > 2^32
26
27
  /**
27
28
  * Compute a MinHash signature for a set of shingles using
28
- * numHashes linear hash functions: h_i(x) = (a_i * x + b_i) % prime
29
+ * numHashes linear hash functions: h_i(x) = (a_i * x + b_i) % prime.
30
+ *
31
+ * @param seedsA Precomputed BigInt a-coefficients (length numHashes)
32
+ * @param seedsB Precomputed BigInt b-constants (length numHashes)
29
33
  */
30
- function minHashSignature(shingles, numHashes) {
31
- const PRIME = 4294967311; // first prime > 2^32
34
+ function minHashSignature(shingles, numHashes, seedsA, seedsB) {
32
35
  const sig = new Uint32Array(numHashes).fill(0xffffffff);
33
- // Deterministic seeds derived from hash index
34
36
  for (const shingle of shingles) {
35
- const x = hashString(shingle);
37
+ const x = BigInt(hashString(shingle));
36
38
  for (let i = 0; i < numHashes; i++) {
37
- // Deterministic a, b per hash function — use index-based seeds
38
- const a = ((i * 2654435761 + 0x9e3779b9) >>> 0);
39
- const b = ((i * 2246822519 + 0x85ebca6b) >>> 0);
40
- // Linear hash modulo prime (BigInt for correctness)
41
- const hashVal = Number((BigInt(a) * BigInt(x) + BigInt(b)) % BigInt(PRIME)) >>> 0;
42
- if (hashVal < sig[i]) {
39
+ // Precomputed seeds avoid recomputing the same (a, b) per shingle per call.
40
+ const hashVal = Number((seedsA[i] * x + seedsB[i]) % MINHASH_PRIME) >>> 0;
41
+ if (hashVal < sig[i])
43
42
  sig[i] = hashVal;
44
- }
45
43
  }
46
44
  }
47
45
  return sig;
@@ -55,7 +53,15 @@ export function createShingleFilter(k = 5, numHashes = 128) {
55
53
  // A reasonable split is sqrt(numHashes) bands of sqrt(numHashes) rows each.
56
54
  const numBands = Math.round(Math.sqrt(numHashes));
57
55
  const numRows = Math.floor(numHashes / numBands);
58
- function getBandKey(id, band, sig) {
56
+ // Precompute MinHash seeds once per filter instance to avoid recomputing
57
+ // (a, b) inside the hot inner loop of minHashSignature().
58
+ const seedsA = new BigInt64Array(numHashes);
59
+ const seedsB = new BigInt64Array(numHashes);
60
+ for (let i = 0; i < numHashes; i++) {
61
+ seedsA[i] = BigInt(((i * 2654435761 + 0x9e3779b9) >>> 0));
62
+ seedsB[i] = BigInt(((i * 2246822519 + 0x85ebca6b) >>> 0));
63
+ }
64
+ function getBandKey(band, sig) {
59
65
  const parts = [];
60
66
  for (let r = 0; r < numRows; r++) {
61
67
  const idx = band * numRows + r;
@@ -69,11 +75,11 @@ export function createShingleFilter(k = 5, numHashes = 128) {
69
75
  return {
70
76
  add(id, tokens) {
71
77
  const shingles = kShingles(tokens, k);
72
- const sig = minHashSignature(shingles, numHashes);
78
+ const sig = minHashSignature(shingles, numHashes, seedsA, seedsB);
73
79
  index.set(id, sig);
74
80
  // Insert into LSH band buckets
75
81
  for (let band = 0; band < numBands; band++) {
76
- const key = getBandKey(id, band, sig);
82
+ const key = getBandKey(band, sig);
77
83
  const bucket = bandBuckets.get(key);
78
84
  if (bucket) {
79
85
  bucket.push(id);
@@ -85,19 +91,12 @@ export function createShingleFilter(k = 5, numHashes = 128) {
85
91
  },
86
92
  candidates(tokens, topK = 10) {
87
93
  const shingles = kShingles(tokens, k);
88
- const querySig = minHashSignature(shingles, numHashes);
89
- // Collect candidate IDs via LSH band matching
94
+ const querySig = minHashSignature(shingles, numHashes, seedsA, seedsB);
95
+ // Collect candidate IDs via LSH band matching.
96
+ // Use getBandKey() consistently — eliminates the duplicate inline computation.
90
97
  const candidateScores = new Map();
91
98
  for (let band = 0; band < numBands; band++) {
92
- const key = getBandKey('__query__', band, querySig);
93
- // Manually compute the key for the query signature
94
- const parts = [];
95
- for (let r = 0; r < numRows; r++) {
96
- const idx = band * numRows + r;
97
- if (idx < numHashes)
98
- parts.push(querySig[idx]);
99
- }
100
- const queryKey = `b${band}:${parts.join(',')}`;
99
+ const queryKey = getBandKey(band, querySig);
101
100
  const bucket = bandBuckets.get(queryKey);
102
101
  if (bucket) {
103
102
  for (const id of bucket) {
@@ -1 +1 @@
1
- {"version":3,"file":"shingle-filter.js","sourceRoot":"","sources":["../../../src/graph/shingle-filter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shingle-filter.js","sourceRoot":"","sources":["../../../src/graph/shingle-filter.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,SAAS,SAAS,CAAC,MAAgB,EAAE,CAAS;IAC5C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,CAAS;IAC3B,IAAI,CAAC,GAAG,IAAI,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;IACtC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,qBAAqB;AAE/D;;;;;;GAMG;AACH,SAAS,gBAAgB,CACvB,QAAkB,EAClB,SAAiB,EACjB,MAAqB,EACrB,MAAqB;IAErB,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAExD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,4EAA4E;YAC5E,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YAC5E,IAAI,OAAO,GAAG,GAAG,CAAC,CAAC,CAAE;gBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,CAAC,GAAG,CAAC,EAAE,SAAS,GAAG,GAAG;IACxD,mCAAmC;IACnC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE7C,0CAA0C;IAC1C,qFAAqF;IACrF,yEAAyE;IACzE,4EAA4E;IAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC;IAEjD,yEAAyE;IACzE,0DAA0D;IAC1D,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,SAAS,UAAU,CAAC,IAAY,EAAE,GAAgB;QAChD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC;YAC/B,IAAI,GAAG,GAAG,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,IAAI,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACvC,CAAC;IAED,sCAAsC;IACtC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAoB,CAAC;IAEhD,OAAO;QACL,GAAG,CAAC,EAAU,EAAE,MAAgB;YAC9B,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACtC,MAAM,GAAG,GAAG,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAClE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAEnB,+BAA+B;YAC/B,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;gBAC3C,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAClC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACpC,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClB,CAAC;qBAAM,CAAC;oBACN,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAED,UAAU,CAAC,MAAgB,EAAE,IAAI,GAAG,EAAE;YACpC,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAEvE,+CAA+C;YAC/C,+EAA+E;YAC/E,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;YAElD,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;gBAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAC5C,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACzC,IAAI,MAAM,EAAE,CAAC;oBACX,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;wBACxB,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC9D,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,eAAe,CAAC,IAAI,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAE1C,uEAAuE;YACvE,MAAM,MAAM,GAAG,CAAC,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAClD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;gBAC3B,IAAI,OAAO,GAAG,CAAC,CAAC;gBAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;oBACnC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC;wBAAE,OAAO,EAAE,CAAC;gBACxC,CAAC;gBACD,MAAM,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;gBACvC,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,oDAAoD;YACpD,OAAO,MAAM;iBACV,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC;iBAC/B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;iBAC3C,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;iBACd,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC"}