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,646 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bindingKey = exports.hasEmitSafeFacts = exports.isEmitSafeCfg = exports.basicBlockId = exports.DEFAULT_PDG_MAX_REACHING_DEF_BLOCK_REVISITS = exports.DEFAULT_PDG_MAX_REACHING_DEF_FACTS_PER_FUNCTION = exports.REACHING_DEF_FACTS_PER_EDGE_CAP = exports.POST_DOMINATE_DEBUG_ENV = exports.DEFAULT_PDG_MAX_CDG_MATERIALIZATION_PER_FUNCTION = exports.DEFAULT_PDG_MAX_CDG_EDGES_PER_FUNCTION = exports.DEFAULT_PDG_MAX_REACHING_DEF_EDGES_PER_FUNCTION = exports.DEFAULT_MAX_CFG_EDGES_PER_FUNCTION = exports.CALLEE_ID_SEP = exports.CALLEES_TRUNCATED_SENTINEL = void 0;
4
+ exports.calleesOfBlock = calleesOfBlock;
5
+ exports.calleeIdsOfBlock = calleeIdsOfBlock;
6
+ exports.emitFileCfgs = emitFileCfgs;
7
+ exports.emitFileReachingDefs = emitFileReachingDefs;
8
+ exports.emitFileCdg = emitFileCdg;
9
+ const utils_js_1 = require("../../../lib/utils.js");
10
+ const reaching_defs_js_1 = require("./reaching-defs.js");
11
+ const control_dependence_js_1 = require("./control-dependence.js");
12
+ const post_dominators_js_1 = require("./post-dominators.js");
13
+ const synthetic_escape_js_1 = require("./synthetic-escape.js");
14
+ const call_site_harvest_js_1 = require("./visitors/call-site-harvest.js");
15
+ const callee_id_sink_js_1 = require("../scope-resolution/graph-bridge/callee-id-sink.js");
16
+ const reaching_def_reason_codec_js_1 = require("./reaching-def-reason-codec.js");
17
+ const callee_cell_format_js_1 = require("./callee-cell-format.js");
18
+ /**
19
+ * Cell-format constants live in the LEAF module `callee-cell-format.ts` and are
20
+ * re-exported here so every existing importer keeps working. The consumer side
21
+ * (`mcp/local/pdg-impact.ts`) imports them from the leaf directly: importing any
22
+ * binding from THIS module evaluates it, and with it the whole analyze-only CFG
23
+ * closure — 8 modules on every MCP server start to read two strings (#2802
24
+ * review). Producer and consumer still resolve to one definition, so the drift
25
+ * these shared constants exist to prevent stays impossible.
26
+ */
27
+ var callee_cell_format_js_2 = require("./callee-cell-format.js");
28
+ Object.defineProperty(exports, "CALLEES_TRUNCATED_SENTINEL", { enumerable: true, get: function () { return callee_cell_format_js_2.CALLEES_TRUNCATED_SENTINEL; } });
29
+ Object.defineProperty(exports, "CALLEE_ID_SEP", { enumerable: true, get: function () { return callee_cell_format_js_2.CALLEE_ID_SEP; } });
30
+ /**
31
+ * Default per-function CFG edge cap. A pathological generated function could
32
+ * otherwise emit an unbounded edge set; the cap bounds graph growth and is
33
+ * overridable via `--pdg` options. `0` (in options) means no cap (unlimited
34
+ * — see the `cap` mapping in {@link emitFileCfgs}); `undefined` means this
35
+ * default.
36
+ */
37
+ exports.DEFAULT_MAX_CFG_EDGES_PER_FUNCTION = 5000;
38
+ /**
39
+ * Default per-function REACHING_DEF edge cap (#2082 M2 KTD9). 4000 mirrors
40
+ * Joern's per-method `maxNumberOfDefinitions` — the closest production prior
41
+ * art — but truncates-and-warns instead of silently skipping the function.
42
+ * Counts (defBlock, useBlock, binding) DEDUPED edges, not statement-level
43
+ * facts. `0` ⇒ unlimited; `undefined` ⇒ this default.
44
+ */
45
+ exports.DEFAULT_PDG_MAX_REACHING_DEF_EDGES_PER_FUNCTION = 4000;
46
+ /**
47
+ * Default per-function CDG edge cap (#2085 M5). CDG edge count is bounded by
48
+ * (blocks × control-nesting-depth) — comparable to the CFG edge count — so it
49
+ * reuses the CFG default of 5000. Counts DEDUPED (controller, dependent, label)
50
+ * edges (the pure {@link computeControlDependence} already dedups). `0` ⇒
51
+ * unlimited; `undefined` ⇒ this default. Folded into the `RepoMeta.pdg` stamp
52
+ * (U5) so introducing CDG forces a full writeback for pre-CDG `--pdg` indexes.
53
+ */
54
+ exports.DEFAULT_PDG_MAX_CDG_EDGES_PER_FUNCTION = 5000;
55
+ /**
56
+ * Heap-safety ceiling on {@link computeControlDependence}'s pre-dedup
57
+ * materialization (#2188 review). The walk is O(edges × post-dom depth), and its
58
+ * `out` IS the deduped-edge quantity the per-function cap trims — so, UNLIKE
59
+ * REACHING_DEF's facts ceiling, this is deliberately NOT derived from the
60
+ * runtime edge cap (doing so would pre-truncate the very set the cap reports on,
61
+ * losing the exact dropped count). A fixed, generous multiple of the default
62
+ * edge cap: far above any real function — a catastrophe backstop only. When hit,
63
+ * the per-function cap reporting plus the `truncated` flag keep it observable
64
+ * (never a silent drop).
65
+ */
66
+ exports.DEFAULT_PDG_MAX_CDG_MATERIALIZATION_PER_FUNCTION = 8 * exports.DEFAULT_PDG_MAX_CDG_EDGES_PER_FUNCTION;
67
+ /**
68
+ * Env flag that additionally emits diagnostic `POST_DOMINATE` edges
69
+ * (block → its immediate post-dominator) alongside CDG (#2085 M5 KTD8). Off in
70
+ * every normal `--pdg` run — these are for inspecting the post-dom tree, not a
71
+ * queryable product surface. Accepts `1`/`true` (case-insensitive).
72
+ */
73
+ exports.POST_DOMINATE_DEBUG_ENV = 'CGRAPH_PDG_EMIT_POST_DOMINATE';
74
+ /**
75
+ * Fact-materialization headroom over the edge cap (#2082 M2 U3/F3): facts are
76
+ * O(defs×uses) BY SPEC in merge-heavy code, and the edge cap alone bounds the
77
+ * GRAPH, not the per-function memory spike of materializing facts before
78
+ * dedup. {@link emitFileReachingDefs} hands `edgeCap × this` to
79
+ * `computeReachingDefs` as `maxFacts` (unlimited when the edge cap is 0) —
80
+ * single source of truth; the DEFAULT constant below is derived, never the
81
+ * mechanism.
82
+ */
83
+ exports.REACHING_DEF_FACTS_PER_EDGE_CAP = 4;
84
+ /** Derived emit-path fact limit at the default edge cap (bench/doc anchor). */
85
+ exports.DEFAULT_PDG_MAX_REACHING_DEF_FACTS_PER_FUNCTION = exports.REACHING_DEF_FACTS_PER_EDGE_CAP * exports.DEFAULT_PDG_MAX_REACHING_DEF_EDGES_PER_FUNCTION;
86
+ /**
87
+ * Fixpoint-iteration budget for {@link computeReachingDefs}, as a multiple of
88
+ * the function's block count ({@link emitFileReachingDefs} passes
89
+ * `blocks.length × this` as `maxBlockVisits`). Iterative reaching-defs on a
90
+ * reducible CFG converges in O(loop-nesting-depth) passes, so a worklist
91
+ * re-visits each block a small multiple of times for real code; this budget
92
+ * tolerates a nesting depth far beyond any hand-written function (real code is
93
+ * ≤ ~15 deep) while truncating the pathological deep nest that otherwise drives
94
+ * the solver to O(blocks²) — measured at seconds + GB on a machine-generated
95
+ * 2000-line all-loops function whose fact count stays linear (so `maxFacts`
96
+ * never fires). Truncation degrades to a sound empty REACHING_DEF for that one
97
+ * function (status `truncated`), never wrong facts.
98
+ *
99
+ * As of #2201 this ceiling is an adversarial-only backstop that effectively
100
+ * never fires on real code: the production solver auto-selects the SSA-sparse
101
+ * path for the looping functions that would breach it, and the SSA path has no
102
+ * fixpoint iteration (it answers reaching queries from the def-use graph in one
103
+ * pass) so it computes the full facts where the dense worklist would have
104
+ * truncated. The budget is still consulted on the dense fallback path (small /
105
+ * loop-free functions, and throw-edge / unreachable-block functions the SSA path
106
+ * does not model). WTO / loop-aware iteration ordering was benchmarked and
107
+ * rejected (0% faster — the cost was dense-set propagation, not visitation
108
+ * order); SSA-sparse was the real fix. See reaching-defs.ts.
109
+ */
110
+ exports.DEFAULT_PDG_MAX_REACHING_DEF_BLOCK_REVISITS = 64;
111
+ /**
112
+ * The single BasicBlock id template (module doc). Exported for the M3 taint
113
+ * emit path (taint/emit.ts), whose TAINTED/SANITIZES edges must address the
114
+ * SAME persisted block nodes — a re-derived copy of this template would
115
+ * silently dangle the moment either drifted.
116
+ */
117
+ const basicBlockId = (filePath, functionStartLine, functionStartColumn, blockIndex) => `BasicBlock:${filePath}:${functionStartLine}:${functionStartColumn}:${blockIndex}`;
118
+ exports.basicBlockId = basicBlockId;
119
+ /**
120
+ * Whether an untrusted `cfgSideChannel` element is safe to feed to
121
+ * {@link emitFileCfgs}. Deliberately NOT full FunctionCfg validation — it
122
+ * checks exactly the fields whose corruption is SILENT given emit's
123
+ * mechanics: {@link basicBlockId} string-templates every id-anchor value
124
+ * (filePath, function start line/column, block index, edge endpoints) and
125
+ * the graph's addNode/addRelationship are no-throw Map inserts. Unchecked,
126
+ * a missing anchor field cross-wires same-`undefined`-id blocks across
127
+ * functions (addNode is first-writer-wins), and an edge endpoint that
128
+ * matches no block index becomes a dangling `BasicBlock:…:<n>` edge that
129
+ * detonates much later at DB bulk-load instead of throwing here — so
130
+ * endpoints are checked for MEMBERSHIP in the block-index set, not just
131
+ * integer-ness. Lives in this module so the guard evolves with the id
132
+ * templating it defends (#2099 F4; M2 fields that join the id path must
133
+ * join this check).
134
+ */
135
+ const isEmitSafeCfg = (cfg) => {
136
+ if (typeof cfg?.filePath !== 'string' ||
137
+ !Number.isInteger(cfg.functionStartLine) ||
138
+ !Number.isInteger(cfg.functionStartColumn) ||
139
+ !Array.isArray(cfg.blocks) ||
140
+ !Array.isArray(cfg.edges)) {
141
+ return false;
142
+ }
143
+ // Contiguity (index === position), not just integer-ness: every consumer —
144
+ // this module's id templating AND the reaching-defs solver's
145
+ // position-indexed adjacency arrays — assumes blocks[i].index === i. A
146
+ // membership-only check would admit a compacted channel ({index:0},{index:5})
147
+ // whose edge 0→5 passes membership but indexes past the arrays downstream.
148
+ for (let i = 0; i < cfg.blocks.length; i++) {
149
+ if (cfg.blocks[i]?.index !== i)
150
+ return false;
151
+ }
152
+ const n = cfg.blocks.length;
153
+ // entry/exit must land on real blocks — the solver feeds entryIndex straight
154
+ // into its RPO walk, where an out-of-range index throws and (worse than this
155
+ // one element) costs the whole FILE's REACHING_DEF pass (tri-review P3).
156
+ if (!Number.isInteger(cfg.entryIndex) ||
157
+ cfg.entryIndex < 0 ||
158
+ cfg.entryIndex >= n ||
159
+ !Number.isInteger(cfg.exitIndex) ||
160
+ cfg.exitIndex < 0 ||
161
+ cfg.exitIndex >= n) {
162
+ return false;
163
+ }
164
+ return cfg.edges.every((e) => Number.isInteger(e?.from) &&
165
+ Number.isInteger(e?.to) &&
166
+ e.from >= 0 &&
167
+ e.from < n &&
168
+ e.to >= 0 &&
169
+ e.to < n);
170
+ };
171
+ exports.isEmitSafeCfg = isEmitSafeCfg;
172
+ /**
173
+ * Whether a structurally-valid CFG's M2 statement facts are safe to feed to
174
+ * the reaching-defs solver + REACHING_DEF id templating (#2082 U1/U4): the
175
+ * binding table's name/declLine/declColumn template into edge ids, and
176
+ * statement def/use indices must stay IN RANGE of the table (an escaping
177
+ * index would fabricate `undefined`-keyed ids). Deliberately SEPARATE from
178
+ * {@link isEmitSafeCfg}: malformed facts must cost only the function's
179
+ * REACHING_DEF projection — degrading to M1 behavior (CFG emitted, no facts)
180
+ * — never the BasicBlock/CFG layer itself.
181
+ */
182
+ const hasEmitSafeFacts = (cfg) => {
183
+ const bindings = cfg.bindings;
184
+ if (bindings === undefined) {
185
+ // Pre-M2 channel — statements must be absent too.
186
+ return cfg.blocks.every((b) => b.statements === undefined);
187
+ }
188
+ if (!Array.isArray(bindings))
189
+ return false;
190
+ for (const b of bindings) {
191
+ if (typeof b?.name !== 'string' ||
192
+ !Number.isInteger(b.declLine) ||
193
+ !Number.isInteger(b.declColumn)) {
194
+ return false;
195
+ }
196
+ }
197
+ const bindingCount = bindings.length;
198
+ const inRange = (i) => Number.isInteger(i) && i >= 0 && i < bindingCount;
199
+ for (const b of cfg.blocks) {
200
+ const stmts = b.statements;
201
+ if (stmts === undefined)
202
+ continue;
203
+ if (!Array.isArray(stmts))
204
+ return false;
205
+ for (const s of stmts) {
206
+ if (!Number.isInteger(s?.line) || !Array.isArray(s.defs) || !Array.isArray(s.uses)) {
207
+ return false;
208
+ }
209
+ if (!s.defs.every(inRange) || !s.uses.every(inRange))
210
+ return false;
211
+ if (s.mayDefs !== undefined) {
212
+ if (!Array.isArray(s.mayDefs) || !s.mayDefs.every(inRange))
213
+ return false;
214
+ }
215
+ }
216
+ }
217
+ return true;
218
+ };
219
+ exports.hasEmitSafeFacts = hasEmitSafeFacts;
220
+ /**
221
+ * Emit BasicBlock nodes + CFG edges for every function CFG in `cfgs`.
222
+ *
223
+ * `maxEdgesPerFunction` caps edges per function. On overflow we stop emitting
224
+ * that function's remaining edges and call `onWarn` naming the dropped count —
225
+ * no silent truncation (KTD6/R6). Block nodes are always fully emitted (their
226
+ * count is bounded by the function's statement count); only edges are capped.
227
+ */
228
+ /**
229
+ * Space-joined, sorted, de-duplicated leaf callee names invoked directly in a
230
+ * block (`call`/`new` sites; the leaf of a dotted path — `child_process.exec` ⇒
231
+ * `exec`). This is the persisted substrate for statement-precise inter-procedural
232
+ * impact: a callee reached from a function is "proven" to be impacted by a
233
+ * changed statement iff its name appears in the callees of a block in that
234
+ * statement's dependence slice. `sites` is harvested only for TS/JS under `--pdg`
235
+ * (and absent on synthetic ENTRY/EXIT), so the field is empty elsewhere and the
236
+ * bridge degrades to the prior (callgraph-equal) behavior. Space-joined because
237
+ * leaf names are identifiers (no spaces) and the field is itself one CSV cell.
238
+ */
239
+ function calleesOfBlock(block) {
240
+ const names = new Set();
241
+ for (const stmt of block.statements ?? []) {
242
+ // A statement whose recorded sites reached the per-statement cap may have
243
+ // dropped over-cap callees (the harvester stops at the cap). Flag the block
244
+ // callee-unknown so the impact bridge keeps it callgraph-equal rather than
245
+ // under-proving an absent-but-real callee.
246
+ if ((stmt.sites?.length ?? 0) >= call_site_harvest_js_1.DEFAULT_PDG_MAX_SITES_PER_STATEMENT) {
247
+ names.add(callee_cell_format_js_1.CALLEES_TRUNCATED_SENTINEL);
248
+ }
249
+ for (const site of stmt.sites ?? []) {
250
+ if (site.kind === 'member-read')
251
+ continue;
252
+ const callee = site.callee;
253
+ if (!callee)
254
+ continue;
255
+ const leaf = callee.slice(callee.lastIndexOf('.') + 1);
256
+ if (leaf)
257
+ names.add(leaf);
258
+ }
259
+ }
260
+ return [...names].sort().join(' ');
261
+ }
262
+ /**
263
+ * Tab-joined ({@link CALLEE_ID_SEP}), sorted, de-duplicated RESOLVED callee symbol ids invoked
264
+ * directly in a block — the SOUND parallel to {@link calleesOfBlock}'s leaf
265
+ * names (#2227 follow-up plan U3, KTD1/KTD2/KTD7). Each block site's call-site
266
+ * anchor `at` (U1) is joined by EXACT position to the per-file resolved-id map
267
+ * `fileMap` (U2's `(line,col) → Set<calleeId>`), so a callee reached from a
268
+ * function is proven impacted by a changed statement iff its resolved id — not
269
+ * just its leaf NAME — appears in a slice block's `calleeIds`. This eliminates
270
+ * the same-leaf-name collision (false-proven) and import-alias (false-unproven)
271
+ * the name predicate suffers on overloading languages.
272
+ *
273
+ * The site partitioning is inherited verbatim from {@link calleesOfBlock}: the
274
+ * SAME `member-read`-skip and the SAME per-statement site cap (R7) — a capped
275
+ * statement adds {@link CALLEES_TRUNCATED_SENTINEL} so the bridge keeps the
276
+ * block callee-unknown for ids too (callgraph-equal rather than under-proving).
277
+ * Because `at` is the SAME anchor the CALLS resolution keyed `atRange` on
278
+ * (KTD7), the join lands on exactly the sites the name harvest partitioned,
279
+ * including the nested-function exclusion (so a single-line inline closure's
280
+ * inner call never leaks its id into the outer block).
281
+ *
282
+ * `fileMap` is the resolved-id map for THIS file (`calleeIdAccumulator.get(
283
+ * filePath)` in run.ts). Absent (pdg off, or a file with no captured CALLS) ⇒
284
+ * `''` — the bridge then degrades to the leaf-name fallback (R3). A site whose
285
+ * `at` is absent (pre-U1 channel) or whose position is not in the map
286
+ * contributes no id (graceful, never throws).
287
+ */
288
+ function calleeIdsOfBlock(block, fileMap) {
289
+ if (fileMap === undefined)
290
+ return '';
291
+ const ids = new Set();
292
+ for (const stmt of block.statements ?? []) {
293
+ // Mirror calleesOfBlock's cap signal: an over-cap statement dropped sites,
294
+ // so the id list is INCOMPLETE — flag the block callee-unknown (R7).
295
+ if ((stmt.sites?.length ?? 0) >= call_site_harvest_js_1.DEFAULT_PDG_MAX_SITES_PER_STATEMENT) {
296
+ ids.add(callee_cell_format_js_1.CALLEES_TRUNCATED_SENTINEL);
297
+ }
298
+ for (const site of stmt.sites ?? []) {
299
+ if (site.kind === 'member-read')
300
+ continue;
301
+ const at = site.at;
302
+ if (!at)
303
+ continue;
304
+ const resolved = fileMap.get((0, callee_id_sink_js_1.calleeIdPosKey)(at[0], at[1]));
305
+ if (resolved === undefined)
306
+ continue;
307
+ for (const id of resolved)
308
+ ids.add(id);
309
+ }
310
+ }
311
+ return [...ids].sort().join(callee_cell_format_js_1.CALLEE_ID_SEP);
312
+ }
313
+ function emitFileCfgs(graph, cfgs, maxEdgesPerFunction = exports.DEFAULT_MAX_CFG_EDGES_PER_FUNCTION, onWarn, calleeIdMap) {
314
+ const result = { blocks: 0, edges: 0, droppedEdges: 0, cappedFunctions: 0 };
315
+ const cap = maxEdgesPerFunction > 0 ? maxEdgesPerFunction : Infinity;
316
+ for (const cfg of cfgs) {
317
+ const { filePath, functionStartLine, functionStartColumn } = cfg;
318
+ for (const b of cfg.blocks) {
319
+ graph.addNode({
320
+ id: (0, exports.basicBlockId)(filePath, functionStartLine, functionStartColumn, b.index),
321
+ label: 'BasicBlock',
322
+ properties: {
323
+ name: '', // BasicBlock has no name column; identified by id + span
324
+ filePath,
325
+ startLine: b.startLine,
326
+ endLine: b.endLine,
327
+ text: b.text,
328
+ // Space-joined leaf callee names invoked in this block — the
329
+ // statement-precise inter-procedural reach substrate. Harvested from
330
+ // the per-statement `sites` (already on the side channel); dropping
331
+ // them here is what made the impact-mode bridge labeling degenerate.
332
+ callees: calleesOfBlock(b),
333
+ // Space-joined RESOLVED callee symbol ids — the SOUND parallel to
334
+ // `callees`, joined from the U2 map by each site's exact `at`
335
+ // position (#2227 follow-up U3). Absent map (pdg off / no captures)
336
+ // ⇒ `''`, and the bridge falls back to the leaf-name match (R3).
337
+ calleeIds: calleeIdsOfBlock(b, calleeIdMap),
338
+ },
339
+ });
340
+ result.blocks++;
341
+ }
342
+ let emittedForFn = 0;
343
+ for (const e of cfg.edges) {
344
+ if (emittedForFn >= cap) {
345
+ const dropped = cfg.edges.length - emittedForFn;
346
+ result.droppedEdges += dropped;
347
+ result.cappedFunctions++;
348
+ onWarn?.(`[cfg] ${filePath}:${functionStartLine}: per-function CFG edge cap ` +
349
+ `(${maxEdgesPerFunction}) reached — dropped ${dropped} of ${cfg.edges.length} edges`);
350
+ break;
351
+ }
352
+ const sourceId = (0, exports.basicBlockId)(filePath, functionStartLine, functionStartColumn, e.from);
353
+ const targetId = (0, exports.basicBlockId)(filePath, functionStartLine, functionStartColumn, e.to);
354
+ graph.addRelationship({
355
+ id: (0, utils_js_1.generateId)('CFG', `${sourceId}->${targetId}:${e.kind}`),
356
+ type: 'CFG',
357
+ sourceId,
358
+ targetId,
359
+ confidence: 1.0,
360
+ reason: e.kind, // CfgEdgeKind (seq/cond-true/loop-back/…) — queryable
361
+ });
362
+ result.edges++;
363
+ emittedForFn++;
364
+ }
365
+ }
366
+ return result;
367
+ }
368
+ /**
369
+ * Stable identity for a binding inside edge ids (#2082 M2 KTD3/KTD9):
370
+ * `name:declLine:declCol` for declared bindings, `name@module` for synthetic
371
+ * ones. Distinct same-name bindings never share a key; identifier characters
372
+ * cannot contain the id separators. Exported for the M3 taint emit path —
373
+ * TAINTED/SANITIZES ids key bindings with the same discipline.
374
+ */
375
+ const bindingKey = (b) => b.synthetic ? `${b.name}@module` : `${b.name}:${b.declLine}:${b.declColumn}`;
376
+ exports.bindingKey = bindingKey;
377
+ /**
378
+ * Compute reaching definitions per function and persist the bounded
379
+ * REACHING_DEF projection (#2082 M2 U4).
380
+ *
381
+ * Facts are DEDUPED to (defBlock, useBlock, binding) before budgeting — the
382
+ * persisted columns (`from,to,type,confidence,reason,step`; relationship ids
383
+ * are in-memory-only, the CodeRelation table has no id column) cannot
384
+ * distinguish finer rows, so statement-indexed ids would only manufacture
385
+ * byte-identical duplicate rows that burn budget. Statement granularity lives
386
+ * in the in-memory {@link computeReachingDefs} result, which the M3 taint
387
+ * engine recomputes on demand — the budget here governs only this projection
388
+ * and can never drop a taint fact.
389
+ *
390
+ * R7 (no silent truncation) covers BOTH layers: the per-function edge cap AND
391
+ * the solver's fact-materialization limit (which can fire without the edge
392
+ * cap ever being reached, since dedup is many-to-one) each produce one
393
+ * unconditional `onWarn`. The edge-cap warn names the top bindings by fact
394
+ * count — overflow is almost always one variable, which is exactly the datum
395
+ * M3 tuning wants.
396
+ */
397
+ function emitFileReachingDefs(graph, cfgs, maxEdgesPerFunction = exports.DEFAULT_PDG_MAX_REACHING_DEF_EDGES_PER_FUNCTION, onWarn,
398
+ // U12: a per-file memoized solver lets the RD-emit / harvest / taint passes
399
+ // share the SAME per-function fixpoint (this caller is its own cache bucket —
400
+ // it passes maxBlockVisits, the harvest/taint callers do not). Defaults to the
401
+ // plain solver so existing callers are unaffected.
402
+ solve = reaching_defs_js_1.computeReachingDefs) {
403
+ const result = {
404
+ edges: 0,
405
+ droppedEdges: 0,
406
+ cappedFunctions: 0,
407
+ truncatedFunctions: 0,
408
+ malformedFactFunctions: 0,
409
+ facts: 0,
410
+ };
411
+ const cap = maxEdgesPerFunction > 0 ? maxEdgesPerFunction : Infinity;
412
+ const maxFacts = Number.isFinite(cap) ? cap * exports.REACHING_DEF_FACTS_PER_EDGE_CAP : 0; // 0 ⇒ unlimited
413
+ for (const cfg of cfgs) {
414
+ // Graceful degradation: malformed M2 facts cost only this function's
415
+ // REACHING_DEF projection — its BasicBlock/CFG layer was already emitted.
416
+ if (!(0, exports.hasEmitSafeFacts)(cfg)) {
417
+ result.malformedFactFunctions++;
418
+ onWarn?.(`[reaching-defs] ${cfg.filePath}:${cfg.functionStartLine}: malformed ` +
419
+ `statement facts (bad binding table or out-of-range fact indices) — ` +
420
+ `REACHING_DEF skipped for this function; its CFG is unaffected`);
421
+ continue;
422
+ }
423
+ const r = solve(cfg, {
424
+ maxFacts,
425
+ maxBlockVisits: cfg.blocks.length * exports.DEFAULT_PDG_MAX_REACHING_DEF_BLOCK_REVISITS,
426
+ });
427
+ if (r.status === 'no-facts')
428
+ continue;
429
+ result.facts += r.facts.length;
430
+ const { filePath, functionStartLine, functionStartColumn } = cfg;
431
+ if (r.status === 'truncated') {
432
+ result.truncatedFunctions++;
433
+ onWarn?.(`[reaching-defs] ${filePath}:${functionStartLine}: fact materialization ` +
434
+ `limit (${maxFacts}) reached — facts beyond it were not computed; ` +
435
+ `the persisted REACHING_DEF projection for this function is sparse`);
436
+ }
437
+ else if (r.status === 'overflow') {
438
+ result.truncatedFunctions++;
439
+ onWarn?.(`[reaching-defs] ${filePath}:${functionStartLine}: a basic block exceeds ` +
440
+ `the def-key stride (≥2^21 coalesced statements — minified/generated ` +
441
+ `code) — REACHING_DEF skipped for this function (computing any facts ` +
442
+ `would risk wrong-block aliasing); its CFG is unaffected`);
443
+ continue;
444
+ }
445
+ // Dedup to (defBlock, useBlock, binding) — facts arrive sorted, so the
446
+ // deduped order (and therefore cap truncation) is deterministic. ONE edge per
447
+ // group (the edge COUNT is unchanged — substrate/bench safe), but the FU-B-2
448
+ // annotation AGGREGATES the FULL ordered list of (defLine, useLine) pairs for
449
+ // that group into the persisted `reason`. The first fact of a group (facts
450
+ // sort by def block, def stmt, use block, use stmt, binding) keeps the group's
451
+ // emit position; every subsequent fact of the SAME (block-pair, binding)
452
+ // appends its line pair to that group's list. Carrying the full list (not just
453
+ // the first pair) is what makes a SAME-BINDING reassignment chain recoverable:
454
+ // `acc = f(acc); acc = g(acc)` coalesces into one self-block whose
455
+ // `acc@N->acc@N+1` and `acc@N+1->acc@N+2` steps share the one group — a
456
+ // first-pair-only annotation could chain N->N+1 but never reach N+2. Dedup of
457
+ // exact-duplicate pairs within a group keeps the list compact (a `x = x + 1`
458
+ // self-fact never re-adds the same pair).
459
+ const groupIndex = new Map();
460
+ const deduped = [];
461
+ for (const f of r.facts) {
462
+ const key = `${f.def.blockIndex}:${f.use.blockIndex}:${f.bindingIdx}`;
463
+ const at = groupIndex.get(key);
464
+ const pair = { defLine: f.def.line, useLine: f.use.line };
465
+ if (at === undefined) {
466
+ groupIndex.set(key, deduped.length);
467
+ deduped.push({
468
+ defBlock: f.def.blockIndex,
469
+ useBlock: f.use.blockIndex,
470
+ bindingIdx: f.bindingIdx,
471
+ pairs: [pair],
472
+ });
473
+ continue;
474
+ }
475
+ const list = deduped[at].pairs;
476
+ // Skip an exact-duplicate (defLine, useLine) — a self-referential statement
477
+ // (`x = x + 1`) emits the same line pair more than once; the list only needs
478
+ // each distinct step once for the projection walk.
479
+ if (!list.some((p) => p.defLine === pair.defLine && p.useLine === pair.useLine)) {
480
+ list.push(pair);
481
+ }
482
+ }
483
+ let emittedForFn = 0;
484
+ for (const edge of deduped) {
485
+ if (emittedForFn >= cap) {
486
+ const dropped = deduped.length - emittedForFn;
487
+ result.droppedEdges += dropped;
488
+ result.cappedFunctions++;
489
+ // Tallied lazily — cap overflow is the rare path; the common uncapped
490
+ // case must not pay a per-fact counting pass.
491
+ const factsPerBinding = new Map();
492
+ for (const f of r.facts) {
493
+ factsPerBinding.set(f.bindingIdx, (factsPerBinding.get(f.bindingIdx) ?? 0) + 1);
494
+ }
495
+ const top = [...factsPerBinding.entries()]
496
+ .sort((a, b) => b[1] - a[1] || a[0] - b[0])
497
+ .slice(0, 2)
498
+ .map(([idx, count]) => `${r.bindings[idx]?.name ?? `#${idx}`}(${count} facts)`)
499
+ .join(', ');
500
+ onWarn?.(`[reaching-defs] ${filePath}:${functionStartLine}: per-function ` +
501
+ `REACHING_DEF edge cap (${maxEdgesPerFunction}) reached — dropped ` +
502
+ `${dropped} of ${deduped.length} edges; top bindings: ${top}`);
503
+ break;
504
+ }
505
+ const binding = r.bindings[edge.bindingIdx];
506
+ const sourceId = (0, exports.basicBlockId)(filePath, functionStartLine, functionStartColumn, edge.defBlock);
507
+ const targetId = (0, exports.basicBlockId)(filePath, functionStartLine, functionStartColumn, edge.useBlock);
508
+ graph.addRelationship({
509
+ // Single function anchor — the two block ids share it, so templating
510
+ // it once halves the id size (ids are in-memory-only but ~4000 of
511
+ // them per capped function is real transient heap).
512
+ id: (0, utils_js_1.generateId)('REACHING_DEF', `${filePath}:${functionStartLine}:${functionStartColumn}:` +
513
+ `${edge.defBlock}->${edge.useBlock}:${(0, exports.bindingKey)(binding)}`),
514
+ type: 'REACHING_DEF',
515
+ sourceId,
516
+ targetId,
517
+ confidence: 1.0,
518
+ // FU-B-2: the source-level binding name (M0/S1 verdict — name FIRST so
519
+ // `pdg_query` flows stays queryable) PLUS a compact versioned annotation
520
+ // carrying the FULL ordered list of def/use source LINE pairs for this
521
+ // (block-pair, binding) group. For a self-edge (defBlock === useBlock)
522
+ // this captures the intra-block def@L→use@L' chain — including a
523
+ // SAME-BINDING reassignment chain (`acc@24->acc@25->acc@26`) — that the
524
+ // block-granular projection lost; the statement projection (pdg-impact.ts)
525
+ // walks the list forward to fixpoint to recover the coalesced block's
526
+ // interior statements.
527
+ reason: (0, reaching_def_reason_codec_js_1.encodeReachingDefReasonPairs)(binding.name, edge.pairs),
528
+ });
529
+ result.edges++;
530
+ emittedForFn++;
531
+ }
532
+ }
533
+ return result;
534
+ }
535
+ /** Whether the POST_DOMINATE debug env flag is enabled (`1`/`true`). */
536
+ const postDominateDebugEnabled = () => {
537
+ const v = process.env[exports.POST_DOMINATE_DEBUG_ENV];
538
+ return v === '1' || v?.toLowerCase() === 'true';
539
+ };
540
+ /**
541
+ * Compute control dependence per function and persist the bounded CDG
542
+ * projection (#2085 M5 U4). Mirrors {@link emitFileReachingDefs}: the pure
543
+ * {@link computeControlDependence} already dedups to (controller, dependent,
544
+ * label), so the per-function cap applies to deduped edges and overflow logs
545
+ * one unconditional `onWarn` naming the dropped count — no silent truncation
546
+ * (R6/R7). The branch label ('T'|'F') rides the `reason` column (KTD3),
547
+ * mirroring how CFG stores its edge kind.
548
+ *
549
+ * When {@link POST_DOMINATE_DEBUG_ENV} is set, also emits diagnostic
550
+ * `POST_DOMINATE` edges (block → its immediate post-dominator). These are NOT
551
+ * capped or counted against the CDG budget — they exist only for inspecting the
552
+ * post-dom tree and never appear in a normal run.
553
+ */
554
+ function emitFileCdg(graph, cfgs, maxEdgesPerFunction = exports.DEFAULT_PDG_MAX_CDG_EDGES_PER_FUNCTION, onWarn) {
555
+ const result = {
556
+ edges: 0,
557
+ droppedEdges: 0,
558
+ cappedFunctions: 0,
559
+ postDominateEdges: 0,
560
+ skippedUnsoundFunctions: 0,
561
+ };
562
+ const cap = maxEdgesPerFunction > 0 ? maxEdgesPerFunction : Infinity;
563
+ const emitPostDom = postDominateDebugEnabled();
564
+ for (const cfg of cfgs) {
565
+ const { filePath, functionStartLine, functionStartColumn } = cfg;
566
+ // Synthetic-escape pass (#2197 U1): restore EXIT reverse-reachability for a
567
+ // genuine exit-unreachable CYCLE (an unconditional `goto`-cycle / infinite
568
+ // loop) so the post-dom / CDG pass runs instead of being withheld. A no-op
569
+ // (returns `cfg` unchanged) for terminating functions and properly-escaped
570
+ // loops — those stay byte-identical. The synthetic edges are ANALYSIS-ONLY:
571
+ // they live on the returned shallow clone, never on the persisted `cfg`, so
572
+ // CFG / REACHING_DEF and the byte-identical-off golden are unaffected. Both
573
+ // the gate below AND the post-dom / CDG passes must see the augmented view
574
+ // (KTD7 — the Ferrante walk re-reads `cfg.edges`).
575
+ const view = (0, synthetic_escape_js_1.augmentForPostDom)(cfg);
576
+ // Sound post-dominance requires EXIT reachable from every entry-reachable
577
+ // block (#2188 review). The synthetic-escape pass recovers genuine cycles;
578
+ // anything STILL unreachable after it is a residual non-cycle anomaly (a
579
+ // dangling/dead-end block, a branch-less trapping spin, or a construction
580
+ // error) — NOT something we bridge (that would mask the bug). Skip CDG for
581
+ // it and surface the skip. CFG and REACHING_DEF (emitted elsewhere,
582
+ // independent of post-dominance) are kept.
583
+ if (!(0, post_dominators_js_1.isExitReachableFromAllBlocks)(view)) {
584
+ result.skippedUnsoundFunctions++;
585
+ onWarn?.(`[cdg] ${filePath}:${functionStartLine}: EXIT not reachable from all ` +
586
+ `blocks — CDG skipped for this function (CFG/REACHING_DEF unaffected)`);
587
+ continue;
588
+ }
589
+ // Compute the post-dom tree once and feed it to the control-dependence
590
+ // pass (avoids recomputing it) and to the optional POST_DOMINATE emit. The
591
+ // CDG edges reference BLOCK INDICES, which are identical in `view` and `cfg`
592
+ // (the augmentation only appends edges), so persisting them keyed off the
593
+ // original block ids is correct.
594
+ const tree = (0, post_dominators_js_1.computePostDominators)(view);
595
+ // Bound the pre-dedup materialization (heap parity with REACHING_DEF). The
596
+ // fixed ceiling is a catastrophe backstop; the per-function edge cap below
597
+ // remains the reporting authority. A ceiling hit is surfaced, not silent.
598
+ const { edges: cdgEdges, truncated } = (0, control_dependence_js_1.computeControlDependence)(view, tree, exports.DEFAULT_PDG_MAX_CDG_MATERIALIZATION_PER_FUNCTION);
599
+ if (truncated) {
600
+ onWarn?.(`[cdg] ${filePath}:${functionStartLine}: control-dependence materialization ` +
601
+ `ceiling (${exports.DEFAULT_PDG_MAX_CDG_MATERIALIZATION_PER_FUNCTION}) reached — ` +
602
+ `edge counts for this function are a floor`);
603
+ }
604
+ let emittedForFn = 0;
605
+ for (const edge of cdgEdges) {
606
+ if (emittedForFn >= cap) {
607
+ const dropped = cdgEdges.length - emittedForFn;
608
+ result.droppedEdges += dropped;
609
+ result.cappedFunctions++;
610
+ onWarn?.(`[cdg] ${filePath}:${functionStartLine}: per-function CDG edge cap ` +
611
+ `(${maxEdgesPerFunction}) reached — dropped ${dropped} of ${cdgEdges.length} edges`);
612
+ break;
613
+ }
614
+ const sourceId = (0, exports.basicBlockId)(filePath, functionStartLine, functionStartColumn, edge.controllerBlock);
615
+ const targetId = (0, exports.basicBlockId)(filePath, functionStartLine, functionStartColumn, edge.dependentBlock);
616
+ graph.addRelationship({
617
+ id: (0, utils_js_1.generateId)('CDG', `${filePath}:${functionStartLine}:${functionStartColumn}:` +
618
+ `${edge.controllerBlock}->${edge.dependentBlock}:${edge.label}`),
619
+ type: 'CDG',
620
+ sourceId,
621
+ targetId,
622
+ confidence: 1.0,
623
+ reason: edge.label, // 'T' | 'F' — queryable, mirrors CFG's kind-in-reason
624
+ });
625
+ result.edges++;
626
+ emittedForFn++;
627
+ }
628
+ if (emitPostDom) {
629
+ for (let b = 0; b < tree.ipdom.length; b++) {
630
+ const ip = tree.ipdom[b];
631
+ if (ip === post_dominators_js_1.NO_IPDOM)
632
+ continue;
633
+ graph.addRelationship({
634
+ id: (0, utils_js_1.generateId)('POST_DOMINATE', `${filePath}:${functionStartLine}:${functionStartColumn}:${b}->${ip}`),
635
+ type: 'POST_DOMINATE',
636
+ sourceId: (0, exports.basicBlockId)(filePath, functionStartLine, functionStartColumn, b),
637
+ targetId: (0, exports.basicBlockId)(filePath, functionStartLine, functionStartColumn, ip),
638
+ confidence: 1.0,
639
+ reason: '',
640
+ });
641
+ result.postDominateEdges++;
642
+ }
643
+ }
644
+ }
645
+ return result;
646
+ }