gitnexus 1.6.10-rc.98 → 1.6.10

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 (777) hide show
  1. package/README.md +177 -18
  2. package/dist/_shared/graph/types.d.ts +21 -2
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/index.d.ts +3 -3
  5. package/dist/_shared/index.d.ts.map +1 -1
  6. package/dist/_shared/index.js +1 -1
  7. package/dist/_shared/index.js.map +1 -1
  8. package/dist/_shared/integrations/circuit-breaker.d.ts.map +1 -1
  9. package/dist/_shared/integrations/circuit-breaker.js.map +1 -1
  10. package/dist/_shared/integrations/resilient-fetch.d.ts +16 -0
  11. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  12. package/dist/_shared/integrations/resilient-fetch.js +19 -7
  13. package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
  14. package/dist/_shared/language-detection.d.ts.map +1 -1
  15. package/dist/_shared/lbug/schema-constants.d.ts +2 -2
  16. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  17. package/dist/_shared/lbug/schema-constants.js +3 -0
  18. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  19. package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
  20. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +5 -0
  21. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
  22. package/dist/_shared/scope-resolution/finalize-algorithm.js +315 -36
  23. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  24. package/dist/_shared/scope-resolution/reference-site.d.ts +115 -0
  25. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  26. package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
  27. package/dist/_shared/scope-resolution/registries/lookup-core.d.ts.map +1 -1
  28. package/dist/_shared/scope-resolution/registries/lookup-core.js +58 -2
  29. package/dist/_shared/scope-resolution/registries/lookup-core.js.map +1 -1
  30. package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
  31. package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
  32. package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
  33. package/dist/_shared/scope-resolution/symbol-definition.d.ts +47 -0
  34. package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
  35. package/dist/_shared/scope-resolution/types.d.ts +278 -3
  36. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  37. package/dist/cli/ai-context.d.ts +3 -2
  38. package/dist/cli/ai-context.js +71 -16
  39. package/dist/cli/analyze-config.d.ts +1 -1
  40. package/dist/cli/analyze-options.d.ts +131 -0
  41. package/dist/cli/analyze-options.js +1 -0
  42. package/dist/cli/analyze.d.ts +21 -113
  43. package/dist/cli/analyze.js +172 -29
  44. package/dist/cli/cli-message.d.ts +1 -1
  45. package/dist/cli/detect-changes-format.js +19 -2
  46. package/dist/cli/doctor.d.ts +12 -0
  47. package/dist/cli/doctor.js +32 -5
  48. package/dist/cli/editor-targets.js +6 -0
  49. package/dist/cli/eval-server.js +2 -1
  50. package/dist/cli/format-symbol.d.ts +15 -0
  51. package/dist/cli/format-symbol.js +17 -0
  52. package/dist/cli/generated-skill.d.ts +17 -0
  53. package/dist/cli/generated-skill.js +1 -0
  54. package/dist/cli/group.js +229 -21
  55. package/dist/cli/help-i18n.js +1 -2
  56. package/dist/cli/i18n/en.d.ts +11 -9
  57. package/dist/cli/i18n/en.js +13 -9
  58. package/dist/cli/i18n/resources.d.ts +15 -11
  59. package/dist/cli/i18n/zh-CN.d.ts +4 -2
  60. package/dist/cli/i18n/zh-CN.js +11 -9
  61. package/dist/cli/index.js +8 -4
  62. package/dist/cli/resolve-invocation.d.ts +7 -3
  63. package/dist/cli/resolve-invocation.js +7 -3
  64. package/dist/cli/setup.js +4 -3
  65. package/dist/cli/skill-gen.d.ts +1 -6
  66. package/dist/cli/tool.d.ts +1 -0
  67. package/dist/cli/tool.js +74 -17
  68. package/dist/cli/wiki.js +53 -10
  69. package/dist/config/ignore-service.d.ts +2 -0
  70. package/dist/config/ignore-service.js +54 -13
  71. package/dist/core/analyzer-identity.d.ts +80 -0
  72. package/dist/core/analyzer-identity.js +364 -26
  73. package/dist/core/augmentation/engine.js +86 -71
  74. package/dist/core/embedding-checkpoint.d.ts +143 -0
  75. package/dist/core/embedding-checkpoint.js +221 -0
  76. package/dist/core/embedding-count.d.ts +61 -0
  77. package/dist/core/embedding-count.js +69 -0
  78. package/dist/core/embeddings/ast-utils.js +9 -1
  79. package/dist/core/embeddings/embedding-pipeline.d.ts +8 -0
  80. package/dist/core/embeddings/embedding-pipeline.js +253 -14
  81. package/dist/core/embeddings/http-client.d.ts +5 -0
  82. package/dist/core/embeddings/http-client.js +142 -27
  83. package/dist/core/graph/graph.js +3 -0
  84. package/dist/core/graph/import-cycles.d.ts +194 -3
  85. package/dist/core/graph/import-cycles.js +522 -73
  86. package/dist/core/graph/types.d.ts +18 -0
  87. package/dist/core/group/bridge-db.d.ts +204 -1
  88. package/dist/core/group/bridge-db.js +401 -28
  89. package/dist/core/group/completeness.d.ts +130 -0
  90. package/dist/core/group/completeness.js +83 -0
  91. package/dist/core/group/config-parser.js +0 -5
  92. package/dist/core/group/cross-impact.d.ts +46 -1
  93. package/dist/core/group/cross-impact.js +220 -19
  94. package/dist/core/group/cross-trace.d.ts +32 -11
  95. package/dist/core/group/cross-trace.js +114 -20
  96. package/dist/core/group/extractors/http-patterns/java.js +278 -22
  97. package/dist/core/group/extractors/http-patterns/node.js +332 -216
  98. package/dist/core/group/extractors/http-patterns/types.d.ts +8 -0
  99. package/dist/core/group/extractors/http-route-extractor.d.ts +1 -0
  100. package/dist/core/group/extractors/http-route-extractor.js +122 -48
  101. package/dist/core/group/extractors/include-extractor.js +20 -2
  102. package/dist/core/group/extractors/manifest-extractor.d.ts +1 -1
  103. package/dist/core/group/extractors/manifest-extractor.js +7 -7
  104. package/dist/core/group/extractors/python-workspace-extractor.js +5 -2
  105. package/dist/core/group/group-lock.d.ts +31 -0
  106. package/dist/core/group/group-lock.js +166 -0
  107. package/dist/core/group/service.js +297 -16
  108. package/dist/core/group/storage.d.ts +3 -0
  109. package/dist/core/group/storage.js +7 -39
  110. package/dist/core/group/sync.d.ts +49 -3
  111. package/dist/core/group/sync.js +0 -0
  112. package/dist/core/group/types.d.ts +183 -8
  113. package/dist/core/group/types.js +28 -1
  114. package/dist/core/incremental/subgraph-extract.d.ts +9 -6
  115. package/dist/core/incremental/subgraph-extract.js +33 -10
  116. package/dist/core/index-freshness.d.ts +77 -2
  117. package/dist/core/index-freshness.js +109 -2
  118. package/dist/core/ingestion/call-processor.d.ts +13 -1
  119. package/dist/core/ingestion/call-processor.js +110 -3
  120. package/dist/core/ingestion/cfg/callee-cell-format.d.ts +42 -0
  121. package/dist/core/ingestion/cfg/callee-cell-format.js +42 -0
  122. package/dist/core/ingestion/cfg/emit.d.ts +8 -23
  123. package/dist/core/ingestion/cfg/emit.js +9 -23
  124. package/dist/core/ingestion/class-extractors/configs/go.js +10 -5
  125. package/dist/core/ingestion/class-extractors/configs/jvm.js +6 -6
  126. package/dist/core/ingestion/cluster-enricher.js +8 -4
  127. package/dist/core/ingestion/community-processor.d.ts +21 -3
  128. package/dist/core/ingestion/community-processor.js +81 -82
  129. package/dist/core/ingestion/di-extractors/index.d.ts +9 -33
  130. package/dist/core/ingestion/di-extractors/spring.d.ts +1 -1
  131. package/dist/core/ingestion/di-extractors/spring.js +8 -1
  132. package/dist/core/ingestion/di-extractors/types.d.ts +60 -0
  133. package/dist/core/ingestion/di-extractors/types.js +15 -0
  134. package/dist/core/ingestion/filesystem-walker.js +30 -14
  135. package/dist/core/ingestion/finalize-orchestrator.js +1 -0
  136. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +6 -0
  137. package/dist/core/ingestion/frameworks/spring/analysis-features.js +35 -1
  138. package/dist/core/ingestion/frameworks/spring/annotation-arguments.d.ts +13 -0
  139. package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +227 -0
  140. package/dist/core/ingestion/frameworks/spring/aop-candidates.d.ts +15 -0
  141. package/dist/core/ingestion/frameworks/spring/aop-candidates.js +85 -0
  142. package/dist/core/ingestion/frameworks/spring/aop.d.ts +118 -0
  143. package/dist/core/ingestion/frameworks/spring/aop.js +476 -0
  144. package/dist/core/ingestion/frameworks/spring/auto-configuration.d.ts +8 -0
  145. package/dist/core/ingestion/frameworks/spring/auto-configuration.js +16 -0
  146. package/dist/core/ingestion/frameworks/spring/bean-catalog.js +1 -0
  147. package/dist/core/ingestion/frameworks/spring/bean-factories.d.ts +33 -0
  148. package/dist/core/ingestion/frameworks/spring/bean-factories.js +65 -0
  149. package/dist/core/ingestion/frameworks/spring/conditionals.d.ts +25 -0
  150. package/dist/core/ingestion/frameworks/spring/conditionals.js +319 -0
  151. package/dist/core/ingestion/frameworks/spring/di-metadata.d.ts +3 -0
  152. package/dist/core/ingestion/frameworks/spring/di-metadata.js +162 -13
  153. package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +28 -0
  154. package/dist/core/ingestion/frameworks/spring/non-http-handlers.js +152 -0
  155. package/dist/core/ingestion/frameworks/spring/resource-injection.d.ts +5 -0
  156. package/dist/core/ingestion/frameworks/spring/resource-injection.js +91 -0
  157. package/dist/core/ingestion/import-resolvers/configs/csharp.js +5 -1
  158. package/dist/core/ingestion/import-resolvers/configs/swift.js +13 -0
  159. package/dist/core/ingestion/import-resolvers/csharp.d.ts +9 -1
  160. package/dist/core/ingestion/import-resolvers/csharp.js +234 -27
  161. package/dist/core/ingestion/import-resolvers/go.d.ts +11 -1
  162. package/dist/core/ingestion/import-resolvers/go.js +44 -17
  163. package/dist/core/ingestion/import-resolvers/jvm.d.ts +2 -2
  164. package/dist/core/ingestion/import-resolvers/node-workspace-packages.d.ts +90 -0
  165. package/dist/core/ingestion/import-resolvers/node-workspace-packages.js +429 -0
  166. package/dist/core/ingestion/import-resolvers/package-dir-index.d.ts +124 -0
  167. package/dist/core/ingestion/import-resolvers/package-dir-index.js +223 -0
  168. package/dist/core/ingestion/import-resolvers/pass-cache.d.ts +50 -0
  169. package/dist/core/ingestion/import-resolvers/pass-cache.js +60 -0
  170. package/dist/core/ingestion/import-resolvers/per-file-set.d.ts +71 -0
  171. package/dist/core/ingestion/import-resolvers/per-file-set.js +11 -0
  172. package/dist/core/ingestion/import-resolvers/php.d.ts +1 -1
  173. package/dist/core/ingestion/import-resolvers/php.js +65 -19
  174. package/dist/core/ingestion/import-resolvers/python-file-index.d.ts +201 -0
  175. package/dist/core/ingestion/import-resolvers/python-file-index.js +302 -0
  176. package/dist/core/ingestion/import-resolvers/python.js +25 -6
  177. package/dist/core/ingestion/import-resolvers/ruby.d.ts +1 -1
  178. package/dist/core/ingestion/import-resolvers/rust.d.ts +2 -2
  179. package/dist/core/ingestion/import-resolvers/standard.d.ts +1 -1
  180. package/dist/core/ingestion/import-resolvers/types.d.ts +1 -12
  181. package/dist/core/ingestion/import-resolvers/utils.d.ts +65 -6
  182. package/dist/core/ingestion/import-resolvers/utils.js +215 -36
  183. package/dist/core/ingestion/import-resolvers/workspace-file-index.d.ts +72 -0
  184. package/dist/core/ingestion/import-resolvers/workspace-file-index.js +58 -0
  185. package/dist/core/ingestion/language-config.d.ts +29 -1
  186. package/dist/core/ingestion/language-config.js +110 -35
  187. package/dist/core/ingestion/language-provider.d.ts +209 -7
  188. package/dist/core/ingestion/language-provider.js +37 -0
  189. package/dist/core/ingestion/languages/c/captures.js +7 -0
  190. package/dist/core/ingestion/languages/c/import-target.js +12 -16
  191. package/dist/core/ingestion/languages/c/scope-resolver.js +20 -19
  192. package/dist/core/ingestion/languages/c/static-linkage.js +12 -16
  193. package/dist/core/ingestion/languages/c-cpp.js +13 -0
  194. package/dist/core/ingestion/languages/cobol/scope-resolver.js +27 -20
  195. package/dist/core/ingestion/languages/cobol.js +13 -0
  196. package/dist/core/ingestion/languages/cpp/adl.d.ts +2 -2
  197. package/dist/core/ingestion/languages/cpp/adl.js +67 -44
  198. package/dist/core/ingestion/languages/cpp/captures.js +14 -2
  199. package/dist/core/ingestion/languages/cpp/file-local-linkage.js +11 -15
  200. package/dist/core/ingestion/languages/cpp/inline-namespaces.d.ts +28 -8
  201. package/dist/core/ingestion/languages/cpp/inline-namespaces.js +242 -68
  202. package/dist/core/ingestion/languages/cpp/interpret.d.ts +2 -0
  203. package/dist/core/ingestion/languages/cpp/interpret.js +126 -6
  204. package/dist/core/ingestion/languages/cpp/query.js +106 -0
  205. package/dist/core/ingestion/languages/cpp/scope-resolver.js +48 -20
  206. package/dist/core/ingestion/languages/csharp/accessor-unwrap.d.ts +2 -15
  207. package/dist/core/ingestion/languages/csharp/accessor-unwrap.js +18 -10
  208. package/dist/core/ingestion/languages/csharp/captures.js +19 -0
  209. package/dist/core/ingestion/languages/csharp/import-target.js +46 -72
  210. package/dist/core/ingestion/languages/csharp/namespace-siblings.js +5 -1
  211. package/dist/core/ingestion/languages/csharp/query.js +25 -5
  212. package/dist/core/ingestion/languages/csharp/scope-resolver.js +75 -2
  213. package/dist/core/ingestion/languages/dart/captures.d.ts +10 -0
  214. package/dist/core/ingestion/languages/dart/captures.js +598 -16
  215. package/dist/core/ingestion/languages/dart/import-target.js +32 -9
  216. package/dist/core/ingestion/languages/dart/index.d.ts +1 -1
  217. package/dist/core/ingestion/languages/dart/index.js +1 -1
  218. package/dist/core/ingestion/languages/dart/query.js +98 -1
  219. package/dist/core/ingestion/languages/dart/scope-resolver.js +14 -3
  220. package/dist/core/ingestion/languages/dart/simple-hooks.js +9 -0
  221. package/dist/core/ingestion/languages/dart.js +6 -1
  222. package/dist/core/ingestion/languages/go/captures.js +108 -3
  223. package/dist/core/ingestion/languages/go/generic-type-parameters.d.ts +31 -0
  224. package/dist/core/ingestion/languages/go/generic-type-parameters.js +140 -0
  225. package/dist/core/ingestion/languages/go/import-target.d.ts +3 -10
  226. package/dist/core/ingestion/languages/go/import-target.js +34 -30
  227. package/dist/core/ingestion/languages/go/index.d.ts +1 -1
  228. package/dist/core/ingestion/languages/go/interface-impls.d.ts +9 -1
  229. package/dist/core/ingestion/languages/go/interface-impls.js +693 -87
  230. package/dist/core/ingestion/languages/go/interpret.d.ts +2 -0
  231. package/dist/core/ingestion/languages/go/interpret.js +22 -8
  232. package/dist/core/ingestion/languages/go/method-owners.js +31 -12
  233. package/dist/core/ingestion/languages/go/package-clause.d.ts +46 -0
  234. package/dist/core/ingestion/languages/go/package-clause.js +75 -0
  235. package/dist/core/ingestion/languages/go/package-siblings.js +7 -11
  236. package/dist/core/ingestion/languages/go/query.js +56 -3
  237. package/dist/core/ingestion/languages/go/scope-resolver.js +39 -0
  238. package/dist/core/ingestion/languages/go.js +9 -0
  239. package/dist/core/ingestion/languages/java/analysis-features.d.ts +4 -0
  240. package/dist/core/ingestion/languages/java/analysis-features.js +12 -0
  241. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +12 -0
  242. package/dist/core/ingestion/languages/java/capture-side-channel.js +48 -0
  243. package/dist/core/ingestion/languages/java/captures.js +129 -44
  244. package/dist/core/ingestion/languages/java/import-target.d.ts +49 -9
  245. package/dist/core/ingestion/languages/java/import-target.js +68 -88
  246. package/dist/core/ingestion/languages/java/interpret.js +3 -2
  247. package/dist/core/ingestion/languages/java/module-resolution.d.ts +62 -0
  248. package/dist/core/ingestion/languages/java/module-resolution.js +142 -0
  249. package/dist/core/ingestion/languages/java/query.js +16 -3
  250. package/dist/core/ingestion/languages/java/record-components.d.ts +14 -0
  251. package/dist/core/ingestion/languages/java/record-components.js +185 -0
  252. package/dist/core/ingestion/languages/java/scope-resolver.js +10 -2
  253. package/dist/core/ingestion/languages/java/spring-aop.d.ts +12 -0
  254. package/dist/core/ingestion/languages/java/spring-aop.js +49 -0
  255. package/dist/core/ingestion/languages/java/spring-conditionals.d.ts +11 -0
  256. package/dist/core/ingestion/languages/java/spring-conditionals.js +48 -0
  257. package/dist/core/ingestion/languages/java/spring-di.d.ts +4 -1
  258. package/dist/core/ingestion/languages/java/spring-di.js +41 -9
  259. package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +7 -0
  260. package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +32 -0
  261. package/dist/core/ingestion/languages/java.js +94 -3
  262. package/dist/core/ingestion/languages/javascript/captures.d.ts +6 -1
  263. package/dist/core/ingestion/languages/javascript/captures.js +262 -4
  264. package/dist/core/ingestion/languages/javascript/import-target.d.ts +17 -21
  265. package/dist/core/ingestion/languages/javascript/import-target.js +24 -41
  266. package/dist/core/ingestion/languages/javascript/index.d.ts +54 -5
  267. package/dist/core/ingestion/languages/javascript/index.js +54 -5
  268. package/dist/core/ingestion/languages/javascript/query.d.ts +1 -0
  269. package/dist/core/ingestion/languages/javascript/query.js +211 -5
  270. package/dist/core/ingestion/languages/javascript/scope-resolver.js +12 -0
  271. package/dist/core/ingestion/languages/javascript/simple-hooks.js +2 -1
  272. package/dist/core/ingestion/languages/jvm/package-siblings.js +77 -9
  273. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
  274. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +48 -0
  275. package/dist/core/ingestion/languages/kotlin/captures.js +43 -1
  276. package/dist/core/ingestion/languages/kotlin/import-target.d.ts +8 -1
  277. package/dist/core/ingestion/languages/kotlin/import-target.js +20 -123
  278. package/dist/core/ingestion/languages/kotlin/index.d.ts +1 -0
  279. package/dist/core/ingestion/languages/kotlin/index.js +1 -0
  280. package/dist/core/ingestion/languages/kotlin/module-resolution.d.ts +22 -0
  281. package/dist/core/ingestion/languages/kotlin/module-resolution.js +108 -0
  282. package/dist/core/ingestion/languages/kotlin/query.js +28 -2
  283. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +23 -2
  284. package/dist/core/ingestion/languages/kotlin/spring-aop.d.ts +12 -0
  285. package/dist/core/ingestion/languages/kotlin/spring-aop.js +64 -0
  286. package/dist/core/ingestion/languages/kotlin/spring-conditionals.d.ts +12 -0
  287. package/dist/core/ingestion/languages/kotlin/spring-conditionals.js +49 -0
  288. package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +2 -0
  289. package/dist/core/ingestion/languages/kotlin/spring-di.js +60 -11
  290. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +10 -0
  291. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +41 -0
  292. package/dist/core/ingestion/languages/php/captures.d.ts +5 -0
  293. package/dist/core/ingestion/languages/php/captures.js +319 -51
  294. package/dist/core/ingestion/languages/php/import-target.d.ts +3 -4
  295. package/dist/core/ingestion/languages/php/import-target.js +192 -62
  296. package/dist/core/ingestion/languages/php/query.js +31 -0
  297. package/dist/core/ingestion/languages/python/arity-metadata.d.ts +1 -0
  298. package/dist/core/ingestion/languages/python/arity-metadata.js +1 -0
  299. package/dist/core/ingestion/languages/python/captures.js +29 -0
  300. package/dist/core/ingestion/languages/python/import-decomposer.js +22 -1
  301. package/dist/core/ingestion/languages/python/import-target.d.ts +42 -1
  302. package/dist/core/ingestion/languages/python/import-target.js +277 -91
  303. package/dist/core/ingestion/languages/python/index.d.ts +1 -1
  304. package/dist/core/ingestion/languages/python/index.js +1 -1
  305. package/dist/core/ingestion/languages/python/interpret.d.ts +52 -0
  306. package/dist/core/ingestion/languages/python/interpret.js +249 -7
  307. package/dist/core/ingestion/languages/python/query.js +9 -0
  308. package/dist/core/ingestion/languages/python/receiver-binding.d.ts +8 -6
  309. package/dist/core/ingestion/languages/python/receiver-binding.js +108 -12
  310. package/dist/core/ingestion/languages/python/scope-resolver.js +27 -4
  311. package/dist/core/ingestion/languages/python/simple-hooks.js +2 -8
  312. package/dist/core/ingestion/languages/python.js +13 -0
  313. package/dist/core/ingestion/languages/ruby/captures.js +158 -0
  314. package/dist/core/ingestion/languages/ruby/import-target.js +7 -5
  315. package/dist/core/ingestion/languages/ruby/query.js +93 -0
  316. package/dist/core/ingestion/languages/ruby/scope-resolver.js +2 -0
  317. package/dist/core/ingestion/languages/ruby/simple-hooks.d.ts +1 -1
  318. package/dist/core/ingestion/languages/ruby/simple-hooks.js +22 -1
  319. package/dist/core/ingestion/languages/rust/captures.js +39 -1
  320. package/dist/core/ingestion/languages/rust/method-owners.js +11 -1
  321. package/dist/core/ingestion/languages/rust/module-path.d.ts +126 -0
  322. package/dist/core/ingestion/languages/rust/module-path.js +214 -0
  323. package/dist/core/ingestion/languages/rust/qualified-call.d.ts +41 -0
  324. package/dist/core/ingestion/languages/rust/qualified-call.js +481 -0
  325. package/dist/core/ingestion/languages/rust/query.js +39 -6
  326. package/dist/core/ingestion/languages/rust/scope-resolver.js +21 -2
  327. package/dist/core/ingestion/languages/rust.js +17 -0
  328. package/dist/core/ingestion/languages/swift/captures.js +87 -3
  329. package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.d.ts +48 -0
  330. package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.js +253 -0
  331. package/dist/core/ingestion/languages/swift/import-target.js +4 -9
  332. package/dist/core/ingestion/languages/swift/query.js +17 -0
  333. package/dist/core/ingestion/languages/swift/receiver-binding.d.ts +8 -0
  334. package/dist/core/ingestion/languages/swift/receiver-binding.js +6 -2
  335. package/dist/core/ingestion/languages/swift.js +2 -0
  336. package/dist/core/ingestion/languages/typescript/captures.d.ts +90 -1
  337. package/dist/core/ingestion/languages/typescript/captures.js +267 -5
  338. package/dist/core/ingestion/languages/typescript/cjs-export-assignment.d.ts +134 -0
  339. package/dist/core/ingestion/languages/typescript/cjs-export-assignment.js +523 -0
  340. package/dist/core/ingestion/languages/typescript/cjs-module-exports.d.ts +54 -0
  341. package/dist/core/ingestion/languages/typescript/cjs-module-exports.js +191 -0
  342. package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.d.ts +7 -0
  343. package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.js +92 -0
  344. package/dist/core/ingestion/languages/typescript/file-candidates.d.ts +29 -0
  345. package/dist/core/ingestion/languages/typescript/file-candidates.js +70 -0
  346. package/dist/core/ingestion/languages/typescript/import-decomposer.d.ts +28 -1
  347. package/dist/core/ingestion/languages/typescript/import-decomposer.js +125 -10
  348. package/dist/core/ingestion/languages/typescript/import-target.d.ts +25 -37
  349. package/dist/core/ingestion/languages/typescript/import-target.js +24 -26
  350. package/dist/core/ingestion/languages/typescript/interpret.d.ts +21 -1
  351. package/dist/core/ingestion/languages/typescript/interpret.js +45 -5
  352. package/dist/core/ingestion/languages/typescript/module-resolution.d.ts +48 -0
  353. package/dist/core/ingestion/languages/typescript/module-resolution.js +171 -0
  354. package/dist/core/ingestion/languages/typescript/query.d.ts +1 -0
  355. package/dist/core/ingestion/languages/typescript/query.js +303 -14
  356. package/dist/core/ingestion/languages/typescript/receiver-binding.d.ts +17 -0
  357. package/dist/core/ingestion/languages/typescript/receiver-binding.js +27 -0
  358. package/dist/core/ingestion/languages/typescript/scope-resolver.js +27 -40
  359. package/dist/core/ingestion/languages/typescript/simple-hooks.d.ts +0 -10
  360. package/dist/core/ingestion/languages/typescript/simple-hooks.js +22 -22
  361. package/dist/core/ingestion/languages/typescript/tsconfig.d.ts +59 -0
  362. package/dist/core/ingestion/languages/typescript/tsconfig.js +292 -0
  363. package/dist/core/ingestion/languages/typescript.js +93 -2
  364. package/dist/core/ingestion/languages/vue/import-target.d.ts +6 -22
  365. package/dist/core/ingestion/languages/vue/import-target.js +11 -47
  366. package/dist/core/ingestion/languages/vue/scope-resolver.js +4 -2
  367. package/dist/core/ingestion/local-symbol-pruner.js +11 -11
  368. package/dist/core/ingestion/method-extractors/configs/csharp.js +1 -0
  369. package/dist/core/ingestion/method-extractors/generic.js +1 -0
  370. package/dist/core/ingestion/method-types.d.ts +16 -0
  371. package/dist/core/ingestion/pipeline-phases/di.d.ts +1 -1
  372. package/dist/core/ingestion/pipeline-phases/di.js +136 -21
  373. package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
  374. package/dist/core/ingestion/pipeline-phases/index.js +2 -0
  375. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +15 -0
  376. package/dist/core/ingestion/pipeline-phases/parse-impl.js +154 -4
  377. package/dist/core/ingestion/pipeline-phases/parse.js +5 -0
  378. package/dist/core/ingestion/pipeline-phases/processes.d.ts +3 -2
  379. package/dist/core/ingestion/pipeline-phases/processes.js +91 -6
  380. package/dist/core/ingestion/pipeline-phases/routes.js +116 -25
  381. package/dist/core/ingestion/pipeline-phases/spring-aop.d.ts +34 -0
  382. package/dist/core/ingestion/pipeline-phases/spring-aop.js +439 -0
  383. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +34 -0
  384. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +255 -0
  385. package/dist/core/ingestion/pipeline-phases/types.d.ts +7 -0
  386. package/dist/core/ingestion/pipeline.d.ts +26 -2
  387. package/dist/core/ingestion/pipeline.js +60 -11
  388. package/dist/core/ingestion/process-processor.d.ts +109 -2
  389. package/dist/core/ingestion/process-processor.js +464 -52
  390. package/dist/core/ingestion/resolve-references.d.ts +6 -1
  391. package/dist/core/ingestion/resolve-references.js +66 -6
  392. package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +8 -2
  393. package/dist/core/ingestion/route-extractors/constant-resolver.js +11 -7
  394. package/dist/core/ingestion/route-extractors/data-route-table.d.ts +40 -0
  395. package/dist/core/ingestion/route-extractors/data-route-table.js +876 -0
  396. package/dist/core/ingestion/route-extractors/dispatch-guard.d.ts +96 -0
  397. package/dist/core/ingestion/route-extractors/dispatch-guard.js +1184 -0
  398. package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +114 -0
  399. package/dist/core/ingestion/route-extractors/java-const-resolver.js +569 -0
  400. package/dist/core/ingestion/route-extractors/js-const-resolver.d.ts +192 -0
  401. package/dist/core/ingestion/route-extractors/js-const-resolver.js +1033 -0
  402. package/dist/core/ingestion/route-extractors/nest.d.ts +53 -0
  403. package/dist/core/ingestion/route-extractors/nest.js +523 -0
  404. package/dist/core/ingestion/route-extractors/spring-shared.d.ts +11 -0
  405. package/dist/core/ingestion/route-extractors/spring-shared.js +89 -0
  406. package/dist/core/ingestion/route-extractors/spring.js +214 -29
  407. package/dist/core/ingestion/scope-extractor-bridge.js +9 -1
  408. package/dist/core/ingestion/scope-extractor.d.ts +22 -7
  409. package/dist/core/ingestion/scope-extractor.js +311 -16
  410. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +311 -21
  411. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +16 -5
  412. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +12 -0
  413. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +47 -0
  414. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +20 -15
  415. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +280 -42
  416. package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.d.ts +123 -0
  417. package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +171 -17
  418. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.d.ts +58 -1
  419. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +137 -34
  420. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +30 -1
  421. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +39 -1
  422. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +18 -1
  423. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +113 -18
  424. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +107 -5
  425. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +590 -33
  426. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +3 -0
  427. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +101 -41
  428. package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.d.ts +34 -0
  429. package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.js +62 -0
  430. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +5 -1
  431. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +8 -1
  432. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +105 -5
  433. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +931 -92
  434. package/dist/core/ingestion/scope-resolution/passes/return-shape-members.d.ts +58 -0
  435. package/dist/core/ingestion/scope-resolution/passes/return-shape-members.js +458 -0
  436. package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.d.ts +180 -0
  437. package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.js +418 -0
  438. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +29 -0
  439. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +57 -0
  440. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +55 -1
  441. package/dist/core/ingestion/scope-resolution/pipeline/run.js +241 -19
  442. package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +112 -2
  443. package/dist/core/ingestion/scope-resolution/resolution-outcome.js +38 -1
  444. package/dist/core/ingestion/scope-resolution/scope/namespace-targets.d.ts +25 -3
  445. package/dist/core/ingestion/scope-resolution/scope/namespace-targets.js +36 -16
  446. package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +210 -9
  447. package/dist/core/ingestion/scope-resolution/scope/walkers.js +905 -22
  448. package/dist/core/ingestion/scope-resolution/summary-maps.d.ts +28 -0
  449. package/dist/core/ingestion/scope-resolution/summary-maps.js +50 -0
  450. package/dist/core/ingestion/scope-resolution/undecided-satisfaction.d.ts +55 -0
  451. package/dist/core/ingestion/scope-resolution/undecided-satisfaction.js +37 -0
  452. package/dist/core/ingestion/scope-resolution/unresolved-receivers.d.ts +109 -0
  453. package/dist/core/ingestion/scope-resolution/unresolved-receivers.js +204 -0
  454. package/dist/core/ingestion/scope-resolution/utils/definition-id.d.ts +13 -0
  455. package/dist/core/ingestion/scope-resolution/utils/definition-id.js +19 -0
  456. package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.d.ts +171 -0
  457. package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.js +218 -0
  458. package/dist/core/ingestion/scope-resolution/workspace-index-types.d.ts +34 -0
  459. package/dist/core/ingestion/scope-resolution/workspace-index-types.js +15 -0
  460. package/dist/core/ingestion/scope-resolution/workspace-index.d.ts +7 -20
  461. package/dist/core/ingestion/tree-sitter-queries.d.ts +11 -11
  462. package/dist/core/ingestion/tree-sitter-queries.js +678 -4
  463. package/dist/core/ingestion/type-env.js +11 -7
  464. package/dist/core/ingestion/type-extractors/jvm.js +2 -2
  465. package/dist/core/ingestion/type-extractors/shared.d.ts +17 -0
  466. package/dist/core/ingestion/type-extractors/shared.js +16 -0
  467. package/dist/core/ingestion/type-extractors/types.d.ts +12 -0
  468. package/dist/core/ingestion/type-extractors/typescript.d.ts +20 -0
  469. package/dist/core/ingestion/type-extractors/typescript.js +26 -0
  470. package/dist/core/ingestion/utils/ast-helpers.d.ts +322 -16
  471. package/dist/core/ingestion/utils/ast-helpers.js +727 -150
  472. package/dist/core/ingestion/utils/call-analysis.d.ts +27 -22
  473. package/dist/core/ingestion/utils/call-analysis.js +202 -7
  474. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +59 -0
  475. package/dist/core/ingestion/utils/callable-flow-captures.js +51 -1
  476. package/dist/core/ingestion/utils/callable-labels.d.ts +25 -0
  477. package/dist/core/ingestion/utils/callable-labels.js +31 -0
  478. package/dist/core/ingestion/utils/effective-ram.d.ts +40 -0
  479. package/dist/core/ingestion/utils/effective-ram.js +58 -0
  480. package/dist/core/ingestion/utils/line-base.d.ts +14 -0
  481. package/dist/core/ingestion/utils/line-base.js +14 -0
  482. package/dist/core/ingestion/utils/method-props.d.ts +27 -4
  483. package/dist/core/ingestion/utils/method-props.js +29 -4
  484. package/dist/core/ingestion/utils/receiver-chain-captures.d.ts +31 -0
  485. package/dist/core/ingestion/utils/receiver-chain-captures.js +57 -0
  486. package/dist/core/ingestion/utils/receiver-chain-codec.d.ts +89 -0
  487. package/dist/core/ingestion/utils/receiver-chain-codec.js +182 -0
  488. package/dist/core/ingestion/utils/scope-tree-walk.d.ts +22 -0
  489. package/dist/core/ingestion/utils/scope-tree-walk.js +33 -0
  490. package/dist/core/ingestion/utils/template-arguments.d.ts +96 -0
  491. package/dist/core/ingestion/utils/template-arguments.js +196 -0
  492. package/dist/core/ingestion/utils/type-parameters.d.ts +49 -0
  493. package/dist/core/ingestion/utils/type-parameters.js +206 -0
  494. package/dist/core/ingestion/workers/callable-id.d.ts +80 -0
  495. package/dist/core/ingestion/workers/callable-id.js +125 -0
  496. package/dist/core/ingestion/workers/parse-worker.d.ts +14 -1
  497. package/dist/core/ingestion/workers/parse-worker.js +493 -54
  498. package/dist/core/ingestion/workers/worker-pool.d.ts +20 -27
  499. package/dist/core/ingestion/workers/worker-pool.js +91 -3
  500. package/dist/core/lbug/csv-generator.d.ts +27 -0
  501. package/dist/core/lbug/csv-generator.js +72 -17
  502. package/dist/core/lbug/extension-load-error.js +13 -2
  503. package/dist/core/lbug/extension-loader.d.ts +29 -0
  504. package/dist/core/lbug/extension-loader.js +31 -6
  505. package/dist/core/lbug/graph-emit-sink.d.ts +264 -0
  506. package/dist/core/lbug/graph-emit-sink.js +581 -0
  507. package/dist/core/lbug/lbug-adapter.d.ts +290 -11
  508. package/dist/core/lbug/lbug-adapter.js +652 -69
  509. package/dist/core/lbug/native-check.d.ts +21 -0
  510. package/dist/core/lbug/native-check.js +248 -32
  511. package/dist/core/lbug/pdg-emit-sink.d.ts +13 -4
  512. package/dist/core/lbug/pdg-emit-sink.js +21 -111
  513. package/dist/core/lbug/pool-adapter.d.ts +9 -0
  514. package/dist/core/lbug/pool-adapter.js +164 -14
  515. package/dist/core/lbug/query-batch.d.ts +75 -0
  516. package/dist/core/lbug/query-batch.js +102 -0
  517. package/dist/core/lbug/rel-pair-routing.d.ts +160 -2
  518. package/dist/core/lbug/rel-pair-routing.js +228 -10
  519. package/dist/core/lbug/schema.d.ts +163 -4
  520. package/dist/core/lbug/schema.js +404 -159
  521. package/dist/core/lbug/sync-csv-writer.d.ts +47 -0
  522. package/dist/core/lbug/sync-csv-writer.js +108 -0
  523. package/dist/core/run-analyze.d.ts +147 -0
  524. package/dist/core/run-analyze.js +1215 -179
  525. package/dist/core/search/bm25-index.d.ts +11 -0
  526. package/dist/core/search/bm25-index.js +60 -26
  527. package/dist/core/search/fts-indexes.d.ts +150 -9
  528. package/dist/core/search/fts-indexes.js +241 -23
  529. package/dist/core/wiki/graph-queries.js +145 -112
  530. package/dist/core/wiki/llm-client.d.ts +29 -3
  531. package/dist/core/wiki/llm-client.js +47 -12
  532. package/dist/core/wiki/prompts.d.ts +19 -0
  533. package/dist/core/wiki/prompts.js +20 -1
  534. package/dist/lib/utils.d.ts +113 -0
  535. package/dist/lib/utils.js +185 -0
  536. package/dist/mcp/local/aop-metadata.d.ts +77 -0
  537. package/dist/mcp/local/aop-metadata.js +227 -0
  538. package/dist/mcp/local/bean-metadata.d.ts +2 -1
  539. package/dist/mcp/local/bean-metadata.js +22 -1
  540. package/dist/mcp/local/convex-metadata.d.ts +8 -0
  541. package/dist/mcp/local/convex-metadata.js +45 -0
  542. package/dist/mcp/local/local-backend.d.ts +174 -11
  543. package/dist/mcp/local/local-backend.js +1678 -331
  544. package/dist/mcp/local/path-predicate.d.ts +19 -0
  545. package/dist/mcp/local/path-predicate.js +21 -0
  546. package/dist/mcp/local/pdg-impact.d.ts +132 -10
  547. package/dist/mcp/local/pdg-impact.js +391 -98
  548. package/dist/mcp/repository-policy.d.ts +1 -0
  549. package/dist/mcp/repository-policy.js +5 -0
  550. package/dist/mcp/resources.js +26 -4
  551. package/dist/mcp/server.js +23 -13
  552. package/dist/mcp/tools.d.ts +8 -0
  553. package/dist/mcp/tools.js +76 -23
  554. package/dist/server/analyze-job.d.ts +37 -2
  555. package/dist/server/analyze-job.js +13 -2
  556. package/dist/server/analyze-launch.d.ts +1 -1
  557. package/dist/server/analyze-launch.js +79 -10
  558. package/dist/server/analyze-worker-core.d.ts +1 -1
  559. package/dist/server/analyze-worker-core.js +10 -1
  560. package/dist/server/analyze-worker-ipc.d.ts +1 -1
  561. package/dist/server/analyze-worker-ipc.js +4 -0
  562. package/dist/server/analyze-worker-protocol.d.ts +59 -0
  563. package/dist/server/analyze-worker-protocol.js +1 -0
  564. package/dist/server/analyze-worker.d.ts +1 -17
  565. package/dist/server/api.d.ts +2 -11
  566. package/dist/server/api.js +164 -163
  567. package/dist/server/embed-run-outcome.d.ts +89 -0
  568. package/dist/server/embed-run-outcome.js +88 -0
  569. package/dist/server/git-clone.js +6 -2
  570. package/dist/server/middleware.d.ts +116 -9
  571. package/dist/server/middleware.js +291 -22
  572. package/dist/server/sse-progress.d.ts +41 -0
  573. package/dist/server/sse-progress.js +125 -0
  574. package/dist/storage/branch-index.d.ts +11 -6
  575. package/dist/storage/branch-index.js +15 -7
  576. package/dist/storage/file-hash.js +2 -2
  577. package/dist/storage/fs-atomic.d.ts +25 -0
  578. package/dist/storage/fs-atomic.js +42 -0
  579. package/dist/storage/git.d.ts +131 -0
  580. package/dist/storage/git.js +236 -2
  581. package/dist/storage/index-lock.d.ts +102 -0
  582. package/dist/storage/index-lock.js +660 -0
  583. package/dist/storage/parse-cache.js +588 -3
  584. package/dist/storage/parsedfile-store.js +76 -6
  585. package/dist/storage/repo-manager.d.ts +54 -435
  586. package/dist/storage/repo-manager.js +312 -215
  587. package/dist/storage/repo-meta.d.ts +530 -0
  588. package/dist/storage/repo-meta.js +100 -0
  589. package/dist/types/pipeline.d.ts +37 -0
  590. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +1 -1
  591. package/hooks/claude/gitnexus-hook.cjs +1 -1
  592. package/hooks/claude/resolve-analyze-cmd.cjs +80 -13
  593. package/package.json +11 -2
  594. package/scripts/cross-platform-shard.ts +153 -0
  595. package/scripts/cross-platform-tests.ts +122 -0
  596. package/scripts/run-cross-platform.ts +16 -5
  597. package/skills/gitnexus-cli.md +3 -3
  598. package/skills/gitnexus-debugging.md +37 -7
  599. package/skills/gitnexus-exploring.md +26 -4
  600. package/skills/gitnexus-impact-analysis.md +71 -10
  601. package/skills/gitnexus-plan/README.md +11 -6
  602. package/skills/gitnexus-plan/references/evidence-provenance.md +49 -12
  603. package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +654 -372
  604. package/skills/gitnexus-refactoring.md +48 -5
  605. package/skills/gitnexus-review/SKILL.md +12 -6
  606. package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +1 -1
  607. package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +1 -1
  608. package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +1 -1
  609. package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +1 -1
  610. package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +1 -1
  611. package/skills/gitnexus-review/ci-personas/ci-security-lens.md +1 -1
  612. package/skills/gitnexus-taint-analysis.md +13 -7
  613. package/skills/gitnexus-work/SKILL.md +4 -1
  614. package/skills/gitnexus-work/references/evidence-provenance.md +49 -12
  615. package/skills/gitnexus-work/scripts/evidence-provenance.mjs +654 -372
  616. package/vendor/leiden/utils.cjs +28 -1
  617. package/web/assets/ProcessFlowModal-Badh2Pbg.js +24 -0
  618. package/web/assets/{__vite-browser-external-bMKyYQkO.js → __vite-browser-external-COxE8F0G.js} +1 -1
  619. package/web/assets/abnfDiagram-QNN2D4NM-Cq2djWWe.js +1 -0
  620. package/web/assets/agent-Dr4l5EOp.js +662 -0
  621. package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +1 -0
  622. package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +36 -0
  623. package/web/assets/{blockDiagram-7IZFK4PR-DBefcjof.js → blockDiagram-54WLDVWM-Dg_hrRWE.js} +4 -4
  624. package/web/assets/{c4Diagram-Y2BXMSZH-EjWnjEJl.js → c4Diagram-X2LASM7V-CnhoT4aV.js} +2 -2
  625. package/web/assets/chunk-224SPVON-B8gxtXpy.js +1 -0
  626. package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +127 -0
  627. package/web/assets/chunk-2SREHG4O-Dip42xOq.js +1 -0
  628. package/web/assets/chunk-4RFN2BYJ-DHHWuC-n.js +1 -0
  629. package/web/assets/chunk-66DQ2XMT-CM0xjFAN.js +1 -0
  630. package/web/assets/chunk-6BELYETK-ChsYtfHW.js +1 -0
  631. package/web/assets/{chunk-LII3EMHJ-BL6lKJ_P.js → chunk-6L755F7B-CMhLBxi2.js} +1 -1
  632. package/web/assets/{chunk-QA3QBVWF-DVXPOIxe.js → chunk-7CWYLC5S-DRgGkkpF.js} +1 -1
  633. package/web/assets/{chunk-ZXARS5L4-C3v-4Fsw.js → chunk-A7VWPJGB-B4O3oQdQ.js} +1 -1
  634. package/web/assets/chunk-BI6VK774-D0oaWk8V.js +1 -0
  635. package/web/assets/chunk-D6VWDJW2-BxcBdZ9c.js +2 -0
  636. package/web/assets/chunk-DMV4VAQV-Bn6WXDSX.js +4 -0
  637. package/web/assets/chunk-E5QJAATJ-dh-5CtIV.js +2 -0
  638. package/web/assets/chunk-EQFTRU2I-1ix7TzW9.js +2 -0
  639. package/web/assets/chunk-FWYVLQTC-BgDItRzJ.js +1 -0
  640. package/web/assets/chunk-HNC4WDU7-DoU3KnA7.js +1 -0
  641. package/web/assets/chunk-L5GCOVLC-CE2w8Nm_.js +161 -0
  642. package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +321 -0
  643. package/web/assets/chunk-LORZLZWG-B57uGw2N.js +88 -0
  644. package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +62 -0
  645. package/web/assets/chunk-NV3KIAZN-5yvcpMiu.js +1 -0
  646. package/web/assets/chunk-OIYT25JQ-CQ6KOZGX.js +1 -0
  647. package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +10 -0
  648. package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +156 -0
  649. package/web/assets/chunk-RRFMTAIC-CMN0wcYA.js +1 -0
  650. package/web/assets/{chunk-RLI5ZMPA-CkXZ0y0U.js → chunk-SATU7PGQ-B1zhgOvc.js} +1 -1
  651. package/web/assets/chunk-STOV2HOB-GnExfzIX.js +1 -0
  652. package/web/assets/{chunk-INKRHTLW-Ckl3_KkO.js → chunk-SZD42YQK-ijyKKVr1.js} +21 -21
  653. package/web/assets/{chunk-LCXTWHL2-C162wE5z.js → chunk-TFPGFQPA-Dj6a-0pC.js} +3 -3
  654. package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +2 -0
  655. package/web/assets/chunk-TZUXEDM2-B7p9AcTw.js +1 -0
  656. package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +1 -0
  657. package/web/assets/{chunk-6764PJDD-C7xxk063.js → chunk-VE5CLXGZ-C1vB7wpY.js} +1 -1
  658. package/web/assets/{chunk-RG4AUYOV-ZNgyLFq6.js → chunk-VJFVEZTB-CX66F2ep.js} +3 -3
  659. package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +1 -0
  660. package/web/assets/chunk-WJBAP47W-BckNkuEN.js +1 -0
  661. package/web/assets/chunk-XNMVGMAZ-Cg_LnPtj.js +1 -0
  662. package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +1 -0
  663. package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +1 -0
  664. package/web/assets/{cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js → cose-bilkent-RZA4XIPR-BHpK4Crp.js} +1 -1
  665. package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +1 -0
  666. package/web/assets/cynefinDiagram-TR7LZUCG-C3Iar9lZ.js +62 -0
  667. package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +4 -0
  668. package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +30 -0
  669. package/web/assets/diagram-JCD7PQ7C-DC5-9FRr.js +24 -0
  670. package/web/assets/{diagram-HNR7UZ2L-DVRltWbL.js → diagram-KFBZAVDW-Dfmf_4ti.js} +3 -3
  671. package/web/assets/diagram-L7DVE3PN-GIRyVUtt.js +41 -0
  672. package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +24 -0
  673. package/web/assets/ebnfDiagram-DRHRQJWO-D8_CI4ZF.js +1 -0
  674. package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +85 -0
  675. package/web/assets/error-D9MtuG9s.js +1 -0
  676. package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +1 -0
  677. package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +1 -0
  678. package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +292 -0
  679. package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +1 -0
  680. package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +106 -0
  681. package/web/assets/{index-D7mTFcvQ.js → index-2zdvEdzg.js} +51 -51
  682. package/web/assets/index-CJDpyH-n.css +2 -0
  683. package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +1 -0
  684. package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +2 -0
  685. package/web/assets/{ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js → ishikawaDiagram-4JDSWWDM-DmqWtjkl.js} +2 -2
  686. package/web/assets/{journeyDiagram-M6C3CM3L-C6wjooas.js → journeyDiagram-QUS3FAKT-XAzVzrQW.js} +3 -3
  687. package/web/assets/{kanban-definition-75IXJCU3-5_UVY79g.js → kanban-definition-D4L7SQKK-YurRnmYn.js} +6 -6
  688. package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +257 -0
  689. package/web/assets/{mindmap-definition-2TDM6QVE-8xDLzk2e.js → mindmap-definition-66QP5TD6-ChrWWnil.js} +5 -5
  690. package/web/assets/node.browser-U-KyT5AW.js +1 -0
  691. package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +1 -0
  692. package/web/assets/pegDiagram-YKIO5C6U-QGeQLEq2.js +1 -0
  693. package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +1 -0
  694. package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +39 -0
  695. package/web/assets/{quadrantDiagram-VICAPDV7-DR54jOeR.js → quadrantDiagram-VO5QLCXA-B7098wSc.js} +3 -3
  696. package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +1 -0
  697. package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +1 -0
  698. package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +1 -0
  699. package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +1 -0
  700. package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +1 -0
  701. package/web/assets/railroadDiagram-M77LTMSB-AXu4vxk_.js +1 -0
  702. package/web/assets/{requirementDiagram-JXO7QTGE-PEkg7sKC.js → requirementDiagram-RASO5HTO-B-l8InpK.js} +4 -4
  703. package/web/assets/{sankeyDiagram-URQDO5SZ-DDWEtjcs.js → sankeyDiagram-F32LOJ6L-Kd7zjJgX.js} +3 -3
  704. package/web/assets/{sequenceDiagram-VS2MUI6T-Bv-uwANx.js → sequenceDiagram-URATNSBD-BlcdY9DS.js} +7 -7
  705. package/web/assets/sizeCapture-5GORAGP4-BEqQzsxs.js +1 -0
  706. package/web/assets/src-C5sx_gMp.js +1 -0
  707. package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +1 -0
  708. package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +1 -0
  709. package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +2 -0
  710. package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +8 -0
  711. package/web/assets/{timeline-definition-O6YCAMPW-Qmsuo7qS.js → timeline-definition-WJXWRH4I-DUfp1R3E.js} +3 -3
  712. package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +1 -0
  713. package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +1 -0
  714. package/web/assets/vennDiagram-K3VCMQLI-Bj-FN-XS.js +34 -0
  715. package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +1 -0
  716. package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +78 -0
  717. package/web/assets/xychartDiagram-5VRUVLCW-CK_rbSWE.js +7 -0
  718. package/web/index.html +16 -15
  719. package/dist/core/ingestion/languages/python/index-stats.d.ts +0 -18
  720. package/dist/core/ingestion/languages/python/index-stats.js +0 -25
  721. package/web/assets/ProcessFlowModal-CwkpVkv-.js +0 -22
  722. package/web/assets/agent-Ds-lkZjX.js +0 -626
  723. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +0 -1
  724. package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +0 -36
  725. package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +0 -4
  726. package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +0 -1
  727. package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +0 -321
  728. package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +0 -159
  729. package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +0 -124
  730. package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +0 -10
  731. package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +0 -1
  732. package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +0 -1
  733. package/web/assets/chunk-J5EP6P6S-L19oz55R.js +0 -1
  734. package/web/assets/chunk-KGFNY3KK-BZeP-55u.js +0 -62
  735. package/web/assets/chunk-KGYTTC2M-zm6n242I.js +0 -1
  736. package/web/assets/chunk-KNLZD3CH-BGlP6X9R.js +0 -1
  737. package/web/assets/chunk-LRIF4GLE-n59lhprL.js +0 -1
  738. package/web/assets/chunk-RERM46MO-B5dAdWpP.js +0 -1
  739. package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +0 -1
  740. package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +0 -1
  741. package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +0 -1
  742. package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +0 -1
  743. package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +0 -1
  744. package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +0 -2
  745. package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +0 -1
  746. package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +0 -1
  747. package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +0 -4
  748. package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +0 -43
  749. package/web/assets/diagram-GF46GFSD-B2atbzmU.js +0 -24
  750. package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +0 -24
  751. package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +0 -10
  752. package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +0 -85
  753. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +0 -1
  754. package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +0 -162
  755. package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +0 -292
  756. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +0 -1
  757. package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +0 -106
  758. package/web/assets/index-CX_fADmQ.css +0 -2
  759. package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +0 -1
  760. package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +0 -2
  761. package/web/assets/katex-K3KEBU37-qRQBy-EZ.js +0 -261
  762. package/web/assets/node-Ct_zna8U.js +0 -8
  763. package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +0 -1
  764. package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +0 -1
  765. package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +0 -30
  766. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +0 -1
  767. package/web/assets/sdk-CzHHH8tD.js +0 -37
  768. package/web/assets/src-Cv1eWg0o.js +0 -1
  769. package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +0 -1
  770. package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +0 -1
  771. package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +0 -1
  772. package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +0 -1
  773. package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +0 -34
  774. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +0 -1
  775. package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +0 -78
  776. package/web/assets/xychartDiagram-N2JHSOCM-CoZ_Tits.js +0 -7
  777. /package/web/assets/{chunk-7W6UQGC5-pyKGssV3.js → chunk-LIEV3EAG-pyKGssV3.js} +0 -0
@@ -1,22 +1,38 @@
1
1
  import { generateId } from '../../../lib/utils.js';
2
2
  import { extractTemplateArguments, stripTemplateArguments, templateArgumentsIdTag, } from './template-arguments.js';
3
3
  import { splitQualifiedName } from './qualified-name.js';
4
+ import { isOverloadableCallable } from './callable-labels.js';
4
5
  /**
5
- * Qualify a Rust inherent-impl target (`impl Inner { ... }`) by its enclosing
6
- * `mod_item` scope, so a bare same-tail target nested under different modules
7
- * resolves to a DISTINCT path (`outer.Inner` vs `other.Inner`) — the #1982
8
- * follow-up to #1975. Walks `mod_item` ancestors (outermost → innermost) and
9
- * joins them with the normalized raw target via the shared `splitQualifiedName`.
10
- * A top-level `impl Inner` (no enclosing mod) returns the bare target unchanged.
11
- * Keyed purely on tree-sitter node types (no language name), matching the
12
- * inherent-impl branch in `findEnclosingClassInfo`; the caller restricts this to
13
- * UNSCOPED targets (`type_identifier`) so a SCOPED `impl a::Inner` keeps its full
14
- * raw text (#1975). The Impl-node materialization in parsing-processor /
15
- * parse-worker mirrors this so the owner edge and node id agree byte-for-byte.
6
+ * Qualify a name by its enclosing `mod_item` scope, so two same-tail items nested
7
+ * under different modules get DISTINCT paths (`outer.Inner` vs `other.Inner`).
8
+ * Walks `mod_item` ancestors (outermost → innermost) and joins them with the
9
+ * normalized raw text via the shared `splitQualifiedName`. Keyed purely on
10
+ * tree-sitter node types (no language name), so it is a no-op for every grammar
11
+ * without such a node.
12
+ *
13
+ * TWO callers, with different contracts — read both before widening either:
14
+ *
15
+ * 1. The inherent-impl target (`impl Inner { … }`) — the #1982 follow-up to
16
+ * #1975, reachable through the {@link qualifyRustImplTargetByModScope} alias
17
+ * and mirrored by the inherent-impl branch in `findEnclosingClassInfo` so the
18
+ * owner edge and the node id agree byte-for-byte. That caller gates on an
19
+ * UNSCOPED `type_identifier`, which is what keeps a SCOPED `impl a::Inner` on
20
+ * its full raw text.
21
+ *
22
+ * 2. Free items, for module node identity (#2742). That caller gates on the node
23
+ * being on neither side of an owner edge (`MEMBER_OWNER_NODE_TYPES`,
24
+ * `enclosingClassInfo`) and not inside a callable, because only the id moves
25
+ * here — every owner-edge anchor is minted separately and does not follow.
26
+ *
27
+ * A name with NO enclosing `mod` is returned verbatim, never normalized: rewriting
28
+ * a scoped target's separator (`a::Inner` → `a.Inner`) would move its node id away
29
+ * from the id its owner edge emits, which is how caller 2 first broke caller 1's
30
+ * #1975 contract. Splitting an unscoped name has always been the identity, so
31
+ * caller 1 is unaffected either way.
16
32
  */
17
- export const qualifyRustImplTargetByModScope = (implNode, rawTargetText) => {
33
+ export const qualifyByEnclosingModScope = (node, rawText) => {
18
34
  const modSegments = [];
19
- let current = implNode.parent;
35
+ let current = node.parent;
20
36
  while (current) {
21
37
  if (current.type === 'mod_item') {
22
38
  const nameNode = current.childForFieldName?.('name') ??
@@ -26,8 +42,21 @@ export const qualifyRustImplTargetByModScope = (implNode, rawTargetText) => {
26
42
  }
27
43
  current = current.parent;
28
44
  }
29
- return [...modSegments, ...splitQualifiedName(rawTargetText)].filter(Boolean).join('.');
45
+ // No enclosing `mod`: return the raw text UNTOUCHED. Normalizing here would
46
+ // rewrite a scoped target's separator (`a::Inner` -> `a.Inner`) and silently
47
+ // move its node id away from the one the owner edge emits, which is how this
48
+ // helper first broke the #1975 scoped-impl ownership when it was generalized
49
+ // beyond unscoped targets. Callers that pass an unscoped name are unaffected,
50
+ // since splitting one has always been the identity.
51
+ if (modSegments.length === 0)
52
+ return rawText;
53
+ return [...modSegments, ...splitQualifiedName(rawText)].filter(Boolean).join('.');
30
54
  };
55
+ /**
56
+ * Impl-target alias of {@link qualifyByEnclosingModScope}, kept as its own name
57
+ * because the caller gates it on UNSCOPED targets (see the contract above).
58
+ */
59
+ export const qualifyRustImplTargetByModScope = qualifyByEnclosingModScope;
31
60
  /**
32
61
  * #1991: scope-label predicate that single-sources the `nodeLabel === 'Trait'`
33
62
  * checks in parsing-processor.ts / parse-worker.ts. A Ruby `module` maps to the
@@ -82,25 +111,104 @@ const isConcreteTypedefCapture = (captureMap) => {
82
111
  return (definitionNode?.type === 'type_definition' &&
83
112
  (captureMap['definition.struct'] !== undefined || captureMap['definition.enum'] !== undefined));
84
113
  };
85
- export const buildConcreteTypedefDefinitionRanges = (matches) => {
86
- const ranges = new Set();
114
+ export const isSuppressedConcreteTypedefDuplicate = (captureMap, concreteTypedefRanges) => {
115
+ const definitionNode = getDefinitionNodeFromCaptures(captureMap);
116
+ return (definitionNode?.type === 'type_definition' &&
117
+ captureMap['definition.typedef'] !== undefined &&
118
+ concreteTypedefRanges.has(nodeRangeKey(definitionNode)));
119
+ };
120
+ /**
121
+ * Graph labels produced by a value capture (`@definition.const` /
122
+ * `@definition.static` / `@definition.variable`) — a binding that holds a value.
123
+ *
124
+ * `Property` is deliberately NOT here. It outranks these: Python matches both
125
+ * `@definition.property` (annotated) and `@definition.variable` (bare) on one
126
+ * assignment, and the property must win so a typed class attribute keeps its
127
+ * `Property` node and its owning `HAS_PROPERTY` edge. `Property` is instead
128
+ * suppressed only by a *callable* claim — see {@link buildDefinitionNameClaims}.
129
+ */
130
+ const VALUE_DEFINITION_LABELS = new Set([
131
+ 'Const',
132
+ 'Static',
133
+ 'Variable',
134
+ ]);
135
+ /** True when `label` is the kind of node a value capture emits. */
136
+ export const isValueDefinitionLabel = (label) => VALUE_DEFINITION_LABELS.has(label);
137
+ /**
138
+ * Pre-scan `matches` for the `${definitionNode.startIndex}:${name}` keys already
139
+ * claimed by a higher-ranked definition capture, so the parse-worker's duplicate
140
+ * suppression is order-independent.
141
+ *
142
+ * Rank, highest first: callable (`Function`/`Method`/`Constructor`) → `Property`
143
+ * → value (`Const`/`Static`/`Variable`). A capture is dropped only when a
144
+ * STRICTLY higher rank claimed the same declaration node and name, so no capture
145
+ * can suppress itself and no rank can suppress a peer.
146
+ *
147
+ * ## Why this exists (#2687)
148
+ *
149
+ * `const X = () => {}` matches BOTH `@definition.function` and
150
+ * `@definition.const` on the same `lexical_declaration`. Only one graph node
151
+ * should survive — the `Function`, because that is what `CALLS` edges target.
152
+ * The parse-worker's in-loop dedup intends exactly that, but only the value
153
+ * branch consults its `processedDefinitionNodes` set, so suppression worked only
154
+ * if the function match happened to be processed first. It is not: tree-sitter
155
+ * completes the const pattern at `@name`, while the function pattern must also
156
+ * match the trailing `(arrow_function)` / `(function_expression)` value, so the
157
+ * const match is yielded FIRST and the edgeless `Const:` twin escaped.
158
+ *
159
+ * Consulting this set makes the outcome independent of match order.
160
+ *
161
+ * ## Keying
162
+ *
163
+ * Keys are `startIndex:name`, never `startIndex` alone — a multi-name
164
+ * declaration (`const a = 1, b = () => {}`) shares ONE definition node, and a
165
+ * bare-index key would wrongly suppress `a`'s legitimate `Const` node.
166
+ *
167
+ * Labels come from {@link getLabelFromCaptures}, the same function the main loop
168
+ * uses, so the pre-scan and the loop can never disagree about what counts as a
169
+ * value capture — including when a provider's `labelOverride` reclassifies one.
170
+ * A match that resolves to a value label registers nothing, so a match can never
171
+ * suppress itself.
172
+ *
173
+ * Language-agnostic: keyed off capture names and labels only.
174
+ *
175
+ * Also collects the concrete-typedef ranges that suppress the analogous
176
+ * typedef/struct duplicate, so both suppression sets come from one traversal.
177
+ */
178
+ export const buildDefinitionPreScan = (matches, provider) => {
179
+ const nonValue = new Set();
180
+ const callable = new Set();
181
+ const concreteTypedefRanges = new Set();
87
182
  for (const match of matches) {
183
+ // ONE capture-map build per match feeds both suppression sets. These used
184
+ // to be two independent passes over `matches` (each rebuilding this object)
185
+ // on the hot per-file parse path.
88
186
  const captureMap = {};
89
187
  for (const capture of match.captures) {
90
188
  captureMap[capture.name] = capture.node;
91
189
  }
92
190
  const definitionNode = getDefinitionNodeFromCaptures(captureMap);
93
- if (definitionNode && isConcreteTypedefCapture(captureMap)) {
94
- ranges.add(nodeRangeKey(definitionNode));
191
+ if (definitionNode === null)
192
+ continue;
193
+ if (isConcreteTypedefCapture(captureMap)) {
194
+ concreteTypedefRanges.add(nodeRangeKey(definitionNode));
95
195
  }
196
+ // No `@name` capture means nothing a lower-ranked capture could collide
197
+ // with — a value or property pattern always binds a name. Checked before
198
+ // `getLabelFromCaptures` so a nameless match never pays for label
199
+ // resolution (which can reach a provider's `labelOverride`).
200
+ const nameNode = captureMap['name'];
201
+ if (nameNode === undefined)
202
+ continue;
203
+ const label = getLabelFromCaptures(captureMap, provider);
204
+ if (label === null || isValueDefinitionLabel(label))
205
+ continue;
206
+ const key = `${definitionNode.startIndex}:${nameNode.text}`;
207
+ nonValue.add(key);
208
+ if (isOverloadableCallable(label))
209
+ callable.add(key);
96
210
  }
97
- return ranges;
98
- };
99
- export const isSuppressedConcreteTypedefDuplicate = (captureMap, concreteTypedefRanges) => {
100
- const definitionNode = getDefinitionNodeFromCaptures(captureMap);
101
- return (definitionNode?.type === 'type_definition' &&
102
- captureMap['definition.typedef'] !== undefined &&
103
- concreteTypedefRanges.has(nodeRangeKey(definitionNode)));
211
+ return { nonValue, callable, concreteTypedefRanges };
104
212
  };
105
213
  /**
106
214
  * Node types that represent function/method definitions across languages.
@@ -165,6 +273,15 @@ export const CLASS_CONTAINER_TYPES = new Set([
165
273
  'class_declaration',
166
274
  'abstract_class_declaration',
167
275
  'interface_declaration',
276
+ // A TypeScript object-type alias owns its members exactly as the interface
277
+ // beside it does — same `property_signature` members, same "who reads this
278
+ // contract field?" question. Without it an alias member is minted with a
279
+ // bare id and no owner, so two aliases in one file sharing a field name
280
+ // collapse onto one node and nothing links the field to its consumers,
281
+ // while the identical interface resolves. Aliases with no object type
282
+ // (`type Id = string`) declare no members, so they own nothing and are
283
+ // unaffected.
284
+ 'type_alias_declaration',
168
285
  'struct_declaration',
169
286
  'record_declaration',
170
287
  'class_specifier',
@@ -192,10 +309,43 @@ export const CLASS_CONTAINER_TYPES = new Set([
192
309
  'struct_type',
193
310
  'interface_type',
194
311
  ]);
312
+ /**
313
+ * Node types whose OWN node id must not be re-keyed by an enclosing-scope
314
+ * qualifier (see {@link qualifyByEnclosingModScope}) unless the owner-edge
315
+ * anchor moves in the same change.
316
+ *
317
+ * These are the containers a member can be declared inside. Their members'
318
+ * `HAS_METHOD` / `HAS_PROPERTY` edges anchor on `findEnclosingClassInfo().classId`,
319
+ * which is minted from the container's bare `nameNode.text` further down this
320
+ * file and only follows a qualified shape when the provider opts in via
321
+ * `classExtractor.qualifiedNodeId`. So qualifying a container's id alone points
322
+ * every one of its member edges at a node that does not exist — the edges are
323
+ * dropped at COPY time and the container silently loses all its members.
324
+ *
325
+ * Derived from `CLASS_CONTAINER_TYPES` on purpose: that set is already the
326
+ * single source of "this node type owns member edges", carries the INVARIANT
327
+ * note above binding it to `CONTAINER_TYPE_TO_LABEL`, and so a language adding
328
+ * a container cannot gain a mismatched id shape here without also failing that
329
+ * invariant. Keyed purely on tree-sitter node types — no language names.
330
+ */
331
+ export const MEMBER_OWNER_NODE_TYPES = new Set([
332
+ ...CLASS_CONTAINER_TYPES,
333
+ // Rust `union_item` owns a `field_declaration_list` exactly as `struct_item`
334
+ // does, and its fields ARE captured as `Property`, but it is absent from
335
+ // `CLASS_CONTAINER_TYPES`, so `findEnclosingClassInfo` does not recognize it as
336
+ // an owner: union fields carry no `HAS_PROPERTY` edge at all and therefore
337
+ // cannot dangle. Listed here so the union's own id keeps the same shape as the
338
+ // struct beside it, and so making it a real owner later starts from a
339
+ // consistent id rather than having to move one.
340
+ 'union_item',
341
+ ]);
195
342
  export const CONTAINER_TYPE_TO_LABEL = {
196
343
  class_declaration: 'Class',
197
344
  abstract_class_declaration: 'Class',
198
345
  interface_declaration: 'Interface',
346
+ // Required by the CLASS_CONTAINER_TYPES invariant above: a container missing
347
+ // here gets orphaned member edges or a wrong owner label.
348
+ type_alias_declaration: 'TypeAlias',
199
349
  struct_declaration: 'Struct',
200
350
  struct_specifier: 'Struct',
201
351
  class_specifier: 'Class',
@@ -259,6 +409,70 @@ export function findAncestorBeforeBoundary(node, targetTypes, boundaryTypes) {
259
409
  }
260
410
  return null;
261
411
  }
412
+ /**
413
+ * Enclosing callable for grammars that split a callable into a SIGNATURE node
414
+ * and a SIBLING body, where the callable is therefore never an ancestor of the
415
+ * code inside it.
416
+ *
417
+ * Dart is the case that forced this: `int outer() { … }` parses as
418
+ * `function_signature` followed by `function_body` as SIBLINGS, so an ancestor
419
+ * walk from a closure inside the body can never reach `outer`. No membership
420
+ * set fixes that — the walk is looking in the wrong direction (#2699).
421
+ *
422
+ * Deliberately a FALLBACK, used only when the ancestor walk found nothing.
423
+ *
424
+ * The sibling must be a BARE SIGNATURE, and that restriction is load-bearing —
425
+ * "any preceding callable sibling" is WRONG and was caught regressing PHP. In
426
+ * `<?php function target($x) {…} $handler = function ($x) {…};` the closure is
427
+ * at FILE level, so the primary ancestor walk correctly finds nothing and this
428
+ * fallback runs; an unrestricted version then grabs the preceding
429
+ * `function_definition` and mis-qualifies the file-level `$handler` as
430
+ * `target.$handler`. A preceding sibling is only an ENCLOSING callable when it
431
+ * cannot hold its own body — i.e. when the grammar split the body off.
432
+ *
433
+ * `SPLIT_SIGNATURE_NODE_TYPES` is exactly that set, and it is derived rather
434
+ * than listed: `LOCAL_SCOPE_BODY_NODE_TYPES` already filters the bare-signature
435
+ * types out of `FUNCTION_NODE_TYPES`, so the difference between them IS the
436
+ * split-signature set. PHP's `function_definition` carries a body and is in
437
+ * both, so it is excluded; Dart's `function_signature` is in only the former,
438
+ * so it qualifies.
439
+ *
440
+ * Language-neutral by construction — it names no grammar, and any future
441
+ * signature/body-split language is covered for free.
442
+ */
443
+ export function findSplitBodyCallableAncestor(node, signatureOnlyTypes, boundaryTypes) {
444
+ let current = node.parent;
445
+ while (current !== null) {
446
+ if (boundaryTypes.has(current.type))
447
+ return null;
448
+ const prev = current.previousNamedSibling;
449
+ if (prev !== null &&
450
+ signatureOnlyTypes.has(prev.type) &&
451
+ // `current` must be the signature's BODY, not merely the next thing after
452
+ // it. Without this, valid TypeScript trips the fallback: in
453
+ // declare namespace Api {
454
+ // function internalHelper(x): number;
455
+ // export function send(x): number;
456
+ // }
457
+ // `send`'s `export_statement` is the next sibling of `internalHelper`'s
458
+ // `function_signature`, so `send` was mis-qualified as
459
+ // `internalHelper.send@r:c`. TypeScript emits bodyless
460
+ // function_signature/method_signature for overloads and ambient
461
+ // declarations, so the split-signature set is NOT Dart-only.
462
+ //
463
+ // A body contains statements; a declaration wrapper contains another
464
+ // signature. Rejecting any `current` that directly holds a signature of
465
+ // its own separates the two without naming a grammar.
466
+ !current.namedChildren.some((child) => signatureOnlyTypes.has(child.type))) {
467
+ return prev;
468
+ }
469
+ current = current.parent;
470
+ }
471
+ return null;
472
+ }
473
+ // SPLIT_SIGNATURE_NODE_TYPES is defined next to LOCAL_SCOPE_BODY_NODE_TYPES,
474
+ // which it derives from — declaring it here would read it in its temporal dead
475
+ // zone and throw at module load (tsc does NOT catch that; only running does).
262
476
  /**
263
477
  * Determine the graph node label from a tree-sitter capture map.
264
478
  * Handles language-specific reclassification via the provider's labelOverride hook
@@ -360,31 +574,29 @@ export function getLabelFromCaptures(captureMap, provider) {
360
574
  * `MAX_ENCLOSING_WALK_ITERATIONS` defense-in-depth guard below prevents
361
575
  * pathological hooks from creating an infinite loop. */
362
576
  const MAX_ENCLOSING_WALK_ITERATIONS = 4096;
363
- /**
364
- * Synthesize a javac-style name for a Java anonymous class body:
365
- * `new Runnable() { ... }` inside top-level class `Worker` becomes
366
- * `Worker$1` (`$N` = 1-based source order of anonymous bodies within the
367
- * top-level class). Returns undefined when the node is not an
368
- * `object_creation_expression` carrying a `class_body` child — which also
369
- * keeps this a no-op for C#, whose `object_creation_expression` uses
370
- * `initializer_expression`, never `class_body` (#2550).
371
- *
372
- * The SAME name must be produced by every layer that keys the anonymous
373
- * class (structure-phase node id, enclosing-owner walk, scope-side
374
- * declaration synthesis, receiver typeBinding) — they agree by all calling
375
- * this one helper.
376
- */
377
- /** Type-declaration node types that can host (and name) a Java anonymous
378
- * class body. Naming follows JLS 13.1: the binary name is the
379
- * IMMEDIATELY enclosing type's binary name + `$N`, so the synthesized
380
- * name is the `$`-joined chain of enclosing host names
381
- * (`EnumWrap$Mode$1`), numbered per immediate host in source order. */
382
- const JAVA_ANON_HOST_TYPES = new Set([
383
- 'class_declaration',
384
- 'enum_declaration',
385
- 'interface_declaration',
386
- 'record_declaration',
577
+ /** Named Java declarations that can host, or themselves be, local types. */
578
+ const JAVA_NAMED_TYPE_NODE_LABELS = new Map([
579
+ ['class_declaration', 'Class'],
580
+ ['enum_declaration', 'Enum'],
581
+ ['interface_declaration', 'Interface'],
582
+ ['record_declaration', 'Record'],
387
583
  ]);
584
+ const JAVA_ANON_HOST_TYPES = new Set(JAVA_NAMED_TYPE_NODE_LABELS.keys());
585
+ const JAVA_LOCAL_TYPE_CONTAINERS = new Set([
586
+ 'block',
587
+ 'constructor_body',
588
+ 'switch_block_statement_group',
589
+ ]);
590
+ /** A legal local type declaration is a class, enum, record, or interface
591
+ * directly occupying a block-statement position. Annotation interfaces are
592
+ * deliberately excluded: javac rejects local annotation declarations. */
593
+ export const javaLocalTypeDeclarationContainer = (node) => {
594
+ if (!JAVA_NAMED_TYPE_NODE_LABELS.has(node.type))
595
+ return null;
596
+ const parent = node.parent;
597
+ return parent !== null && JAVA_LOCAL_TYPE_CONTAINERS.has(parent.type) ? parent : null;
598
+ };
599
+ const isJavaLocalTypeNode = (node) => javaLocalTypeDeclarationContainer(node) !== null;
388
600
  /** The two Java anonymous-class-body shapes (#2550/#2555): an
389
601
  * `object_creation_expression` with a `class_body` child
390
602
  * (`new Runnable() { ... }`), and an `enum_constant` with a `body:`
@@ -392,10 +604,7 @@ const JAVA_ANON_HOST_TYPES = new Set([
392
604
  const isJavaAnonymousBodyNode = (node) => (node.type === 'object_creation_expression' &&
393
605
  node.namedChildren?.some((c) => c.type === 'class_body') === true) ||
394
606
  (node.type === 'enum_constant' && node.childForFieldName?.('body')?.type === 'class_body');
395
- /** Nearest ancestor of `node` that is an enclosing TYPE per JLS 13.1 —
396
- * a named host declaration OR another anonymous body (both shapes).
397
- * Anonymous ancestors chain through: an anon inside an anon is
398
- * `Host$1$1`, and an anon inside an enum constant body is `E$1$1`. */
607
+ /** Nearest ancestor of `node` that is an enclosing type per JLS 13.1. */
399
608
  const nearestJavaEnclosingType = (node) => {
400
609
  let cursor = node.parent;
401
610
  let iterations = 0;
@@ -408,84 +617,134 @@ const nearestJavaEnclosingType = (node) => {
408
617
  }
409
618
  return null;
410
619
  };
411
- /** Per-parse-tree memo of anonymous-body numbering: tree → (startIndex →
412
- * synthesized name). Keyed by the tree OBJECT via WeakMap so entries die
413
- * with the parse; without it every call re-scans the host subtree
414
- * (`descendantsOfType`), and the helper is called from four independent
415
- * layers per anonymous body — quadratic on anon-heavy files (old-style
416
- * listener-per-widget Java). */
417
- const javaAnonNameMemo = new WeakMap();
418
- export const synthesizeJavaAnonymousClassName = (node) => {
419
- if (!isJavaAnonymousBodyNode(node))
420
- return undefined;
620
+ /** Parse-tree-bounded memo. Sequence ordinals are built once per tree, avoiding
621
+ * a host-candidate scan for every extraction/ownership consumer. */
622
+ const javaTypeIdentityMemo = new WeakMap();
623
+ const javaHostKey = (node) => `${node.type}:${node.startIndex}`;
624
+ const javaIdentityCandidatesBelow = (root) => {
625
+ const seen = new Set();
626
+ const candidates = [];
627
+ for (const type of [
628
+ 'object_creation_expression',
629
+ 'enum_constant',
630
+ ...JAVA_NAMED_TYPE_NODE_LABELS.keys(),
631
+ ]) {
632
+ for (const candidate of root.descendantsOfType?.(type) ?? []) {
633
+ if (!isJavaAnonymousBodyNode(candidate) && !isJavaLocalTypeNode(candidate))
634
+ continue;
635
+ const key = javaHostKey(candidate);
636
+ if (seen.has(key))
637
+ continue;
638
+ seen.add(key);
639
+ candidates.push(candidate);
640
+ }
641
+ }
642
+ return candidates.sort((left, right) => left.startIndex - right.startIndex);
643
+ };
644
+ const buildJavaTypeIdentityState = (root) => {
645
+ const ordinalByStart = new Map();
646
+ const sequenceCounts = new Map();
647
+ for (const candidate of javaIdentityCandidatesBelow(root)) {
648
+ const host = nearestJavaEnclosingType(candidate);
649
+ if (host === null)
650
+ continue;
651
+ const isAnonymous = isJavaAnonymousBodyNode(candidate);
652
+ const bindingName = isAnonymous ? '' : candidate.childForFieldName?.('name')?.text;
653
+ // Anonymous types deliberately use the empty sequence key; malformed named
654
+ // declarations must not enter that sequence.
655
+ if (!isAnonymous && !bindingName)
656
+ continue;
657
+ const sequenceKey = `${javaHostKey(host)}:${bindingName}`;
658
+ const ordinal = (sequenceCounts.get(sequenceKey) ?? 0) + 1;
659
+ sequenceCounts.set(sequenceKey, ordinal);
660
+ ordinalByStart.set(candidate.startIndex, ordinal);
661
+ }
662
+ return { byStart: new Map(), ordinalByStart };
663
+ };
664
+ const javaTypeIdentityStateFor = (node) => {
421
665
  const tree = node.tree;
422
- if (tree !== undefined) {
423
- const cached = javaAnonNameMemo.get(tree)?.get(node.startIndex);
424
- if (cached !== undefined)
425
- return cached;
666
+ if (tree === undefined) {
667
+ const host = nearestJavaEnclosingType(node);
668
+ return buildJavaTypeIdentityState(host ?? node);
426
669
  }
427
- // JLS 13.1: the binary name is the IMMEDIATELY ENCLOSING TYPE's binary
428
- // name + `$N`. The enclosing type may itself be anonymous — then its
429
- // own synthesized name is the prefix (recursion, memo-bounded):
430
- // `NestHost$1$1` for an anon inside an anon, `E$1$1` for an anon
431
- // inside an enum constant body. For a named enclosing type the prefix
432
- // is the `$`-joined chain of named hosts (`EnumWrap$Mode`).
670
+ let state = javaTypeIdentityMemo.get(tree);
671
+ if (state === undefined) {
672
+ state = buildJavaTypeIdentityState(tree.rootNode ?? node);
673
+ javaTypeIdentityMemo.set(tree, state);
674
+ }
675
+ return state;
676
+ };
677
+ /** Source-type-relative binary name of a Java enclosing type, including
678
+ * synthesized local/anonymous hosts and named member-type chains. */
679
+ const javaBinaryNameOfType = (node) => {
680
+ if (isJavaAnonymousBodyNode(node) || isJavaLocalTypeNode(node)) {
681
+ return synthesizeJavaTypeIdentity(node)?.name;
682
+ }
683
+ if (!JAVA_ANON_HOST_TYPES.has(node.type))
684
+ return undefined;
685
+ const simpleName = node.childForFieldName?.('name')?.text;
686
+ if (simpleName === undefined || simpleName.length === 0)
687
+ return undefined;
433
688
  const enclosing = nearestJavaEnclosingType(node);
434
689
  if (enclosing === null)
690
+ return simpleName;
691
+ const enclosingName = javaBinaryNameOfType(enclosing);
692
+ return enclosingName === undefined ? undefined : `${enclosingName}$${simpleName}`;
693
+ };
694
+ /**
695
+ * Authoritative Java local/anonymous type identity.
696
+ *
697
+ * JLS 13.1 defines the shape and immediate-host prefix. OpenJDK javac's
698
+ * Check.localClassName allocates N independently for each
699
+ * (enclosing binary name, local simple name) pair; anonymous types use the
700
+ * empty simple name and therefore have their own sequence. Package names are
701
+ * omitted from this project identity because graph ids already include the
702
+ * file path.
703
+ */
704
+ export const synthesizeJavaTypeIdentity = (node) => {
705
+ const localLabel = JAVA_NAMED_TYPE_NODE_LABELS.get(node.type);
706
+ const isLocal = localLabel !== undefined && isJavaLocalTypeNode(node);
707
+ const isAnonymous = isJavaAnonymousBodyNode(node);
708
+ const enclosing = nearestJavaEnclosingType(node);
709
+ const memberSimpleName = !isLocal && !isAnonymous && localLabel !== undefined
710
+ ? node.childForFieldName?.('name')?.text
711
+ : undefined;
712
+ const synthesizedHostIdentity = memberSimpleName !== undefined && enclosing !== null
713
+ ? synthesizeJavaTypeIdentity(enclosing)
714
+ : undefined;
715
+ if (!isLocal && !isAnonymous && synthesizedHostIdentity === undefined)
435
716
  return undefined;
436
- let prefix;
437
- if (isJavaAnonymousBodyNode(enclosing)) {
438
- const enclosingName = synthesizeJavaAnonymousClassName(enclosing);
439
- if (enclosingName === undefined)
440
- return undefined;
441
- prefix = enclosingName;
442
- }
443
- else {
444
- const hostNames = [];
445
- let cursor = enclosing;
446
- let iterations = 0;
447
- while (cursor) {
448
- if (++iterations > MAX_ENCLOSING_WALK_ITERATIONS)
449
- return undefined;
450
- if (JAVA_ANON_HOST_TYPES.has(cursor.type)) {
451
- const hostName = cursor.childForFieldName?.('name')?.text;
452
- if (hostName === undefined || hostName.length === 0)
453
- return undefined;
454
- hostNames.unshift(hostName);
455
- }
456
- cursor = cursor.parent;
457
- }
458
- prefix = hostNames.join('$');
459
- }
460
- // All anonymous bodies (both shapes) whose immediately enclosing TYPE
461
- // is THIS one, in source order. `descendantsOfType` over the subtree
462
- // also finds bodies belonging to nested enclosing types — filter them
463
- // out by re-deriving each candidate's own enclosing type.
464
- const candidates = [
465
- ...(enclosing.descendantsOfType?.('object_creation_expression') ?? []),
466
- ...(enclosing.descendantsOfType?.('enum_constant') ?? []),
467
- ]
468
- .filter(isJavaAnonymousBodyNode)
469
- .filter((c) => {
470
- const host = nearestJavaEnclosingType(c);
471
- return (host !== null && host.startIndex === enclosing.startIndex && host.type === enclosing.type);
472
- })
473
- .sort((a, b) => a.startIndex - b.startIndex);
474
- if (tree !== undefined) {
475
- let byStart = javaAnonNameMemo.get(tree);
476
- if (byStart === undefined) {
477
- byStart = new Map();
478
- javaAnonNameMemo.set(tree, byStart);
479
- }
480
- for (let i = 0; i < candidates.length; i++) {
481
- byStart.set(candidates[i].startIndex, `${prefix}$${i + 1}`);
482
- }
483
- return byStart.get(node.startIndex);
717
+ if (enclosing === null)
718
+ return undefined;
719
+ const state = javaTypeIdentityStateFor(node);
720
+ const cached = state.byStart.get(node.startIndex);
721
+ if (cached !== undefined)
722
+ return cached;
723
+ const prefix = javaBinaryNameOfType(enclosing);
724
+ if (prefix === undefined)
725
+ return undefined;
726
+ if (memberSimpleName !== undefined) {
727
+ const identity = {
728
+ name: `${prefix}$${memberSimpleName}`,
729
+ label: localLabel,
730
+ bindingName: memberSimpleName,
731
+ };
732
+ state.byStart.set(node.startIndex, identity);
733
+ return identity;
484
734
  }
485
- const index = candidates.findIndex((c) => c.startIndex === node.startIndex);
486
- if (index === -1)
735
+ const bindingName = isLocal ? node.childForFieldName?.('name')?.text : undefined;
736
+ if (isLocal && !bindingName)
487
737
  return undefined;
488
- return `${prefix}$${index + 1}`;
738
+ const ordinal = state.ordinalByStart.get(node.startIndex);
739
+ if (ordinal === undefined)
740
+ return undefined;
741
+ const identity = {
742
+ name: `${prefix}$${ordinal}${bindingName ?? ''}`,
743
+ label: isAnonymous ? 'Class' : localLabel,
744
+ ...(bindingName === undefined ? {} : { bindingName }),
745
+ };
746
+ state.byStart.set(node.startIndex, identity);
747
+ return identity;
489
748
  };
490
749
  export const findEnclosingClassInfo = (node, filePath, resolveEnclosingOwner,
491
750
  /**
@@ -528,20 +787,26 @@ getQualifiedOwnerName) => {
528
787
  }
529
788
  }
530
789
  }
531
- // Go: type_declaration wrapping a struct_type (type User struct { ... })
532
- if (current.type === 'type_declaration') {
533
- const typeSpec = current.children?.find((c) => c.type === 'type_spec');
534
- if (typeSpec) {
535
- const typeBody = typeSpec.childForFieldName?.('type');
536
- if (typeBody?.type === 'struct_type' || typeBody?.type === 'interface_type') {
537
- const nameNode = typeSpec.childForFieldName?.('name');
538
- if (nameNode) {
539
- const label = typeBody.type === 'struct_type' ? 'Struct' : 'Interface';
540
- return {
541
- classId: generateId(label, `${filePath}:${nameNode.text}`),
542
- className: nameNode.text,
543
- };
544
- }
790
+ // Go: the `type_spec` IS the declared type (`type User struct { ... }`, and
791
+ // one per member of a grouped `type ( A struct{…}; B struct{…} )` block).
792
+ //
793
+ // Matched here rather than on the enclosing `type_declaration` (#2837): this
794
+ // walk climbs `node.parent`, so it passes THROUGH the containing spec on its
795
+ // way up from any member, and the structure it already has is the answer.
796
+ // Keying on the wrapper instead meant picking one spec out of several with
797
+ // no reference point — which filed every member of a grouped block under its
798
+ // FIRST struct, so two same-named fields minted one id and first-write-wins
799
+ // dropped the second.
800
+ if (current.type === 'type_spec') {
801
+ const typeBody = current.childForFieldName?.('type');
802
+ if (typeBody?.type === 'struct_type' || typeBody?.type === 'interface_type') {
803
+ const nameNode = current.childForFieldName?.('name');
804
+ if (nameNode) {
805
+ const label = typeBody.type === 'struct_type' ? 'Struct' : 'Interface';
806
+ return {
807
+ classId: generateId(label, `${filePath}:${nameNode.text}`),
808
+ className: nameNode.text,
809
+ };
545
810
  }
546
811
  }
547
812
  }
@@ -553,12 +818,12 @@ getQualifiedOwnerName) => {
553
818
  // enum constant, and every C# `object_creation_expression`), so the
554
819
  // walk continues unchanged for those — including on to
555
820
  // `enum_declaration`, which sits in CLASS_CONTAINER_TYPES below.
556
- if (current.type === 'object_creation_expression' || current.type === 'enum_constant') {
557
- const anonName = synthesizeJavaAnonymousClassName(current);
558
- if (anonName !== undefined) {
821
+ if (isJavaAnonymousBodyNode(current) || JAVA_ANON_HOST_TYPES.has(current.type)) {
822
+ const identity = synthesizeJavaTypeIdentity(current);
823
+ if (identity !== undefined) {
559
824
  return {
560
- classId: generateId('Class', `${filePath}:${anonName}`),
561
- className: anonName,
825
+ classId: generateId(identity.label, `${filePath}:${identity.name}`),
826
+ className: identity.name,
562
827
  };
563
828
  }
564
829
  }
@@ -715,6 +980,31 @@ getQualifiedOwnerName) => {
715
980
  }
716
981
  return null;
717
982
  };
983
+ /**
984
+ * True when an object-literal member is contained by an array before reaching
985
+ * another callable or class boundary.
986
+ *
987
+ * An array does not provide a stable named owner for its elements, so members
988
+ * below one cannot use `<binding>.<member>` identity or ownership. They still
989
+ * need distinct graph identities, however; callers use this predicate to opt
990
+ * into source-position qualification while keeping ownership suppressed.
991
+ */
992
+ export const isArrayContainedObjectLiteralMember = (node) => {
993
+ let current = node;
994
+ let sawObject = false;
995
+ while (current) {
996
+ if (current.type === 'object')
997
+ sawObject = true;
998
+ if (current.type === 'array' && sawObject)
999
+ return true;
1000
+ if (current !== node &&
1001
+ (FUNCTION_NODE_TYPES.has(current.type) || CLASS_CONTAINER_TYPES.has(current.type))) {
1002
+ return false;
1003
+ }
1004
+ current = current.parent;
1005
+ }
1006
+ return false;
1007
+ };
718
1008
  /**
719
1009
  * Block-statement AST types that disqualify an object-literal binding from
720
1010
  * carrying a HAS_METHOD edge. A `const` declared inside one of these is block-
@@ -763,7 +1053,89 @@ const BLOCK_SCOPE_BOUNDARY_TYPES = new Set([
763
1053
  * ancestor also returns null (catches block-scoped declarations inside
764
1054
  * top-level `if`/`for`/`try`/etc., which cannot be imported).
765
1055
  */
766
- export const findObjectLiteralBindingInfo = (node, filePath) => {
1056
+ /**
1057
+ * Owner for the keys of an ANONYMOUS object literal in return position (R3-4).
1058
+ *
1059
+ * `return { symbol, score, wickRatio, … }` binds to nothing, so its keys had no
1060
+ * anchor and could not be qualified — which on the reporting repo left the
1061
+ * central payload of the signal pipeline, ~25 fields, entirely unqueryable.
1062
+ * There are 437 such sites in one backend directory, so this is the dominant
1063
+ * shape, not an edge case.
1064
+ *
1065
+ * The enclosing FUNCTION is the honest owner: the literal is that function's
1066
+ * return shape, which is a contract its callers consume. Qualifying by it keeps
1067
+ * two functions returning the same key name as two distinct nodes, exactly as
1068
+ * `ownerName` does for variable-bound literals.
1069
+ *
1070
+ * Returns null when the literal is not DIRECTLY returned (a nested literal, or
1071
+ * one inside a callback several frames down), because then the enclosing
1072
+ * function is not what the object describes.
1073
+ */
1074
+ /**
1075
+ * True when this definition node is a key of a literal in RETURN position.
1076
+ *
1077
+ * Deliberately independent of whether an OWNER NAME could be derived. The two
1078
+ * are different questions, and conflating them mislabels the anonymous case:
1079
+ * `[function (row) { return { k: row.x }; }]` yields no name to qualify by, so
1080
+ * the owner lookup returns null — but the key is still a return shape, and
1081
+ * flagging it by owner-presence would leave it looking like a DECLARED anchor
1082
+ * and let it outrank a real declaration during narrowing.
1083
+ */
1084
+ export const isReturnShapeProperty = (node) => {
1085
+ let current = node;
1086
+ let objectDepth = 0;
1087
+ while (current && objectDepth === 0) {
1088
+ if (current.type === 'object')
1089
+ objectDepth = 1;
1090
+ else if (FUNCTION_NODE_TYPES.has(current.type))
1091
+ return false;
1092
+ else
1093
+ current = current.parent;
1094
+ }
1095
+ return current?.parent?.type === 'return_statement';
1096
+ };
1097
+ export const findReturnShapeOwnerInfo = (node, filePath) => {
1098
+ // Walk to the literal this key belongs to; bail if it is nested inside
1099
+ // another object, whose shape it describes instead.
1100
+ let current = node;
1101
+ let objectDepth = 0;
1102
+ while (current && objectDepth === 0) {
1103
+ if (current.type === 'object')
1104
+ objectDepth = 1;
1105
+ else if (FUNCTION_NODE_TYPES.has(current.type))
1106
+ return null;
1107
+ else
1108
+ current = current.parent;
1109
+ }
1110
+ if (!current)
1111
+ return null;
1112
+ const literal = current;
1113
+ if (literal.parent?.type !== 'return_statement')
1114
+ return null;
1115
+ // The nearest enclosing function-like, and its name. An anonymous function
1116
+ // (a callback, an IIFE) gives nothing to qualify by, so those stay
1117
+ // unanchored rather than colliding on a shared empty owner.
1118
+ let fn = literal.parent.parent;
1119
+ while (fn && !FUNCTION_NODE_TYPES.has(fn.type))
1120
+ fn = fn.parent;
1121
+ if (!fn)
1122
+ return null;
1123
+ const nameNode = fn.childForFieldName?.('name');
1124
+ if (nameNode?.type === 'identifier' || nameNode?.type === 'property_identifier') {
1125
+ return { ownerName: nameNode.text };
1126
+ }
1127
+ // `const formatAlert = (…) => ({ … })` and `const f = function () {}`: the
1128
+ // name is on the declarator, not the function.
1129
+ const declarator = fn.parent;
1130
+ if (declarator?.type === 'variable_declarator') {
1131
+ const declName = declarator.childForFieldName?.('name');
1132
+ if (declName?.type === 'identifier')
1133
+ return { ownerName: declName.text };
1134
+ }
1135
+ void filePath;
1136
+ return null;
1137
+ };
1138
+ export const findObjectLiteralBindingInfo = (node, filePath, options) => {
767
1139
  // ── Phase A: walk up from node, count `object` ancestors, find declarator
768
1140
  let current = node;
769
1141
  let objectDepth = 0;
@@ -772,6 +1144,12 @@ export const findObjectLiteralBindingInfo = (node, filePath) => {
772
1144
  if (current.type === 'object') {
773
1145
  objectDepth += 1;
774
1146
  }
1147
+ if (current !== node && current.type === 'array') {
1148
+ // `const handlers = [{ run() {} }]` has no `handlers.run` member.
1149
+ // Crossing the array would mint a confident but false owner edge; keep
1150
+ // the existing conservative under-approximation used for nested objects.
1151
+ return null;
1152
+ }
775
1153
  if (current.type === 'variable_declarator' && objectDepth >= 1) {
776
1154
  if (objectDepth > 1) {
777
1155
  // Method belongs to a nested object literal; safe under-approximation.
@@ -812,8 +1190,195 @@ export const findObjectLiteralBindingInfo = (node, filePath) => {
812
1190
  const ownerLabel = declaration?.type === 'variable_declaration' ? 'Variable' : 'Const';
813
1191
  return {
814
1192
  ownerId: generateId(ownerLabel, `${filePath}:${nameNode.text}`),
1193
+ ...(options?.includeOwnerName === true ? { ownerName: nameNode.text } : {}),
815
1194
  };
816
1195
  };
1196
+ /**
1197
+ * Find the owner of a member assigned by `<Owner>.prototype.<member> = fn`
1198
+ * (#2723 follow-up).
1199
+ *
1200
+ * Sibling of {@link findObjectLiteralBindingInfo}: same seam, same return
1201
+ * shape, different syntax. There the owner is the variable the literal is
1202
+ * bound to; here it is the identifier to the left of `.prototype`.
1203
+ *
1204
+ * The owner label is read from the file's own module-scope declaration, so the
1205
+ * edge points at the node that actually exists — `function Foo() {}` is a
1206
+ * `Function` node, `class Foo {}` is a `Class` node. When the file declares no
1207
+ * such name (the constructor lives in another module) no owner is claimed:
1208
+ * a HAS_METHOD edge to a fabricated node is worse than a top-level Method.
1209
+ */
1210
+ export const findMemberAssignmentOwnerInfo = (node, filePath) => {
1211
+ const ownerName = prototypeAssignmentOwnerName(node) ?? thisAssignmentOwnerName(node);
1212
+ if (ownerName === null)
1213
+ return null;
1214
+ const root = node.tree?.rootNode;
1215
+ if (!root)
1216
+ return null;
1217
+ const ownerLabel = prototypeOwnerLabel(root, ownerName);
1218
+ if (ownerLabel === null)
1219
+ return null;
1220
+ return { ownerId: generateId(ownerLabel, `${filePath}:${ownerName}`), ownerName };
1221
+ };
1222
+ /** Right-hand-side node types that make an assignment a callable binding. */
1223
+ const CALLABLE_ASSIGNMENT_VALUE_TYPES = new Set([
1224
+ 'arrow_function',
1225
+ 'function_expression',
1226
+ 'generator_function',
1227
+ ]);
1228
+ /**
1229
+ * The receiver name of a `<Owner>.prototype.<member> = <function>` assignment,
1230
+ * or null when `assignment` is not that shape.
1231
+ *
1232
+ * Only a bare identifier owner is accepted. `a.b.prototype.c = …` and
1233
+ * `getClass().prototype.c = …` name an owner this layer cannot resolve to a
1234
+ * definition, so they are left alone rather than attributed to a guess.
1235
+ */
1236
+ export const prototypeAssignmentOwnerName = (assignment) => {
1237
+ const left = callableAssignmentTarget(assignment);
1238
+ if (left === null)
1239
+ return null;
1240
+ const protoRef = left.childForFieldName('object');
1241
+ if (protoRef === null || protoRef.type !== 'member_expression')
1242
+ return null;
1243
+ if (protoRef.childForFieldName('property')?.text !== 'prototype')
1244
+ return null;
1245
+ const owner = protoRef.childForFieldName('object');
1246
+ if (owner === null || owner.type !== 'identifier')
1247
+ return null;
1248
+ return owner.text;
1249
+ };
1250
+ /** The `member_expression` being assigned a function value, or null. */
1251
+ const callableAssignmentTarget = (assignment) => {
1252
+ if (assignment.type !== 'assignment_expression')
1253
+ return null;
1254
+ const right = assignment.childForFieldName('right');
1255
+ if (right === null || !CALLABLE_ASSIGNMENT_VALUE_TYPES.has(right.type))
1256
+ return null;
1257
+ const left = assignment.childForFieldName('left');
1258
+ return left !== null && left.type === 'member_expression' ? left : null;
1259
+ };
1260
+ /**
1261
+ * The constructor function that owns a `this.member = <function>` assignment,
1262
+ * or null when there is none (module top level, or an owner this layer cannot
1263
+ * name).
1264
+ *
1265
+ * Only a `function_declaration` counts. An `arrow_function` does NOT bind its
1266
+ * own `this` (ECMA-262 gives it `[[ThisMode]] = lexical`), so the walk passes
1267
+ * through arrows to the function that actually binds the receiver — the same
1268
+ * rule `@receiver-owner.this` encodes in the scope queries (#2701). A class
1269
+ * method never reaches here: parse-worker resolves its owner from the
1270
+ * enclosing class container first.
1271
+ */
1272
+ export const thisAssignmentOwnerName = (assignment) => {
1273
+ const left = callableAssignmentTarget(assignment);
1274
+ if (left === null)
1275
+ return null;
1276
+ if (left.childForFieldName('object')?.type !== 'this')
1277
+ return null;
1278
+ for (let anc = assignment.parent; anc !== null; anc = anc.parent) {
1279
+ if (anc.type === 'arrow_function')
1280
+ continue;
1281
+ if (anc.type === 'function_declaration') {
1282
+ const name = anc.childForFieldName('name');
1283
+ return name !== null && name.type === 'identifier' ? name.text : null;
1284
+ }
1285
+ // Any other receiver-binding form (function_expression, method_definition,
1286
+ // generator) owns the `this` but gives this layer no module-scope name to
1287
+ // point an owner edge at.
1288
+ if (FUNCTION_NODE_TYPES.has(anc.type) || CLASS_CONTAINER_TYPES.has(anc.type))
1289
+ return null;
1290
+ }
1291
+ return null;
1292
+ };
1293
+ /**
1294
+ * True when `node` is a `X.prototype.Y = <function>` or `this.Y = <function>`
1295
+ * assignment — i.e. a callable MEMBER rather than a free function.
1296
+ *
1297
+ * Takes the ASSIGNMENT node, because that is what the `@definition.function`
1298
+ * capture is anchored on and therefore what `provider.labelOverride` receives.
1299
+ */
1300
+ export const isPrototypeMemberAssignmentNode = (node) => prototypeAssignmentOwnerName(node) !== null || isThisMemberAssignmentNode(node);
1301
+ /**
1302
+ * True when `node` is `module.exports = <anonymous function>` (#2723).
1303
+ *
1304
+ * The whole module IS the callable, so there is no property to take a name
1305
+ * from and the caller supplies a file-derived one. A NAMED function expression
1306
+ * is excluded — its own name is captured directly and is more informative.
1307
+ */
1308
+ /**
1309
+ * True when `node` is `module.exports = <function>`, named or anonymous — the
1310
+ * CommonJS default export, where the whole module IS the callable.
1311
+ *
1312
+ * `exports = fn` is deliberately NOT this shape: reassigning the `exports`
1313
+ * binding does not export anything in CommonJS, it only breaks the alias to
1314
+ * `module.exports`.
1315
+ */
1316
+ export const isCjsDefaultExportAssignment = (node) => {
1317
+ if (node.type !== 'assignment_expression')
1318
+ return false;
1319
+ const right = node.childForFieldName('right');
1320
+ if (right === null || !CALLABLE_ASSIGNMENT_VALUE_TYPES.has(right.type))
1321
+ return false;
1322
+ const left = node.childForFieldName('left');
1323
+ if (left === null || left.type !== 'member_expression')
1324
+ return false;
1325
+ return (left.childForFieldName('object')?.text === 'module' &&
1326
+ left.childForFieldName('property')?.text === 'exports');
1327
+ };
1328
+ /** True when `node` is a `this.Y = <function>` assignment, at any nesting. */
1329
+ export const isThisMemberAssignmentNode = (node) => {
1330
+ const left = callableAssignmentTarget(node);
1331
+ return left !== null && left.childForFieldName('object')?.type === 'this';
1332
+ };
1333
+ /**
1334
+ * The label the owner named by {@link prototypeAssignmentOwnerName} carries in
1335
+ * the graph, so the owner edge points at the node that actually exists.
1336
+ * Returns null when the file declares no such module-scope name.
1337
+ */
1338
+ const prototypeOwnerLabel = (root, ownerName) => {
1339
+ for (const child of root.namedChildren) {
1340
+ const decl = child.type === 'export_statement' ? child.childForFieldName('declaration') : child;
1341
+ if (decl === null)
1342
+ continue;
1343
+ if (decl.childForFieldName('name')?.text === ownerName) {
1344
+ if (decl.type === 'class_declaration')
1345
+ return 'Class';
1346
+ if (decl.type === 'function_declaration' || decl.type === 'generator_function_declaration')
1347
+ return 'Function';
1348
+ }
1349
+ // `var Foo = function () {}` / `const Foo = () => {}` / `const Foo = class {}`.
1350
+ // The dominant pre-ES6 constructor form, and the population this whole
1351
+ // change targets. Without it `prototypeOwnerLabel` returned null, the
1352
+ // member fell back to an UNQUALIFIED `Method:<file>:<member>` id, and two
1353
+ // constructors defining the same member name in one file collapsed onto a
1354
+ // single node with no owner edges at all (#2729 review F6).
1355
+ if (!VARIABLE_DECLARATION_NODE_TYPES.has(decl.type))
1356
+ continue;
1357
+ for (const declarator of decl.namedChildren) {
1358
+ if (declarator.type !== 'variable_declarator')
1359
+ continue;
1360
+ if (declarator.childForFieldName('name')?.text !== ownerName)
1361
+ continue;
1362
+ const value = declarator.childForFieldName('value');
1363
+ if (value === null)
1364
+ continue;
1365
+ // Only a callable value is claimed. A closure binding reliably emits
1366
+ // `Function:<file>:<name>` (the #2687/#2693 convention), so the owner id
1367
+ // resolves to a node that exists. A class EXPRESSION or a require()-bound
1368
+ // value names an owner whose node label this layer cannot predict —
1369
+ // claim none rather than point an edge at a node that may not exist,
1370
+ // which is the same defect class this fix exists to remove.
1371
+ if (CALLABLE_ASSIGNMENT_VALUE_TYPES.has(value.type))
1372
+ return 'Function';
1373
+ }
1374
+ }
1375
+ return null;
1376
+ };
1377
+ /** Declaration nodes carrying `variable_declarator` children (JS/TS). */
1378
+ const VARIABLE_DECLARATION_NODE_TYPES = new Set([
1379
+ 'lexical_declaration',
1380
+ 'variable_declaration',
1381
+ ]);
817
1382
  /** Convenience wrapper: returns just the class ID string (backward compat). */
818
1383
  export const findEnclosingClassId = (node, filePath) => {
819
1384
  return findEnclosingClassInfo(node, filePath)?.classId ?? null;
@@ -937,6 +1502,19 @@ export const LOCAL_SCOPE_BODY_NODE_TYPES = new Set([...FUNCTION_NODE_TYPES]
937
1502
  'computed_setter', // Swift: set { }
938
1503
  'computed_modify', // Swift: _modify { }
939
1504
  ]));
1505
+ /**
1506
+ * Callable node types whose grammar splits the body off into a SIBLING node, so
1507
+ * the callable is never an ancestor of the code inside it (Dart
1508
+ * `function_signature` / `method_signature`).
1509
+ *
1510
+ * Derived, not listed, so it cannot drift from the two sets that define it:
1511
+ * `LOCAL_SCOPE_BODY_NODE_TYPES` is `FUNCTION_NODE_TYPES` minus exactly the bare
1512
+ * signature types, so the difference IS the split-signature set.
1513
+ *
1514
+ * Must stay BELOW `LOCAL_SCOPE_BODY_NODE_TYPES` — reading it earlier hits the
1515
+ * temporal dead zone and throws at module load.
1516
+ */
1517
+ export const SPLIT_SIGNATURE_NODE_TYPES = new Set([...FUNCTION_NODE_TYPES].filter((t) => !LOCAL_SCOPE_BODY_NODE_TYPES.has(t)));
940
1518
  // ============================================================================
941
1519
  // Generic AST traversal helpers (shared by parse-worker + php-helpers)
942
1520
  // ============================================================================
@@ -975,12 +1553,11 @@ export function findChild(node, type) {
975
1553
  }
976
1554
  return null;
977
1555
  }
978
- /** Remove bidi-override and zero-width control characters. Doc text is
979
- * attacker-influenced (any indexed repo) and is returned verbatim to MCP
980
- * clients, so strip Trojan-Source-style hidden controls from the description
981
- * before it leaves the extractor (#2286 review). Scoped to the doc-comment path
982
- * only — global `sanitizeUTF8` is intentionally untouched. */
983
- const stripBidiAndZeroWidth = (text) => Array.from(text)
1556
+ /** Remove bidi-override and zero-width control characters from attacker-
1557
+ * influenced repository text before it is exposed through graph descriptions
1558
+ * or MCP output (#2286). Global `sanitizeUTF8` intentionally remains focused
1559
+ * on encoding/control-character validity. */
1560
+ export const stripBidiAndZeroWidth = (text) => Array.from(text)
984
1561
  .filter((ch) => {
985
1562
  const c = ch.codePointAt(0) ?? 0;
986
1563
  // Bidi overrides/isolates (U+202A–202E, U+2066–2069), zero-width