cgraphx 2.0.1 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (701) hide show
  1. package/dist/.claude-template/FLOW-MAP.md +7 -5
  2. package/dist/.claude-template/commands/end.md +1 -1
  3. package/dist/.claude-template/skills/cgraphx-guide/SKILL.md +2 -1
  4. package/dist/.claude-template/skills/cgraphx-guide/how-to-use.html +4 -2
  5. package/dist/.claude-template/skills/cgraphx-guide/how-to-use.md +5 -2
  6. package/dist/.claude-template/skills/iboc-check/SKILL.md +116 -0
  7. package/dist/.claude-template/skills/iboc-check/filler-prompt.md +75 -0
  8. package/dist/.claude-template/skills/implementation/SKILL.md +7 -0
  9. package/dist/.claude-template/skills/init-project-guides/SKILL.md +1 -1
  10. package/dist/.claude-template/skills/run-api-test/references/db-verification.md +2 -2
  11. package/dist/.claude-template/skills/subagent-implement/SKILL.md +3 -2
  12. package/dist/.claude-template/skills/write-api/assets/template-request.bru +3 -3
  13. package/dist/.claude-template/skills/write-api/references/bru-format.md +6 -6
  14. package/dist/.claude-template/skills/write-delivery-guide/SKILL.md +97 -0
  15. package/dist/.claude-template/skills/write-delivery-guide/template-change-type.md +120 -0
  16. package/dist/.claude-template/skills/write-delivery-guide/template-multi-role-flow.md +148 -0
  17. package/dist/.claude-template/skills/write-unit-test-code/SKILL.md +23 -6
  18. package/dist/core/code/engine/cli/analyze-config.js +320 -0
  19. package/dist/core/code/engine/cli/analyze.js +1086 -0
  20. package/dist/core/code/engine/cli/cli-message.js +83 -0
  21. package/dist/core/code/engine/cli/detect-changes-format.js +58 -0
  22. package/dist/core/code/engine/cli/embedding-dims.js +43 -0
  23. package/dist/core/code/engine/cli/format-elapsed.js +12 -0
  24. package/dist/core/code/engine/cli/help-i18n.js +144 -0
  25. package/dist/core/code/engine/cli/i18n/en.js +110 -0
  26. package/dist/core/code/engine/cli/i18n/index.js +47 -0
  27. package/dist/core/code/engine/cli/i18n/resources.js +9 -0
  28. package/dist/core/code/engine/cli/i18n/zh-CN.js +110 -0
  29. package/dist/core/code/engine/cli/lazy-action.js +67 -0
  30. package/dist/core/code/engine/cli/optional-grammars.js +136 -0
  31. package/dist/core/code/engine/cli/resolve-invocation.js +76 -0
  32. package/dist/core/code/engine/cli/status.js +156 -0
  33. package/dist/core/code/engine/cli/tool.js +384 -0
  34. package/dist/core/code/engine/config/ignore-service.js +511 -0
  35. package/dist/core/code/engine/config/supported-languages.js +17 -0
  36. package/dist/core/code/engine/core/analysis-features.js +64 -0
  37. package/dist/core/code/engine/core/analyzer-identity.js +2171 -0
  38. package/dist/core/code/engine/core/git-staleness.js +180 -0
  39. package/dist/core/code/engine/core/graph/graph.js +180 -0
  40. package/dist/core/code/engine/core/graph/import-cycles.js +106 -0
  41. package/dist/core/code/engine/core/graph/types.js +2 -0
  42. package/dist/core/code/engine/core/index-freshness.js +12 -0
  43. package/dist/core/code/engine/core/ingestion/binding-accumulator.js +341 -0
  44. package/dist/core/code/engine/core/ingestion/call-extractors/configs/c-cpp.js +168 -0
  45. package/dist/core/code/engine/core/ingestion/call-extractors/configs/csharp.js +9 -0
  46. package/dist/core/code/engine/core/ingestion/call-extractors/configs/dart.js +8 -0
  47. package/dist/core/code/engine/core/ingestion/call-extractors/configs/go.js +8 -0
  48. package/dist/core/code/engine/core/ingestion/call-extractors/configs/jvm.js +54 -0
  49. package/dist/core/code/engine/core/ingestion/call-extractors/configs/php.js +8 -0
  50. package/dist/core/code/engine/core/ingestion/call-extractors/configs/python.js +8 -0
  51. package/dist/core/code/engine/core/ingestion/call-extractors/configs/ruby.js +8 -0
  52. package/dist/core/code/engine/core/ingestion/call-extractors/configs/rust.js +8 -0
  53. package/dist/core/code/engine/core/ingestion/call-extractors/configs/swift.js +8 -0
  54. package/dist/core/code/engine/core/ingestion/call-extractors/configs/typescript-javascript.js +11 -0
  55. package/dist/core/code/engine/core/ingestion/call-extractors/generic.js +62 -0
  56. package/dist/core/code/engine/core/ingestion/call-processor.js +503 -0
  57. package/dist/core/code/engine/core/ingestion/call-routing.js +98 -0
  58. package/dist/core/code/engine/core/ingestion/call-types.js +3 -0
  59. package/dist/core/code/engine/core/ingestion/cfg/callee-cell-format.js +45 -0
  60. package/dist/core/code/engine/core/ingestion/cfg/cfg-builder.js +202 -0
  61. package/dist/core/code/engine/core/ingestion/cfg/collect.js +81 -0
  62. package/dist/core/code/engine/core/ingestion/cfg/control-dependence.js +185 -0
  63. package/dist/core/code/engine/core/ingestion/cfg/control-flow-context.js +130 -0
  64. package/dist/core/code/engine/core/ingestion/cfg/emit.js +646 -0
  65. package/dist/core/code/engine/core/ingestion/cfg/post-dominators.js +182 -0
  66. package/dist/core/code/engine/core/ingestion/cfg/reaching-def-reason-codec.js +139 -0
  67. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs-graph.js +322 -0
  68. package/dist/core/code/engine/core/ingestion/cfg/reaching-defs.js +792 -0
  69. package/dist/core/code/engine/core/ingestion/cfg/synthetic-escape.js +305 -0
  70. package/dist/core/code/engine/core/ingestion/cfg/traversal-result.js +6 -0
  71. package/dist/core/code/engine/core/ingestion/cfg/types.js +14 -0
  72. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp-harvest.js +545 -0
  73. package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp.js +590 -0
  74. package/dist/core/code/engine/core/ingestion/cfg/visitors/call-site-harvest.js +356 -0
  75. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp-harvest.js +593 -0
  76. package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp.js +871 -0
  77. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart-harvest.js +874 -0
  78. package/dist/core/code/engine/core/ingestion/cfg/visitors/dart.js +840 -0
  79. package/dist/core/code/engine/core/ingestion/cfg/visitors/go-harvest.js +625 -0
  80. package/dist/core/code/engine/core/ingestion/cfg/visitors/go.js +642 -0
  81. package/dist/core/code/engine/core/ingestion/cfg/visitors/java-harvest.js +517 -0
  82. package/dist/core/code/engine/core/ingestion/cfg/visitors/java.js +816 -0
  83. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin-harvest.js +723 -0
  84. package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin.js +813 -0
  85. package/dist/core/code/engine/core/ingestion/cfg/visitors/php-harvest.js +630 -0
  86. package/dist/core/code/engine/core/ingestion/cfg/visitors/php.js +725 -0
  87. package/dist/core/code/engine/core/ingestion/cfg/visitors/python-harvest.js +776 -0
  88. package/dist/core/code/engine/core/ingestion/cfg/visitors/python.js +562 -0
  89. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby-harvest.js +591 -0
  90. package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby.js +760 -0
  91. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust-harvest.js +877 -0
  92. package/dist/core/code/engine/core/ingestion/cfg/visitors/rust.js +562 -0
  93. package/dist/core/code/engine/core/ingestion/cfg/visitors/scope-tree-harvest.js +120 -0
  94. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift-harvest.js +683 -0
  95. package/dist/core/code/engine/core/ingestion/cfg/visitors/swift.js +791 -0
  96. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript-harvest.js +1060 -0
  97. package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript.js +587 -0
  98. package/dist/core/code/engine/core/ingestion/class-extractors/configs/c-cpp.js +77 -0
  99. package/dist/core/code/engine/core/ingestion/class-extractors/configs/csharp.js +24 -0
  100. package/dist/core/code/engine/core/ingestion/class-extractors/configs/dart.js +10 -0
  101. package/dist/core/code/engine/core/ingestion/class-extractors/configs/go.js +28 -0
  102. package/dist/core/code/engine/core/ingestion/class-extractors/configs/jvm.js +67 -0
  103. package/dist/core/code/engine/core/ingestion/class-extractors/configs/php.js +10 -0
  104. package/dist/core/code/engine/core/ingestion/class-extractors/configs/python.js +10 -0
  105. package/dist/core/code/engine/core/ingestion/class-extractors/configs/ruby.js +13 -0
  106. package/dist/core/code/engine/core/ingestion/class-extractors/configs/rust.js +10 -0
  107. package/dist/core/code/engine/core/ingestion/class-extractors/configs/swift.js +21 -0
  108. package/dist/core/code/engine/core/ingestion/class-extractors/configs/typescript-javascript.js +31 -0
  109. package/dist/core/code/engine/core/ingestion/class-extractors/generic.js +144 -0
  110. package/dist/core/code/engine/core/ingestion/class-types.js +2 -0
  111. package/dist/core/code/engine/core/ingestion/cluster-enricher.js +174 -0
  112. package/dist/core/code/engine/core/ingestion/community-processor.js +604 -0
  113. package/dist/core/code/engine/core/ingestion/constants.js +26 -0
  114. package/dist/core/code/engine/core/ingestion/cpp-ue-preprocessor.js +263 -0
  115. package/dist/core/code/engine/core/ingestion/csharp-namespace-gate.js +133 -0
  116. package/dist/core/code/engine/core/ingestion/di-extractors/index.js +38 -0
  117. package/dist/core/code/engine/core/ingestion/di-extractors/spring.js +310 -0
  118. package/dist/core/code/engine/core/ingestion/emit-references.js +244 -0
  119. package/dist/core/code/engine/core/ingestion/entry-point-scoring.js +201 -0
  120. package/dist/core/code/engine/core/ingestion/export-detection.js +244 -0
  121. package/dist/core/code/engine/core/ingestion/field-extractor.js +29 -0
  122. package/dist/core/code/engine/core/ingestion/field-extractors/configs/c-cpp.js +107 -0
  123. package/dist/core/code/engine/core/ingestion/field-extractors/configs/csharp.js +124 -0
  124. package/dist/core/code/engine/core/ingestion/field-extractors/configs/dart.js +99 -0
  125. package/dist/core/code/engine/core/ingestion/field-extractors/configs/go.js +102 -0
  126. package/dist/core/code/engine/core/ingestion/field-extractors/configs/helpers.js +198 -0
  127. package/dist/core/code/engine/core/ingestion/field-extractors/configs/jvm.js +172 -0
  128. package/dist/core/code/engine/core/ingestion/field-extractors/configs/php.js +67 -0
  129. package/dist/core/code/engine/core/ingestion/field-extractors/configs/python.js +94 -0
  130. package/dist/core/code/engine/core/ingestion/field-extractors/configs/ruby.js +79 -0
  131. package/dist/core/code/engine/core/ingestion/field-extractors/configs/rust.js +55 -0
  132. package/dist/core/code/engine/core/ingestion/field-extractors/configs/swift.js +93 -0
  133. package/dist/core/code/engine/core/ingestion/field-extractors/configs/typescript-javascript.js +59 -0
  134. package/dist/core/code/engine/core/ingestion/field-extractors/generic.js +147 -0
  135. package/dist/core/code/engine/core/ingestion/field-extractors/typescript.js +266 -0
  136. package/dist/core/code/engine/core/ingestion/field-types.js +3 -0
  137. package/dist/core/code/engine/core/ingestion/filesystem-walker.js +136 -0
  138. package/dist/core/code/engine/core/ingestion/finalize-orchestrator.js +159 -0
  139. package/dist/core/code/engine/core/ingestion/framework-detection.js +432 -0
  140. package/dist/core/code/engine/core/ingestion/frameworks/spring/analysis-features.js +38 -0
  141. package/dist/core/code/engine/core/ingestion/frameworks/spring/annotation-arguments.js +234 -0
  142. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop-candidates.js +88 -0
  143. package/dist/core/code/engine/core/ingestion/frameworks/spring/aop.js +487 -0
  144. package/dist/core/code/engine/core/ingestion/frameworks/spring/auto-configuration.js +21 -0
  145. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-candidates.js +189 -0
  146. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-catalog.js +32 -0
  147. package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-factories.js +73 -0
  148. package/dist/core/code/engine/core/ingestion/frameworks/spring/conditionals.js +323 -0
  149. package/dist/core/code/engine/core/ingestion/frameworks/spring/config-bindings.js +119 -0
  150. package/dist/core/code/engine/core/ingestion/frameworks/spring/di-metadata.js +385 -0
  151. package/dist/core/code/engine/core/ingestion/frameworks/spring/resource-injection.js +96 -0
  152. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/c-cpp.js +17 -0
  153. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/csharp.js +46 -0
  154. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/dart.js +59 -0
  155. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/go.js +30 -0
  156. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/jvm.js +73 -0
  157. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/php.js +19 -0
  158. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/python.js +45 -0
  159. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/ruby.js +20 -0
  160. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/rust.js +58 -0
  161. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/swift.js +94 -0
  162. package/dist/core/code/engine/core/ingestion/import-resolvers/configs/typescript-javascript.js +26 -0
  163. package/dist/core/code/engine/core/ingestion/import-resolvers/csharp.js +128 -0
  164. package/dist/core/code/engine/core/ingestion/import-resolvers/go.js +50 -0
  165. package/dist/core/code/engine/core/ingestion/import-resolvers/jvm.js +112 -0
  166. package/dist/core/code/engine/core/ingestion/import-resolvers/php.js +80 -0
  167. package/dist/core/code/engine/core/ingestion/import-resolvers/python.js +75 -0
  168. package/dist/core/code/engine/core/ingestion/import-resolvers/resolver-factory.js +36 -0
  169. package/dist/core/code/engine/core/ingestion/import-resolvers/ruby.js +20 -0
  170. package/dist/core/code/engine/core/ingestion/import-resolvers/rust.js +79 -0
  171. package/dist/core/code/engine/core/ingestion/import-resolvers/standard.js +180 -0
  172. package/dist/core/code/engine/core/ingestion/import-resolvers/types.js +7 -0
  173. package/dist/core/code/engine/core/ingestion/import-resolvers/utils.js +153 -0
  174. package/dist/core/code/engine/core/ingestion/import-target-adapter.js +99 -0
  175. package/dist/core/code/engine/core/ingestion/language-config.js +391 -0
  176. package/dist/core/code/engine/core/ingestion/language-provider.js +25 -0
  177. package/dist/core/code/engine/core/ingestion/languages/c/arity-metadata.js +98 -0
  178. package/dist/core/code/engine/core/ingestion/languages/c/arity.js +21 -0
  179. package/dist/core/code/engine/core/ingestion/languages/c/capture-side-channel.js +69 -0
  180. package/dist/core/code/engine/core/ingestion/languages/c/captures.js +189 -0
  181. package/dist/core/code/engine/core/ingestion/languages/c/header-scan.js +58 -0
  182. package/dist/core/code/engine/core/ingestion/languages/c/import-decomposer.js +68 -0
  183. package/dist/core/code/engine/core/ingestion/languages/c/import-target.js +103 -0
  184. package/dist/core/code/engine/core/ingestion/languages/c/index.js +33 -0
  185. package/dist/core/code/engine/core/ingestion/languages/c/interpret.js +53 -0
  186. package/dist/core/code/engine/core/ingestion/languages/c/merge-bindings.js +26 -0
  187. package/dist/core/code/engine/core/ingestion/languages/c/query.js +210 -0
  188. package/dist/core/code/engine/core/ingestion/languages/c/scope-resolver.js +112 -0
  189. package/dist/core/code/engine/core/ingestion/languages/c/simple-hooks.js +24 -0
  190. package/dist/core/code/engine/core/ingestion/languages/c/static-linkage.js +109 -0
  191. package/dist/core/code/engine/core/ingestion/languages/c-cpp.js +506 -0
  192. package/dist/core/code/engine/core/ingestion/languages/cpp/adl.js +804 -0
  193. package/dist/core/code/engine/core/ingestion/languages/cpp/arity-metadata.js +258 -0
  194. package/dist/core/code/engine/core/ingestion/languages/cpp/arity.js +37 -0
  195. package/dist/core/code/engine/core/ingestion/languages/cpp/capture-side-channel.js +89 -0
  196. package/dist/core/code/engine/core/ingestion/languages/cpp/captures.js +1975 -0
  197. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-extractor.js +311 -0
  198. package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-filter.js +210 -0
  199. package/dist/core/code/engine/core/ingestion/languages/cpp/conversion-rank.js +163 -0
  200. package/dist/core/code/engine/core/ingestion/languages/cpp/file-local-linkage.js +327 -0
  201. package/dist/core/code/engine/core/ingestion/languages/cpp/header-scan.js +53 -0
  202. package/dist/core/code/engine/core/ingestion/languages/cpp/import-decomposer.js +134 -0
  203. package/dist/core/code/engine/core/ingestion/languages/cpp/import-target.js +16 -0
  204. package/dist/core/code/engine/core/ingestion/languages/cpp/index.js +33 -0
  205. package/dist/core/code/engine/core/ingestion/languages/cpp/inline-namespaces.js +379 -0
  206. package/dist/core/code/engine/core/ingestion/languages/cpp/interpret.js +239 -0
  207. package/dist/core/code/engine/core/ingestion/languages/cpp/member-lookup.js +470 -0
  208. package/dist/core/code/engine/core/ingestion/languages/cpp/merge-bindings.js +32 -0
  209. package/dist/core/code/engine/core/ingestion/languages/cpp/query.js +763 -0
  210. package/dist/core/code/engine/core/ingestion/languages/cpp/range-bindings.js +230 -0
  211. package/dist/core/code/engine/core/ingestion/languages/cpp/scope-resolver.js +354 -0
  212. package/dist/core/code/engine/core/ingestion/languages/cpp/simple-hooks.js +67 -0
  213. package/dist/core/code/engine/core/ingestion/languages/cpp/two-phase-lookup.js +348 -0
  214. package/dist/core/code/engine/core/ingestion/languages/cpp/type-classifier.js +56 -0
  215. package/dist/core/code/engine/core/ingestion/languages/cpp/user-defined-conversions.js +128 -0
  216. package/dist/core/code/engine/core/ingestion/languages/csharp/accessor-unwrap.js +67 -0
  217. package/dist/core/code/engine/core/ingestion/languages/csharp/arity-metadata.js +49 -0
  218. package/dist/core/code/engine/core/ingestion/languages/csharp/arity.js +40 -0
  219. package/dist/core/code/engine/core/ingestion/languages/csharp/cache-stats.js +32 -0
  220. package/dist/core/code/engine/core/ingestion/languages/csharp/captures.js +557 -0
  221. package/dist/core/code/engine/core/ingestion/languages/csharp/import-decomposer.js +96 -0
  222. package/dist/core/code/engine/core/ingestion/languages/csharp/import-target.js +176 -0
  223. package/dist/core/code/engine/core/ingestion/languages/csharp/index.js +95 -0
  224. package/dist/core/code/engine/core/ingestion/languages/csharp/interpret.js +150 -0
  225. package/dist/core/code/engine/core/ingestion/languages/csharp/merge-bindings.js +58 -0
  226. package/dist/core/code/engine/core/ingestion/languages/csharp/namespace-siblings.js +708 -0
  227. package/dist/core/code/engine/core/ingestion/languages/csharp/qualified-type-names.js +62 -0
  228. package/dist/core/code/engine/core/ingestion/languages/csharp/query.js +578 -0
  229. package/dist/core/code/engine/core/ingestion/languages/csharp/receiver-binding.js +142 -0
  230. package/dist/core/code/engine/core/ingestion/languages/csharp/resolution-config.js +18 -0
  231. package/dist/core/code/engine/core/ingestion/languages/csharp/scope-resolver.js +84 -0
  232. package/dist/core/code/engine/core/ingestion/languages/csharp/simple-hooks.js +81 -0
  233. package/dist/core/code/engine/core/ingestion/languages/csharp.js +204 -0
  234. package/dist/core/code/engine/core/ingestion/languages/dart/arity-metadata.js +38 -0
  235. package/dist/core/code/engine/core/ingestion/languages/dart/arity.js +34 -0
  236. package/dist/core/code/engine/core/ingestion/languages/dart/built-ins.js +37 -0
  237. package/dist/core/code/engine/core/ingestion/languages/dart/cache-stats.js +30 -0
  238. package/dist/core/code/engine/core/ingestion/languages/dart/captures.js +1096 -0
  239. package/dist/core/code/engine/core/ingestion/languages/dart/expand-wildcards.js +34 -0
  240. package/dist/core/code/engine/core/ingestion/languages/dart/extension-type-preprocess.js +33 -0
  241. package/dist/core/code/engine/core/ingestion/languages/dart/import-target.js +68 -0
  242. package/dist/core/code/engine/core/ingestion/languages/dart/index.js +45 -0
  243. package/dist/core/code/engine/core/ingestion/languages/dart/interpret.js +101 -0
  244. package/dist/core/code/engine/core/ingestion/languages/dart/merge-bindings.js +42 -0
  245. package/dist/core/code/engine/core/ingestion/languages/dart/query.js +246 -0
  246. package/dist/core/code/engine/core/ingestion/languages/dart/receiver-binding.js +90 -0
  247. package/dist/core/code/engine/core/ingestion/languages/dart/scope-resolver.js +197 -0
  248. package/dist/core/code/engine/core/ingestion/languages/dart/signature-bindings.js +54 -0
  249. package/dist/core/code/engine/core/ingestion/languages/dart/simple-hooks.js +61 -0
  250. package/dist/core/code/engine/core/ingestion/languages/dart.js +138 -0
  251. package/dist/core/code/engine/core/ingestion/languages/go/arity-metadata.js +71 -0
  252. package/dist/core/code/engine/core/ingestion/languages/go/arity.js +17 -0
  253. package/dist/core/code/engine/core/ingestion/languages/go/cache-stats.js +21 -0
  254. package/dist/core/code/engine/core/ingestion/languages/go/captures.js +492 -0
  255. package/dist/core/code/engine/core/ingestion/languages/go/expand-wildcards.js +97 -0
  256. package/dist/core/code/engine/core/ingestion/languages/go/generic-type-parameters.js +146 -0
  257. package/dist/core/code/engine/core/ingestion/languages/go/import-decomposer.js +47 -0
  258. package/dist/core/code/engine/core/ingestion/languages/go/import-target.js +70 -0
  259. package/dist/core/code/engine/core/ingestion/languages/go/index.js +39 -0
  260. package/dist/core/code/engine/core/ingestion/languages/go/interface-impls.js +955 -0
  261. package/dist/core/code/engine/core/ingestion/languages/go/interpret.js +177 -0
  262. package/dist/core/code/engine/core/ingestion/languages/go/merge-bindings.js +21 -0
  263. package/dist/core/code/engine/core/ingestion/languages/go/method-owners.js +131 -0
  264. package/dist/core/code/engine/core/ingestion/languages/go/namespace-mirror.js +56 -0
  265. package/dist/core/code/engine/core/ingestion/languages/go/package-clause.js +79 -0
  266. package/dist/core/code/engine/core/ingestion/languages/go/package-siblings.js +83 -0
  267. package/dist/core/code/engine/core/ingestion/languages/go/query.js +298 -0
  268. package/dist/core/code/engine/core/ingestion/languages/go/range-binding.js +127 -0
  269. package/dist/core/code/engine/core/ingestion/languages/go/receiver-binding.js +24 -0
  270. package/dist/core/code/engine/core/ingestion/languages/go/scope-resolver.js +75 -0
  271. package/dist/core/code/engine/core/ingestion/languages/go/simple-hooks.js +31 -0
  272. package/dist/core/code/engine/core/ingestion/languages/go/type-binding.js +279 -0
  273. package/dist/core/code/engine/core/ingestion/languages/go.js +160 -0
  274. package/dist/core/code/engine/core/ingestion/languages/index.js +66 -0
  275. package/dist/core/code/engine/core/ingestion/languages/java/analysis-features.js +16 -0
  276. package/dist/core/code/engine/core/ingestion/languages/java/arity-metadata.js +43 -0
  277. package/dist/core/code/engine/core/ingestion/languages/java/arity.js +27 -0
  278. package/dist/core/code/engine/core/ingestion/languages/java/cache-stats.js +32 -0
  279. package/dist/core/code/engine/core/ingestion/languages/java/capture-side-channel.js +123 -0
  280. package/dist/core/code/engine/core/ingestion/languages/java/captures.js +791 -0
  281. package/dist/core/code/engine/core/ingestion/languages/java/import-decomposer.js +88 -0
  282. package/dist/core/code/engine/core/ingestion/languages/java/import-target.js +103 -0
  283. package/dist/core/code/engine/core/ingestion/languages/java/index.js +43 -0
  284. package/dist/core/code/engine/core/ingestion/languages/java/interpret.js +146 -0
  285. package/dist/core/code/engine/core/ingestion/languages/java/merge-bindings.js +43 -0
  286. package/dist/core/code/engine/core/ingestion/languages/java/package-facts.js +16 -0
  287. package/dist/core/code/engine/core/ingestion/languages/java/package-siblings.js +11 -0
  288. package/dist/core/code/engine/core/ingestion/languages/java/query.js +319 -0
  289. package/dist/core/code/engine/core/ingestion/languages/java/receiver-binding.js +98 -0
  290. package/dist/core/code/engine/core/ingestion/languages/java/scope-resolver.js +213 -0
  291. package/dist/core/code/engine/core/ingestion/languages/java/simple-hooks.js +39 -0
  292. package/dist/core/code/engine/core/ingestion/languages/java/spring-aop.js +53 -0
  293. package/dist/core/code/engine/core/ingestion/languages/java/spring-bean-metadata.js +11 -0
  294. package/dist/core/code/engine/core/ingestion/languages/java/spring-conditionals.js +52 -0
  295. package/dist/core/code/engine/core/ingestion/languages/java/spring-config-bindings.js +222 -0
  296. package/dist/core/code/engine/core/ingestion/languages/java/spring-di.js +165 -0
  297. package/dist/core/code/engine/core/ingestion/languages/java.js +192 -0
  298. package/dist/core/code/engine/core/ingestion/languages/javascript/arity.js +15 -0
  299. package/dist/core/code/engine/core/ingestion/languages/javascript/captures.js +1122 -0
  300. package/dist/core/code/engine/core/ingestion/languages/javascript/import-target.js +56 -0
  301. package/dist/core/code/engine/core/ingestion/languages/javascript/index.js +109 -0
  302. package/dist/core/code/engine/core/ingestion/languages/javascript/interpret.js +45 -0
  303. package/dist/core/code/engine/core/ingestion/languages/javascript/merge-bindings.js +21 -0
  304. package/dist/core/code/engine/core/ingestion/languages/javascript/query.js +659 -0
  305. package/dist/core/code/engine/core/ingestion/languages/javascript/scope-resolver.js +78 -0
  306. package/dist/core/code/engine/core/ingestion/languages/javascript/simple-hooks.js +44 -0
  307. package/dist/core/code/engine/core/ingestion/languages/jvm/package-facts.js +46 -0
  308. package/dist/core/code/engine/core/ingestion/languages/jvm/package-siblings.js +200 -0
  309. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity-metadata.js +23 -0
  310. package/dist/core/code/engine/core/ingestion/languages/kotlin/arity.js +18 -0
  311. package/dist/core/code/engine/core/ingestion/languages/kotlin/cache-stats.js +21 -0
  312. package/dist/core/code/engine/core/ingestion/languages/kotlin/capture-side-channel.js +160 -0
  313. package/dist/core/code/engine/core/ingestion/languages/kotlin/captures.js +1262 -0
  314. package/dist/core/code/engine/core/ingestion/languages/kotlin/companion-scopes.js +72 -0
  315. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-decomposer.js +40 -0
  316. package/dist/core/code/engine/core/ingestion/languages/kotlin/import-target.js +135 -0
  317. package/dist/core/code/engine/core/ingestion/languages/kotlin/index.js +26 -0
  318. package/dist/core/code/engine/core/ingestion/languages/kotlin/interpret.js +75 -0
  319. package/dist/core/code/engine/core/ingestion/languages/kotlin/merge-bindings.js +28 -0
  320. package/dist/core/code/engine/core/ingestion/languages/kotlin/owners.js +134 -0
  321. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-facts.js +16 -0
  322. package/dist/core/code/engine/core/ingestion/languages/kotlin/package-siblings.js +11 -0
  323. package/dist/core/code/engine/core/ingestion/languages/kotlin/query.js +243 -0
  324. package/dist/core/code/engine/core/ingestion/languages/kotlin/receiver-binding.js +103 -0
  325. package/dist/core/code/engine/core/ingestion/languages/kotlin/scope-resolver.js +207 -0
  326. package/dist/core/code/engine/core/ingestion/languages/kotlin/simple-hooks.js +42 -0
  327. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-aop.js +68 -0
  328. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-bean-metadata.js +11 -0
  329. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-conditionals.js +53 -0
  330. package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-di.js +304 -0
  331. package/dist/core/code/engine/core/ingestion/languages/kotlin.js +189 -0
  332. package/dist/core/code/engine/core/ingestion/languages/php/arity-metadata.js +66 -0
  333. package/dist/core/code/engine/core/ingestion/languages/php/arity.js +43 -0
  334. package/dist/core/code/engine/core/ingestion/languages/php/cache-stats.js +32 -0
  335. package/dist/core/code/engine/core/ingestion/languages/php/captures.js +1166 -0
  336. package/dist/core/code/engine/core/ingestion/languages/php/import-decomposer.js +238 -0
  337. package/dist/core/code/engine/core/ingestion/languages/php/import-target.js +213 -0
  338. package/dist/core/code/engine/core/ingestion/languages/php/index.js +85 -0
  339. package/dist/core/code/engine/core/ingestion/languages/php/interpret.js +256 -0
  340. package/dist/core/code/engine/core/ingestion/languages/php/merge-bindings.js +50 -0
  341. package/dist/core/code/engine/core/ingestion/languages/php/namespace-siblings.js +353 -0
  342. package/dist/core/code/engine/core/ingestion/languages/php/query.js +391 -0
  343. package/dist/core/code/engine/core/ingestion/languages/php/receiver-binding.js +135 -0
  344. package/dist/core/code/engine/core/ingestion/languages/php/scope-resolver.js +361 -0
  345. package/dist/core/code/engine/core/ingestion/languages/php/simple-hooks.js +116 -0
  346. package/dist/core/code/engine/core/ingestion/languages/php.js +302 -0
  347. package/dist/core/code/engine/core/ingestion/languages/python/arity-metadata.js +49 -0
  348. package/dist/core/code/engine/core/ingestion/languages/python/arity.js +41 -0
  349. package/dist/core/code/engine/core/ingestion/languages/python/cache-stats.js +34 -0
  350. package/dist/core/code/engine/core/ingestion/languages/python/captures.js +299 -0
  351. package/dist/core/code/engine/core/ingestion/languages/python/depends-references.js +68 -0
  352. package/dist/core/code/engine/core/ingestion/languages/python/import-decomposer.js +115 -0
  353. package/dist/core/code/engine/core/ingestion/languages/python/import-target.js +440 -0
  354. package/dist/core/code/engine/core/ingestion/languages/python/index-stats.js +30 -0
  355. package/dist/core/code/engine/core/ingestion/languages/python/index.js +96 -0
  356. package/dist/core/code/engine/core/ingestion/languages/python/interpret.js +430 -0
  357. package/dist/core/code/engine/core/ingestion/languages/python/merge-bindings.js +47 -0
  358. package/dist/core/code/engine/core/ingestion/languages/python/query.js +323 -0
  359. package/dist/core/code/engine/core/ingestion/languages/python/receiver-binding.js +310 -0
  360. package/dist/core/code/engine/core/ingestion/languages/python/scope-resolver.js +80 -0
  361. package/dist/core/code/engine/core/ingestion/languages/python/simple-hooks.js +53 -0
  362. package/dist/core/code/engine/core/ingestion/languages/python.js +140 -0
  363. package/dist/core/code/engine/core/ingestion/languages/ruby/arity.js +41 -0
  364. package/dist/core/code/engine/core/ingestion/languages/ruby/cache-stats.js +21 -0
  365. package/dist/core/code/engine/core/ingestion/languages/ruby/captures.js +864 -0
  366. package/dist/core/code/engine/core/ingestion/languages/ruby/import-target.js +88 -0
  367. package/dist/core/code/engine/core/ingestion/languages/ruby/index.js +29 -0
  368. package/dist/core/code/engine/core/ingestion/languages/ruby/interpret.js +115 -0
  369. package/dist/core/code/engine/core/ingestion/languages/ruby/merge-bindings.js +21 -0
  370. package/dist/core/code/engine/core/ingestion/languages/ruby/query.js +349 -0
  371. package/dist/core/code/engine/core/ingestion/languages/ruby/receiver-binding.js +70 -0
  372. package/dist/core/code/engine/core/ingestion/languages/ruby/scope-resolver.js +263 -0
  373. package/dist/core/code/engine/core/ingestion/languages/ruby/simple-hooks.js +68 -0
  374. package/dist/core/code/engine/core/ingestion/languages/ruby.js +215 -0
  375. package/dist/core/code/engine/core/ingestion/languages/rust/arity.js +16 -0
  376. package/dist/core/code/engine/core/ingestion/languages/rust/cache-stats.js +21 -0
  377. package/dist/core/code/engine/core/ingestion/languages/rust/captures.js +304 -0
  378. package/dist/core/code/engine/core/ingestion/languages/rust/import-decomposer.js +167 -0
  379. package/dist/core/code/engine/core/ingestion/languages/rust/import-target.js +108 -0
  380. package/dist/core/code/engine/core/ingestion/languages/rust/index.js +29 -0
  381. package/dist/core/code/engine/core/ingestion/languages/rust/interpret.js +201 -0
  382. package/dist/core/code/engine/core/ingestion/languages/rust/merge-bindings.js +21 -0
  383. package/dist/core/code/engine/core/ingestion/languages/rust/method-owners.js +76 -0
  384. package/dist/core/code/engine/core/ingestion/languages/rust/module-path.js +222 -0
  385. package/dist/core/code/engine/core/ingestion/languages/rust/qualified-call.js +482 -0
  386. package/dist/core/code/engine/core/ingestion/languages/rust/query.js +280 -0
  387. package/dist/core/code/engine/core/ingestion/languages/rust/range-binding.js +687 -0
  388. package/dist/core/code/engine/core/ingestion/languages/rust/receiver-binding.js +148 -0
  389. package/dist/core/code/engine/core/ingestion/languages/rust/scope-resolver.js +151 -0
  390. package/dist/core/code/engine/core/ingestion/languages/rust/simple-hooks.js +32 -0
  391. package/dist/core/code/engine/core/ingestion/languages/rust.js +183 -0
  392. package/dist/core/code/engine/core/ingestion/languages/swift/arity-metadata.js +44 -0
  393. package/dist/core/code/engine/core/ingestion/languages/swift/arity.js +45 -0
  394. package/dist/core/code/engine/core/ingestion/languages/swift/base-type.js +30 -0
  395. package/dist/core/code/engine/core/ingestion/languages/swift/cache-stats.js +32 -0
  396. package/dist/core/code/engine/core/ingestion/languages/swift/captures.js +594 -0
  397. package/dist/core/code/engine/core/ingestion/languages/swift/conditional-directive-preprocess.js +256 -0
  398. package/dist/core/code/engine/core/ingestion/languages/swift/implicit-imports.js +60 -0
  399. package/dist/core/code/engine/core/ingestion/languages/swift/import-decomposer.js +87 -0
  400. package/dist/core/code/engine/core/ingestion/languages/swift/import-target.js +84 -0
  401. package/dist/core/code/engine/core/ingestion/languages/swift/index.js +56 -0
  402. package/dist/core/code/engine/core/ingestion/languages/swift/interpret.js +93 -0
  403. package/dist/core/code/engine/core/ingestion/languages/swift/merge-bindings.js +51 -0
  404. package/dist/core/code/engine/core/ingestion/languages/swift/query.js +226 -0
  405. package/dist/core/code/engine/core/ingestion/languages/swift/receiver-binding.js +169 -0
  406. package/dist/core/code/engine/core/ingestion/languages/swift/scope-resolver.js +192 -0
  407. package/dist/core/code/engine/core/ingestion/languages/swift/sibling-type-bindings.js +68 -0
  408. package/dist/core/code/engine/core/ingestion/languages/swift/signature-bindings.js +69 -0
  409. package/dist/core/code/engine/core/ingestion/languages/swift/simple-hooks.js +65 -0
  410. package/dist/core/code/engine/core/ingestion/languages/swift/target-grouping.js +97 -0
  411. package/dist/core/code/engine/core/ingestion/languages/swift/target-siblings.js +74 -0
  412. package/dist/core/code/engine/core/ingestion/languages/swift.js +246 -0
  413. package/dist/core/code/engine/core/ingestion/languages/typescript/arity-metadata.js +106 -0
  414. package/dist/core/code/engine/core/ingestion/languages/typescript/arity.js +57 -0
  415. package/dist/core/code/engine/core/ingestion/languages/typescript/array-callback.js +58 -0
  416. package/dist/core/code/engine/core/ingestion/languages/typescript/cache-stats.js +34 -0
  417. package/dist/core/code/engine/core/ingestion/languages/typescript/captures.js +956 -0
  418. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-export-assignment.js +535 -0
  419. package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-module-exports.js +196 -0
  420. package/dist/core/code/engine/core/ingestion/languages/typescript/import-decomposer.js +374 -0
  421. package/dist/core/code/engine/core/ingestion/languages/typescript/import-target.js +65 -0
  422. package/dist/core/code/engine/core/ingestion/languages/typescript/index.js +108 -0
  423. package/dist/core/code/engine/core/ingestion/languages/typescript/interpret.js +344 -0
  424. package/dist/core/code/engine/core/ingestion/languages/typescript/merge-bindings.js +161 -0
  425. package/dist/core/code/engine/core/ingestion/languages/typescript/nuxt-auto-imports.js +325 -0
  426. package/dist/core/code/engine/core/ingestion/languages/typescript/query.js +1328 -0
  427. package/dist/core/code/engine/core/ingestion/languages/typescript/receiver-binding.js +201 -0
  428. package/dist/core/code/engine/core/ingestion/languages/typescript/scope-resolver.js +293 -0
  429. package/dist/core/code/engine/core/ingestion/languages/typescript/simple-hooks.js +139 -0
  430. package/dist/core/code/engine/core/ingestion/languages/typescript.js +455 -0
  431. package/dist/core/code/engine/core/ingestion/languages/vue/captures.js +70 -0
  432. package/dist/core/code/engine/core/ingestion/languages/vue/import-target.js +61 -0
  433. package/dist/core/code/engine/core/ingestion/languages/vue/index.js +55 -0
  434. package/dist/core/code/engine/core/ingestion/languages/vue/scope-resolver.js +295 -0
  435. package/dist/core/code/engine/core/ingestion/languages/vue.js +96 -0
  436. package/dist/core/code/engine/core/ingestion/local-symbol-pruner.js +68 -0
  437. package/dist/core/code/engine/core/ingestion/method-extractors/configs/c-cpp.js +387 -0
  438. package/dist/core/code/engine/core/ingestion/method-extractors/configs/csharp.js +290 -0
  439. package/dist/core/code/engine/core/ingestion/method-extractors/configs/dart.js +392 -0
  440. package/dist/core/code/engine/core/ingestion/method-extractors/configs/go.js +179 -0
  441. package/dist/core/code/engine/core/ingestion/method-extractors/configs/jvm.js +350 -0
  442. package/dist/core/code/engine/core/ingestion/method-extractors/configs/php.js +306 -0
  443. package/dist/core/code/engine/core/ingestion/method-extractors/configs/python.js +312 -0
  444. package/dist/core/code/engine/core/ingestion/method-extractors/configs/ruby.js +289 -0
  445. package/dist/core/code/engine/core/ingestion/method-extractors/configs/rust.js +198 -0
  446. package/dist/core/code/engine/core/ingestion/method-extractors/configs/swift.js +286 -0
  447. package/dist/core/code/engine/core/ingestion/method-extractors/configs/typescript-javascript.js +341 -0
  448. package/dist/core/code/engine/core/ingestion/method-extractors/generic.js +209 -0
  449. package/dist/core/code/engine/core/ingestion/method-types.js +3 -0
  450. package/dist/core/code/engine/core/ingestion/model/field-registry.js +41 -0
  451. package/dist/core/code/engine/core/ingestion/model/index.js +52 -0
  452. package/dist/core/code/engine/core/ingestion/model/method-registry.js +138 -0
  453. package/dist/core/code/engine/core/ingestion/model/owned-members-lookup.js +46 -0
  454. package/dist/core/code/engine/core/ingestion/model/registration-table.js +234 -0
  455. package/dist/core/code/engine/core/ingestion/model/resolve.js +183 -0
  456. package/dist/core/code/engine/core/ingestion/model/scope-resolution-indexes.js +43 -0
  457. package/dist/core/code/engine/core/ingestion/model/semantic-model.js +179 -0
  458. package/dist/core/code/engine/core/ingestion/model/symbol-table.js +216 -0
  459. package/dist/core/code/engine/core/ingestion/model/type-registry.js +84 -0
  460. package/dist/core/code/engine/core/ingestion/mro-processor.js +709 -0
  461. package/dist/core/code/engine/core/ingestion/parsing-processor.js +312 -0
  462. package/dist/core/code/engine/core/ingestion/pipeline-phases/communities.js +69 -0
  463. package/dist/core/code/engine/core/ingestion/pipeline-phases/cross-file.js +71 -0
  464. package/dist/core/code/engine/core/ingestion/pipeline-phases/di.js +338 -0
  465. package/dist/core/code/engine/core/ingestion/pipeline-phases/http-api-calls.js +312 -0
  466. package/dist/core/code/engine/core/ingestion/pipeline-phases/index.js +54 -0
  467. package/dist/core/code/engine/core/ingestion/pipeline-phases/mro.js +40 -0
  468. package/dist/core/code/engine/core/ingestion/pipeline-phases/orm.js +78 -0
  469. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse-impl.js +1286 -0
  470. package/dist/core/code/engine/core/ingestion/pipeline-phases/parse.js +41 -0
  471. package/dist/core/code/engine/core/ingestion/pipeline-phases/processes.js +193 -0
  472. package/dist/core/code/engine/core/ingestion/pipeline-phases/prune-local-symbols.js +29 -0
  473. package/dist/core/code/engine/core/ingestion/pipeline-phases/registry.js +52 -0
  474. package/dist/core/code/engine/core/ingestion/pipeline-phases/routes.js +409 -0
  475. package/dist/core/code/engine/core/ingestion/pipeline-phases/rpc-edges.js +301 -0
  476. package/dist/core/code/engine/core/ingestion/pipeline-phases/runner.js +207 -0
  477. package/dist/core/code/engine/core/ingestion/pipeline-phases/scan.js +49 -0
  478. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-aop.js +442 -0
  479. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-auto-configuration.js +264 -0
  480. package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-config.js +440 -0
  481. package/dist/core/code/engine/core/ingestion/pipeline-phases/structure.js +38 -0
  482. package/dist/core/code/engine/core/ingestion/pipeline-phases/tools.js +89 -0
  483. package/dist/core/code/engine/core/ingestion/pipeline-phases/types.js +40 -0
  484. package/dist/core/code/engine/core/ingestion/pipeline.js +152 -0
  485. package/dist/core/code/engine/core/ingestion/process-processor.js +325 -0
  486. package/dist/core/code/engine/core/ingestion/resolve-references.js +205 -0
  487. package/dist/core/code/engine/core/ingestion/route-extractors/constant-resolver.js +135 -0
  488. package/dist/core/code/engine/core/ingestion/route-extractors/django-root-discovery.js +221 -0
  489. package/dist/core/code/engine/core/ingestion/route-extractors/django.js +428 -0
  490. package/dist/core/code/engine/core/ingestion/route-extractors/expo.js +39 -0
  491. package/dist/core/code/engine/core/ingestion/route-extractors/fastapi-router-bindings.js +264 -0
  492. package/dist/core/code/engine/core/ingestion/route-extractors/laravel.js +501 -0
  493. package/dist/core/code/engine/core/ingestion/route-extractors/middleware.js +175 -0
  494. package/dist/core/code/engine/core/ingestion/route-extractors/nextjs.js +81 -0
  495. package/dist/core/code/engine/core/ingestion/route-extractors/php.js +25 -0
  496. package/dist/core/code/engine/core/ingestion/route-extractors/python-const-resolver.js +307 -0
  497. package/dist/core/code/engine/core/ingestion/route-extractors/response-shapes.js +299 -0
  498. package/dist/core/code/engine/core/ingestion/route-extractors/route-path.js +71 -0
  499. package/dist/core/code/engine/core/ingestion/route-extractors/spring-shared.js +310 -0
  500. package/dist/core/code/engine/core/ingestion/route-extractors/spring.js +441 -0
  501. package/dist/core/code/engine/core/ingestion/scope-extractor-bridge.js +60 -0
  502. package/dist/core/code/engine/core/ingestion/scope-extractor.js +1373 -0
  503. package/dist/core/code/engine/core/ingestion/scope-resolution/contract/scope-resolver.js +282 -0
  504. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +72 -0
  505. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/edges.js +194 -0
  506. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/ids.js +472 -0
  507. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +49 -0
  508. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/method-dispatch.js +43 -0
  509. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +274 -0
  510. package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +93 -0
  511. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/callable-value-flow.js +1240 -0
  512. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/compound-receiver.js +1174 -0
  513. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/free-call-fallback.js +873 -0
  514. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/imported-return-types.js +226 -0
  515. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/mro.js +107 -0
  516. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/overload-narrowing.js +441 -0
  517. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/property-dispatch.js +122 -0
  518. package/dist/core/code/engine/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +1720 -0
  519. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/phase.js +395 -0
  520. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +208 -0
  521. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/registry.js +49 -0
  522. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/run.js +632 -0
  523. package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/validate-bindings-immutability.js +112 -0
  524. package/dist/core/code/engine/core/ingestion/scope-resolution/resolution-outcome.js +41 -0
  525. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/namespace-targets.js +81 -0
  526. package/dist/core/code/engine/core/ingestion/scope-resolution/scope/walkers.js +1835 -0
  527. package/dist/core/code/engine/core/ingestion/scope-resolution/unresolved-receivers.js +242 -0
  528. package/dist/core/code/engine/core/ingestion/scope-resolution/utils/definition-id.js +22 -0
  529. package/dist/core/code/engine/core/ingestion/scope-resolution/workspace-index.js +151 -0
  530. package/dist/core/code/engine/core/ingestion/structure-processor.js +40 -0
  531. package/dist/core/code/engine/core/ingestion/tree-sitter-queries.js +2244 -0
  532. package/dist/core/code/engine/core/ingestion/ts-js-hoc-utils.js +115 -0
  533. package/dist/core/code/engine/core/ingestion/type-env.js +1136 -0
  534. package/dist/core/code/engine/core/ingestion/type-extractors/c-cpp.js +555 -0
  535. package/dist/core/code/engine/core/ingestion/type-extractors/csharp.js +570 -0
  536. package/dist/core/code/engine/core/ingestion/type-extractors/dart.js +372 -0
  537. package/dist/core/code/engine/core/ingestion/type-extractors/go.js +508 -0
  538. package/dist/core/code/engine/core/ingestion/type-extractors/jvm.js +875 -0
  539. package/dist/core/code/engine/core/ingestion/type-extractors/php.js +537 -0
  540. package/dist/core/code/engine/core/ingestion/type-extractors/python.js +477 -0
  541. package/dist/core/code/engine/core/ingestion/type-extractors/ruby.js +380 -0
  542. package/dist/core/code/engine/core/ingestion/type-extractors/rust.js +502 -0
  543. package/dist/core/code/engine/core/ingestion/type-extractors/shared.js +843 -0
  544. package/dist/core/code/engine/core/ingestion/type-extractors/swift.js +490 -0
  545. package/dist/core/code/engine/core/ingestion/type-extractors/types.js +2 -0
  546. package/dist/core/code/engine/core/ingestion/type-extractors/typescript.js +690 -0
  547. package/dist/core/code/engine/core/ingestion/utils/ast-helpers.js +1693 -0
  548. package/dist/core/code/engine/core/ingestion/utils/call-analysis.js +779 -0
  549. package/dist/core/code/engine/core/ingestion/utils/callable-flow-captures.js +932 -0
  550. package/dist/core/code/engine/core/ingestion/utils/callable-labels.js +49 -0
  551. package/dist/core/code/engine/core/ingestion/utils/deferred-resolution-profile.js +151 -0
  552. package/dist/core/code/engine/core/ingestion/utils/effective-ram.js +67 -0
  553. package/dist/core/code/engine/core/ingestion/utils/env.js +60 -0
  554. package/dist/core/code/engine/core/ingestion/utils/event-loop.js +9 -0
  555. package/dist/core/code/engine/core/ingestion/utils/graph-sort.js +103 -0
  556. package/dist/core/code/engine/core/ingestion/utils/heap-probe.js +45 -0
  557. package/dist/core/code/engine/core/ingestion/utils/heritage-marker.js +47 -0
  558. package/dist/core/code/engine/core/ingestion/utils/line-base.js +24 -0
  559. package/dist/core/code/engine/core/ingestion/utils/max-file-size.js +59 -0
  560. package/dist/core/code/engine/core/ingestion/utils/method-props.js +198 -0
  561. package/dist/core/code/engine/core/ingestion/utils/qualified-name.js +73 -0
  562. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-captures.js +60 -0
  563. package/dist/core/code/engine/core/ingestion/utils/receiver-chain-codec.js +188 -0
  564. package/dist/core/code/engine/core/ingestion/utils/scope-tree-walk.js +36 -0
  565. package/dist/core/code/engine/core/ingestion/utils/symbol-labels.js +48 -0
  566. package/dist/core/code/engine/core/ingestion/utils/template-arguments.js +187 -0
  567. package/dist/core/code/engine/core/ingestion/utils/type-parameters.js +209 -0
  568. package/dist/core/code/engine/core/ingestion/utils/verbose.js +6 -0
  569. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/c-cpp.js +133 -0
  570. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/csharp.js +66 -0
  571. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/dart.js +111 -0
  572. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/go.js +153 -0
  573. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/jvm.js +145 -0
  574. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/php.js +61 -0
  575. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/python.js +104 -0
  576. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/ruby.js +55 -0
  577. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/rust.js +79 -0
  578. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/swift.js +91 -0
  579. package/dist/core/code/engine/core/ingestion/variable-extractors/configs/typescript-javascript.js +86 -0
  580. package/dist/core/code/engine/core/ingestion/variable-extractors/generic.js +111 -0
  581. package/dist/core/code/engine/core/ingestion/variable-types.js +3 -0
  582. package/dist/core/code/engine/core/ingestion/vue-sfc-extractor.js +544 -0
  583. package/dist/core/code/engine/core/ingestion/workers/callable-id.js +122 -0
  584. package/dist/core/code/engine/core/ingestion/workers/clone-safety.js +470 -0
  585. package/dist/core/code/engine/core/ingestion/workers/parse-worker.js +2456 -0
  586. package/dist/core/code/engine/core/ingestion/workers/post-result.js +90 -0
  587. package/dist/core/code/engine/core/ingestion/workers/quarantine.js +41 -0
  588. package/dist/core/code/engine/core/ingestion/workers/result-merge.js +59 -0
  589. package/dist/core/code/engine/core/ingestion/workers/worker-pool.js +1725 -0
  590. package/dist/core/code/engine/core/ingestion/workspace-config.js +139 -0
  591. package/dist/core/code/engine/core/lbug/conn-lock.js +72 -0
  592. package/dist/core/code/engine/core/lbug/csv-generator.js +710 -0
  593. package/dist/core/code/engine/core/lbug/cypher-escape.js +24 -0
  594. package/dist/core/code/engine/core/lbug/extension-load-error.js +339 -0
  595. package/dist/core/code/engine/core/lbug/extension-loader.js +261 -0
  596. package/dist/core/code/engine/core/lbug/graph-emit-sink.js +584 -0
  597. package/dist/core/code/engine/core/lbug/lbug-adapter.js +2703 -0
  598. package/dist/core/code/engine/core/lbug/lbug-config.js +1029 -0
  599. package/dist/core/code/engine/core/lbug/native-check.js +435 -0
  600. package/dist/core/code/engine/core/lbug/pool-adapter.js +973 -0
  601. package/dist/core/code/engine/core/lbug/query-params.js +25 -0
  602. package/dist/core/code/engine/core/lbug/query-result-utils.js +31 -0
  603. package/dist/core/code/engine/core/lbug/rel-pair-routing.js +373 -0
  604. package/dist/core/code/engine/core/lbug/schema.js +771 -0
  605. package/dist/core/code/engine/core/lbug/shutdown-helpers.js +40 -0
  606. package/dist/core/code/engine/core/lbug/sidecar-recovery.js +716 -0
  607. package/dist/core/code/engine/core/lbug/stdio-capture.js +49 -0
  608. package/dist/core/code/engine/core/lbug/sync-csv-writer.js +115 -0
  609. package/dist/core/code/engine/core/lbug/wal-checkpoint-driver.js +215 -0
  610. package/dist/core/code/engine/core/lbug/wal-driver-state.js +28 -0
  611. package/dist/core/code/engine/core/logger.js +339 -0
  612. package/dist/core/code/engine/core/platform/capabilities.js +91 -0
  613. package/dist/core/code/engine/core/run-analyze.js +1098 -0
  614. package/dist/core/code/engine/core/tree-sitter/parser-loader.js +281 -0
  615. package/dist/core/code/engine/core/tree-sitter/safe-parse.js +258 -0
  616. package/dist/core/code/engine/core/tree-sitter/vendored-grammars.js +64 -0
  617. package/dist/core/code/engine/lib/utils.js +121 -0
  618. package/dist/core/code/engine/mcp/core/lbug-adapter.js +27 -0
  619. package/dist/core/code/engine/mcp/local/aop-metadata.js +230 -0
  620. package/dist/core/code/engine/mcp/local/bean-metadata.js +49 -0
  621. package/dist/core/code/engine/mcp/local/limits.js +15 -0
  622. package/dist/core/code/engine/mcp/local/line-display.js +6 -0
  623. package/dist/core/code/engine/mcp/local/local-backend.js +4142 -0
  624. package/dist/core/code/engine/storage/branch-index.js +72 -0
  625. package/dist/core/code/engine/storage/file-hash.js +95 -0
  626. package/dist/core/code/engine/storage/fs-atomic.js +34 -0
  627. package/dist/core/code/engine/storage/git.js +555 -0
  628. package/dist/core/code/engine/storage/index-lock.js +664 -0
  629. package/dist/core/code/engine/storage/parse-cache.js +650 -0
  630. package/dist/core/code/engine/storage/parsedfile-store.js +620 -0
  631. package/dist/core/code/engine/storage/repo-manager.js +1061 -0
  632. package/dist/core/code/engine/storage/scope-index-store.js +247 -0
  633. package/dist/core/code/engine/types/pipeline.js +2 -0
  634. package/dist/core/code/scripts/install-duckdb-extension.mjs +125 -0
  635. package/dist/core/code/scripts/resolve-analyze-cmd.cjs +346 -0
  636. package/dist/core/code/shared/graph/types.js +8 -0
  637. package/dist/core/code/shared/index.js +105 -0
  638. package/dist/core/code/shared/integrations/circuit-breaker.js +242 -0
  639. package/dist/core/code/shared/integrations/resilient-fetch.js +224 -0
  640. package/dist/core/code/shared/integrations/retry.js +70 -0
  641. package/dist/core/code/shared/integrations/understand-quickly.js +145 -0
  642. package/dist/core/code/shared/language-detection.js +162 -0
  643. package/dist/core/code/shared/languages.js +27 -0
  644. package/dist/core/code/shared/lbug/schema-constants.js +98 -0
  645. package/dist/core/code/shared/mro-strategy.js +2 -0
  646. package/dist/core/code/shared/pipeline.js +5 -0
  647. package/dist/core/code/shared/scope-resolution/callable-flow-site.js +11 -0
  648. package/dist/core/code/shared/scope-resolution/def-index.js +53 -0
  649. package/dist/core/code/shared/scope-resolution/evidence-weights.js +87 -0
  650. package/dist/core/code/shared/scope-resolution/finalize-algorithm.js +807 -0
  651. package/dist/core/code/shared/scope-resolution/language-classification.js +46 -0
  652. package/dist/core/code/shared/scope-resolution/method-dispatch-index.js +100 -0
  653. package/dist/core/code/shared/scope-resolution/module-scope-index.js +59 -0
  654. package/dist/core/code/shared/scope-resolution/origin-priority.js +23 -0
  655. package/dist/core/code/shared/scope-resolution/parsed-file.js +54 -0
  656. package/dist/core/code/shared/scope-resolution/position-index.js +136 -0
  657. package/dist/core/code/shared/scope-resolution/qualified-name-index.js +77 -0
  658. package/dist/core/code/shared/scope-resolution/reference-site.js +24 -0
  659. package/dist/core/code/shared/scope-resolution/registries/class-registry.js +32 -0
  660. package/dist/core/code/shared/scope-resolution/registries/context.js +52 -0
  661. package/dist/core/code/shared/scope-resolution/registries/evidence.js +152 -0
  662. package/dist/core/code/shared/scope-resolution/registries/field-registry.js +33 -0
  663. package/dist/core/code/shared/scope-resolution/registries/lookup-core.js +392 -0
  664. package/dist/core/code/shared/scope-resolution/registries/lookup-qualified.js +58 -0
  665. package/dist/core/code/shared/scope-resolution/registries/macro-registry.js +34 -0
  666. package/dist/core/code/shared/scope-resolution/registries/method-registry.js +34 -0
  667. package/dist/core/code/shared/scope-resolution/registries/tie-breaks.js +63 -0
  668. package/dist/core/code/shared/scope-resolution/resolve-type-ref.js +128 -0
  669. package/dist/core/code/shared/scope-resolution/scope-id.js +49 -0
  670. package/dist/core/code/shared/scope-resolution/scope-tree.js +225 -0
  671. package/dist/core/code/shared/scope-resolution/symbol-definition.js +12 -0
  672. package/dist/core/code/shared/scope-resolution/types.js +25 -0
  673. package/dist/core/code/shared/test-helpers.js +17 -0
  674. package/dist/core/code/vendor/leiden/index.cjs +355 -0
  675. package/dist/core/code/vendor/leiden/utils.cjs +419 -0
  676. package/dist/core/features/scanner.d.ts +2 -0
  677. package/dist/core/features/scanner.d.ts.map +1 -1
  678. package/dist/core/features/scanner.js +27 -6
  679. package/dist/core/features/scanner.js.map +1 -1
  680. package/dist/core/timeline/cli.d.ts.map +1 -1
  681. package/dist/core/timeline/cli.js +13 -6
  682. package/dist/core/timeline/cli.js.map +1 -1
  683. package/dist/core/timeline/debris.d.ts +20 -0
  684. package/dist/core/timeline/debris.d.ts.map +1 -0
  685. package/dist/core/timeline/debris.js +124 -0
  686. package/dist/core/timeline/debris.js.map +1 -0
  687. package/dist/core/timeline/hook-runner.d.ts.map +1 -1
  688. package/dist/core/timeline/hook-runner.js +3 -1
  689. package/dist/core/timeline/hook-runner.js.map +1 -1
  690. package/dist/core/timeline/hooks.d.ts.map +1 -1
  691. package/dist/core/timeline/hooks.js +13 -5
  692. package/dist/core/timeline/hooks.js.map +1 -1
  693. package/dist/core/timeline/installer.d.ts +2 -0
  694. package/dist/core/timeline/installer.d.ts.map +1 -1
  695. package/dist/core/timeline/installer.js +12 -0
  696. package/dist/core/timeline/installer.js.map +1 -1
  697. package/dist/core/timeline/project-root.d.ts +21 -0
  698. package/dist/core/timeline/project-root.d.ts.map +1 -0
  699. package/dist/core/timeline/project-root.js +83 -0
  700. package/dist/core/timeline/project-root.js.map +1 -0
  701. package/package.json +1 -1
@@ -0,0 +1,709 @@
1
+ "use strict";
2
+ /**
3
+ * MRO (Method Resolution Order) Processor
4
+ *
5
+ * Walks the inheritance graph (EXTENDS/IMPLEMENTS edges), collects methods from
6
+ * each ancestor via HAS_METHOD edges, detects method-name collisions across
7
+ * parents, and applies language-specific resolution rules to emit METHOD_OVERRIDES edges.
8
+ *
9
+ * Language-specific rules:
10
+ * - C++: leftmost base class in declaration order wins
11
+ * - C#/Java: class method wins over interface default; multiple interface
12
+ * methods with same name are ambiguous (null resolution)
13
+ * - Python: C3 linearization determines MRO; first in linearized order wins
14
+ * - Rust: no auto-resolution — requires qualified syntax, resolvedTo = null
15
+ * - Default: single inheritance — first definition wins
16
+ *
17
+ * METHOD_OVERRIDES edge direction: Class → Method (not Method → Method).
18
+ * The source is the child class that inherits conflicting methods,
19
+ * the target is the winning ancestor method node.
20
+ * Cypher: MATCH (c:Class)-[r:CodeRelation {type: 'METHOD_OVERRIDES'}]->(m:Method)
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.computeMRO = computeMRO;
24
+ const utils_js_1 = require("../../lib/utils.js");
25
+ const index_js_1 = require("./languages/index.js");
26
+ const resolve_js_1 = require("./model/resolve.js");
27
+ // ---------------------------------------------------------------------------
28
+ // Internal helpers
29
+ // ---------------------------------------------------------------------------
30
+ /** Collect EXTENDS, IMPLEMENTS, and HAS_METHOD adjacency from the graph. */
31
+ function buildAdjacency(graph) {
32
+ // parentMap: childId → parentIds[] (in insertion / declaration order)
33
+ const parentMap = new Map();
34
+ // methodMap: classId → methodIds[]
35
+ const methodMap = new Map();
36
+ // Track which edge type each parent link came from
37
+ const parentEdgeType = new Map();
38
+ // Three typed iterations replace one full-relationship-map scan
39
+ // with per-edge type checks. Each consumes only the edges of the
40
+ // type it cares about — see plan
41
+ // docs/plans/2026-04-20-002-perf-parse-heritage-mro-plan.md (Unit 2).
42
+ for (const rel of graph.iterRelationshipsByType('EXTENDS')) {
43
+ let parents = parentMap.get(rel.sourceId);
44
+ if (!parents) {
45
+ parents = [];
46
+ parentMap.set(rel.sourceId, parents);
47
+ }
48
+ parents.push(rel.targetId);
49
+ let edgeTypes = parentEdgeType.get(rel.sourceId);
50
+ if (!edgeTypes) {
51
+ edgeTypes = new Map();
52
+ parentEdgeType.set(rel.sourceId, edgeTypes);
53
+ }
54
+ edgeTypes.set(rel.targetId, 'EXTENDS');
55
+ }
56
+ for (const rel of graph.iterRelationshipsByType('IMPLEMENTS')) {
57
+ let parents = parentMap.get(rel.sourceId);
58
+ if (!parents) {
59
+ parents = [];
60
+ parentMap.set(rel.sourceId, parents);
61
+ }
62
+ parents.push(rel.targetId);
63
+ let edgeTypes = parentEdgeType.get(rel.sourceId);
64
+ if (!edgeTypes) {
65
+ edgeTypes = new Map();
66
+ parentEdgeType.set(rel.sourceId, edgeTypes);
67
+ }
68
+ edgeTypes.set(rel.targetId, 'IMPLEMENTS');
69
+ }
70
+ for (const rel of graph.iterRelationshipsByType('HAS_METHOD')) {
71
+ let methods = methodMap.get(rel.sourceId);
72
+ if (!methods) {
73
+ methods = [];
74
+ methodMap.set(rel.sourceId, methods);
75
+ }
76
+ methods.push(rel.targetId);
77
+ }
78
+ return { parentMap, methodMap, parentEdgeType };
79
+ }
80
+ /** Confidence for a single-ancestor override edge (a subclass overriding one parent
81
+ * method via class inheritance) — same tier as MRO-ordered resolution. */
82
+ const SINGLE_ANCESTOR_OVERRIDE_CONFIDENCE = 0.9;
83
+ /** Resolve by MRO order — first ancestor in linearized order wins. */
84
+ function resolveByMroOrder(methodName, defs, mroOrder, reasonPrefix) {
85
+ for (const ancestorId of mroOrder) {
86
+ const match = defs.find((d) => d.classId === ancestorId);
87
+ if (match) {
88
+ return {
89
+ resolvedTo: match.methodId,
90
+ reason: `${reasonPrefix}: ${match.className}::${methodName}`,
91
+ confidence: 0.9, // MRO-ordered resolution
92
+ };
93
+ }
94
+ }
95
+ return {
96
+ resolvedTo: defs[0].methodId,
97
+ reason: `${reasonPrefix} fallback: first definition`,
98
+ confidence: 0.7,
99
+ };
100
+ }
101
+ function resolveCsharpJava(methodName, defs, parentEdgeTypes) {
102
+ const classDefs = [];
103
+ const interfaceDefs = [];
104
+ for (const def of defs) {
105
+ const edgeType = parentEdgeTypes?.get(def.classId);
106
+ if (edgeType === 'IMPLEMENTS') {
107
+ interfaceDefs.push(def);
108
+ }
109
+ else {
110
+ classDefs.push(def);
111
+ }
112
+ }
113
+ if (classDefs.length > 0) {
114
+ return {
115
+ resolvedTo: classDefs[0].methodId,
116
+ reason: `class method wins: ${classDefs[0].className}::${methodName}`,
117
+ confidence: 0.95, // Class method is authoritative
118
+ };
119
+ }
120
+ if (interfaceDefs.length > 1) {
121
+ return {
122
+ resolvedTo: null,
123
+ reason: `ambiguous: ${methodName} defined in multiple interfaces: ${interfaceDefs.map((d) => d.className).join(', ')}`,
124
+ confidence: 0.5,
125
+ };
126
+ }
127
+ if (interfaceDefs.length === 1) {
128
+ return {
129
+ resolvedTo: interfaceDefs[0].methodId,
130
+ reason: `single interface default: ${interfaceDefs[0].className}::${methodName}`,
131
+ confidence: 0.85, // Single interface, unambiguous
132
+ };
133
+ }
134
+ return { resolvedTo: null, reason: 'no resolution found', confidence: 0.5 };
135
+ }
136
+ // ---------------------------------------------------------------------------
137
+ // Main entry point
138
+ // ---------------------------------------------------------------------------
139
+ function computeMRO(graph) {
140
+ const { parentMap, methodMap, parentEdgeType } = buildAdjacency(graph);
141
+ const c3Cache = new Map();
142
+ const entries = [];
143
+ let overrideEdges = 0;
144
+ let ambiguityCount = 0;
145
+ // Pre-computed maps to avoid redundant BFS in emitMethodImplementsEdges
146
+ const ancestorsMap = new Map();
147
+ const edgeTypesMap = new Map();
148
+ // Process every class that has at least one parent
149
+ for (const [classId, directParents] of parentMap) {
150
+ if (directParents.length === 0)
151
+ continue;
152
+ const classNode = graph.getNode(classId);
153
+ if (!classNode)
154
+ continue;
155
+ const language = classNode.properties.language;
156
+ if (!language)
157
+ continue;
158
+ const className = classNode.properties.name;
159
+ // Compute linearized MRO depending on language strategy
160
+ const provider = (0, index_js_1.getProvider)(language);
161
+ const ancestors = (0, resolve_js_1.gatherAncestors)(classId, parentMap);
162
+ ancestorsMap.set(classId, ancestors);
163
+ edgeTypesMap.set(classId, buildTransitiveEdgeTypes(classId, parentMap, parentEdgeType));
164
+ let mroOrder;
165
+ if (provider.mroStrategy === 'c3') {
166
+ const c3Result = (0, resolve_js_1.c3Linearize)(classId, parentMap, c3Cache);
167
+ mroOrder = c3Result ?? ancestors;
168
+ }
169
+ else {
170
+ mroOrder = ancestors;
171
+ }
172
+ // Get the parent names for the MRO entry
173
+ const mroNames = mroOrder
174
+ .map((id) => graph.getNode(id)?.properties.name)
175
+ .filter((n) => n !== undefined);
176
+ // Collect methods from all ancestors, grouped by method name
177
+ const methodsByName = new Map();
178
+ for (const ancestorId of mroOrder) {
179
+ const ancestorNode = graph.getNode(ancestorId);
180
+ if (!ancestorNode)
181
+ continue;
182
+ const methods = methodMap.get(ancestorId) ?? [];
183
+ for (const methodId of methods) {
184
+ const methodNode = graph.getNode(methodId);
185
+ if (!methodNode)
186
+ continue;
187
+ // Properties don't participate in method resolution order
188
+ if (methodNode.label === 'Property')
189
+ continue;
190
+ const methodName = methodNode.properties.name;
191
+ let defs = methodsByName.get(methodName);
192
+ if (!defs) {
193
+ defs = [];
194
+ methodsByName.set(methodName, defs);
195
+ }
196
+ // Avoid duplicates (same method seen via multiple paths)
197
+ if (!defs.some((d) => d.methodId === methodId)) {
198
+ defs.push({
199
+ classId: ancestorId,
200
+ className: ancestorNode.properties.name,
201
+ methodId,
202
+ });
203
+ }
204
+ }
205
+ }
206
+ // Detect collisions: methods defined in 2+ different ancestors
207
+ const ambiguities = [];
208
+ // Use pre-computed transitive edge types (only needed for implements-split languages)
209
+ const needsEdgeTypes = provider.mroStrategy === 'implements-split';
210
+ const classEdgeTypes = needsEdgeTypes ? edgeTypesMap.get(classId) : undefined;
211
+ for (const [methodName, defs] of methodsByName) {
212
+ if (defs.length < 2)
213
+ continue;
214
+ // Own method shadows inherited — no ambiguity
215
+ const ownMethods = methodMap.get(classId) ?? [];
216
+ const ownDefinesIt = ownMethods.some((mid) => {
217
+ const mn = graph.getNode(mid);
218
+ return mn?.properties.name === methodName;
219
+ });
220
+ if (ownDefinesIt)
221
+ continue;
222
+ let resolution;
223
+ switch (provider.mroStrategy) {
224
+ case 'leftmost-base':
225
+ resolution = resolveByMroOrder(methodName, defs, mroOrder, 'leftmost base');
226
+ break;
227
+ case 'implements-split':
228
+ resolution = resolveCsharpJava(methodName, defs, classEdgeTypes);
229
+ break;
230
+ case 'c3':
231
+ resolution = resolveByMroOrder(methodName, defs, mroOrder, 'C3 MRO');
232
+ break;
233
+ case 'qualified-syntax':
234
+ resolution = {
235
+ resolvedTo: null,
236
+ reason: `requires qualified syntax: <Type as Trait>::${methodName}()`,
237
+ confidence: 0.5,
238
+ };
239
+ break;
240
+ default:
241
+ resolution = resolveByMroOrder(methodName, defs, mroOrder, 'first definition');
242
+ break;
243
+ }
244
+ const ambiguity = {
245
+ methodName,
246
+ definedIn: defs,
247
+ resolvedTo: resolution.resolvedTo,
248
+ reason: resolution.reason,
249
+ };
250
+ ambiguities.push(ambiguity);
251
+ if (resolution.resolvedTo === null) {
252
+ ambiguityCount++;
253
+ }
254
+ // Emit METHOD_OVERRIDES edge if resolution found
255
+ if (resolution.resolvedTo !== null) {
256
+ graph.addRelationship({
257
+ id: (0, utils_js_1.generateId)('METHOD_OVERRIDES', `${classId}->${resolution.resolvedTo}`),
258
+ sourceId: classId,
259
+ targetId: resolution.resolvedTo,
260
+ type: 'METHOD_OVERRIDES',
261
+ confidence: resolution.confidence,
262
+ reason: resolution.reason,
263
+ });
264
+ overrideEdges++;
265
+ }
266
+ }
267
+ entries.push({
268
+ classId,
269
+ className,
270
+ language,
271
+ mro: mroNames,
272
+ ambiguities,
273
+ });
274
+ }
275
+ // ── Single-ancestor override detection ──────────────────────────────────
276
+ // The collision loop above only emits when a method is defined in 2+ ancestors
277
+ // (defs.length < 2 is skipped). A subclass overriding a single parent method via
278
+ // class inheritance is the common case. Applicability is derived automatically from
279
+ // the language's existing MRO strategy — no separate per-language flag: every
280
+ // strategy resolves overrides by inheritance order EXCEPT `qualified-syntax` (Rust),
281
+ // where a same-named method is a trait implementation (METHOD_IMPLEMENTS), not an
282
+ // override. The EXTENDS-only walk below reinforces this structurally.
283
+ const emittedOverrideEdgeIds = new Set();
284
+ // Follow only EXTENDS (class-inheritance) parents and skip Interface/Trait ancestors:
285
+ // satisfying an interface/trait default method is a METHOD_IMPLEMENTS relationship
286
+ // (handled by emitMethodImplementsEdges), not an override. This also structurally
287
+ // excludes languages without class inheritance (e.g. Rust traits use IMPLEMENTS).
288
+ const extendsParentsOf = (nodeId) => (parentMap.get(nodeId) ?? []).filter((pid) => {
289
+ if (parentEdgeType.get(nodeId)?.get(pid) !== 'EXTENDS')
290
+ return false;
291
+ const pn = graph.getNode(pid);
292
+ return !!pn && pn.label !== 'Interface' && pn.label !== 'Trait';
293
+ });
294
+ for (const classId of parentMap.keys()) {
295
+ const classNode = graph.getNode(classId);
296
+ const language = classNode?.properties.language;
297
+ if (!language)
298
+ continue;
299
+ // Language-aware gate, reusing the MRO model we already maintain (not a new flag).
300
+ if ((0, index_js_1.getProvider)(language).mroStrategy === 'qualified-syntax')
301
+ continue;
302
+ const ownMethods = methodMap.get(classId) ?? [];
303
+ const extendsParents = extendsParentsOf(classId);
304
+ if (extendsParents.length === 0 || ownMethods.length === 0)
305
+ continue;
306
+ const orderedAncestorMethods = [];
307
+ {
308
+ const visited = new Set();
309
+ const queue = [...extendsParents];
310
+ while (queue.length > 0) {
311
+ const ancestorId = queue.shift();
312
+ if (visited.has(ancestorId))
313
+ continue;
314
+ visited.add(ancestorId);
315
+ const ancestorName = graph.getNode(ancestorId)?.properties.name;
316
+ const methodsByName = new Map();
317
+ for (const mid of methodMap.get(ancestorId) ?? []) {
318
+ const mn = graph.getNode(mid);
319
+ if (!mn || mn.label === 'Property' || typeof mn.properties.name !== 'string')
320
+ continue;
321
+ const entry = {
322
+ methodId: mid,
323
+ paramTypes: mn.properties.parameterTypes ?? [],
324
+ paramCount: mn.properties.parameterCount,
325
+ };
326
+ const bucket = methodsByName.get(mn.properties.name);
327
+ if (bucket)
328
+ bucket.push(entry);
329
+ else
330
+ methodsByName.set(mn.properties.name, [entry]);
331
+ }
332
+ orderedAncestorMethods.push({
333
+ className: typeof ancestorName === 'string' ? ancestorName : '<anonymous>',
334
+ methodsByName,
335
+ });
336
+ queue.push(...extendsParentsOf(ancestorId));
337
+ }
338
+ }
339
+ for (const methodId of ownMethods) {
340
+ const methodNode = graph.getNode(methodId);
341
+ if (!methodNode || methodNode.label === 'Property' || !methodNode.properties.name)
342
+ continue;
343
+ const methodName = methodNode.properties.name;
344
+ const ownParamTypes = methodNode.properties.parameterTypes ?? [];
345
+ const ownParamCount = methodNode.properties.parameterCount;
346
+ // Nearest ancestor (BFS order) defining this method by name AND signature, so a
347
+ // same-named overload (e.g. foo(int) vs foo()) is not mistaken for an override.
348
+ for (const { className, methodsByName } of orderedAncestorMethods) {
349
+ const sameName = methodsByName.get(methodName);
350
+ if (!sameName)
351
+ continue;
352
+ const matches = sameName.filter((m) => parameterTypesMatch(ownParamTypes, m.paramTypes, ownParamCount, m.paramCount).match);
353
+ if (matches.length === 0)
354
+ continue; // name present but no signature match — look deeper
355
+ // Emit only when the match is unambiguous (exactly one candidate); >1 means the
356
+ // override target cannot be pinned, so emit nothing. Either way stop — a closer
357
+ // ancestor shadows anything deeper.
358
+ if (matches.length === 1) {
359
+ const matchingMethodId = matches[0].methodId;
360
+ // Target the ancestor METHOD node (not the class), key the id on the method
361
+ // so distinct overrides stay distinct, and count only edges actually added
362
+ // (addRelationship is first-writer-wins, so a duplicate id is dropped).
363
+ const overrideId = (0, utils_js_1.generateId)('METHOD_OVERRIDES', `${classId}->${matchingMethodId}`);
364
+ if (!emittedOverrideEdgeIds.has(overrideId)) {
365
+ emittedOverrideEdgeIds.add(overrideId);
366
+ graph.addRelationship({
367
+ id: overrideId,
368
+ sourceId: classId,
369
+ targetId: matchingMethodId,
370
+ type: 'METHOD_OVERRIDES',
371
+ confidence: SINGLE_ANCESTOR_OVERRIDE_CONFIDENCE,
372
+ reason: `single-ancestor override: ${className}::${methodName}()`,
373
+ });
374
+ overrideEdges++;
375
+ }
376
+ }
377
+ break; // nearest ancestor shadows deeper ones
378
+ }
379
+ }
380
+ }
381
+ const methodImplementsEdges = emitMethodImplementsEdges(graph, parentMap, methodMap, parentEdgeType, ancestorsMap, edgeTypesMap);
382
+ return { entries, overrideEdges, ambiguityCount, methodImplementsEdges };
383
+ }
384
+ // ---------------------------------------------------------------------------
385
+ // METHOD_IMPLEMENTS edge emission
386
+ // ---------------------------------------------------------------------------
387
+ /**
388
+ * Check if two parameter type arrays match.
389
+ * When either side has no type info, fall back to parameterCount comparison
390
+ * (arity-compatible matching). If both have parameterCount and they differ,
391
+ * return no match. If counts match, return confident match. If either count
392
+ * is undefined, return lenient (non-confident) match.
393
+ *
394
+ * Returns `{ match, confident }`:
395
+ * - Exact type match → `{ match: true, confident: true }`
396
+ * - Arity match (both have parameterCount, counts equal) → `{ match: true, confident: true }`
397
+ * - Lenient (either side lacks types AND lacks parameterCount) → `{ match: true, confident: false }`
398
+ * - No match → `{ match: false, confident: false }`
399
+ */
400
+ function parameterTypesMatch(a, b, aParamCount, bParamCount) {
401
+ // If one side is variadic and the other isn't, types may match superficially
402
+ // but the methods aren't guaranteed to be interchangeable
403
+ if ((aParamCount === undefined) !== (bParamCount === undefined)) {
404
+ return { match: true, confident: false };
405
+ }
406
+ if (a.length === 0 || b.length === 0) {
407
+ // Fall back to arity check when type info is missing
408
+ if (aParamCount !== undefined && bParamCount !== undefined) {
409
+ return { match: aParamCount === bParamCount, confident: aParamCount === bParamCount };
410
+ }
411
+ return { match: true, confident: false }; // lenient when either count is unknown
412
+ }
413
+ if (a.length !== b.length)
414
+ return { match: false, confident: false };
415
+ const exact = a.every((t, i) => t === b[i]);
416
+ return { match: exact, confident: exact };
417
+ }
418
+ /**
419
+ * For each concrete class that implements/extends an interface or trait,
420
+ * find methods in the class that implement methods defined in the interface
421
+ * and emit METHOD_IMPLEMENTS edges: ConcreteMethod → InterfaceMethod.
422
+ *
423
+ * Method node IDs include a `#<paramCount>` arity suffix, so overloaded
424
+ * methods with different parameter counts are distinct nodes in the graph.
425
+ * For same-arity overloads with different parameter types, a `~type1,type2`
426
+ * suffix is appended when type info is available (issue #651), producing
427
+ * distinct nodes that `parameterTypesMatch` can resolve to correct edges.
428
+ */
429
+ function emitMethodImplementsEdges(graph, parentMap, methodMap, parentEdgeType, ancestorsMap, edgeTypesMap) {
430
+ let edgeCount = 0;
431
+ for (const [classId, parentIds] of parentMap) {
432
+ const classNode = graph.getNode(classId);
433
+ if (!classNode)
434
+ continue;
435
+ // Interfaces and traits declare contracts — they don't implement them
436
+ if (classNode.label === 'Interface' || classNode.label === 'Trait')
437
+ continue;
438
+ // Get this class's own methods
439
+ const ownMethodIds = methodMap.get(classId) ?? [];
440
+ // Build a lookup: methodName → Array<{methodId, parameterTypes, parameterCount}> for own methods
441
+ const ownMethodsByName = new Map();
442
+ for (const methodId of ownMethodIds) {
443
+ const methodNode = graph.getNode(methodId);
444
+ if (!methodNode || methodNode.label === 'Property')
445
+ continue;
446
+ // Abstract methods don't satisfy interface contracts
447
+ if (methodNode.properties.isAbstract === true)
448
+ continue;
449
+ const name = methodNode.properties.name;
450
+ const parameterTypes = methodNode.properties.parameterTypes ?? [];
451
+ const parameterCount = methodNode.properties.parameterCount;
452
+ let bucket = ownMethodsByName.get(name);
453
+ if (!bucket) {
454
+ bucket = [];
455
+ ownMethodsByName.set(name, bucket);
456
+ }
457
+ bucket.push({ methodId, parameterTypes, parameterCount });
458
+ }
459
+ // Use pre-computed ancestors and edge types; fall back to computing if missing (safety)
460
+ const allAncestors = ancestorsMap.get(classId) ?? (0, resolve_js_1.gatherAncestors)(classId, parentMap);
461
+ const ancestorEdgeTypes = edgeTypesMap.get(classId) ?? buildTransitiveEdgeTypes(classId, parentMap, parentEdgeType);
462
+ // Dedup set: avoid duplicate edges from diamond paths
463
+ const emitted = new Set();
464
+ // For each ancestor, check if it's an interface/trait or classified as IMPLEMENTS
465
+ for (const ancestorId of allAncestors) {
466
+ const ancestorNode = graph.getNode(ancestorId);
467
+ if (!ancestorNode)
468
+ continue;
469
+ const isInterfaceLike = ancestorNode.label === 'Interface' || ancestorNode.label === 'Trait';
470
+ const classifiedEdgeType = ancestorEdgeTypes.get(ancestorId);
471
+ if (!isInterfaceLike && classifiedEdgeType !== 'IMPLEMENTS')
472
+ continue;
473
+ // Get ancestor's methods
474
+ const ancestorMethodIds = methodMap.get(ancestorId) ?? [];
475
+ for (const ancestorMethodId of ancestorMethodIds) {
476
+ const ancestorMethodNode = graph.getNode(ancestorMethodId);
477
+ if (!ancestorMethodNode || ancestorMethodNode.label === 'Property')
478
+ continue;
479
+ const ancestorName = ancestorMethodNode.properties.name;
480
+ const ancestorParamTypes = ancestorMethodNode.properties.parameterTypes ?? [];
481
+ const ancestorParamCount = ancestorMethodNode.properties.parameterCount;
482
+ // Find matching method in own class by name + parameterTypes/arity
483
+ const candidates = ownMethodsByName.get(ancestorName);
484
+ // Unit 3: If no own method matches, walk the EXTENDS chain to find inherited concrete method
485
+ if (!candidates || candidates.length === 0) {
486
+ const inherited = findInheritedMethod(classId, ancestorName, ancestorParamTypes, ancestorParamCount, graph, parentMap, methodMap, parentEdgeType, ancestorMethodId);
487
+ if (inherited) {
488
+ const edgeKey = `${inherited.methodId}->${ancestorMethodId}`;
489
+ if (!emitted.has(edgeKey)) {
490
+ emitted.add(edgeKey);
491
+ graph.addRelationship({
492
+ id: (0, utils_js_1.generateId)('METHOD_IMPLEMENTS', edgeKey),
493
+ sourceId: inherited.methodId,
494
+ targetId: ancestorMethodId,
495
+ type: 'METHOD_IMPLEMENTS',
496
+ confidence: inherited.confident ? 1.0 : 0.7,
497
+ reason: '',
498
+ });
499
+ edgeCount++;
500
+ }
501
+ }
502
+ continue;
503
+ }
504
+ // Unit 4: Filter candidates by type/arity match, then check for ambiguity
505
+ const matching = [];
506
+ for (const c of candidates) {
507
+ const result = parameterTypesMatch(c.parameterTypes, ancestorParamTypes, c.parameterCount, ancestorParamCount);
508
+ if (result.match) {
509
+ matching.push({ ...c, confident: result.confident });
510
+ }
511
+ }
512
+ if (matching.length === 0)
513
+ continue;
514
+ // If multiple candidates match at name+arity level, emit no edge (ambiguous)
515
+ if (matching.length > 1)
516
+ continue;
517
+ const winner = matching[0];
518
+ const edgeKey = `${winner.methodId}->${ancestorMethodId}`;
519
+ if (emitted.has(edgeKey))
520
+ continue;
521
+ emitted.add(edgeKey);
522
+ graph.addRelationship({
523
+ id: (0, utils_js_1.generateId)('METHOD_IMPLEMENTS', edgeKey),
524
+ sourceId: winner.methodId,
525
+ targetId: ancestorMethodId,
526
+ type: 'METHOD_IMPLEMENTS',
527
+ confidence: winner.confident ? 1.0 : 0.7,
528
+ reason: '',
529
+ });
530
+ edgeCount++;
531
+ }
532
+ }
533
+ }
534
+ return edgeCount;
535
+ }
536
+ /**
537
+ * Walk the class's EXTENDS chain to find the nearest concrete method matching
538
+ * the given name and parameter signature. If the EXTENDS chain yields no match,
539
+ * fall back to IMPLEMENTS parents and check for non-abstract default methods
540
+ * (e.g. Java default interface methods, Kotlin interface defaults).
541
+ * Returns the first matching method found in BFS order, or null.
542
+ */
543
+ function findInheritedMethod(classId, methodName, targetParamTypes, targetParamCount, graph, parentMap, methodMap, parentEdgeType,
544
+ /** Method ID to exclude from results (prevents self-edges when the ancestor
545
+ * method being matched lives on an IMPLEMENTS parent). */
546
+ excludeMethodId) {
547
+ const visited = new Set();
548
+ const queue = [];
549
+ // Seed with direct EXTENDS parents only
550
+ const directParents = parentMap.get(classId) ?? [];
551
+ const directEdges = parentEdgeType.get(classId);
552
+ for (const pid of directParents) {
553
+ const et = directEdges?.get(pid);
554
+ if (et === 'EXTENDS') {
555
+ // Also check that the parent is not an Interface/Trait
556
+ const parentNode = graph.getNode(pid);
557
+ if (parentNode && parentNode.label !== 'Interface' && parentNode.label !== 'Trait') {
558
+ queue.push(pid);
559
+ }
560
+ }
561
+ }
562
+ // Level-order BFS: process all ancestors at the current depth before
563
+ // advancing. Once any match is found at depth D, finish that depth and stop.
564
+ // Diamond dedup: same methodId via two paths at the same depth = 1 match.
565
+ let currentLevel = [...queue];
566
+ while (currentLevel.length > 0) {
567
+ const matches = new Map();
568
+ const nextLevel = [];
569
+ for (const ancestorId of currentLevel) {
570
+ if (visited.has(ancestorId))
571
+ continue;
572
+ visited.add(ancestorId);
573
+ // Check this ancestor's methods
574
+ const methods = methodMap.get(ancestorId) ?? [];
575
+ for (const mid of methods) {
576
+ const mNode = graph.getNode(mid);
577
+ if (!mNode || mNode.label === 'Property')
578
+ continue;
579
+ // Abstract inherited methods don't count as concrete implementations
580
+ if (mNode.properties.isAbstract === true)
581
+ continue;
582
+ if (mNode.properties.name !== methodName)
583
+ continue;
584
+ const mParamTypes = mNode.properties.parameterTypes ?? [];
585
+ const mParamCount = mNode.properties.parameterCount;
586
+ const ptResult = parameterTypesMatch(mParamTypes, targetParamTypes, mParamCount, targetParamCount);
587
+ if (ptResult.match) {
588
+ matches.set(mid, {
589
+ methodId: mid,
590
+ parameterTypes: mParamTypes,
591
+ confident: ptResult.confident,
592
+ });
593
+ }
594
+ }
595
+ // Collect EXTENDS parents for the next depth level
596
+ const grandparents = parentMap.get(ancestorId) ?? [];
597
+ const ancestorEdges = parentEdgeType.get(ancestorId);
598
+ for (const gp of grandparents) {
599
+ if (visited.has(gp))
600
+ continue;
601
+ const gpEdge = ancestorEdges?.get(gp);
602
+ if (gpEdge === 'EXTENDS') {
603
+ const gpNode = graph.getNode(gp);
604
+ if (gpNode && gpNode.label !== 'Interface' && gpNode.label !== 'Trait') {
605
+ nextLevel.push(gp);
606
+ }
607
+ }
608
+ }
609
+ }
610
+ // If any matches found at this depth, decide and stop
611
+ if (matches.size === 1)
612
+ return matches.values().next().value;
613
+ if (matches.size > 1)
614
+ return null; // ambiguous at same depth
615
+ currentLevel = nextLevel;
616
+ }
617
+ // ── Second pass: walk IMPLEMENTS parents AND their interface ancestry ──
618
+ // Only reached when the EXTENDS chain yielded no match.
619
+ // BFS through interface/trait hierarchy to find default (non-abstract) methods.
620
+ const implBfsQueue = [];
621
+ for (const pid of directParents) {
622
+ const et = directEdges?.get(pid);
623
+ if (et === 'IMPLEMENTS') {
624
+ implBfsQueue.push(pid);
625
+ }
626
+ }
627
+ // Collect all matches from the IMPLEMENTS BFS — return null if ambiguous (>1 match)
628
+ const implMatches = [];
629
+ const implVisited = new Set();
630
+ while (implBfsQueue.length > 0) {
631
+ const ifaceId = implBfsQueue.shift();
632
+ if (implVisited.has(ifaceId))
633
+ continue;
634
+ implVisited.add(ifaceId);
635
+ // Only process Interface/Trait nodes — Dart `implements Class` does not
636
+ // inherit method bodies, so Class/Struct/Enum parents must be skipped.
637
+ const ifaceNode = graph.getNode(ifaceId);
638
+ if (!ifaceNode || (ifaceNode.label !== 'Interface' && ifaceNode.label !== 'Trait'))
639
+ continue;
640
+ // Check this interface/trait's methods for a non-abstract default
641
+ const methods = methodMap.get(ifaceId) ?? [];
642
+ for (const mid of methods) {
643
+ if (mid === excludeMethodId)
644
+ continue; // prevent self-edges
645
+ const mNode = graph.getNode(mid);
646
+ if (!mNode || mNode.label === 'Property')
647
+ continue;
648
+ if (mNode.properties.isAbstract === true)
649
+ continue;
650
+ if (mNode.properties.name !== methodName)
651
+ continue;
652
+ const mParamTypes = mNode.properties.parameterTypes ?? [];
653
+ const mParamCount = mNode.properties.parameterCount;
654
+ const ptResult = parameterTypesMatch(mParamTypes, targetParamTypes, mParamCount, targetParamCount);
655
+ if (ptResult.match) {
656
+ implMatches.push({
657
+ methodId: mid,
658
+ parameterTypes: mParamTypes,
659
+ confident: ptResult.confident,
660
+ });
661
+ }
662
+ }
663
+ // Walk this interface's parents (interface-extends-interface chains)
664
+ const ifaceParents = parentMap.get(ifaceId) ?? [];
665
+ for (const gp of ifaceParents) {
666
+ if (!implVisited.has(gp))
667
+ implBfsQueue.push(gp);
668
+ }
669
+ }
670
+ // Ambiguous: multiple interfaces provide the same default method
671
+ if (implMatches.length === 1)
672
+ return implMatches[0];
673
+ return null; // 0 matches or ambiguous (>1)
674
+ }
675
+ /**
676
+ * Build transitive edge types for a class using BFS from the class to all ancestors.
677
+ *
678
+ * Known limitation: BFS first-reach heuristic can misclassify an interface as
679
+ * EXTENDS if it's reachable via a class chain before being seen via IMPLEMENTS.
680
+ * E.g. if BaseClass also implements IFoo, IFoo may be classified as EXTENDS.
681
+ * This affects C#/Java/Kotlin conflict resolution in rare diamond hierarchies.
682
+ */
683
+ function buildTransitiveEdgeTypes(classId, parentMap, parentEdgeType) {
684
+ const result = new Map();
685
+ const directEdges = parentEdgeType.get(classId);
686
+ if (!directEdges)
687
+ return result;
688
+ // BFS: propagate edge type from direct parents
689
+ const queue = [];
690
+ const directParents = parentMap.get(classId) ?? [];
691
+ for (const pid of directParents) {
692
+ const et = directEdges.get(pid) ?? 'EXTENDS';
693
+ if (!result.has(pid)) {
694
+ result.set(pid, et);
695
+ queue.push({ id: pid, edgeType: et });
696
+ }
697
+ }
698
+ while (queue.length > 0) {
699
+ const { id, edgeType } = queue.shift();
700
+ const grandparents = parentMap.get(id) ?? [];
701
+ for (const gp of grandparents) {
702
+ if (!result.has(gp)) {
703
+ result.set(gp, edgeType);
704
+ queue.push({ id: gp, edgeType });
705
+ }
706
+ }
707
+ }
708
+ return result;
709
+ }