cgraphx 2.0.2 → 2.0.3

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 (680) hide show
  1. package/dist/core/code/engine/cli/analyze-config.js +320 -0
  2. package/dist/core/code/engine/cli/analyze.js +1086 -0
  3. package/dist/core/code/engine/cli/cli-message.js +83 -0
  4. package/dist/core/code/engine/cli/detect-changes-format.js +58 -0
  5. package/dist/core/code/engine/cli/embedding-dims.js +43 -0
  6. package/dist/core/code/engine/cli/format-elapsed.js +12 -0
  7. package/dist/core/code/engine/cli/help-i18n.js +144 -0
  8. package/dist/core/code/engine/cli/i18n/en.js +110 -0
  9. package/dist/core/code/engine/cli/i18n/index.js +47 -0
  10. package/dist/core/code/engine/cli/i18n/resources.js +9 -0
  11. package/dist/core/code/engine/cli/i18n/zh-CN.js +110 -0
  12. package/dist/core/code/engine/cli/lazy-action.js +67 -0
  13. package/dist/core/code/engine/cli/optional-grammars.js +136 -0
  14. package/dist/core/code/engine/cli/resolve-invocation.js +76 -0
  15. package/dist/core/code/engine/cli/status.js +156 -0
  16. package/dist/core/code/engine/cli/tool.js +384 -0
  17. package/dist/core/code/engine/config/ignore-service.js +511 -0
  18. package/dist/core/code/engine/config/supported-languages.js +17 -0
  19. package/dist/core/code/engine/core/analysis-features.js +64 -0
  20. package/dist/core/code/engine/core/analyzer-identity.js +2171 -0
  21. package/dist/core/code/engine/core/git-staleness.js +180 -0
  22. package/dist/core/code/engine/core/graph/graph.js +180 -0
  23. package/dist/core/code/engine/core/graph/import-cycles.js +106 -0
  24. package/dist/core/code/engine/core/graph/types.js +2 -0
  25. package/dist/core/code/engine/core/index-freshness.js +12 -0
  26. package/dist/core/code/engine/core/ingestion/binding-accumulator.js +341 -0
  27. package/dist/core/code/engine/core/ingestion/call-extractors/configs/c-cpp.js +168 -0
  28. package/dist/core/code/engine/core/ingestion/call-extractors/configs/csharp.js +9 -0
  29. package/dist/core/code/engine/core/ingestion/call-extractors/configs/dart.js +8 -0
  30. package/dist/core/code/engine/core/ingestion/call-extractors/configs/go.js +8 -0
  31. package/dist/core/code/engine/core/ingestion/call-extractors/configs/jvm.js +54 -0
  32. package/dist/core/code/engine/core/ingestion/call-extractors/configs/php.js +8 -0
  33. package/dist/core/code/engine/core/ingestion/call-extractors/configs/python.js +8 -0
  34. package/dist/core/code/engine/core/ingestion/call-extractors/configs/ruby.js +8 -0
  35. package/dist/core/code/engine/core/ingestion/call-extractors/configs/rust.js +8 -0
  36. package/dist/core/code/engine/core/ingestion/call-extractors/configs/swift.js +8 -0
  37. package/dist/core/code/engine/core/ingestion/call-extractors/configs/typescript-javascript.js +11 -0
  38. package/dist/core/code/engine/core/ingestion/call-extractors/generic.js +62 -0
  39. package/dist/core/code/engine/core/ingestion/call-processor.js +503 -0
  40. package/dist/core/code/engine/core/ingestion/call-routing.js +98 -0
  41. package/dist/core/code/engine/core/ingestion/call-types.js +3 -0
  42. package/dist/core/code/engine/core/ingestion/cfg/callee-cell-format.js +45 -0
  43. package/dist/core/code/engine/core/ingestion/cfg/cfg-builder.js +202 -0
  44. package/dist/core/code/engine/core/ingestion/cfg/collect.js +81 -0
  45. package/dist/core/code/engine/core/ingestion/cfg/control-dependence.js +185 -0
  46. package/dist/core/code/engine/core/ingestion/cfg/control-flow-context.js +130 -0
  47. package/dist/core/code/engine/core/ingestion/cfg/emit.js +646 -0
  48. package/dist/core/code/engine/core/ingestion/cfg/post-dominators.js +182 -0
  49. package/dist/core/code/engine/core/ingestion/cfg/reaching-def-reason-codec.js +139 -0
  50. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs-graph.js +322 -0
  51. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs.js +792 -0
  52. package/dist/core/code/engine/core/ingestion/cfg/synthetic-escape.js +305 -0
  53. package/dist/core/code/engine/core/ingestion/cfg/traversal-result.js +6 -0
  54. package/dist/core/code/engine/core/ingestion/cfg/types.js +14 -0
  55. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp-harvest.js +545 -0
  56. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp.js +590 -0
  57. package/dist/core/code/engine/core/ingestion/cfg/visitors/call-site-harvest.js +356 -0
  58. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp-harvest.js +593 -0
  59. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp.js +871 -0
  60. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart-harvest.js +874 -0
  61. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart.js +840 -0
  62. package/dist/core/code/engine/core/ingestion/cfg/visitors/go-harvest.js +625 -0
  63. package/dist/core/code/engine/core/ingestion/cfg/visitors/go.js +642 -0
  64. package/dist/core/code/engine/core/ingestion/cfg/visitors/java-harvest.js +517 -0
  65. package/dist/core/code/engine/core/ingestion/cfg/visitors/java.js +816 -0
  66. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin-harvest.js +723 -0
  67. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin.js +813 -0
  68. package/dist/core/code/engine/core/ingestion/cfg/visitors/php-harvest.js +630 -0
  69. package/dist/core/code/engine/core/ingestion/cfg/visitors/php.js +725 -0
  70. package/dist/core/code/engine/core/ingestion/cfg/visitors/python-harvest.js +776 -0
  71. package/dist/core/code/engine/core/ingestion/cfg/visitors/python.js +562 -0
  72. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby-harvest.js +591 -0
  73. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby.js +760 -0
  74. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust-harvest.js +877 -0
  75. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust.js +562 -0
  76. package/dist/core/code/engine/core/ingestion/cfg/visitors/scope-tree-harvest.js +120 -0
  77. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift-harvest.js +683 -0
  78. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift.js +791 -0
  79. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript-harvest.js +1060 -0
  80. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript.js +587 -0
  81. package/dist/core/code/engine/core/ingestion/class-extractors/configs/c-cpp.js +77 -0
  82. package/dist/core/code/engine/core/ingestion/class-extractors/configs/csharp.js +24 -0
  83. package/dist/core/code/engine/core/ingestion/class-extractors/configs/dart.js +10 -0
  84. package/dist/core/code/engine/core/ingestion/class-extractors/configs/go.js +28 -0
  85. package/dist/core/code/engine/core/ingestion/class-extractors/configs/jvm.js +67 -0
  86. package/dist/core/code/engine/core/ingestion/class-extractors/configs/php.js +10 -0
  87. package/dist/core/code/engine/core/ingestion/class-extractors/configs/python.js +10 -0
  88. package/dist/core/code/engine/core/ingestion/class-extractors/configs/ruby.js +13 -0
  89. package/dist/core/code/engine/core/ingestion/class-extractors/configs/rust.js +10 -0
  90. package/dist/core/code/engine/core/ingestion/class-extractors/configs/swift.js +21 -0
  91. package/dist/core/code/engine/core/ingestion/class-extractors/configs/typescript-javascript.js +31 -0
  92. package/dist/core/code/engine/core/ingestion/class-extractors/generic.js +144 -0
  93. package/dist/core/code/engine/core/ingestion/class-types.js +2 -0
  94. package/dist/core/code/engine/core/ingestion/cluster-enricher.js +174 -0
  95. package/dist/core/code/engine/core/ingestion/community-processor.js +604 -0
  96. package/dist/core/code/engine/core/ingestion/constants.js +26 -0
  97. package/dist/core/code/engine/core/ingestion/cpp-ue-preprocessor.js +263 -0
  98. package/dist/core/code/engine/core/ingestion/csharp-namespace-gate.js +133 -0
  99. package/dist/core/code/engine/core/ingestion/di-extractors/index.js +38 -0
  100. package/dist/core/code/engine/core/ingestion/di-extractors/spring.js +310 -0
  101. package/dist/core/code/engine/core/ingestion/emit-references.js +244 -0
  102. package/dist/core/code/engine/core/ingestion/entry-point-scoring.js +201 -0
  103. package/dist/core/code/engine/core/ingestion/export-detection.js +244 -0
  104. package/dist/core/code/engine/core/ingestion/field-extractor.js +29 -0
  105. package/dist/core/code/engine/core/ingestion/field-extractors/configs/c-cpp.js +107 -0
  106. package/dist/core/code/engine/core/ingestion/field-extractors/configs/csharp.js +124 -0
  107. package/dist/core/code/engine/core/ingestion/field-extractors/configs/dart.js +99 -0
  108. package/dist/core/code/engine/core/ingestion/field-extractors/configs/go.js +102 -0
  109. package/dist/core/code/engine/core/ingestion/field-extractors/configs/helpers.js +198 -0
  110. package/dist/core/code/engine/core/ingestion/field-extractors/configs/jvm.js +172 -0
  111. package/dist/core/code/engine/core/ingestion/field-extractors/configs/php.js +67 -0
  112. package/dist/core/code/engine/core/ingestion/field-extractors/configs/python.js +94 -0
  113. package/dist/core/code/engine/core/ingestion/field-extractors/configs/ruby.js +79 -0
  114. package/dist/core/code/engine/core/ingestion/field-extractors/configs/rust.js +55 -0
  115. package/dist/core/code/engine/core/ingestion/field-extractors/configs/swift.js +93 -0
  116. package/dist/core/code/engine/core/ingestion/field-extractors/configs/typescript-javascript.js +59 -0
  117. package/dist/core/code/engine/core/ingestion/field-extractors/generic.js +147 -0
  118. package/dist/core/code/engine/core/ingestion/field-extractors/typescript.js +266 -0
  119. package/dist/core/code/engine/core/ingestion/field-types.js +3 -0
  120. package/dist/core/code/engine/core/ingestion/filesystem-walker.js +136 -0
  121. package/dist/core/code/engine/core/ingestion/finalize-orchestrator.js +159 -0
  122. package/dist/core/code/engine/core/ingestion/framework-detection.js +432 -0
  123. package/dist/core/code/engine/core/ingestion/frameworks/spring/analysis-features.js +38 -0
  124. package/dist/core/code/engine/core/ingestion/frameworks/spring/annotation-arguments.js +234 -0
  125. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop-candidates.js +88 -0
  126. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop.js +487 -0
  127. package/dist/core/code/engine/core/ingestion/frameworks/spring/auto-configuration.js +21 -0
  128. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-candidates.js +189 -0
  129. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-catalog.js +32 -0
  130. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-factories.js +73 -0
  131. package/dist/core/code/engine/core/ingestion/frameworks/spring/conditionals.js +323 -0
  132. package/dist/core/code/engine/core/ingestion/frameworks/spring/config-bindings.js +119 -0
  133. package/dist/core/code/engine/core/ingestion/frameworks/spring/di-metadata.js +385 -0
  134. package/dist/core/code/engine/core/ingestion/frameworks/spring/resource-injection.js +96 -0
  135. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/c-cpp.js +17 -0
  136. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/csharp.js +46 -0
  137. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/dart.js +59 -0
  138. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/go.js +30 -0
  139. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/jvm.js +73 -0
  140. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/php.js +19 -0
  141. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/python.js +45 -0
  142. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/ruby.js +20 -0
  143. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/rust.js +58 -0
  144. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/swift.js +94 -0
  145. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/typescript-javascript.js +26 -0
  146. package/dist/core/code/engine/core/ingestion/import-resolvers/csharp.js +128 -0
  147. package/dist/core/code/engine/core/ingestion/import-resolvers/go.js +50 -0
  148. package/dist/core/code/engine/core/ingestion/import-resolvers/jvm.js +112 -0
  149. package/dist/core/code/engine/core/ingestion/import-resolvers/php.js +80 -0
  150. package/dist/core/code/engine/core/ingestion/import-resolvers/python.js +75 -0
  151. package/dist/core/code/engine/core/ingestion/import-resolvers/resolver-factory.js +36 -0
  152. package/dist/core/code/engine/core/ingestion/import-resolvers/ruby.js +20 -0
  153. package/dist/core/code/engine/core/ingestion/import-resolvers/rust.js +79 -0
  154. package/dist/core/code/engine/core/ingestion/import-resolvers/standard.js +180 -0
  155. package/dist/core/code/engine/core/ingestion/import-resolvers/types.js +7 -0
  156. package/dist/core/code/engine/core/ingestion/import-resolvers/utils.js +153 -0
  157. package/dist/core/code/engine/core/ingestion/import-target-adapter.js +99 -0
  158. package/dist/core/code/engine/core/ingestion/language-config.js +391 -0
  159. package/dist/core/code/engine/core/ingestion/language-provider.js +25 -0
  160. package/dist/core/code/engine/core/ingestion/languages/c/arity-metadata.js +98 -0
  161. package/dist/core/code/engine/core/ingestion/languages/c/arity.js +21 -0
  162. package/dist/core/code/engine/core/ingestion/languages/c/capture-side-channel.js +69 -0
  163. package/dist/core/code/engine/core/ingestion/languages/c/captures.js +189 -0
  164. package/dist/core/code/engine/core/ingestion/languages/c/header-scan.js +58 -0
  165. package/dist/core/code/engine/core/ingestion/languages/c/import-decomposer.js +68 -0
  166. package/dist/core/code/engine/core/ingestion/languages/c/import-target.js +103 -0
  167. package/dist/core/code/engine/core/ingestion/languages/c/index.js +33 -0
  168. package/dist/core/code/engine/core/ingestion/languages/c/interpret.js +53 -0
  169. package/dist/core/code/engine/core/ingestion/languages/c/merge-bindings.js +26 -0
  170. package/dist/core/code/engine/core/ingestion/languages/c/query.js +210 -0
  171. package/dist/core/code/engine/core/ingestion/languages/c/scope-resolver.js +112 -0
  172. package/dist/core/code/engine/core/ingestion/languages/c/simple-hooks.js +24 -0
  173. package/dist/core/code/engine/core/ingestion/languages/c/static-linkage.js +109 -0
  174. package/dist/core/code/engine/core/ingestion/languages/c-cpp.js +506 -0
  175. package/dist/core/code/engine/core/ingestion/languages/cpp/adl.js +804 -0
  176. package/dist/core/code/engine/core/ingestion/languages/cpp/arity-metadata.js +258 -0
  177. package/dist/core/code/engine/core/ingestion/languages/cpp/arity.js +37 -0
  178. package/dist/core/code/engine/core/ingestion/languages/cpp/capture-side-channel.js +89 -0
  179. package/dist/core/code/engine/core/ingestion/languages/cpp/captures.js +1975 -0
  180. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-extractor.js +311 -0
  181. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-filter.js +210 -0
  182. package/dist/core/code/engine/core/ingestion/languages/cpp/conversion-rank.js +163 -0
  183. package/dist/core/code/engine/core/ingestion/languages/cpp/file-local-linkage.js +327 -0
  184. package/dist/core/code/engine/core/ingestion/languages/cpp/header-scan.js +53 -0
  185. package/dist/core/code/engine/core/ingestion/languages/cpp/import-decomposer.js +134 -0
  186. package/dist/core/code/engine/core/ingestion/languages/cpp/import-target.js +16 -0
  187. package/dist/core/code/engine/core/ingestion/languages/cpp/index.js +33 -0
  188. package/dist/core/code/engine/core/ingestion/languages/cpp/inline-namespaces.js +379 -0
  189. package/dist/core/code/engine/core/ingestion/languages/cpp/interpret.js +239 -0
  190. package/dist/core/code/engine/core/ingestion/languages/cpp/member-lookup.js +470 -0
  191. package/dist/core/code/engine/core/ingestion/languages/cpp/merge-bindings.js +32 -0
  192. package/dist/core/code/engine/core/ingestion/languages/cpp/query.js +763 -0
  193. package/dist/core/code/engine/core/ingestion/languages/cpp/range-bindings.js +230 -0
  194. package/dist/core/code/engine/core/ingestion/languages/cpp/scope-resolver.js +354 -0
  195. package/dist/core/code/engine/core/ingestion/languages/cpp/simple-hooks.js +67 -0
  196. package/dist/core/code/engine/core/ingestion/languages/cpp/two-phase-lookup.js +348 -0
  197. package/dist/core/code/engine/core/ingestion/languages/cpp/type-classifier.js +56 -0
  198. package/dist/core/code/engine/core/ingestion/languages/cpp/user-defined-conversions.js +128 -0
  199. package/dist/core/code/engine/core/ingestion/languages/csharp/accessor-unwrap.js +67 -0
  200. package/dist/core/code/engine/core/ingestion/languages/csharp/arity-metadata.js +49 -0
  201. package/dist/core/code/engine/core/ingestion/languages/csharp/arity.js +40 -0
  202. package/dist/core/code/engine/core/ingestion/languages/csharp/cache-stats.js +32 -0
  203. package/dist/core/code/engine/core/ingestion/languages/csharp/captures.js +557 -0
  204. package/dist/core/code/engine/core/ingestion/languages/csharp/import-decomposer.js +96 -0
  205. package/dist/core/code/engine/core/ingestion/languages/csharp/import-target.js +176 -0
  206. package/dist/core/code/engine/core/ingestion/languages/csharp/index.js +95 -0
  207. package/dist/core/code/engine/core/ingestion/languages/csharp/interpret.js +150 -0
  208. package/dist/core/code/engine/core/ingestion/languages/csharp/merge-bindings.js +58 -0
  209. package/dist/core/code/engine/core/ingestion/languages/csharp/namespace-siblings.js +708 -0
  210. package/dist/core/code/engine/core/ingestion/languages/csharp/qualified-type-names.js +62 -0
  211. package/dist/core/code/engine/core/ingestion/languages/csharp/query.js +578 -0
  212. package/dist/core/code/engine/core/ingestion/languages/csharp/receiver-binding.js +142 -0
  213. package/dist/core/code/engine/core/ingestion/languages/csharp/resolution-config.js +18 -0
  214. package/dist/core/code/engine/core/ingestion/languages/csharp/scope-resolver.js +84 -0
  215. package/dist/core/code/engine/core/ingestion/languages/csharp/simple-hooks.js +81 -0
  216. package/dist/core/code/engine/core/ingestion/languages/csharp.js +204 -0
  217. package/dist/core/code/engine/core/ingestion/languages/dart/arity-metadata.js +38 -0
  218. package/dist/core/code/engine/core/ingestion/languages/dart/arity.js +34 -0
  219. package/dist/core/code/engine/core/ingestion/languages/dart/built-ins.js +37 -0
  220. package/dist/core/code/engine/core/ingestion/languages/dart/cache-stats.js +30 -0
  221. package/dist/core/code/engine/core/ingestion/languages/dart/captures.js +1096 -0
  222. package/dist/core/code/engine/core/ingestion/languages/dart/expand-wildcards.js +34 -0
  223. package/dist/core/code/engine/core/ingestion/languages/dart/extension-type-preprocess.js +33 -0
  224. package/dist/core/code/engine/core/ingestion/languages/dart/import-target.js +68 -0
  225. package/dist/core/code/engine/core/ingestion/languages/dart/index.js +45 -0
  226. package/dist/core/code/engine/core/ingestion/languages/dart/interpret.js +101 -0
  227. package/dist/core/code/engine/core/ingestion/languages/dart/merge-bindings.js +42 -0
  228. package/dist/core/code/engine/core/ingestion/languages/dart/query.js +246 -0
  229. package/dist/core/code/engine/core/ingestion/languages/dart/receiver-binding.js +90 -0
  230. package/dist/core/code/engine/core/ingestion/languages/dart/scope-resolver.js +197 -0
  231. package/dist/core/code/engine/core/ingestion/languages/dart/signature-bindings.js +54 -0
  232. package/dist/core/code/engine/core/ingestion/languages/dart/simple-hooks.js +61 -0
  233. package/dist/core/code/engine/core/ingestion/languages/dart.js +138 -0
  234. package/dist/core/code/engine/core/ingestion/languages/go/arity-metadata.js +71 -0
  235. package/dist/core/code/engine/core/ingestion/languages/go/arity.js +17 -0
  236. package/dist/core/code/engine/core/ingestion/languages/go/cache-stats.js +21 -0
  237. package/dist/core/code/engine/core/ingestion/languages/go/captures.js +492 -0
  238. package/dist/core/code/engine/core/ingestion/languages/go/expand-wildcards.js +97 -0
  239. package/dist/core/code/engine/core/ingestion/languages/go/generic-type-parameters.js +146 -0
  240. package/dist/core/code/engine/core/ingestion/languages/go/import-decomposer.js +47 -0
  241. package/dist/core/code/engine/core/ingestion/languages/go/import-target.js +70 -0
  242. package/dist/core/code/engine/core/ingestion/languages/go/index.js +39 -0
  243. package/dist/core/code/engine/core/ingestion/languages/go/interface-impls.js +955 -0
  244. package/dist/core/code/engine/core/ingestion/languages/go/interpret.js +177 -0
  245. package/dist/core/code/engine/core/ingestion/languages/go/merge-bindings.js +21 -0
  246. package/dist/core/code/engine/core/ingestion/languages/go/method-owners.js +131 -0
  247. package/dist/core/code/engine/core/ingestion/languages/go/namespace-mirror.js +56 -0
  248. package/dist/core/code/engine/core/ingestion/languages/go/package-clause.js +79 -0
  249. package/dist/core/code/engine/core/ingestion/languages/go/package-siblings.js +83 -0
  250. package/dist/core/code/engine/core/ingestion/languages/go/query.js +298 -0
  251. package/dist/core/code/engine/core/ingestion/languages/go/range-binding.js +127 -0
  252. package/dist/core/code/engine/core/ingestion/languages/go/receiver-binding.js +24 -0
  253. package/dist/core/code/engine/core/ingestion/languages/go/scope-resolver.js +75 -0
  254. package/dist/core/code/engine/core/ingestion/languages/go/simple-hooks.js +31 -0
  255. package/dist/core/code/engine/core/ingestion/languages/go/type-binding.js +279 -0
  256. package/dist/core/code/engine/core/ingestion/languages/go.js +160 -0
  257. package/dist/core/code/engine/core/ingestion/languages/index.js +66 -0
  258. package/dist/core/code/engine/core/ingestion/languages/java/analysis-features.js +16 -0
  259. package/dist/core/code/engine/core/ingestion/languages/java/arity-metadata.js +43 -0
  260. package/dist/core/code/engine/core/ingestion/languages/java/arity.js +27 -0
  261. package/dist/core/code/engine/core/ingestion/languages/java/cache-stats.js +32 -0
  262. package/dist/core/code/engine/core/ingestion/languages/java/capture-side-channel.js +123 -0
  263. package/dist/core/code/engine/core/ingestion/languages/java/captures.js +791 -0
  264. package/dist/core/code/engine/core/ingestion/languages/java/import-decomposer.js +88 -0
  265. package/dist/core/code/engine/core/ingestion/languages/java/import-target.js +103 -0
  266. package/dist/core/code/engine/core/ingestion/languages/java/index.js +43 -0
  267. package/dist/core/code/engine/core/ingestion/languages/java/interpret.js +146 -0
  268. package/dist/core/code/engine/core/ingestion/languages/java/merge-bindings.js +43 -0
  269. package/dist/core/code/engine/core/ingestion/languages/java/package-facts.js +16 -0
  270. package/dist/core/code/engine/core/ingestion/languages/java/package-siblings.js +11 -0
  271. package/dist/core/code/engine/core/ingestion/languages/java/query.js +319 -0
  272. package/dist/core/code/engine/core/ingestion/languages/java/receiver-binding.js +98 -0
  273. package/dist/core/code/engine/core/ingestion/languages/java/scope-resolver.js +213 -0
  274. package/dist/core/code/engine/core/ingestion/languages/java/simple-hooks.js +39 -0
  275. package/dist/core/code/engine/core/ingestion/languages/java/spring-aop.js +53 -0
  276. package/dist/core/code/engine/core/ingestion/languages/java/spring-bean-metadata.js +11 -0
  277. package/dist/core/code/engine/core/ingestion/languages/java/spring-conditionals.js +52 -0
  278. package/dist/core/code/engine/core/ingestion/languages/java/spring-config-bindings.js +222 -0
  279. package/dist/core/code/engine/core/ingestion/languages/java/spring-di.js +165 -0
  280. package/dist/core/code/engine/core/ingestion/languages/java.js +192 -0
  281. package/dist/core/code/engine/core/ingestion/languages/javascript/arity.js +15 -0
  282. package/dist/core/code/engine/core/ingestion/languages/javascript/captures.js +1122 -0
  283. package/dist/core/code/engine/core/ingestion/languages/javascript/import-target.js +56 -0
  284. package/dist/core/code/engine/core/ingestion/languages/javascript/index.js +109 -0
  285. package/dist/core/code/engine/core/ingestion/languages/javascript/interpret.js +45 -0
  286. package/dist/core/code/engine/core/ingestion/languages/javascript/merge-bindings.js +21 -0
  287. package/dist/core/code/engine/core/ingestion/languages/javascript/query.js +659 -0
  288. package/dist/core/code/engine/core/ingestion/languages/javascript/scope-resolver.js +78 -0
  289. package/dist/core/code/engine/core/ingestion/languages/javascript/simple-hooks.js +44 -0
  290. package/dist/core/code/engine/core/ingestion/languages/jvm/package-facts.js +46 -0
  291. package/dist/core/code/engine/core/ingestion/languages/jvm/package-siblings.js +200 -0
  292. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity-metadata.js +23 -0
  293. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity.js +18 -0
  294. package/dist/core/code/engine/core/ingestion/languages/kotlin/cache-stats.js +21 -0
  295. package/dist/core/code/engine/core/ingestion/languages/kotlin/capture-side-channel.js +160 -0
  296. package/dist/core/code/engine/core/ingestion/languages/kotlin/captures.js +1262 -0
  297. package/dist/core/code/engine/core/ingestion/languages/kotlin/companion-scopes.js +72 -0
  298. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-decomposer.js +40 -0
  299. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-target.js +135 -0
  300. package/dist/core/code/engine/core/ingestion/languages/kotlin/index.js +26 -0
  301. package/dist/core/code/engine/core/ingestion/languages/kotlin/interpret.js +75 -0
  302. package/dist/core/code/engine/core/ingestion/languages/kotlin/merge-bindings.js +28 -0
  303. package/dist/core/code/engine/core/ingestion/languages/kotlin/owners.js +134 -0
  304. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-facts.js +16 -0
  305. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-siblings.js +11 -0
  306. package/dist/core/code/engine/core/ingestion/languages/kotlin/query.js +243 -0
  307. package/dist/core/code/engine/core/ingestion/languages/kotlin/receiver-binding.js +103 -0
  308. package/dist/core/code/engine/core/ingestion/languages/kotlin/scope-resolver.js +207 -0
  309. package/dist/core/code/engine/core/ingestion/languages/kotlin/simple-hooks.js +42 -0
  310. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-aop.js +68 -0
  311. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-bean-metadata.js +11 -0
  312. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-conditionals.js +53 -0
  313. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-di.js +304 -0
  314. package/dist/core/code/engine/core/ingestion/languages/kotlin.js +189 -0
  315. package/dist/core/code/engine/core/ingestion/languages/php/arity-metadata.js +66 -0
  316. package/dist/core/code/engine/core/ingestion/languages/php/arity.js +43 -0
  317. package/dist/core/code/engine/core/ingestion/languages/php/cache-stats.js +32 -0
  318. package/dist/core/code/engine/core/ingestion/languages/php/captures.js +1166 -0
  319. package/dist/core/code/engine/core/ingestion/languages/php/import-decomposer.js +238 -0
  320. package/dist/core/code/engine/core/ingestion/languages/php/import-target.js +213 -0
  321. package/dist/core/code/engine/core/ingestion/languages/php/index.js +85 -0
  322. package/dist/core/code/engine/core/ingestion/languages/php/interpret.js +256 -0
  323. package/dist/core/code/engine/core/ingestion/languages/php/merge-bindings.js +50 -0
  324. package/dist/core/code/engine/core/ingestion/languages/php/namespace-siblings.js +353 -0
  325. package/dist/core/code/engine/core/ingestion/languages/php/query.js +391 -0
  326. package/dist/core/code/engine/core/ingestion/languages/php/receiver-binding.js +135 -0
  327. package/dist/core/code/engine/core/ingestion/languages/php/scope-resolver.js +361 -0
  328. package/dist/core/code/engine/core/ingestion/languages/php/simple-hooks.js +116 -0
  329. package/dist/core/code/engine/core/ingestion/languages/php.js +302 -0
  330. package/dist/core/code/engine/core/ingestion/languages/python/arity-metadata.js +49 -0
  331. package/dist/core/code/engine/core/ingestion/languages/python/arity.js +41 -0
  332. package/dist/core/code/engine/core/ingestion/languages/python/cache-stats.js +34 -0
  333. package/dist/core/code/engine/core/ingestion/languages/python/captures.js +299 -0
  334. package/dist/core/code/engine/core/ingestion/languages/python/depends-references.js +68 -0
  335. package/dist/core/code/engine/core/ingestion/languages/python/import-decomposer.js +115 -0
  336. package/dist/core/code/engine/core/ingestion/languages/python/import-target.js +440 -0
  337. package/dist/core/code/engine/core/ingestion/languages/python/index-stats.js +30 -0
  338. package/dist/core/code/engine/core/ingestion/languages/python/index.js +96 -0
  339. package/dist/core/code/engine/core/ingestion/languages/python/interpret.js +430 -0
  340. package/dist/core/code/engine/core/ingestion/languages/python/merge-bindings.js +47 -0
  341. package/dist/core/code/engine/core/ingestion/languages/python/query.js +323 -0
  342. package/dist/core/code/engine/core/ingestion/languages/python/receiver-binding.js +310 -0
  343. package/dist/core/code/engine/core/ingestion/languages/python/scope-resolver.js +80 -0
  344. package/dist/core/code/engine/core/ingestion/languages/python/simple-hooks.js +53 -0
  345. package/dist/core/code/engine/core/ingestion/languages/python.js +140 -0
  346. package/dist/core/code/engine/core/ingestion/languages/ruby/arity.js +41 -0
  347. package/dist/core/code/engine/core/ingestion/languages/ruby/cache-stats.js +21 -0
  348. package/dist/core/code/engine/core/ingestion/languages/ruby/captures.js +864 -0
  349. package/dist/core/code/engine/core/ingestion/languages/ruby/import-target.js +88 -0
  350. package/dist/core/code/engine/core/ingestion/languages/ruby/index.js +29 -0
  351. package/dist/core/code/engine/core/ingestion/languages/ruby/interpret.js +115 -0
  352. package/dist/core/code/engine/core/ingestion/languages/ruby/merge-bindings.js +21 -0
  353. package/dist/core/code/engine/core/ingestion/languages/ruby/query.js +349 -0
  354. package/dist/core/code/engine/core/ingestion/languages/ruby/receiver-binding.js +70 -0
  355. package/dist/core/code/engine/core/ingestion/languages/ruby/scope-resolver.js +263 -0
  356. package/dist/core/code/engine/core/ingestion/languages/ruby/simple-hooks.js +68 -0
  357. package/dist/core/code/engine/core/ingestion/languages/ruby.js +215 -0
  358. package/dist/core/code/engine/core/ingestion/languages/rust/arity.js +16 -0
  359. package/dist/core/code/engine/core/ingestion/languages/rust/cache-stats.js +21 -0
  360. package/dist/core/code/engine/core/ingestion/languages/rust/captures.js +304 -0
  361. package/dist/core/code/engine/core/ingestion/languages/rust/import-decomposer.js +167 -0
  362. package/dist/core/code/engine/core/ingestion/languages/rust/import-target.js +108 -0
  363. package/dist/core/code/engine/core/ingestion/languages/rust/index.js +29 -0
  364. package/dist/core/code/engine/core/ingestion/languages/rust/interpret.js +201 -0
  365. package/dist/core/code/engine/core/ingestion/languages/rust/merge-bindings.js +21 -0
  366. package/dist/core/code/engine/core/ingestion/languages/rust/method-owners.js +76 -0
  367. package/dist/core/code/engine/core/ingestion/languages/rust/module-path.js +222 -0
  368. package/dist/core/code/engine/core/ingestion/languages/rust/qualified-call.js +482 -0
  369. package/dist/core/code/engine/core/ingestion/languages/rust/query.js +280 -0
  370. package/dist/core/code/engine/core/ingestion/languages/rust/range-binding.js +687 -0
  371. package/dist/core/code/engine/core/ingestion/languages/rust/receiver-binding.js +148 -0
  372. package/dist/core/code/engine/core/ingestion/languages/rust/scope-resolver.js +151 -0
  373. package/dist/core/code/engine/core/ingestion/languages/rust/simple-hooks.js +32 -0
  374. package/dist/core/code/engine/core/ingestion/languages/rust.js +183 -0
  375. package/dist/core/code/engine/core/ingestion/languages/swift/arity-metadata.js +44 -0
  376. package/dist/core/code/engine/core/ingestion/languages/swift/arity.js +45 -0
  377. package/dist/core/code/engine/core/ingestion/languages/swift/base-type.js +30 -0
  378. package/dist/core/code/engine/core/ingestion/languages/swift/cache-stats.js +32 -0
  379. package/dist/core/code/engine/core/ingestion/languages/swift/captures.js +594 -0
  380. package/dist/core/code/engine/core/ingestion/languages/swift/conditional-directive-preprocess.js +256 -0
  381. package/dist/core/code/engine/core/ingestion/languages/swift/implicit-imports.js +60 -0
  382. package/dist/core/code/engine/core/ingestion/languages/swift/import-decomposer.js +87 -0
  383. package/dist/core/code/engine/core/ingestion/languages/swift/import-target.js +84 -0
  384. package/dist/core/code/engine/core/ingestion/languages/swift/index.js +56 -0
  385. package/dist/core/code/engine/core/ingestion/languages/swift/interpret.js +93 -0
  386. package/dist/core/code/engine/core/ingestion/languages/swift/merge-bindings.js +51 -0
  387. package/dist/core/code/engine/core/ingestion/languages/swift/query.js +226 -0
  388. package/dist/core/code/engine/core/ingestion/languages/swift/receiver-binding.js +169 -0
  389. package/dist/core/code/engine/core/ingestion/languages/swift/scope-resolver.js +192 -0
  390. package/dist/core/code/engine/core/ingestion/languages/swift/sibling-type-bindings.js +68 -0
  391. package/dist/core/code/engine/core/ingestion/languages/swift/signature-bindings.js +69 -0
  392. package/dist/core/code/engine/core/ingestion/languages/swift/simple-hooks.js +65 -0
  393. package/dist/core/code/engine/core/ingestion/languages/swift/target-grouping.js +97 -0
  394. package/dist/core/code/engine/core/ingestion/languages/swift/target-siblings.js +74 -0
  395. package/dist/core/code/engine/core/ingestion/languages/swift.js +246 -0
  396. package/dist/core/code/engine/core/ingestion/languages/typescript/arity-metadata.js +106 -0
  397. package/dist/core/code/engine/core/ingestion/languages/typescript/arity.js +57 -0
  398. package/dist/core/code/engine/core/ingestion/languages/typescript/array-callback.js +58 -0
  399. package/dist/core/code/engine/core/ingestion/languages/typescript/cache-stats.js +34 -0
  400. package/dist/core/code/engine/core/ingestion/languages/typescript/captures.js +956 -0
  401. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-export-assignment.js +535 -0
  402. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-module-exports.js +196 -0
  403. package/dist/core/code/engine/core/ingestion/languages/typescript/import-decomposer.js +374 -0
  404. package/dist/core/code/engine/core/ingestion/languages/typescript/import-target.js +65 -0
  405. package/dist/core/code/engine/core/ingestion/languages/typescript/index.js +108 -0
  406. package/dist/core/code/engine/core/ingestion/languages/typescript/interpret.js +344 -0
  407. package/dist/core/code/engine/core/ingestion/languages/typescript/merge-bindings.js +161 -0
  408. package/dist/core/code/engine/core/ingestion/languages/typescript/nuxt-auto-imports.js +325 -0
  409. package/dist/core/code/engine/core/ingestion/languages/typescript/query.js +1328 -0
  410. package/dist/core/code/engine/core/ingestion/languages/typescript/receiver-binding.js +201 -0
  411. package/dist/core/code/engine/core/ingestion/languages/typescript/scope-resolver.js +293 -0
  412. package/dist/core/code/engine/core/ingestion/languages/typescript/simple-hooks.js +139 -0
  413. package/dist/core/code/engine/core/ingestion/languages/typescript.js +455 -0
  414. package/dist/core/code/engine/core/ingestion/languages/vue/captures.js +70 -0
  415. package/dist/core/code/engine/core/ingestion/languages/vue/import-target.js +61 -0
  416. package/dist/core/code/engine/core/ingestion/languages/vue/index.js +55 -0
  417. package/dist/core/code/engine/core/ingestion/languages/vue/scope-resolver.js +295 -0
  418. package/dist/core/code/engine/core/ingestion/languages/vue.js +96 -0
  419. package/dist/core/code/engine/core/ingestion/local-symbol-pruner.js +68 -0
  420. package/dist/core/code/engine/core/ingestion/method-extractors/configs/c-cpp.js +387 -0
  421. package/dist/core/code/engine/core/ingestion/method-extractors/configs/csharp.js +290 -0
  422. package/dist/core/code/engine/core/ingestion/method-extractors/configs/dart.js +392 -0
  423. package/dist/core/code/engine/core/ingestion/method-extractors/configs/go.js +179 -0
  424. package/dist/core/code/engine/core/ingestion/method-extractors/configs/jvm.js +350 -0
  425. package/dist/core/code/engine/core/ingestion/method-extractors/configs/php.js +306 -0
  426. package/dist/core/code/engine/core/ingestion/method-extractors/configs/python.js +312 -0
  427. package/dist/core/code/engine/core/ingestion/method-extractors/configs/ruby.js +289 -0
  428. package/dist/core/code/engine/core/ingestion/method-extractors/configs/rust.js +198 -0
  429. package/dist/core/code/engine/core/ingestion/method-extractors/configs/swift.js +286 -0
  430. package/dist/core/code/engine/core/ingestion/method-extractors/configs/typescript-javascript.js +341 -0
  431. package/dist/core/code/engine/core/ingestion/method-extractors/generic.js +209 -0
  432. package/dist/core/code/engine/core/ingestion/method-types.js +3 -0
  433. package/dist/core/code/engine/core/ingestion/model/field-registry.js +41 -0
  434. package/dist/core/code/engine/core/ingestion/model/index.js +52 -0
  435. package/dist/core/code/engine/core/ingestion/model/method-registry.js +138 -0
  436. package/dist/core/code/engine/core/ingestion/model/owned-members-lookup.js +46 -0
  437. package/dist/core/code/engine/core/ingestion/model/registration-table.js +234 -0
  438. package/dist/core/code/engine/core/ingestion/model/resolve.js +183 -0
  439. package/dist/core/code/engine/core/ingestion/model/scope-resolution-indexes.js +43 -0
  440. package/dist/core/code/engine/core/ingestion/model/semantic-model.js +179 -0
  441. package/dist/core/code/engine/core/ingestion/model/symbol-table.js +216 -0
  442. package/dist/core/code/engine/core/ingestion/model/type-registry.js +84 -0
  443. package/dist/core/code/engine/core/ingestion/mro-processor.js +709 -0
  444. package/dist/core/code/engine/core/ingestion/parsing-processor.js +312 -0
  445. package/dist/core/code/engine/core/ingestion/pipeline-phases/communities.js +69 -0
  446. package/dist/core/code/engine/core/ingestion/pipeline-phases/cross-file.js +71 -0
  447. package/dist/core/code/engine/core/ingestion/pipeline-phases/di.js +338 -0
  448. package/dist/core/code/engine/core/ingestion/pipeline-phases/http-api-calls.js +312 -0
  449. package/dist/core/code/engine/core/ingestion/pipeline-phases/index.js +54 -0
  450. package/dist/core/code/engine/core/ingestion/pipeline-phases/mro.js +40 -0
  451. package/dist/core/code/engine/core/ingestion/pipeline-phases/orm.js +78 -0
  452. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse-impl.js +1286 -0
  453. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse.js +41 -0
  454. package/dist/core/code/engine/core/ingestion/pipeline-phases/processes.js +193 -0
  455. package/dist/core/code/engine/core/ingestion/pipeline-phases/prune-local-symbols.js +29 -0
  456. package/dist/core/code/engine/core/ingestion/pipeline-phases/registry.js +52 -0
  457. package/dist/core/code/engine/core/ingestion/pipeline-phases/routes.js +409 -0
  458. package/dist/core/code/engine/core/ingestion/pipeline-phases/rpc-edges.js +301 -0
  459. package/dist/core/code/engine/core/ingestion/pipeline-phases/runner.js +207 -0
  460. package/dist/core/code/engine/core/ingestion/pipeline-phases/scan.js +49 -0
  461. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-aop.js +442 -0
  462. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-auto-configuration.js +264 -0
  463. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-config.js +440 -0
  464. package/dist/core/code/engine/core/ingestion/pipeline-phases/structure.js +38 -0
  465. package/dist/core/code/engine/core/ingestion/pipeline-phases/tools.js +89 -0
  466. package/dist/core/code/engine/core/ingestion/pipeline-phases/types.js +40 -0
  467. package/dist/core/code/engine/core/ingestion/pipeline.js +152 -0
  468. package/dist/core/code/engine/core/ingestion/process-processor.js +325 -0
  469. package/dist/core/code/engine/core/ingestion/resolve-references.js +205 -0
  470. package/dist/core/code/engine/core/ingestion/route-extractors/constant-resolver.js +135 -0
  471. package/dist/core/code/engine/core/ingestion/route-extractors/django-root-discovery.js +221 -0
  472. package/dist/core/code/engine/core/ingestion/route-extractors/django.js +428 -0
  473. package/dist/core/code/engine/core/ingestion/route-extractors/expo.js +39 -0
  474. package/dist/core/code/engine/core/ingestion/route-extractors/fastapi-router-bindings.js +264 -0
  475. package/dist/core/code/engine/core/ingestion/route-extractors/laravel.js +501 -0
  476. package/dist/core/code/engine/core/ingestion/route-extractors/middleware.js +175 -0
  477. package/dist/core/code/engine/core/ingestion/route-extractors/nextjs.js +81 -0
  478. package/dist/core/code/engine/core/ingestion/route-extractors/php.js +25 -0
  479. package/dist/core/code/engine/core/ingestion/route-extractors/python-const-resolver.js +307 -0
  480. package/dist/core/code/engine/core/ingestion/route-extractors/response-shapes.js +299 -0
  481. package/dist/core/code/engine/core/ingestion/route-extractors/route-path.js +71 -0
  482. package/dist/core/code/engine/core/ingestion/route-extractors/spring-shared.js +310 -0
  483. package/dist/core/code/engine/core/ingestion/route-extractors/spring.js +441 -0
  484. package/dist/core/code/engine/core/ingestion/scope-extractor-bridge.js +60 -0
  485. package/dist/core/code/engine/core/ingestion/scope-extractor.js +1373 -0
  486. package/dist/core/code/engine/core/ingestion/scope-resolution/contract/scope-resolver.js +282 -0
  487. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +72 -0
  488. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/edges.js +194 -0
  489. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/ids.js +472 -0
  490. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +49 -0
  491. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/method-dispatch.js +43 -0
  492. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +274 -0
  493. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +93 -0
  494. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/callable-value-flow.js +1240 -0
  495. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/compound-receiver.js +1174 -0
  496. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/free-call-fallback.js +873 -0
  497. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/imported-return-types.js +226 -0
  498. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/mro.js +107 -0
  499. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/overload-narrowing.js +441 -0
  500. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/property-dispatch.js +122 -0
  501. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +1720 -0
  502. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/phase.js +395 -0
  503. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +208 -0
  504. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/registry.js +49 -0
  505. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/run.js +632 -0
  506. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/validate-bindings-immutability.js +112 -0
  507. package/dist/core/code/engine/core/ingestion/scope-resolution/resolution-outcome.js +41 -0
  508. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/namespace-targets.js +81 -0
  509. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/walkers.js +1835 -0
  510. package/dist/core/code/engine/core/ingestion/scope-resolution/unresolved-receivers.js +242 -0
  511. package/dist/core/code/engine/core/ingestion/scope-resolution/utils/definition-id.js +22 -0
  512. package/dist/core/code/engine/core/ingestion/scope-resolution/workspace-index.js +151 -0
  513. package/dist/core/code/engine/core/ingestion/structure-processor.js +40 -0
  514. package/dist/core/code/engine/core/ingestion/tree-sitter-queries.js +2244 -0
  515. package/dist/core/code/engine/core/ingestion/ts-js-hoc-utils.js +115 -0
  516. package/dist/core/code/engine/core/ingestion/type-env.js +1136 -0
  517. package/dist/core/code/engine/core/ingestion/type-extractors/c-cpp.js +555 -0
  518. package/dist/core/code/engine/core/ingestion/type-extractors/csharp.js +570 -0
  519. package/dist/core/code/engine/core/ingestion/type-extractors/dart.js +372 -0
  520. package/dist/core/code/engine/core/ingestion/type-extractors/go.js +508 -0
  521. package/dist/core/code/engine/core/ingestion/type-extractors/jvm.js +875 -0
  522. package/dist/core/code/engine/core/ingestion/type-extractors/php.js +537 -0
  523. package/dist/core/code/engine/core/ingestion/type-extractors/python.js +477 -0
  524. package/dist/core/code/engine/core/ingestion/type-extractors/ruby.js +380 -0
  525. package/dist/core/code/engine/core/ingestion/type-extractors/rust.js +502 -0
  526. package/dist/core/code/engine/core/ingestion/type-extractors/shared.js +843 -0
  527. package/dist/core/code/engine/core/ingestion/type-extractors/swift.js +490 -0
  528. package/dist/core/code/engine/core/ingestion/type-extractors/types.js +2 -0
  529. package/dist/core/code/engine/core/ingestion/type-extractors/typescript.js +690 -0
  530. package/dist/core/code/engine/core/ingestion/utils/ast-helpers.js +1693 -0
  531. package/dist/core/code/engine/core/ingestion/utils/call-analysis.js +779 -0
  532. package/dist/core/code/engine/core/ingestion/utils/callable-flow-captures.js +932 -0
  533. package/dist/core/code/engine/core/ingestion/utils/callable-labels.js +49 -0
  534. package/dist/core/code/engine/core/ingestion/utils/deferred-resolution-profile.js +151 -0
  535. package/dist/core/code/engine/core/ingestion/utils/effective-ram.js +67 -0
  536. package/dist/core/code/engine/core/ingestion/utils/env.js +60 -0
  537. package/dist/core/code/engine/core/ingestion/utils/event-loop.js +9 -0
  538. package/dist/core/code/engine/core/ingestion/utils/graph-sort.js +103 -0
  539. package/dist/core/code/engine/core/ingestion/utils/heap-probe.js +45 -0
  540. package/dist/core/code/engine/core/ingestion/utils/heritage-marker.js +47 -0
  541. package/dist/core/code/engine/core/ingestion/utils/line-base.js +24 -0
  542. package/dist/core/code/engine/core/ingestion/utils/max-file-size.js +59 -0
  543. package/dist/core/code/engine/core/ingestion/utils/method-props.js +198 -0
  544. package/dist/core/code/engine/core/ingestion/utils/qualified-name.js +73 -0
  545. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-captures.js +60 -0
  546. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-codec.js +188 -0
  547. package/dist/core/code/engine/core/ingestion/utils/scope-tree-walk.js +36 -0
  548. package/dist/core/code/engine/core/ingestion/utils/symbol-labels.js +48 -0
  549. package/dist/core/code/engine/core/ingestion/utils/template-arguments.js +187 -0
  550. package/dist/core/code/engine/core/ingestion/utils/type-parameters.js +209 -0
  551. package/dist/core/code/engine/core/ingestion/utils/verbose.js +6 -0
  552. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/c-cpp.js +133 -0
  553. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/csharp.js +66 -0
  554. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/dart.js +111 -0
  555. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/go.js +153 -0
  556. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/jvm.js +145 -0
  557. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/php.js +61 -0
  558. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/python.js +104 -0
  559. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/ruby.js +55 -0
  560. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/rust.js +79 -0
  561. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/swift.js +91 -0
  562. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/typescript-javascript.js +86 -0
  563. package/dist/core/code/engine/core/ingestion/variable-extractors/generic.js +111 -0
  564. package/dist/core/code/engine/core/ingestion/variable-types.js +3 -0
  565. package/dist/core/code/engine/core/ingestion/vue-sfc-extractor.js +544 -0
  566. package/dist/core/code/engine/core/ingestion/workers/callable-id.js +122 -0
  567. package/dist/core/code/engine/core/ingestion/workers/clone-safety.js +470 -0
  568. package/dist/core/code/engine/core/ingestion/workers/parse-worker.js +2456 -0
  569. package/dist/core/code/engine/core/ingestion/workers/post-result.js +90 -0
  570. package/dist/core/code/engine/core/ingestion/workers/quarantine.js +41 -0
  571. package/dist/core/code/engine/core/ingestion/workers/result-merge.js +59 -0
  572. package/dist/core/code/engine/core/ingestion/workers/worker-pool.js +1725 -0
  573. package/dist/core/code/engine/core/ingestion/workspace-config.js +139 -0
  574. package/dist/core/code/engine/core/lbug/conn-lock.js +72 -0
  575. package/dist/core/code/engine/core/lbug/csv-generator.js +710 -0
  576. package/dist/core/code/engine/core/lbug/cypher-escape.js +24 -0
  577. package/dist/core/code/engine/core/lbug/extension-load-error.js +339 -0
  578. package/dist/core/code/engine/core/lbug/extension-loader.js +261 -0
  579. package/dist/core/code/engine/core/lbug/graph-emit-sink.js +584 -0
  580. package/dist/core/code/engine/core/lbug/lbug-adapter.js +2703 -0
  581. package/dist/core/code/engine/core/lbug/lbug-config.js +1029 -0
  582. package/dist/core/code/engine/core/lbug/native-check.js +435 -0
  583. package/dist/core/code/engine/core/lbug/pool-adapter.js +973 -0
  584. package/dist/core/code/engine/core/lbug/query-params.js +25 -0
  585. package/dist/core/code/engine/core/lbug/query-result-utils.js +31 -0
  586. package/dist/core/code/engine/core/lbug/rel-pair-routing.js +373 -0
  587. package/dist/core/code/engine/core/lbug/schema.js +771 -0
  588. package/dist/core/code/engine/core/lbug/shutdown-helpers.js +40 -0
  589. package/dist/core/code/engine/core/lbug/sidecar-recovery.js +716 -0
  590. package/dist/core/code/engine/core/lbug/stdio-capture.js +49 -0
  591. package/dist/core/code/engine/core/lbug/sync-csv-writer.js +115 -0
  592. package/dist/core/code/engine/core/lbug/wal-checkpoint-driver.js +215 -0
  593. package/dist/core/code/engine/core/lbug/wal-driver-state.js +28 -0
  594. package/dist/core/code/engine/core/logger.js +339 -0
  595. package/dist/core/code/engine/core/platform/capabilities.js +91 -0
  596. package/dist/core/code/engine/core/run-analyze.js +1098 -0
  597. package/dist/core/code/engine/core/tree-sitter/parser-loader.js +281 -0
  598. package/dist/core/code/engine/core/tree-sitter/safe-parse.js +258 -0
  599. package/dist/core/code/engine/core/tree-sitter/vendored-grammars.js +64 -0
  600. package/dist/core/code/engine/lib/utils.js +121 -0
  601. package/dist/core/code/engine/mcp/core/lbug-adapter.js +27 -0
  602. package/dist/core/code/engine/mcp/local/aop-metadata.js +230 -0
  603. package/dist/core/code/engine/mcp/local/bean-metadata.js +49 -0
  604. package/dist/core/code/engine/mcp/local/limits.js +15 -0
  605. package/dist/core/code/engine/mcp/local/line-display.js +6 -0
  606. package/dist/core/code/engine/mcp/local/local-backend.js +4142 -0
  607. package/dist/core/code/engine/storage/branch-index.js +72 -0
  608. package/dist/core/code/engine/storage/file-hash.js +95 -0
  609. package/dist/core/code/engine/storage/fs-atomic.js +34 -0
  610. package/dist/core/code/engine/storage/git.js +555 -0
  611. package/dist/core/code/engine/storage/index-lock.js +664 -0
  612. package/dist/core/code/engine/storage/parse-cache.js +650 -0
  613. package/dist/core/code/engine/storage/parsedfile-store.js +620 -0
  614. package/dist/core/code/engine/storage/repo-manager.js +1061 -0
  615. package/dist/core/code/engine/storage/scope-index-store.js +247 -0
  616. package/dist/core/code/engine/types/pipeline.js +2 -0
  617. package/dist/core/code/scripts/install-duckdb-extension.mjs +125 -0
  618. package/dist/core/code/scripts/resolve-analyze-cmd.cjs +346 -0
  619. package/dist/core/code/shared/graph/types.js +8 -0
  620. package/dist/core/code/shared/index.js +105 -0
  621. package/dist/core/code/shared/integrations/circuit-breaker.js +242 -0
  622. package/dist/core/code/shared/integrations/resilient-fetch.js +224 -0
  623. package/dist/core/code/shared/integrations/retry.js +70 -0
  624. package/dist/core/code/shared/integrations/understand-quickly.js +145 -0
  625. package/dist/core/code/shared/language-detection.js +162 -0
  626. package/dist/core/code/shared/languages.js +27 -0
  627. package/dist/core/code/shared/lbug/schema-constants.js +98 -0
  628. package/dist/core/code/shared/mro-strategy.js +2 -0
  629. package/dist/core/code/shared/pipeline.js +5 -0
  630. package/dist/core/code/shared/scope-resolution/callable-flow-site.js +11 -0
  631. package/dist/core/code/shared/scope-resolution/def-index.js +53 -0
  632. package/dist/core/code/shared/scope-resolution/evidence-weights.js +87 -0
  633. package/dist/core/code/shared/scope-resolution/finalize-algorithm.js +807 -0
  634. package/dist/core/code/shared/scope-resolution/language-classification.js +46 -0
  635. package/dist/core/code/shared/scope-resolution/method-dispatch-index.js +100 -0
  636. package/dist/core/code/shared/scope-resolution/module-scope-index.js +59 -0
  637. package/dist/core/code/shared/scope-resolution/origin-priority.js +23 -0
  638. package/dist/core/code/shared/scope-resolution/parsed-file.js +54 -0
  639. package/dist/core/code/shared/scope-resolution/position-index.js +136 -0
  640. package/dist/core/code/shared/scope-resolution/qualified-name-index.js +77 -0
  641. package/dist/core/code/shared/scope-resolution/reference-site.js +24 -0
  642. package/dist/core/code/shared/scope-resolution/registries/class-registry.js +32 -0
  643. package/dist/core/code/shared/scope-resolution/registries/context.js +52 -0
  644. package/dist/core/code/shared/scope-resolution/registries/evidence.js +152 -0
  645. package/dist/core/code/shared/scope-resolution/registries/field-registry.js +33 -0
  646. package/dist/core/code/shared/scope-resolution/registries/lookup-core.js +392 -0
  647. package/dist/core/code/shared/scope-resolution/registries/lookup-qualified.js +58 -0
  648. package/dist/core/code/shared/scope-resolution/registries/macro-registry.js +34 -0
  649. package/dist/core/code/shared/scope-resolution/registries/method-registry.js +34 -0
  650. package/dist/core/code/shared/scope-resolution/registries/tie-breaks.js +63 -0
  651. package/dist/core/code/shared/scope-resolution/resolve-type-ref.js +128 -0
  652. package/dist/core/code/shared/scope-resolution/scope-id.js +49 -0
  653. package/dist/core/code/shared/scope-resolution/scope-tree.js +225 -0
  654. package/dist/core/code/shared/scope-resolution/symbol-definition.js +12 -0
  655. package/dist/core/code/shared/scope-resolution/types.js +25 -0
  656. package/dist/core/code/shared/test-helpers.js +17 -0
  657. package/dist/core/code/vendor/leiden/index.cjs +355 -0
  658. package/dist/core/code/vendor/leiden/utils.cjs +419 -0
  659. package/dist/core/timeline/cli.d.ts.map +1 -1
  660. package/dist/core/timeline/cli.js +13 -6
  661. package/dist/core/timeline/cli.js.map +1 -1
  662. package/dist/core/timeline/debris.d.ts +20 -0
  663. package/dist/core/timeline/debris.d.ts.map +1 -0
  664. package/dist/core/timeline/debris.js +124 -0
  665. package/dist/core/timeline/debris.js.map +1 -0
  666. package/dist/core/timeline/hook-runner.d.ts.map +1 -1
  667. package/dist/core/timeline/hook-runner.js +3 -1
  668. package/dist/core/timeline/hook-runner.js.map +1 -1
  669. package/dist/core/timeline/hooks.d.ts.map +1 -1
  670. package/dist/core/timeline/hooks.js +13 -5
  671. package/dist/core/timeline/hooks.js.map +1 -1
  672. package/dist/core/timeline/installer.d.ts +2 -0
  673. package/dist/core/timeline/installer.d.ts.map +1 -1
  674. package/dist/core/timeline/installer.js +12 -0
  675. package/dist/core/timeline/installer.js.map +1 -1
  676. package/dist/core/timeline/project-root.d.ts +21 -0
  677. package/dist/core/timeline/project-root.d.ts.map +1 -0
  678. package/dist/core/timeline/project-root.js +83 -0
  679. package/dist/core/timeline/project-root.js.map +1 -0
  680. package/package.json +1 -1
@@ -0,0 +1,716 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports._resetSidecarRecoveryWarningsForTest = exports.guardWalQuarantine = exports.renameFailureMessage = exports.lbugLockRemediation = exports.isPermissionRenameError = exports.presentShadowUnreachableMessage = exports.shadowSidecarRecoveryMessage = exports.isReadOnlyShadowReplayError = exports.isMissingShadowSidecarError = exports.statIfExists = exports.sidecarPreflightDisabled = exports.isMissingFsError = exports.TINY_ORPHAN_WAL_BYTES = void 0;
7
+ exports.inspectLbugSidecars = inspectLbugSidecars;
8
+ exports.quarantineWalForMissingShadow = quarantineWalForMissingShadow;
9
+ exports.preflightLbugSidecars = preflightLbugSidecars;
10
+ exports.finalizeLbugSidecarsAfterClose = finalizeLbugSidecarsAfterClose;
11
+ exports.quarantineSidecarsForDirtyRecovery = quarantineSidecarsForDirtyRecovery;
12
+ exports.listQuarantinedMissingShadowWals = listQuarantinedMissingShadowWals;
13
+ exports.cleanQuarantinedMissingShadowWals = cleanQuarantinedMissingShadowWals;
14
+ exports.listParkedDirtyRecoverySidecars = listParkedDirtyRecoverySidecars;
15
+ exports.cleanParkedDirtyRecoverySidecars = cleanParkedDirtyRecoverySidecars;
16
+ exports.listParkedLbugSidecars = listParkedLbugSidecars;
17
+ exports.cleanParkedLbugSidecars = cleanParkedLbugSidecars;
18
+ const promises_1 = __importDefault(require("fs/promises"));
19
+ const path_1 = __importDefault(require("path"));
20
+ const lbug_config_js_1 = require("./lbug-config.js");
21
+ exports.TINY_ORPHAN_WAL_BYTES = 4 * 1024;
22
+ /**
23
+ * Counter-based warn anti-spam (PR #1747 review, Finding 6).
24
+ *
25
+ * The previous design (`warnedKeys: Set<string>`) warned exactly once per key
26
+ * per process and silently downgraded all subsequent occurrences to debug. In
27
+ * a long-lived `cgraph serve` process touching the same dbPath repeatedly,
28
+ * a persistent condition produced one warn at the first occurrence and then
29
+ * 99+ silent debug lines — invisible to operators reading warn-level logs.
30
+ *
31
+ * The counter-based design warns on logarithmic milestones so persistence
32
+ * stays visible. Geometric spacing keeps total warn count bounded at O(log N)
33
+ * for a condition that fires N times.
34
+ */
35
+ const warnedKeyCounts = new Map();
36
+ const WARN_MILESTONES = [1, 10, 100, 1000, 10000];
37
+ const ordinal = (n) => {
38
+ switch (n) {
39
+ case 1:
40
+ return '1st';
41
+ case 10:
42
+ return '10th';
43
+ case 100:
44
+ return '100th';
45
+ case 1000:
46
+ return '1000th';
47
+ case 10000:
48
+ return '10000th';
49
+ default:
50
+ return `${n}th`;
51
+ }
52
+ };
53
+ const isMissingFsError = (err) => err?.code === 'ENOENT';
54
+ exports.isMissingFsError = isMissingFsError;
55
+ const missing = exports.isMissingFsError;
56
+ const sidecarPreflightDisabled = () => /^(1|true|yes|on)$/i.test(process.env.CGRAPH_DISABLE_LBUG_SIDECAR_PREFLIGHT ?? '');
57
+ exports.sidecarPreflightDisabled = sidecarPreflightDisabled;
58
+ const statIfExists = async (filePath) => {
59
+ try {
60
+ const statFn = promises_1.default.stat;
61
+ if (typeof statFn === 'function') {
62
+ const stat = await statFn(filePath);
63
+ return { size: stat.size };
64
+ }
65
+ // Some focused unit tests provide a deliberately tiny fs mock. Treat a
66
+ // path as present only when access succeeds, with an unknown/zero size.
67
+ await promises_1.default.access(filePath);
68
+ return { size: 0 };
69
+ }
70
+ catch (err) {
71
+ if (missing(err))
72
+ return null;
73
+ throw err;
74
+ }
75
+ };
76
+ exports.statIfExists = statIfExists;
77
+ const logDebug = (logger, message) => {
78
+ if (logger.debug)
79
+ logger.debug(message);
80
+ };
81
+ const logInfo = (logger, message) => {
82
+ if (logger.info)
83
+ logger.info(message);
84
+ else
85
+ logDebug(logger, message);
86
+ };
87
+ /**
88
+ * Log at warn-level on logarithmic milestone occurrences (1st, 10th, 100th,
89
+ * 1000th, 10000th); debug-level otherwise. Past the first occurrence the warn
90
+ * message is suffixed with the occurrence count so operators can see the
91
+ * condition's persistence at a glance.
92
+ *
93
+ * The signature and key convention (`${dbPath}:suffix`) are unchanged from the
94
+ * previous warn-once implementation — call sites need no edits.
95
+ */
96
+ const warnOnce = (logger, key, message) => {
97
+ const next = (warnedKeyCounts.get(key) ?? 0) + 1;
98
+ warnedKeyCounts.set(key, next);
99
+ const isMilestone = WARN_MILESTONES.includes(next);
100
+ if (!isMilestone) {
101
+ logDebug(logger, message);
102
+ return;
103
+ }
104
+ if (next === 1) {
105
+ logger.warn(message);
106
+ return;
107
+ }
108
+ logger.warn(`${message} (${ordinal(next)} occurrence of this condition)`);
109
+ };
110
+ // LADYBUGDB-CONTRACT: matches @ladybugdb/core ^0.18.0 native error text.
111
+ // When bumping LadybugDB, re-validate this against the new error format
112
+ // — `git grep "LADYBUGDB-CONTRACT"` enumerates every version-coupled spot.
113
+ //
114
+ // Two native formats reach here for a genuinely-missing shadow sidecar:
115
+ // POSIX: `Cannot open file <path>.shadow: No such file or directory`
116
+ // Windows: `Cannot open file. path: <path>.shadow - Error 2: <system text>`
117
+ // Windows OS text is localized on non-English installs (issue #2382 was filed
118
+ // from a non-English Windows), so we key on the locale-invariant Win32 code
119
+ // (2 = ERROR_FILE_NOT_FOUND), NOT the English phrase. The code is matched only
120
+ // in the reason AFTER the LAST `.shadow` token (the real failing sidecar; the
121
+ // reason text never contains `.shadow`), so a repo *path* containing e.g.
122
+ // `\error 2\` — even under a `.shadow`-suffixed parent directory — cannot trip
123
+ // it. Deliberate exclusions:
124
+ // - `Error 3` (ERROR_PATH_NOT_FOUND): the #1811 non-ASCII path-garble
125
+ // artifact (see lbug-config.ts) where the shadow is PRESENT on disk;
126
+ // treating it as missing would quarantine a live WAL — data loss.
127
+ // - `Error 5` / `Error 32` / POSIX `Permission denied`: present-but-locked;
128
+ // handled as permission/lock classes, must not quarantine.
129
+ // The quarantine path adds a present-shadow disk check as a belt (see
130
+ // refuseLargeWalQuarantine in lbug-adapter.ts).
131
+ //
132
+ // The Windows branch is derived from the issue #2382 reported string, not a
133
+ // self-produced live crash; unit/consumer tests inject that same string, so
134
+ // GREEN TESTS DO NOT PROVE the byte-exact 0.18.0 Windows format — confirm
135
+ // against a real Windows run before closing #2382.
136
+ const isMissingShadowSidecarError = (err) => {
137
+ const msg = err instanceof Error ? err.message : String(err);
138
+ if (!/cannot open file/i.test(msg))
139
+ return false;
140
+ // Anchor on the LAST `.shadow`, not the first: LadybugDB names the failing
141
+ // sidecar as the final `.shadow` token and its reason text (POSIX
142
+ // `: No such file or directory` / Windows ` - Error N: ...`) never contains
143
+ // `.shadow`. Slicing from the last match isolates the true reason, so an
144
+ // earlier `.shadow`-suffixed path segment (e.g. a `branch=subdir` directory
145
+ // like `snap.shadow\`) can't shift the anchor and let a path-embedded
146
+ // `error 2` be read as the Win32 code (issue #2382 review, Finding A).
147
+ const lastShadow = [...msg.matchAll(/\.shadow\b/gi)].at(-1);
148
+ if (lastShadow?.index === undefined)
149
+ return false;
150
+ const reason = msg.slice(lastShadow.index);
151
+ return /no such file or directory/i.test(reason) || /\berror\s+2\b/i.test(reason);
152
+ };
153
+ exports.isMissingShadowSidecarError = isMissingShadowSidecarError;
154
+ // LADYBUGDB-CONTRACT: matches @ladybugdb/core ^0.18.0 native error text.
155
+ // When bumping LadybugDB, re-validate this regex against the new error format
156
+ // — `git grep "LADYBUGDB-CONTRACT"` enumerates every version-coupled spot.
157
+ // Verified by upstream source/changelog diff only — a reliable cross-platform
158
+ // live trigger for a read-only shadow-replay state isn't practical to
159
+ // construct, so this matcher does not have live-trigger test coverage.
160
+ const isReadOnlyShadowReplayError = (err) => {
161
+ const msg = err instanceof Error ? err.message : String(err);
162
+ return /replay shadow pages under read-only mode/i.test(msg);
163
+ };
164
+ exports.isReadOnlyShadowReplayError = isReadOnlyShadowReplayError;
165
+ const shadowSidecarRecoveryMessage = (dbPath, err) => {
166
+ const msg = err instanceof Error ? err.message : String(err);
167
+ return (`LadybugDB checkpoint sidecar is missing for ${dbPath}. ` +
168
+ 'Rebuild the index with `cgraph analyze --force <repo-path> --index-only` and restart `cgraph serve`.' +
169
+ `\n Original error: ${msg.slice(0, 200)}`);
170
+ };
171
+ exports.shadowSidecarRecoveryMessage = shadowSidecarRecoveryMessage;
172
+ /**
173
+ * Actionable message for the case where LadybugDB reports a "missing shadow"
174
+ * but `inspectLbugSidecars` finds the `.shadow` PRESENT on disk — the open
175
+ * failed on path reachability or a lock, not a genuinely-missing sidecar (issue
176
+ * #2382 review, S2). Unlike `shadowSidecarRecoveryMessage` it does NOT tell the
177
+ * operator to rebuild the index (the remedy is fixing the lock/path). Keeps the
178
+ * `Original error:` tail so downstream `isMissingShadowSidecarError` recognition
179
+ * still matches the wrapped error.
180
+ */
181
+ const presentShadowUnreachableMessage = (dbPath, err) => {
182
+ const msg = err instanceof Error ? err.message : String(err);
183
+ return (`LadybugDB checkpoint sidecar is present but unreachable for ${dbPath}. ` +
184
+ 'The .shadow file is on disk, so the open likely failed on path reachability or a file lock ' +
185
+ '(antivirus, another process holding a handle, or a non-ASCII path) rather than a missing sidecar. ' +
186
+ 'Check filesystem access and locks; only run `cgraph analyze --force <repo-path> --index-only` ' +
187
+ 'if the index is genuinely broken.' +
188
+ `\n Original error: ${msg.slice(0, 200)}`);
189
+ };
190
+ exports.presentShadowUnreachableMessage = presentShadowUnreachableMessage;
191
+ const PERMISSION_RENAME_CODES = new Set(['EACCES', 'EPERM', 'EBUSY']);
192
+ const isPermissionRenameError = (err) => {
193
+ const code = err?.code;
194
+ return typeof code === 'string' && PERMISSION_RENAME_CODES.has(code);
195
+ };
196
+ exports.isPermissionRenameError = isPermissionRenameError;
197
+ /**
198
+ * Canonical remediation guidance for the LadybugDB file-lock class
199
+ * (EBUSY/EPERM/EACCES — an MCP/serve process holding the index, or an
200
+ * antivirus scan). One exported producer (this shipping review, FIX 7):
201
+ * the dirty-recovery park warning below, `LbugWipeError`'s message builder
202
+ * (lbug-adapter.ts) and {@link renameFailureMessage} previously carried
203
+ * three divergent hand-written copies of the same advice.
204
+ *
205
+ * `rerun` names the command to retry once the lock clears — the analyze
206
+ * wipe/park surfaces re-run the analyze; the read-path quarantine surface
207
+ * re-runs whatever command failed. No trailing period: callers own the
208
+ * sentence end.
209
+ */
210
+ const lbugLockRemediation = (rerun = 're-run `cgraph analyze`') => 'stop any GitNexus MCP or serve process using this repository, add an antivirus ' +
211
+ `exclusion for the GitNexus storage directory, then ${rerun}`;
212
+ exports.lbugLockRemediation = lbugLockRemediation;
213
+ /**
214
+ * Classify a failure surfaced by quarantine rename into an actionable user-facing
215
+ * message.
216
+ *
217
+ * - EACCES / EPERM / EBUSY → permission-specific message pointing at filesystem
218
+ * ACLs, AV exclusions, and file-locks. Importantly does NOT instruct the user
219
+ * to rebuild the index — the underlying problem is environmental, not data
220
+ * integrity, and re-running after fixing the lock/permission will succeed.
221
+ * - Everything else (including the LadybugDB "Cannot open file *.shadow"
222
+ * missing-shadow error, ENOSPC, EROFS, EIO, and any other thrown Error) →
223
+ * falls back to `shadowSidecarRecoveryMessage`, preserving today's behavior.
224
+ *
225
+ * Use at caller catches around `quarantineWalForMissingShadow` and any other
226
+ * path where an `fs.rename`-class failure may surface to operators.
227
+ */
228
+ const renameFailureMessage = (dbPath, err) => {
229
+ if ((0, exports.isPermissionRenameError)(err)) {
230
+ const code = err.code;
231
+ const msg = err instanceof Error ? err.message : String(err);
232
+ return (`GitNexus could not move the LadybugDB WAL sidecar at ${dbPath}.wal because of a ` +
233
+ `filesystem permission or file-lock error (${code}). ` +
234
+ 'The index does not need to be rebuilt — ' +
235
+ // Shared remediation copy (FIX 7); this surface serves read paths too,
236
+ // so the re-run target is the failing command, not the analyze.
237
+ `${(0, exports.lbugLockRemediation)('re-run the failing command once the lock or permission is resolved')}.` +
238
+ `\n Original error: ${msg.slice(0, 200)}`);
239
+ }
240
+ return (0, exports.shadowSidecarRecoveryMessage)(dbPath, err);
241
+ };
242
+ exports.renameFailureMessage = renameFailureMessage;
243
+ async function inspectLbugSidecars(dbPath) {
244
+ const wal = await (0, exports.statIfExists)(`${dbPath}.wal`);
245
+ const shadow = await (0, exports.statIfExists)(`${dbPath}.shadow`);
246
+ if (wal && shadow) {
247
+ return { kind: 'wal-with-shadow', dbPath, walBytes: wal.size, shadowBytes: shadow.size };
248
+ }
249
+ if (wal) {
250
+ if (wal.size <= exports.TINY_ORPHAN_WAL_BYTES) {
251
+ return { kind: 'tiny-orphan-wal', dbPath, walBytes: wal.size };
252
+ }
253
+ return { kind: 'orphan-wal', dbPath, walBytes: wal.size };
254
+ }
255
+ if (shadow) {
256
+ return { kind: 'orphan-shadow', dbPath, shadowBytes: shadow.size };
257
+ }
258
+ return { kind: 'clean', dbPath };
259
+ }
260
+ /**
261
+ * Reject the WAL-quarantine path when discarding the WAL would be unsafe or
262
+ * wrong. Shared by every reactive missing-shadow recovery consumer — serve (via
263
+ * lbug-adapter's `refuseLargeWalQuarantine`) and the MCP/wiki/augmentation pool
264
+ * (via pool-adapter's `tryQuarantineForMissingShadow`) — so the quarantine
265
+ * safety policy has a single source of truth (issue #2382 review, Finding B).
266
+ *
267
+ * 1. `wal-with-shadow` — the `.shadow` sidecar is PRESENT on disk. A
268
+ * "missing shadow" error alongside a present shadow means the open failed
269
+ * on path reachability or a lock (the #1811 non-ASCII path-garble on
270
+ * Windows), not a genuinely-missing shadow; quarantining would move a live
271
+ * WAL sitting next to its shadow — data loss.
272
+ * 2. `orphan-wal` — the orphan WAL is too large to safely discard
273
+ * (>TINY_ORPHAN_WAL_BYTES); preserve the uncheckpointed pages for explicit
274
+ * operator recovery.
275
+ *
276
+ * Throws `shadowSidecarRecoveryMessage` in either case. Returns silently only
277
+ * when the shadow is absent AND the WAL is absent or tiny — the states where
278
+ * the existing recovery path is safe to proceed. `mode` is a label used only in
279
+ * the warning text (e.g. 'read-only', 'writable', 'pool read-only recovery').
280
+ */
281
+ const guardWalQuarantine = async (dbPath, mode, triggeringErr, logger) => {
282
+ const state = await inspectLbugSidecars(dbPath);
283
+ if (state.kind === 'wal-with-shadow') {
284
+ warnOnce(logger, `${dbPath}:present-shadow-refuse:${mode}`, `GitNexus: refusing to quarantine WAL at ${dbPath}.wal during ${mode} recovery — ` +
285
+ 'the .shadow sidecar is present on disk, so the open likely failed on path reachability or a lock ' +
286
+ 'rather than a missing shadow. Run `cgraph analyze --force <repo-path> --index-only` if the index is genuinely broken.');
287
+ throw new Error((0, exports.presentShadowUnreachableMessage)(dbPath, triggeringErr));
288
+ }
289
+ if (state.kind === 'orphan-wal') {
290
+ warnOnce(logger, `${dbPath}:large-wal-refuse:${mode}`, `GitNexus: refusing to quarantine large WAL (${state.walBytes} bytes) at ${dbPath}.wal during ${mode} recovery; ` +
291
+ 'manual recovery required — run `cgraph analyze --force <repo-path> --index-only`.');
292
+ throw new Error((0, exports.shadowSidecarRecoveryMessage)(dbPath, triggeringErr));
293
+ }
294
+ };
295
+ exports.guardWalQuarantine = guardWalQuarantine;
296
+ async function quarantineWalForMissingShadow(dbPath, options) {
297
+ const walPath = `${dbPath}.wal`;
298
+ const quarantinePath = `${walPath}.missing-shadow.${Date.now()}-${Math.random()
299
+ .toString(36)
300
+ .slice(2)}`;
301
+ await promises_1.default.rename(walPath, quarantinePath);
302
+ const message = `GitNexus: quarantined WAL ${path_1.default.basename(quarantinePath)} because LadybugDB shadow sidecar was missing; ` +
303
+ `continuing from last checkpoint${options.reason ? ` (${options.reason})` : ''}`;
304
+ if (options.level === 'warn') {
305
+ warnOnce(options.logger, `${dbPath}:missing-shadow-quarantine`, message);
306
+ }
307
+ else if (options.level === 'info') {
308
+ logInfo(options.logger, message);
309
+ }
310
+ else {
311
+ logDebug(options.logger, message);
312
+ }
313
+ return quarantinePath;
314
+ }
315
+ async function preflightLbugSidecars(dbPath, options) {
316
+ let state;
317
+ try {
318
+ state = await inspectLbugSidecars(dbPath);
319
+ }
320
+ catch (err) {
321
+ logDebug(options.logger, `GitNexus: unable to inspect LadybugDB sidecars before ${options.mode} open; continuing without preflight repair: ${err.message}`);
322
+ return { kind: 'clean', dbPath };
323
+ }
324
+ if ((0, exports.sidecarPreflightDisabled)() || !options.allowQuarantine)
325
+ return state;
326
+ if (state.kind === 'tiny-orphan-wal') {
327
+ await quarantineWalForMissingShadow(dbPath, {
328
+ logger: options.logger,
329
+ level: 'debug',
330
+ reason: `${options.mode} preflight tiny orphan WAL (${state.walBytes} bytes)`,
331
+ });
332
+ return inspectLbugSidecars(dbPath);
333
+ }
334
+ if (state.kind === 'orphan-wal') {
335
+ warnOnce(options.logger, `${dbPath}:orphan-wal-preflight:${options.mode}`, `GitNexus: found ${state.walBytes} byte lbug.wal without lbug.shadow before ${options.mode} open; ` +
336
+ 'will rely on LadybugDB replay/recovery instead of deleting pending WAL data.');
337
+ }
338
+ return state;
339
+ }
340
+ async function finalizeLbugSidecarsAfterClose(dbPath, options) {
341
+ if ((0, exports.sidecarPreflightDisabled)())
342
+ return;
343
+ let state;
344
+ try {
345
+ state = await inspectLbugSidecars(dbPath);
346
+ }
347
+ catch (err) {
348
+ logDebug(options.logger, `GitNexus: unable to inspect LadybugDB sidecars after close; skipping post-close repair: ${err.message}`);
349
+ return;
350
+ }
351
+ if (state.kind === 'clean' || state.kind === 'wal-with-shadow')
352
+ return;
353
+ for (const delayMs of [25, 50, 100]) {
354
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
355
+ try {
356
+ state = await inspectLbugSidecars(dbPath);
357
+ }
358
+ catch (err) {
359
+ logDebug(options.logger, `GitNexus: unable to inspect LadybugDB sidecars after close; skipping post-close repair: ${err.message}`);
360
+ return;
361
+ }
362
+ if (state.kind === 'clean' || state.kind === 'wal-with-shadow')
363
+ return;
364
+ }
365
+ if (state.kind === 'tiny-orphan-wal') {
366
+ try {
367
+ await quarantineWalForMissingShadow(dbPath, {
368
+ logger: options.logger,
369
+ level: 'debug',
370
+ reason: `post-close tiny orphan WAL (${state.walBytes} bytes)`,
371
+ });
372
+ }
373
+ catch (err) {
374
+ if (!missing(err)) {
375
+ warnOnce(options.logger, `${dbPath}:post-close-tiny-quarantine-failed`, `GitNexus: failed to quarantine tiny orphan WAL after close (${err.message}); next read may recover reactively.`);
376
+ }
377
+ }
378
+ return;
379
+ }
380
+ if (state.kind === 'orphan-wal') {
381
+ warnOnce(options.logger, `${dbPath}:post-close-orphan-wal`, `GitNexus: lbug.wal (${state.walBytes} bytes) remains without lbug.shadow after close; ` +
382
+ 'keeping it for recovery. If this repeats, run `cgraph analyze --force --index-only` or the sidecar repair command.');
383
+ }
384
+ }
385
+ /**
386
+ * Corrected parking-failure warning (tri-review 4669518496 P2-3). The old
387
+ * text promised "the rebuild will wipe it in place instead" — false: the
388
+ * recovery run's pre-wipe DB open would replay the poisoned WAL and die
389
+ * before any wipe could happen. Mirrors {@link renameFailureMessage}'s
390
+ * EBUSY/EPERM framing via the shared {@link lbugLockRemediation} copy
391
+ * (FIX 7): the problem is environmental (file lock, AV), not data
392
+ * integrity — fix the lock and re-run.
393
+ */
394
+ const sidecarParkRefusedWarning = (from, err) => `Warning: could not park or remove ${path_1.default.basename(from)} before the recovery rebuild ` +
395
+ `(${err instanceof Error ? err.message : String(err)}). Another process likely holds an ` +
396
+ `open handle on it — ${(0, exports.lbugLockRemediation)()}.`;
397
+ /**
398
+ * The sidecar family parked by {@link quarantineSidecarsForDirtyRecovery}
399
+ * and enumerated by {@link listParkedDirtyRecoverySidecars} — one shared
400
+ * roster so the park and clean surfaces cannot drift apart (tri-review
401
+ * 4669518496 P2-7).
402
+ */
403
+ const DIRTY_RECOVERY_SIDECAR_SUFFIXES = ['.wal', '.shadow'];
404
+ /**
405
+ * Every fixed name the dirty-recovery park can leave beside `dbPath`: the
406
+ * two `.dirty-recovery` destinations PLUS their `.next` probe residues
407
+ * (this shipping review, FIX 5 — the residue used to be invisible to every
408
+ * cleanup surface while the docs said "remove manually"). Single roster
409
+ * authority for {@link listParkedDirtyRecoverySidecars}.
410
+ */
411
+ const dirtyRecoveryParkedNames = (dbPath) => DIRTY_RECOVERY_SIDECAR_SUFFIXES.flatMap((suffix) => [
412
+ `${dbPath}${suffix}.dirty-recovery`,
413
+ `${dbPath}${suffix}.dirty-recovery.next`,
414
+ ]);
415
+ /**
416
+ * Move the WAL/shadow sidecars aside before a dirty-flag recovery rebuild
417
+ * (#2409 defect 2).
418
+ *
419
+ * When `incrementalInProgress` forces a full rebuild, the previous run
420
+ * died mid-writeback — its WAL can be poisoned in a way that natively
421
+ * kills the process on replay. The recovery run used to open the DB
422
+ * BEFORE the rebuild wipe (the embedding-cache preservation open), replay
423
+ * the poisoned WAL, and die on the spot — so recovery never happened and
424
+ * only a manual rename-aside of the index dir escaped the loop. The
425
+ * rebuild discards every pending WAL byte anyway (the DB files are wiped),
426
+ * so parking the sidecars first costs nothing and makes every subsequent
427
+ * open replay-free.
428
+ *
429
+ * Renamed when possible, so the bytes stay available for post-mortem
430
+ * debugging — and, like {@link quarantineWalForMissingShadow}'s quarantine
431
+ * files, the parked copies are surfaced and removable by
432
+ * `cgraph clean --lbug-sidecars` (tri-review 4669518496 P2-7; before
433
+ * that, this comment claimed a "same philosophy" parity while the
434
+ * dirty-recovery files were invisible to every cleanup surface). Real
435
+ * lifecycle: the destinations are FIXED names — no timestamp, see
436
+ * {@link listParkedDirtyRecoverySidecars} — so each new crash overwrites
437
+ * the previous parked copy, capping accumulation at one file per sidecar;
438
+ * remove them via `clean --lbug-sidecars` or manually once their
439
+ * post-mortem value has passed.
440
+ *
441
+ * Escalation ladder per suffix (this shipping review, FIX 1 — replacing
442
+ * the drop-shape design, whose park had ZERO retry while the wipe path
443
+ * retried the very same lock class):
444
+ *
445
+ * 1. `rename(from, to)` retried over the shared handle-release budget
446
+ * (HANDLE_RELEASE_PROBE_ATTEMPTS × linear HANDLE_RELEASE_PROBE_DELAY_MS,
447
+ * lbug-config.ts) — a transient AV/handle-lag EBUSY must not cost the
448
+ * run anything.
449
+ * 2. Structural confirm probe: a bare "does `to` exist?" check cannot
450
+ * discriminate a Windows rename-onto-existing collision from a locked
451
+ * source that happens to have a leftover parked copy. Renaming the
452
+ * source to the collision-free `${to}.next` can — success proves the
453
+ * failure was the collision, so the stale copy is replaced (newest
454
+ * forensics win). The crash window between the `rm(to)` and the final
455
+ * promote rename strands the bytes at `.next` — acceptable: `.next`
456
+ * residues are enumerated by the dirty-recovery lister and removed by
457
+ * `clean --lbug-sidecars` (FIX 5). Never pre-delete the previous
458
+ * crash's parked copy on the bet that a rename will then succeed
459
+ * (tri-review 4669518496 P2-3: the old rm-first shape destroyed the
460
+ * prior forensics exactly when the source was locked and nothing
461
+ * replaced them).
462
+ * 3. rm-fallback: the source itself is locked for RENAME, but Windows
463
+ * lets some holders' files be unlink-marked — retry
464
+ * `rm(from, {force:true})` over the same budget and require the file
465
+ * verifiably GONE. Success eliminates the replay risk at the cost of
466
+ * the post-mortem forensics (logged exactly so).
467
+ * 4. Report in `failed` with the corrected lock guidance — the caller
468
+ * must abort (run-analyze throws a LbugWipeError in seconds instead
469
+ * of running the whole pipeline and dying at the wipe on the same
470
+ * handle).
471
+ *
472
+ * Per-suffix isolation: a `.wal` failure never skips the `.shadow`
473
+ * attempt.
474
+ *
475
+ * INVARIANT: after this function returns, either no original sidecar
476
+ * remains adjacent to the DB — every entry is in `moved` or `removed`, so
477
+ * every subsequent open this run performs is replay-free — or the entry is
478
+ * in `failed` and the caller MUST abort before any DB open.
479
+ *
480
+ * @returns `moved` — destination paths now holding the parked bytes;
481
+ * `removed` — source sidecars whose bytes are GONE (forensics lost, replay
482
+ * risk eliminated); `failed` — source sidecars still in place: a
483
+ * possibly-poisoned sidecar sits next to the DB and any pre-wipe open
484
+ * would replay it and die (there is no "wipe it in place" fallback).
485
+ */
486
+ async function quarantineSidecarsForDirtyRecovery(dbPath, log) {
487
+ const moved = [];
488
+ const removed = [];
489
+ const failed = [];
490
+ for (const suffix of DIRTY_RECOVERY_SIDECAR_SUFFIXES) {
491
+ const from = `${dbPath}${suffix}`;
492
+ const to = `${from}.dirty-recovery`;
493
+ try {
494
+ if (!(await (0, exports.statIfExists)(from)))
495
+ continue;
496
+ }
497
+ catch (err) {
498
+ // Non-ENOENT stat failure (EPERM/EBUSY class — statIfExists swallows
499
+ // ENOENT itself): assume the sidecar exists and is unreachable; the
500
+ // caller must fail safe.
501
+ failed.push(from);
502
+ log(sidecarParkRefusedWarning(from, err));
503
+ continue;
504
+ }
505
+ // 1. Rename, retried over the shared handle-release budget for the
506
+ // transient lock class only (EACCES/EPERM/EBUSY — an AV scan or
507
+ // handle-release lag clears within it; a structural failure like
508
+ // EEXIST goes straight to the confirm probe).
509
+ let outcome = 'rename-failed';
510
+ let renameErr;
511
+ for (let attempt = 1; attempt <= lbug_config_js_1.HANDLE_RELEASE_PROBE_ATTEMPTS; attempt++) {
512
+ try {
513
+ await promises_1.default.rename(from, to);
514
+ outcome = 'moved';
515
+ break;
516
+ }
517
+ catch (err) {
518
+ if (missing(err)) {
519
+ outcome = 'raced'; // source raced away between stat and rename
520
+ break;
521
+ }
522
+ renameErr = err;
523
+ if (!(0, exports.isPermissionRenameError)(err) || attempt === lbug_config_js_1.HANDLE_RELEASE_PROBE_ATTEMPTS)
524
+ break;
525
+ await (0, lbug_config_js_1.sleep)(lbug_config_js_1.HANDLE_RELEASE_PROBE_DELAY_MS * attempt);
526
+ }
527
+ }
528
+ if (outcome === 'moved') {
529
+ moved.push(to);
530
+ continue;
531
+ }
532
+ if (outcome === 'raced')
533
+ continue;
534
+ // 2. Structural confirm probe (see TSDoc step 2).
535
+ const probe = `${to}.next`;
536
+ let probeLanded = false;
537
+ try {
538
+ await promises_1.default.rename(from, probe);
539
+ probeLanded = true;
540
+ }
541
+ catch (probeErr) {
542
+ if (missing(probeErr))
543
+ continue; // source raced away mid-probe
544
+ // Source locked for rename — fall through to the rm-fallback below.
545
+ }
546
+ if (probeLanded) {
547
+ try {
548
+ // True collision — replace the stale parked copy: newest forensics win.
549
+ await promises_1.default.rm(to, { force: true });
550
+ await promises_1.default.rename(probe, to);
551
+ moved.push(to);
552
+ }
553
+ catch {
554
+ // Double failure: the stale copy is itself locked/undeletable. The
555
+ // interrupted run's sidecar is already out of the replay path at the
556
+ // probe name, so the recovery open stays safe — keep both files.
557
+ moved.push(probe);
558
+ log(`Warning: parked ${path_1.default.basename(from)} as ${path_1.default.basename(probe)} — the stale ` +
559
+ `${path_1.default.basename(to)} from an earlier crash is locked and could not be replaced.`);
560
+ }
561
+ continue;
562
+ }
563
+ // 3. rm-fallback, retried over the same budget. `force: true` swallows
564
+ // ENOENT, so a resolving rm proves nothing on Windows (delete-pending
565
+ // keeps the name visible) — only a verifiably-absent file counts.
566
+ let removedOk = false;
567
+ for (let attempt = 1; attempt <= lbug_config_js_1.HANDLE_RELEASE_PROBE_ATTEMPTS; attempt++) {
568
+ try {
569
+ await promises_1.default.rm(from, { force: true });
570
+ }
571
+ catch {
572
+ /* verified below — the absence probe is authoritative */
573
+ }
574
+ let stillPresent = true;
575
+ try {
576
+ stillPresent = (await (0, exports.statIfExists)(from)) !== null;
577
+ }
578
+ catch {
579
+ // Non-ENOENT stat failure: not verifiably gone — keep retrying.
580
+ }
581
+ if (!stillPresent) {
582
+ removedOk = true;
583
+ break;
584
+ }
585
+ if (attempt < lbug_config_js_1.HANDLE_RELEASE_PROBE_ATTEMPTS) {
586
+ await (0, lbug_config_js_1.sleep)(lbug_config_js_1.HANDLE_RELEASE_PROBE_DELAY_MS * attempt);
587
+ }
588
+ }
589
+ if (removedOk) {
590
+ removed.push(from);
591
+ log(`Removed ${path_1.default.basename(from)} from the interrupted run — it could not be parked ` +
592
+ 'aside (rename locked), so its bytes were deleted instead: post-mortem forensics ' +
593
+ 'are lost, but the replay risk is eliminated and recovery can proceed.');
594
+ continue;
595
+ }
596
+ // 4. Everything failed — the poisoned bytes still sit next to the DB.
597
+ failed.push(from);
598
+ log(sidecarParkRefusedWarning(from, renameErr));
599
+ }
600
+ if (moved.length > 0) {
601
+ log(`Parked ${moved.map((p) => path_1.default.basename(p)).join(', ')} from the interrupted run ` +
602
+ 'so the recovery rebuild opens without replaying it.');
603
+ }
604
+ return { moved, removed, failed };
605
+ }
606
+ async function listQuarantinedMissingShadowWals(dbPath) {
607
+ const dir = path_1.default.dirname(dbPath);
608
+ const base = path_1.default.basename(dbPath);
609
+ let entries;
610
+ try {
611
+ entries = await promises_1.default.readdir(dir);
612
+ }
613
+ catch (err) {
614
+ if (missing(err))
615
+ return [];
616
+ throw err;
617
+ }
618
+ return entries
619
+ .filter((entry) => entry.startsWith(`${base}.wal.missing-shadow.`))
620
+ .map((entry) => path_1.default.join(dir, entry))
621
+ .sort();
622
+ }
623
+ /**
624
+ * Shared unlink walker for the parked-sidecar cleaners (this shipping
625
+ * review, FIX 5). Per-file error policy: ENOENT is skipped silently (a
626
+ * list→delete race means the file is already gone — the desired state);
627
+ * EBUSY/EPERM/anything else lands in `failed` and the walk CONTINUES —
628
+ * the old per-family cleaners threw on the first locked file, crashing
629
+ * the whole clean mid-command after a partial deletion.
630
+ */
631
+ const unlinkParkedFiles = async (files) => {
632
+ const deleted = [];
633
+ const failed = [];
634
+ for (const file of files) {
635
+ try {
636
+ await promises_1.default.unlink(file);
637
+ deleted.push(file);
638
+ }
639
+ catch (err) {
640
+ if (missing(err))
641
+ continue;
642
+ failed.push(file);
643
+ }
644
+ }
645
+ return { deleted, failed };
646
+ };
647
+ /**
648
+ * Delete the missing-shadow WAL quarantines for `dbPath` and return the
649
+ * deleted paths. Locked files are skipped, not thrown (FIX 5) — user-facing
650
+ * surfaces should call {@link cleanParkedLbugSidecars}, which also REPORTS
651
+ * the skipped files.
652
+ */
653
+ async function cleanQuarantinedMissingShadowWals(dbPath) {
654
+ return (await unlinkParkedFiles(await listQuarantinedMissingShadowWals(dbPath))).deleted;
655
+ }
656
+ /**
657
+ * List the `.dirty-recovery` sidecars parked beside `dbPath` by
658
+ * {@link quarantineSidecarsForDirtyRecovery}, so `cgraph clean
659
+ * --lbug-sidecars` can surface them next to the missing-shadow quarantines
660
+ * (tri-review 4669518496 P2-7 — they were previously invisible to every
661
+ * cleanup surface). Only fixed names can exist (see
662
+ * {@link dirtyRecoveryParkedNames}: `<dbPath>.wal.dirty-recovery`,
663
+ * `<dbPath>.shadow.dirty-recovery`, and their `.next` probe residues from a
664
+ * double park failure — enumerated since FIX 5 of this shipping review; the
665
+ * docs used to say "remove manually" while no surface even listed them), so
666
+ * this stats them directly instead of prefix-scanning the directory the way
667
+ * the timestamped missing-shadow lister must.
668
+ *
669
+ * Returns existing parked files as sorted absolute paths. Branch-scoped
670
+ * index slots (`branches/<slug>/`) are outside `clean.ts`'s flat-path
671
+ * resolution — the same documented limitation as the missing-shadow pair.
672
+ */
673
+ async function listParkedDirtyRecoverySidecars(dbPath) {
674
+ const present = [];
675
+ for (const parked of dirtyRecoveryParkedNames(dbPath)) {
676
+ if (await (0, exports.statIfExists)(parked))
677
+ present.push(parked);
678
+ }
679
+ return present.sort();
680
+ }
681
+ /**
682
+ * Delete the `.dirty-recovery` parked sidecars for `dbPath` and return the
683
+ * deleted paths. Sibling of {@link cleanQuarantinedMissingShadowWals}; same
684
+ * skip-not-throw policy (FIX 5) — user-facing surfaces should call
685
+ * {@link cleanParkedLbugSidecars}, which also reports locked files.
686
+ */
687
+ async function cleanParkedDirtyRecoverySidecars(dbPath) {
688
+ return (await unlinkParkedFiles(await listParkedDirtyRecoverySidecars(dbPath))).deleted;
689
+ }
690
+ /**
691
+ * Aggregate roster of every parked/quarantined sidecar family beside
692
+ * `dbPath` (this shipping review, FIX 5): the timestamped missing-shadow
693
+ * WAL quarantines plus the fixed-name dirty-recovery parks (`.next`
694
+ * residues included). Single roster authority for `clean --lbug-sidecars`
695
+ * — the command previously concatenated the families inline in two places,
696
+ * which is how the `.next` residue stayed invisible.
697
+ */
698
+ async function listParkedLbugSidecars(dbPath) {
699
+ return [
700
+ ...(await listQuarantinedMissingShadowWals(dbPath)),
701
+ ...(await listParkedDirtyRecoverySidecars(dbPath)),
702
+ ];
703
+ }
704
+ /**
705
+ * Delete every file {@link listParkedLbugSidecars} enumerates. Per-file
706
+ * error policy via {@link unlinkParkedFiles}: ENOENT skipped silently,
707
+ * locked files collected into `failed` while the rest are still deleted —
708
+ * a locked parked file must not crash the whole clean mid-command.
709
+ */
710
+ async function cleanParkedLbugSidecars(dbPath) {
711
+ return unlinkParkedFiles(await listParkedLbugSidecars(dbPath));
712
+ }
713
+ const _resetSidecarRecoveryWarningsForTest = () => {
714
+ warnedKeyCounts.clear();
715
+ };
716
+ exports._resetSidecarRecoveryWarningsForTest = _resetSidecarRecoveryWarningsForTest;