gitnexus 1.6.10-rc.99 → 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 (775) 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/cluster-enricher.js +8 -4
  126. package/dist/core/ingestion/community-processor.d.ts +21 -3
  127. package/dist/core/ingestion/community-processor.js +81 -82
  128. package/dist/core/ingestion/di-extractors/index.d.ts +9 -33
  129. package/dist/core/ingestion/di-extractors/spring.d.ts +1 -1
  130. package/dist/core/ingestion/di-extractors/spring.js +8 -1
  131. package/dist/core/ingestion/di-extractors/types.d.ts +60 -0
  132. package/dist/core/ingestion/di-extractors/types.js +15 -0
  133. package/dist/core/ingestion/filesystem-walker.js +30 -14
  134. package/dist/core/ingestion/finalize-orchestrator.js +1 -0
  135. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +6 -0
  136. package/dist/core/ingestion/frameworks/spring/analysis-features.js +35 -1
  137. package/dist/core/ingestion/frameworks/spring/annotation-arguments.d.ts +13 -0
  138. package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +227 -0
  139. package/dist/core/ingestion/frameworks/spring/aop-candidates.d.ts +15 -0
  140. package/dist/core/ingestion/frameworks/spring/aop-candidates.js +85 -0
  141. package/dist/core/ingestion/frameworks/spring/aop.d.ts +118 -0
  142. package/dist/core/ingestion/frameworks/spring/aop.js +476 -0
  143. package/dist/core/ingestion/frameworks/spring/auto-configuration.d.ts +8 -0
  144. package/dist/core/ingestion/frameworks/spring/auto-configuration.js +16 -0
  145. package/dist/core/ingestion/frameworks/spring/bean-catalog.js +1 -0
  146. package/dist/core/ingestion/frameworks/spring/bean-factories.d.ts +33 -0
  147. package/dist/core/ingestion/frameworks/spring/bean-factories.js +65 -0
  148. package/dist/core/ingestion/frameworks/spring/conditionals.d.ts +25 -0
  149. package/dist/core/ingestion/frameworks/spring/conditionals.js +319 -0
  150. package/dist/core/ingestion/frameworks/spring/di-metadata.d.ts +3 -0
  151. package/dist/core/ingestion/frameworks/spring/di-metadata.js +162 -13
  152. package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +28 -0
  153. package/dist/core/ingestion/frameworks/spring/non-http-handlers.js +152 -0
  154. package/dist/core/ingestion/frameworks/spring/resource-injection.d.ts +5 -0
  155. package/dist/core/ingestion/frameworks/spring/resource-injection.js +91 -0
  156. package/dist/core/ingestion/import-resolvers/configs/csharp.js +5 -1
  157. package/dist/core/ingestion/import-resolvers/configs/swift.js +13 -0
  158. package/dist/core/ingestion/import-resolvers/csharp.d.ts +9 -1
  159. package/dist/core/ingestion/import-resolvers/csharp.js +234 -27
  160. package/dist/core/ingestion/import-resolvers/go.d.ts +11 -1
  161. package/dist/core/ingestion/import-resolvers/go.js +44 -17
  162. package/dist/core/ingestion/import-resolvers/jvm.d.ts +2 -2
  163. package/dist/core/ingestion/import-resolvers/node-workspace-packages.d.ts +90 -0
  164. package/dist/core/ingestion/import-resolvers/node-workspace-packages.js +429 -0
  165. package/dist/core/ingestion/import-resolvers/package-dir-index.d.ts +124 -0
  166. package/dist/core/ingestion/import-resolvers/package-dir-index.js +223 -0
  167. package/dist/core/ingestion/import-resolvers/pass-cache.d.ts +50 -0
  168. package/dist/core/ingestion/import-resolvers/pass-cache.js +60 -0
  169. package/dist/core/ingestion/import-resolvers/per-file-set.d.ts +71 -0
  170. package/dist/core/ingestion/import-resolvers/per-file-set.js +11 -0
  171. package/dist/core/ingestion/import-resolvers/php.d.ts +1 -1
  172. package/dist/core/ingestion/import-resolvers/php.js +65 -19
  173. package/dist/core/ingestion/import-resolvers/python-file-index.d.ts +201 -0
  174. package/dist/core/ingestion/import-resolvers/python-file-index.js +302 -0
  175. package/dist/core/ingestion/import-resolvers/python.js +25 -6
  176. package/dist/core/ingestion/import-resolvers/ruby.d.ts +1 -1
  177. package/dist/core/ingestion/import-resolvers/rust.d.ts +2 -2
  178. package/dist/core/ingestion/import-resolvers/standard.d.ts +1 -1
  179. package/dist/core/ingestion/import-resolvers/types.d.ts +1 -12
  180. package/dist/core/ingestion/import-resolvers/utils.d.ts +65 -6
  181. package/dist/core/ingestion/import-resolvers/utils.js +215 -36
  182. package/dist/core/ingestion/import-resolvers/workspace-file-index.d.ts +72 -0
  183. package/dist/core/ingestion/import-resolvers/workspace-file-index.js +58 -0
  184. package/dist/core/ingestion/language-config.d.ts +29 -1
  185. package/dist/core/ingestion/language-config.js +110 -35
  186. package/dist/core/ingestion/language-provider.d.ts +209 -7
  187. package/dist/core/ingestion/language-provider.js +37 -0
  188. package/dist/core/ingestion/languages/c/captures.js +7 -0
  189. package/dist/core/ingestion/languages/c/import-target.js +12 -16
  190. package/dist/core/ingestion/languages/c/scope-resolver.js +20 -19
  191. package/dist/core/ingestion/languages/c/static-linkage.js +12 -16
  192. package/dist/core/ingestion/languages/c-cpp.js +13 -0
  193. package/dist/core/ingestion/languages/cobol/scope-resolver.js +27 -20
  194. package/dist/core/ingestion/languages/cobol.js +13 -0
  195. package/dist/core/ingestion/languages/cpp/adl.d.ts +2 -2
  196. package/dist/core/ingestion/languages/cpp/adl.js +67 -44
  197. package/dist/core/ingestion/languages/cpp/captures.js +14 -2
  198. package/dist/core/ingestion/languages/cpp/file-local-linkage.js +11 -15
  199. package/dist/core/ingestion/languages/cpp/inline-namespaces.d.ts +28 -8
  200. package/dist/core/ingestion/languages/cpp/inline-namespaces.js +242 -68
  201. package/dist/core/ingestion/languages/cpp/interpret.d.ts +2 -0
  202. package/dist/core/ingestion/languages/cpp/interpret.js +126 -6
  203. package/dist/core/ingestion/languages/cpp/query.js +106 -0
  204. package/dist/core/ingestion/languages/cpp/scope-resolver.js +48 -20
  205. package/dist/core/ingestion/languages/csharp/accessor-unwrap.d.ts +2 -15
  206. package/dist/core/ingestion/languages/csharp/accessor-unwrap.js +18 -10
  207. package/dist/core/ingestion/languages/csharp/captures.js +19 -0
  208. package/dist/core/ingestion/languages/csharp/import-target.js +46 -72
  209. package/dist/core/ingestion/languages/csharp/namespace-siblings.js +5 -1
  210. package/dist/core/ingestion/languages/csharp/query.js +25 -5
  211. package/dist/core/ingestion/languages/csharp/scope-resolver.js +75 -2
  212. package/dist/core/ingestion/languages/dart/captures.d.ts +10 -0
  213. package/dist/core/ingestion/languages/dart/captures.js +598 -16
  214. package/dist/core/ingestion/languages/dart/import-target.js +32 -9
  215. package/dist/core/ingestion/languages/dart/index.d.ts +1 -1
  216. package/dist/core/ingestion/languages/dart/index.js +1 -1
  217. package/dist/core/ingestion/languages/dart/query.js +98 -1
  218. package/dist/core/ingestion/languages/dart/scope-resolver.js +14 -3
  219. package/dist/core/ingestion/languages/dart/simple-hooks.js +9 -0
  220. package/dist/core/ingestion/languages/dart.js +6 -1
  221. package/dist/core/ingestion/languages/go/captures.js +108 -3
  222. package/dist/core/ingestion/languages/go/generic-type-parameters.d.ts +31 -0
  223. package/dist/core/ingestion/languages/go/generic-type-parameters.js +140 -0
  224. package/dist/core/ingestion/languages/go/import-target.d.ts +3 -10
  225. package/dist/core/ingestion/languages/go/import-target.js +34 -30
  226. package/dist/core/ingestion/languages/go/index.d.ts +1 -1
  227. package/dist/core/ingestion/languages/go/interface-impls.d.ts +9 -1
  228. package/dist/core/ingestion/languages/go/interface-impls.js +693 -87
  229. package/dist/core/ingestion/languages/go/interpret.d.ts +2 -0
  230. package/dist/core/ingestion/languages/go/interpret.js +22 -8
  231. package/dist/core/ingestion/languages/go/method-owners.js +31 -12
  232. package/dist/core/ingestion/languages/go/package-clause.d.ts +46 -0
  233. package/dist/core/ingestion/languages/go/package-clause.js +75 -0
  234. package/dist/core/ingestion/languages/go/package-siblings.js +7 -11
  235. package/dist/core/ingestion/languages/go/query.js +56 -3
  236. package/dist/core/ingestion/languages/go/scope-resolver.js +39 -0
  237. package/dist/core/ingestion/languages/go.js +9 -0
  238. package/dist/core/ingestion/languages/java/analysis-features.d.ts +4 -0
  239. package/dist/core/ingestion/languages/java/analysis-features.js +12 -0
  240. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +12 -0
  241. package/dist/core/ingestion/languages/java/capture-side-channel.js +48 -0
  242. package/dist/core/ingestion/languages/java/captures.js +77 -32
  243. package/dist/core/ingestion/languages/java/import-target.d.ts +49 -9
  244. package/dist/core/ingestion/languages/java/import-target.js +68 -88
  245. package/dist/core/ingestion/languages/java/interpret.js +3 -2
  246. package/dist/core/ingestion/languages/java/module-resolution.d.ts +62 -0
  247. package/dist/core/ingestion/languages/java/module-resolution.js +142 -0
  248. package/dist/core/ingestion/languages/java/query.js +15 -3
  249. package/dist/core/ingestion/languages/java/record-components.d.ts +14 -0
  250. package/dist/core/ingestion/languages/java/record-components.js +185 -0
  251. package/dist/core/ingestion/languages/java/scope-resolver.js +10 -2
  252. package/dist/core/ingestion/languages/java/spring-aop.d.ts +12 -0
  253. package/dist/core/ingestion/languages/java/spring-aop.js +49 -0
  254. package/dist/core/ingestion/languages/java/spring-conditionals.d.ts +11 -0
  255. package/dist/core/ingestion/languages/java/spring-conditionals.js +48 -0
  256. package/dist/core/ingestion/languages/java/spring-di.d.ts +4 -1
  257. package/dist/core/ingestion/languages/java/spring-di.js +41 -9
  258. package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +7 -0
  259. package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +32 -0
  260. package/dist/core/ingestion/languages/java.js +94 -3
  261. package/dist/core/ingestion/languages/javascript/captures.d.ts +6 -1
  262. package/dist/core/ingestion/languages/javascript/captures.js +262 -4
  263. package/dist/core/ingestion/languages/javascript/import-target.d.ts +17 -21
  264. package/dist/core/ingestion/languages/javascript/import-target.js +24 -41
  265. package/dist/core/ingestion/languages/javascript/index.d.ts +54 -5
  266. package/dist/core/ingestion/languages/javascript/index.js +54 -5
  267. package/dist/core/ingestion/languages/javascript/query.d.ts +1 -0
  268. package/dist/core/ingestion/languages/javascript/query.js +211 -5
  269. package/dist/core/ingestion/languages/javascript/scope-resolver.js +12 -0
  270. package/dist/core/ingestion/languages/javascript/simple-hooks.js +2 -1
  271. package/dist/core/ingestion/languages/jvm/package-siblings.js +77 -9
  272. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
  273. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +48 -0
  274. package/dist/core/ingestion/languages/kotlin/captures.js +43 -1
  275. package/dist/core/ingestion/languages/kotlin/import-target.d.ts +8 -1
  276. package/dist/core/ingestion/languages/kotlin/import-target.js +20 -123
  277. package/dist/core/ingestion/languages/kotlin/index.d.ts +1 -0
  278. package/dist/core/ingestion/languages/kotlin/index.js +1 -0
  279. package/dist/core/ingestion/languages/kotlin/module-resolution.d.ts +22 -0
  280. package/dist/core/ingestion/languages/kotlin/module-resolution.js +108 -0
  281. package/dist/core/ingestion/languages/kotlin/query.js +28 -2
  282. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +23 -2
  283. package/dist/core/ingestion/languages/kotlin/spring-aop.d.ts +12 -0
  284. package/dist/core/ingestion/languages/kotlin/spring-aop.js +64 -0
  285. package/dist/core/ingestion/languages/kotlin/spring-conditionals.d.ts +12 -0
  286. package/dist/core/ingestion/languages/kotlin/spring-conditionals.js +49 -0
  287. package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +2 -0
  288. package/dist/core/ingestion/languages/kotlin/spring-di.js +60 -11
  289. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +10 -0
  290. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +41 -0
  291. package/dist/core/ingestion/languages/php/captures.d.ts +5 -0
  292. package/dist/core/ingestion/languages/php/captures.js +319 -51
  293. package/dist/core/ingestion/languages/php/import-target.d.ts +3 -4
  294. package/dist/core/ingestion/languages/php/import-target.js +192 -62
  295. package/dist/core/ingestion/languages/php/query.js +31 -0
  296. package/dist/core/ingestion/languages/python/arity-metadata.d.ts +1 -0
  297. package/dist/core/ingestion/languages/python/arity-metadata.js +1 -0
  298. package/dist/core/ingestion/languages/python/captures.js +29 -0
  299. package/dist/core/ingestion/languages/python/import-decomposer.js +22 -1
  300. package/dist/core/ingestion/languages/python/import-target.d.ts +42 -1
  301. package/dist/core/ingestion/languages/python/import-target.js +277 -91
  302. package/dist/core/ingestion/languages/python/index.d.ts +1 -1
  303. package/dist/core/ingestion/languages/python/index.js +1 -1
  304. package/dist/core/ingestion/languages/python/interpret.d.ts +52 -0
  305. package/dist/core/ingestion/languages/python/interpret.js +249 -7
  306. package/dist/core/ingestion/languages/python/query.js +9 -0
  307. package/dist/core/ingestion/languages/python/receiver-binding.d.ts +8 -6
  308. package/dist/core/ingestion/languages/python/receiver-binding.js +108 -12
  309. package/dist/core/ingestion/languages/python/scope-resolver.js +27 -4
  310. package/dist/core/ingestion/languages/python/simple-hooks.js +2 -8
  311. package/dist/core/ingestion/languages/python.js +13 -0
  312. package/dist/core/ingestion/languages/ruby/captures.js +158 -0
  313. package/dist/core/ingestion/languages/ruby/import-target.js +7 -5
  314. package/dist/core/ingestion/languages/ruby/query.js +93 -0
  315. package/dist/core/ingestion/languages/ruby/scope-resolver.js +2 -0
  316. package/dist/core/ingestion/languages/ruby/simple-hooks.d.ts +1 -1
  317. package/dist/core/ingestion/languages/ruby/simple-hooks.js +22 -1
  318. package/dist/core/ingestion/languages/rust/captures.js +39 -1
  319. package/dist/core/ingestion/languages/rust/method-owners.js +11 -1
  320. package/dist/core/ingestion/languages/rust/module-path.d.ts +126 -0
  321. package/dist/core/ingestion/languages/rust/module-path.js +214 -0
  322. package/dist/core/ingestion/languages/rust/qualified-call.d.ts +41 -0
  323. package/dist/core/ingestion/languages/rust/qualified-call.js +481 -0
  324. package/dist/core/ingestion/languages/rust/query.js +39 -6
  325. package/dist/core/ingestion/languages/rust/scope-resolver.js +21 -2
  326. package/dist/core/ingestion/languages/rust.js +17 -0
  327. package/dist/core/ingestion/languages/swift/captures.js +87 -3
  328. package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.d.ts +48 -0
  329. package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.js +253 -0
  330. package/dist/core/ingestion/languages/swift/import-target.js +4 -9
  331. package/dist/core/ingestion/languages/swift/query.js +17 -0
  332. package/dist/core/ingestion/languages/swift/receiver-binding.d.ts +8 -0
  333. package/dist/core/ingestion/languages/swift/receiver-binding.js +6 -2
  334. package/dist/core/ingestion/languages/swift.js +2 -0
  335. package/dist/core/ingestion/languages/typescript/captures.d.ts +90 -1
  336. package/dist/core/ingestion/languages/typescript/captures.js +267 -5
  337. package/dist/core/ingestion/languages/typescript/cjs-export-assignment.d.ts +134 -0
  338. package/dist/core/ingestion/languages/typescript/cjs-export-assignment.js +523 -0
  339. package/dist/core/ingestion/languages/typescript/cjs-module-exports.d.ts +54 -0
  340. package/dist/core/ingestion/languages/typescript/cjs-module-exports.js +191 -0
  341. package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.d.ts +7 -0
  342. package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.js +92 -0
  343. package/dist/core/ingestion/languages/typescript/file-candidates.d.ts +29 -0
  344. package/dist/core/ingestion/languages/typescript/file-candidates.js +70 -0
  345. package/dist/core/ingestion/languages/typescript/import-decomposer.d.ts +28 -1
  346. package/dist/core/ingestion/languages/typescript/import-decomposer.js +125 -10
  347. package/dist/core/ingestion/languages/typescript/import-target.d.ts +25 -37
  348. package/dist/core/ingestion/languages/typescript/import-target.js +24 -26
  349. package/dist/core/ingestion/languages/typescript/interpret.d.ts +21 -1
  350. package/dist/core/ingestion/languages/typescript/interpret.js +45 -5
  351. package/dist/core/ingestion/languages/typescript/module-resolution.d.ts +48 -0
  352. package/dist/core/ingestion/languages/typescript/module-resolution.js +171 -0
  353. package/dist/core/ingestion/languages/typescript/query.d.ts +1 -0
  354. package/dist/core/ingestion/languages/typescript/query.js +303 -14
  355. package/dist/core/ingestion/languages/typescript/receiver-binding.d.ts +17 -0
  356. package/dist/core/ingestion/languages/typescript/receiver-binding.js +27 -0
  357. package/dist/core/ingestion/languages/typescript/scope-resolver.js +27 -40
  358. package/dist/core/ingestion/languages/typescript/simple-hooks.d.ts +0 -10
  359. package/dist/core/ingestion/languages/typescript/simple-hooks.js +22 -22
  360. package/dist/core/ingestion/languages/typescript/tsconfig.d.ts +59 -0
  361. package/dist/core/ingestion/languages/typescript/tsconfig.js +292 -0
  362. package/dist/core/ingestion/languages/typescript.js +93 -2
  363. package/dist/core/ingestion/languages/vue/import-target.d.ts +6 -22
  364. package/dist/core/ingestion/languages/vue/import-target.js +11 -47
  365. package/dist/core/ingestion/languages/vue/scope-resolver.js +4 -2
  366. package/dist/core/ingestion/local-symbol-pruner.js +11 -11
  367. package/dist/core/ingestion/method-extractors/configs/csharp.js +1 -0
  368. package/dist/core/ingestion/method-extractors/generic.js +1 -0
  369. package/dist/core/ingestion/method-types.d.ts +16 -0
  370. package/dist/core/ingestion/pipeline-phases/di.d.ts +1 -1
  371. package/dist/core/ingestion/pipeline-phases/di.js +136 -21
  372. package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
  373. package/dist/core/ingestion/pipeline-phases/index.js +2 -0
  374. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +15 -0
  375. package/dist/core/ingestion/pipeline-phases/parse-impl.js +154 -4
  376. package/dist/core/ingestion/pipeline-phases/parse.js +5 -0
  377. package/dist/core/ingestion/pipeline-phases/processes.d.ts +3 -2
  378. package/dist/core/ingestion/pipeline-phases/processes.js +91 -6
  379. package/dist/core/ingestion/pipeline-phases/routes.js +116 -25
  380. package/dist/core/ingestion/pipeline-phases/spring-aop.d.ts +34 -0
  381. package/dist/core/ingestion/pipeline-phases/spring-aop.js +439 -0
  382. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +34 -0
  383. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +255 -0
  384. package/dist/core/ingestion/pipeline-phases/types.d.ts +7 -0
  385. package/dist/core/ingestion/pipeline.d.ts +26 -2
  386. package/dist/core/ingestion/pipeline.js +60 -11
  387. package/dist/core/ingestion/process-processor.d.ts +109 -2
  388. package/dist/core/ingestion/process-processor.js +464 -52
  389. package/dist/core/ingestion/resolve-references.d.ts +6 -1
  390. package/dist/core/ingestion/resolve-references.js +66 -6
  391. package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +8 -2
  392. package/dist/core/ingestion/route-extractors/constant-resolver.js +11 -7
  393. package/dist/core/ingestion/route-extractors/data-route-table.d.ts +40 -0
  394. package/dist/core/ingestion/route-extractors/data-route-table.js +876 -0
  395. package/dist/core/ingestion/route-extractors/dispatch-guard.d.ts +96 -0
  396. package/dist/core/ingestion/route-extractors/dispatch-guard.js +1184 -0
  397. package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +114 -0
  398. package/dist/core/ingestion/route-extractors/java-const-resolver.js +569 -0
  399. package/dist/core/ingestion/route-extractors/js-const-resolver.d.ts +192 -0
  400. package/dist/core/ingestion/route-extractors/js-const-resolver.js +1033 -0
  401. package/dist/core/ingestion/route-extractors/nest.d.ts +53 -0
  402. package/dist/core/ingestion/route-extractors/nest.js +523 -0
  403. package/dist/core/ingestion/route-extractors/spring-shared.d.ts +11 -0
  404. package/dist/core/ingestion/route-extractors/spring-shared.js +89 -0
  405. package/dist/core/ingestion/route-extractors/spring.js +214 -29
  406. package/dist/core/ingestion/scope-extractor-bridge.js +9 -1
  407. package/dist/core/ingestion/scope-extractor.d.ts +22 -7
  408. package/dist/core/ingestion/scope-extractor.js +309 -15
  409. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +311 -21
  410. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +16 -5
  411. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +12 -0
  412. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +47 -0
  413. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +20 -15
  414. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +280 -42
  415. package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.d.ts +123 -0
  416. package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +171 -17
  417. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.d.ts +58 -1
  418. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +137 -34
  419. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +30 -1
  420. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +39 -1
  421. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +18 -1
  422. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +113 -18
  423. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +107 -5
  424. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +590 -33
  425. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +3 -0
  426. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +101 -41
  427. package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.d.ts +34 -0
  428. package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.js +62 -0
  429. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +5 -1
  430. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +8 -1
  431. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +105 -5
  432. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +931 -92
  433. package/dist/core/ingestion/scope-resolution/passes/return-shape-members.d.ts +58 -0
  434. package/dist/core/ingestion/scope-resolution/passes/return-shape-members.js +458 -0
  435. package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.d.ts +180 -0
  436. package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.js +418 -0
  437. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +29 -0
  438. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +57 -0
  439. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +55 -1
  440. package/dist/core/ingestion/scope-resolution/pipeline/run.js +241 -19
  441. package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +112 -2
  442. package/dist/core/ingestion/scope-resolution/resolution-outcome.js +38 -1
  443. package/dist/core/ingestion/scope-resolution/scope/namespace-targets.d.ts +25 -3
  444. package/dist/core/ingestion/scope-resolution/scope/namespace-targets.js +36 -16
  445. package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +210 -9
  446. package/dist/core/ingestion/scope-resolution/scope/walkers.js +905 -22
  447. package/dist/core/ingestion/scope-resolution/summary-maps.d.ts +28 -0
  448. package/dist/core/ingestion/scope-resolution/summary-maps.js +50 -0
  449. package/dist/core/ingestion/scope-resolution/undecided-satisfaction.d.ts +55 -0
  450. package/dist/core/ingestion/scope-resolution/undecided-satisfaction.js +37 -0
  451. package/dist/core/ingestion/scope-resolution/unresolved-receivers.d.ts +109 -0
  452. package/dist/core/ingestion/scope-resolution/unresolved-receivers.js +204 -0
  453. package/dist/core/ingestion/scope-resolution/utils/definition-id.d.ts +13 -0
  454. package/dist/core/ingestion/scope-resolution/utils/definition-id.js +19 -0
  455. package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.d.ts +171 -0
  456. package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.js +218 -0
  457. package/dist/core/ingestion/scope-resolution/workspace-index-types.d.ts +34 -0
  458. package/dist/core/ingestion/scope-resolution/workspace-index-types.js +15 -0
  459. package/dist/core/ingestion/scope-resolution/workspace-index.d.ts +7 -20
  460. package/dist/core/ingestion/tree-sitter-queries.d.ts +11 -11
  461. package/dist/core/ingestion/tree-sitter-queries.js +678 -4
  462. package/dist/core/ingestion/type-env.js +11 -7
  463. package/dist/core/ingestion/type-extractors/shared.d.ts +17 -0
  464. package/dist/core/ingestion/type-extractors/shared.js +16 -0
  465. package/dist/core/ingestion/type-extractors/types.d.ts +12 -0
  466. package/dist/core/ingestion/type-extractors/typescript.d.ts +20 -0
  467. package/dist/core/ingestion/type-extractors/typescript.js +26 -0
  468. package/dist/core/ingestion/utils/ast-helpers.d.ts +297 -15
  469. package/dist/core/ingestion/utils/ast-helpers.js +578 -46
  470. package/dist/core/ingestion/utils/call-analysis.d.ts +27 -22
  471. package/dist/core/ingestion/utils/call-analysis.js +202 -7
  472. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +59 -0
  473. package/dist/core/ingestion/utils/callable-flow-captures.js +51 -1
  474. package/dist/core/ingestion/utils/callable-labels.d.ts +25 -0
  475. package/dist/core/ingestion/utils/callable-labels.js +31 -0
  476. package/dist/core/ingestion/utils/effective-ram.d.ts +40 -0
  477. package/dist/core/ingestion/utils/effective-ram.js +58 -0
  478. package/dist/core/ingestion/utils/line-base.d.ts +14 -0
  479. package/dist/core/ingestion/utils/line-base.js +14 -0
  480. package/dist/core/ingestion/utils/method-props.d.ts +27 -4
  481. package/dist/core/ingestion/utils/method-props.js +29 -4
  482. package/dist/core/ingestion/utils/receiver-chain-captures.d.ts +31 -0
  483. package/dist/core/ingestion/utils/receiver-chain-captures.js +57 -0
  484. package/dist/core/ingestion/utils/receiver-chain-codec.d.ts +89 -0
  485. package/dist/core/ingestion/utils/receiver-chain-codec.js +182 -0
  486. package/dist/core/ingestion/utils/scope-tree-walk.d.ts +22 -0
  487. package/dist/core/ingestion/utils/scope-tree-walk.js +33 -0
  488. package/dist/core/ingestion/utils/template-arguments.d.ts +96 -0
  489. package/dist/core/ingestion/utils/template-arguments.js +196 -0
  490. package/dist/core/ingestion/utils/type-parameters.d.ts +49 -0
  491. package/dist/core/ingestion/utils/type-parameters.js +206 -0
  492. package/dist/core/ingestion/workers/callable-id.d.ts +80 -0
  493. package/dist/core/ingestion/workers/callable-id.js +125 -0
  494. package/dist/core/ingestion/workers/parse-worker.d.ts +14 -1
  495. package/dist/core/ingestion/workers/parse-worker.js +493 -54
  496. package/dist/core/ingestion/workers/worker-pool.d.ts +20 -27
  497. package/dist/core/ingestion/workers/worker-pool.js +91 -3
  498. package/dist/core/lbug/csv-generator.d.ts +27 -0
  499. package/dist/core/lbug/csv-generator.js +72 -17
  500. package/dist/core/lbug/extension-load-error.js +13 -2
  501. package/dist/core/lbug/extension-loader.d.ts +29 -0
  502. package/dist/core/lbug/extension-loader.js +31 -6
  503. package/dist/core/lbug/graph-emit-sink.d.ts +264 -0
  504. package/dist/core/lbug/graph-emit-sink.js +581 -0
  505. package/dist/core/lbug/lbug-adapter.d.ts +290 -11
  506. package/dist/core/lbug/lbug-adapter.js +652 -69
  507. package/dist/core/lbug/native-check.d.ts +21 -0
  508. package/dist/core/lbug/native-check.js +248 -32
  509. package/dist/core/lbug/pdg-emit-sink.d.ts +13 -4
  510. package/dist/core/lbug/pdg-emit-sink.js +21 -111
  511. package/dist/core/lbug/pool-adapter.d.ts +9 -0
  512. package/dist/core/lbug/pool-adapter.js +164 -14
  513. package/dist/core/lbug/query-batch.d.ts +75 -0
  514. package/dist/core/lbug/query-batch.js +102 -0
  515. package/dist/core/lbug/rel-pair-routing.d.ts +160 -2
  516. package/dist/core/lbug/rel-pair-routing.js +228 -10
  517. package/dist/core/lbug/schema.d.ts +163 -4
  518. package/dist/core/lbug/schema.js +404 -159
  519. package/dist/core/lbug/sync-csv-writer.d.ts +47 -0
  520. package/dist/core/lbug/sync-csv-writer.js +108 -0
  521. package/dist/core/run-analyze.d.ts +147 -0
  522. package/dist/core/run-analyze.js +1215 -179
  523. package/dist/core/search/bm25-index.d.ts +11 -0
  524. package/dist/core/search/bm25-index.js +60 -26
  525. package/dist/core/search/fts-indexes.d.ts +150 -9
  526. package/dist/core/search/fts-indexes.js +241 -23
  527. package/dist/core/wiki/graph-queries.js +145 -112
  528. package/dist/core/wiki/llm-client.d.ts +29 -3
  529. package/dist/core/wiki/llm-client.js +47 -12
  530. package/dist/core/wiki/prompts.d.ts +19 -0
  531. package/dist/core/wiki/prompts.js +20 -1
  532. package/dist/lib/utils.d.ts +113 -0
  533. package/dist/lib/utils.js +185 -0
  534. package/dist/mcp/local/aop-metadata.d.ts +77 -0
  535. package/dist/mcp/local/aop-metadata.js +227 -0
  536. package/dist/mcp/local/bean-metadata.d.ts +2 -1
  537. package/dist/mcp/local/bean-metadata.js +22 -1
  538. package/dist/mcp/local/convex-metadata.d.ts +8 -0
  539. package/dist/mcp/local/convex-metadata.js +45 -0
  540. package/dist/mcp/local/local-backend.d.ts +174 -11
  541. package/dist/mcp/local/local-backend.js +1678 -331
  542. package/dist/mcp/local/path-predicate.d.ts +19 -0
  543. package/dist/mcp/local/path-predicate.js +21 -0
  544. package/dist/mcp/local/pdg-impact.d.ts +132 -10
  545. package/dist/mcp/local/pdg-impact.js +391 -98
  546. package/dist/mcp/repository-policy.d.ts +1 -0
  547. package/dist/mcp/repository-policy.js +5 -0
  548. package/dist/mcp/resources.js +26 -4
  549. package/dist/mcp/server.js +23 -13
  550. package/dist/mcp/tools.d.ts +8 -0
  551. package/dist/mcp/tools.js +76 -23
  552. package/dist/server/analyze-job.d.ts +37 -2
  553. package/dist/server/analyze-job.js +13 -2
  554. package/dist/server/analyze-launch.d.ts +1 -1
  555. package/dist/server/analyze-launch.js +79 -10
  556. package/dist/server/analyze-worker-core.d.ts +1 -1
  557. package/dist/server/analyze-worker-core.js +10 -1
  558. package/dist/server/analyze-worker-ipc.d.ts +1 -1
  559. package/dist/server/analyze-worker-ipc.js +4 -0
  560. package/dist/server/analyze-worker-protocol.d.ts +59 -0
  561. package/dist/server/analyze-worker-protocol.js +1 -0
  562. package/dist/server/analyze-worker.d.ts +1 -17
  563. package/dist/server/api.d.ts +2 -11
  564. package/dist/server/api.js +164 -163
  565. package/dist/server/embed-run-outcome.d.ts +89 -0
  566. package/dist/server/embed-run-outcome.js +88 -0
  567. package/dist/server/git-clone.js +6 -2
  568. package/dist/server/middleware.d.ts +116 -9
  569. package/dist/server/middleware.js +291 -22
  570. package/dist/server/sse-progress.d.ts +41 -0
  571. package/dist/server/sse-progress.js +125 -0
  572. package/dist/storage/branch-index.d.ts +11 -6
  573. package/dist/storage/branch-index.js +15 -7
  574. package/dist/storage/file-hash.js +2 -2
  575. package/dist/storage/fs-atomic.d.ts +25 -0
  576. package/dist/storage/fs-atomic.js +42 -0
  577. package/dist/storage/git.d.ts +131 -0
  578. package/dist/storage/git.js +236 -2
  579. package/dist/storage/index-lock.d.ts +102 -0
  580. package/dist/storage/index-lock.js +660 -0
  581. package/dist/storage/parse-cache.js +588 -6
  582. package/dist/storage/parsedfile-store.js +76 -6
  583. package/dist/storage/repo-manager.d.ts +54 -441
  584. package/dist/storage/repo-manager.js +312 -221
  585. package/dist/storage/repo-meta.d.ts +530 -0
  586. package/dist/storage/repo-meta.js +100 -0
  587. package/dist/types/pipeline.d.ts +37 -0
  588. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +1 -1
  589. package/hooks/claude/gitnexus-hook.cjs +1 -1
  590. package/hooks/claude/resolve-analyze-cmd.cjs +80 -13
  591. package/package.json +11 -2
  592. package/scripts/cross-platform-shard.ts +153 -0
  593. package/scripts/cross-platform-tests.ts +122 -0
  594. package/scripts/run-cross-platform.ts +16 -5
  595. package/skills/gitnexus-cli.md +3 -3
  596. package/skills/gitnexus-debugging.md +37 -7
  597. package/skills/gitnexus-exploring.md +26 -4
  598. package/skills/gitnexus-impact-analysis.md +71 -10
  599. package/skills/gitnexus-plan/README.md +11 -6
  600. package/skills/gitnexus-plan/references/evidence-provenance.md +49 -12
  601. package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +654 -372
  602. package/skills/gitnexus-refactoring.md +48 -5
  603. package/skills/gitnexus-review/SKILL.md +12 -6
  604. package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +1 -1
  605. package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +1 -1
  606. package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +1 -1
  607. package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +1 -1
  608. package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +1 -1
  609. package/skills/gitnexus-review/ci-personas/ci-security-lens.md +1 -1
  610. package/skills/gitnexus-taint-analysis.md +13 -7
  611. package/skills/gitnexus-work/SKILL.md +4 -1
  612. package/skills/gitnexus-work/references/evidence-provenance.md +49 -12
  613. package/skills/gitnexus-work/scripts/evidence-provenance.mjs +654 -372
  614. package/vendor/leiden/utils.cjs +28 -1
  615. package/web/assets/ProcessFlowModal-Badh2Pbg.js +24 -0
  616. package/web/assets/{__vite-browser-external-bMKyYQkO.js → __vite-browser-external-COxE8F0G.js} +1 -1
  617. package/web/assets/abnfDiagram-QNN2D4NM-Cq2djWWe.js +1 -0
  618. package/web/assets/agent-Dr4l5EOp.js +662 -0
  619. package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +1 -0
  620. package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +36 -0
  621. package/web/assets/{blockDiagram-7IZFK4PR-DBefcjof.js → blockDiagram-54WLDVWM-Dg_hrRWE.js} +4 -4
  622. package/web/assets/{c4Diagram-Y2BXMSZH-EjWnjEJl.js → c4Diagram-X2LASM7V-CnhoT4aV.js} +2 -2
  623. package/web/assets/chunk-224SPVON-B8gxtXpy.js +1 -0
  624. package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +127 -0
  625. package/web/assets/chunk-2SREHG4O-Dip42xOq.js +1 -0
  626. package/web/assets/chunk-4RFN2BYJ-DHHWuC-n.js +1 -0
  627. package/web/assets/chunk-66DQ2XMT-CM0xjFAN.js +1 -0
  628. package/web/assets/chunk-6BELYETK-ChsYtfHW.js +1 -0
  629. package/web/assets/{chunk-LII3EMHJ-BL6lKJ_P.js → chunk-6L755F7B-CMhLBxi2.js} +1 -1
  630. package/web/assets/{chunk-QA3QBVWF-DVXPOIxe.js → chunk-7CWYLC5S-DRgGkkpF.js} +1 -1
  631. package/web/assets/{chunk-ZXARS5L4-C3v-4Fsw.js → chunk-A7VWPJGB-B4O3oQdQ.js} +1 -1
  632. package/web/assets/chunk-BI6VK774-D0oaWk8V.js +1 -0
  633. package/web/assets/chunk-D6VWDJW2-BxcBdZ9c.js +2 -0
  634. package/web/assets/chunk-DMV4VAQV-Bn6WXDSX.js +4 -0
  635. package/web/assets/chunk-E5QJAATJ-dh-5CtIV.js +2 -0
  636. package/web/assets/chunk-EQFTRU2I-1ix7TzW9.js +2 -0
  637. package/web/assets/chunk-FWYVLQTC-BgDItRzJ.js +1 -0
  638. package/web/assets/chunk-HNC4WDU7-DoU3KnA7.js +1 -0
  639. package/web/assets/chunk-L5GCOVLC-CE2w8Nm_.js +161 -0
  640. package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +321 -0
  641. package/web/assets/chunk-LORZLZWG-B57uGw2N.js +88 -0
  642. package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +62 -0
  643. package/web/assets/chunk-NV3KIAZN-5yvcpMiu.js +1 -0
  644. package/web/assets/chunk-OIYT25JQ-CQ6KOZGX.js +1 -0
  645. package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +10 -0
  646. package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +156 -0
  647. package/web/assets/chunk-RRFMTAIC-CMN0wcYA.js +1 -0
  648. package/web/assets/{chunk-RLI5ZMPA-CkXZ0y0U.js → chunk-SATU7PGQ-B1zhgOvc.js} +1 -1
  649. package/web/assets/chunk-STOV2HOB-GnExfzIX.js +1 -0
  650. package/web/assets/{chunk-INKRHTLW-Ckl3_KkO.js → chunk-SZD42YQK-ijyKKVr1.js} +21 -21
  651. package/web/assets/{chunk-LCXTWHL2-C162wE5z.js → chunk-TFPGFQPA-Dj6a-0pC.js} +3 -3
  652. package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +2 -0
  653. package/web/assets/chunk-TZUXEDM2-B7p9AcTw.js +1 -0
  654. package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +1 -0
  655. package/web/assets/{chunk-6764PJDD-C7xxk063.js → chunk-VE5CLXGZ-C1vB7wpY.js} +1 -1
  656. package/web/assets/{chunk-RG4AUYOV-ZNgyLFq6.js → chunk-VJFVEZTB-CX66F2ep.js} +3 -3
  657. package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +1 -0
  658. package/web/assets/chunk-WJBAP47W-BckNkuEN.js +1 -0
  659. package/web/assets/chunk-XNMVGMAZ-Cg_LnPtj.js +1 -0
  660. package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +1 -0
  661. package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +1 -0
  662. package/web/assets/{cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js → cose-bilkent-RZA4XIPR-BHpK4Crp.js} +1 -1
  663. package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +1 -0
  664. package/web/assets/cynefinDiagram-TR7LZUCG-C3Iar9lZ.js +62 -0
  665. package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +4 -0
  666. package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +30 -0
  667. package/web/assets/diagram-JCD7PQ7C-DC5-9FRr.js +24 -0
  668. package/web/assets/{diagram-HNR7UZ2L-DVRltWbL.js → diagram-KFBZAVDW-Dfmf_4ti.js} +3 -3
  669. package/web/assets/diagram-L7DVE3PN-GIRyVUtt.js +41 -0
  670. package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +24 -0
  671. package/web/assets/ebnfDiagram-DRHRQJWO-D8_CI4ZF.js +1 -0
  672. package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +85 -0
  673. package/web/assets/error-D9MtuG9s.js +1 -0
  674. package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +1 -0
  675. package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +1 -0
  676. package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +292 -0
  677. package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +1 -0
  678. package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +106 -0
  679. package/web/assets/{index-D7mTFcvQ.js → index-2zdvEdzg.js} +51 -51
  680. package/web/assets/index-CJDpyH-n.css +2 -0
  681. package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +1 -0
  682. package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +2 -0
  683. package/web/assets/{ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js → ishikawaDiagram-4JDSWWDM-DmqWtjkl.js} +2 -2
  684. package/web/assets/{journeyDiagram-M6C3CM3L-C6wjooas.js → journeyDiagram-QUS3FAKT-XAzVzrQW.js} +3 -3
  685. package/web/assets/{kanban-definition-75IXJCU3-5_UVY79g.js → kanban-definition-D4L7SQKK-YurRnmYn.js} +6 -6
  686. package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +257 -0
  687. package/web/assets/{mindmap-definition-2TDM6QVE-8xDLzk2e.js → mindmap-definition-66QP5TD6-ChrWWnil.js} +5 -5
  688. package/web/assets/node.browser-U-KyT5AW.js +1 -0
  689. package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +1 -0
  690. package/web/assets/pegDiagram-YKIO5C6U-QGeQLEq2.js +1 -0
  691. package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +1 -0
  692. package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +39 -0
  693. package/web/assets/{quadrantDiagram-VICAPDV7-DR54jOeR.js → quadrantDiagram-VO5QLCXA-B7098wSc.js} +3 -3
  694. package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +1 -0
  695. package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +1 -0
  696. package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +1 -0
  697. package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +1 -0
  698. package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +1 -0
  699. package/web/assets/railroadDiagram-M77LTMSB-AXu4vxk_.js +1 -0
  700. package/web/assets/{requirementDiagram-JXO7QTGE-PEkg7sKC.js → requirementDiagram-RASO5HTO-B-l8InpK.js} +4 -4
  701. package/web/assets/{sankeyDiagram-URQDO5SZ-DDWEtjcs.js → sankeyDiagram-F32LOJ6L-Kd7zjJgX.js} +3 -3
  702. package/web/assets/{sequenceDiagram-VS2MUI6T-Bv-uwANx.js → sequenceDiagram-URATNSBD-BlcdY9DS.js} +7 -7
  703. package/web/assets/sizeCapture-5GORAGP4-BEqQzsxs.js +1 -0
  704. package/web/assets/src-C5sx_gMp.js +1 -0
  705. package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +1 -0
  706. package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +1 -0
  707. package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +2 -0
  708. package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +8 -0
  709. package/web/assets/{timeline-definition-O6YCAMPW-Qmsuo7qS.js → timeline-definition-WJXWRH4I-DUfp1R3E.js} +3 -3
  710. package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +1 -0
  711. package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +1 -0
  712. package/web/assets/vennDiagram-K3VCMQLI-Bj-FN-XS.js +34 -0
  713. package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +1 -0
  714. package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +78 -0
  715. package/web/assets/xychartDiagram-5VRUVLCW-CK_rbSWE.js +7 -0
  716. package/web/index.html +16 -15
  717. package/dist/core/ingestion/languages/python/index-stats.d.ts +0 -18
  718. package/dist/core/ingestion/languages/python/index-stats.js +0 -25
  719. package/web/assets/ProcessFlowModal-CwkpVkv-.js +0 -22
  720. package/web/assets/agent-Ds-lkZjX.js +0 -626
  721. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +0 -1
  722. package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +0 -36
  723. package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +0 -4
  724. package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +0 -1
  725. package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +0 -321
  726. package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +0 -159
  727. package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +0 -124
  728. package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +0 -10
  729. package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +0 -1
  730. package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +0 -1
  731. package/web/assets/chunk-J5EP6P6S-L19oz55R.js +0 -1
  732. package/web/assets/chunk-KGFNY3KK-BZeP-55u.js +0 -62
  733. package/web/assets/chunk-KGYTTC2M-zm6n242I.js +0 -1
  734. package/web/assets/chunk-KNLZD3CH-BGlP6X9R.js +0 -1
  735. package/web/assets/chunk-LRIF4GLE-n59lhprL.js +0 -1
  736. package/web/assets/chunk-RERM46MO-B5dAdWpP.js +0 -1
  737. package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +0 -1
  738. package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +0 -1
  739. package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +0 -1
  740. package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +0 -1
  741. package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +0 -1
  742. package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +0 -2
  743. package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +0 -1
  744. package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +0 -1
  745. package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +0 -4
  746. package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +0 -43
  747. package/web/assets/diagram-GF46GFSD-B2atbzmU.js +0 -24
  748. package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +0 -24
  749. package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +0 -10
  750. package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +0 -85
  751. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +0 -1
  752. package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +0 -162
  753. package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +0 -292
  754. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +0 -1
  755. package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +0 -106
  756. package/web/assets/index-CX_fADmQ.css +0 -2
  757. package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +0 -1
  758. package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +0 -2
  759. package/web/assets/katex-K3KEBU37-qRQBy-EZ.js +0 -261
  760. package/web/assets/node-Ct_zna8U.js +0 -8
  761. package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +0 -1
  762. package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +0 -1
  763. package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +0 -30
  764. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +0 -1
  765. package/web/assets/sdk-CzHHH8tD.js +0 -37
  766. package/web/assets/src-Cv1eWg0o.js +0 -1
  767. package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +0 -1
  768. package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +0 -1
  769. package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +0 -1
  770. package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +0 -1
  771. package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +0 -34
  772. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +0 -1
  773. package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +0 -78
  774. package/web/assets/xychartDiagram-N2JHSOCM-CoZ_Tits.js +0 -7
  775. /package/web/assets/{chunk-7W6UQGC5-pyKGssV3.js → chunk-LIEV3EAG-pyKGssV3.js} +0 -0
@@ -15,7 +15,7 @@
15
15
  * - propagatesReturnTypesAcrossImports (default true)
16
16
  * - fieldFallbackOnMethodLookup (default true — turn OFF for
17
17
  * statically-typed languages; the heuristic over-connects)
18
- * - unwrapCollectionAccessor — property-style collection views
18
+ * - elementTypeOf — container element type, by subscript or accessor
19
19
  * - collapseMemberCallsByCallerTarget — one edge per caller/target
20
20
  * - populateNamespaceSiblings — cross-file implicit visibility
21
21
  * - hoistTypeBindingsToModule — enable ONLY when method return
@@ -113,13 +113,24 @@
113
113
  * 3. Case 0.5 implicit-`this` chain walk — GATED: fires only for
114
114
  * languages that set `resolveThisViaEnclosingClass === true`;
115
115
  * it intercepts every bare-`this` call/read/write site ahead of
116
- * Case 4 and does NOT emit Case 4's interface-dispatch fan-out,
117
- * so enabling the toggle for a language changes that language's
118
- * `this` dispatch semantics (see the toggle's doc below)
116
+ * Case 4 and does NOT emit the interface-dispatch fan-out that
117
+ * Cases 0, 3b and 4 all perform (Case 0 gained it in #2829 and
118
+ * Case 3b in #2832, leaving 0.5 the only INSTANCE-receiver case
119
+ * that folds or walks to a receiver type without fanning out.
120
+ * Read that narrowly: Case 2 also walks an MRO and its binding
121
+ * admits `Interface`, but its receiver IS the type name, so the
122
+ * site is static dispatch and a fan-out would be wrong; Cases 3
123
+ * and 5 resolve by direct lookup rather than a fold or MRO walk,
124
+ * and no language is known to reach Case 3 with an Interface —
125
+ * every one that could strips the namespace qualifier first,
126
+ * sending it to Case 4), so enabling the toggle
127
+ * for a language changes that language's `this` dispatch
128
+ * semantics (see the toggle's doc below)
119
129
  * 4. Case 1 namespace-receiver
120
130
  * 5. Case 2 class-name receiver
121
131
  * 6. Case 3 dotted typeBinding for namespace prefix
122
- * 7. Case 3b chain-typebinding (compound resolver)
132
+ * 7. Case 3b chain-typebinding (compound resolver + interface-dispatch
133
+ * fan-out on an Interface fold, #2832)
123
134
  * 8. Case 4 simple typeBinding (MRO walk + findOwnedMember)
124
135
  * Reordering or merging cases changes resolution semantics. The
125
136
  * numbering is part of the contract — keep the comments.
@@ -267,6 +278,7 @@
267
278
  * Plan that introduced most of these invariants:
268
279
  * `docs/plans/2026-04-20-001-refactor-emit-pipeline-generalization-plan.md`.
269
280
  */
281
+ import type { DecorationStripper } from '../scope/walkers.js';
270
282
  import type { BindingRef, Callsite, ConstraintContext, ParsedFile, ParsedImport, ReferenceSite, ScopeId, SupportedLanguages, SymbolDefinition } from '../../../../_shared/index.js';
271
283
  import type { KnowledgeGraph } from '../../../graph/types.js';
272
284
  import type { GraphNodeLookup } from '../graph-bridge/node-lookup.js';
@@ -274,6 +286,8 @@ import { LanguageProvider } from '../../language-provider.js';
274
286
  import { ScopeResolutionIndexes } from '../../model/scope-resolution-indexes.js';
275
287
  import type { SemanticModel } from '../../model/semantic-model.js';
276
288
  import type { ConversionRankFn } from '../passes/overload-narrowing.js';
289
+ import type { HeritageTypeArgumentSink } from '../utils/generic-instantiation.js';
290
+ import type { WorkspaceResolutionIndex } from '../workspace-index.js';
277
291
  /** A LinearizeStrategy receives the full ancestor map so C3-style
278
292
  * algorithms (which need to merge each parent's MRO) can implement
279
293
  * themselves. Python's depth-first first-seen only consumes
@@ -295,6 +309,52 @@ export interface ImportResolutionContext {
295
309
  /** Re-exported for ScopeResolver consumers — same shape as
296
310
  * `RegistryProviders.constraintCompatibility`'s third parameter. */
297
311
  export type { ConstraintContext } from '../../../../_shared/index.js';
312
+ /** How a container's element was reached in the source. */
313
+ export type ElementAccessRoute = {
314
+ readonly kind: 'index';
315
+ } | {
316
+ readonly kind: 'accessor';
317
+ readonly name: string;
318
+ };
319
+ /** One structurally-detected implementor plus the receiver form in which it
320
+ * satisfies the interface (see `detectInterfaceImplementations`). */
321
+ export interface StructuralImplementor {
322
+ readonly structDefId: string;
323
+ readonly receiverForm: 'value' | 'pointer';
324
+ }
325
+ /**
326
+ * One interface whose satisfaction check could not be COMPLETED for at least
327
+ * one candidate type — not one that was checked and came out negative.
328
+ *
329
+ * The distinction is the whole point (#2873): a detector that reports only
330
+ * positives makes "nobody implements this" and "we could not tell whether
331
+ * anybody implements this" byte-identical, and the second one silently becomes
332
+ * a confident zero in `impact`. Consumers must not turn these into edges; they
333
+ * exist so a query can say it is answering with a lower bound.
334
+ */
335
+ export interface UndecidedSatisfaction {
336
+ readonly interfaceDefId: string;
337
+ readonly interfaceName: string;
338
+ readonly filePath: string;
339
+ /** How many candidate types went unjudged for this interface. */
340
+ readonly undecidedCandidates: number;
341
+ /**
342
+ * The candidate types themselves, by name.
343
+ *
344
+ * Both sides are recorded because a query arrives from either one. Asking
345
+ * `impact` about the IMPLEMENTATION — the case #2873 reports — never touches
346
+ * the interface node at all: the walk starts at a method whose owner has no
347
+ * heritage edge precisely because the check was undecided, so an
348
+ * interface-keyed record alone would leave that query unhedged.
349
+ */
350
+ readonly candidateNames: readonly string[];
351
+ }
352
+ /** What `detectInterfaceImplementations` answers: the positives, plus the
353
+ * questions it could not answer. */
354
+ export interface StructuralImplementationResult {
355
+ readonly implementations: Map<string, readonly StructuralImplementor[]>;
356
+ readonly undecided: readonly UndecidedSatisfaction[];
357
+ }
298
358
  export interface ScopeResolver {
299
359
  /** Identity for telemetry + per-language flag check. */
300
360
  readonly language: SupportedLanguages;
@@ -331,6 +391,12 @@ export interface ScopeResolver {
331
391
  * when a PSR-4 import names a function instead of a file.
332
392
  */
333
393
  resolveImportTarget(targetRaw: string, fromFile: string, allFilePaths: ReadonlySet<string>, resolutionConfig?: unknown, context?: ImportResolutionContext): string | readonly string[] | null;
394
+ /**
395
+ * Optionally reclassify an import as a namespace handle after target
396
+ * resolution proves the imported name is itself a module. Returning false
397
+ * retains ordinary named-binding behavior.
398
+ */
399
+ readonly isNamespaceImport?: (parsedImport: ParsedImport, targetFile: string, fromFile: string) => boolean;
334
400
  /**
335
401
  * Enumerate names visible through a wildcard import after the target
336
402
  * module scope has been linked. Languages that do not support
@@ -456,9 +522,19 @@ export interface ScopeResolver {
456
522
  * shape. Must be idempotent (the orchestrator may call it more than once
457
523
  * during re-resolution).
458
524
  *
525
+ * `recordTypeArguments` is the same sink `preEmitInheritanceEdges` writes to:
526
+ * the generic INSTANTIATION a heritage clause was written with, so
527
+ * interface-dispatch fan-out can refuse an implementor of an incompatible one
528
+ * (#2912). An implementation that emits an edge for a generic base
529
+ * (`impl Validator<String> for V`, `class V implements Validator<String>`)
530
+ * should call it with the same (source, target) graph ids it just used;
531
+ * anything not recorded reads as "unknown" and keeps the pre-#2912 fan-out.
532
+ * Ignoring it entirely is correct for a language whose heritage carries no
533
+ * type arguments (Ruby `include`).
534
+ *
459
535
  * Default: undefined (no extra heritage edges needed).
460
536
  */
461
- readonly emitHeritageEdges?: (graph: KnowledgeGraph, parsedFiles: readonly ParsedFile[], nodeLookup: GraphNodeLookup, scopes?: ScopeResolutionIndexes) => void;
537
+ readonly emitHeritageEdges?: (graph: KnowledgeGraph, parsedFiles: readonly ParsedFile[], nodeLookup: GraphNodeLookup, scopes?: ScopeResolutionIndexes, recordTypeArguments?: HeritageTypeArgumentSink) => void;
462
538
  /**
463
539
  * Optional hook to emit IMPORTS edges that no syntactic import
464
540
  * statement produces. Some languages grant files implicit visibility
@@ -610,19 +686,56 @@ export interface ScopeResolver {
610
686
  */
611
687
  readonly fieldFallbackOnMethodLookup?: boolean;
612
688
  /**
613
- * Unwrap a property-style collection accessor on a typed receiver
614
- * to its element type. Called by `resolveCompoundReceiverClass`
615
- * when walking dotted member-access chains of the form
616
- * `receiver.Accessor`. The provider returns the element type's
617
- * simple name, or `undefined` when the accessor doesn't unwrap —
618
- * in which case the regular field-walk resumes.
619
- *
620
- * Use this only for languages that expose collection views as
621
- * properties rather than method calls; languages whose collection
622
- * views are `.values()` / `.keys()` method calls leave this
623
- * undefined and let the normal call-expression branch handle them.
689
+ * Element type of a container, reached either by a subscript (`repos[0]`) or
690
+ * by a property-style collection view (`dict.Values`). Returns the element
691
+ * type's simple name, or `undefined` when the container does not unwrap by
692
+ * that route — in which case the caller resumes its normal walk.
693
+ *
694
+ * ONE hook for both routes, deliberately. They were previously two
695
+ * (`unwrapCollectionAccessor` for the property route, `unwrapCollectionElement`
696
+ * for the subscript route), which meant a language implementing one silently
697
+ * got nothing for the other: C# parsed `Dictionary<K,V>` for `.Values` but
698
+ * returned nothing for `list[0]`, and TypeScript did the reverse. Two entries
699
+ * answering one question, each accreting an implementation per language.
700
+ *
701
+ * `via` carries the route so a provider can distinguish them where it matters
702
+ * (a `Dictionary` yields its VALUE type by subscript but either type by
703
+ * accessor name); a provider that does not care can ignore it.
704
+ *
705
+ * Consulted ONLY where the source actually performed the access. It is NOT a
706
+ * general type-name normalizer: unwrapping a container at a bare class lookup
707
+ * would let `repos.find(x)` fold to `Repo.find`, because a container's member
708
+ * set is not its element's. For the same reason it is deliberately separate
709
+ * from `stripTypePreservingDecoration`: a pointer or a nullable leaves the
710
+ * member set unchanged and is safe to strip at the lookup; a container is not.
711
+ *
712
+ * ## The `index` route is REQUIRED, and `undefined` means "not a container"
713
+ *
714
+ * A language that leaves the `index` route unanswered gets NO index folding —
715
+ * the structural fold declines the step rather than passing the position
716
+ * through. That is not a default worth softening. `undefined` used to mean
717
+ * "fall back to identity", on the theory that a capture layer which already
718
+ * reduced the container (Go's `normalizeGoTypeName`, C#/TypeScript's
719
+ * `stripGeneric`) leaves nothing to unwrap. The theory holds for a container;
720
+ * it is false for an ordinary class the source happened to subscript, and
721
+ * `rawName` cannot tell those apart — `repos: User[]` and `grid: Grid` both
722
+ * arrive as a bare resolvable class name. Identity there typed `grid[0].run()`
723
+ * as `Grid.run` and `t[0].Render()` as `Table.Render`: a wrong owner, which
724
+ * this pipeline ranks strictly below a missing edge.
725
+ *
726
+ * The hook is therefore handed `TypeRef.declaredSpelling` — the annotation AS
727
+ * WRITTEN, retained by the scope extractor precisely because capture-time
728
+ * normalization destroys it — falling back to `rawName` only when nothing was
729
+ * normalized away. So a provider sees `User[]`, `List[User]`, `[]*User` or
730
+ * `Dictionary<string, User>`, never the post-reduction `User`, and answering
731
+ * `undefined` for a spelling it does not recognize as a container is an
732
+ * ANSWER, not an absence.
733
+ *
734
+ * Implementations may return a still-DECORATED element name (Go's `[]*User`
735
+ * yields `*User`): the index step looks the element up through
736
+ * `stripTypePreservingDecoration`, so the pointer resolves.
624
737
  */
625
- readonly unwrapCollectionAccessor?: (receiverType: string, accessor: string) => string | undefined;
738
+ readonly elementTypeOf?: (containerType: string, via: ElementAccessRoute) => string | undefined;
626
739
  /**
627
740
  * Collapse member-call CALLS edges by `(caller, target)` rather
628
741
  * than per-site. Default `false` — scope-resolution's contract
@@ -667,6 +780,57 @@ export interface ScopeResolver {
667
780
  * Swift — opt in.
668
781
  */
669
782
  readonly constructorCallTargetsClass?: boolean;
783
+ /**
784
+ * How this language spells a construction expression, so the compound
785
+ * receiver resolver can type an INLINE constructor receiver — the
786
+ * `Service(db).do_work()` shape, where the receiver is the constructed
787
+ * value itself rather than a binding that holds it (#2708).
788
+ *
789
+ * The rule is the same in every language ("constructing a class yields
790
+ * an instance of that class"); only the surface syntax differs, so the
791
+ * syntax is declared here and the rule lives once in
792
+ * `resolveCompoundReceiverClass`:
793
+ *
794
+ * - `bare: true` — `Service(db).m()` (Python)
795
+ * - `keyword: 'new'` — `new Service(db).m()` (JS/TS, C#)
796
+ * - `selector: 'new'` — `Service.new.m()` (Ruby)
797
+ *
798
+ * Java is deliberately NOT wired even though it spells construction with
799
+ * `new`: its capture layer already rewrites an `object_creation_expression`
800
+ * receiver to the constructed type's simple name (#2564), so the raw
801
+ * `new Svc()` text never reaches this resolver and the declaration would be
802
+ * unreachable. Measured both ways — Java resolves the shape identically with
803
+ * and without it.
804
+ *
805
+ * Opting in is per-language ON PURPOSE rather than universal, for two
806
+ * reasons. Correctness: `bare` would mistype `stat(&st).field` in C,
807
+ * where a struct and a function may share a name and the free call is
808
+ * NOT a construction. Evidence: PHP, Swift, Dart and Kotlin already
809
+ * resolve this shape through their own capture-side paths (verified
810
+ * per language — the receiver typing here changed nothing for them),
811
+ * so they stay unwired rather than carrying a redundant declaration.
812
+ *
813
+ * Only affects receiver TYPING. Which node a construction call links
814
+ * to is a separate question, owned by `constructorCallTargetsClass`.
815
+ * Path-syntax constructors (Rust `Foo::new(x)`) are not covered — they
816
+ * are not member calls and never reach this resolver.
817
+ */
818
+ readonly constructionSyntax?: {
819
+ /** A free call naming a class constructs it: `Service(db)`. */
820
+ readonly bare?: boolean;
821
+ /** Prefix keyword form: `new Service(db)`. */
822
+ readonly keyword?: string;
823
+ /** Member-selector form on the class itself: `Service.new(db)`.
824
+ * Applies only when the receiver names the CLASS — `factory.new` is an
825
+ * ordinary call to a member named `new` on an instance and keeps normal
826
+ * member resolution. KNOWN LIMITATION: a class that OVERRIDES the
827
+ * selector at class level (Ruby `def self.new` returning some other
828
+ * type) is still read as construction, because the scope model records
829
+ * no staticness for a member, so `def new` and `def self.new` are
830
+ * indistinguishable here. Modelling that needs per-member staticness
831
+ * from the language provider first. */
832
+ readonly selector?: string;
833
+ };
670
834
  /**
671
835
  * Optional per-slot conversion-rank function for overload resolution.
672
836
  * When provided, `narrowOverloadCandidates` uses ranked scoring as a
@@ -750,6 +914,24 @@ export interface ScopeResolver {
750
914
  * receiver class is a dispatch candidate).
751
915
  */
752
916
  readonly isStaticOnly?: (def: SymbolDefinition) => boolean;
917
+ /**
918
+ * Optional canonicalizer for a written GENERIC TYPE ARGUMENT, so two
919
+ * spellings of one type compare equal during interface-dispatch
920
+ * instantiation matching (#2912).
921
+ *
922
+ * The case it exists for is a language with predefined ALIASES: C# `string`
923
+ * and `String` are the same type, so `IValidator<string>` must still fan out
924
+ * to `class V : IValidator<String>`. Without the hook the two spellings look
925
+ * like two instantiations and the implementor is pruned — a missing edge,
926
+ * which is the failure direction #2912 is most concerned to avoid.
927
+ *
928
+ * Called ONLY on the two sides of one argument comparison, never on a name
929
+ * used for lookup, so it may map to whatever canonical form the language
930
+ * prefers (`string` → `String`, or the reverse) as long as it is consistent.
931
+ * Languages whose types have one spelling each leave it undefined and the
932
+ * comparison stays exact.
933
+ */
934
+ readonly normalizeTypeArgument?: (name: string) => string;
753
935
  /**
754
936
  * Optional predicate to gate free-call fallback emission by caller-side
755
937
  * visibility. When provided, `pickUniqueGlobalCallable` rejects candidates
@@ -803,6 +985,39 @@ export interface ScopeResolver {
803
985
  readonly startCol: number;
804
986
  };
805
987
  }, callerParsed: ParsedFile, scopes: ScopeResolutionIndexes, parsedFiles: readonly ParsedFile[]) => readonly SymbolDefinition[] | undefined;
988
+ /**
989
+ * Optional resolver for a module-qualified FREE call — a call written with
990
+ * an explicit path but no value receiver (Rust `tools::dispatch(...)`, where
991
+ * `tools` names a module, not a variable or a type).
992
+ *
993
+ * These sites are captured as free calls (`callForm === 'free'`) with the
994
+ * written path preserved in `site.rawQualifiedName`. Without this hook the
995
+ * qualifier is inert and the scope-chain walk resolves the bare tail name —
996
+ * which silently binds to a same-named definition in the CALLER's own file
997
+ * when one exists, producing a self-loop and dropping the real cross-module
998
+ * edge (#2730: `fn dispatch` in `sched.rs` calling `tools::dispatch`
999
+ * resolved to itself, so `impact` reported the central dispatcher as
1000
+ * risk LOW with 0 affected processes).
1001
+ *
1002
+ * `emitFreeCallFallback` invokes this BEFORE the implicit-`this` and
1003
+ * scope-chain lookups, so an explicit path outranks a lexical shadow.
1004
+ * Returning `undefined` (unqualified call, unknown module, or no such
1005
+ * member in the named module) falls through to the unchanged chain — the
1006
+ * hook is strictly additive and never removes an edge the prior tiers
1007
+ * would have produced.
1008
+ *
1009
+ * Languages whose qualified calls carry a value/type receiver (`x.foo()`,
1010
+ * `Type::foo()`) are served by the receiver-bound-calls pass and leave
1011
+ * this undefined.
1012
+ */
1013
+ readonly resolveQualifiedFreeCall?: (site: {
1014
+ readonly name: string;
1015
+ readonly rawQualifiedName?: string;
1016
+ /** Needed to locate the calling MODULE, not just the calling file — a
1017
+ * relative anchor (`super::`) is resolved against the module the call
1018
+ * sits in, which may be an inline `mod` block inside that file. */
1019
+ readonly inScope: ScopeId;
1020
+ }, callerParsed: ParsedFile, scopes: ScopeResolutionIndexes, workspaceIndex: WorkspaceResolutionIndex, allFilePaths: ReadonlySet<string>) => SymbolDefinition | undefined;
806
1021
  /**
807
1022
  * Optional resolver for qualified-receiver member calls where the
808
1023
  * receiver is a namespace (not a class) and ordinary scope-chain /
@@ -821,6 +1036,40 @@ export interface ScopeResolver {
821
1036
  * `undefined` to fall through to the remaining cases.
822
1037
  */
823
1038
  readonly resolveQualifiedReceiverMember?: (receiverName: string, memberName: string, callerScope: ScopeId, scopes: ScopeResolutionIndexes, parsedFiles: readonly ParsedFile[], callsite?: Callsite) => SymbolDefinition | 'ambiguous' | undefined;
1039
+ /**
1040
+ * Every receiver spelling under which a namespace import's target is
1041
+ * reachable, and the file each spelling names (#2826). Returning
1042
+ * `undefined` keeps the shared default: the local binding name alone,
1043
+ * mapped to the edge's own target file.
1044
+ *
1045
+ * Python needs this because one `import a.b.c` statement binds THREE
1046
+ * spellings at once — `a`, `a.b` and `a.b.c` — each naming a DIFFERENT
1047
+ * file (`a/__init__.py`, `a/b/__init__.py`, `a/b/c.py`), while
1048
+ * `ImportEdge` carries only the leaf. The default keyed `a` (its
1049
+ * `localName`) to the LEAF, so `a.helper()` resolved into `a/b/c.py`
1050
+ * whenever that module happened to export `helper` — a wrong edge — and
1051
+ * `a.b.mid()` resolved to nothing at all.
1052
+ *
1053
+ * Shared code cannot derive this. Swift's `import Foo.Bar` produces an
1054
+ * edge shape identical to Python's (`localName: 'Foo'`,
1055
+ * `targetExportedName: 'Foo.Bar'`), yet there the FIRST segment is the
1056
+ * resolved target and `Foo.Bar` names a nested TYPE; keying it would hand
1057
+ * `resolveConstructionExpressionClass` an authoritative namespace — that
1058
+ * branch deliberately does not fall through on a miss — and break
1059
+ * `Foo.Bar(x)` construction that resolves correctly today. And the
1060
+ * `__init__.py` convention that turns a dotted prefix into a file is
1061
+ * Python's alone.
1062
+ *
1063
+ * `moduleFileExists` reports whether a path is a module the workspace
1064
+ * actually parsed, so a provider can propose a prefix file and have it
1065
+ * dropped when absent (a PEP-420 namespace package has no `__init__.py`)
1066
+ * rather than minting a key to a file that is not there.
1067
+ */
1068
+ readonly namespaceReceiverPaths?: (edge: {
1069
+ readonly localName: string;
1070
+ readonly importPath: string;
1071
+ readonly targetFile: string;
1072
+ }, moduleFileExists: (filePath: string) => boolean) => readonly (readonly [spelling: string, targetFile: string])[] | undefined;
824
1073
  /**
825
1074
  * Optional language-specific member-lattice lookup. Runs for a resolved
826
1075
  * simple receiver type before the generic flattened-MRO walk. Languages
@@ -887,6 +1136,38 @@ export interface ScopeResolver {
887
1136
  * level bindings.
888
1137
  */
889
1138
  readonly hoistTypeBindingsToModule?: boolean;
1139
+ /**
1140
+ * Strip ONE layer of type-preserving decoration off a declared type name,
1141
+ * or return `undefined` when there is nothing left to strip.
1142
+ *
1143
+ * Exists because a declared type is stored as written. Go's
1144
+ * `synthesizeGoReceiverBinding` keeps `typeNode.text`, so a pointer-receiver
1145
+ * method binds its receiver to the literal `*Host` — which matches no class
1146
+ * binding, so receiver-chain resolution declines at the base and every
1147
+ * `h.field.method()` in the dominant Go idiom loses its `CALLS` edge (#2766).
1148
+ * The stored binding is deliberately left decorated (`method-owners.ts`
1149
+ * consumes `*T` vs `T` to model Go's value and pointer method sets), so the
1150
+ * normalization belongs at LOOKUP, never as a rewrite of the binding.
1151
+ *
1152
+ * TYPE-PRESERVING ONLY. Pointer, reference, `const`, nullable, borrow,
1153
+ * deref-transparent smart pointer and sigil all leave the member set
1154
+ * unchanged. A CONTAINER — array, slice, map, `Option` — does not: stripping
1155
+ * one here would type `repos: Repo[]` as `Repo` and let `repos.find(x)` fold
1156
+ * to `Repo.find`, a confident wrong edge the ambiguity gate cannot catch
1157
+ * because `Repo` binds uniquely. Containers are unwrapped only by an index
1158
+ * step that consumed a subscript.
1159
+ *
1160
+ * Consulted ONLY after every undecorated lookup has failed, and only by
1161
+ * receiver-chain base and step resolution — the shared class lookup keeps
1162
+ * exact-name behaviour for its other ~two dozen callers, several of which are
1163
+ * shaped `findClassBindingInScope(...) ?? otherResolver(...)` and would have
1164
+ * their fallback suppressed by a global widening.
1165
+ *
1166
+ * Leave undefined for languages whose declared types carry no type-preserving
1167
+ * decoration. Measured: only Go needs it for a receiver base; Rust, C#, Swift,
1168
+ * TypeScript and C++ need it for field types.
1169
+ */
1170
+ readonly stripTypePreservingDecoration?: DecorationStripper;
890
1171
  /**
891
1172
  * Whether the compound-receiver resolver should strip C-style cast
892
1173
  * expressions from receiver-position text before resolving it —
@@ -913,7 +1194,7 @@ export interface ScopeResolver {
913
1194
  *
914
1195
  * A second opting language must extend the classifier grammar or
915
1196
  * convert this toggle into a per-language classifier hook (the
916
- * `unwrapCollectionAccessor` pattern) — do not flip this flag for
1197
+ * `elementTypeOf` pattern) — do not flip this flag for
917
1198
  * another language as-is.
918
1199
  *
919
1200
  * Known non-goal: the compound-receiver options built from this
@@ -929,10 +1210,19 @@ export interface ScopeResolver {
929
1210
  * Languages like Go use structural typing — a struct satisfies an
930
1211
  * interface if its method set is a superset, without an explicit
931
1212
  * `implements` keyword. Runs after finalize, before resolution passes.
932
- * Returns: Map<interface_DefId, implementing_struct_DefId[]>.
1213
+ * Returns: Map<interface_DefId, StructuralImplementor[]>, where each entry
1214
+ * names the implementing type AND the form in which it implements.
1215
+ *
1216
+ * `receiverForm` is not a confidence signal — it is the language's own
1217
+ * distinction. In Go the method set of `T` and of `*T` differ (a
1218
+ * pointer-receiver method belongs only to `*T`), so `receiverForm: 'pointer'`
1219
+ * means the VALUE type does not implement the interface and only `*T` does.
1220
+ * `'value'` means both do. Consumers that only want blast radius can ignore
1221
+ * it; consumers reasoning about assignability must not.
1222
+ *
933
1223
  * Default: undefined (no structural interface detection).
934
1224
  */
935
- readonly detectInterfaceImplementations?: (parsedFiles: readonly ParsedFile[], indexes: ScopeResolutionIndexes, model: SemanticModel) => Map<string, string[]>;
1225
+ readonly detectInterfaceImplementations?: (parsedFiles: readonly ParsedFile[], indexes: ScopeResolutionIndexes, model: SemanticModel) => StructuralImplementationResult;
936
1226
  /**
937
1227
  * Optional: mirror typeBindings from namespace-import target modules
938
1228
  * into the importer's module scope. Languages like Go use namespace
@@ -15,7 +15,7 @@
15
15
  * - propagatesReturnTypesAcrossImports (default true)
16
16
  * - fieldFallbackOnMethodLookup (default true — turn OFF for
17
17
  * statically-typed languages; the heuristic over-connects)
18
- * - unwrapCollectionAccessor — property-style collection views
18
+ * - elementTypeOf — container element type, by subscript or accessor
19
19
  * - collapseMemberCallsByCallerTarget — one edge per caller/target
20
20
  * - populateNamespaceSiblings — cross-file implicit visibility
21
21
  * - hoistTypeBindingsToModule — enable ONLY when method return
@@ -113,13 +113,24 @@
113
113
  * 3. Case 0.5 implicit-`this` chain walk — GATED: fires only for
114
114
  * languages that set `resolveThisViaEnclosingClass === true`;
115
115
  * it intercepts every bare-`this` call/read/write site ahead of
116
- * Case 4 and does NOT emit Case 4's interface-dispatch fan-out,
117
- * so enabling the toggle for a language changes that language's
118
- * `this` dispatch semantics (see the toggle's doc below)
116
+ * Case 4 and does NOT emit the interface-dispatch fan-out that
117
+ * Cases 0, 3b and 4 all perform (Case 0 gained it in #2829 and
118
+ * Case 3b in #2832, leaving 0.5 the only INSTANCE-receiver case
119
+ * that folds or walks to a receiver type without fanning out.
120
+ * Read that narrowly: Case 2 also walks an MRO and its binding
121
+ * admits `Interface`, but its receiver IS the type name, so the
122
+ * site is static dispatch and a fan-out would be wrong; Cases 3
123
+ * and 5 resolve by direct lookup rather than a fold or MRO walk,
124
+ * and no language is known to reach Case 3 with an Interface —
125
+ * every one that could strips the namespace qualifier first,
126
+ * sending it to Case 4), so enabling the toggle
127
+ * for a language changes that language's `this` dispatch
128
+ * semantics (see the toggle's doc below)
119
129
  * 4. Case 1 namespace-receiver
120
130
  * 5. Case 2 class-name receiver
121
131
  * 6. Case 3 dotted typeBinding for namespace prefix
122
- * 7. Case 3b chain-typebinding (compound resolver)
132
+ * 7. Case 3b chain-typebinding (compound resolver + interface-dispatch
133
+ * fan-out on an Interface fold, #2832)
123
134
  * 8. Case 4 simple typeBinding (MRO walk + findOwnedMember)
124
135
  * Reordering or merging cases changes resolution semantics. The
125
136
  * numbering is part of the contract — keep the comments.
@@ -52,6 +52,9 @@ export declare function tryEmitEdge(graph: KnowledgeGraph, scopes: ScopeResoluti
52
52
  startCol: number;
53
53
  };
54
54
  readonly kind: string;
55
+ /** See {@link isPhantomCalleeRead}. Set by the extractor from the
56
+ * language's `@reference.callee-position` marker; absent otherwise. */
57
+ readonly inCalleePosition?: boolean;
55
58
  }, targetDef: SymbolDefinition, reason: string, seen: Set<string>, confidence?: number, collapseByCallerTarget?: boolean, calleeCapture?: CalleeIdCaptureCtx): boolean;
56
59
  /**
57
60
  * Variant of `tryEmitEdge` that takes a pre-resolved target graph id
@@ -65,6 +68,15 @@ export declare function tryEmitEdge(graph: KnowledgeGraph, scopes: ScopeResoluti
65
68
  *
66
69
  * All other invariants of `tryEmitEdge` apply: dedup key shape, collapse
67
70
  * flag honoring, edge-type mapping, caller-id resolution.
71
+ *
72
+ * ONE deliberate exception: the {@link isPhantomCalleeRead} suppression is not
73
+ * applied here, because it keys on the target's node label and this entry point
74
+ * is handed an id rather than a def. Reachable only for a `read` site marked
75
+ * `inCalleePosition` whose receiver typed as an object-literal VALUE — a
76
+ * JS/TS-shaped registration. No language that sets the marker resolves through
77
+ * this bridge today (verified for Go, whose func-valued struct-literal fields
78
+ * resolve through the owned-member path instead). A language adding the marker
79
+ * must re-check this path.
68
80
  */
69
81
  export declare function tryEmitEdgeWithExplicitTargetId(graph: KnowledgeGraph, scopes: ScopeResolutionIndexes, nodeLookup: GraphNodeLookup, site: {
70
82
  readonly inScope: ScopeId;
@@ -14,6 +14,7 @@
14
14
  * (or TypeScript-specific, etc.) logic. The dedup key is
15
15
  * language-agnostic — no language needs to change it.
16
16
  */
17
+ import { CALL_TARGET_TYPES } from '../../model/symbol-table.js';
17
18
  import { resolveCallerGraphId, resolveDefGraphId } from '../graph-bridge/ids.js';
18
19
  /**
19
20
  * Map a `Reference.kind` to a graph edge type. `import-use` is dropped
@@ -48,6 +49,38 @@ export function mapReferenceKindToEdgeType(kind) {
48
49
  return undefined;
49
50
  }
50
51
  }
52
+ /**
53
+ * Is this read site a PHANTOM — a duplicate of the call happening beside it?
54
+ *
55
+ * Some languages' member-read capture also matches the callee of a member call,
56
+ * so `obj.f()` produces a `call` site on `f` AND a `read` site on `obj.f` at the
57
+ * same position (Go's `@reference.read` matches every `selector_expression`).
58
+ * The capture layer marks that second site `inCalleePosition` rather than
59
+ * dropping it, because the two cases it covers are indistinguishable there:
60
+ *
61
+ * - tail resolves to a METHOD → phantom. The ACCESSES edge duplicates the
62
+ * CALLS edge emitted for the same source position; suppress it.
63
+ * - tail resolves to a FIELD → genuine. `h.dep.Work()` where
64
+ * `Work func() error` reads a func-typed struct field and calls the value
65
+ * it holds. That read is the field's only ACCESSES evidence — keep it.
66
+ *
67
+ * Only the resolved target's kind separates them, which is why this decision
68
+ * lives at emission and not in any language's capture code. Sites without the
69
+ * marker are untouched, so a genuine method VALUE (`f := obj.method`) — never in
70
+ * callee position — keeps its read.
71
+ *
72
+ * "Invoked rather than read" is `CALL_TARGET_TYPES` — the canonical callable
73
+ * target set (`FREE_CALLABLE_TYPES` ∪ Method/Constructor), not a local copy. A
74
+ * hand-rolled `{Function, Method, Constructor}` silently omits `Macro` (C/C++)
75
+ * and `Delegate` (C#), the two labels that set exists to add, and drops the
76
+ * `satisfies` guard in `symbol-table.ts` that compile-enforces every free
77
+ * callable label against `LABEL_BEHAVIOR`.
78
+ */
79
+ function isPhantomCalleeRead(site, targetDef) {
80
+ if (site.kind !== 'read' || site.inCalleePosition !== true)
81
+ return false;
82
+ return CALL_TARGET_TYPES.has(targetDef.type);
83
+ }
51
84
  /**
52
85
  * Resolve caller + target to graph ids and emit the edge. Returns true
53
86
  * if the edge was emitted (not deduped, not skipped).
@@ -58,6 +91,11 @@ export function mapReferenceKindToEdgeType(kind) {
58
91
  * double-emit a resolution one of them already produced.
59
92
  */
60
93
  export function tryEmitEdge(graph, scopes, nodeLookup, site, targetDef, reason, seen, confidence = 0.85, collapseByCallerTarget = false, calleeCapture) {
94
+ // A read that only exists because it is the callee of the call beside it, and
95
+ // whose tail resolved to a callable, is that call restated as an access —
96
+ // checked first because it needs no id resolution.
97
+ if (isPhantomCalleeRead(site, targetDef))
98
+ return false;
61
99
  // Inheritance edges are emitted directly by `preEmitInheritanceEdges` (which
62
100
  // owns the enclosing-class caller and the EXTENDS-vs-IMPLEMENTS type), so this
63
101
  // generic bridge derives caller + edge type purely from the site.
@@ -110,6 +148,15 @@ export function tryEmitEdge(graph, scopes, nodeLookup, site, targetDef, reason,
110
148
  *
111
149
  * All other invariants of `tryEmitEdge` apply: dedup key shape, collapse
112
150
  * flag honoring, edge-type mapping, caller-id resolution.
151
+ *
152
+ * ONE deliberate exception: the {@link isPhantomCalleeRead} suppression is not
153
+ * applied here, because it keys on the target's node label and this entry point
154
+ * is handed an id rather than a def. Reachable only for a `read` site marked
155
+ * `inCalleePosition` whose receiver typed as an object-literal VALUE — a
156
+ * JS/TS-shaped registration. No language that sets the marker resolves through
157
+ * this bridge today (verified for Go, whose func-valued struct-literal fields
158
+ * resolve through the owned-member path instead). A language adding the marker
159
+ * must re-check this path.
113
160
  */
114
161
  export function tryEmitEdgeWithExplicitTargetId(graph, scopes, nodeLookup, site, targetGraphId, reason, seen, confidence = 0.85, collapseByCallerTarget = false, calleeCapture) {
115
162
  const callerGraphId = resolveCallerGraphId(site.inScope, scopes, nodeLookup, site.atRange);
@@ -20,23 +20,28 @@ import type { NodeLabel, ParameterTypeClass, ScopeId, SymbolDefinition } from '.
20
20
  import type { ScopeResolutionIndexes } from '../../model/scope-resolution-indexes.js';
21
21
  import { type GraphNodeLookup } from '../graph-bridge/node-lookup.js';
22
22
  /**
23
- * Look up a `SymbolDefinition` in the graph node lookup.
23
+ * Labels that may legitimately ANCHOR a CALLS/ACCESSES edge as the
24
+ * source ("caller"). A Variable / Property can be the TARGET of an
25
+ * edge (e.g., a write-access to `user.name`), but it cannot be a
26
+ * caller — variables don't execute code, so attributing a call to a
27
+ * sibling Variable in the same scope produces nonsense edges like
28
+ * `Variable:create → Function:create` (which the simpleKey fallback
29
+ * in `resolveDefGraphId` then silently rewrites to
30
+ * `Function:create → Function:create`, a self-loop that doesn't exist
31
+ * in the source).
24
32
  *
25
- * Tries the type-prefixed fully-qualified key FIRST. That's the only
26
- * correct key when:
27
- * - Two classes in the same file define a method with the same
28
- * simple name (`class User: def save` + `class Document: def save`).
29
- * - A top-level function and a class method share a simple name
30
- * (`def save` + `class User: def save` — the Function's qualifier
31
- * is just `save`, which would alias the Method's simple-key slot
32
- * without the type prefix).
33
- *
34
- * Falls back to the simple name for definitions whose qualifier the
35
- * lookup didn't capture (rare, but keeps cross-file simple-name
36
- * resolution working for languages that don't yet synthesize
37
- * qualifiers).
33
+ * Module-level call expressions inside a `const X = expr(args)`
34
+ * declaration are the canonical case where this used to fail: the
35
+ * walk-up over module scope's ownedDefs (only Variables) would land
36
+ * on the FIRST Variable, get name-aliased to its sibling Function
37
+ * with the same simple name, and emit a self-CALLS. With this label
38
+ * restricted to function/class-likes, those calls correctly fall
39
+ * through to the File-node fallback at the bottom of the walk.
38
40
  */
41
+ export declare const CALLER_ANCHOR_LABELS: ReadonlySet<NodeLabel>;
39
42
  export declare function resolveDefGraphId(filePath: string, def: {
43
+ /** Scope-resolution def id — carries the declaration position (#2699). */
44
+ nodeId?: string;
40
45
  qualifiedName?: string;
41
46
  type?: NodeLabel;
42
47
  parameterTypes?: readonly string[];
@@ -51,7 +56,7 @@ export declare function resolveDefGraphId(filePath: string, def: {
51
56
  export declare function simpleQualifiedName(def: SymbolDefinition): string | undefined;
52
57
  /**
53
58
  * Walk the scope chain from `startScope` upward looking for the first
54
- * scope whose `ownedDefs` contains a Function/Method/Class — that's
59
+ * scope whose `ownedDefs` contains a callable or class-like anchor — that's
55
60
  * our caller anchor. Translate via `nodeLookup` to the graph-node ID.
56
61
  *
57
62
  * Module-level references (e.g. Python `u = models.User()` at top