@opencodehub/ingestion 0.1.0

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 (563) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +69 -0
  3. package/dist/extract/index.d.ts +8 -0
  4. package/dist/extract/index.d.ts.map +1 -0
  5. package/dist/extract/index.js +6 -0
  6. package/dist/extract/index.js.map +1 -0
  7. package/dist/extract/orm-detector.d.ts +19 -0
  8. package/dist/extract/orm-detector.d.ts.map +1 -0
  9. package/dist/extract/orm-detector.js +209 -0
  10. package/dist/extract/orm-detector.js.map +1 -0
  11. package/dist/extract/property-access.d.ts +76 -0
  12. package/dist/extract/property-access.d.ts.map +1 -0
  13. package/dist/extract/property-access.js +260 -0
  14. package/dist/extract/property-access.js.map +1 -0
  15. package/dist/extract/receiver-resolver.d.ts +86 -0
  16. package/dist/extract/receiver-resolver.d.ts.map +1 -0
  17. package/dist/extract/receiver-resolver.js +77 -0
  18. package/dist/extract/receiver-resolver.js.map +1 -0
  19. package/dist/extract/route-detector-java.d.ts +29 -0
  20. package/dist/extract/route-detector-java.d.ts.map +1 -0
  21. package/dist/extract/route-detector-java.js +190 -0
  22. package/dist/extract/route-detector-java.js.map +1 -0
  23. package/dist/extract/route-detector-nestjs.d.ts +30 -0
  24. package/dist/extract/route-detector-nestjs.d.ts.map +1 -0
  25. package/dist/extract/route-detector-nestjs.js +134 -0
  26. package/dist/extract/route-detector-nestjs.js.map +1 -0
  27. package/dist/extract/route-detector-python.d.ts +28 -0
  28. package/dist/extract/route-detector-python.d.ts.map +1 -0
  29. package/dist/extract/route-detector-python.js +100 -0
  30. package/dist/extract/route-detector-python.js.map +1 -0
  31. package/dist/extract/route-detector-rails.d.ts +28 -0
  32. package/dist/extract/route-detector-rails.d.ts.map +1 -0
  33. package/dist/extract/route-detector-rails.js +162 -0
  34. package/dist/extract/route-detector-rails.js.map +1 -0
  35. package/dist/extract/route-detector.d.ts +45 -0
  36. package/dist/extract/route-detector.d.ts.map +1 -0
  37. package/dist/extract/route-detector.js +467 -0
  38. package/dist/extract/route-detector.js.map +1 -0
  39. package/dist/extract/tool-detector.d.ts +26 -0
  40. package/dist/extract/tool-detector.d.ts.map +1 -0
  41. package/dist/extract/tool-detector.js +364 -0
  42. package/dist/extract/tool-detector.js.map +1 -0
  43. package/dist/extract/types.d.ts +89 -0
  44. package/dist/extract/types.d.ts.map +1 -0
  45. package/dist/extract/types.js +11 -0
  46. package/dist/extract/types.js.map +1 -0
  47. package/dist/index.d.ts +10 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +10 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/parse/cobol-regex.d.ts +85 -0
  52. package/dist/parse/cobol-regex.d.ts.map +1 -0
  53. package/dist/parse/cobol-regex.js +355 -0
  54. package/dist/parse/cobol-regex.js.map +1 -0
  55. package/dist/parse/grammar-registry.d.ts +115 -0
  56. package/dist/parse/grammar-registry.d.ts.map +1 -0
  57. package/dist/parse/grammar-registry.js +278 -0
  58. package/dist/parse/grammar-registry.js.map +1 -0
  59. package/dist/parse/index.d.ts +14 -0
  60. package/dist/parse/index.d.ts.map +1 -0
  61. package/dist/parse/index.js +10 -0
  62. package/dist/parse/index.js.map +1 -0
  63. package/dist/parse/language-detector.d.ts +17 -0
  64. package/dist/parse/language-detector.d.ts.map +1 -0
  65. package/dist/parse/language-detector.js +104 -0
  66. package/dist/parse/language-detector.js.map +1 -0
  67. package/dist/parse/parse-worker.d.ts +24 -0
  68. package/dist/parse/parse-worker.d.ts.map +1 -0
  69. package/dist/parse/parse-worker.js +230 -0
  70. package/dist/parse/parse-worker.js.map +1 -0
  71. package/dist/parse/types.d.ts +49 -0
  72. package/dist/parse/types.d.ts.map +1 -0
  73. package/dist/parse/types.js +11 -0
  74. package/dist/parse/types.js.map +1 -0
  75. package/dist/parse/unified-queries.d.ts +37 -0
  76. package/dist/parse/unified-queries.d.ts.map +1 -0
  77. package/dist/parse/unified-queries.js +623 -0
  78. package/dist/parse/unified-queries.js.map +1 -0
  79. package/dist/parse/wasm-fallback.d.ts +88 -0
  80. package/dist/parse/wasm-fallback.d.ts.map +1 -0
  81. package/dist/parse/wasm-fallback.js +258 -0
  82. package/dist/parse/wasm-fallback.js.map +1 -0
  83. package/dist/parse/worker-pool.d.ts +48 -0
  84. package/dist/parse/worker-pool.d.ts.map +1 -0
  85. package/dist/parse/worker-pool.js +97 -0
  86. package/dist/parse/worker-pool.js.map +1 -0
  87. package/dist/pipeline/dep-parsers/go.d.ts +25 -0
  88. package/dist/pipeline/dep-parsers/go.d.ts.map +1 -0
  89. package/dist/pipeline/dep-parsers/go.js +146 -0
  90. package/dist/pipeline/dep-parsers/go.js.map +1 -0
  91. package/dist/pipeline/dep-parsers/index.d.ts +17 -0
  92. package/dist/pipeline/dep-parsers/index.d.ts.map +1 -0
  93. package/dist/pipeline/dep-parsers/index.js +16 -0
  94. package/dist/pipeline/dep-parsers/index.js.map +1 -0
  95. package/dist/pipeline/dep-parsers/maven.d.ts +24 -0
  96. package/dist/pipeline/dep-parsers/maven.d.ts.map +1 -0
  97. package/dist/pipeline/dep-parsers/maven.js +131 -0
  98. package/dist/pipeline/dep-parsers/maven.js.map +1 -0
  99. package/dist/pipeline/dep-parsers/npm.d.ts +30 -0
  100. package/dist/pipeline/dep-parsers/npm.d.ts.map +1 -0
  101. package/dist/pipeline/dep-parsers/npm.js +309 -0
  102. package/dist/pipeline/dep-parsers/npm.js.map +1 -0
  103. package/dist/pipeline/dep-parsers/nuget.d.ts +24 -0
  104. package/dist/pipeline/dep-parsers/nuget.d.ts.map +1 -0
  105. package/dist/pipeline/dep-parsers/nuget.js +178 -0
  106. package/dist/pipeline/dep-parsers/nuget.js.map +1 -0
  107. package/dist/pipeline/dep-parsers/python.d.ts +21 -0
  108. package/dist/pipeline/dep-parsers/python.d.ts.map +1 -0
  109. package/dist/pipeline/dep-parsers/python.js +369 -0
  110. package/dist/pipeline/dep-parsers/python.js.map +1 -0
  111. package/dist/pipeline/dep-parsers/rust.d.ts +18 -0
  112. package/dist/pipeline/dep-parsers/rust.d.ts.map +1 -0
  113. package/dist/pipeline/dep-parsers/rust.js +134 -0
  114. package/dist/pipeline/dep-parsers/rust.js.map +1 -0
  115. package/dist/pipeline/dep-parsers/spdx-normalize.d.ts +15 -0
  116. package/dist/pipeline/dep-parsers/spdx-normalize.d.ts.map +1 -0
  117. package/dist/pipeline/dep-parsers/spdx-normalize.js +31 -0
  118. package/dist/pipeline/dep-parsers/spdx-normalize.js.map +1 -0
  119. package/dist/pipeline/dep-parsers/types.d.ts +63 -0
  120. package/dist/pipeline/dep-parsers/types.d.ts.map +1 -0
  121. package/dist/pipeline/dep-parsers/types.js +56 -0
  122. package/dist/pipeline/dep-parsers/types.js.map +1 -0
  123. package/dist/pipeline/gitignore-stack.d.ts +44 -0
  124. package/dist/pipeline/gitignore-stack.d.ts.map +1 -0
  125. package/dist/pipeline/gitignore-stack.js +69 -0
  126. package/dist/pipeline/gitignore-stack.js.map +1 -0
  127. package/dist/pipeline/gitignore.d.ts +67 -0
  128. package/dist/pipeline/gitignore.d.ts.map +1 -0
  129. package/dist/pipeline/gitignore.js +210 -0
  130. package/dist/pipeline/gitignore.js.map +1 -0
  131. package/dist/pipeline/index.d.ts +53 -0
  132. package/dist/pipeline/index.d.ts.map +1 -0
  133. package/dist/pipeline/index.js +29 -0
  134. package/dist/pipeline/index.js.map +1 -0
  135. package/dist/pipeline/orchestrator.d.ts +105 -0
  136. package/dist/pipeline/orchestrator.d.ts.map +1 -0
  137. package/dist/pipeline/orchestrator.js +175 -0
  138. package/dist/pipeline/orchestrator.js.map +1 -0
  139. package/dist/pipeline/ownership-helpers/drift.d.ts +41 -0
  140. package/dist/pipeline/ownership-helpers/drift.d.ts.map +1 -0
  141. package/dist/pipeline/ownership-helpers/drift.js +122 -0
  142. package/dist/pipeline/ownership-helpers/drift.js.map +1 -0
  143. package/dist/pipeline/ownership-helpers/gini-community.d.ts +24 -0
  144. package/dist/pipeline/ownership-helpers/gini-community.d.ts.map +1 -0
  145. package/dist/pipeline/ownership-helpers/gini-community.js +32 -0
  146. package/dist/pipeline/ownership-helpers/gini-community.js.map +1 -0
  147. package/dist/pipeline/ownership-helpers/git-blame-batcher.d.ts +71 -0
  148. package/dist/pipeline/ownership-helpers/git-blame-batcher.d.ts.map +1 -0
  149. package/dist/pipeline/ownership-helpers/git-blame-batcher.js +178 -0
  150. package/dist/pipeline/ownership-helpers/git-blame-batcher.js.map +1 -0
  151. package/dist/pipeline/ownership-helpers/line-overlap.d.ts +35 -0
  152. package/dist/pipeline/ownership-helpers/line-overlap.d.ts.map +1 -0
  153. package/dist/pipeline/ownership-helpers/line-overlap.js +62 -0
  154. package/dist/pipeline/ownership-helpers/line-overlap.js.map +1 -0
  155. package/dist/pipeline/ownership-helpers/orphan.d.ts +73 -0
  156. package/dist/pipeline/ownership-helpers/orphan.d.ts.map +1 -0
  157. package/dist/pipeline/ownership-helpers/orphan.js +117 -0
  158. package/dist/pipeline/ownership-helpers/orphan.js.map +1 -0
  159. package/dist/pipeline/phases/accesses.d.ts +44 -0
  160. package/dist/pipeline/phases/accesses.d.ts.map +1 -0
  161. package/dist/pipeline/phases/accesses.js +194 -0
  162. package/dist/pipeline/phases/accesses.js.map +1 -0
  163. package/dist/pipeline/phases/annotate.d.ts +28 -0
  164. package/dist/pipeline/phases/annotate.d.ts.map +1 -0
  165. package/dist/pipeline/phases/annotate.js +60 -0
  166. package/dist/pipeline/phases/annotate.js.map +1 -0
  167. package/dist/pipeline/phases/cochange.d.ts +42 -0
  168. package/dist/pipeline/phases/cochange.d.ts.map +1 -0
  169. package/dist/pipeline/phases/cochange.js +0 -0
  170. package/dist/pipeline/phases/cochange.js.map +1 -0
  171. package/dist/pipeline/phases/communities.d.ts +34 -0
  172. package/dist/pipeline/phases/communities.d.ts.map +1 -0
  173. package/dist/pipeline/phases/communities.js +412 -0
  174. package/dist/pipeline/phases/communities.js.map +1 -0
  175. package/dist/pipeline/phases/complexity.d.ts +50 -0
  176. package/dist/pipeline/phases/complexity.d.ts.map +1 -0
  177. package/dist/pipeline/phases/complexity.js +794 -0
  178. package/dist/pipeline/phases/complexity.js.map +1 -0
  179. package/dist/pipeline/phases/confidence-demote.d.ts +23 -0
  180. package/dist/pipeline/phases/confidence-demote.d.ts.map +1 -0
  181. package/dist/pipeline/phases/confidence-demote.js +113 -0
  182. package/dist/pipeline/phases/confidence-demote.js.map +1 -0
  183. package/dist/pipeline/phases/content-cache.d.ts +166 -0
  184. package/dist/pipeline/phases/content-cache.d.ts.map +1 -0
  185. package/dist/pipeline/phases/content-cache.js +323 -0
  186. package/dist/pipeline/phases/content-cache.js.map +1 -0
  187. package/dist/pipeline/phases/coverage-parsers/cobertura.d.ts +25 -0
  188. package/dist/pipeline/phases/coverage-parsers/cobertura.d.ts.map +1 -0
  189. package/dist/pipeline/phases/coverage-parsers/cobertura.js +139 -0
  190. package/dist/pipeline/phases/coverage-parsers/cobertura.js.map +1 -0
  191. package/dist/pipeline/phases/coverage-parsers/coverage-py.d.ts +25 -0
  192. package/dist/pipeline/phases/coverage-parsers/coverage-py.d.ts.map +1 -0
  193. package/dist/pipeline/phases/coverage-parsers/coverage-py.js +51 -0
  194. package/dist/pipeline/phases/coverage-parsers/coverage-py.js.map +1 -0
  195. package/dist/pipeline/phases/coverage-parsers/jacoco.d.ts +32 -0
  196. package/dist/pipeline/phases/coverage-parsers/jacoco.d.ts.map +1 -0
  197. package/dist/pipeline/phases/coverage-parsers/jacoco.js +98 -0
  198. package/dist/pipeline/phases/coverage-parsers/jacoco.js.map +1 -0
  199. package/dist/pipeline/phases/coverage-parsers/lcov.d.ts +21 -0
  200. package/dist/pipeline/phases/coverage-parsers/lcov.d.ts.map +1 -0
  201. package/dist/pipeline/phases/coverage-parsers/lcov.js +104 -0
  202. package/dist/pipeline/phases/coverage-parsers/lcov.js.map +1 -0
  203. package/dist/pipeline/phases/coverage-parsers/types.d.ts +27 -0
  204. package/dist/pipeline/phases/coverage-parsers/types.d.ts.map +1 -0
  205. package/dist/pipeline/phases/coverage-parsers/types.js +39 -0
  206. package/dist/pipeline/phases/coverage-parsers/types.js.map +1 -0
  207. package/dist/pipeline/phases/coverage.d.ts +39 -0
  208. package/dist/pipeline/phases/coverage.d.ts.map +1 -0
  209. package/dist/pipeline/phases/coverage.js +154 -0
  210. package/dist/pipeline/phases/coverage.js.map +1 -0
  211. package/dist/pipeline/phases/cross-file.d.ts +40 -0
  212. package/dist/pipeline/phases/cross-file.d.ts.map +1 -0
  213. package/dist/pipeline/phases/cross-file.js +411 -0
  214. package/dist/pipeline/phases/cross-file.js.map +1 -0
  215. package/dist/pipeline/phases/dead-code.d.ts +28 -0
  216. package/dist/pipeline/phases/dead-code.d.ts.map +1 -0
  217. package/dist/pipeline/phases/dead-code.js +157 -0
  218. package/dist/pipeline/phases/dead-code.js.map +1 -0
  219. package/dist/pipeline/phases/default-set.d.ts +24 -0
  220. package/dist/pipeline/phases/default-set.d.ts.map +1 -0
  221. package/dist/pipeline/phases/default-set.js +133 -0
  222. package/dist/pipeline/phases/default-set.js.map +1 -0
  223. package/dist/pipeline/phases/dependencies.d.ts +59 -0
  224. package/dist/pipeline/phases/dependencies.d.ts.map +1 -0
  225. package/dist/pipeline/phases/dependencies.js +281 -0
  226. package/dist/pipeline/phases/dependencies.js.map +1 -0
  227. package/dist/pipeline/phases/embedder-pool.d.ts +31 -0
  228. package/dist/pipeline/phases/embedder-pool.d.ts.map +1 -0
  229. package/dist/pipeline/phases/embedder-pool.js +79 -0
  230. package/dist/pipeline/phases/embedder-pool.js.map +1 -0
  231. package/dist/pipeline/phases/embedder-worker.d.ts +28 -0
  232. package/dist/pipeline/phases/embedder-worker.d.ts.map +1 -0
  233. package/dist/pipeline/phases/embedder-worker.js +43 -0
  234. package/dist/pipeline/phases/embedder-worker.js.map +1 -0
  235. package/dist/pipeline/phases/embeddings.d.ts +117 -0
  236. package/dist/pipeline/phases/embeddings.d.ts.map +1 -0
  237. package/dist/pipeline/phases/embeddings.js +697 -0
  238. package/dist/pipeline/phases/embeddings.js.map +1 -0
  239. package/dist/pipeline/phases/fetches.d.ts +47 -0
  240. package/dist/pipeline/phases/fetches.d.ts.map +1 -0
  241. package/dist/pipeline/phases/fetches.js +207 -0
  242. package/dist/pipeline/phases/fetches.js.map +1 -0
  243. package/dist/pipeline/phases/incremental-helper.d.ts +96 -0
  244. package/dist/pipeline/phases/incremental-helper.d.ts.map +1 -0
  245. package/dist/pipeline/phases/incremental-helper.js +125 -0
  246. package/dist/pipeline/phases/incremental-helper.js.map +1 -0
  247. package/dist/pipeline/phases/incremental-scope.d.ts +67 -0
  248. package/dist/pipeline/phases/incremental-scope.d.ts.map +1 -0
  249. package/dist/pipeline/phases/incremental-scope.js +225 -0
  250. package/dist/pipeline/phases/incremental-scope.js.map +1 -0
  251. package/dist/pipeline/phases/markdown.d.ts +29 -0
  252. package/dist/pipeline/phases/markdown.d.ts.map +1 -0
  253. package/dist/pipeline/phases/markdown.js +298 -0
  254. package/dist/pipeline/phases/markdown.js.map +1 -0
  255. package/dist/pipeline/phases/mro.d.ts +24 -0
  256. package/dist/pipeline/phases/mro.d.ts.map +1 -0
  257. package/dist/pipeline/phases/mro.js +303 -0
  258. package/dist/pipeline/phases/mro.js.map +1 -0
  259. package/dist/pipeline/phases/openapi.d.ts +52 -0
  260. package/dist/pipeline/phases/openapi.d.ts.map +1 -0
  261. package/dist/pipeline/phases/openapi.js +285 -0
  262. package/dist/pipeline/phases/openapi.js.map +1 -0
  263. package/dist/pipeline/phases/orm.d.ts +26 -0
  264. package/dist/pipeline/phases/orm.d.ts.map +1 -0
  265. package/dist/pipeline/phases/orm.js +183 -0
  266. package/dist/pipeline/phases/orm.js.map +1 -0
  267. package/dist/pipeline/phases/ownership.d.ts +88 -0
  268. package/dist/pipeline/phases/ownership.d.ts.map +1 -0
  269. package/dist/pipeline/phases/ownership.js +479 -0
  270. package/dist/pipeline/phases/ownership.js.map +1 -0
  271. package/dist/pipeline/phases/parse.d.ts +63 -0
  272. package/dist/pipeline/phases/parse.d.ts.map +1 -0
  273. package/dist/pipeline/phases/parse.js +994 -0
  274. package/dist/pipeline/phases/parse.js.map +1 -0
  275. package/dist/pipeline/phases/processes.d.ts +47 -0
  276. package/dist/pipeline/phases/processes.d.ts.map +1 -0
  277. package/dist/pipeline/phases/processes.js +620 -0
  278. package/dist/pipeline/phases/processes.js.map +1 -0
  279. package/dist/pipeline/phases/profile.d.ts +33 -0
  280. package/dist/pipeline/phases/profile.d.ts.map +1 -0
  281. package/dist/pipeline/phases/profile.js +91 -0
  282. package/dist/pipeline/phases/profile.js.map +1 -0
  283. package/dist/pipeline/phases/repo-node.d.ts +112 -0
  284. package/dist/pipeline/phases/repo-node.d.ts.map +1 -0
  285. package/dist/pipeline/phases/repo-node.js +272 -0
  286. package/dist/pipeline/phases/repo-node.js.map +1 -0
  287. package/dist/pipeline/phases/risk-snapshot.d.ts +34 -0
  288. package/dist/pipeline/phases/risk-snapshot.d.ts.map +1 -0
  289. package/dist/pipeline/phases/risk-snapshot.js +63 -0
  290. package/dist/pipeline/phases/risk-snapshot.js.map +1 -0
  291. package/dist/pipeline/phases/routes.d.ts +31 -0
  292. package/dist/pipeline/phases/routes.d.ts.map +1 -0
  293. package/dist/pipeline/phases/routes.js +262 -0
  294. package/dist/pipeline/phases/routes.js.map +1 -0
  295. package/dist/pipeline/phases/sbom.d.ts +45 -0
  296. package/dist/pipeline/phases/sbom.d.ts.map +1 -0
  297. package/dist/pipeline/phases/sbom.js +289 -0
  298. package/dist/pipeline/phases/sbom.js.map +1 -0
  299. package/dist/pipeline/phases/scan.d.ts +54 -0
  300. package/dist/pipeline/phases/scan.d.ts.map +1 -0
  301. package/dist/pipeline/phases/scan.js +340 -0
  302. package/dist/pipeline/phases/scan.js.map +1 -0
  303. package/dist/pipeline/phases/scip-index.d.ts +54 -0
  304. package/dist/pipeline/phases/scip-index.d.ts.map +1 -0
  305. package/dist/pipeline/phases/scip-index.js +469 -0
  306. package/dist/pipeline/phases/scip-index.js.map +1 -0
  307. package/dist/pipeline/phases/structure.d.ts +21 -0
  308. package/dist/pipeline/phases/structure.d.ts.map +1 -0
  309. package/dist/pipeline/phases/structure.js +115 -0
  310. package/dist/pipeline/phases/structure.js.map +1 -0
  311. package/dist/pipeline/phases/summarize.d.ts +126 -0
  312. package/dist/pipeline/phases/summarize.d.ts.map +1 -0
  313. package/dist/pipeline/phases/summarize.js +401 -0
  314. package/dist/pipeline/phases/summarize.js.map +1 -0
  315. package/dist/pipeline/phases/temporal-helpers/branch-divergence.d.ts +42 -0
  316. package/dist/pipeline/phases/temporal-helpers/branch-divergence.d.ts.map +1 -0
  317. package/dist/pipeline/phases/temporal-helpers/branch-divergence.js +96 -0
  318. package/dist/pipeline/phases/temporal-helpers/branch-divergence.js.map +1 -0
  319. package/dist/pipeline/phases/temporal-helpers/churn-decay.d.ts +22 -0
  320. package/dist/pipeline/phases/temporal-helpers/churn-decay.d.ts.map +1 -0
  321. package/dist/pipeline/phases/temporal-helpers/churn-decay.js +32 -0
  322. package/dist/pipeline/phases/temporal-helpers/churn-decay.js.map +1 -0
  323. package/dist/pipeline/phases/temporal-helpers/conventional-commits.d.ts +21 -0
  324. package/dist/pipeline/phases/temporal-helpers/conventional-commits.d.ts.map +1 -0
  325. package/dist/pipeline/phases/temporal-helpers/conventional-commits.js +37 -0
  326. package/dist/pipeline/phases/temporal-helpers/conventional-commits.js.map +1 -0
  327. package/dist/pipeline/phases/temporal-helpers/gini.d.ts +32 -0
  328. package/dist/pipeline/phases/temporal-helpers/gini.d.ts.map +1 -0
  329. package/dist/pipeline/phases/temporal-helpers/gini.js +78 -0
  330. package/dist/pipeline/phases/temporal-helpers/gini.js.map +1 -0
  331. package/dist/pipeline/phases/temporal-helpers/revert-detect.d.ts +14 -0
  332. package/dist/pipeline/phases/temporal-helpers/revert-detect.d.ts.map +1 -0
  333. package/dist/pipeline/phases/temporal-helpers/revert-detect.js +25 -0
  334. package/dist/pipeline/phases/temporal-helpers/revert-detect.js.map +1 -0
  335. package/dist/pipeline/phases/temporal-helpers/test-pair.d.ts +18 -0
  336. package/dist/pipeline/phases/temporal-helpers/test-pair.d.ts.map +1 -0
  337. package/dist/pipeline/phases/temporal-helpers/test-pair.js +119 -0
  338. package/dist/pipeline/phases/temporal-helpers/test-pair.js.map +1 -0
  339. package/dist/pipeline/phases/temporal.d.ts +65 -0
  340. package/dist/pipeline/phases/temporal.d.ts.map +1 -0
  341. package/dist/pipeline/phases/temporal.js +621 -0
  342. package/dist/pipeline/phases/temporal.js.map +1 -0
  343. package/dist/pipeline/phases/tools.d.ts +21 -0
  344. package/dist/pipeline/phases/tools.d.ts.map +1 -0
  345. package/dist/pipeline/phases/tools.js +118 -0
  346. package/dist/pipeline/phases/tools.js.map +1 -0
  347. package/dist/pipeline/profile-detectors/api-contracts.d.ts +18 -0
  348. package/dist/pipeline/profile-detectors/api-contracts.d.ts.map +1 -0
  349. package/dist/pipeline/profile-detectors/api-contracts.js +78 -0
  350. package/dist/pipeline/profile-detectors/api-contracts.js.map +1 -0
  351. package/dist/pipeline/profile-detectors/framework-detector.d.ts +11 -0
  352. package/dist/pipeline/profile-detectors/framework-detector.d.ts.map +1 -0
  353. package/dist/pipeline/profile-detectors/framework-detector.js +11 -0
  354. package/dist/pipeline/profile-detectors/framework-detector.js.map +1 -0
  355. package/dist/pipeline/profile-detectors/frameworks-catalog.d.ts +7 -0
  356. package/dist/pipeline/profile-detectors/frameworks-catalog.d.ts.map +1 -0
  357. package/dist/pipeline/profile-detectors/frameworks-catalog.js +7 -0
  358. package/dist/pipeline/profile-detectors/frameworks-catalog.js.map +1 -0
  359. package/dist/pipeline/profile-detectors/frameworks.d.ts +7 -0
  360. package/dist/pipeline/profile-detectors/frameworks.d.ts.map +1 -0
  361. package/dist/pipeline/profile-detectors/frameworks.js +7 -0
  362. package/dist/pipeline/profile-detectors/frameworks.js.map +1 -0
  363. package/dist/pipeline/profile-detectors/iac.d.ts +22 -0
  364. package/dist/pipeline/profile-detectors/iac.d.ts.map +1 -0
  365. package/dist/pipeline/profile-detectors/iac.js +97 -0
  366. package/dist/pipeline/profile-detectors/iac.js.map +1 -0
  367. package/dist/pipeline/profile-detectors/languages.d.ts +18 -0
  368. package/dist/pipeline/profile-detectors/languages.d.ts.map +1 -0
  369. package/dist/pipeline/profile-detectors/languages.js +60 -0
  370. package/dist/pipeline/profile-detectors/languages.js.map +1 -0
  371. package/dist/pipeline/profile-detectors/manifests.d.ts +7 -0
  372. package/dist/pipeline/profile-detectors/manifests.d.ts.map +1 -0
  373. package/dist/pipeline/profile-detectors/manifests.js +7 -0
  374. package/dist/pipeline/profile-detectors/manifests.js.map +1 -0
  375. package/dist/pipeline/profile-detectors/src-dirs.d.ts +17 -0
  376. package/dist/pipeline/profile-detectors/src-dirs.d.ts.map +1 -0
  377. package/dist/pipeline/profile-detectors/src-dirs.js +89 -0
  378. package/dist/pipeline/profile-detectors/src-dirs.js.map +1 -0
  379. package/dist/pipeline/profile-detectors/variant-detectors.d.ts +7 -0
  380. package/dist/pipeline/profile-detectors/variant-detectors.d.ts.map +1 -0
  381. package/dist/pipeline/profile-detectors/variant-detectors.js +7 -0
  382. package/dist/pipeline/profile-detectors/variant-detectors.js.map +1 -0
  383. package/dist/pipeline/runner.d.ts +54 -0
  384. package/dist/pipeline/runner.d.ts.map +1 -0
  385. package/dist/pipeline/runner.js +247 -0
  386. package/dist/pipeline/runner.js.map +1 -0
  387. package/dist/pipeline/types.d.ts +235 -0
  388. package/dist/pipeline/types.d.ts.map +1 -0
  389. package/dist/pipeline/types.js +15 -0
  390. package/dist/pipeline/types.js.map +1 -0
  391. package/dist/providers/c.d.ts +3 -0
  392. package/dist/providers/c.d.ts.map +1 -0
  393. package/dist/providers/c.js +162 -0
  394. package/dist/providers/c.js.map +1 -0
  395. package/dist/providers/cobol.d.ts +19 -0
  396. package/dist/providers/cobol.d.ts.map +1 -0
  397. package/dist/providers/cobol.js +44 -0
  398. package/dist/providers/cobol.js.map +1 -0
  399. package/dist/providers/cpp.d.ts +3 -0
  400. package/dist/providers/cpp.d.ts.map +1 -0
  401. package/dist/providers/cpp.js +200 -0
  402. package/dist/providers/cpp.js.map +1 -0
  403. package/dist/providers/csharp.d.ts +3 -0
  404. package/dist/providers/csharp.d.ts.map +1 -0
  405. package/dist/providers/csharp.js +292 -0
  406. package/dist/providers/csharp.js.map +1 -0
  407. package/dist/providers/dart.d.ts +3 -0
  408. package/dist/providers/dart.d.ts.map +1 -0
  409. package/dist/providers/dart.js +214 -0
  410. package/dist/providers/dart.js.map +1 -0
  411. package/dist/providers/definition-ids.d.ts +18 -0
  412. package/dist/providers/definition-ids.d.ts.map +1 -0
  413. package/dist/providers/definition-ids.js +23 -0
  414. package/dist/providers/definition-ids.js.map +1 -0
  415. package/dist/providers/extract-helpers.d.ts +60 -0
  416. package/dist/providers/extract-helpers.d.ts.map +1 -0
  417. package/dist/providers/extract-helpers.js +296 -0
  418. package/dist/providers/extract-helpers.js.map +1 -0
  419. package/dist/providers/extraction-types.d.ts +85 -0
  420. package/dist/providers/extraction-types.d.ts.map +1 -0
  421. package/dist/providers/extraction-types.js +13 -0
  422. package/dist/providers/extraction-types.js.map +1 -0
  423. package/dist/providers/go.d.ts +3 -0
  424. package/dist/providers/go.d.ts.map +1 -0
  425. package/dist/providers/go.js +359 -0
  426. package/dist/providers/go.js.map +1 -0
  427. package/dist/providers/http-detect.d.ts +44 -0
  428. package/dist/providers/http-detect.d.ts.map +1 -0
  429. package/dist/providers/http-detect.js +307 -0
  430. package/dist/providers/http-detect.js.map +1 -0
  431. package/dist/providers/index.d.ts +38 -0
  432. package/dist/providers/index.d.ts.map +1 -0
  433. package/dist/providers/index.js +33 -0
  434. package/dist/providers/index.js.map +1 -0
  435. package/dist/providers/java.d.ts +3 -0
  436. package/dist/providers/java.d.ts.map +1 -0
  437. package/dist/providers/java.js +259 -0
  438. package/dist/providers/java.js.map +1 -0
  439. package/dist/providers/javascript.d.ts +3 -0
  440. package/dist/providers/javascript.d.ts.map +1 -0
  441. package/dist/providers/javascript.js +139 -0
  442. package/dist/providers/javascript.js.map +1 -0
  443. package/dist/providers/kotlin.d.ts +3 -0
  444. package/dist/providers/kotlin.d.ts.map +1 -0
  445. package/dist/providers/kotlin.js +175 -0
  446. package/dist/providers/kotlin.js.map +1 -0
  447. package/dist/providers/php.d.ts +3 -0
  448. package/dist/providers/php.d.ts.map +1 -0
  449. package/dist/providers/php.js +218 -0
  450. package/dist/providers/php.js.map +1 -0
  451. package/dist/providers/python-accesses.d.ts +9 -0
  452. package/dist/providers/python-accesses.d.ts.map +1 -0
  453. package/dist/providers/python-accesses.js +22 -0
  454. package/dist/providers/python-accesses.js.map +1 -0
  455. package/dist/providers/python.d.ts +3 -0
  456. package/dist/providers/python.d.ts.map +1 -0
  457. package/dist/providers/python.js +323 -0
  458. package/dist/providers/python.js.map +1 -0
  459. package/dist/providers/registry.d.ts +4 -0
  460. package/dist/providers/registry.d.ts.map +1 -0
  461. package/dist/providers/registry.js +46 -0
  462. package/dist/providers/registry.js.map +1 -0
  463. package/dist/providers/resolution/c3.d.ts +6 -0
  464. package/dist/providers/resolution/c3.d.ts.map +1 -0
  465. package/dist/providers/resolution/c3.js +76 -0
  466. package/dist/providers/resolution/c3.js.map +1 -0
  467. package/dist/providers/resolution/context.d.ts +38 -0
  468. package/dist/providers/resolution/context.d.ts.map +1 -0
  469. package/dist/providers/resolution/context.js +45 -0
  470. package/dist/providers/resolution/context.js.map +1 -0
  471. package/dist/providers/resolution/first-wins.d.ts +3 -0
  472. package/dist/providers/resolution/first-wins.d.ts.map +1 -0
  473. package/dist/providers/resolution/first-wins.js +27 -0
  474. package/dist/providers/resolution/first-wins.js.map +1 -0
  475. package/dist/providers/resolution/mro.d.ts +16 -0
  476. package/dist/providers/resolution/mro.d.ts.map +1 -0
  477. package/dist/providers/resolution/mro.js +14 -0
  478. package/dist/providers/resolution/mro.js.map +1 -0
  479. package/dist/providers/resolution/none.d.ts +3 -0
  480. package/dist/providers/resolution/none.d.ts.map +1 -0
  481. package/dist/providers/resolution/none.js +11 -0
  482. package/dist/providers/resolution/none.js.map +1 -0
  483. package/dist/providers/resolution/python-all-filter.d.ts +25 -0
  484. package/dist/providers/resolution/python-all-filter.d.ts.map +1 -0
  485. package/dist/providers/resolution/python-all-filter.js +64 -0
  486. package/dist/providers/resolution/python-all-filter.js.map +1 -0
  487. package/dist/providers/resolution/resolver-strategy.d.ts +42 -0
  488. package/dist/providers/resolution/resolver-strategy.d.ts.map +1 -0
  489. package/dist/providers/resolution/resolver-strategy.js +50 -0
  490. package/dist/providers/resolution/resolver-strategy.js.map +1 -0
  491. package/dist/providers/resolution/single-inheritance.d.ts +3 -0
  492. package/dist/providers/resolution/single-inheritance.d.ts.map +1 -0
  493. package/dist/providers/resolution/single-inheritance.js +21 -0
  494. package/dist/providers/resolution/single-inheritance.js.map +1 -0
  495. package/dist/providers/resolution/stack-graphs/__fixtures__/mock-tree.d.ts +16 -0
  496. package/dist/providers/resolution/stack-graphs/__fixtures__/mock-tree.d.ts.map +1 -0
  497. package/dist/providers/resolution/stack-graphs/__fixtures__/mock-tree.js +50 -0
  498. package/dist/providers/resolution/stack-graphs/__fixtures__/mock-tree.js.map +1 -0
  499. package/dist/providers/resolution/stack-graphs/glue.d.ts +15 -0
  500. package/dist/providers/resolution/stack-graphs/glue.d.ts.map +1 -0
  501. package/dist/providers/resolution/stack-graphs/glue.js +44 -0
  502. package/dist/providers/resolution/stack-graphs/glue.js.map +1 -0
  503. package/dist/providers/resolution/stack-graphs/node-edge-builder.d.ts +30 -0
  504. package/dist/providers/resolution/stack-graphs/node-edge-builder.d.ts.map +1 -0
  505. package/dist/providers/resolution/stack-graphs/node-edge-builder.js +366 -0
  506. package/dist/providers/resolution/stack-graphs/node-edge-builder.js.map +1 -0
  507. package/dist/providers/resolution/stack-graphs/partial-path-engine.d.ts +9 -0
  508. package/dist/providers/resolution/stack-graphs/partial-path-engine.d.ts.map +1 -0
  509. package/dist/providers/resolution/stack-graphs/partial-path-engine.js +152 -0
  510. package/dist/providers/resolution/stack-graphs/partial-path-engine.js.map +1 -0
  511. package/dist/providers/resolution/stack-graphs/rule-parser.d.ts +11 -0
  512. package/dist/providers/resolution/stack-graphs/rule-parser.d.ts.map +1 -0
  513. package/dist/providers/resolution/stack-graphs/rule-parser.js +247 -0
  514. package/dist/providers/resolution/stack-graphs/rule-parser.js.map +1 -0
  515. package/dist/providers/resolution/stack-graphs/types.d.ts +93 -0
  516. package/dist/providers/resolution/stack-graphs/types.d.ts.map +1 -0
  517. package/dist/providers/resolution/stack-graphs/types.js +11 -0
  518. package/dist/providers/resolution/stack-graphs/types.js.map +1 -0
  519. package/dist/providers/resolution/stack-graphs-python.d.ts +27 -0
  520. package/dist/providers/resolution/stack-graphs-python.d.ts.map +1 -0
  521. package/dist/providers/resolution/stack-graphs-python.js +104 -0
  522. package/dist/providers/resolution/stack-graphs-python.js.map +1 -0
  523. package/dist/providers/resolution/stack-graphs-ts.d.ts +134 -0
  524. package/dist/providers/resolution/stack-graphs-ts.d.ts.map +1 -0
  525. package/dist/providers/resolution/stack-graphs-ts.js +372 -0
  526. package/dist/providers/resolution/stack-graphs-ts.js.map +1 -0
  527. package/dist/providers/ruby.d.ts +3 -0
  528. package/dist/providers/ruby.d.ts.map +1 -0
  529. package/dist/providers/ruby.js +259 -0
  530. package/dist/providers/ruby.js.map +1 -0
  531. package/dist/providers/rust.d.ts +3 -0
  532. package/dist/providers/rust.d.ts.map +1 -0
  533. package/dist/providers/rust.js +318 -0
  534. package/dist/providers/rust.js.map +1 -0
  535. package/dist/providers/swift.d.ts +3 -0
  536. package/dist/providers/swift.d.ts.map +1 -0
  537. package/dist/providers/swift.js +177 -0
  538. package/dist/providers/swift.js.map +1 -0
  539. package/dist/providers/test-helpers.d.ts +24 -0
  540. package/dist/providers/test-helpers.d.ts.map +1 -0
  541. package/dist/providers/test-helpers.js +33 -0
  542. package/dist/providers/test-helpers.js.map +1 -0
  543. package/dist/providers/ts-shared.d.ts +30 -0
  544. package/dist/providers/ts-shared.d.ts.map +1 -0
  545. package/dist/providers/ts-shared.js +328 -0
  546. package/dist/providers/ts-shared.js.map +1 -0
  547. package/dist/providers/tsx.d.ts +7 -0
  548. package/dist/providers/tsx.d.ts.map +1 -0
  549. package/dist/providers/tsx.js +79 -0
  550. package/dist/providers/tsx.js.map +1 -0
  551. package/dist/providers/types.d.ts +166 -0
  552. package/dist/providers/types.d.ts.map +1 -0
  553. package/dist/providers/types.js +7 -0
  554. package/dist/providers/types.js.map +1 -0
  555. package/dist/providers/typescript-family-accesses.d.ts +14 -0
  556. package/dist/providers/typescript-family-accesses.d.ts.map +1 -0
  557. package/dist/providers/typescript-family-accesses.js +27 -0
  558. package/dist/providers/typescript-family-accesses.js.map +1 -0
  559. package/dist/providers/typescript.d.ts +9 -0
  560. package/dist/providers/typescript.d.ts.map +1 -0
  561. package/dist/providers/typescript.js +84 -0
  562. package/dist/providers/typescript.js.map +1 -0
  563. package/package.json +108 -0
@@ -0,0 +1,323 @@
1
+ /**
2
+ * Content-addressed parse cache.
3
+ *
4
+ * Per-file JSON sidecar under `<repo>/.codehub/parse-cache/`, keyed on
5
+ * `sha256(content) + grammarSha + pipelineVersion`. Grammar and pipeline
6
+ * version changes invalidate cleanly because they participate in the cache
7
+ * filename — readers that look up the fresh key just miss on old entries.
8
+ *
9
+ * Layout:
10
+ *
11
+ * .codehub/parse-cache/<contentSha[0..2]>/<contentSha>-<grammarSha[0..6]>-<pipelineVersion>.json
12
+ *
13
+ * The 2-char shard prefix keeps each directory under ~2k entries at 100k
14
+ * file scale, which most filesystems handle well. Short grammarSha + full
15
+ * pipelineVersion in the filename keep the disk layout human-inspectable
16
+ * (you can `rm -rf .codehub/parse-cache/` at any time without corruption —
17
+ * the cache is purely a latency optimization, never source of truth).
18
+ *
19
+ * This module is a **utility**, not a pipeline phase:
20
+ * - Scan writes `grammarSha` onto each `ScannedFile`.
21
+ * - `parse.ts` consumes the utility: lookup → replay → fill. Hits bypass
22
+ * the worker pool entirely; misses go through the worker pool and then
23
+ * serialize their {@link CachedExtractions} back to disk for next time.
24
+ *
25
+ * Atomic writes go through `write-file-atomic` (reused helper pattern from
26
+ * `packages/cli/src/fs-atomic.ts`): temp file + fsync + rename. Reads
27
+ * tolerate missing or malformed files by returning `null` — a cache miss
28
+ * is normal behavior, never an error.
29
+ */
30
+ import { promises as fs } from "node:fs";
31
+ import path from "node:path";
32
+ import { default as wfa } from "write-file-atomic";
33
+ /** Current cache envelope schema. Bump in lockstep with breaking changes. */
34
+ export const CACHE_VERSION = 2;
35
+ /** Shard prefix length; 2 chars → 256 buckets, each <~400 entries at 100k. */
36
+ const SHARD_PREFIX_LEN = 2;
37
+ /** Grammar SHA bytes embedded in the filename (first 6 hex chars). */
38
+ const GRAMMAR_SHA_IN_FILENAME_LEN = 6;
39
+ /**
40
+ * Build a cache key from its three components. Pure; performs no IO.
41
+ * Inputs must already be content-addressed (sha256 hex) or semver strings —
42
+ * no normalization is applied here.
43
+ */
44
+ export function deriveCacheKey(contentSha, grammarSha, pipelineVersion) {
45
+ return { contentSha, grammarSha, pipelineVersion };
46
+ }
47
+ /**
48
+ * Resolve the on-disk path for a cache key under `cacheDir`.
49
+ *
50
+ * Layout:
51
+ * `<cacheDir>/<contentSha[0..2]>/<contentSha>-<grammarSha[0..6]>-<pipelineVersion>.json`
52
+ *
53
+ * The grammarSha/pipelineVersion suffix ensures two simultaneous entries
54
+ * for the same content (e.g. before/after a grammar bump) cannot clobber
55
+ * each other — older entries simply become unreachable and are reclaimed
56
+ * by the LRU sweep in {@link evictIfOverCap}, which runs after every
57
+ * `writeCacheEntry` when `CODEHUB_PARSE_CACHE_MAX_BYTES` (default `1GiB`)
58
+ * is non-zero.
59
+ */
60
+ export function cacheFilePath(cacheDir, key) {
61
+ const shard = key.contentSha.slice(0, SHARD_PREFIX_LEN);
62
+ const shortGrammar = key.grammarSha.slice(0, GRAMMAR_SHA_IN_FILENAME_LEN);
63
+ const filename = `${key.contentSha}-${shortGrammar}-${key.pipelineVersion}.json`;
64
+ return path.join(cacheDir, shard, filename);
65
+ }
66
+ /**
67
+ * Read a cache entry. Returns `null` on any failure (missing file, read
68
+ * error, JSON parse error, shape mismatch) — a cache miss is never fatal.
69
+ *
70
+ * This deliberately does NOT validate the envelope deeply; downstream
71
+ * consumers treat the shape as advisory and will rebuild on any surprise.
72
+ */
73
+ export async function readCacheEntry(cacheDir, key) {
74
+ const filePath = cacheFilePath(cacheDir, key);
75
+ let text;
76
+ try {
77
+ text = await fs.readFile(filePath, "utf8");
78
+ }
79
+ catch {
80
+ return null;
81
+ }
82
+ let parsed;
83
+ try {
84
+ parsed = JSON.parse(text);
85
+ }
86
+ catch {
87
+ return null;
88
+ }
89
+ if (!isCacheEntry(parsed)) {
90
+ return null;
91
+ }
92
+ // Double-check the envelope matches the composed key — protects against a
93
+ // filesystem races where a stale/misnamed file could shadow a fresh one.
94
+ if (parsed.grammarSha !== key.grammarSha || parsed.pipelineVersion !== key.pipelineVersion) {
95
+ return null;
96
+ }
97
+ return parsed;
98
+ }
99
+ /**
100
+ * Default cap when `CODEHUB_PARSE_CACHE_MAX_BYTES` is unset. 1 GiB keeps a
101
+ * generous headroom on a typical dev box while preventing the cache from
102
+ * growing without bound on long-lived analyzer hosts. Set the env var to
103
+ * `0` to disable eviction entirely (useful for ephemeral CI runners).
104
+ */
105
+ const DEFAULT_CACHE_CAP = "1GiB";
106
+ /**
107
+ * Write a cache entry atomically. Creates the shard directory if missing.
108
+ * Never throws on `mkdir EEXIST`; other IO failures propagate to the caller.
109
+ *
110
+ * After a successful write, runs {@link evictIfOverCap} against the cap
111
+ * sourced from `CODEHUB_PARSE_CACHE_MAX_BYTES` (default `1GiB`; `0`
112
+ * disables). Eviction errors are swallowed — a cache-eviction failure
113
+ * is never fatal to the pipeline.
114
+ */
115
+ export async function writeCacheEntry(cacheDir, key, entry) {
116
+ const filePath = cacheFilePath(cacheDir, key);
117
+ const parentDir = path.dirname(filePath);
118
+ // recursive:true already tolerates EEXIST; kept explicit for readability.
119
+ await fs.mkdir(parentDir, { recursive: true });
120
+ const payload = `${JSON.stringify(entry, null, 2)}\n`;
121
+ await writeFileAtomicAsync(filePath, payload);
122
+ // Post-write LRU sweep — gated on env, errors swallowed.
123
+ const cap = parseHumanSizeBytes(process.env["CODEHUB_PARSE_CACHE_MAX_BYTES"] ?? DEFAULT_CACHE_CAP);
124
+ if (cap > 0) {
125
+ try {
126
+ await evictIfOverCap(cacheDir, cap);
127
+ }
128
+ catch {
129
+ // Cache-eviction failure is never fatal; caller still got their write.
130
+ }
131
+ }
132
+ }
133
+ /**
134
+ * Parse a human-readable size string (e.g. `"1GiB"`, `"500MB"`, `"0"`) into
135
+ * bytes. Numeric inputs pass through clamped to non-negative. Unknown
136
+ * units, malformed input, or negative numbers all yield `0` (which the
137
+ * eviction code treats as "disabled"). Both decimal (KB/MB/GB/TB) and
138
+ * binary (KiB/MiB/GiB/TiB) prefixes are supported.
139
+ */
140
+ export function parseHumanSizeBytes(input) {
141
+ if (typeof input === "number")
142
+ return Number.isFinite(input) ? Math.max(0, Math.floor(input)) : 0;
143
+ const m = /^\s*(\d+(?:\.\d+)?)\s*([KMGT]i?B?|B)?\s*$/i.exec(input);
144
+ if (!m)
145
+ return 0;
146
+ const n = Number.parseFloat(m[1] ?? "0");
147
+ if (!Number.isFinite(n) || n < 0)
148
+ return 0;
149
+ const unit = (m[2] ?? "").toUpperCase();
150
+ const mult = {
151
+ "": 1,
152
+ B: 1,
153
+ KB: 1_000,
154
+ KIB: 1024,
155
+ MB: 1_000_000,
156
+ MIB: 1024 ** 2,
157
+ GB: 1_000_000_000,
158
+ GIB: 1024 ** 3,
159
+ TB: 1_000_000_000_000,
160
+ TIB: 1024 ** 4,
161
+ };
162
+ return Math.floor(n * (mult[unit] ?? 1));
163
+ }
164
+ /**
165
+ * LRU-evict cache entries until total on-disk bytes ≤ `0.9 × capBytes`.
166
+ *
167
+ * Walks the same shard layout as {@link computeCacheSize}: each top-level
168
+ * directory under `cacheDir` is treated as a shard, and every regular
169
+ * file inside it is a candidate. Entries are sorted by mtime ascending,
170
+ * then unlinked in oldest-first order until the running total reaches
171
+ * the 90 % water-mark — the headroom prevents thrash where each new
172
+ * write evicts exactly one older entry.
173
+ *
174
+ * Behavior:
175
+ * - `capBytes <= 0` short-circuits (eviction disabled).
176
+ * - Missing `cacheDir` is a no-op.
177
+ * - Per-file errors during stat or unlink are swallowed (skipped).
178
+ * - Total under cap → no work done.
179
+ *
180
+ * Cache layout reminder: `<cacheDir>/<shard:2>/<contentSha>-<grammar:6>-<pipelineVersion>.json`.
181
+ */
182
+ export async function evictIfOverCap(cacheDir, capBytes) {
183
+ if (capBytes <= 0)
184
+ return;
185
+ const candidates = [];
186
+ let total = 0;
187
+ let shards;
188
+ try {
189
+ shards = await fs.readdir(cacheDir, { withFileTypes: true });
190
+ }
191
+ catch {
192
+ return; // Missing cache dir → nothing to evict.
193
+ }
194
+ // Deterministic shard order matches computeCacheSize.
195
+ shards.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
196
+ for (const shard of shards) {
197
+ if (!shard.isDirectory())
198
+ continue;
199
+ const shardPath = path.join(cacheDir, shard.name);
200
+ let entries;
201
+ try {
202
+ entries = await fs.readdir(shardPath, { withFileTypes: true });
203
+ }
204
+ catch {
205
+ continue;
206
+ }
207
+ entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
208
+ for (const e of entries) {
209
+ if (!e.isFile())
210
+ continue;
211
+ const entryPath = path.join(shardPath, e.name);
212
+ try {
213
+ const s = await fs.stat(entryPath);
214
+ candidates.push({ path: entryPath, size: s.size, mtimeMs: s.mtimeMs });
215
+ total += s.size;
216
+ }
217
+ catch {
218
+ // File vanished mid-traversal; skip.
219
+ }
220
+ }
221
+ }
222
+ if (total <= capBytes)
223
+ return;
224
+ const target = Math.floor(0.9 * capBytes);
225
+ // Oldest first → LRU eviction order.
226
+ candidates.sort((a, b) => a.mtimeMs - b.mtimeMs);
227
+ for (const c of candidates) {
228
+ if (total <= target)
229
+ break;
230
+ try {
231
+ await fs.unlink(c.path);
232
+ total -= c.size;
233
+ }
234
+ catch {
235
+ // Concurrent unlink, EACCES, etc. — keep going; over-cap is recoverable.
236
+ }
237
+ }
238
+ }
239
+ /**
240
+ * Walk `cacheDir` and report total file count + byte size. Used by the
241
+ * meta-sidecar cache-stats path. Returns zeros when the directory does
242
+ * not exist.
243
+ */
244
+ export async function computeCacheSize(cacheDir) {
245
+ let fileCount = 0;
246
+ let bytes = 0;
247
+ try {
248
+ const shards = await fs.readdir(cacheDir, { withFileTypes: true });
249
+ // Sort for deterministic traversal — size totals are commutative but
250
+ // deterministic iteration makes error messages reproducible.
251
+ shards.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
252
+ for (const shard of shards) {
253
+ if (!shard.isDirectory())
254
+ continue;
255
+ const shardPath = path.join(cacheDir, shard.name);
256
+ let entries;
257
+ try {
258
+ entries = await fs.readdir(shardPath, { withFileTypes: true });
259
+ }
260
+ catch {
261
+ continue;
262
+ }
263
+ entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
264
+ for (const e of entries) {
265
+ if (!e.isFile())
266
+ continue;
267
+ const entryPath = path.join(shardPath, e.name);
268
+ try {
269
+ const s = await fs.stat(entryPath);
270
+ fileCount += 1;
271
+ bytes += s.size;
272
+ }
273
+ catch {
274
+ // Skip files that disappeared during traversal.
275
+ }
276
+ }
277
+ }
278
+ }
279
+ catch {
280
+ // Missing cache dir → zeroes.
281
+ }
282
+ return { fileCount, bytes };
283
+ }
284
+ /** Promise wrapper around write-file-atomic's callback/promise dual API. */
285
+ async function writeFileAtomicAsync(filePath, contents) {
286
+ await wfa(filePath, contents, { encoding: "utf8", fsync: true });
287
+ }
288
+ function isCacheEntry(v) {
289
+ if (v === null || typeof v !== "object")
290
+ return false;
291
+ const o = v;
292
+ if (o["cacheVersion"] !== CACHE_VERSION)
293
+ return false;
294
+ if (typeof o["grammarSha"] !== "string")
295
+ return false;
296
+ if (typeof o["pipelineVersion"] !== "string")
297
+ return false;
298
+ const ex = o["extractions"];
299
+ if (ex === null || typeof ex !== "object")
300
+ return false;
301
+ const e = ex;
302
+ if (!Array.isArray(e["definitions"]))
303
+ return false;
304
+ if (!Array.isArray(e["calls"]))
305
+ return false;
306
+ if (!Array.isArray(e["imports"]))
307
+ return false;
308
+ if (!Array.isArray(e["heritage"]))
309
+ return false;
310
+ // `captures` is optional at v2 — validate only if present.
311
+ if (o["captures"] !== undefined && !Array.isArray(o["captures"]))
312
+ return false;
313
+ const md = o["metadata"];
314
+ if (md === null || typeof md !== "object")
315
+ return false;
316
+ const m = md;
317
+ if (typeof m["language"] !== "string")
318
+ return false;
319
+ if (typeof m["byteSize"] !== "number")
320
+ return false;
321
+ return true;
322
+ }
323
+ //# sourceMappingURL=content-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-cache.js","sourceRoot":"","sources":["../../../src/pipeline/phases/content-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAQnD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC;AAC/B,8EAA8E;AAC9E,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,sEAAsE;AACtE,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAiEtC;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,UAAkB,EAClB,UAAkB,EAClB,eAAuB;IAEvB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;AACrD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,GAAa;IAC3D,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,2BAA2B,CAAC,CAAC;IAC1E,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,UAAU,IAAI,YAAY,IAAI,GAAG,CAAC,eAAe,OAAO,CAAC;IACjF,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,GAAa;IAClE,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC9C,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,0EAA0E;IAC1E,yEAAyE;IACzE,IAAI,MAAM,CAAC,UAAU,KAAK,GAAG,CAAC,UAAU,IAAI,MAAM,CAAC,eAAe,KAAK,GAAG,CAAC,eAAe,EAAE,CAAC;QAC3F,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,GAAa,EACb,KAAiB;IAEjB,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,0EAA0E;IAC1E,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IACtD,MAAM,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,yDAAyD;IACzD,MAAM,GAAG,GAAG,mBAAmB,CAC7B,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,IAAI,iBAAiB,CAClE,CAAC;IACF,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;QACzE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAsB;IACxD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClG,MAAM,CAAC,GAAG,4CAA4C,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnE,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjB,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACxC,MAAM,IAAI,GAA2B;QACnC,EAAE,EAAE,CAAC;QACL,CAAC,EAAE,CAAC;QACJ,EAAE,EAAE,KAAK;QACT,GAAG,EAAE,IAAI;QACT,EAAE,EAAE,SAAS;QACb,GAAG,EAAE,IAAI,IAAI,CAAC;QACd,EAAE,EAAE,aAAa;QACjB,GAAG,EAAE,IAAI,IAAI,CAAC;QACd,EAAE,EAAE,iBAAiB;QACrB,GAAG,EAAE,IAAI,IAAI,CAAC;KACf,CAAC;IACF,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,QAAgB;IACrE,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO;IAO1B,MAAM,UAAU,GAAgB,EAAE,CAAC;IACnC,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,IAAI,MAAkC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,wCAAwC;IAClD,CAAC;IACD,sDAAsD;IACtD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAS;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,OAAmC,CAAC;QACxC,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE;gBAAE,SAAS;YAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACnC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBACvE,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC;YAClB,CAAC;YAAC,MAAM,CAAC;gBACP,qCAAqC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,KAAK,IAAI,QAAQ;QAAE,OAAO;IAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC;IAC1C,qCAAqC;IACrC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,KAAK,IAAI,MAAM;YAAE,MAAM;QAC3B,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACxB,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,yEAAyE;QAC3E,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB;IAEhB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,qEAAqE;QACrE,6DAA6D;QAC7D,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBAAE,SAAS;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,OAAmC,CAAC;YACxC,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE;oBAAE,SAAS;gBAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC/C,IAAI,CAAC;oBACH,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACnC,SAAS,IAAI,CAAC,CAAC;oBACf,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC;gBAClB,CAAC;gBAAC,MAAM,CAAC;oBACP,gDAAgD;gBAClD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;IAChC,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED,4EAA4E;AAC5E,KAAK,UAAU,oBAAoB,CAAC,QAAgB,EAAE,QAAgB;IACpE,MAAM,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,YAAY,CAAC,CAAU;IAC9B,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,CAA4B,CAAC;IACvC,IAAI,CAAC,CAAC,cAAc,CAAC,KAAK,aAAa;QAAE,OAAO,KAAK,CAAC;IACtD,IAAI,OAAO,CAAC,CAAC,YAAY,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,IAAI,OAAO,CAAC,CAAC,iBAAiB,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC3D,MAAM,EAAE,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC;IAC5B,IAAI,EAAE,KAAK,IAAI,IAAI,OAAO,EAAE,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACxD,MAAM,CAAC,GAAG,EAA6B,CAAC;IACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAChD,2DAA2D;IAC3D,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/E,MAAM,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IACzB,IAAI,EAAE,KAAK,IAAI,IAAI,OAAO,EAAE,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACxD,MAAM,CAAC,GAAG,EAA6B,CAAC;IACxC,IAAI,OAAO,CAAC,CAAC,UAAU,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACpD,IAAI,OAAO,CAAC,CAAC,UAAU,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACpD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Cobertura coverage.xml parser.
3
+ *
4
+ * Cobertura / Python coverage-xml reports nest per-file coverage under:
5
+ * <coverage>
6
+ * <packages>
7
+ * <package>
8
+ * <classes>
9
+ * <class filename="src/foo.py">
10
+ * <lines>
11
+ * <line number="1" hits="2"/>
12
+ * <line number="2" hits="0"/>
13
+ * </lines>
14
+ * </class>
15
+ *
16
+ * The phase uses `fast-xml-parser` (already a dep). We set
17
+ * `ignoreAttributes=false` so the `number`/`hits`/`filename` attributes are
18
+ * reachable via the attribute-prefix key (`@_`).
19
+ *
20
+ * Determinism: the parser returns a map, which the calling phase sorts
21
+ * before mutating the graph.
22
+ */
23
+ import { type FileCoverage } from "./types.js";
24
+ export declare function parseCobertura(raw: string, repoRoot: string): ReadonlyMap<string, FileCoverage>;
25
+ //# sourceMappingURL=cobertura.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cobertura.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/phases/coverage-parsers/cobertura.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAc,KAAK,YAAY,EAAS,MAAM,YAAY,CAAC;AAOlE,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CA6C/F"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Cobertura coverage.xml parser.
3
+ *
4
+ * Cobertura / Python coverage-xml reports nest per-file coverage under:
5
+ * <coverage>
6
+ * <packages>
7
+ * <package>
8
+ * <classes>
9
+ * <class filename="src/foo.py">
10
+ * <lines>
11
+ * <line number="1" hits="2"/>
12
+ * <line number="2" hits="0"/>
13
+ * </lines>
14
+ * </class>
15
+ *
16
+ * The phase uses `fast-xml-parser` (already a dep). We set
17
+ * `ignoreAttributes=false` so the `number`/`hits`/`filename` attributes are
18
+ * reachable via the attribute-prefix key (`@_`).
19
+ *
20
+ * Determinism: the parser returns a map, which the calling phase sorts
21
+ * before mutating the graph.
22
+ */
23
+ import { XMLParser } from "fast-xml-parser";
24
+ import { canonLines, ratio } from "./types.js";
25
+ export function parseCobertura(raw, repoRoot) {
26
+ const parser = new XMLParser({
27
+ ignoreAttributes: false,
28
+ attributeNamePrefix: "@_",
29
+ // Force singletons into arrays where we walk over them.
30
+ isArray: (name) => name === "package" ||
31
+ name === "class" ||
32
+ name === "line" ||
33
+ name === "packages" ||
34
+ name === "classes" ||
35
+ name === "lines",
36
+ });
37
+ let parsed;
38
+ try {
39
+ parsed = parser.parse(raw);
40
+ }
41
+ catch {
42
+ return new Map();
43
+ }
44
+ const classes = collectClasses(parsed);
45
+ const out = new Map();
46
+ for (const c of classes) {
47
+ const filename = c.filename;
48
+ if (filename === undefined || filename.length === 0)
49
+ continue;
50
+ const linesIn = c.lines ?? [];
51
+ if (linesIn.length === 0)
52
+ continue;
53
+ let covered = 0;
54
+ const coveredLines = [];
55
+ for (const line of linesIn) {
56
+ if (line.hits > 0) {
57
+ covered += 1;
58
+ coveredLines.push(line.line);
59
+ }
60
+ }
61
+ const total = linesIn.length;
62
+ const relPath = normalisePath(filename, repoRoot);
63
+ out.set(relPath, {
64
+ filePath: relPath,
65
+ coveredLines: canonLines(coveredLines),
66
+ totalLines: total,
67
+ coveragePercent: ratio(covered, total),
68
+ });
69
+ }
70
+ return out;
71
+ }
72
+ function collectClasses(parsed) {
73
+ const out = [];
74
+ const root = parsed?.coverage;
75
+ const packagesContainer = root?.packages;
76
+ if (!Array.isArray(packagesContainer))
77
+ return out;
78
+ // Each entry inside `packages[]` is itself an object that *may* nest a
79
+ // further `package` array (repeat container). Walk one more level so both
80
+ // shapes work.
81
+ for (const container of packagesContainer) {
82
+ const packages = container?.package;
83
+ if (!Array.isArray(packages))
84
+ continue;
85
+ for (const pkg of packages) {
86
+ const classesContainer = pkg?.classes;
87
+ if (!Array.isArray(classesContainer))
88
+ continue;
89
+ for (const cContainer of classesContainer) {
90
+ const classes = cContainer?.class;
91
+ if (!Array.isArray(classes))
92
+ continue;
93
+ for (const cls of classes) {
94
+ const filename = cls["@_filename"];
95
+ const linesContainer = cls?.lines;
96
+ const linesRaw = Array.isArray(linesContainer) && linesContainer.length > 0
97
+ ? (linesContainer[0]?.line ?? [])
98
+ : [];
99
+ const entries = [];
100
+ if (Array.isArray(linesRaw)) {
101
+ for (const lv of linesRaw) {
102
+ const rec = lv;
103
+ const lineNum = numberAttr(rec["@_number"]);
104
+ const hits = numberAttr(rec["@_hits"]);
105
+ if (lineNum === undefined || hits === undefined)
106
+ continue;
107
+ entries.push({ line: lineNum, hits });
108
+ }
109
+ }
110
+ out.push({
111
+ ...(typeof filename === "string" ? { filename } : {}),
112
+ lines: entries,
113
+ });
114
+ }
115
+ }
116
+ }
117
+ }
118
+ return out;
119
+ }
120
+ function numberAttr(v) {
121
+ if (typeof v === "number")
122
+ return Number.isFinite(v) ? v : undefined;
123
+ if (typeof v === "string") {
124
+ const n = Number.parseInt(v, 10);
125
+ return Number.isInteger(n) ? n : undefined;
126
+ }
127
+ return undefined;
128
+ }
129
+ function normalisePath(raw, repoRoot) {
130
+ const posix = raw.replace(/\\/g, "/");
131
+ if (!posix.startsWith("/"))
132
+ return posix;
133
+ const rootPosix = repoRoot.replace(/\\/g, "/");
134
+ const prefix = rootPosix.endsWith("/") ? rootPosix : `${rootPosix}/`;
135
+ if (posix.startsWith(prefix))
136
+ return posix.slice(prefix.length);
137
+ return posix;
138
+ }
139
+ //# sourceMappingURL=cobertura.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cobertura.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/coverage-parsers/cobertura.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * coverage.py JSON report parser.
3
+ *
4
+ * Shape emitted by `coverage json` (a.k.a. `coverage report --format=json`):
5
+ * {
6
+ * "files": {
7
+ * "src/foo.py": {
8
+ * "executed_lines": [1, 2, 3],
9
+ * "missing_lines": [7, 10],
10
+ * "summary": { "covered_lines": 3, "num_statements": 5, ... }
11
+ * }
12
+ * }
13
+ * }
14
+ *
15
+ * We key on `executed_lines` for the covered set and sum
16
+ * `executed_lines + missing_lines` to get the total. That matches coverage.py
17
+ * semantics more precisely than the `summary.num_statements` field, which
18
+ * excludes excluded-but-executable lines.
19
+ *
20
+ * Paths are already repo-relative POSIX in coverage.py output, so no
21
+ * rewriting is necessary.
22
+ */
23
+ import { type FileCoverage } from "./types.js";
24
+ export declare function parseCoveragePy(raw: string, _repoRoot: string): ReadonlyMap<string, FileCoverage>;
25
+ //# sourceMappingURL=coverage-py.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-py.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/phases/coverage-parsers/coverage-py.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAc,KAAK,YAAY,EAAS,MAAM,YAAY,CAAC;AAWlE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAwBjG"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * coverage.py JSON report parser.
3
+ *
4
+ * Shape emitted by `coverage json` (a.k.a. `coverage report --format=json`):
5
+ * {
6
+ * "files": {
7
+ * "src/foo.py": {
8
+ * "executed_lines": [1, 2, 3],
9
+ * "missing_lines": [7, 10],
10
+ * "summary": { "covered_lines": 3, "num_statements": 5, ... }
11
+ * }
12
+ * }
13
+ * }
14
+ *
15
+ * We key on `executed_lines` for the covered set and sum
16
+ * `executed_lines + missing_lines` to get the total. That matches coverage.py
17
+ * semantics more precisely than the `summary.num_statements` field, which
18
+ * excludes excluded-but-executable lines.
19
+ *
20
+ * Paths are already repo-relative POSIX in coverage.py output, so no
21
+ * rewriting is necessary.
22
+ */
23
+ import { canonLines, ratio } from "./types.js";
24
+ export function parseCoveragePy(raw, _repoRoot) {
25
+ const out = new Map();
26
+ let parsed;
27
+ try {
28
+ parsed = JSON.parse(raw);
29
+ }
30
+ catch {
31
+ return out;
32
+ }
33
+ const files = parsed?.files;
34
+ if (files === undefined || typeof files !== "object")
35
+ return out;
36
+ for (const [path, rec] of Object.entries(files)) {
37
+ const executed = Array.isArray(rec?.executed_lines) ? rec.executed_lines : [];
38
+ const missing = Array.isArray(rec?.missing_lines) ? rec.missing_lines : [];
39
+ const total = executed.length + missing.length;
40
+ if (total === 0)
41
+ continue;
42
+ out.set(path, {
43
+ filePath: path,
44
+ coveredLines: canonLines(executed),
45
+ totalLines: total,
46
+ coveragePercent: ratio(executed.length, total),
47
+ });
48
+ }
49
+ return out;
50
+ }
51
+ //# sourceMappingURL=coverage-py.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-py.js","sourceRoot":"","sources":["../../../../src/pipeline/phases/coverage-parsers/coverage-py.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAqB,KAAK,EAAE,MAAM,YAAY,CAAC;AAWlE,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,SAAiB;IAC5D,MAAM,GAAG,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC5C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;IACD,MAAM,KAAK,GAAI,MAAsB,EAAE,KAAK,CAAC;IAC7C,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IAEjE,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC/C,IAAI,KAAK,KAAK,CAAC;YAAE,SAAS;QAC1B,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;YACZ,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,UAAU,CAAC,QAAQ,CAAC;YAClC,UAAU,EAAE,KAAK;YACjB,eAAe,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;SAC/C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * JaCoCo XML parser.
3
+ *
4
+ * JaCoCo's XML report tree:
5
+ * <report>
6
+ * <package name="com/foo">
7
+ * <sourcefile name="Bar.java">
8
+ * <line nr="12" mi="0" ci="3" mb="0" cb="0"/>
9
+ * ...
10
+ * </sourcefile>
11
+ *
12
+ * Per the JaCoCo DTD, `mi` is missed-instructions, `ci` is covered-
13
+ * instructions. We treat a line as covered when `ci > 0`. Total is the
14
+ * count of `<line>` elements for the sourcefile.
15
+ *
16
+ * Path assembly: the JaCoCo `name` attribute on `<package>` is slash-joined
17
+ * (e.g. `com/foo`), and the `<sourcefile>` name is the basename. We join
18
+ * them into a single POSIX path for graph matching. Callers may additionally
19
+ * set a project-source-root prefix via `options.sourceRoot` so the returned
20
+ * path aligns with the scan output.
21
+ */
22
+ import { type FileCoverage } from "./types.js";
23
+ export interface JacocoOptions {
24
+ /**
25
+ * Optional repo-relative prefix to prepend when assembling the source path
26
+ * (e.g. `src/main/java`). Defaults to the empty string because JaCoCo's
27
+ * report layout varies by build tool.
28
+ */
29
+ readonly sourceRoot?: string;
30
+ }
31
+ export declare function parseJacoco(raw: string, _repoRoot: string, options?: JacocoOptions): ReadonlyMap<string, FileCoverage>;
32
+ //# sourceMappingURL=jacoco.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jacoco.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/phases/coverage-parsers/jacoco.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAc,KAAK,YAAY,EAAS,MAAM,YAAY,CAAC;AAElE,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,aAAkB,GAC1B,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAwDnC"}