cgraphx 2.0.1 → 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 (701) hide show
  1. package/dist/.claude-template/FLOW-MAP.md +7 -5
  2. package/dist/.claude-template/commands/end.md +1 -1
  3. package/dist/.claude-template/skills/cgraphx-guide/SKILL.md +2 -1
  4. package/dist/.claude-template/skills/cgraphx-guide/how-to-use.html +4 -2
  5. package/dist/.claude-template/skills/cgraphx-guide/how-to-use.md +5 -2
  6. package/dist/.claude-template/skills/iboc-check/SKILL.md +116 -0
  7. package/dist/.claude-template/skills/iboc-check/filler-prompt.md +75 -0
  8. package/dist/.claude-template/skills/implementation/SKILL.md +7 -0
  9. package/dist/.claude-template/skills/init-project-guides/SKILL.md +1 -1
  10. package/dist/.claude-template/skills/run-api-test/references/db-verification.md +2 -2
  11. package/dist/.claude-template/skills/subagent-implement/SKILL.md +3 -2
  12. package/dist/.claude-template/skills/write-api/assets/template-request.bru +3 -3
  13. package/dist/.claude-template/skills/write-api/references/bru-format.md +6 -6
  14. package/dist/.claude-template/skills/write-delivery-guide/SKILL.md +97 -0
  15. package/dist/.claude-template/skills/write-delivery-guide/template-change-type.md +120 -0
  16. package/dist/.claude-template/skills/write-delivery-guide/template-multi-role-flow.md +148 -0
  17. package/dist/.claude-template/skills/write-unit-test-code/SKILL.md +23 -6
  18. package/dist/core/code/engine/cli/analyze-config.js +320 -0
  19. package/dist/core/code/engine/cli/analyze.js +1086 -0
  20. package/dist/core/code/engine/cli/cli-message.js +83 -0
  21. package/dist/core/code/engine/cli/detect-changes-format.js +58 -0
  22. package/dist/core/code/engine/cli/embedding-dims.js +43 -0
  23. package/dist/core/code/engine/cli/format-elapsed.js +12 -0
  24. package/dist/core/code/engine/cli/help-i18n.js +144 -0
  25. package/dist/core/code/engine/cli/i18n/en.js +110 -0
  26. package/dist/core/code/engine/cli/i18n/index.js +47 -0
  27. package/dist/core/code/engine/cli/i18n/resources.js +9 -0
  28. package/dist/core/code/engine/cli/i18n/zh-CN.js +110 -0
  29. package/dist/core/code/engine/cli/lazy-action.js +67 -0
  30. package/dist/core/code/engine/cli/optional-grammars.js +136 -0
  31. package/dist/core/code/engine/cli/resolve-invocation.js +76 -0
  32. package/dist/core/code/engine/cli/status.js +156 -0
  33. package/dist/core/code/engine/cli/tool.js +384 -0
  34. package/dist/core/code/engine/config/ignore-service.js +511 -0
  35. package/dist/core/code/engine/config/supported-languages.js +17 -0
  36. package/dist/core/code/engine/core/analysis-features.js +64 -0
  37. package/dist/core/code/engine/core/analyzer-identity.js +2171 -0
  38. package/dist/core/code/engine/core/git-staleness.js +180 -0
  39. package/dist/core/code/engine/core/graph/graph.js +180 -0
  40. package/dist/core/code/engine/core/graph/import-cycles.js +106 -0
  41. package/dist/core/code/engine/core/graph/types.js +2 -0
  42. package/dist/core/code/engine/core/index-freshness.js +12 -0
  43. package/dist/core/code/engine/core/ingestion/binding-accumulator.js +341 -0
  44. package/dist/core/code/engine/core/ingestion/call-extractors/configs/c-cpp.js +168 -0
  45. package/dist/core/code/engine/core/ingestion/call-extractors/configs/csharp.js +9 -0
  46. package/dist/core/code/engine/core/ingestion/call-extractors/configs/dart.js +8 -0
  47. package/dist/core/code/engine/core/ingestion/call-extractors/configs/go.js +8 -0
  48. package/dist/core/code/engine/core/ingestion/call-extractors/configs/jvm.js +54 -0
  49. package/dist/core/code/engine/core/ingestion/call-extractors/configs/php.js +8 -0
  50. package/dist/core/code/engine/core/ingestion/call-extractors/configs/python.js +8 -0
  51. package/dist/core/code/engine/core/ingestion/call-extractors/configs/ruby.js +8 -0
  52. package/dist/core/code/engine/core/ingestion/call-extractors/configs/rust.js +8 -0
  53. package/dist/core/code/engine/core/ingestion/call-extractors/configs/swift.js +8 -0
  54. package/dist/core/code/engine/core/ingestion/call-extractors/configs/typescript-javascript.js +11 -0
  55. package/dist/core/code/engine/core/ingestion/call-extractors/generic.js +62 -0
  56. package/dist/core/code/engine/core/ingestion/call-processor.js +503 -0
  57. package/dist/core/code/engine/core/ingestion/call-routing.js +98 -0
  58. package/dist/core/code/engine/core/ingestion/call-types.js +3 -0
  59. package/dist/core/code/engine/core/ingestion/cfg/callee-cell-format.js +45 -0
  60. package/dist/core/code/engine/core/ingestion/cfg/cfg-builder.js +202 -0
  61. package/dist/core/code/engine/core/ingestion/cfg/collect.js +81 -0
  62. package/dist/core/code/engine/core/ingestion/cfg/control-dependence.js +185 -0
  63. package/dist/core/code/engine/core/ingestion/cfg/control-flow-context.js +130 -0
  64. package/dist/core/code/engine/core/ingestion/cfg/emit.js +646 -0
  65. package/dist/core/code/engine/core/ingestion/cfg/post-dominators.js +182 -0
  66. package/dist/core/code/engine/core/ingestion/cfg/reaching-def-reason-codec.js +139 -0
  67. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs-graph.js +322 -0
  68. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs.js +792 -0
  69. package/dist/core/code/engine/core/ingestion/cfg/synthetic-escape.js +305 -0
  70. package/dist/core/code/engine/core/ingestion/cfg/traversal-result.js +6 -0
  71. package/dist/core/code/engine/core/ingestion/cfg/types.js +14 -0
  72. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp-harvest.js +545 -0
  73. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp.js +590 -0
  74. package/dist/core/code/engine/core/ingestion/cfg/visitors/call-site-harvest.js +356 -0
  75. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp-harvest.js +593 -0
  76. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp.js +871 -0
  77. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart-harvest.js +874 -0
  78. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart.js +840 -0
  79. package/dist/core/code/engine/core/ingestion/cfg/visitors/go-harvest.js +625 -0
  80. package/dist/core/code/engine/core/ingestion/cfg/visitors/go.js +642 -0
  81. package/dist/core/code/engine/core/ingestion/cfg/visitors/java-harvest.js +517 -0
  82. package/dist/core/code/engine/core/ingestion/cfg/visitors/java.js +816 -0
  83. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin-harvest.js +723 -0
  84. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin.js +813 -0
  85. package/dist/core/code/engine/core/ingestion/cfg/visitors/php-harvest.js +630 -0
  86. package/dist/core/code/engine/core/ingestion/cfg/visitors/php.js +725 -0
  87. package/dist/core/code/engine/core/ingestion/cfg/visitors/python-harvest.js +776 -0
  88. package/dist/core/code/engine/core/ingestion/cfg/visitors/python.js +562 -0
  89. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby-harvest.js +591 -0
  90. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby.js +760 -0
  91. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust-harvest.js +877 -0
  92. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust.js +562 -0
  93. package/dist/core/code/engine/core/ingestion/cfg/visitors/scope-tree-harvest.js +120 -0
  94. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift-harvest.js +683 -0
  95. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift.js +791 -0
  96. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript-harvest.js +1060 -0
  97. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript.js +587 -0
  98. package/dist/core/code/engine/core/ingestion/class-extractors/configs/c-cpp.js +77 -0
  99. package/dist/core/code/engine/core/ingestion/class-extractors/configs/csharp.js +24 -0
  100. package/dist/core/code/engine/core/ingestion/class-extractors/configs/dart.js +10 -0
  101. package/dist/core/code/engine/core/ingestion/class-extractors/configs/go.js +28 -0
  102. package/dist/core/code/engine/core/ingestion/class-extractors/configs/jvm.js +67 -0
  103. package/dist/core/code/engine/core/ingestion/class-extractors/configs/php.js +10 -0
  104. package/dist/core/code/engine/core/ingestion/class-extractors/configs/python.js +10 -0
  105. package/dist/core/code/engine/core/ingestion/class-extractors/configs/ruby.js +13 -0
  106. package/dist/core/code/engine/core/ingestion/class-extractors/configs/rust.js +10 -0
  107. package/dist/core/code/engine/core/ingestion/class-extractors/configs/swift.js +21 -0
  108. package/dist/core/code/engine/core/ingestion/class-extractors/configs/typescript-javascript.js +31 -0
  109. package/dist/core/code/engine/core/ingestion/class-extractors/generic.js +144 -0
  110. package/dist/core/code/engine/core/ingestion/class-types.js +2 -0
  111. package/dist/core/code/engine/core/ingestion/cluster-enricher.js +174 -0
  112. package/dist/core/code/engine/core/ingestion/community-processor.js +604 -0
  113. package/dist/core/code/engine/core/ingestion/constants.js +26 -0
  114. package/dist/core/code/engine/core/ingestion/cpp-ue-preprocessor.js +263 -0
  115. package/dist/core/code/engine/core/ingestion/csharp-namespace-gate.js +133 -0
  116. package/dist/core/code/engine/core/ingestion/di-extractors/index.js +38 -0
  117. package/dist/core/code/engine/core/ingestion/di-extractors/spring.js +310 -0
  118. package/dist/core/code/engine/core/ingestion/emit-references.js +244 -0
  119. package/dist/core/code/engine/core/ingestion/entry-point-scoring.js +201 -0
  120. package/dist/core/code/engine/core/ingestion/export-detection.js +244 -0
  121. package/dist/core/code/engine/core/ingestion/field-extractor.js +29 -0
  122. package/dist/core/code/engine/core/ingestion/field-extractors/configs/c-cpp.js +107 -0
  123. package/dist/core/code/engine/core/ingestion/field-extractors/configs/csharp.js +124 -0
  124. package/dist/core/code/engine/core/ingestion/field-extractors/configs/dart.js +99 -0
  125. package/dist/core/code/engine/core/ingestion/field-extractors/configs/go.js +102 -0
  126. package/dist/core/code/engine/core/ingestion/field-extractors/configs/helpers.js +198 -0
  127. package/dist/core/code/engine/core/ingestion/field-extractors/configs/jvm.js +172 -0
  128. package/dist/core/code/engine/core/ingestion/field-extractors/configs/php.js +67 -0
  129. package/dist/core/code/engine/core/ingestion/field-extractors/configs/python.js +94 -0
  130. package/dist/core/code/engine/core/ingestion/field-extractors/configs/ruby.js +79 -0
  131. package/dist/core/code/engine/core/ingestion/field-extractors/configs/rust.js +55 -0
  132. package/dist/core/code/engine/core/ingestion/field-extractors/configs/swift.js +93 -0
  133. package/dist/core/code/engine/core/ingestion/field-extractors/configs/typescript-javascript.js +59 -0
  134. package/dist/core/code/engine/core/ingestion/field-extractors/generic.js +147 -0
  135. package/dist/core/code/engine/core/ingestion/field-extractors/typescript.js +266 -0
  136. package/dist/core/code/engine/core/ingestion/field-types.js +3 -0
  137. package/dist/core/code/engine/core/ingestion/filesystem-walker.js +136 -0
  138. package/dist/core/code/engine/core/ingestion/finalize-orchestrator.js +159 -0
  139. package/dist/core/code/engine/core/ingestion/framework-detection.js +432 -0
  140. package/dist/core/code/engine/core/ingestion/frameworks/spring/analysis-features.js +38 -0
  141. package/dist/core/code/engine/core/ingestion/frameworks/spring/annotation-arguments.js +234 -0
  142. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop-candidates.js +88 -0
  143. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop.js +487 -0
  144. package/dist/core/code/engine/core/ingestion/frameworks/spring/auto-configuration.js +21 -0
  145. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-candidates.js +189 -0
  146. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-catalog.js +32 -0
  147. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-factories.js +73 -0
  148. package/dist/core/code/engine/core/ingestion/frameworks/spring/conditionals.js +323 -0
  149. package/dist/core/code/engine/core/ingestion/frameworks/spring/config-bindings.js +119 -0
  150. package/dist/core/code/engine/core/ingestion/frameworks/spring/di-metadata.js +385 -0
  151. package/dist/core/code/engine/core/ingestion/frameworks/spring/resource-injection.js +96 -0
  152. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/c-cpp.js +17 -0
  153. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/csharp.js +46 -0
  154. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/dart.js +59 -0
  155. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/go.js +30 -0
  156. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/jvm.js +73 -0
  157. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/php.js +19 -0
  158. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/python.js +45 -0
  159. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/ruby.js +20 -0
  160. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/rust.js +58 -0
  161. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/swift.js +94 -0
  162. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/typescript-javascript.js +26 -0
  163. package/dist/core/code/engine/core/ingestion/import-resolvers/csharp.js +128 -0
  164. package/dist/core/code/engine/core/ingestion/import-resolvers/go.js +50 -0
  165. package/dist/core/code/engine/core/ingestion/import-resolvers/jvm.js +112 -0
  166. package/dist/core/code/engine/core/ingestion/import-resolvers/php.js +80 -0
  167. package/dist/core/code/engine/core/ingestion/import-resolvers/python.js +75 -0
  168. package/dist/core/code/engine/core/ingestion/import-resolvers/resolver-factory.js +36 -0
  169. package/dist/core/code/engine/core/ingestion/import-resolvers/ruby.js +20 -0
  170. package/dist/core/code/engine/core/ingestion/import-resolvers/rust.js +79 -0
  171. package/dist/core/code/engine/core/ingestion/import-resolvers/standard.js +180 -0
  172. package/dist/core/code/engine/core/ingestion/import-resolvers/types.js +7 -0
  173. package/dist/core/code/engine/core/ingestion/import-resolvers/utils.js +153 -0
  174. package/dist/core/code/engine/core/ingestion/import-target-adapter.js +99 -0
  175. package/dist/core/code/engine/core/ingestion/language-config.js +391 -0
  176. package/dist/core/code/engine/core/ingestion/language-provider.js +25 -0
  177. package/dist/core/code/engine/core/ingestion/languages/c/arity-metadata.js +98 -0
  178. package/dist/core/code/engine/core/ingestion/languages/c/arity.js +21 -0
  179. package/dist/core/code/engine/core/ingestion/languages/c/capture-side-channel.js +69 -0
  180. package/dist/core/code/engine/core/ingestion/languages/c/captures.js +189 -0
  181. package/dist/core/code/engine/core/ingestion/languages/c/header-scan.js +58 -0
  182. package/dist/core/code/engine/core/ingestion/languages/c/import-decomposer.js +68 -0
  183. package/dist/core/code/engine/core/ingestion/languages/c/import-target.js +103 -0
  184. package/dist/core/code/engine/core/ingestion/languages/c/index.js +33 -0
  185. package/dist/core/code/engine/core/ingestion/languages/c/interpret.js +53 -0
  186. package/dist/core/code/engine/core/ingestion/languages/c/merge-bindings.js +26 -0
  187. package/dist/core/code/engine/core/ingestion/languages/c/query.js +210 -0
  188. package/dist/core/code/engine/core/ingestion/languages/c/scope-resolver.js +112 -0
  189. package/dist/core/code/engine/core/ingestion/languages/c/simple-hooks.js +24 -0
  190. package/dist/core/code/engine/core/ingestion/languages/c/static-linkage.js +109 -0
  191. package/dist/core/code/engine/core/ingestion/languages/c-cpp.js +506 -0
  192. package/dist/core/code/engine/core/ingestion/languages/cpp/adl.js +804 -0
  193. package/dist/core/code/engine/core/ingestion/languages/cpp/arity-metadata.js +258 -0
  194. package/dist/core/code/engine/core/ingestion/languages/cpp/arity.js +37 -0
  195. package/dist/core/code/engine/core/ingestion/languages/cpp/capture-side-channel.js +89 -0
  196. package/dist/core/code/engine/core/ingestion/languages/cpp/captures.js +1975 -0
  197. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-extractor.js +311 -0
  198. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-filter.js +210 -0
  199. package/dist/core/code/engine/core/ingestion/languages/cpp/conversion-rank.js +163 -0
  200. package/dist/core/code/engine/core/ingestion/languages/cpp/file-local-linkage.js +327 -0
  201. package/dist/core/code/engine/core/ingestion/languages/cpp/header-scan.js +53 -0
  202. package/dist/core/code/engine/core/ingestion/languages/cpp/import-decomposer.js +134 -0
  203. package/dist/core/code/engine/core/ingestion/languages/cpp/import-target.js +16 -0
  204. package/dist/core/code/engine/core/ingestion/languages/cpp/index.js +33 -0
  205. package/dist/core/code/engine/core/ingestion/languages/cpp/inline-namespaces.js +379 -0
  206. package/dist/core/code/engine/core/ingestion/languages/cpp/interpret.js +239 -0
  207. package/dist/core/code/engine/core/ingestion/languages/cpp/member-lookup.js +470 -0
  208. package/dist/core/code/engine/core/ingestion/languages/cpp/merge-bindings.js +32 -0
  209. package/dist/core/code/engine/core/ingestion/languages/cpp/query.js +763 -0
  210. package/dist/core/code/engine/core/ingestion/languages/cpp/range-bindings.js +230 -0
  211. package/dist/core/code/engine/core/ingestion/languages/cpp/scope-resolver.js +354 -0
  212. package/dist/core/code/engine/core/ingestion/languages/cpp/simple-hooks.js +67 -0
  213. package/dist/core/code/engine/core/ingestion/languages/cpp/two-phase-lookup.js +348 -0
  214. package/dist/core/code/engine/core/ingestion/languages/cpp/type-classifier.js +56 -0
  215. package/dist/core/code/engine/core/ingestion/languages/cpp/user-defined-conversions.js +128 -0
  216. package/dist/core/code/engine/core/ingestion/languages/csharp/accessor-unwrap.js +67 -0
  217. package/dist/core/code/engine/core/ingestion/languages/csharp/arity-metadata.js +49 -0
  218. package/dist/core/code/engine/core/ingestion/languages/csharp/arity.js +40 -0
  219. package/dist/core/code/engine/core/ingestion/languages/csharp/cache-stats.js +32 -0
  220. package/dist/core/code/engine/core/ingestion/languages/csharp/captures.js +557 -0
  221. package/dist/core/code/engine/core/ingestion/languages/csharp/import-decomposer.js +96 -0
  222. package/dist/core/code/engine/core/ingestion/languages/csharp/import-target.js +176 -0
  223. package/dist/core/code/engine/core/ingestion/languages/csharp/index.js +95 -0
  224. package/dist/core/code/engine/core/ingestion/languages/csharp/interpret.js +150 -0
  225. package/dist/core/code/engine/core/ingestion/languages/csharp/merge-bindings.js +58 -0
  226. package/dist/core/code/engine/core/ingestion/languages/csharp/namespace-siblings.js +708 -0
  227. package/dist/core/code/engine/core/ingestion/languages/csharp/qualified-type-names.js +62 -0
  228. package/dist/core/code/engine/core/ingestion/languages/csharp/query.js +578 -0
  229. package/dist/core/code/engine/core/ingestion/languages/csharp/receiver-binding.js +142 -0
  230. package/dist/core/code/engine/core/ingestion/languages/csharp/resolution-config.js +18 -0
  231. package/dist/core/code/engine/core/ingestion/languages/csharp/scope-resolver.js +84 -0
  232. package/dist/core/code/engine/core/ingestion/languages/csharp/simple-hooks.js +81 -0
  233. package/dist/core/code/engine/core/ingestion/languages/csharp.js +204 -0
  234. package/dist/core/code/engine/core/ingestion/languages/dart/arity-metadata.js +38 -0
  235. package/dist/core/code/engine/core/ingestion/languages/dart/arity.js +34 -0
  236. package/dist/core/code/engine/core/ingestion/languages/dart/built-ins.js +37 -0
  237. package/dist/core/code/engine/core/ingestion/languages/dart/cache-stats.js +30 -0
  238. package/dist/core/code/engine/core/ingestion/languages/dart/captures.js +1096 -0
  239. package/dist/core/code/engine/core/ingestion/languages/dart/expand-wildcards.js +34 -0
  240. package/dist/core/code/engine/core/ingestion/languages/dart/extension-type-preprocess.js +33 -0
  241. package/dist/core/code/engine/core/ingestion/languages/dart/import-target.js +68 -0
  242. package/dist/core/code/engine/core/ingestion/languages/dart/index.js +45 -0
  243. package/dist/core/code/engine/core/ingestion/languages/dart/interpret.js +101 -0
  244. package/dist/core/code/engine/core/ingestion/languages/dart/merge-bindings.js +42 -0
  245. package/dist/core/code/engine/core/ingestion/languages/dart/query.js +246 -0
  246. package/dist/core/code/engine/core/ingestion/languages/dart/receiver-binding.js +90 -0
  247. package/dist/core/code/engine/core/ingestion/languages/dart/scope-resolver.js +197 -0
  248. package/dist/core/code/engine/core/ingestion/languages/dart/signature-bindings.js +54 -0
  249. package/dist/core/code/engine/core/ingestion/languages/dart/simple-hooks.js +61 -0
  250. package/dist/core/code/engine/core/ingestion/languages/dart.js +138 -0
  251. package/dist/core/code/engine/core/ingestion/languages/go/arity-metadata.js +71 -0
  252. package/dist/core/code/engine/core/ingestion/languages/go/arity.js +17 -0
  253. package/dist/core/code/engine/core/ingestion/languages/go/cache-stats.js +21 -0
  254. package/dist/core/code/engine/core/ingestion/languages/go/captures.js +492 -0
  255. package/dist/core/code/engine/core/ingestion/languages/go/expand-wildcards.js +97 -0
  256. package/dist/core/code/engine/core/ingestion/languages/go/generic-type-parameters.js +146 -0
  257. package/dist/core/code/engine/core/ingestion/languages/go/import-decomposer.js +47 -0
  258. package/dist/core/code/engine/core/ingestion/languages/go/import-target.js +70 -0
  259. package/dist/core/code/engine/core/ingestion/languages/go/index.js +39 -0
  260. package/dist/core/code/engine/core/ingestion/languages/go/interface-impls.js +955 -0
  261. package/dist/core/code/engine/core/ingestion/languages/go/interpret.js +177 -0
  262. package/dist/core/code/engine/core/ingestion/languages/go/merge-bindings.js +21 -0
  263. package/dist/core/code/engine/core/ingestion/languages/go/method-owners.js +131 -0
  264. package/dist/core/code/engine/core/ingestion/languages/go/namespace-mirror.js +56 -0
  265. package/dist/core/code/engine/core/ingestion/languages/go/package-clause.js +79 -0
  266. package/dist/core/code/engine/core/ingestion/languages/go/package-siblings.js +83 -0
  267. package/dist/core/code/engine/core/ingestion/languages/go/query.js +298 -0
  268. package/dist/core/code/engine/core/ingestion/languages/go/range-binding.js +127 -0
  269. package/dist/core/code/engine/core/ingestion/languages/go/receiver-binding.js +24 -0
  270. package/dist/core/code/engine/core/ingestion/languages/go/scope-resolver.js +75 -0
  271. package/dist/core/code/engine/core/ingestion/languages/go/simple-hooks.js +31 -0
  272. package/dist/core/code/engine/core/ingestion/languages/go/type-binding.js +279 -0
  273. package/dist/core/code/engine/core/ingestion/languages/go.js +160 -0
  274. package/dist/core/code/engine/core/ingestion/languages/index.js +66 -0
  275. package/dist/core/code/engine/core/ingestion/languages/java/analysis-features.js +16 -0
  276. package/dist/core/code/engine/core/ingestion/languages/java/arity-metadata.js +43 -0
  277. package/dist/core/code/engine/core/ingestion/languages/java/arity.js +27 -0
  278. package/dist/core/code/engine/core/ingestion/languages/java/cache-stats.js +32 -0
  279. package/dist/core/code/engine/core/ingestion/languages/java/capture-side-channel.js +123 -0
  280. package/dist/core/code/engine/core/ingestion/languages/java/captures.js +791 -0
  281. package/dist/core/code/engine/core/ingestion/languages/java/import-decomposer.js +88 -0
  282. package/dist/core/code/engine/core/ingestion/languages/java/import-target.js +103 -0
  283. package/dist/core/code/engine/core/ingestion/languages/java/index.js +43 -0
  284. package/dist/core/code/engine/core/ingestion/languages/java/interpret.js +146 -0
  285. package/dist/core/code/engine/core/ingestion/languages/java/merge-bindings.js +43 -0
  286. package/dist/core/code/engine/core/ingestion/languages/java/package-facts.js +16 -0
  287. package/dist/core/code/engine/core/ingestion/languages/java/package-siblings.js +11 -0
  288. package/dist/core/code/engine/core/ingestion/languages/java/query.js +319 -0
  289. package/dist/core/code/engine/core/ingestion/languages/java/receiver-binding.js +98 -0
  290. package/dist/core/code/engine/core/ingestion/languages/java/scope-resolver.js +213 -0
  291. package/dist/core/code/engine/core/ingestion/languages/java/simple-hooks.js +39 -0
  292. package/dist/core/code/engine/core/ingestion/languages/java/spring-aop.js +53 -0
  293. package/dist/core/code/engine/core/ingestion/languages/java/spring-bean-metadata.js +11 -0
  294. package/dist/core/code/engine/core/ingestion/languages/java/spring-conditionals.js +52 -0
  295. package/dist/core/code/engine/core/ingestion/languages/java/spring-config-bindings.js +222 -0
  296. package/dist/core/code/engine/core/ingestion/languages/java/spring-di.js +165 -0
  297. package/dist/core/code/engine/core/ingestion/languages/java.js +192 -0
  298. package/dist/core/code/engine/core/ingestion/languages/javascript/arity.js +15 -0
  299. package/dist/core/code/engine/core/ingestion/languages/javascript/captures.js +1122 -0
  300. package/dist/core/code/engine/core/ingestion/languages/javascript/import-target.js +56 -0
  301. package/dist/core/code/engine/core/ingestion/languages/javascript/index.js +109 -0
  302. package/dist/core/code/engine/core/ingestion/languages/javascript/interpret.js +45 -0
  303. package/dist/core/code/engine/core/ingestion/languages/javascript/merge-bindings.js +21 -0
  304. package/dist/core/code/engine/core/ingestion/languages/javascript/query.js +659 -0
  305. package/dist/core/code/engine/core/ingestion/languages/javascript/scope-resolver.js +78 -0
  306. package/dist/core/code/engine/core/ingestion/languages/javascript/simple-hooks.js +44 -0
  307. package/dist/core/code/engine/core/ingestion/languages/jvm/package-facts.js +46 -0
  308. package/dist/core/code/engine/core/ingestion/languages/jvm/package-siblings.js +200 -0
  309. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity-metadata.js +23 -0
  310. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity.js +18 -0
  311. package/dist/core/code/engine/core/ingestion/languages/kotlin/cache-stats.js +21 -0
  312. package/dist/core/code/engine/core/ingestion/languages/kotlin/capture-side-channel.js +160 -0
  313. package/dist/core/code/engine/core/ingestion/languages/kotlin/captures.js +1262 -0
  314. package/dist/core/code/engine/core/ingestion/languages/kotlin/companion-scopes.js +72 -0
  315. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-decomposer.js +40 -0
  316. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-target.js +135 -0
  317. package/dist/core/code/engine/core/ingestion/languages/kotlin/index.js +26 -0
  318. package/dist/core/code/engine/core/ingestion/languages/kotlin/interpret.js +75 -0
  319. package/dist/core/code/engine/core/ingestion/languages/kotlin/merge-bindings.js +28 -0
  320. package/dist/core/code/engine/core/ingestion/languages/kotlin/owners.js +134 -0
  321. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-facts.js +16 -0
  322. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-siblings.js +11 -0
  323. package/dist/core/code/engine/core/ingestion/languages/kotlin/query.js +243 -0
  324. package/dist/core/code/engine/core/ingestion/languages/kotlin/receiver-binding.js +103 -0
  325. package/dist/core/code/engine/core/ingestion/languages/kotlin/scope-resolver.js +207 -0
  326. package/dist/core/code/engine/core/ingestion/languages/kotlin/simple-hooks.js +42 -0
  327. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-aop.js +68 -0
  328. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-bean-metadata.js +11 -0
  329. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-conditionals.js +53 -0
  330. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-di.js +304 -0
  331. package/dist/core/code/engine/core/ingestion/languages/kotlin.js +189 -0
  332. package/dist/core/code/engine/core/ingestion/languages/php/arity-metadata.js +66 -0
  333. package/dist/core/code/engine/core/ingestion/languages/php/arity.js +43 -0
  334. package/dist/core/code/engine/core/ingestion/languages/php/cache-stats.js +32 -0
  335. package/dist/core/code/engine/core/ingestion/languages/php/captures.js +1166 -0
  336. package/dist/core/code/engine/core/ingestion/languages/php/import-decomposer.js +238 -0
  337. package/dist/core/code/engine/core/ingestion/languages/php/import-target.js +213 -0
  338. package/dist/core/code/engine/core/ingestion/languages/php/index.js +85 -0
  339. package/dist/core/code/engine/core/ingestion/languages/php/interpret.js +256 -0
  340. package/dist/core/code/engine/core/ingestion/languages/php/merge-bindings.js +50 -0
  341. package/dist/core/code/engine/core/ingestion/languages/php/namespace-siblings.js +353 -0
  342. package/dist/core/code/engine/core/ingestion/languages/php/query.js +391 -0
  343. package/dist/core/code/engine/core/ingestion/languages/php/receiver-binding.js +135 -0
  344. package/dist/core/code/engine/core/ingestion/languages/php/scope-resolver.js +361 -0
  345. package/dist/core/code/engine/core/ingestion/languages/php/simple-hooks.js +116 -0
  346. package/dist/core/code/engine/core/ingestion/languages/php.js +302 -0
  347. package/dist/core/code/engine/core/ingestion/languages/python/arity-metadata.js +49 -0
  348. package/dist/core/code/engine/core/ingestion/languages/python/arity.js +41 -0
  349. package/dist/core/code/engine/core/ingestion/languages/python/cache-stats.js +34 -0
  350. package/dist/core/code/engine/core/ingestion/languages/python/captures.js +299 -0
  351. package/dist/core/code/engine/core/ingestion/languages/python/depends-references.js +68 -0
  352. package/dist/core/code/engine/core/ingestion/languages/python/import-decomposer.js +115 -0
  353. package/dist/core/code/engine/core/ingestion/languages/python/import-target.js +440 -0
  354. package/dist/core/code/engine/core/ingestion/languages/python/index-stats.js +30 -0
  355. package/dist/core/code/engine/core/ingestion/languages/python/index.js +96 -0
  356. package/dist/core/code/engine/core/ingestion/languages/python/interpret.js +430 -0
  357. package/dist/core/code/engine/core/ingestion/languages/python/merge-bindings.js +47 -0
  358. package/dist/core/code/engine/core/ingestion/languages/python/query.js +323 -0
  359. package/dist/core/code/engine/core/ingestion/languages/python/receiver-binding.js +310 -0
  360. package/dist/core/code/engine/core/ingestion/languages/python/scope-resolver.js +80 -0
  361. package/dist/core/code/engine/core/ingestion/languages/python/simple-hooks.js +53 -0
  362. package/dist/core/code/engine/core/ingestion/languages/python.js +140 -0
  363. package/dist/core/code/engine/core/ingestion/languages/ruby/arity.js +41 -0
  364. package/dist/core/code/engine/core/ingestion/languages/ruby/cache-stats.js +21 -0
  365. package/dist/core/code/engine/core/ingestion/languages/ruby/captures.js +864 -0
  366. package/dist/core/code/engine/core/ingestion/languages/ruby/import-target.js +88 -0
  367. package/dist/core/code/engine/core/ingestion/languages/ruby/index.js +29 -0
  368. package/dist/core/code/engine/core/ingestion/languages/ruby/interpret.js +115 -0
  369. package/dist/core/code/engine/core/ingestion/languages/ruby/merge-bindings.js +21 -0
  370. package/dist/core/code/engine/core/ingestion/languages/ruby/query.js +349 -0
  371. package/dist/core/code/engine/core/ingestion/languages/ruby/receiver-binding.js +70 -0
  372. package/dist/core/code/engine/core/ingestion/languages/ruby/scope-resolver.js +263 -0
  373. package/dist/core/code/engine/core/ingestion/languages/ruby/simple-hooks.js +68 -0
  374. package/dist/core/code/engine/core/ingestion/languages/ruby.js +215 -0
  375. package/dist/core/code/engine/core/ingestion/languages/rust/arity.js +16 -0
  376. package/dist/core/code/engine/core/ingestion/languages/rust/cache-stats.js +21 -0
  377. package/dist/core/code/engine/core/ingestion/languages/rust/captures.js +304 -0
  378. package/dist/core/code/engine/core/ingestion/languages/rust/import-decomposer.js +167 -0
  379. package/dist/core/code/engine/core/ingestion/languages/rust/import-target.js +108 -0
  380. package/dist/core/code/engine/core/ingestion/languages/rust/index.js +29 -0
  381. package/dist/core/code/engine/core/ingestion/languages/rust/interpret.js +201 -0
  382. package/dist/core/code/engine/core/ingestion/languages/rust/merge-bindings.js +21 -0
  383. package/dist/core/code/engine/core/ingestion/languages/rust/method-owners.js +76 -0
  384. package/dist/core/code/engine/core/ingestion/languages/rust/module-path.js +222 -0
  385. package/dist/core/code/engine/core/ingestion/languages/rust/qualified-call.js +482 -0
  386. package/dist/core/code/engine/core/ingestion/languages/rust/query.js +280 -0
  387. package/dist/core/code/engine/core/ingestion/languages/rust/range-binding.js +687 -0
  388. package/dist/core/code/engine/core/ingestion/languages/rust/receiver-binding.js +148 -0
  389. package/dist/core/code/engine/core/ingestion/languages/rust/scope-resolver.js +151 -0
  390. package/dist/core/code/engine/core/ingestion/languages/rust/simple-hooks.js +32 -0
  391. package/dist/core/code/engine/core/ingestion/languages/rust.js +183 -0
  392. package/dist/core/code/engine/core/ingestion/languages/swift/arity-metadata.js +44 -0
  393. package/dist/core/code/engine/core/ingestion/languages/swift/arity.js +45 -0
  394. package/dist/core/code/engine/core/ingestion/languages/swift/base-type.js +30 -0
  395. package/dist/core/code/engine/core/ingestion/languages/swift/cache-stats.js +32 -0
  396. package/dist/core/code/engine/core/ingestion/languages/swift/captures.js +594 -0
  397. package/dist/core/code/engine/core/ingestion/languages/swift/conditional-directive-preprocess.js +256 -0
  398. package/dist/core/code/engine/core/ingestion/languages/swift/implicit-imports.js +60 -0
  399. package/dist/core/code/engine/core/ingestion/languages/swift/import-decomposer.js +87 -0
  400. package/dist/core/code/engine/core/ingestion/languages/swift/import-target.js +84 -0
  401. package/dist/core/code/engine/core/ingestion/languages/swift/index.js +56 -0
  402. package/dist/core/code/engine/core/ingestion/languages/swift/interpret.js +93 -0
  403. package/dist/core/code/engine/core/ingestion/languages/swift/merge-bindings.js +51 -0
  404. package/dist/core/code/engine/core/ingestion/languages/swift/query.js +226 -0
  405. package/dist/core/code/engine/core/ingestion/languages/swift/receiver-binding.js +169 -0
  406. package/dist/core/code/engine/core/ingestion/languages/swift/scope-resolver.js +192 -0
  407. package/dist/core/code/engine/core/ingestion/languages/swift/sibling-type-bindings.js +68 -0
  408. package/dist/core/code/engine/core/ingestion/languages/swift/signature-bindings.js +69 -0
  409. package/dist/core/code/engine/core/ingestion/languages/swift/simple-hooks.js +65 -0
  410. package/dist/core/code/engine/core/ingestion/languages/swift/target-grouping.js +97 -0
  411. package/dist/core/code/engine/core/ingestion/languages/swift/target-siblings.js +74 -0
  412. package/dist/core/code/engine/core/ingestion/languages/swift.js +246 -0
  413. package/dist/core/code/engine/core/ingestion/languages/typescript/arity-metadata.js +106 -0
  414. package/dist/core/code/engine/core/ingestion/languages/typescript/arity.js +57 -0
  415. package/dist/core/code/engine/core/ingestion/languages/typescript/array-callback.js +58 -0
  416. package/dist/core/code/engine/core/ingestion/languages/typescript/cache-stats.js +34 -0
  417. package/dist/core/code/engine/core/ingestion/languages/typescript/captures.js +956 -0
  418. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-export-assignment.js +535 -0
  419. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-module-exports.js +196 -0
  420. package/dist/core/code/engine/core/ingestion/languages/typescript/import-decomposer.js +374 -0
  421. package/dist/core/code/engine/core/ingestion/languages/typescript/import-target.js +65 -0
  422. package/dist/core/code/engine/core/ingestion/languages/typescript/index.js +108 -0
  423. package/dist/core/code/engine/core/ingestion/languages/typescript/interpret.js +344 -0
  424. package/dist/core/code/engine/core/ingestion/languages/typescript/merge-bindings.js +161 -0
  425. package/dist/core/code/engine/core/ingestion/languages/typescript/nuxt-auto-imports.js +325 -0
  426. package/dist/core/code/engine/core/ingestion/languages/typescript/query.js +1328 -0
  427. package/dist/core/code/engine/core/ingestion/languages/typescript/receiver-binding.js +201 -0
  428. package/dist/core/code/engine/core/ingestion/languages/typescript/scope-resolver.js +293 -0
  429. package/dist/core/code/engine/core/ingestion/languages/typescript/simple-hooks.js +139 -0
  430. package/dist/core/code/engine/core/ingestion/languages/typescript.js +455 -0
  431. package/dist/core/code/engine/core/ingestion/languages/vue/captures.js +70 -0
  432. package/dist/core/code/engine/core/ingestion/languages/vue/import-target.js +61 -0
  433. package/dist/core/code/engine/core/ingestion/languages/vue/index.js +55 -0
  434. package/dist/core/code/engine/core/ingestion/languages/vue/scope-resolver.js +295 -0
  435. package/dist/core/code/engine/core/ingestion/languages/vue.js +96 -0
  436. package/dist/core/code/engine/core/ingestion/local-symbol-pruner.js +68 -0
  437. package/dist/core/code/engine/core/ingestion/method-extractors/configs/c-cpp.js +387 -0
  438. package/dist/core/code/engine/core/ingestion/method-extractors/configs/csharp.js +290 -0
  439. package/dist/core/code/engine/core/ingestion/method-extractors/configs/dart.js +392 -0
  440. package/dist/core/code/engine/core/ingestion/method-extractors/configs/go.js +179 -0
  441. package/dist/core/code/engine/core/ingestion/method-extractors/configs/jvm.js +350 -0
  442. package/dist/core/code/engine/core/ingestion/method-extractors/configs/php.js +306 -0
  443. package/dist/core/code/engine/core/ingestion/method-extractors/configs/python.js +312 -0
  444. package/dist/core/code/engine/core/ingestion/method-extractors/configs/ruby.js +289 -0
  445. package/dist/core/code/engine/core/ingestion/method-extractors/configs/rust.js +198 -0
  446. package/dist/core/code/engine/core/ingestion/method-extractors/configs/swift.js +286 -0
  447. package/dist/core/code/engine/core/ingestion/method-extractors/configs/typescript-javascript.js +341 -0
  448. package/dist/core/code/engine/core/ingestion/method-extractors/generic.js +209 -0
  449. package/dist/core/code/engine/core/ingestion/method-types.js +3 -0
  450. package/dist/core/code/engine/core/ingestion/model/field-registry.js +41 -0
  451. package/dist/core/code/engine/core/ingestion/model/index.js +52 -0
  452. package/dist/core/code/engine/core/ingestion/model/method-registry.js +138 -0
  453. package/dist/core/code/engine/core/ingestion/model/owned-members-lookup.js +46 -0
  454. package/dist/core/code/engine/core/ingestion/model/registration-table.js +234 -0
  455. package/dist/core/code/engine/core/ingestion/model/resolve.js +183 -0
  456. package/dist/core/code/engine/core/ingestion/model/scope-resolution-indexes.js +43 -0
  457. package/dist/core/code/engine/core/ingestion/model/semantic-model.js +179 -0
  458. package/dist/core/code/engine/core/ingestion/model/symbol-table.js +216 -0
  459. package/dist/core/code/engine/core/ingestion/model/type-registry.js +84 -0
  460. package/dist/core/code/engine/core/ingestion/mro-processor.js +709 -0
  461. package/dist/core/code/engine/core/ingestion/parsing-processor.js +312 -0
  462. package/dist/core/code/engine/core/ingestion/pipeline-phases/communities.js +69 -0
  463. package/dist/core/code/engine/core/ingestion/pipeline-phases/cross-file.js +71 -0
  464. package/dist/core/code/engine/core/ingestion/pipeline-phases/di.js +338 -0
  465. package/dist/core/code/engine/core/ingestion/pipeline-phases/http-api-calls.js +312 -0
  466. package/dist/core/code/engine/core/ingestion/pipeline-phases/index.js +54 -0
  467. package/dist/core/code/engine/core/ingestion/pipeline-phases/mro.js +40 -0
  468. package/dist/core/code/engine/core/ingestion/pipeline-phases/orm.js +78 -0
  469. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse-impl.js +1286 -0
  470. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse.js +41 -0
  471. package/dist/core/code/engine/core/ingestion/pipeline-phases/processes.js +193 -0
  472. package/dist/core/code/engine/core/ingestion/pipeline-phases/prune-local-symbols.js +29 -0
  473. package/dist/core/code/engine/core/ingestion/pipeline-phases/registry.js +52 -0
  474. package/dist/core/code/engine/core/ingestion/pipeline-phases/routes.js +409 -0
  475. package/dist/core/code/engine/core/ingestion/pipeline-phases/rpc-edges.js +301 -0
  476. package/dist/core/code/engine/core/ingestion/pipeline-phases/runner.js +207 -0
  477. package/dist/core/code/engine/core/ingestion/pipeline-phases/scan.js +49 -0
  478. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-aop.js +442 -0
  479. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-auto-configuration.js +264 -0
  480. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-config.js +440 -0
  481. package/dist/core/code/engine/core/ingestion/pipeline-phases/structure.js +38 -0
  482. package/dist/core/code/engine/core/ingestion/pipeline-phases/tools.js +89 -0
  483. package/dist/core/code/engine/core/ingestion/pipeline-phases/types.js +40 -0
  484. package/dist/core/code/engine/core/ingestion/pipeline.js +152 -0
  485. package/dist/core/code/engine/core/ingestion/process-processor.js +325 -0
  486. package/dist/core/code/engine/core/ingestion/resolve-references.js +205 -0
  487. package/dist/core/code/engine/core/ingestion/route-extractors/constant-resolver.js +135 -0
  488. package/dist/core/code/engine/core/ingestion/route-extractors/django-root-discovery.js +221 -0
  489. package/dist/core/code/engine/core/ingestion/route-extractors/django.js +428 -0
  490. package/dist/core/code/engine/core/ingestion/route-extractors/expo.js +39 -0
  491. package/dist/core/code/engine/core/ingestion/route-extractors/fastapi-router-bindings.js +264 -0
  492. package/dist/core/code/engine/core/ingestion/route-extractors/laravel.js +501 -0
  493. package/dist/core/code/engine/core/ingestion/route-extractors/middleware.js +175 -0
  494. package/dist/core/code/engine/core/ingestion/route-extractors/nextjs.js +81 -0
  495. package/dist/core/code/engine/core/ingestion/route-extractors/php.js +25 -0
  496. package/dist/core/code/engine/core/ingestion/route-extractors/python-const-resolver.js +307 -0
  497. package/dist/core/code/engine/core/ingestion/route-extractors/response-shapes.js +299 -0
  498. package/dist/core/code/engine/core/ingestion/route-extractors/route-path.js +71 -0
  499. package/dist/core/code/engine/core/ingestion/route-extractors/spring-shared.js +310 -0
  500. package/dist/core/code/engine/core/ingestion/route-extractors/spring.js +441 -0
  501. package/dist/core/code/engine/core/ingestion/scope-extractor-bridge.js +60 -0
  502. package/dist/core/code/engine/core/ingestion/scope-extractor.js +1373 -0
  503. package/dist/core/code/engine/core/ingestion/scope-resolution/contract/scope-resolver.js +282 -0
  504. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +72 -0
  505. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/edges.js +194 -0
  506. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/ids.js +472 -0
  507. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +49 -0
  508. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/method-dispatch.js +43 -0
  509. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +274 -0
  510. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +93 -0
  511. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/callable-value-flow.js +1240 -0
  512. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/compound-receiver.js +1174 -0
  513. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/free-call-fallback.js +873 -0
  514. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/imported-return-types.js +226 -0
  515. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/mro.js +107 -0
  516. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/overload-narrowing.js +441 -0
  517. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/property-dispatch.js +122 -0
  518. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +1720 -0
  519. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/phase.js +395 -0
  520. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +208 -0
  521. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/registry.js +49 -0
  522. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/run.js +632 -0
  523. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/validate-bindings-immutability.js +112 -0
  524. package/dist/core/code/engine/core/ingestion/scope-resolution/resolution-outcome.js +41 -0
  525. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/namespace-targets.js +81 -0
  526. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/walkers.js +1835 -0
  527. package/dist/core/code/engine/core/ingestion/scope-resolution/unresolved-receivers.js +242 -0
  528. package/dist/core/code/engine/core/ingestion/scope-resolution/utils/definition-id.js +22 -0
  529. package/dist/core/code/engine/core/ingestion/scope-resolution/workspace-index.js +151 -0
  530. package/dist/core/code/engine/core/ingestion/structure-processor.js +40 -0
  531. package/dist/core/code/engine/core/ingestion/tree-sitter-queries.js +2244 -0
  532. package/dist/core/code/engine/core/ingestion/ts-js-hoc-utils.js +115 -0
  533. package/dist/core/code/engine/core/ingestion/type-env.js +1136 -0
  534. package/dist/core/code/engine/core/ingestion/type-extractors/c-cpp.js +555 -0
  535. package/dist/core/code/engine/core/ingestion/type-extractors/csharp.js +570 -0
  536. package/dist/core/code/engine/core/ingestion/type-extractors/dart.js +372 -0
  537. package/dist/core/code/engine/core/ingestion/type-extractors/go.js +508 -0
  538. package/dist/core/code/engine/core/ingestion/type-extractors/jvm.js +875 -0
  539. package/dist/core/code/engine/core/ingestion/type-extractors/php.js +537 -0
  540. package/dist/core/code/engine/core/ingestion/type-extractors/python.js +477 -0
  541. package/dist/core/code/engine/core/ingestion/type-extractors/ruby.js +380 -0
  542. package/dist/core/code/engine/core/ingestion/type-extractors/rust.js +502 -0
  543. package/dist/core/code/engine/core/ingestion/type-extractors/shared.js +843 -0
  544. package/dist/core/code/engine/core/ingestion/type-extractors/swift.js +490 -0
  545. package/dist/core/code/engine/core/ingestion/type-extractors/types.js +2 -0
  546. package/dist/core/code/engine/core/ingestion/type-extractors/typescript.js +690 -0
  547. package/dist/core/code/engine/core/ingestion/utils/ast-helpers.js +1693 -0
  548. package/dist/core/code/engine/core/ingestion/utils/call-analysis.js +779 -0
  549. package/dist/core/code/engine/core/ingestion/utils/callable-flow-captures.js +932 -0
  550. package/dist/core/code/engine/core/ingestion/utils/callable-labels.js +49 -0
  551. package/dist/core/code/engine/core/ingestion/utils/deferred-resolution-profile.js +151 -0
  552. package/dist/core/code/engine/core/ingestion/utils/effective-ram.js +67 -0
  553. package/dist/core/code/engine/core/ingestion/utils/env.js +60 -0
  554. package/dist/core/code/engine/core/ingestion/utils/event-loop.js +9 -0
  555. package/dist/core/code/engine/core/ingestion/utils/graph-sort.js +103 -0
  556. package/dist/core/code/engine/core/ingestion/utils/heap-probe.js +45 -0
  557. package/dist/core/code/engine/core/ingestion/utils/heritage-marker.js +47 -0
  558. package/dist/core/code/engine/core/ingestion/utils/line-base.js +24 -0
  559. package/dist/core/code/engine/core/ingestion/utils/max-file-size.js +59 -0
  560. package/dist/core/code/engine/core/ingestion/utils/method-props.js +198 -0
  561. package/dist/core/code/engine/core/ingestion/utils/qualified-name.js +73 -0
  562. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-captures.js +60 -0
  563. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-codec.js +188 -0
  564. package/dist/core/code/engine/core/ingestion/utils/scope-tree-walk.js +36 -0
  565. package/dist/core/code/engine/core/ingestion/utils/symbol-labels.js +48 -0
  566. package/dist/core/code/engine/core/ingestion/utils/template-arguments.js +187 -0
  567. package/dist/core/code/engine/core/ingestion/utils/type-parameters.js +209 -0
  568. package/dist/core/code/engine/core/ingestion/utils/verbose.js +6 -0
  569. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/c-cpp.js +133 -0
  570. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/csharp.js +66 -0
  571. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/dart.js +111 -0
  572. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/go.js +153 -0
  573. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/jvm.js +145 -0
  574. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/php.js +61 -0
  575. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/python.js +104 -0
  576. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/ruby.js +55 -0
  577. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/rust.js +79 -0
  578. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/swift.js +91 -0
  579. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/typescript-javascript.js +86 -0
  580. package/dist/core/code/engine/core/ingestion/variable-extractors/generic.js +111 -0
  581. package/dist/core/code/engine/core/ingestion/variable-types.js +3 -0
  582. package/dist/core/code/engine/core/ingestion/vue-sfc-extractor.js +544 -0
  583. package/dist/core/code/engine/core/ingestion/workers/callable-id.js +122 -0
  584. package/dist/core/code/engine/core/ingestion/workers/clone-safety.js +470 -0
  585. package/dist/core/code/engine/core/ingestion/workers/parse-worker.js +2456 -0
  586. package/dist/core/code/engine/core/ingestion/workers/post-result.js +90 -0
  587. package/dist/core/code/engine/core/ingestion/workers/quarantine.js +41 -0
  588. package/dist/core/code/engine/core/ingestion/workers/result-merge.js +59 -0
  589. package/dist/core/code/engine/core/ingestion/workers/worker-pool.js +1725 -0
  590. package/dist/core/code/engine/core/ingestion/workspace-config.js +139 -0
  591. package/dist/core/code/engine/core/lbug/conn-lock.js +72 -0
  592. package/dist/core/code/engine/core/lbug/csv-generator.js +710 -0
  593. package/dist/core/code/engine/core/lbug/cypher-escape.js +24 -0
  594. package/dist/core/code/engine/core/lbug/extension-load-error.js +339 -0
  595. package/dist/core/code/engine/core/lbug/extension-loader.js +261 -0
  596. package/dist/core/code/engine/core/lbug/graph-emit-sink.js +584 -0
  597. package/dist/core/code/engine/core/lbug/lbug-adapter.js +2703 -0
  598. package/dist/core/code/engine/core/lbug/lbug-config.js +1029 -0
  599. package/dist/core/code/engine/core/lbug/native-check.js +435 -0
  600. package/dist/core/code/engine/core/lbug/pool-adapter.js +973 -0
  601. package/dist/core/code/engine/core/lbug/query-params.js +25 -0
  602. package/dist/core/code/engine/core/lbug/query-result-utils.js +31 -0
  603. package/dist/core/code/engine/core/lbug/rel-pair-routing.js +373 -0
  604. package/dist/core/code/engine/core/lbug/schema.js +771 -0
  605. package/dist/core/code/engine/core/lbug/shutdown-helpers.js +40 -0
  606. package/dist/core/code/engine/core/lbug/sidecar-recovery.js +716 -0
  607. package/dist/core/code/engine/core/lbug/stdio-capture.js +49 -0
  608. package/dist/core/code/engine/core/lbug/sync-csv-writer.js +115 -0
  609. package/dist/core/code/engine/core/lbug/wal-checkpoint-driver.js +215 -0
  610. package/dist/core/code/engine/core/lbug/wal-driver-state.js +28 -0
  611. package/dist/core/code/engine/core/logger.js +339 -0
  612. package/dist/core/code/engine/core/platform/capabilities.js +91 -0
  613. package/dist/core/code/engine/core/run-analyze.js +1098 -0
  614. package/dist/core/code/engine/core/tree-sitter/parser-loader.js +281 -0
  615. package/dist/core/code/engine/core/tree-sitter/safe-parse.js +258 -0
  616. package/dist/core/code/engine/core/tree-sitter/vendored-grammars.js +64 -0
  617. package/dist/core/code/engine/lib/utils.js +121 -0
  618. package/dist/core/code/engine/mcp/core/lbug-adapter.js +27 -0
  619. package/dist/core/code/engine/mcp/local/aop-metadata.js +230 -0
  620. package/dist/core/code/engine/mcp/local/bean-metadata.js +49 -0
  621. package/dist/core/code/engine/mcp/local/limits.js +15 -0
  622. package/dist/core/code/engine/mcp/local/line-display.js +6 -0
  623. package/dist/core/code/engine/mcp/local/local-backend.js +4142 -0
  624. package/dist/core/code/engine/storage/branch-index.js +72 -0
  625. package/dist/core/code/engine/storage/file-hash.js +95 -0
  626. package/dist/core/code/engine/storage/fs-atomic.js +34 -0
  627. package/dist/core/code/engine/storage/git.js +555 -0
  628. package/dist/core/code/engine/storage/index-lock.js +664 -0
  629. package/dist/core/code/engine/storage/parse-cache.js +650 -0
  630. package/dist/core/code/engine/storage/parsedfile-store.js +620 -0
  631. package/dist/core/code/engine/storage/repo-manager.js +1061 -0
  632. package/dist/core/code/engine/storage/scope-index-store.js +247 -0
  633. package/dist/core/code/engine/types/pipeline.js +2 -0
  634. package/dist/core/code/scripts/install-duckdb-extension.mjs +125 -0
  635. package/dist/core/code/scripts/resolve-analyze-cmd.cjs +346 -0
  636. package/dist/core/code/shared/graph/types.js +8 -0
  637. package/dist/core/code/shared/index.js +105 -0
  638. package/dist/core/code/shared/integrations/circuit-breaker.js +242 -0
  639. package/dist/core/code/shared/integrations/resilient-fetch.js +224 -0
  640. package/dist/core/code/shared/integrations/retry.js +70 -0
  641. package/dist/core/code/shared/integrations/understand-quickly.js +145 -0
  642. package/dist/core/code/shared/language-detection.js +162 -0
  643. package/dist/core/code/shared/languages.js +27 -0
  644. package/dist/core/code/shared/lbug/schema-constants.js +98 -0
  645. package/dist/core/code/shared/mro-strategy.js +2 -0
  646. package/dist/core/code/shared/pipeline.js +5 -0
  647. package/dist/core/code/shared/scope-resolution/callable-flow-site.js +11 -0
  648. package/dist/core/code/shared/scope-resolution/def-index.js +53 -0
  649. package/dist/core/code/shared/scope-resolution/evidence-weights.js +87 -0
  650. package/dist/core/code/shared/scope-resolution/finalize-algorithm.js +807 -0
  651. package/dist/core/code/shared/scope-resolution/language-classification.js +46 -0
  652. package/dist/core/code/shared/scope-resolution/method-dispatch-index.js +100 -0
  653. package/dist/core/code/shared/scope-resolution/module-scope-index.js +59 -0
  654. package/dist/core/code/shared/scope-resolution/origin-priority.js +23 -0
  655. package/dist/core/code/shared/scope-resolution/parsed-file.js +54 -0
  656. package/dist/core/code/shared/scope-resolution/position-index.js +136 -0
  657. package/dist/core/code/shared/scope-resolution/qualified-name-index.js +77 -0
  658. package/dist/core/code/shared/scope-resolution/reference-site.js +24 -0
  659. package/dist/core/code/shared/scope-resolution/registries/class-registry.js +32 -0
  660. package/dist/core/code/shared/scope-resolution/registries/context.js +52 -0
  661. package/dist/core/code/shared/scope-resolution/registries/evidence.js +152 -0
  662. package/dist/core/code/shared/scope-resolution/registries/field-registry.js +33 -0
  663. package/dist/core/code/shared/scope-resolution/registries/lookup-core.js +392 -0
  664. package/dist/core/code/shared/scope-resolution/registries/lookup-qualified.js +58 -0
  665. package/dist/core/code/shared/scope-resolution/registries/macro-registry.js +34 -0
  666. package/dist/core/code/shared/scope-resolution/registries/method-registry.js +34 -0
  667. package/dist/core/code/shared/scope-resolution/registries/tie-breaks.js +63 -0
  668. package/dist/core/code/shared/scope-resolution/resolve-type-ref.js +128 -0
  669. package/dist/core/code/shared/scope-resolution/scope-id.js +49 -0
  670. package/dist/core/code/shared/scope-resolution/scope-tree.js +225 -0
  671. package/dist/core/code/shared/scope-resolution/symbol-definition.js +12 -0
  672. package/dist/core/code/shared/scope-resolution/types.js +25 -0
  673. package/dist/core/code/shared/test-helpers.js +17 -0
  674. package/dist/core/code/vendor/leiden/index.cjs +355 -0
  675. package/dist/core/code/vendor/leiden/utils.cjs +419 -0
  676. package/dist/core/features/scanner.d.ts +2 -0
  677. package/dist/core/features/scanner.d.ts.map +1 -1
  678. package/dist/core/features/scanner.js +27 -6
  679. package/dist/core/features/scanner.js.map +1 -1
  680. package/dist/core/timeline/cli.d.ts.map +1 -1
  681. package/dist/core/timeline/cli.js +13 -6
  682. package/dist/core/timeline/cli.js.map +1 -1
  683. package/dist/core/timeline/debris.d.ts +20 -0
  684. package/dist/core/timeline/debris.d.ts.map +1 -0
  685. package/dist/core/timeline/debris.js +124 -0
  686. package/dist/core/timeline/debris.js.map +1 -0
  687. package/dist/core/timeline/hook-runner.d.ts.map +1 -1
  688. package/dist/core/timeline/hook-runner.js +3 -1
  689. package/dist/core/timeline/hook-runner.js.map +1 -1
  690. package/dist/core/timeline/hooks.d.ts.map +1 -1
  691. package/dist/core/timeline/hooks.js +13 -5
  692. package/dist/core/timeline/hooks.js.map +1 -1
  693. package/dist/core/timeline/installer.d.ts +2 -0
  694. package/dist/core/timeline/installer.d.ts.map +1 -1
  695. package/dist/core/timeline/installer.js +12 -0
  696. package/dist/core/timeline/installer.js.map +1 -1
  697. package/dist/core/timeline/project-root.d.ts +21 -0
  698. package/dist/core/timeline/project-root.d.ts.map +1 -0
  699. package/dist/core/timeline/project-root.js +83 -0
  700. package/dist/core/timeline/project-root.js.map +1 -0
  701. package/package.json +1 -1
@@ -0,0 +1,650 @@
1
+ "use strict";
2
+ /**
3
+ * Chunk-level content-addressed parse cache.
4
+ *
5
+ * The pipeline always parses every file (correctness invariant: cross-file
6
+ * resolution and downstream phases need full graph data). What this cache
7
+ * does is skip the tree-sitter worker dispatch when a chunk's contents
8
+ * haven't changed since the last run.
9
+ *
10
+ * Granularity: chunk-level. The parse phase chunks files into ~20MB byte
11
+ * budgets. The cache key is `sha256(joined(filePath:contentHash for each
12
+ * file in the chunk, sorted))`. A change to a single file invalidates only
13
+ * that file's chunk — typically 1 of ~50 chunks on a 1000-file repo.
14
+ *
15
+ * Why not per-file:
16
+ * - Workers process sub-batches and emit aggregated `ParseWorkerResult`s.
17
+ * Splitting back to per-file would require reworking the worker contract.
18
+ * - Chunk-level invalidation gives a useful speedup floor (98% on a single
19
+ * 1-of-50 invalidated chunk) without touching the worker.
20
+ *
21
+ * Survives `--force` because it's content-addressed: the same bytes always
22
+ * produce the same key. `--force` only matters for the LadybugDB writeback;
23
+ * the cache itself is always safe to reuse.
24
+ */
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.pruneCache = exports.saveParseCache = exports.loadParseCache = exports.persistParseCacheChunk = exports.loadParseCacheChunk = exports.slimParseWorkerResultsForCache = exports.mapReviver = exports.mapReplacer = exports.computeChunkHash = exports.fileContentHash = exports.PARSE_CACHE_VERSION = void 0;
30
+ const crypto_1 = require("crypto");
31
+ const module_1 = require("module");
32
+ const promises_1 = __importDefault(require("fs/promises"));
33
+ const path_1 = __importDefault(require("path"));
34
+ /**
35
+ * Cache version composed of:
36
+ * - A schema bump knob (`SCHEMA_BUMP`) for hand-controlled invalidation
37
+ * when ParseWorkerResult shape or upstream parse semantics change.
38
+ * - The current `gitnexus` npm package version, read at module load.
39
+ * Any release that ships an updated tree-sitter grammar or revised
40
+ * extractor logic implies a version bump in package.json, which
41
+ * automatically invalidates the on-disk cache. Without this, a user
42
+ * running `npm i -g cgraph@latest` after a parser-affecting
43
+ * release would silently replay pre-upgrade ParseWorkerResults
44
+ * against the new graph schema (Bugbot/Claude review on #1479).
45
+ *
46
+ * On version mismatch, `loadParseCache` returns an empty cache and the
47
+ * next save overwrites the on-disk file with the new version baked in.
48
+ */
49
+ // Bumped to 4 in #1983: on-disk parse-cache shards omit legacy DAG fields
50
+ // (`calls`, `assignments`, `constructorBindings`) unused after RING4-1 (#942)
51
+ // and the worker `parsedFiles` (the worker writes those to the disk ParsedFile
52
+ // store instead). #2038 added a DURABLE, content-addressed ParsedFile store
53
+ // (`parsedfile-cache/`, see parsedfile-store.ts) keyed by chunk hash that
54
+ // mirrors THIS cache's lifecycle — version-gated by PARSE_CACHE_VERSION, pruned
55
+ // in lockstep to the surviving keys. On a warm parse-cache hit the chunk's
56
+ // ParsedFiles are restored from it, so scope-resolution does NOT re-extract on
57
+ // the main thread (the #1983 OOM). Because the two stores share this version,
58
+ // any future change to the `ParsedFile` serialization shape MUST bump
59
+ // SCHEMA_BUMP so both invalidate in lockstep.
60
+ // v35: Java/Kotlin Spring @Bean factory and @Resource side-channel facts
61
+ // (#2413). ParsedFile results are content-addressed and replayed verbatim, so
62
+ // the feature/schema inventory alone cannot invalidate pre-#2413 captures.
63
+ // (Cut as v32 on this branch; `main` took 32 for #2742 and 33/34 for #2747
64
+ // first, so this series is renumbered at merge time — see the v21 note.)
65
+ // v34: the receiver-chain capture is emitted by ALL 14 language emitters, not
66
+ // just TypeScript. v33 landed with the TypeScript-only emission; the rollout to
67
+ // the other 13 languages changed the capture set AGAIN, so a cache stamped 33 by
68
+ // an intermediate build of that series is not equivalent to one stamped at this
69
+ // commit — it would be treated as current while every non-TypeScript file
70
+ // replayed pre-rollout captures, leaving the feature silently inert for 13 of 14
71
+ // languages. Bumped there so the version tracks the FINAL capture set rather
72
+ // than the first divergence.
73
+ // v33: TypeScript call matches carry `@reference.receiver-chain`, a compact
74
+ // encoding of a receiver that is itself an expression.
75
+ // v32: Rust items are qualified by their enclosing `mod` chain (#2742). The
76
+ // qualified name is computed in the parse worker, so a warm cache replays the
77
+ // old unqualified ids verbatim and the collapse persists.
78
+ // v31: Rust `mod_item` gained `@declaration.namespace` and scoped call sites
79
+ // gained `@reference.qualified-name` (#2730). Both are PARSE-TIME captures, so a
80
+ // warm cache replays the old capture set verbatim: `rawQualifiedName` comes back
81
+ // undefined and no Namespace def exists to hang a module prefix on, which turns
82
+ // the whole module-qualified resolution tier into a no-op on unchanged files.
83
+ // Re-checked against origin/main at commit time per the v29 note below.
84
+ // v29: closure-binding declaration rules for PHP/Rust/Kotlin/Ruby/Dart, a Rust
85
+ // graph node for `let f = || …`, a Dart closure scope, and function-local VALUES
86
+ // (Variable/Const/Property/Static) qualified by their enclosing callable plus
87
+ // position (#2699 parts A1 + B). All parse-time, so a warm cache would replay
88
+ // the old captures and the pre-qualification ids verbatim.
89
+ //
90
+ // This is 29 and not 28 because of the exact collision the v21 note below warns
91
+ // about: this branch cut at 27 and bumped to 28, while #2415 bumped 27 -> 28 and
92
+ // merged FIRST. Re-checking against origin/main at merge time — not at branch
93
+ // time — is what caught it; leaving it at 28 would have shipped this change with
94
+ // NO parse-cache invalidation, so every warm cache keeps serving the pre-fix
95
+ // captures and ids.
96
+ // v28: Java/Kotlin capture side-channels persist Spring condition facts and
97
+ // annotation-source line numbers (#2415).
98
+ // v26: the enclosing-callable walk stops at class bodies and anonymous-class
99
+ // construction sites (#2699 follow-up); a v25 cache replays worker results carrying the
100
+ // wrong Java anonymous-class ids. Cached results are replayed verbatim — including
101
+ // across `--force` — so without this bump a warm cache keeps serving them.
102
+ // v25: function-local callables are qualified by their enclosing-callable chain
103
+ // plus their own position, and JS/TS gain block scopes (#2699). Both the node
104
+ // ids AND the scope tree in a cached worker result are therefore stale. Cached
105
+ // results are replayed verbatim — including across `--force` — so without this
106
+ // bump a warm cache keeps serving the colliding ids and the block-less scopes.
107
+ // v24: function scopes carry `Scope.ownsReceivers`, marking the JS/TS forms
108
+ // that bind their own `this` (#2701). The flag lives on the cached `Scope`, so
109
+ // without this bump a warm cache replays scopes that lack it and every `this`
110
+ // inside an ordinary `function` keeps resolving to the enclosing class —
111
+ // verified by probe: `--force` alone does NOT re-derive it.
112
+ // v23: closure bindings emit callable nodes in Dart, Ruby, Java, C# and PHP
113
+ // (plus JS/TS `var`), and Dart/PHP gain the scope declarations and flow
114
+ // captures their forms were missing (#2693). Cached worker results are replayed
115
+ // verbatim, so without this bump a warm cache keeps serving the old labels.
116
+ // v22: `const X = <arrow | function-expression>` emits one `Function` node
117
+ // instead of a `Function` plus an edgeless `Const` twin (#2687). Cached worker
118
+ // results are replayed verbatim — including across `--force` — so without this
119
+ // bump a warm cache keeps serving the old two-node set.
120
+ // v21: TWO changes share this number — a collision, not a typo. #2632
121
+ // (Java/Kotlin Spring DI facts: constructor, field/property and method
122
+ // injection sites plus bean-name and @Primary provider metadata) bumped 20 -> 21
123
+ // and merged first; #2653 (Java local class/enum/record/interface captures using
124
+ // javac-compatible, source-type-relative JLS 13.1 identities and
125
+ // declaration-to-block scopes, #2562) had branched at 20, bumped to 21 as well,
126
+ // and merged second — so it shipped with NO invalidation of its own. An index
127
+ // already stamped 21 by the first change was treated as current by the second
128
+ // and kept serving stale local-class identities from the warm cache. Harmless
129
+ // now (anything below the current value is rejected), and left as-is because
130
+ // both genuinely shipped as 21 — renumbering would misstate history. Read this
131
+ // as the reason to re-check SCHEMA_BUMP against origin/main immediately before
132
+ // merging, not just when the branch is cut; the same collision hit
133
+ // the DB schema version in #2653/#2654 (that constant is gone — the DB side is
134
+ // a derived fingerprint now, see SCHEMA_FINGERPRINT; SCHEMA_BUMP below is still
135
+ // hand-maintained because no declarative artifact describes a capture set).
136
+ // v27: generator EXPRESSIONS bound to a name emit a callable definition capture,
137
+ // and nested-callable caller attribution appends the localIdentity suffix the
138
+ // definition phase already used. Both are parse-time, so a warm cache would
139
+ // otherwise replay the old captures and ids verbatim.
140
+ // v30/schema v22: CommonJS export capture emission (#2723) — new @definition/@declaration
141
+ // captures for exports.X, aliased receivers, module-level `this`, re-export
142
+ // forwarding and `module.exports = fn`, plus prototype/`this` Methods. A warm
143
+ // cache would otherwise replay the pre-fix captures verbatim.
144
+ // v20: Java/Kotlin capture side-channels persist package and class-annotation
145
+ // facts for shared Spring Bean resolution.
146
+ // v19: Java enum constant bodies emit E$N Class nodes; anonymous naming uses
147
+ // JLS 13.1 immediate-host chains (#2555).
148
+ // v18: Worker$N anonymous bodies. v17: callable-value-flow operand identity.
149
+ // v16: direct callee identity.
150
+ // v36: bound-callable graph `startLine` follows the initializer so multi-line
151
+ // closure bindings join the scope channel (#2735). Warm cache would otherwise
152
+ // keep serving wrapper-line startLines and drop the CALLS edge.
153
+ // v37: Java/Kotlin capture side-channels include Spring AOP owner/advice facts
154
+ // (#2416). Warm cache entries at v36 do not carry those facts and would silently
155
+ // omit ADVISED_BY evidence.
156
+ // v38: Swift nested conditional-compilation directives are blanked before the
157
+ // parse (#2771), so a class body that previously error-recovered away now
158
+ // survives. The chunk key hashes raw on-disk bytes and `preprocessSource` runs
159
+ // after it is computed, so unchanged Swift files would otherwise replay their
160
+ // pre-fix `ParseWorkerResult` verbatim — including across `--force`. Allocated
161
+ // on `main`, NOT by this branch — kept so the number is not reused a third time.
162
+ // v39: receiver-chain wire format v2 — the encoded chain gained name-free
163
+ // `await` and `index` step kinds, so the VERSION prefix moved 1 -> 2 and every
164
+ // persisted chain string changed. A v2 decoder REFUSES a v1 payload (that is
165
+ // the point: a chain missing its await or index hop decodes cleanly as a
166
+ // different, shorter chain and would type the receiver against the wrong
167
+ // member), so a stale cache replays chains this build silently discards —
168
+ // the feature degrades to the text cascade with no error anywhere. Bumped so
169
+ // the stale cache is rejected rather than half-read.
170
+ //
171
+ // NUMBERED 39, AFTER TWO REALLOCATIONS. This branch first used 37; `main` took
172
+ // 37 for Spring AOP (#2416) mid-flight, so it moved to 38; `main` then took 38
173
+ // for the Swift directive fix (#2771), landing on the branch's number AGAIN.
174
+ // That is the EIGHTH collision in this series and the SECOND exact clash — two
175
+ // incompatible schemas claiming one number, twice running. The lesson is not
176
+ // "pick a bigger number": it is that the check must happen immediately before
177
+ // merge, because the window between review and merge is exactly when `main`
178
+ // allocates. Re-check against origin/main before merging this.
179
+ // v40: inference-typed class fields emit type-binding captures in SIX languages
180
+ // (#2807) — TypeScript/JavaScript `public_field_definition|field_definition` with a
181
+ // `new_expression` value and `this.<field> = new X()`; Python `self.x = Outer()`;
182
+ // Ruby `@ivar = Foo.new`; Swift optional property annotations; Dart inferred-type
183
+ // and final field declarations plus constructor-body field writes. Every one of
184
+ // these is PARSE-TIME capture emission, so a warm cache replays the pre-fix
185
+ // capture set verbatim for byte-unchanged files and the new receiver edges never
186
+ // appear — silently, with no error, exactly the v27/v30 failure mode. `analyze`
187
+ // skips tree-sitter dispatch for unchanged chunks (GUARDRAILS.md), so a plain
188
+ // re-analyze does NOT surface them without this bump.
189
+ // RE-CHECK AGAINST origin/main IMMEDIATELY BEFORE MERGING — main was also at 39
190
+ // when this was allocated, and this file records eight prior collisions.
191
+ // v41: the v40 Dart field-write binding gained its READ-side mask (#2807 review)
192
+ // — a Dart class-member body that rebinds one of its class's field names now
193
+ // emits `@receiver-owner.shadowed-fields` on its synthesized `@scope.function`
194
+ // match, which becomes `Scope.ownsReceivers`. Parse-time capture emission again,
195
+ // so a v40 warm cache replays scope matches with no marker and the receiver walk
196
+ // still reaches the class field — i.e. it keeps serving the WRONG edge this
197
+ // bump's fix removes, silently. Same bump-or-nothing situation as v40.
198
+ // RE-CHECK AGAINST origin/main IMMEDIATELY BEFORE MERGING.
199
+ // v42: the v40/v41 Python constructor-field arm stopped accepting a DOTTED
200
+ // callee (#2807 review). `self.svc = f.Alpha()` no longer emits a
201
+ // `@type-binding.constructor` capture at all, which is what removes the
202
+ // fabricated edge to the same-named class `Alpha` and what stops
203
+ // `self.conn = Registry.get()` displacing an earlier real `self.conn = Outer()`.
204
+ // A within-PR re-bump, not a collision fix: v41 was allocated by this same
205
+ // unmerged branch, so v41-stamped caches exist only on it — but they exist on
206
+ // every reviewer's and CI runner's checkout of it, and parse-time emission means
207
+ // they replay the pre-fix capture set for byte-unchanged files and keep serving
208
+ // the fabricated edge. main is at 39, so 40/41/42 are all this branch's.
209
+ // RE-CHECK AGAINST origin/main IMMEDIATELY BEFORE MERGING.
210
+ // v43: Go embedded fields now emit `@reference.embedded-pointer` when written
211
+ // as `*T` rather than `T` (#2813 exact method sets). Go's method-set rules make
212
+ // the two forms genuinely different — `struct{ Base }` does NOT get Base's
213
+ // pointer-receiver methods in its value method set while `struct{ *Base }` does
214
+ // — so structural interface satisfaction cannot be exact without the spelling.
215
+ // This is PARSE-TIME capture emission, so a warm cache replays the pre-fix
216
+ // capture set for byte-unchanged files and the distinction never appears:
217
+ // silently, with no error, the v27/v30 failure mode. `analyze` skips tree-sitter
218
+ // dispatch for unchanged chunks (GUARDRAILS.md), so a plain re-analyze does NOT
219
+ // surface it without this bump.
220
+ //
221
+ // 42 -> 43: this branch originally allocated 43 while sitting at 39, because
222
+ // main had already taken 40/41/42 for #2807. main has since merged those and
223
+ // this branch rebased onto it, so 43 remains the next free number and the
224
+ // value is unchanged by the rebase — the reason it was chosen is simply now
225
+ // visible in the history above. RE-CHECK AGAINST origin/main IMMEDIATELY
226
+ // BEFORE MERGING; this file records eight prior collisions, two EXACT.
227
+ // Moved 43 -> 44 for #2842's TypeScript heritage capture, which now emits
228
+ // `@reference.inherits` for `interface_declaration` and
229
+ // `abstract_class_declaration`. That is PARSE-TIME emission, so a v43 warm
230
+ // cache would serve entries that are missing those matches entirely — the
231
+ // exact failure a bump exists to prevent. Verified against origin/main at
232
+ // a857f4c5a, which is still on 43, so 44 is free. RE-CHECK BEFORE MERGE.
233
+ // 44 -> 45: #2837 re-anchors Go's struct/interface captures from the
234
+ // `type_declaration` onto the `type_spec` (`languages/go/query.ts`
235
+ // @scope.class/@declaration.struct/@declaration.interface, and GO_QUERIES
236
+ // @definition.struct/@definition.interface in `tree-sitter-queries.ts`). Every
237
+ // Go file declaring a type therefore emits DIFFERENT capture ranges — measured:
238
+ // 70 fixture digests moved with zero change in capture COUNT — and a grouped
239
+ // `type (...)` block emits nodes it previously did not emit at all. Parse-time,
240
+ // so a warm cache would replay pre-fix ParsedFiles and the fix would be a silent
241
+ // no-op on every incremental analyze while still passing every cold-run test.
242
+ //
243
+ // This branch originally took 44 and it COLLIDED: #2842 above merged first and
244
+ // claimed it. The ninth entry in this ledger, and the third EXACT clash. Worth
245
+ // recording HOW it was caught, because the pin test cannot catch it — both PRs
246
+ // asserted `toBe(44)`, which passes even when main is already 44, so the two
247
+ // capture schemas would have shared one PARSE_CACHE_VERSION and the durable
248
+ // ParsedFile store would have replayed pre-fix ParsedFiles verbatim for one of
249
+ // them. Only comparing against origin/main at MERGE time surfaces it.
250
+ // PR #2840 (Objective-C, draft) still claims 44 as well — it must move too.
251
+ // RE-CHECK AGAINST origin/main IMMEDIATELY BEFORE MERGING.
252
+ //
253
+ // 46 -> 47: method-level Spring `@RequestMapping` now emits wildcard routes
254
+ // and one route per static `RequestMethod.X` value. These decorator routes live
255
+ // in ParseWorkerResult and are replayed verbatim on warm cache hits, so keeping
256
+ // the previous version would make the fix a no-op for every unchanged Java file.
257
+ // PR #2856 claims 46, so this branch owns 47. Verified against upstream/main at
258
+ // 021ac3037 (still 45). RE-CHECK BEFORE MERGE.
259
+ // 47 -> 48: #2833 makes a generic-typed FIELD usable as a call receiver. Three
260
+ // parse-time changes ride on this one value:
261
+ // - C++ (`languages/cpp/query.ts`) gains `field_declaration` rules whose
262
+ // `type:` is a `template_type` or a `qualified_identifier` wrapping one.
263
+ // The rules that existed all required a bare `type_identifier`, so
264
+ // `Repo<User> repo;` and `std::vector<Item> items;` matched NONE of them and
265
+ // the member got no type binding at all — new captures where there were none.
266
+ // - Python (`languages/python/interpret.ts`) reduces a subscripted type its
267
+ // container allow-lists do not claim to its base name, so `Repo[User]` binds
268
+ // as `Repo`. That rewrites `TypeRef.rawName`, which is serialized into the
269
+ // cached ParsedFile.
270
+ // - `SymbolDefinition.typeParameters` — the DECLARED parameter list
271
+ // (`template <class T>`, `class Box<T extends Repo>`), captured nowhere
272
+ // before and on a different axis from the existing `templateArguments`. Six
273
+ // per-language declaration queries gained `@declaration.type-parameters` and
274
+ // `scope-extractor.ts` reads it onto every class-like def.
275
+ // A warm cache would replay the pre-fix ParsedFiles, so every file served from
276
+ // it would carry the old captures while passing every cold-run test — the exact
277
+ // failure this constant exists to prevent.
278
+ //
279
+ // WHAT THE BUMP DOES NOT COVER. It invalidates the PARSE half only. v1 is
280
+ // always full-rebuild (no incremental), so the cache has no incremental
281
+ // consumer.
282
+ // `!schemaFingerprintMismatch(...)`, feature parity, non-empty `fileHashes` and
283
+ // a git repo — SCHEMA_BUMP appears in none of them — and an incremental run then
284
+ // writes back only `hashDiff.toWrite`, logging the rest as "unchanged file rows
285
+ // preserved". SCHEMA_FINGERPRINT is a hash of node/relation DDL, which this
286
+ // branch does not touch, so it is byte-identical and moves nothing either.
287
+ // Net: after this bump an incremental analyze re-parses an unchanged file
288
+ // correctly but keeps its existing rows, and the new edges land on the next full
289
+ // rebuild (`--force`, or any run whose runner identity or DDL moved). That is
290
+ // the pre-existing contract for every capture change, not a regression here.
291
+ //
292
+ // THIS BRANCH COLLIDED TWICE, which is why it lands on 48 rather than 46.
293
+ // It first took 46 (the C++/Python captures) and then 47 (typeParameters), both
294
+ // verified free against origin/main at 021ac3037. By merge time main had moved:
295
+ // #2856 claims 46 and #2857 took 47 and merged first. The eleventh entry in this
296
+ // ledger and the FOURTH and FIFTH exact clashes — and note what caught them.
297
+ // Not the pin test: this branch asserted `toBe(47)` and so did #2857, and both
298
+ // pass, because a literal pin cannot see the other side. Only diffing
299
+ // origin/main at the moment of merge surfaces it. Every value this branch
300
+ // published (46, 47) is superseded by 48, so a warm cache stamped with either is
301
+ // correctly invalidated.
302
+ // RE-CHECK AGAINST origin/main IMMEDIATELY BEFORE MERGING.
303
+ const SCHEMA_BUMP = 48;
304
+ const CGRAPH_PKG_VERSION = (() => {
305
+ try {
306
+ // package.json sits at cgraph/package.json — two levels up from
307
+ // cgraph/src/storage/parse-cache.ts (or its dist/ equivalent).
308
+ const here = __dirname;
309
+ const candidates = [
310
+ path_1.default.join(here, '..', '..', '..', '..', 'package.json'), // src|dist/core/code/storage → cgraphx/
311
+ ];
312
+ const requireCJS = (0, module_1.createRequire)(__filename);
313
+ for (const c of candidates) {
314
+ try {
315
+ const pkg = requireCJS(c);
316
+ if (typeof pkg?.version === 'string')
317
+ return pkg.version;
318
+ }
319
+ catch {
320
+ /* try next candidate */
321
+ }
322
+ }
323
+ }
324
+ catch {
325
+ /* fall through to fallback */
326
+ }
327
+ return '0.0.0-unknown';
328
+ })();
329
+ exports.PARSE_CACHE_VERSION = `${SCHEMA_BUMP}+${CGRAPH_PKG_VERSION}`;
330
+ const LEGACY_CACHE_FILENAME = 'parse-cache.json';
331
+ const CACHE_DIRNAME = 'parse-cache';
332
+ const CACHE_INDEX_FILENAME = 'index.json';
333
+ /** Keys on disk always come from `computeChunkHash` — 64-char lowercase hex. */
334
+ const CHUNK_CACHE_KEY_HEX_RE = /^[a-f0-9]{64}$/;
335
+ const isValidChunkCacheKey = (chunkHash) => CHUNK_CACHE_KEY_HEX_RE.test(chunkHash);
336
+ /** SHA-256 hex of a single string or buffer. */
337
+ const sha256Hex = (input) => (0, crypto_1.createHash)('sha256')
338
+ .update(typeof input === 'string' ? Buffer.from(input) : input)
339
+ .digest('hex');
340
+ /** Stable hash of a single file's contents — used by callers to compose a chunk hash. */
341
+ const fileContentHash = (content) => sha256Hex(content);
342
+ exports.fileContentHash = fileContentHash;
343
+ const computeChunkHash = (entries, pdg = false) => {
344
+ const sorted = [...entries].sort((a, b) => (a.filePath < b.filePath ? -1 : 1));
345
+ const joined = sorted.map((e) => `${e.filePath}:${e.contentHash}`).join('\n');
346
+ const opts = typeof pdg === 'boolean' ? { pdg } : pdg;
347
+ // pdg-off path keeps its pre-#2081 chunk-KEY format verbatim. Note this does
348
+ // NOT mean caches survive the M1 upgrade: SCHEMA_BUMP 4→5 changed
349
+ // PARSE_CACHE_VERSION, and both loadParseCache (below) and the durable
350
+ // parsedfile-store index hard-invalidate on it — every user pays one full
351
+ // cold re-parse on upgrade regardless of --pdg. Keeping the key format
352
+ // stable only means no SECOND invalidation class is introduced here.
353
+ if (!opts.pdg)
354
+ return sha256Hex(joined);
355
+ // Fold the worker-visible --pdg configuration into the key: the boolean
356
+ // plus `maxFunctionLines` (decides which functions get a CFG at all, in the
357
+ // worker). Without it a warm chunk built under one cap is served to a run
358
+ // with a different cap → a stale/under-built CFG: the #2038-class
359
+ // option-blind-key trap. `def` marks an unset (default) value so two
360
+ // default-cap runs share a key. The emit-time edge cap is deliberately
361
+ // absent — see the PdgCacheKey doc comment.
362
+ //
363
+ // NAMESPACE VERSION (`pdg:5`): bumped when the worker-emitted
364
+ // `cfgSideChannel` SHAPE changes for pdg-mode runs only — pdg:1→2 in #2083
365
+ // M3 U1 (TsHarvester emits taint `sites` on StatementFacts); pdg:2→3 in the
366
+ // #2227 follow-up U1 (every C-family / TS harvester now stamps the call-site
367
+ // anchor `SiteRecord.at`, which the resolved-callee-id join reads); pdg:3→4 in
368
+ // the #2227 tri-review-2 U4 (the Rust harvester now emits a `kind:'new'` site
369
+ // for `struct_expression`, a new worker-output site the join consumes); pdg:4→5
370
+ // in the FU-C call-summary soundness fix (the TS harvester now stamps
371
+ // `BindingEntry.formalIndex` on param bindings so the PDG call-summary keys
372
+ // return-flow on the enclosing FORMAL position, not the flattened binding
373
+ // ordinal — a warm chunk lacking it would route the harvest to its conservative
374
+ // empty-summary fallback). A warm chunk built by a worker predating the relevant
375
+ // change carries a stale site shape, so the join skips it and
376
+ // `BasicBlock.calleeIds` is silently empty (or missing the struct constructor)
377
+ // even though `callees` is populated — exactly the #2225-class shape skew this
378
+ // version token exists to prevent. Invalidates pdg-mode chunks and their durable
379
+ // parsedfile-cache entries; flag-off chunk keys never reach this line and stay
380
+ // byte-identical, so non-pdg users pay nothing. Deliberately NOT a SCHEMA_BUMP —
381
+ // that gates the whole cache version and would force a full cold re-parse on
382
+ // EVERY user (the M1 bump comment above records that cost).
383
+ const ns = `pdg:5;maxFn=${opts.maxFunctionLines ?? 'def'}`;
384
+ return sha256Hex(`${ns}\n${joined}`);
385
+ };
386
+ exports.computeChunkHash = computeChunkHash;
387
+ /**
388
+ * JSON replacer that round-trips Map/Set instances through plain JSON.
389
+ *
390
+ * `ParseWorkerResult.parsedFiles[*].scopes[*].typeBindings` is a
391
+ * `ReadonlyMap<string, TypeRef>`; without this transform it serializes
392
+ * to `{}` and downstream code that iterates / `.get()`s on it crashes
393
+ * with "is not iterable". Applied symmetrically by `mapReviver` on
394
+ * load so the in-memory shape stays Map-typed.
395
+ */
396
+ const MAP_TAG = '__$mapEntries$__';
397
+ const SET_TAG = '__$setValues$__';
398
+ const mapReplacer = (_key, value) => {
399
+ if (value instanceof Map)
400
+ return { [MAP_TAG]: Array.from(value.entries()) };
401
+ if (value instanceof Set)
402
+ return { [SET_TAG]: Array.from(value.values()) };
403
+ return value;
404
+ };
405
+ exports.mapReplacer = mapReplacer;
406
+ const mapReviver = (_key, value) => {
407
+ if (value && typeof value === 'object') {
408
+ const v = value;
409
+ if (Array.isArray(v[MAP_TAG]))
410
+ return new Map(v[MAP_TAG]);
411
+ if (Array.isArray(v[SET_TAG]))
412
+ return new Set(v[SET_TAG]);
413
+ }
414
+ return value;
415
+ };
416
+ exports.mapReviver = mapReviver;
417
+ const getLegacyCachePath = (storagePath) => path_1.default.join(storagePath, LEGACY_CACHE_FILENAME);
418
+ const getCacheDirPath = (storagePath) => path_1.default.join(storagePath, CACHE_DIRNAME);
419
+ const getCacheIndexPath = (storagePath) => path_1.default.join(getCacheDirPath(storagePath), CACHE_INDEX_FILENAME);
420
+ const getCacheChunkPath = (storagePath, chunkHash) => path_1.default.join(getCacheDirPath(storagePath), `${chunkHash}.json`);
421
+ /**
422
+ * Drop fields that are not replayed by `mergeChunkResults` / parse-impl after
423
+ * RING4-1 (#942). Shrinks on-disk shards and peak RSS during cold runs.
424
+ */
425
+ const slimParseWorkerResultsForCache = (chunkResults) => {
426
+ const slim = [];
427
+ for (const result of chunkResults) {
428
+ slim.push({
429
+ ...result,
430
+ calls: [],
431
+ assignments: [],
432
+ constructorBindings: [],
433
+ parsedFiles: [],
434
+ // #2112: a clone-safety skip list is per-run telemetry, not graph data —
435
+ // replay ignores it. Drop it so it doesn't bloat the cached shard.
436
+ skippedPaths: [],
437
+ });
438
+ }
439
+ return slim;
440
+ };
441
+ exports.slimParseWorkerResultsForCache = slimParseWorkerResultsForCache;
442
+ const readParseCacheChunkFromDisk = async (storagePath, chunkHash) => {
443
+ if (!isValidChunkCacheKey(chunkHash))
444
+ return undefined;
445
+ try {
446
+ const chunkRaw = await promises_1.default.readFile(getCacheChunkPath(storagePath, chunkHash), 'utf-8');
447
+ const chunkData = JSON.parse(chunkRaw, exports.mapReviver);
448
+ return Array.isArray(chunkData) ? chunkData : undefined;
449
+ }
450
+ catch {
451
+ return undefined;
452
+ }
453
+ };
454
+ /** Load one chunk shard. Does not retain it in `cache.entries`. */
455
+ const loadParseCacheChunk = async (cache, chunkHash) => {
456
+ const inMemory = cache.entries.get(chunkHash);
457
+ if (inMemory !== undefined)
458
+ return inMemory;
459
+ if (cache.storagePath && cache.onDiskKeys?.has(chunkHash)) {
460
+ return readParseCacheChunkFromDisk(cache.storagePath, chunkHash);
461
+ }
462
+ return undefined;
463
+ };
464
+ exports.loadParseCacheChunk = loadParseCacheChunk;
465
+ /**
466
+ * Cache directories already created this process. `persistParseCacheChunk` runs
467
+ * once per cache-miss chunk; without this guard every miss re-issues a redundant
468
+ * `mkdir` syscall (hundreds on a large cold repo) (#1983). Storage paths are
469
+ * process-scoped, so the Set stays bounded.
470
+ */
471
+ const createdCacheDirs = new Set();
472
+ /**
473
+ * Persist one chunk shard and avoid retaining it in RAM for the rest of the
474
+ * run. Falls back to `cache.entries` when `storagePath` is unset (unit tests).
475
+ */
476
+ const persistParseCacheChunk = async (cache, chunkHash, chunkResults) => {
477
+ const slim = (0, exports.slimParseWorkerResultsForCache)(chunkResults);
478
+ if (cache.storagePath) {
479
+ const cacheDir = getCacheDirPath(cache.storagePath);
480
+ if (!createdCacheDirs.has(cacheDir)) {
481
+ await promises_1.default.mkdir(cacheDir, { recursive: true });
482
+ createdCacheDirs.add(cacheDir);
483
+ }
484
+ const payload = JSON.stringify(slim, exports.mapReplacer);
485
+ await promises_1.default.writeFile(getCacheChunkPath(cache.storagePath, chunkHash), payload, 'utf-8');
486
+ cache.onDiskKeys ??= new Set();
487
+ cache.onDiskKeys.add(chunkHash);
488
+ cache.entries.delete(chunkHash);
489
+ return;
490
+ }
491
+ cache.entries.set(chunkHash, slim);
492
+ };
493
+ exports.persistParseCacheChunk = persistParseCacheChunk;
494
+ const loadLegacyParseCache = async (storagePath) => {
495
+ const cachePath = getLegacyCachePath(storagePath);
496
+ try {
497
+ const raw = await promises_1.default.readFile(cachePath, 'utf-8');
498
+ const data = JSON.parse(raw, exports.mapReviver);
499
+ if (typeof data !== 'object' ||
500
+ data === null ||
501
+ data.version !== exports.PARSE_CACHE_VERSION ||
502
+ typeof data.entries !== 'object' ||
503
+ data.entries === null) {
504
+ return emptyCache(storagePath);
505
+ }
506
+ const entries = new Map();
507
+ for (const [k, v] of Object.entries(data.entries)) {
508
+ if (Array.isArray(v))
509
+ entries.set(k, v);
510
+ }
511
+ return { version: exports.PARSE_CACHE_VERSION, entries, usedKeys: new Set(), storagePath };
512
+ }
513
+ catch {
514
+ return emptyCache(storagePath);
515
+ }
516
+ };
517
+ const loadShardedParseCache = async (storagePath) => {
518
+ const indexPath = getCacheIndexPath(storagePath);
519
+ try {
520
+ const raw = await promises_1.default.readFile(indexPath, 'utf-8');
521
+ const data = JSON.parse(raw);
522
+ if (typeof data !== 'object' ||
523
+ data === null ||
524
+ data.version !== exports.PARSE_CACHE_VERSION ||
525
+ !Array.isArray(data.keys)) {
526
+ return emptyCache(storagePath);
527
+ }
528
+ const onDiskKeys = new Set();
529
+ for (const chunkHash of data.keys) {
530
+ if (typeof chunkHash === 'string' && isValidChunkCacheKey(chunkHash)) {
531
+ onDiskKeys.add(chunkHash);
532
+ }
533
+ }
534
+ // Lazy: index only — load individual shards on cache hit (#1983).
535
+ return {
536
+ version: exports.PARSE_CACHE_VERSION,
537
+ entries: new Map(),
538
+ usedKeys: new Set(),
539
+ storagePath,
540
+ onDiskKeys,
541
+ };
542
+ }
543
+ catch {
544
+ return null;
545
+ }
546
+ };
547
+ /**
548
+ * Load the parse cache. Returns an empty cache on any failure (missing
549
+ * file, corrupt JSON, version mismatch). Never throws on a normal load.
550
+ */
551
+ const loadParseCache = async (storagePath) => {
552
+ const sharded = await loadShardedParseCache(storagePath);
553
+ if (sharded)
554
+ return sharded;
555
+ return loadLegacyParseCache(storagePath);
556
+ };
557
+ exports.loadParseCache = loadParseCache;
558
+ /**
559
+ * Persist the cache to disk using a temp directory + rename.
560
+ *
561
+ * Writes shards under `${cacheDir}.tmp`, then removes the old `cacheDir` and
562
+ * renames the temp directory into place. There is a crash window after
563
+ * `rm(cacheDir)` and before `rename(tmpDir, cacheDir)` where no cache exists;
564
+ * that is acceptable — `loadParseCache` yields empty and the next run
565
+ * reparses. This is not a single atomic swap of the whole tree, but avoids
566
+ * leaving a half-written shard set visible to readers.
567
+ */
568
+ const saveParseCache = async (storagePath, cache) => {
569
+ await promises_1.default.mkdir(storagePath, { recursive: true });
570
+ const cacheDir = getCacheDirPath(storagePath);
571
+ const tmpDir = `${cacheDir}.tmp`;
572
+ await promises_1.default.rm(tmpDir, { recursive: true, force: true });
573
+ await promises_1.default.mkdir(tmpDir, { recursive: true });
574
+ const keys = [...cache.usedKeys].filter(isValidChunkCacheKey).sort();
575
+ // Track hashes whose shard was actually written/copied this save. A hash can
576
+ // be in `usedKeys` without a backing shard — its in-memory serialize threw, or
577
+ // its on-disk copy failed/was-absent (e.g. a worker-quarantined chunk added to
578
+ // usedKeys but never persisted). Writing such a hash into `index.keys` would
579
+ // make the next load reference a shard that doesn't exist (#1983). Build the
580
+ // index from what we persisted, not from the raw usedKeys snapshot.
581
+ const writtenKeys = [];
582
+ for (const chunkHash of keys) {
583
+ const chunkPath = path_1.default.join(tmpDir, `${chunkHash}.json`);
584
+ const inMemory = cache.entries.get(chunkHash);
585
+ if (inMemory !== undefined) {
586
+ let payload;
587
+ try {
588
+ payload = JSON.stringify(inMemory, exports.mapReplacer);
589
+ }
590
+ catch {
591
+ continue;
592
+ }
593
+ await promises_1.default.writeFile(chunkPath, payload, 'utf-8');
594
+ writtenKeys.push(chunkHash);
595
+ continue;
596
+ }
597
+ const existingPath = getCacheChunkPath(storagePath, chunkHash);
598
+ try {
599
+ await promises_1.default.copyFile(existingPath, chunkPath);
600
+ writtenKeys.push(chunkHash);
601
+ }
602
+ catch {
603
+ /* shard missing — skip; next run treats as cache miss */
604
+ }
605
+ }
606
+ const index = {
607
+ version: cache.version,
608
+ keys: writtenKeys,
609
+ };
610
+ await promises_1.default.writeFile(path_1.default.join(tmpDir, CACHE_INDEX_FILENAME), JSON.stringify(index), 'utf-8');
611
+ await promises_1.default.rm(cacheDir, { recursive: true, force: true });
612
+ await promises_1.default.rename(tmpDir, cacheDir);
613
+ await promises_1.default.rm(getLegacyCachePath(storagePath), { force: true });
614
+ // The authoritative final key set actually backed by a shard on disk.
615
+ // Callers (the durable ParsedFile store) prune to exactly these so the two
616
+ // content-addressed stores stay coherent — a chunk is cached iff BOTH have it.
617
+ return writtenKeys;
618
+ };
619
+ exports.saveParseCache = saveParseCache;
620
+ /**
621
+ * Drop entries whose hashes are not in `usedHashes`. Called at the end
622
+ * of a run so chunks that no longer correspond to any current chunk
623
+ * don't keep their stale entries forever.
624
+ */
625
+ const pruneCache = (cache, usedHashes) => {
626
+ let removed = 0;
627
+ for (const k of cache.entries.keys()) {
628
+ if (!usedHashes.has(k)) {
629
+ cache.entries.delete(k);
630
+ removed++;
631
+ }
632
+ }
633
+ if (cache.onDiskKeys) {
634
+ for (const k of cache.onDiskKeys) {
635
+ if (!usedHashes.has(k)) {
636
+ cache.onDiskKeys.delete(k);
637
+ removed++;
638
+ }
639
+ }
640
+ }
641
+ return removed;
642
+ };
643
+ exports.pruneCache = pruneCache;
644
+ const emptyCache = (storagePath) => ({
645
+ version: exports.PARSE_CACHE_VERSION,
646
+ entries: new Map(),
647
+ usedKeys: new Set(),
648
+ storagePath,
649
+ onDiskKeys: storagePath ? new Set() : undefined,
650
+ });