cgraphx 2.0.2 → 2.0.6

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 (754) hide show
  1. package/dist/.claude-template/FLOW-MAP.md +13 -3
  2. package/dist/.claude-template/agents/task-history.md +186 -0
  3. package/dist/.claude-template/commands/end.md +1 -0
  4. package/dist/.claude-template/skills/cgraphx-guide/SKILL.md +5 -3
  5. package/dist/.claude-template/skills/cgraphx-guide/how-to-use.html +8 -8
  6. package/dist/.claude-template/skills/cgraphx-guide/how-to-use.md +8 -8
  7. package/dist/.claude-template/skills/clarify-requirements/SKILL.md +13 -9
  8. package/dist/.claude-template/skills/db-query/SKILL.md +19 -2
  9. package/dist/.claude-template/skills/iboc-check/SKILL.md +51 -23
  10. package/dist/.claude-template/skills/iboc-check/filler-prompt.md +3 -4
  11. package/dist/.claude-template/skills/run-api-test/SKILL.md +15 -15
  12. package/dist/.claude-template/skills/run-api-test/assets/{template-test-report.md → template-/346/216/245/345/217/243/346/265/213/350/257/225/346/212/245/345/221/212.md} +4 -4
  13. package/dist/.claude-template/skills/run-api-test/references/bru-run.md +1 -1
  14. package/dist/.claude-template/skills/run-api-test/references/db-verification.md +2 -2
  15. package/dist/.claude-template/skills/run-api-test/references/report-format.md +6 -6
  16. package/dist/.claude-template/skills/run-api-test/references/service-readiness.md +1 -1
  17. package/dist/.claude-template/skills/run-api-test/references/test-scope.md +6 -6
  18. package/dist/.claude-template/skills/run-ui-test/SKILL.md +186 -0
  19. package/dist/.claude-template/skills/run-ui-test/references/report-format.md +77 -0
  20. package/dist/.claude-template/skills/subagent-implement/SKILL.md +3 -2
  21. package/dist/.claude-template/skills/write-api/SKILL.md +18 -18
  22. package/dist/.claude-template/skills/write-api/assets/{template-api-spec.md → template-/346/216/245/345/217/243/346/265/213/350/257/225-spec.md} +1 -1
  23. package/dist/.claude-template/skills/write-api/references/{api-spec-format.md → /346/216/245/345/217/243/346/265/213/350/257/225-spec-format.md} +3 -3
  24. package/dist/.claude-template/skills/write-plan/SKILL.md +4 -2
  25. package/dist/.claude-template/skills/write-ui-test/SKILL.md +125 -0
  26. package/dist/.claude-template/skills/write-ui-test/references//347/224/250/344/276/213/350/247/204/346/240/274-format.md +94 -0
  27. package/dist/core/code/engine/cli/analyze-config.js +320 -0
  28. package/dist/core/code/engine/cli/analyze.js +1086 -0
  29. package/dist/core/code/engine/cli/cli-message.js +83 -0
  30. package/dist/core/code/engine/cli/detect-changes-format.js +58 -0
  31. package/dist/core/code/engine/cli/embedding-dims.js +43 -0
  32. package/dist/core/code/engine/cli/format-elapsed.js +12 -0
  33. package/dist/core/code/engine/cli/help-i18n.js +144 -0
  34. package/dist/core/code/engine/cli/i18n/en.js +110 -0
  35. package/dist/core/code/engine/cli/i18n/index.js +47 -0
  36. package/dist/core/code/engine/cli/i18n/resources.js +9 -0
  37. package/dist/core/code/engine/cli/i18n/zh-CN.js +110 -0
  38. package/dist/core/code/engine/cli/lazy-action.js +67 -0
  39. package/dist/core/code/engine/cli/optional-grammars.js +136 -0
  40. package/dist/core/code/engine/cli/resolve-invocation.js +76 -0
  41. package/dist/core/code/engine/cli/status.js +156 -0
  42. package/dist/core/code/engine/cli/tool.js +384 -0
  43. package/dist/core/code/engine/config/ignore-service.js +511 -0
  44. package/dist/core/code/engine/config/supported-languages.js +17 -0
  45. package/dist/core/code/engine/core/analysis-features.js +64 -0
  46. package/dist/core/code/engine/core/analyzer-identity.js +2171 -0
  47. package/dist/core/code/engine/core/git-staleness.js +180 -0
  48. package/dist/core/code/engine/core/graph/graph.js +180 -0
  49. package/dist/core/code/engine/core/graph/import-cycles.js +106 -0
  50. package/dist/core/code/engine/core/graph/types.js +2 -0
  51. package/dist/core/code/engine/core/index-freshness.js +12 -0
  52. package/dist/core/code/engine/core/ingestion/binding-accumulator.js +341 -0
  53. package/dist/core/code/engine/core/ingestion/call-extractors/configs/c-cpp.js +168 -0
  54. package/dist/core/code/engine/core/ingestion/call-extractors/configs/csharp.js +9 -0
  55. package/dist/core/code/engine/core/ingestion/call-extractors/configs/dart.js +8 -0
  56. package/dist/core/code/engine/core/ingestion/call-extractors/configs/go.js +8 -0
  57. package/dist/core/code/engine/core/ingestion/call-extractors/configs/jvm.js +54 -0
  58. package/dist/core/code/engine/core/ingestion/call-extractors/configs/php.js +8 -0
  59. package/dist/core/code/engine/core/ingestion/call-extractors/configs/python.js +8 -0
  60. package/dist/core/code/engine/core/ingestion/call-extractors/configs/ruby.js +8 -0
  61. package/dist/core/code/engine/core/ingestion/call-extractors/configs/rust.js +8 -0
  62. package/dist/core/code/engine/core/ingestion/call-extractors/configs/swift.js +8 -0
  63. package/dist/core/code/engine/core/ingestion/call-extractors/configs/typescript-javascript.js +11 -0
  64. package/dist/core/code/engine/core/ingestion/call-extractors/generic.js +62 -0
  65. package/dist/core/code/engine/core/ingestion/call-processor.js +503 -0
  66. package/dist/core/code/engine/core/ingestion/call-routing.js +98 -0
  67. package/dist/core/code/engine/core/ingestion/call-types.js +3 -0
  68. package/dist/core/code/engine/core/ingestion/cfg/callee-cell-format.js +45 -0
  69. package/dist/core/code/engine/core/ingestion/cfg/cfg-builder.js +202 -0
  70. package/dist/core/code/engine/core/ingestion/cfg/collect.js +81 -0
  71. package/dist/core/code/engine/core/ingestion/cfg/control-dependence.js +185 -0
  72. package/dist/core/code/engine/core/ingestion/cfg/control-flow-context.js +130 -0
  73. package/dist/core/code/engine/core/ingestion/cfg/emit.js +646 -0
  74. package/dist/core/code/engine/core/ingestion/cfg/post-dominators.js +182 -0
  75. package/dist/core/code/engine/core/ingestion/cfg/reaching-def-reason-codec.js +139 -0
  76. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs-graph.js +322 -0
  77. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs.js +792 -0
  78. package/dist/core/code/engine/core/ingestion/cfg/synthetic-escape.js +305 -0
  79. package/dist/core/code/engine/core/ingestion/cfg/traversal-result.js +6 -0
  80. package/dist/core/code/engine/core/ingestion/cfg/types.js +14 -0
  81. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp-harvest.js +545 -0
  82. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp.js +590 -0
  83. package/dist/core/code/engine/core/ingestion/cfg/visitors/call-site-harvest.js +356 -0
  84. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp-harvest.js +593 -0
  85. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp.js +871 -0
  86. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart-harvest.js +874 -0
  87. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart.js +840 -0
  88. package/dist/core/code/engine/core/ingestion/cfg/visitors/go-harvest.js +625 -0
  89. package/dist/core/code/engine/core/ingestion/cfg/visitors/go.js +642 -0
  90. package/dist/core/code/engine/core/ingestion/cfg/visitors/java-harvest.js +517 -0
  91. package/dist/core/code/engine/core/ingestion/cfg/visitors/java.js +816 -0
  92. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin-harvest.js +723 -0
  93. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin.js +813 -0
  94. package/dist/core/code/engine/core/ingestion/cfg/visitors/php-harvest.js +630 -0
  95. package/dist/core/code/engine/core/ingestion/cfg/visitors/php.js +725 -0
  96. package/dist/core/code/engine/core/ingestion/cfg/visitors/python-harvest.js +776 -0
  97. package/dist/core/code/engine/core/ingestion/cfg/visitors/python.js +562 -0
  98. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby-harvest.js +591 -0
  99. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby.js +760 -0
  100. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust-harvest.js +877 -0
  101. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust.js +562 -0
  102. package/dist/core/code/engine/core/ingestion/cfg/visitors/scope-tree-harvest.js +120 -0
  103. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift-harvest.js +683 -0
  104. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift.js +791 -0
  105. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript-harvest.js +1060 -0
  106. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript.js +587 -0
  107. package/dist/core/code/engine/core/ingestion/class-extractors/configs/c-cpp.js +77 -0
  108. package/dist/core/code/engine/core/ingestion/class-extractors/configs/csharp.js +24 -0
  109. package/dist/core/code/engine/core/ingestion/class-extractors/configs/dart.js +10 -0
  110. package/dist/core/code/engine/core/ingestion/class-extractors/configs/go.js +28 -0
  111. package/dist/core/code/engine/core/ingestion/class-extractors/configs/jvm.js +67 -0
  112. package/dist/core/code/engine/core/ingestion/class-extractors/configs/php.js +10 -0
  113. package/dist/core/code/engine/core/ingestion/class-extractors/configs/python.js +10 -0
  114. package/dist/core/code/engine/core/ingestion/class-extractors/configs/ruby.js +13 -0
  115. package/dist/core/code/engine/core/ingestion/class-extractors/configs/rust.js +10 -0
  116. package/dist/core/code/engine/core/ingestion/class-extractors/configs/swift.js +21 -0
  117. package/dist/core/code/engine/core/ingestion/class-extractors/configs/typescript-javascript.js +31 -0
  118. package/dist/core/code/engine/core/ingestion/class-extractors/generic.js +144 -0
  119. package/dist/core/code/engine/core/ingestion/class-types.js +2 -0
  120. package/dist/core/code/engine/core/ingestion/cluster-enricher.js +174 -0
  121. package/dist/core/code/engine/core/ingestion/community-processor.js +604 -0
  122. package/dist/core/code/engine/core/ingestion/constants.js +26 -0
  123. package/dist/core/code/engine/core/ingestion/cpp-ue-preprocessor.js +263 -0
  124. package/dist/core/code/engine/core/ingestion/csharp-namespace-gate.js +133 -0
  125. package/dist/core/code/engine/core/ingestion/di-extractors/index.js +38 -0
  126. package/dist/core/code/engine/core/ingestion/di-extractors/spring.js +310 -0
  127. package/dist/core/code/engine/core/ingestion/emit-references.js +244 -0
  128. package/dist/core/code/engine/core/ingestion/entry-point-scoring.js +201 -0
  129. package/dist/core/code/engine/core/ingestion/export-detection.js +244 -0
  130. package/dist/core/code/engine/core/ingestion/field-extractor.js +29 -0
  131. package/dist/core/code/engine/core/ingestion/field-extractors/configs/c-cpp.js +107 -0
  132. package/dist/core/code/engine/core/ingestion/field-extractors/configs/csharp.js +124 -0
  133. package/dist/core/code/engine/core/ingestion/field-extractors/configs/dart.js +99 -0
  134. package/dist/core/code/engine/core/ingestion/field-extractors/configs/go.js +102 -0
  135. package/dist/core/code/engine/core/ingestion/field-extractors/configs/helpers.js +198 -0
  136. package/dist/core/code/engine/core/ingestion/field-extractors/configs/jvm.js +172 -0
  137. package/dist/core/code/engine/core/ingestion/field-extractors/configs/php.js +67 -0
  138. package/dist/core/code/engine/core/ingestion/field-extractors/configs/python.js +94 -0
  139. package/dist/core/code/engine/core/ingestion/field-extractors/configs/ruby.js +79 -0
  140. package/dist/core/code/engine/core/ingestion/field-extractors/configs/rust.js +55 -0
  141. package/dist/core/code/engine/core/ingestion/field-extractors/configs/swift.js +93 -0
  142. package/dist/core/code/engine/core/ingestion/field-extractors/configs/typescript-javascript.js +59 -0
  143. package/dist/core/code/engine/core/ingestion/field-extractors/generic.js +147 -0
  144. package/dist/core/code/engine/core/ingestion/field-extractors/typescript.js +266 -0
  145. package/dist/core/code/engine/core/ingestion/field-types.js +3 -0
  146. package/dist/core/code/engine/core/ingestion/filesystem-walker.js +136 -0
  147. package/dist/core/code/engine/core/ingestion/finalize-orchestrator.js +159 -0
  148. package/dist/core/code/engine/core/ingestion/framework-detection.js +432 -0
  149. package/dist/core/code/engine/core/ingestion/frameworks/spring/analysis-features.js +38 -0
  150. package/dist/core/code/engine/core/ingestion/frameworks/spring/annotation-arguments.js +234 -0
  151. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop-candidates.js +88 -0
  152. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop.js +487 -0
  153. package/dist/core/code/engine/core/ingestion/frameworks/spring/auto-configuration.js +21 -0
  154. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-candidates.js +189 -0
  155. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-catalog.js +32 -0
  156. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-factories.js +73 -0
  157. package/dist/core/code/engine/core/ingestion/frameworks/spring/conditionals.js +323 -0
  158. package/dist/core/code/engine/core/ingestion/frameworks/spring/config-bindings.js +119 -0
  159. package/dist/core/code/engine/core/ingestion/frameworks/spring/di-metadata.js +385 -0
  160. package/dist/core/code/engine/core/ingestion/frameworks/spring/resource-injection.js +96 -0
  161. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/c-cpp.js +17 -0
  162. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/csharp.js +46 -0
  163. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/dart.js +59 -0
  164. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/go.js +30 -0
  165. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/jvm.js +73 -0
  166. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/php.js +19 -0
  167. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/python.js +45 -0
  168. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/ruby.js +20 -0
  169. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/rust.js +58 -0
  170. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/swift.js +94 -0
  171. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/typescript-javascript.js +26 -0
  172. package/dist/core/code/engine/core/ingestion/import-resolvers/csharp.js +128 -0
  173. package/dist/core/code/engine/core/ingestion/import-resolvers/go.js +50 -0
  174. package/dist/core/code/engine/core/ingestion/import-resolvers/jvm.js +112 -0
  175. package/dist/core/code/engine/core/ingestion/import-resolvers/php.js +80 -0
  176. package/dist/core/code/engine/core/ingestion/import-resolvers/python.js +75 -0
  177. package/dist/core/code/engine/core/ingestion/import-resolvers/resolver-factory.js +36 -0
  178. package/dist/core/code/engine/core/ingestion/import-resolvers/ruby.js +20 -0
  179. package/dist/core/code/engine/core/ingestion/import-resolvers/rust.js +79 -0
  180. package/dist/core/code/engine/core/ingestion/import-resolvers/standard.js +180 -0
  181. package/dist/core/code/engine/core/ingestion/import-resolvers/types.js +7 -0
  182. package/dist/core/code/engine/core/ingestion/import-resolvers/utils.js +153 -0
  183. package/dist/core/code/engine/core/ingestion/import-target-adapter.js +99 -0
  184. package/dist/core/code/engine/core/ingestion/language-config.js +391 -0
  185. package/dist/core/code/engine/core/ingestion/language-provider.js +25 -0
  186. package/dist/core/code/engine/core/ingestion/languages/c/arity-metadata.js +98 -0
  187. package/dist/core/code/engine/core/ingestion/languages/c/arity.js +21 -0
  188. package/dist/core/code/engine/core/ingestion/languages/c/capture-side-channel.js +69 -0
  189. package/dist/core/code/engine/core/ingestion/languages/c/captures.js +189 -0
  190. package/dist/core/code/engine/core/ingestion/languages/c/header-scan.js +58 -0
  191. package/dist/core/code/engine/core/ingestion/languages/c/import-decomposer.js +68 -0
  192. package/dist/core/code/engine/core/ingestion/languages/c/import-target.js +103 -0
  193. package/dist/core/code/engine/core/ingestion/languages/c/index.js +33 -0
  194. package/dist/core/code/engine/core/ingestion/languages/c/interpret.js +53 -0
  195. package/dist/core/code/engine/core/ingestion/languages/c/merge-bindings.js +26 -0
  196. package/dist/core/code/engine/core/ingestion/languages/c/query.js +210 -0
  197. package/dist/core/code/engine/core/ingestion/languages/c/scope-resolver.js +112 -0
  198. package/dist/core/code/engine/core/ingestion/languages/c/simple-hooks.js +24 -0
  199. package/dist/core/code/engine/core/ingestion/languages/c/static-linkage.js +109 -0
  200. package/dist/core/code/engine/core/ingestion/languages/c-cpp.js +506 -0
  201. package/dist/core/code/engine/core/ingestion/languages/cpp/adl.js +804 -0
  202. package/dist/core/code/engine/core/ingestion/languages/cpp/arity-metadata.js +258 -0
  203. package/dist/core/code/engine/core/ingestion/languages/cpp/arity.js +37 -0
  204. package/dist/core/code/engine/core/ingestion/languages/cpp/capture-side-channel.js +89 -0
  205. package/dist/core/code/engine/core/ingestion/languages/cpp/captures.js +1975 -0
  206. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-extractor.js +311 -0
  207. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-filter.js +210 -0
  208. package/dist/core/code/engine/core/ingestion/languages/cpp/conversion-rank.js +163 -0
  209. package/dist/core/code/engine/core/ingestion/languages/cpp/file-local-linkage.js +327 -0
  210. package/dist/core/code/engine/core/ingestion/languages/cpp/header-scan.js +53 -0
  211. package/dist/core/code/engine/core/ingestion/languages/cpp/import-decomposer.js +134 -0
  212. package/dist/core/code/engine/core/ingestion/languages/cpp/import-target.js +16 -0
  213. package/dist/core/code/engine/core/ingestion/languages/cpp/index.js +33 -0
  214. package/dist/core/code/engine/core/ingestion/languages/cpp/inline-namespaces.js +379 -0
  215. package/dist/core/code/engine/core/ingestion/languages/cpp/interpret.js +239 -0
  216. package/dist/core/code/engine/core/ingestion/languages/cpp/member-lookup.js +470 -0
  217. package/dist/core/code/engine/core/ingestion/languages/cpp/merge-bindings.js +32 -0
  218. package/dist/core/code/engine/core/ingestion/languages/cpp/query.js +763 -0
  219. package/dist/core/code/engine/core/ingestion/languages/cpp/range-bindings.js +230 -0
  220. package/dist/core/code/engine/core/ingestion/languages/cpp/scope-resolver.js +354 -0
  221. package/dist/core/code/engine/core/ingestion/languages/cpp/simple-hooks.js +67 -0
  222. package/dist/core/code/engine/core/ingestion/languages/cpp/two-phase-lookup.js +348 -0
  223. package/dist/core/code/engine/core/ingestion/languages/cpp/type-classifier.js +56 -0
  224. package/dist/core/code/engine/core/ingestion/languages/cpp/user-defined-conversions.js +128 -0
  225. package/dist/core/code/engine/core/ingestion/languages/csharp/accessor-unwrap.js +67 -0
  226. package/dist/core/code/engine/core/ingestion/languages/csharp/arity-metadata.js +49 -0
  227. package/dist/core/code/engine/core/ingestion/languages/csharp/arity.js +40 -0
  228. package/dist/core/code/engine/core/ingestion/languages/csharp/cache-stats.js +32 -0
  229. package/dist/core/code/engine/core/ingestion/languages/csharp/captures.js +557 -0
  230. package/dist/core/code/engine/core/ingestion/languages/csharp/import-decomposer.js +96 -0
  231. package/dist/core/code/engine/core/ingestion/languages/csharp/import-target.js +176 -0
  232. package/dist/core/code/engine/core/ingestion/languages/csharp/index.js +95 -0
  233. package/dist/core/code/engine/core/ingestion/languages/csharp/interpret.js +150 -0
  234. package/dist/core/code/engine/core/ingestion/languages/csharp/merge-bindings.js +58 -0
  235. package/dist/core/code/engine/core/ingestion/languages/csharp/namespace-siblings.js +708 -0
  236. package/dist/core/code/engine/core/ingestion/languages/csharp/qualified-type-names.js +62 -0
  237. package/dist/core/code/engine/core/ingestion/languages/csharp/query.js +578 -0
  238. package/dist/core/code/engine/core/ingestion/languages/csharp/receiver-binding.js +142 -0
  239. package/dist/core/code/engine/core/ingestion/languages/csharp/resolution-config.js +18 -0
  240. package/dist/core/code/engine/core/ingestion/languages/csharp/scope-resolver.js +84 -0
  241. package/dist/core/code/engine/core/ingestion/languages/csharp/simple-hooks.js +81 -0
  242. package/dist/core/code/engine/core/ingestion/languages/csharp.js +204 -0
  243. package/dist/core/code/engine/core/ingestion/languages/dart/arity-metadata.js +38 -0
  244. package/dist/core/code/engine/core/ingestion/languages/dart/arity.js +34 -0
  245. package/dist/core/code/engine/core/ingestion/languages/dart/built-ins.js +37 -0
  246. package/dist/core/code/engine/core/ingestion/languages/dart/cache-stats.js +30 -0
  247. package/dist/core/code/engine/core/ingestion/languages/dart/captures.js +1096 -0
  248. package/dist/core/code/engine/core/ingestion/languages/dart/expand-wildcards.js +34 -0
  249. package/dist/core/code/engine/core/ingestion/languages/dart/extension-type-preprocess.js +33 -0
  250. package/dist/core/code/engine/core/ingestion/languages/dart/import-target.js +68 -0
  251. package/dist/core/code/engine/core/ingestion/languages/dart/index.js +45 -0
  252. package/dist/core/code/engine/core/ingestion/languages/dart/interpret.js +101 -0
  253. package/dist/core/code/engine/core/ingestion/languages/dart/merge-bindings.js +42 -0
  254. package/dist/core/code/engine/core/ingestion/languages/dart/query.js +246 -0
  255. package/dist/core/code/engine/core/ingestion/languages/dart/receiver-binding.js +90 -0
  256. package/dist/core/code/engine/core/ingestion/languages/dart/scope-resolver.js +197 -0
  257. package/dist/core/code/engine/core/ingestion/languages/dart/signature-bindings.js +54 -0
  258. package/dist/core/code/engine/core/ingestion/languages/dart/simple-hooks.js +61 -0
  259. package/dist/core/code/engine/core/ingestion/languages/dart.js +138 -0
  260. package/dist/core/code/engine/core/ingestion/languages/go/arity-metadata.js +71 -0
  261. package/dist/core/code/engine/core/ingestion/languages/go/arity.js +17 -0
  262. package/dist/core/code/engine/core/ingestion/languages/go/cache-stats.js +21 -0
  263. package/dist/core/code/engine/core/ingestion/languages/go/captures.js +492 -0
  264. package/dist/core/code/engine/core/ingestion/languages/go/expand-wildcards.js +97 -0
  265. package/dist/core/code/engine/core/ingestion/languages/go/generic-type-parameters.js +146 -0
  266. package/dist/core/code/engine/core/ingestion/languages/go/import-decomposer.js +47 -0
  267. package/dist/core/code/engine/core/ingestion/languages/go/import-target.js +70 -0
  268. package/dist/core/code/engine/core/ingestion/languages/go/index.js +39 -0
  269. package/dist/core/code/engine/core/ingestion/languages/go/interface-impls.js +955 -0
  270. package/dist/core/code/engine/core/ingestion/languages/go/interpret.js +177 -0
  271. package/dist/core/code/engine/core/ingestion/languages/go/merge-bindings.js +21 -0
  272. package/dist/core/code/engine/core/ingestion/languages/go/method-owners.js +131 -0
  273. package/dist/core/code/engine/core/ingestion/languages/go/namespace-mirror.js +56 -0
  274. package/dist/core/code/engine/core/ingestion/languages/go/package-clause.js +79 -0
  275. package/dist/core/code/engine/core/ingestion/languages/go/package-siblings.js +83 -0
  276. package/dist/core/code/engine/core/ingestion/languages/go/query.js +298 -0
  277. package/dist/core/code/engine/core/ingestion/languages/go/range-binding.js +127 -0
  278. package/dist/core/code/engine/core/ingestion/languages/go/receiver-binding.js +24 -0
  279. package/dist/core/code/engine/core/ingestion/languages/go/scope-resolver.js +75 -0
  280. package/dist/core/code/engine/core/ingestion/languages/go/simple-hooks.js +31 -0
  281. package/dist/core/code/engine/core/ingestion/languages/go/type-binding.js +279 -0
  282. package/dist/core/code/engine/core/ingestion/languages/go.js +160 -0
  283. package/dist/core/code/engine/core/ingestion/languages/index.js +66 -0
  284. package/dist/core/code/engine/core/ingestion/languages/java/analysis-features.js +16 -0
  285. package/dist/core/code/engine/core/ingestion/languages/java/arity-metadata.js +43 -0
  286. package/dist/core/code/engine/core/ingestion/languages/java/arity.js +27 -0
  287. package/dist/core/code/engine/core/ingestion/languages/java/cache-stats.js +32 -0
  288. package/dist/core/code/engine/core/ingestion/languages/java/capture-side-channel.js +123 -0
  289. package/dist/core/code/engine/core/ingestion/languages/java/captures.js +791 -0
  290. package/dist/core/code/engine/core/ingestion/languages/java/import-decomposer.js +88 -0
  291. package/dist/core/code/engine/core/ingestion/languages/java/import-target.js +103 -0
  292. package/dist/core/code/engine/core/ingestion/languages/java/index.js +43 -0
  293. package/dist/core/code/engine/core/ingestion/languages/java/interpret.js +146 -0
  294. package/dist/core/code/engine/core/ingestion/languages/java/merge-bindings.js +43 -0
  295. package/dist/core/code/engine/core/ingestion/languages/java/package-facts.js +16 -0
  296. package/dist/core/code/engine/core/ingestion/languages/java/package-siblings.js +11 -0
  297. package/dist/core/code/engine/core/ingestion/languages/java/query.js +319 -0
  298. package/dist/core/code/engine/core/ingestion/languages/java/receiver-binding.js +98 -0
  299. package/dist/core/code/engine/core/ingestion/languages/java/scope-resolver.js +213 -0
  300. package/dist/core/code/engine/core/ingestion/languages/java/simple-hooks.js +39 -0
  301. package/dist/core/code/engine/core/ingestion/languages/java/spring-aop.js +53 -0
  302. package/dist/core/code/engine/core/ingestion/languages/java/spring-bean-metadata.js +11 -0
  303. package/dist/core/code/engine/core/ingestion/languages/java/spring-conditionals.js +52 -0
  304. package/dist/core/code/engine/core/ingestion/languages/java/spring-config-bindings.js +222 -0
  305. package/dist/core/code/engine/core/ingestion/languages/java/spring-di.js +165 -0
  306. package/dist/core/code/engine/core/ingestion/languages/java.js +192 -0
  307. package/dist/core/code/engine/core/ingestion/languages/javascript/arity.js +15 -0
  308. package/dist/core/code/engine/core/ingestion/languages/javascript/captures.js +1122 -0
  309. package/dist/core/code/engine/core/ingestion/languages/javascript/import-target.js +56 -0
  310. package/dist/core/code/engine/core/ingestion/languages/javascript/index.js +109 -0
  311. package/dist/core/code/engine/core/ingestion/languages/javascript/interpret.js +45 -0
  312. package/dist/core/code/engine/core/ingestion/languages/javascript/merge-bindings.js +21 -0
  313. package/dist/core/code/engine/core/ingestion/languages/javascript/query.js +659 -0
  314. package/dist/core/code/engine/core/ingestion/languages/javascript/scope-resolver.js +78 -0
  315. package/dist/core/code/engine/core/ingestion/languages/javascript/simple-hooks.js +44 -0
  316. package/dist/core/code/engine/core/ingestion/languages/jvm/package-facts.js +46 -0
  317. package/dist/core/code/engine/core/ingestion/languages/jvm/package-siblings.js +200 -0
  318. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity-metadata.js +23 -0
  319. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity.js +18 -0
  320. package/dist/core/code/engine/core/ingestion/languages/kotlin/cache-stats.js +21 -0
  321. package/dist/core/code/engine/core/ingestion/languages/kotlin/capture-side-channel.js +160 -0
  322. package/dist/core/code/engine/core/ingestion/languages/kotlin/captures.js +1262 -0
  323. package/dist/core/code/engine/core/ingestion/languages/kotlin/companion-scopes.js +72 -0
  324. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-decomposer.js +40 -0
  325. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-target.js +135 -0
  326. package/dist/core/code/engine/core/ingestion/languages/kotlin/index.js +26 -0
  327. package/dist/core/code/engine/core/ingestion/languages/kotlin/interpret.js +75 -0
  328. package/dist/core/code/engine/core/ingestion/languages/kotlin/merge-bindings.js +28 -0
  329. package/dist/core/code/engine/core/ingestion/languages/kotlin/owners.js +134 -0
  330. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-facts.js +16 -0
  331. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-siblings.js +11 -0
  332. package/dist/core/code/engine/core/ingestion/languages/kotlin/query.js +243 -0
  333. package/dist/core/code/engine/core/ingestion/languages/kotlin/receiver-binding.js +103 -0
  334. package/dist/core/code/engine/core/ingestion/languages/kotlin/scope-resolver.js +207 -0
  335. package/dist/core/code/engine/core/ingestion/languages/kotlin/simple-hooks.js +42 -0
  336. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-aop.js +68 -0
  337. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-bean-metadata.js +11 -0
  338. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-conditionals.js +53 -0
  339. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-di.js +304 -0
  340. package/dist/core/code/engine/core/ingestion/languages/kotlin.js +189 -0
  341. package/dist/core/code/engine/core/ingestion/languages/php/arity-metadata.js +66 -0
  342. package/dist/core/code/engine/core/ingestion/languages/php/arity.js +43 -0
  343. package/dist/core/code/engine/core/ingestion/languages/php/cache-stats.js +32 -0
  344. package/dist/core/code/engine/core/ingestion/languages/php/captures.js +1166 -0
  345. package/dist/core/code/engine/core/ingestion/languages/php/import-decomposer.js +238 -0
  346. package/dist/core/code/engine/core/ingestion/languages/php/import-target.js +213 -0
  347. package/dist/core/code/engine/core/ingestion/languages/php/index.js +85 -0
  348. package/dist/core/code/engine/core/ingestion/languages/php/interpret.js +256 -0
  349. package/dist/core/code/engine/core/ingestion/languages/php/merge-bindings.js +50 -0
  350. package/dist/core/code/engine/core/ingestion/languages/php/namespace-siblings.js +353 -0
  351. package/dist/core/code/engine/core/ingestion/languages/php/query.js +391 -0
  352. package/dist/core/code/engine/core/ingestion/languages/php/receiver-binding.js +135 -0
  353. package/dist/core/code/engine/core/ingestion/languages/php/scope-resolver.js +361 -0
  354. package/dist/core/code/engine/core/ingestion/languages/php/simple-hooks.js +116 -0
  355. package/dist/core/code/engine/core/ingestion/languages/php.js +302 -0
  356. package/dist/core/code/engine/core/ingestion/languages/python/arity-metadata.js +49 -0
  357. package/dist/core/code/engine/core/ingestion/languages/python/arity.js +41 -0
  358. package/dist/core/code/engine/core/ingestion/languages/python/cache-stats.js +34 -0
  359. package/dist/core/code/engine/core/ingestion/languages/python/captures.js +299 -0
  360. package/dist/core/code/engine/core/ingestion/languages/python/depends-references.js +68 -0
  361. package/dist/core/code/engine/core/ingestion/languages/python/import-decomposer.js +115 -0
  362. package/dist/core/code/engine/core/ingestion/languages/python/import-target.js +440 -0
  363. package/dist/core/code/engine/core/ingestion/languages/python/index-stats.js +30 -0
  364. package/dist/core/code/engine/core/ingestion/languages/python/index.js +96 -0
  365. package/dist/core/code/engine/core/ingestion/languages/python/interpret.js +430 -0
  366. package/dist/core/code/engine/core/ingestion/languages/python/merge-bindings.js +47 -0
  367. package/dist/core/code/engine/core/ingestion/languages/python/query.js +323 -0
  368. package/dist/core/code/engine/core/ingestion/languages/python/receiver-binding.js +310 -0
  369. package/dist/core/code/engine/core/ingestion/languages/python/scope-resolver.js +80 -0
  370. package/dist/core/code/engine/core/ingestion/languages/python/simple-hooks.js +53 -0
  371. package/dist/core/code/engine/core/ingestion/languages/python.js +140 -0
  372. package/dist/core/code/engine/core/ingestion/languages/ruby/arity.js +41 -0
  373. package/dist/core/code/engine/core/ingestion/languages/ruby/cache-stats.js +21 -0
  374. package/dist/core/code/engine/core/ingestion/languages/ruby/captures.js +864 -0
  375. package/dist/core/code/engine/core/ingestion/languages/ruby/import-target.js +88 -0
  376. package/dist/core/code/engine/core/ingestion/languages/ruby/index.js +29 -0
  377. package/dist/core/code/engine/core/ingestion/languages/ruby/interpret.js +115 -0
  378. package/dist/core/code/engine/core/ingestion/languages/ruby/merge-bindings.js +21 -0
  379. package/dist/core/code/engine/core/ingestion/languages/ruby/query.js +349 -0
  380. package/dist/core/code/engine/core/ingestion/languages/ruby/receiver-binding.js +70 -0
  381. package/dist/core/code/engine/core/ingestion/languages/ruby/scope-resolver.js +263 -0
  382. package/dist/core/code/engine/core/ingestion/languages/ruby/simple-hooks.js +68 -0
  383. package/dist/core/code/engine/core/ingestion/languages/ruby.js +215 -0
  384. package/dist/core/code/engine/core/ingestion/languages/rust/arity.js +16 -0
  385. package/dist/core/code/engine/core/ingestion/languages/rust/cache-stats.js +21 -0
  386. package/dist/core/code/engine/core/ingestion/languages/rust/captures.js +304 -0
  387. package/dist/core/code/engine/core/ingestion/languages/rust/import-decomposer.js +167 -0
  388. package/dist/core/code/engine/core/ingestion/languages/rust/import-target.js +108 -0
  389. package/dist/core/code/engine/core/ingestion/languages/rust/index.js +29 -0
  390. package/dist/core/code/engine/core/ingestion/languages/rust/interpret.js +201 -0
  391. package/dist/core/code/engine/core/ingestion/languages/rust/merge-bindings.js +21 -0
  392. package/dist/core/code/engine/core/ingestion/languages/rust/method-owners.js +76 -0
  393. package/dist/core/code/engine/core/ingestion/languages/rust/module-path.js +222 -0
  394. package/dist/core/code/engine/core/ingestion/languages/rust/qualified-call.js +482 -0
  395. package/dist/core/code/engine/core/ingestion/languages/rust/query.js +280 -0
  396. package/dist/core/code/engine/core/ingestion/languages/rust/range-binding.js +687 -0
  397. package/dist/core/code/engine/core/ingestion/languages/rust/receiver-binding.js +148 -0
  398. package/dist/core/code/engine/core/ingestion/languages/rust/scope-resolver.js +151 -0
  399. package/dist/core/code/engine/core/ingestion/languages/rust/simple-hooks.js +32 -0
  400. package/dist/core/code/engine/core/ingestion/languages/rust.js +183 -0
  401. package/dist/core/code/engine/core/ingestion/languages/swift/arity-metadata.js +44 -0
  402. package/dist/core/code/engine/core/ingestion/languages/swift/arity.js +45 -0
  403. package/dist/core/code/engine/core/ingestion/languages/swift/base-type.js +30 -0
  404. package/dist/core/code/engine/core/ingestion/languages/swift/cache-stats.js +32 -0
  405. package/dist/core/code/engine/core/ingestion/languages/swift/captures.js +594 -0
  406. package/dist/core/code/engine/core/ingestion/languages/swift/conditional-directive-preprocess.js +256 -0
  407. package/dist/core/code/engine/core/ingestion/languages/swift/implicit-imports.js +60 -0
  408. package/dist/core/code/engine/core/ingestion/languages/swift/import-decomposer.js +87 -0
  409. package/dist/core/code/engine/core/ingestion/languages/swift/import-target.js +84 -0
  410. package/dist/core/code/engine/core/ingestion/languages/swift/index.js +56 -0
  411. package/dist/core/code/engine/core/ingestion/languages/swift/interpret.js +93 -0
  412. package/dist/core/code/engine/core/ingestion/languages/swift/merge-bindings.js +51 -0
  413. package/dist/core/code/engine/core/ingestion/languages/swift/query.js +226 -0
  414. package/dist/core/code/engine/core/ingestion/languages/swift/receiver-binding.js +169 -0
  415. package/dist/core/code/engine/core/ingestion/languages/swift/scope-resolver.js +192 -0
  416. package/dist/core/code/engine/core/ingestion/languages/swift/sibling-type-bindings.js +68 -0
  417. package/dist/core/code/engine/core/ingestion/languages/swift/signature-bindings.js +69 -0
  418. package/dist/core/code/engine/core/ingestion/languages/swift/simple-hooks.js +65 -0
  419. package/dist/core/code/engine/core/ingestion/languages/swift/target-grouping.js +97 -0
  420. package/dist/core/code/engine/core/ingestion/languages/swift/target-siblings.js +74 -0
  421. package/dist/core/code/engine/core/ingestion/languages/swift.js +246 -0
  422. package/dist/core/code/engine/core/ingestion/languages/typescript/arity-metadata.js +106 -0
  423. package/dist/core/code/engine/core/ingestion/languages/typescript/arity.js +57 -0
  424. package/dist/core/code/engine/core/ingestion/languages/typescript/array-callback.js +58 -0
  425. package/dist/core/code/engine/core/ingestion/languages/typescript/cache-stats.js +34 -0
  426. package/dist/core/code/engine/core/ingestion/languages/typescript/captures.js +956 -0
  427. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-export-assignment.js +535 -0
  428. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-module-exports.js +196 -0
  429. package/dist/core/code/engine/core/ingestion/languages/typescript/import-decomposer.js +374 -0
  430. package/dist/core/code/engine/core/ingestion/languages/typescript/import-target.js +65 -0
  431. package/dist/core/code/engine/core/ingestion/languages/typescript/index.js +108 -0
  432. package/dist/core/code/engine/core/ingestion/languages/typescript/interpret.js +344 -0
  433. package/dist/core/code/engine/core/ingestion/languages/typescript/merge-bindings.js +161 -0
  434. package/dist/core/code/engine/core/ingestion/languages/typescript/nuxt-auto-imports.js +325 -0
  435. package/dist/core/code/engine/core/ingestion/languages/typescript/query.js +1328 -0
  436. package/dist/core/code/engine/core/ingestion/languages/typescript/receiver-binding.js +201 -0
  437. package/dist/core/code/engine/core/ingestion/languages/typescript/scope-resolver.js +293 -0
  438. package/dist/core/code/engine/core/ingestion/languages/typescript/simple-hooks.js +139 -0
  439. package/dist/core/code/engine/core/ingestion/languages/typescript.js +455 -0
  440. package/dist/core/code/engine/core/ingestion/languages/vue/captures.js +70 -0
  441. package/dist/core/code/engine/core/ingestion/languages/vue/import-target.js +61 -0
  442. package/dist/core/code/engine/core/ingestion/languages/vue/index.js +55 -0
  443. package/dist/core/code/engine/core/ingestion/languages/vue/scope-resolver.js +295 -0
  444. package/dist/core/code/engine/core/ingestion/languages/vue.js +96 -0
  445. package/dist/core/code/engine/core/ingestion/local-symbol-pruner.js +68 -0
  446. package/dist/core/code/engine/core/ingestion/method-extractors/configs/c-cpp.js +387 -0
  447. package/dist/core/code/engine/core/ingestion/method-extractors/configs/csharp.js +290 -0
  448. package/dist/core/code/engine/core/ingestion/method-extractors/configs/dart.js +392 -0
  449. package/dist/core/code/engine/core/ingestion/method-extractors/configs/go.js +179 -0
  450. package/dist/core/code/engine/core/ingestion/method-extractors/configs/jvm.js +350 -0
  451. package/dist/core/code/engine/core/ingestion/method-extractors/configs/php.js +306 -0
  452. package/dist/core/code/engine/core/ingestion/method-extractors/configs/python.js +312 -0
  453. package/dist/core/code/engine/core/ingestion/method-extractors/configs/ruby.js +289 -0
  454. package/dist/core/code/engine/core/ingestion/method-extractors/configs/rust.js +198 -0
  455. package/dist/core/code/engine/core/ingestion/method-extractors/configs/swift.js +286 -0
  456. package/dist/core/code/engine/core/ingestion/method-extractors/configs/typescript-javascript.js +341 -0
  457. package/dist/core/code/engine/core/ingestion/method-extractors/generic.js +209 -0
  458. package/dist/core/code/engine/core/ingestion/method-types.js +3 -0
  459. package/dist/core/code/engine/core/ingestion/model/field-registry.js +41 -0
  460. package/dist/core/code/engine/core/ingestion/model/index.js +52 -0
  461. package/dist/core/code/engine/core/ingestion/model/method-registry.js +138 -0
  462. package/dist/core/code/engine/core/ingestion/model/owned-members-lookup.js +46 -0
  463. package/dist/core/code/engine/core/ingestion/model/registration-table.js +234 -0
  464. package/dist/core/code/engine/core/ingestion/model/resolve.js +183 -0
  465. package/dist/core/code/engine/core/ingestion/model/scope-resolution-indexes.js +43 -0
  466. package/dist/core/code/engine/core/ingestion/model/semantic-model.js +179 -0
  467. package/dist/core/code/engine/core/ingestion/model/symbol-table.js +216 -0
  468. package/dist/core/code/engine/core/ingestion/model/type-registry.js +84 -0
  469. package/dist/core/code/engine/core/ingestion/mro-processor.js +709 -0
  470. package/dist/core/code/engine/core/ingestion/parsing-processor.js +312 -0
  471. package/dist/core/code/engine/core/ingestion/pipeline-phases/communities.js +69 -0
  472. package/dist/core/code/engine/core/ingestion/pipeline-phases/cross-file.js +71 -0
  473. package/dist/core/code/engine/core/ingestion/pipeline-phases/di.js +338 -0
  474. package/dist/core/code/engine/core/ingestion/pipeline-phases/http-api-calls.js +312 -0
  475. package/dist/core/code/engine/core/ingestion/pipeline-phases/index.js +54 -0
  476. package/dist/core/code/engine/core/ingestion/pipeline-phases/mro.js +40 -0
  477. package/dist/core/code/engine/core/ingestion/pipeline-phases/orm.js +78 -0
  478. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse-impl.js +1286 -0
  479. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse.js +41 -0
  480. package/dist/core/code/engine/core/ingestion/pipeline-phases/processes.js +193 -0
  481. package/dist/core/code/engine/core/ingestion/pipeline-phases/prune-local-symbols.js +29 -0
  482. package/dist/core/code/engine/core/ingestion/pipeline-phases/registry.js +52 -0
  483. package/dist/core/code/engine/core/ingestion/pipeline-phases/routes.js +409 -0
  484. package/dist/core/code/engine/core/ingestion/pipeline-phases/rpc-edges.js +301 -0
  485. package/dist/core/code/engine/core/ingestion/pipeline-phases/runner.js +207 -0
  486. package/dist/core/code/engine/core/ingestion/pipeline-phases/scan.js +49 -0
  487. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-aop.js +442 -0
  488. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-auto-configuration.js +264 -0
  489. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-config.js +440 -0
  490. package/dist/core/code/engine/core/ingestion/pipeline-phases/structure.js +38 -0
  491. package/dist/core/code/engine/core/ingestion/pipeline-phases/tools.js +89 -0
  492. package/dist/core/code/engine/core/ingestion/pipeline-phases/types.js +40 -0
  493. package/dist/core/code/engine/core/ingestion/pipeline.js +152 -0
  494. package/dist/core/code/engine/core/ingestion/process-processor.js +325 -0
  495. package/dist/core/code/engine/core/ingestion/resolve-references.js +205 -0
  496. package/dist/core/code/engine/core/ingestion/route-extractors/constant-resolver.js +135 -0
  497. package/dist/core/code/engine/core/ingestion/route-extractors/django-root-discovery.js +221 -0
  498. package/dist/core/code/engine/core/ingestion/route-extractors/django.js +428 -0
  499. package/dist/core/code/engine/core/ingestion/route-extractors/expo.js +39 -0
  500. package/dist/core/code/engine/core/ingestion/route-extractors/fastapi-router-bindings.js +264 -0
  501. package/dist/core/code/engine/core/ingestion/route-extractors/laravel.js +501 -0
  502. package/dist/core/code/engine/core/ingestion/route-extractors/middleware.js +175 -0
  503. package/dist/core/code/engine/core/ingestion/route-extractors/nextjs.js +81 -0
  504. package/dist/core/code/engine/core/ingestion/route-extractors/php.js +25 -0
  505. package/dist/core/code/engine/core/ingestion/route-extractors/python-const-resolver.js +307 -0
  506. package/dist/core/code/engine/core/ingestion/route-extractors/response-shapes.js +299 -0
  507. package/dist/core/code/engine/core/ingestion/route-extractors/route-path.js +71 -0
  508. package/dist/core/code/engine/core/ingestion/route-extractors/spring-shared.js +310 -0
  509. package/dist/core/code/engine/core/ingestion/route-extractors/spring.js +441 -0
  510. package/dist/core/code/engine/core/ingestion/scope-extractor-bridge.js +60 -0
  511. package/dist/core/code/engine/core/ingestion/scope-extractor.js +1373 -0
  512. package/dist/core/code/engine/core/ingestion/scope-resolution/contract/scope-resolver.js +282 -0
  513. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +72 -0
  514. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/edges.js +194 -0
  515. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/ids.js +472 -0
  516. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +49 -0
  517. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/method-dispatch.js +43 -0
  518. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +274 -0
  519. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +93 -0
  520. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/callable-value-flow.js +1240 -0
  521. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/compound-receiver.js +1174 -0
  522. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/free-call-fallback.js +873 -0
  523. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/imported-return-types.js +226 -0
  524. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/mro.js +107 -0
  525. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/overload-narrowing.js +441 -0
  526. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/property-dispatch.js +122 -0
  527. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +1720 -0
  528. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/phase.js +395 -0
  529. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +208 -0
  530. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/registry.js +49 -0
  531. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/run.js +632 -0
  532. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/validate-bindings-immutability.js +112 -0
  533. package/dist/core/code/engine/core/ingestion/scope-resolution/resolution-outcome.js +41 -0
  534. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/namespace-targets.js +81 -0
  535. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/walkers.js +1835 -0
  536. package/dist/core/code/engine/core/ingestion/scope-resolution/unresolved-receivers.js +242 -0
  537. package/dist/core/code/engine/core/ingestion/scope-resolution/utils/definition-id.js +22 -0
  538. package/dist/core/code/engine/core/ingestion/scope-resolution/workspace-index.js +151 -0
  539. package/dist/core/code/engine/core/ingestion/structure-processor.js +40 -0
  540. package/dist/core/code/engine/core/ingestion/tree-sitter-queries.js +2244 -0
  541. package/dist/core/code/engine/core/ingestion/ts-js-hoc-utils.js +115 -0
  542. package/dist/core/code/engine/core/ingestion/type-env.js +1136 -0
  543. package/dist/core/code/engine/core/ingestion/type-extractors/c-cpp.js +555 -0
  544. package/dist/core/code/engine/core/ingestion/type-extractors/csharp.js +570 -0
  545. package/dist/core/code/engine/core/ingestion/type-extractors/dart.js +372 -0
  546. package/dist/core/code/engine/core/ingestion/type-extractors/go.js +508 -0
  547. package/dist/core/code/engine/core/ingestion/type-extractors/jvm.js +875 -0
  548. package/dist/core/code/engine/core/ingestion/type-extractors/php.js +537 -0
  549. package/dist/core/code/engine/core/ingestion/type-extractors/python.js +477 -0
  550. package/dist/core/code/engine/core/ingestion/type-extractors/ruby.js +380 -0
  551. package/dist/core/code/engine/core/ingestion/type-extractors/rust.js +502 -0
  552. package/dist/core/code/engine/core/ingestion/type-extractors/shared.js +843 -0
  553. package/dist/core/code/engine/core/ingestion/type-extractors/swift.js +490 -0
  554. package/dist/core/code/engine/core/ingestion/type-extractors/types.js +2 -0
  555. package/dist/core/code/engine/core/ingestion/type-extractors/typescript.js +690 -0
  556. package/dist/core/code/engine/core/ingestion/utils/ast-helpers.js +1693 -0
  557. package/dist/core/code/engine/core/ingestion/utils/call-analysis.js +779 -0
  558. package/dist/core/code/engine/core/ingestion/utils/callable-flow-captures.js +932 -0
  559. package/dist/core/code/engine/core/ingestion/utils/callable-labels.js +49 -0
  560. package/dist/core/code/engine/core/ingestion/utils/deferred-resolution-profile.js +151 -0
  561. package/dist/core/code/engine/core/ingestion/utils/effective-ram.js +67 -0
  562. package/dist/core/code/engine/core/ingestion/utils/env.js +60 -0
  563. package/dist/core/code/engine/core/ingestion/utils/event-loop.js +9 -0
  564. package/dist/core/code/engine/core/ingestion/utils/graph-sort.js +103 -0
  565. package/dist/core/code/engine/core/ingestion/utils/heap-probe.js +45 -0
  566. package/dist/core/code/engine/core/ingestion/utils/heritage-marker.js +47 -0
  567. package/dist/core/code/engine/core/ingestion/utils/line-base.js +24 -0
  568. package/dist/core/code/engine/core/ingestion/utils/max-file-size.js +59 -0
  569. package/dist/core/code/engine/core/ingestion/utils/method-props.js +198 -0
  570. package/dist/core/code/engine/core/ingestion/utils/qualified-name.js +73 -0
  571. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-captures.js +60 -0
  572. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-codec.js +188 -0
  573. package/dist/core/code/engine/core/ingestion/utils/scope-tree-walk.js +36 -0
  574. package/dist/core/code/engine/core/ingestion/utils/symbol-labels.js +48 -0
  575. package/dist/core/code/engine/core/ingestion/utils/template-arguments.js +187 -0
  576. package/dist/core/code/engine/core/ingestion/utils/type-parameters.js +209 -0
  577. package/dist/core/code/engine/core/ingestion/utils/verbose.js +6 -0
  578. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/c-cpp.js +133 -0
  579. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/csharp.js +66 -0
  580. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/dart.js +111 -0
  581. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/go.js +153 -0
  582. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/jvm.js +145 -0
  583. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/php.js +61 -0
  584. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/python.js +104 -0
  585. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/ruby.js +55 -0
  586. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/rust.js +79 -0
  587. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/swift.js +91 -0
  588. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/typescript-javascript.js +86 -0
  589. package/dist/core/code/engine/core/ingestion/variable-extractors/generic.js +111 -0
  590. package/dist/core/code/engine/core/ingestion/variable-types.js +3 -0
  591. package/dist/core/code/engine/core/ingestion/vue-sfc-extractor.js +544 -0
  592. package/dist/core/code/engine/core/ingestion/workers/callable-id.js +122 -0
  593. package/dist/core/code/engine/core/ingestion/workers/clone-safety.js +470 -0
  594. package/dist/core/code/engine/core/ingestion/workers/parse-worker.js +2456 -0
  595. package/dist/core/code/engine/core/ingestion/workers/post-result.js +90 -0
  596. package/dist/core/code/engine/core/ingestion/workers/quarantine.js +41 -0
  597. package/dist/core/code/engine/core/ingestion/workers/result-merge.js +59 -0
  598. package/dist/core/code/engine/core/ingestion/workers/worker-pool.js +1725 -0
  599. package/dist/core/code/engine/core/ingestion/workspace-config.js +139 -0
  600. package/dist/core/code/engine/core/lbug/conn-lock.js +72 -0
  601. package/dist/core/code/engine/core/lbug/csv-generator.js +710 -0
  602. package/dist/core/code/engine/core/lbug/cypher-escape.js +24 -0
  603. package/dist/core/code/engine/core/lbug/extension-load-error.js +339 -0
  604. package/dist/core/code/engine/core/lbug/extension-loader.js +261 -0
  605. package/dist/core/code/engine/core/lbug/graph-emit-sink.js +584 -0
  606. package/dist/core/code/engine/core/lbug/lbug-adapter.js +2703 -0
  607. package/dist/core/code/engine/core/lbug/lbug-config.js +1029 -0
  608. package/dist/core/code/engine/core/lbug/native-check.js +435 -0
  609. package/dist/core/code/engine/core/lbug/pool-adapter.js +973 -0
  610. package/dist/core/code/engine/core/lbug/query-params.js +25 -0
  611. package/dist/core/code/engine/core/lbug/query-result-utils.js +31 -0
  612. package/dist/core/code/engine/core/lbug/rel-pair-routing.js +373 -0
  613. package/dist/core/code/engine/core/lbug/schema.js +771 -0
  614. package/dist/core/code/engine/core/lbug/shutdown-helpers.js +40 -0
  615. package/dist/core/code/engine/core/lbug/sidecar-recovery.js +716 -0
  616. package/dist/core/code/engine/core/lbug/stdio-capture.js +49 -0
  617. package/dist/core/code/engine/core/lbug/sync-csv-writer.js +115 -0
  618. package/dist/core/code/engine/core/lbug/wal-checkpoint-driver.js +215 -0
  619. package/dist/core/code/engine/core/lbug/wal-driver-state.js +28 -0
  620. package/dist/core/code/engine/core/logger.js +339 -0
  621. package/dist/core/code/engine/core/platform/capabilities.js +91 -0
  622. package/dist/core/code/engine/core/run-analyze.js +1098 -0
  623. package/dist/core/code/engine/core/tree-sitter/parser-loader.js +281 -0
  624. package/dist/core/code/engine/core/tree-sitter/safe-parse.js +258 -0
  625. package/dist/core/code/engine/core/tree-sitter/vendored-grammars.js +64 -0
  626. package/dist/core/code/engine/lib/utils.js +121 -0
  627. package/dist/core/code/engine/mcp/core/lbug-adapter.js +27 -0
  628. package/dist/core/code/engine/mcp/local/aop-metadata.js +230 -0
  629. package/dist/core/code/engine/mcp/local/bean-metadata.js +49 -0
  630. package/dist/core/code/engine/mcp/local/limits.js +15 -0
  631. package/dist/core/code/engine/mcp/local/line-display.js +6 -0
  632. package/dist/core/code/engine/mcp/local/local-backend.js +4142 -0
  633. package/dist/core/code/engine/storage/branch-index.js +72 -0
  634. package/dist/core/code/engine/storage/file-hash.js +95 -0
  635. package/dist/core/code/engine/storage/fs-atomic.js +34 -0
  636. package/dist/core/code/engine/storage/git.js +555 -0
  637. package/dist/core/code/engine/storage/index-lock.js +664 -0
  638. package/dist/core/code/engine/storage/parse-cache.js +650 -0
  639. package/dist/core/code/engine/storage/parsedfile-store.js +620 -0
  640. package/dist/core/code/engine/storage/repo-manager.js +1061 -0
  641. package/dist/core/code/engine/storage/scope-index-store.js +247 -0
  642. package/dist/core/code/engine/types/pipeline.js +2 -0
  643. package/dist/core/code/scripts/install-duckdb-extension.mjs +125 -0
  644. package/dist/core/code/scripts/resolve-analyze-cmd.cjs +346 -0
  645. package/dist/core/code/shared/graph/types.js +8 -0
  646. package/dist/core/code/shared/index.js +105 -0
  647. package/dist/core/code/shared/integrations/circuit-breaker.js +242 -0
  648. package/dist/core/code/shared/integrations/resilient-fetch.js +224 -0
  649. package/dist/core/code/shared/integrations/retry.js +70 -0
  650. package/dist/core/code/shared/integrations/understand-quickly.js +145 -0
  651. package/dist/core/code/shared/language-detection.js +162 -0
  652. package/dist/core/code/shared/languages.js +27 -0
  653. package/dist/core/code/shared/lbug/schema-constants.js +98 -0
  654. package/dist/core/code/shared/mro-strategy.js +2 -0
  655. package/dist/core/code/shared/pipeline.js +5 -0
  656. package/dist/core/code/shared/scope-resolution/callable-flow-site.js +11 -0
  657. package/dist/core/code/shared/scope-resolution/def-index.js +53 -0
  658. package/dist/core/code/shared/scope-resolution/evidence-weights.js +87 -0
  659. package/dist/core/code/shared/scope-resolution/finalize-algorithm.js +807 -0
  660. package/dist/core/code/shared/scope-resolution/language-classification.js +46 -0
  661. package/dist/core/code/shared/scope-resolution/method-dispatch-index.js +100 -0
  662. package/dist/core/code/shared/scope-resolution/module-scope-index.js +59 -0
  663. package/dist/core/code/shared/scope-resolution/origin-priority.js +23 -0
  664. package/dist/core/code/shared/scope-resolution/parsed-file.js +54 -0
  665. package/dist/core/code/shared/scope-resolution/position-index.js +136 -0
  666. package/dist/core/code/shared/scope-resolution/qualified-name-index.js +77 -0
  667. package/dist/core/code/shared/scope-resolution/reference-site.js +24 -0
  668. package/dist/core/code/shared/scope-resolution/registries/class-registry.js +32 -0
  669. package/dist/core/code/shared/scope-resolution/registries/context.js +52 -0
  670. package/dist/core/code/shared/scope-resolution/registries/evidence.js +152 -0
  671. package/dist/core/code/shared/scope-resolution/registries/field-registry.js +33 -0
  672. package/dist/core/code/shared/scope-resolution/registries/lookup-core.js +392 -0
  673. package/dist/core/code/shared/scope-resolution/registries/lookup-qualified.js +58 -0
  674. package/dist/core/code/shared/scope-resolution/registries/macro-registry.js +34 -0
  675. package/dist/core/code/shared/scope-resolution/registries/method-registry.js +34 -0
  676. package/dist/core/code/shared/scope-resolution/registries/tie-breaks.js +63 -0
  677. package/dist/core/code/shared/scope-resolution/resolve-type-ref.js +128 -0
  678. package/dist/core/code/shared/scope-resolution/scope-id.js +49 -0
  679. package/dist/core/code/shared/scope-resolution/scope-tree.js +225 -0
  680. package/dist/core/code/shared/scope-resolution/symbol-definition.js +12 -0
  681. package/dist/core/code/shared/scope-resolution/types.js +25 -0
  682. package/dist/core/code/shared/test-helpers.js +17 -0
  683. package/dist/core/code/vendor/leiden/index.cjs +355 -0
  684. package/dist/core/code/vendor/leiden/utils.cjs +419 -0
  685. package/dist/core/dbquery/cli.d.ts.map +1 -1
  686. package/dist/core/dbquery/cli.js +5 -4
  687. package/dist/core/dbquery/cli.js.map +1 -1
  688. package/dist/core/dbquery/config.d.ts.map +1 -1
  689. package/dist/core/dbquery/config.js +39 -3
  690. package/dist/core/dbquery/config.js.map +1 -1
  691. package/dist/core/dbquery/drivers/http.d.ts +23 -0
  692. package/dist/core/dbquery/drivers/http.d.ts.map +1 -0
  693. package/dist/core/dbquery/drivers/http.js +125 -0
  694. package/dist/core/dbquery/drivers/http.js.map +1 -0
  695. package/dist/core/dbquery/drivers/mysql.js +1 -1
  696. package/dist/core/dbquery/drivers/mysql.js.map +1 -1
  697. package/dist/core/dbquery/drivers/postgres.js +1 -1
  698. package/dist/core/dbquery/drivers/postgres.js.map +1 -1
  699. package/dist/core/dbquery/executor.d.ts.map +1 -1
  700. package/dist/core/dbquery/executor.js +46 -12
  701. package/dist/core/dbquery/executor.js.map +1 -1
  702. package/dist/core/dbquery/format.d.ts.map +1 -1
  703. package/dist/core/dbquery/format.js +2 -1
  704. package/dist/core/dbquery/format.js.map +1 -1
  705. package/dist/core/dbquery/init.d.ts.map +1 -1
  706. package/dist/core/dbquery/init.js +7 -0
  707. package/dist/core/dbquery/init.js.map +1 -1
  708. package/dist/core/dbquery/types.d.ts +55 -7
  709. package/dist/core/dbquery/types.d.ts.map +1 -1
  710. package/dist/core/directory.d.ts +17 -0
  711. package/dist/core/directory.d.ts.map +1 -1
  712. package/dist/core/directory.js +37 -0
  713. package/dist/core/directory.js.map +1 -1
  714. package/dist/core/features/cli.d.ts.map +1 -1
  715. package/dist/core/features/cli.js +3 -2
  716. package/dist/core/features/cli.js.map +1 -1
  717. package/dist/core/features/scanner.d.ts +1 -1
  718. package/dist/core/features/scanner.d.ts.map +1 -1
  719. package/dist/core/features/scanner.js +20 -4
  720. package/dist/core/features/scanner.js.map +1 -1
  721. package/dist/core/markdown/cli.d.ts.map +1 -1
  722. package/dist/core/markdown/cli.js +9 -8
  723. package/dist/core/markdown/cli.js.map +1 -1
  724. package/dist/core/timeline/cli.d.ts.map +1 -1
  725. package/dist/core/timeline/cli.js +13 -6
  726. package/dist/core/timeline/cli.js.map +1 -1
  727. package/dist/core/timeline/debris.d.ts +20 -0
  728. package/dist/core/timeline/debris.d.ts.map +1 -0
  729. package/dist/core/timeline/debris.js +124 -0
  730. package/dist/core/timeline/debris.js.map +1 -0
  731. package/dist/core/timeline/hook-runner.d.ts.map +1 -1
  732. package/dist/core/timeline/hook-runner.js +3 -1
  733. package/dist/core/timeline/hook-runner.js.map +1 -1
  734. package/dist/core/timeline/hooks.d.ts.map +1 -1
  735. package/dist/core/timeline/hooks.js +13 -5
  736. package/dist/core/timeline/hooks.js.map +1 -1
  737. package/dist/core/timeline/installer.d.ts +2 -0
  738. package/dist/core/timeline/installer.d.ts.map +1 -1
  739. package/dist/core/timeline/installer.js +12 -0
  740. package/dist/core/timeline/installer.js.map +1 -1
  741. package/dist/core/timeline/project-root.d.ts +21 -0
  742. package/dist/core/timeline/project-root.d.ts.map +1 -0
  743. package/dist/core/timeline/project-root.js +83 -0
  744. package/dist/core/timeline/project-root.js.map +1 -0
  745. package/dist/web/register.d.ts.map +1 -1
  746. package/dist/web/register.js +2 -1
  747. package/dist/web/register.js.map +1 -1
  748. package/package.json +1 -1
  749. package/dist/.claude-template/.cgraphx/timeline-current-turn.json +0 -1
  750. package/dist/.claude-template/skills/.cgraphx/timeline-current-turn.json +0 -1
  751. package/dist/.claude-template/skills/handdrawn-deck/.cgraphx/timeline-current-turn.json +0 -1
  752. package/dist/.claude-template/skills/handdrawn-deck/references/.cgraphx/timeline-current-turn.json +0 -1
  753. package/dist/.claude-template/skills/handdrawn-sketch-engine/.cgraphx/timeline-current-turn.json +0 -1
  754. /package/dist/.claude-template/skills/run-api-test/assets/{template-test-verify.jsonl → template-/346/216/245/345/217/243/346/265/213/350/257/225/351/252/214/350/257/201.jsonl"} +0 -0
@@ -0,0 +1,792 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pointKey = pointKey;
4
+ exports.computeReachingDefs = computeReachingDefs;
5
+ exports.createMemoizedReachingDefs = createMemoizedReachingDefs;
6
+ exports.computeReachingDefsDense = computeReachingDefsDense;
7
+ exports.computeReachingDefsSparse = computeReachingDefsSparse;
8
+ const reaching_defs_graph_js_1 = require("./reaching-defs-graph.js");
9
+ /**
10
+ * Canonical `block:stmt` string key for a program point. Colon-separated to
11
+ * match the codebase's `blockIndex:stmtIndex` id conventions. Shared by the
12
+ * taint propagation engine (dedup/state keys) and the taint emit path
13
+ * (persisted edge-id material) so the two never drift.
14
+ */
15
+ function pointKey(p) {
16
+ return `${p.blockIndex}:${p.stmtIndex}`;
17
+ }
18
+ /**
19
+ * def-site key: packs (blockIndex, stmtIndex) into one number. The stride is
20
+ * a per-BLOCK statement bound, and `maxFunctionLines` caps LINES, not
21
+ * statements — a minified one-line function coalesces arbitrarily many
22
+ * statements into one block, so an overflow would silently alias
23
+ * (block b, stmt STRIDE+k) with (block b+1, stmt k) and fabricate wrong-block
24
+ * facts. computeReachingDefs therefore range-checks up front and bails to a
25
+ * sound empty `overflow` result instead of ever letting a key alias.
26
+ * 2^21 statements per block × blocks ≤ 2^32 stays inside Number's 2^53.
27
+ */
28
+ const STMT_STRIDE = 1 << 21;
29
+ const defKey = (blockIndex, stmtIndex) => blockIndex * STMT_STRIDE + stmtIndex;
30
+ const EMPTY_LATTICE = new Map();
31
+ /**
32
+ * Compute reaching definitions for one function. See the module doc for the
33
+ * purity/determinism/sharing contract.
34
+ *
35
+ * This is the production entry point. As of #2201 it auto-dispatches via
36
+ * {@link computeInSetsAuto} — the SSA-sparse solver ({@link computeInSetsSparse})
37
+ * for looping functions large enough to amortize construction, the dense
38
+ * GEN/KILL worklist ({@link computeInSetsDense}) everywhere else (and for the
39
+ * throw-edge / unreachable-block functions the SSA path does not model). The two
40
+ * solvers are held byte-identical by the equivalence fuzz (status, bindings,
41
+ * sorted facts, def/use telemetry), so the dispatch is a pure performance
42
+ * heuristic; the dense solver doubles as that differential oracle.
43
+ */
44
+ function computeReachingDefs(cfg, limits) {
45
+ // #2201: production auto-selects the solver per function (see
46
+ // {@link computeInSetsAuto}) — the SSA solver where it pays off (looping
47
+ // functions large enough to amortize construction, incl. the deep nests the
48
+ // dense ceiling used to truncate), the dense worklist everywhere else (small
49
+ // or loop-free functions, where it is faster). Both are held byte-identical
50
+ // by the equivalence fuzz, so the choice is a pure performance heuristic.
51
+ return solveReachingDefs(cfg, limits, computeInSetsAuto);
52
+ }
53
+ /**
54
+ * Per-file memoized reaching-defs solver (#2227 tri-review, U12). Under `--pdg`
55
+ * the SAME per-function RD fixpoint was solved 3–4× per analyze (RD emit +
56
+ * call-summary harvest + taint + summary harvest). Cache by (cfg identity,
57
+ * limits) so each DISTINCT solve runs once: the RD-emit bucket (passes
58
+ * `maxBlockVisits`) and the harvest/taint bucket (does not) stay byte-identical
59
+ * to their inline solves because the limits are part of the key. Lazy — solves
60
+ * on first request, so the taint zero-match fast path still skips its solve.
61
+ * Create one per FILE and drop it after the file to bound the per-function
62
+ * `facts` arrays (100k+ objects on a huge function) from going whole-repo.
63
+ */
64
+ function createMemoizedReachingDefs() {
65
+ const cache = new Map();
66
+ return (cfg, limits) => {
67
+ const key = `${limits?.maxFacts ?? ''}|${limits?.maxBlockVisits ?? ''}`;
68
+ let byKey = cache.get(cfg);
69
+ if (byKey === undefined) {
70
+ byKey = new Map();
71
+ cache.set(cfg, byKey);
72
+ }
73
+ const hit = byKey.get(key);
74
+ if (hit !== undefined)
75
+ return hit;
76
+ const result = computeReachingDefs(cfg, limits);
77
+ byKey.set(key, result);
78
+ return result;
79
+ };
80
+ }
81
+ /**
82
+ * Dense GEN/KILL monotone worklist — the original (#2082 M2) reaching-defs
83
+ * solver. As of #2201 it plays two roles: (1) the production dispatcher
84
+ * ({@link computeInSetsAuto}) routes small / loop-free functions, and the
85
+ * throw-edge / unreachable-block functions the SSA path does not model, to this
86
+ * dense solver; (2) it is the differential equivalence ORACLE the fuzz checks
87
+ * the SSA path against. Keep it behavior-frozen — it is the ground truth.
88
+ *
89
+ * @internal exported for the equivalence fuzz harness (direct dense-vs-sparse
90
+ * comparison); the bench drives the production {@link computeReachingDefs}.
91
+ */
92
+ function computeReachingDefsDense(cfg, limits) {
93
+ return solveReachingDefs(cfg, limits, computeInSetsDense);
94
+ }
95
+ /**
96
+ * SSA-sparse reaching-defs (#2201) — exposed directly so the equivalence fuzz
97
+ * can drive the SSA solver on every eligible CFG (bypassing the production
98
+ * size/loop dispatch heuristic in {@link computeInSetsAuto}) and assert
99
+ * byte-identity against the dense oracle. See {@link computeInSetsSparse} for
100
+ * the algorithm and byte-identical contract.
101
+ *
102
+ * @internal exported only for the equivalence fuzz harness.
103
+ */
104
+ function computeReachingDefsSparse(cfg, limits) {
105
+ return solveReachingDefs(cfg, limits, computeInSetsSparse);
106
+ }
107
+ /**
108
+ * Shared orchestrator: the no-facts / overflow guards, the harvest, the
109
+ * adjacency build, the swappable IN-set computation, and the statement sweep.
110
+ * Only `computeInSets` differs between the production (sparse) and oracle
111
+ * (dense) paths — everything else is identical, which is what makes the two
112
+ * byte-identical by construction.
113
+ */
114
+ function solveReachingDefs(cfg, limits, computeInSets) {
115
+ if (!cfg.bindings) {
116
+ return { status: 'no-facts', bindings: [], facts: [], defCount: 0, useCount: 0 };
117
+ }
118
+ const blocks = cfg.blocks;
119
+ const n = blocks.length;
120
+ // Key-aliasing guard (see STMT_STRIDE): a block with ≥ STRIDE statements
121
+ // cannot be keyed without aliasing into the next block's def sites, which
122
+ // would fabricate wrong-block facts — strictly worse than producing none.
123
+ // Bail to a sound empty `overflow` result (the emit path warns distinctly).
124
+ for (const b of blocks) {
125
+ if ((b.statements?.length ?? 0) >= STMT_STRIDE) {
126
+ return { status: 'overflow', bindings: cfg.bindings, facts: [], defCount: 0, useCount: 0 };
127
+ }
128
+ }
129
+ const h = harvestStatementFacts(blocks, n);
130
+ const adj = buildAdjacency(cfg, n);
131
+ const solved = computeInSets(cfg, n, h, adj, limits);
132
+ if (!solved.converged) {
133
+ // Did NOT converge within the budget — the in-sets are not at the fixpoint,
134
+ // so any facts would be unsound. Bail to a sound empty `truncated` result
135
+ // (a coverage gap, not an error), carrying the def/use telemetry gathered.
136
+ return {
137
+ status: 'truncated',
138
+ bindings: cfg.bindings,
139
+ facts: [],
140
+ defCount: h.defCount,
141
+ useCount: h.useCount,
142
+ };
143
+ }
144
+ const maxFacts = limits?.maxFacts && limits.maxFacts > 0 ? limits.maxFacts : Infinity;
145
+ const { facts, truncated } = sweepFacts(blocks, solved.reachingAt, h.defLine, maxFacts);
146
+ return {
147
+ status: truncated ? 'truncated' : 'computed',
148
+ bindings: cfg.bindings,
149
+ facts,
150
+ defCount: h.defCount,
151
+ useCount: h.useCount,
152
+ };
153
+ }
154
+ /**
155
+ * Per-block GEN + def/use telemetry. gen[b]: bindingIdx → { set, kills }. A
156
+ * MUST def resets the accumulated set (kill is total); a MAY def (conditionally-
157
+ * evaluated context — see StatementFacts.mayDefs) only ADDS: the binding's
158
+ * incoming defs survive, so the transfer is out[x] = kills ? set : in[x] ∪ set.
159
+ * allDefsGen[b] is what a throw edge delivers to its handler: an exception can
160
+ * fire between any two statements, so every intermediate def may be the live one
161
+ * at the handler — IN∪OUT alone misses defs overwritten later in the same
162
+ * coalesced block.
163
+ */
164
+ function harvestStatementFacts(blocks, n) {
165
+ const gen = new Array(n).fill(null);
166
+ const allDefsGen = new Array(n).fill(null);
167
+ const defLine = new Map(); // defKey → source line
168
+ let defCount = 0;
169
+ let useCount = 0;
170
+ for (const b of blocks) {
171
+ const stmts = b.statements;
172
+ if (!stmts || stmts.length === 0)
173
+ continue;
174
+ let g = null;
175
+ let all = null;
176
+ for (let i = 0; i < stmts.length; i++) {
177
+ const s = stmts[i];
178
+ useCount += s.uses.length;
179
+ const key = defKey(b.index, i);
180
+ const record = (d, kills) => {
181
+ defCount += 1;
182
+ defLine.set(key, s.line);
183
+ if (!g)
184
+ g = new Map();
185
+ const entry = g.get(d);
186
+ if (kills || !entry) {
187
+ g.set(d, { set: new Set([key]), kills: kills || (entry?.kills ?? false) });
188
+ }
189
+ else {
190
+ entry.set.add(key); // may-def accumulates; never clears
191
+ }
192
+ if (!all)
193
+ all = new Map();
194
+ const allSet = all.get(d);
195
+ if (allSet)
196
+ allSet.add(key);
197
+ else
198
+ all.set(d, new Set([key]));
199
+ };
200
+ if (s.mayDefs)
201
+ for (const d of s.mayDefs)
202
+ record(d, false);
203
+ for (const d of s.defs)
204
+ record(d, true);
205
+ }
206
+ gen[b.index] = g;
207
+ allDefsGen[b.index] = all;
208
+ }
209
+ return { gen, allDefsGen, defLine, defCount, useCount };
210
+ }
211
+ /**
212
+ * Throw-aware predecessor/successor adjacency, sorted for deterministic merges.
213
+ * A `throw` edge contributes IN(from) ∪ allDefs(from) to its handler, not OUT:
214
+ * an exception may fire BEFORE the block's defs complete (the seed def in
215
+ * `let x = seed(); try { x = risky(); } catch { sink(x) }` must reach the sink)
216
+ * AND between any two defs of a multi-def coalesced block. Sound over-
217
+ * approximation; monotone, so the fixpoint absorbs it. See mergePreds.
218
+ */
219
+ function buildAdjacency(cfg, n) {
220
+ const preds = Array.from({ length: n }, () => []);
221
+ const succs = Array.from({ length: n }, () => []);
222
+ // Handlers whose IN depends on this block's IN (throw edges) — requeued on
223
+ // IN change, since a genned binding can absorb IN growth without changing
224
+ // OUT, which would otherwise leave the handler stale.
225
+ const throwSuccs = Array.from({ length: n }, () => []);
226
+ for (const e of cfg.edges) {
227
+ // Optional-chained pushes drop out-of-range endpoints defensively — the
228
+ // emit path validates via isEmitSafeCfg, but this pure function also runs
229
+ // on hand-built CFGs.
230
+ succs[e.from]?.push(e.to);
231
+ preds[e.to]?.push({ from: e.from, viaThrow: e.kind === 'throw' });
232
+ if (e.kind === 'throw')
233
+ throwSuccs[e.from]?.push(e.to);
234
+ }
235
+ for (const list of preds) {
236
+ list.sort((a, b) => a.from - b.from || Number(a.viaThrow) - Number(b.viaThrow));
237
+ // duplicate (from, throw+non-throw) pairs both survive — the throw leg
238
+ // adds IN(from); the merge dedups set-wise.
239
+ }
240
+ for (const list of succs)
241
+ list.sort((a, b) => a - b);
242
+ return { preds, succs, throwSuccs };
243
+ }
244
+ /**
245
+ * DENSE IN-set computer — the original monotone GEN/KILL worklist. Iterates in
246
+ * reverse post-order, seeded with every block (unreachable blocks keep ⊥ IN —
247
+ * correct, their defs reach nothing). Convergence: sets grow monotonically
248
+ * within the finite def-site universe ⇒ ≤ loop-depth+1 passes in practice.
249
+ *
250
+ * WTO / loop-aware iteration (Bourdoncle 1993) was evaluated as a fix for the
251
+ * O(blocks²) deep-loop-nest blow-up and REJECTED (#2195): on the dense-loop
252
+ * benchmark a faithful weak-topological-order solver was 104/104 byte-identical
253
+ * but 0% faster — the cost is inherent to dense-set propagation + lattice
254
+ * merges, not visitation order. The asymptotic fix shipped in #2201: the
255
+ * SSA-sparse solver ({@link computeInSetsSparse}). This dense version is retained
256
+ * only as the differential equivalence oracle the fuzz checks SSA against.
257
+ *
258
+ * @internal
259
+ */
260
+ function computeInSetsDense(cfg, n, h, adj, limits) {
261
+ const { gen, allDefsGen } = h;
262
+ const { preds, succs, throwSuccs } = adj;
263
+ const { order } = (0, reaching_defs_graph_js_1.reversePostOrder)(cfg.entryIndex, succs, n);
264
+ const inSets = new Array(n).fill(EMPTY_LATTICE);
265
+ const outSets = new Array(n).fill(EMPTY_LATTICE);
266
+ const inWorklist = new Array(n).fill(true);
267
+ let pending = n;
268
+ const maxBlockVisits = limits?.maxBlockVisits && limits.maxBlockVisits > 0 ? limits.maxBlockVisits : Infinity;
269
+ let blockVisits = 0;
270
+ while (pending > 0) {
271
+ for (const b of order) {
272
+ if (!inWorklist[b])
273
+ continue;
274
+ inWorklist[b] = false;
275
+ pending -= 1;
276
+ if (++blockVisits > maxBlockVisits)
277
+ return { converged: false };
278
+ const p = preds[b];
279
+ const inB = p.length === 0
280
+ ? EMPTY_LATTICE
281
+ : p.length === 1 && !p[0].viaThrow
282
+ ? outSets[p[0].from] // alias — zero allocation on straight-line chains
283
+ : mergePreds(p, inSets, outSets, allDefsGen);
284
+ const inChanged = !(0, reaching_defs_graph_js_1.latticeEquals)(inSets[b], inB);
285
+ inSets[b] = inB;
286
+ const g = gen[b];
287
+ // OUT = overlay(IN): a KILLING gen entry replaces the binding's set; a
288
+ // may-def-only entry unions with the incoming set (never kills). When
289
+ // nothing is genned, OUT aliases IN outright.
290
+ let outB;
291
+ if (!g) {
292
+ outB = inB;
293
+ }
294
+ else {
295
+ outB = new Map(inB); // copies REFERENCES, never set contents
296
+ for (const [bindingIdx, entry] of g) {
297
+ if (entry.kills) {
298
+ outB.set(bindingIdx, entry.set);
299
+ }
300
+ else {
301
+ const incoming = inB.get(bindingIdx);
302
+ outB.set(bindingIdx, incoming ? (0, reaching_defs_graph_js_1.unionSets)(incoming, entry.set) : entry.set);
303
+ }
304
+ }
305
+ }
306
+ const requeue = (s) => {
307
+ if (!inWorklist[s]) {
308
+ inWorklist[s] = true;
309
+ pending += 1;
310
+ }
311
+ };
312
+ if (!(0, reaching_defs_graph_js_1.latticeEquals)(outSets[b], outB)) {
313
+ outSets[b] = outB;
314
+ for (const s of succs[b])
315
+ requeue(s);
316
+ }
317
+ if (inChanged)
318
+ for (const s of throwSuccs[b])
319
+ requeue(s);
320
+ }
321
+ }
322
+ return { converged: true, reachingAt: (blockIndex, binding) => inSets[blockIndex]?.get(binding) };
323
+ }
324
+ /**
325
+ * SPARSE IN-set computer (#2201) — the production solver. Instead of the dense
326
+ * GEN/KILL worklist's per-block lattice fixpoint, it builds pruned SSA for the
327
+ * function (Cooper-Harvey-Kennedy dominators → Cytron dominance frontiers and
328
+ * φ-placement → stack-based renaming) and answers block-entry reaching-def
329
+ * queries by walking the SSA def-use graph. φ-nodes statically capture loop
330
+ * merges, so a use's reaching set is recovered without iterating the loop
331
+ * (depth-independent), and pass-through blocks carry the dominating definition
332
+ * via the rename stack rather than re-materializing a dense lattice at every
333
+ * block — the two effects that make it faster than the dense solver on the
334
+ * deep-nest and dense-bindings pathologies.
335
+ *
336
+ * BYTE-IDENTICAL CONTRACT: it computes the same may-reaching-definition SET at
337
+ * each block entry as {@link computeInSetsDense}. Order does not matter — {@link
338
+ * sweepFacts} sorts each use's reaching keys before the maxFacts cutoff (#2201
339
+ * KTD6) — so only set CONTENTS must match; the equivalence fuzz holds the line.
340
+ *
341
+ * SCOPE (KTD4): the SSA path covers fully-reachable CFGs with kill/may-def
342
+ * transfers, reducible AND irreducible (CHK + Cytron are correct on irreducible
343
+ * graphs). It does NOT model throw edges' IN∪allDefs handler semantics or
344
+ * propagation among unreachable blocks; functions with either are routed to the
345
+ * dense oracle — byte-identical and correct, just not asymptotically faster.
346
+ * These are not the perf pathologies (deep nests / dense-bindings are
347
+ * throw-free and fully reachable), so the win lands where it matters.
348
+ *
349
+ * No fixpoint iteration ⇒ the solve always converges in O(program); the
350
+ * `maxBlockVisits` ceiling that fired on the dense worklist's deep nests never
351
+ * fires here (#2201 acceptance). The bound is honored only on the dense
352
+ * fallback path.
353
+ *
354
+ * @internal
355
+ */
356
+ function computeInSetsSparse(cfg, n, h, adj, limits) {
357
+ const nBindings = cfg.bindings?.length ?? 0;
358
+ if (nBindings === 0)
359
+ return { converged: true, reachingAt: () => undefined };
360
+ const { gen } = h;
361
+ const { preds, succs, throwSuccs } = adj;
362
+ const entry = cfg.entryIndex;
363
+ // Gate to the dense oracle for the shapes the SSA path does not model.
364
+ for (const list of throwSuccs)
365
+ if (list.length)
366
+ return computeInSetsDense(cfg, n, h, adj, limits);
367
+ // Malformed-input guard: an out-of-range binding index (negative or
368
+ // ≥ nBindings — a corrupted/stale durable parsedfile store) would crash the
369
+ // SSA path's nBindings-sized arrays (defBlocks[v]/stacks[u]). The dense solver
370
+ // tolerates any index (its lattice is a Map), so fall back — keeping the two
371
+ // byte-identical AND preserving the graceful per-function degradation the
372
+ // dense path gave (a throw here would escape the unguarded taint/harvest call
373
+ // sites and lose the whole file's taint layer). See hasEmitSafeFacts (emit.ts).
374
+ for (const b of cfg.blocks) {
375
+ const stmts = b.statements;
376
+ if (!stmts)
377
+ continue;
378
+ for (const s of stmts) {
379
+ for (const d of s.defs)
380
+ if (d < 0 || d >= nBindings)
381
+ return computeInSetsDense(cfg, n, h, adj, limits);
382
+ for (const u of s.uses)
383
+ if (u < 0 || u >= nBindings)
384
+ return computeInSetsDense(cfg, n, h, adj, limits);
385
+ if (s.mayDefs)
386
+ for (const d of s.mayDefs)
387
+ if (d < 0 || d >= nBindings)
388
+ return computeInSetsDense(cfg, n, h, adj, limits);
389
+ }
390
+ }
391
+ // Synthetic pre-entry block (#2201): textbook SSA construction assumes the
392
+ // entry has no predecessors. A loop back-edge into the entry — or a self-loop
393
+ // on it — makes the entry a merge that needs a φ, and the dominance-frontier
394
+ // walk degenerates when idom[entry] === entry (it never lands the entry in its
395
+ // own frontier). A virtual start node S → entry (S itself has no preds)
396
+ // restores the invariant: idom[entry] = S, the entry joins {start ⊔
397
+ // back-edges}, and the implicit start operand contributes ⊥ (an empty rename
398
+ // stack). S carries no statements, gen, or uses and is never queried.
399
+ const S = n;
400
+ const nx = n + 1;
401
+ const succsX = new Array(nx);
402
+ for (let b = 0; b < n; b++)
403
+ succsX[b] = succs[b];
404
+ succsX[S] = [entry];
405
+ const dPredsX = new Array(nx);
406
+ for (let b = 0; b < n; b++) {
407
+ // preds[b] is pre-sorted by `from` (buildAdjacency), so duplicate `from`
408
+ // values (a throw + non-throw edge to the same handler, or parallel edges)
409
+ // are ADJACENT — dedup by skipping consecutive equals instead of a per-block
410
+ // Set + spread + sort (#2201 review R9). S = n exceeds every block index, so
411
+ // appending it for the entry keeps the list ascending without a re-sort.
412
+ const list = [];
413
+ let last = -1;
414
+ for (const p of preds[b]) {
415
+ if (p.from !== last) {
416
+ list.push(p.from);
417
+ last = p.from;
418
+ }
419
+ }
420
+ if (b === entry)
421
+ list.push(S);
422
+ dPredsX[b] = list;
423
+ }
424
+ dPredsX[S] = [];
425
+ // ── dominators (Cooper-Harvey-Kennedy; correct on irreducible CFGs) ──
426
+ // RPO rooted at the synthetic entry. `reachX` is the reachability the DFS
427
+ // already computed — reused for the unreachable-block gate below instead of a
428
+ // separate BFS (#2201 review R8). Because S→entry is S's only edge, reachX[b]
429
+ // (b<n) is exactly "reachable from entry", identical to the old BFS gate.
430
+ const { order: rpo, visited: reachX } = (0, reaching_defs_graph_js_1.reversePostOrder)(S, succsX, nx);
431
+ // The SSA path does not model propagation among unreachable blocks (KTD4) —
432
+ // fall back to the dense oracle if any block is unreachable from the entry.
433
+ for (let b = 0; b < n; b++)
434
+ if (!reachX[b])
435
+ return computeInSetsDense(cfg, n, h, adj, limits);
436
+ const idom = (0, reaching_defs_graph_js_1.buildDominators)(rpo, dPredsX, S, nx);
437
+ // ── dominance frontiers (Cytron) ──
438
+ const df = (0, reaching_defs_graph_js_1.buildDominanceFrontiers)(dPredsX, idom, nx);
439
+ // ── per-binding def blocks (must- or may-def ⇒ block transfer touches v) ──
440
+ const defBlocks = Array.from({ length: nBindings }, () => []);
441
+ for (let b = 0; b < n; b++) {
442
+ const g = gen[b];
443
+ if (g)
444
+ for (const v of g.keys())
445
+ defBlocks[v].push(b);
446
+ }
447
+ // ── value-graph nodes: leaves carry def-site keys; internal nodes (φ /
448
+ // may-def union) carry operand node ids. reachingSet(node) = union of all
449
+ // leaf keys reachable through operands (computed once, cycle-safe, below).
450
+ const nodeKeys = [];
451
+ const nodeOps = [];
452
+ const newLeaf = (keys) => (nodeKeys.push(keys),
453
+ nodeOps.push([]),
454
+ nodeKeys.length - 1);
455
+ const newInternal = () => (nodeKeys.push(null), nodeOps.push([]), nodeKeys.length - 1);
456
+ // ── φ-placement: φ for v at the iterated dominance frontier of v's defs ──
457
+ const phiNode = new Array(nx).fill(null);
458
+ for (let v = 0; v < nBindings; v++) {
459
+ const dB = defBlocks[v];
460
+ if (dB.length === 0)
461
+ continue;
462
+ const placed = new Set();
463
+ const inWork = new Set(dB);
464
+ const work = [...dB];
465
+ while (work.length) {
466
+ const x = work.pop();
467
+ for (const y of df[x]) {
468
+ if (placed.has(y))
469
+ continue;
470
+ placed.add(y);
471
+ let m = phiNode[y];
472
+ if (!m)
473
+ phiNode[y] = m = new Map();
474
+ m.set(v, newInternal());
475
+ if (!inWork.has(y)) {
476
+ inWork.add(y);
477
+ work.push(y);
478
+ }
479
+ }
480
+ }
481
+ }
482
+ // ── memory bound (#2201 review R1): cap the value graph, else fall back ──
483
+ // After φ-placement, nodeKeys.length == the φ-node count — the term that grows
484
+ // superlinearly with the input on the deep-loop / dense-binding pathology.
485
+ // Renaming below adds at most ~2 nodes per gen entry (already bounded by the
486
+ // def-site universe the STMT_STRIDE overflow guard caps). If the projected
487
+ // total would exceed the budget, fall back to the dense oracle here — BEFORE
488
+ // paying for renaming + Tarjan SCC on a blown-up graph. Byte-identical (dense
489
+ // is the equivalence oracle) and bounded (dense honors maxBlockVisits). Mirrors
490
+ // the throw-edge / unreachable / OOB-binding gates at the top of this function.
491
+ const nodeBudget = limits?.maxSsaValueGraphNodes && limits.maxSsaValueGraphNodes > 0
492
+ ? limits.maxSsaValueGraphNodes
493
+ : DEFAULT_MAX_SSA_VALUE_GRAPH_NODES;
494
+ let projectedRenameNodes = 0;
495
+ for (let b = 0; b < n; b++)
496
+ projectedRenameNodes += (gen[b]?.size ?? 0) * 2;
497
+ if (nodeKeys.length + projectedRenameNodes > nodeBudget) {
498
+ return computeInSetsDense(cfg, n, h, adj, limits);
499
+ }
500
+ // ── renaming (iterative dominator-tree DFS, per-binding value stacks) ──
501
+ const domChildren = Array.from({ length: nx }, () => []);
502
+ for (let b = 0; b < nx; b++)
503
+ if (b !== S && idom[b] !== -1)
504
+ domChildren[idom[b]].push(b);
505
+ for (const list of domChildren)
506
+ list.sort((a, b) => a - b);
507
+ const stacks = Array.from({ length: nBindings }, () => []);
508
+ const entryValue = new Array(nx).fill(null);
509
+ const enterBlock = (b) => {
510
+ const pushed = [];
511
+ const pm = phiNode[b];
512
+ if (pm)
513
+ for (const [v, node] of pm) {
514
+ stacks[v].push(node);
515
+ pushed.push(v);
516
+ }
517
+ // record block-entry (IN) value for each binding USED here — after φ push,
518
+ // before this block's own gen (the sweep applies intra-block defs itself).
519
+ // The synthetic entry S has no block ⇒ no statements/gen/uses.
520
+ const stmts = cfg.blocks[b]?.statements;
521
+ if (stmts) {
522
+ let ev = null;
523
+ for (const s of stmts)
524
+ for (const u of s.uses) {
525
+ const st = stacks[u];
526
+ if (st.length) {
527
+ if (!ev)
528
+ ev = new Map();
529
+ ev.set(u, st[st.length - 1]);
530
+ }
531
+ }
532
+ entryValue[b] = ev;
533
+ }
534
+ // apply block gen ⇒ OUT values that flow to successors
535
+ const g = gen[b];
536
+ if (g)
537
+ for (const [v, ge] of g) {
538
+ const st = stacks[v];
539
+ let node;
540
+ if (ge.kills) {
541
+ node = newLeaf(ge.set);
542
+ }
543
+ else {
544
+ node = newInternal();
545
+ if (st.length)
546
+ nodeOps[node].push(st[st.length - 1]); // prior reaching (may-def keeps it)
547
+ nodeOps[node].push(newLeaf(ge.set));
548
+ }
549
+ st.push(node);
550
+ pushed.push(v);
551
+ }
552
+ // fill successor φ operands with this block's current OUT for each φ binding
553
+ for (const s of succsX[b]) {
554
+ const sm = phiNode[s];
555
+ if (!sm)
556
+ continue;
557
+ for (const [v, phi] of sm) {
558
+ const st = stacks[v];
559
+ if (st.length)
560
+ nodeOps[phi].push(st[st.length - 1]);
561
+ }
562
+ }
563
+ return pushed;
564
+ };
565
+ const frames = [
566
+ { b: S, ci: 0, pushed: enterBlock(S) },
567
+ ];
568
+ while (frames.length) {
569
+ const f = frames[frames.length - 1];
570
+ const kids = domChildren[f.b];
571
+ if (f.ci < kids.length) {
572
+ const c = kids[f.ci++];
573
+ frames.push({ b: c, ci: 0, pushed: enterBlock(c) });
574
+ }
575
+ else {
576
+ for (const v of f.pushed)
577
+ stacks[v].pop();
578
+ frames.pop();
579
+ }
580
+ }
581
+ // ── reaching sets per node via SCC condensation (cycle-safe union) ──
582
+ // Tarjan condenses the value graph (operand cycles from loop φs collapse to a
583
+ // single SCC); a forward pass over the reverse-topo SCC order unions each
584
+ // SCC's reaching set from its operands' (alias fast path for single-source
585
+ // SCCs — #2201 review R2). Both stages are pure (reaching-defs-graph.ts).
586
+ const { sccOf, sccMembers } = (0, reaching_defs_graph_js_1.tarjanScc)(nodeOps);
587
+ const reachByScc = (0, reaching_defs_graph_js_1.condenseReachingSets)(sccMembers, sccOf, nodeKeys, nodeOps);
588
+ return {
589
+ converged: true,
590
+ reachingAt: (blockIndex, binding) => {
591
+ const node = entryValue[blockIndex]?.get(binding);
592
+ if (node === undefined)
593
+ return undefined;
594
+ const set = reachByScc[sccOf[node]];
595
+ return set.size ? set : undefined;
596
+ },
597
+ };
598
+ }
599
+ /**
600
+ * Minimum block count below which SSA construction (dominators + dominance
601
+ * frontiers + φ-placement + renaming + SCC) does not amortize over the dense
602
+ * worklist's single-pass aliasing. Calibrated empirically (~14-block crossover
603
+ * for loop-heavy functions; 16 leaves headroom); the dense-bindings
604
+ * `rd_scaling_budget` gate in bench/cfg/baselines.json catches a regression if
605
+ * this is mistuned. Paired with a reachable-loop check — loop-free functions
606
+ * always take the cheaper dense path regardless of size.
607
+ */
608
+ const SSA_MIN_BLOCKS = 16;
609
+ /**
610
+ * Default ceiling on the SSA-sparse solver's value-graph node count (#2201
611
+ * review R1). Above this the sparse path falls back to the dense oracle (which
612
+ * bounds its own work via `maxBlockVisits`), trading the deep-loop full-facts
613
+ * win for bounded memory on pathological inputs. Sized FAR above any real or
614
+ * benchmarked function: the suite's densest SSA scenarios (`dense-bindings`,
615
+ * `deep-nest`) build well under 10⁴ nodes, while the pathology this guards
616
+ * (thousands of blocks × hundreds of bindings) builds 10⁶–10⁷. The
617
+ * `dense-bindings` / `deep-nest` `rd_scaling_budget` gates in
618
+ * bench/cfg/baselines.json fail if this is set so low it forces those scenarios
619
+ * onto the dense path. Overridable per-call via
620
+ * {@link ReachingDefsLimits.maxSsaValueGraphNodes}.
621
+ */
622
+ const DEFAULT_MAX_SSA_VALUE_GRAPH_NODES = 1_000_000;
623
+ /**
624
+ * Production solver dispatcher (#2201). The SSA solver beats the dense worklist
625
+ * only when there is enough work to amortize SSA construction — a loop (so the
626
+ * dense fixpoint pays the loop-depth pass multiplier, or truncates at the
627
+ * ceiling) AND a non-trivial block count. Small or loop-free functions, which
628
+ * dense solves in one or two cheap aliasing passes, stay on the dense path.
629
+ * Because the two solvers are byte-identical (held by the equivalence fuzz),
630
+ * this is a pure performance heuristic with no effect on results.
631
+ *
632
+ * @internal
633
+ */
634
+ function computeInSetsAuto(cfg, n, h, adj, limits) {
635
+ if (n >= SSA_MIN_BLOCKS && (0, reaching_defs_graph_js_1.hasReachableLoop)(cfg.entryIndex, adj.succs, n)) {
636
+ return computeInSetsSparse(cfg, n, h, adj, limits);
637
+ }
638
+ return computeInSetsDense(cfg, n, h, adj, limits);
639
+ }
640
+ /**
641
+ * Statement sweep — recover statement-granular def→use facts from the per-block
642
+ * entry reaching lattices, sort them, and apply the maxFacts truncation. SHARED
643
+ * by both solvers, and the maxFacts cutoff is where their (intentionally
644
+ * different) reaching-set INSERTION orders would otherwise leak into the output:
645
+ * the dense worklist seeds keys in RPO fixpoint order, the SSA solver in
646
+ * renaming/SCC order, so a loop-carried use's reaching set is the same SET in a
647
+ * different order. The byte-identity of a TRUNCATED result therefore does NOT
648
+ * come from matching insertion orders — it comes from the KTD6 per-use
649
+ * `useKeys.sort()` BELOW, which canonicalizes each use's keys by defKey before
650
+ * the cutoff. (The full, untruncated fact array is re-sorted at the end, so the
651
+ * pre-sort is a no-op there; its whole purpose is the truncated prefix.) Outer
652
+ * emission order — block index, then statement index, then use order — is shared
653
+ * structurally and needs no canonicalization.
654
+ */
655
+ function sweepFacts(blocks, reachingAt, defLine, maxFacts) {
656
+ const facts = [];
657
+ let truncated = false;
658
+ // Scratch buffer for one use's reaching def-keys, reused across every use to
659
+ // avoid a per-use array allocation (#2201 review R9). Cleared per use; the
660
+ // KTD6 sort below operates on it in place.
661
+ const useKeys = [];
662
+ outer: for (const b of blocks) {
663
+ const stmts = b.statements;
664
+ if (!stmts || stmts.length === 0)
665
+ continue;
666
+ // Sparse intra-block overlay: only the bindings REDEFINED within this block
667
+ // so far. A use's reaching set is the overlay's override if present, else
668
+ // the block-entry reaching set (reachingAt). This never materializes the
669
+ // full block lattice — the dense O(live-vars) per-block copy the sparse
670
+ // solver exists to avoid.
671
+ const overlay = new Map();
672
+ for (let i = 0; i < stmts.length; i++) {
673
+ const s = stmts[i];
674
+ // A use's binding that the SAME statement also defines could be a
675
+ // read-then-write (`x += 1` — sees prior defs) OR a write-then-read
676
+ // (`if ((m = re.exec(s)) && m[1])` — sees the same-statement def).
677
+ // StatementFacts carries no intra-statement order, so emit BOTH: prior
678
+ // defs ∪ the same-statement def. Sound over-approximation — the extra
679
+ // self-fact on compound assignments is harmless; missing the
680
+ // assign-and-test def→use (the most common JS idiom) would be a taint
681
+ // false negative. May-defs join the self-key set the same way.
682
+ // def/mayDef arrays are tiny (1–3 entries), so a membership scan over them
683
+ // is cheaper than the old per-statement `new Set([...defs, ...mayDefs])`
684
+ // (#2201 review R9). `hasSelfDefs` short-circuits pure-use statements.
685
+ const hasSelfDefs = s.defs.length > 0 || (s.mayDefs?.length ?? 0) > 0;
686
+ for (const u of s.uses) {
687
+ const reaching = overlay.get(u) ?? reachingAt(b.index, u);
688
+ const selfKey = hasSelfDefs && (s.defs.includes(u) || (s.mayDefs?.includes(u) ?? false))
689
+ ? defKey(b.index, i)
690
+ : undefined;
691
+ if (!reaching && selfKey === undefined)
692
+ continue;
693
+ // Reuse the scratch buffer instead of spreading a fresh array per use.
694
+ useKeys.length = 0;
695
+ if (reaching)
696
+ for (const k of reaching)
697
+ useKeys.push(k);
698
+ if (selfKey !== undefined && !reaching?.has(selfKey))
699
+ useKeys.push(selfKey);
700
+ // Canonical emission order (#2201 KTD6): sort each use's reaching
701
+ // def-sites by defKey (= def block, then def stmt) BEFORE the maxFacts
702
+ // cutoff. The full (untruncated) fact array is re-sorted identically at
703
+ // the end, so this is a no-op there; its purpose is to make the
704
+ // TRUNCATED subset schedule-independent — the reaching SET's insertion
705
+ // order is fixpoint-evaluation-order-dependent for loop-carried
706
+ // bindings (dense RPO vs sparse change-driven seed different keys
707
+ // first), so a pre-sort cutoff is what keeps the two solvers'
708
+ // truncated results byte-identical.
709
+ useKeys.sort((a, b) => a - b);
710
+ for (const key of useKeys) {
711
+ if (facts.length >= maxFacts) {
712
+ truncated = true;
713
+ break outer;
714
+ }
715
+ const defBlock = Math.floor(key / STMT_STRIDE);
716
+ const defStmt = key % STMT_STRIDE;
717
+ facts.push({
718
+ bindingIdx: u,
719
+ def: { blockIndex: defBlock, stmtIndex: defStmt, line: defLine.get(key) ?? s.line },
720
+ use: { blockIndex: b.index, stmtIndex: i, line: s.line },
721
+ });
722
+ }
723
+ }
724
+ if (s.mayDefs?.length) {
725
+ // Gen WITHOUT kill: the conditional def joins the binding's set.
726
+ const key = defKey(b.index, i);
727
+ for (const d of s.mayDefs) {
728
+ const prior = overlay.get(d) ?? reachingAt(b.index, d);
729
+ overlay.set(d, prior ? (0, reaching_defs_graph_js_1.unionSets)(prior, new Set([key])) : new Set([key]));
730
+ }
731
+ }
732
+ if (s.defs.length > 0) {
733
+ for (const d of s.defs)
734
+ overlay.set(d, new Set([defKey(b.index, i)])); // kill + gen
735
+ }
736
+ }
737
+ }
738
+ facts.sort((a, b) => a.def.blockIndex - b.def.blockIndex ||
739
+ a.def.stmtIndex - b.def.stmtIndex ||
740
+ a.use.blockIndex - b.use.blockIndex ||
741
+ a.use.stmtIndex - b.use.stmtIndex ||
742
+ a.bindingIdx - b.bindingIdx);
743
+ return { facts, truncated };
744
+ }
745
+ /**
746
+ * Union predecessor lattices, sharing sets where possible. A normal edge
747
+ * contributes OUT(from). A THROW edge contributes IN(from) ∪ allDefs(from):
748
+ * an exception may fire before, between, or after any of the block's defs, so
749
+ * the handler can observe the incoming state OR any intermediate def — OUT
750
+ * alone (last-def-wins) misses defs overwritten later in the same block.
751
+ * IN ∪ allDefs ⊇ OUT, so the throw contribution subsumes it.
752
+ */
753
+ function mergePreds(preds, inSets, outSets, allDefsGen) {
754
+ const merged = new Map();
755
+ const mergeOne = (source) => {
756
+ for (const [bindingIdx, set] of source) {
757
+ const existing = merged.get(bindingIdx);
758
+ if (!existing) {
759
+ merged.set(bindingIdx, set); // share the first contributor's set
760
+ }
761
+ else if (existing !== set) {
762
+ // Union only when the references differ. Copy-on-extend: `existing`
763
+ // may be a shared set from another block — never mutate it.
764
+ let target = existing;
765
+ let copied = false;
766
+ for (const key of set) {
767
+ if (!target.has(key)) {
768
+ if (!copied) {
769
+ target = new Set(existing);
770
+ copied = true;
771
+ }
772
+ target.add(key);
773
+ }
774
+ }
775
+ if (copied)
776
+ merged.set(bindingIdx, target);
777
+ }
778
+ }
779
+ };
780
+ for (const p of preds) {
781
+ if (p.viaThrow) {
782
+ mergeOne(inSets[p.from]); // exception may fire pre-defs…
783
+ const all = allDefsGen[p.from];
784
+ if (all)
785
+ mergeOne(all); // …or after ANY of the block's defs
786
+ }
787
+ else {
788
+ mergeOne(outSets[p.from]);
789
+ }
790
+ }
791
+ return merged;
792
+ }