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
@@ -19,7 +19,9 @@
19
19
  * syntax). Languages with non-C-family syntax (Ruby blocks, COBOL)
20
20
  * either don't trigger the call branch or skip this pass entirely.
21
21
  */
22
- import { findClassBindingInScope, findEnclosingClassDef, findExportedDefByName, findReceiverTypeBinding, } from '../scope/walkers.js';
22
+ import { erasedTypeApplication, matchingOpenParen, stripTemplateArguments, } from '../../utils/template-arguments.js';
23
+ import { decodeReceiverChain } from '../../utils/receiver-chain-codec.js';
24
+ import { findClassBindingInScope, resolveClassBindingForName, findEnclosingClassDef, findExportedDef, findExportedDefByName, findReceiverTypeBinding, isClassLike, isNamespaceNameShadowed, } from '../scope/walkers.js';
23
25
  /** Max depth for compound-receiver chain resolution (`a().b().c().d()`).
24
26
  * Practical code rarely exceeds 3-4 _syntactic_ hops, but languages
25
27
  * with type-binding-mediated chains (Ruby's `x = obj.method()` binds
@@ -52,6 +54,440 @@ function parseMapTupleSentinel(text) {
52
54
  return null;
53
55
  return { tupleIdx: Number(idxStr), rhs };
54
56
  }
57
+ /** Is this hop the language's construction selector applied to the class
58
+ * itself — `Factory.new` — rather than an ordinary member named `new` on a
59
+ * value? Both call sites ask the identical question, so it is asked in one
60
+ * place (#2708). `onClassConstant` is what separates `Factory.new` from
61
+ * `factory.new`; see the contract field for the known limitation around a
62
+ * class-level override of the selector. */
63
+ function isConstructionSelectorHop(memberName, receiverClass, onClassConstant, options) {
64
+ return (onClassConstant &&
65
+ options.constructionSyntax?.selector === memberName &&
66
+ isClassLike(receiverClass.type));
67
+ }
68
+ /** Escape a literal for embedding in a RegExp. The construction keyword comes
69
+ * from a language provider, so it is not user input, but a keyword containing
70
+ * a metacharacter would otherwise silently build a wrong pattern. */
71
+ function escapeForRegExp(literal) {
72
+ return literal.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
73
+ }
74
+ /**
75
+ * Type of a construction expression's callee — the class it constructs.
76
+ *
77
+ * `Service` (bare, when the language constructs without a keyword) and
78
+ * `new Service` (keyword form) both name the class being built, so the
79
+ * expression's type is that class. Together with
80
+ * `isConstructionSelectorHop` (the `Class.new` spelling), this is where the
81
+ * rule "constructing a class yields an instance of it" lives; the
82
+ * per-language surface syntax arrives via `constructionSyntax` (#2708).
83
+ *
84
+ * Returns undefined when the language declares no construction syntax,
85
+ * when the callee names no class-like symbol reachable from `inScope`,
86
+ * or when the keyword is required but absent — never a guess.
87
+ */
88
+ function resolveConstructionExpressionClass(fnExpr, inScope, scopes, index, options) {
89
+ const syntax = options.constructionSyntax;
90
+ if (syntax === undefined)
91
+ return undefined;
92
+ let calleeName;
93
+ // The keyword is separated from the type by whatever trivia the source
94
+ // used — `new Service`, `new\tService`, or a line break — so match the
95
+ // keyword as a whole token followed by at least one whitespace character
96
+ // rather than by exactly one space (#2708). `newService()` keeps failing
97
+ // the match, which is the point: it is an ordinary call.
98
+ const keywordMatch = syntax.keyword === undefined
99
+ ? null
100
+ : new RegExp(`^${escapeForRegExp(syntax.keyword)}\\s+`).exec(fnExpr);
101
+ if (keywordMatch !== null) {
102
+ calleeName = fnExpr.slice(keywordMatch[0].length).trim();
103
+ }
104
+ else if (syntax.bare === true) {
105
+ calleeName = fnExpr;
106
+ }
107
+ // A `new`-keyword language reaching here without the keyword is an
108
+ // ordinary free call, not a construction — resolving it to the class
109
+ // would fabricate an edge (a factory function may share the class's
110
+ // name).
111
+ if (calleeName === undefined || calleeName.length === 0)
112
+ return undefined;
113
+ // Generic construction — `new Box<string>()` arrives here as `Box<string>`,
114
+ // which names no class binding. Retry on the base name, the same
115
+ // normalization `resolveClassBindingForName` (in `scope/walkers.ts`) already
116
+ // applies for typed receivers (#2708).
117
+ const baseName = stripTemplateArguments(calleeName).trim();
118
+ const lastDot = baseName.lastIndexOf('.');
119
+ if (lastDot !== -1) {
120
+ const namespaceName = baseName.slice(0, lastDot);
121
+ const exportedName = baseName.slice(lastDot + 1);
122
+ const namespaceFiles = options.namespaceTargets?.get(namespaceName) ?? [];
123
+ // A verified namespace is authoritative: do not fall through to the
124
+ // workspace-wide simple-name heuristics on either a miss or ambiguity.
125
+ if (namespaceFiles.length > 0) {
126
+ if (isNamespaceNameShadowed(namespaceName, inScope, scopes))
127
+ return undefined;
128
+ const namespaceMatches = namespaceFiles
129
+ .map((targetFile) => findExportedDef(targetFile, exportedName, index))
130
+ .filter((def) => def !== undefined && isClassLike(def.type));
131
+ return namespaceMatches.length === 1 ? namespaceMatches[0] : undefined;
132
+ }
133
+ }
134
+ const direct = findClassBindingInScope(inScope, calleeName, scopes);
135
+ if (direct !== undefined && isClassLike(direct.type))
136
+ return direct;
137
+ if (baseName.length > 0 && baseName !== calleeName) {
138
+ const viaBaseName = findClassBindingInScope(inScope, baseName, scopes);
139
+ if (viaBaseName !== undefined && isClassLike(viaBaseName.type))
140
+ return viaBaseName;
141
+ }
142
+ // Qualified callee — `new ns.Service()` / `new Outer.Inner()`. Prefer an
143
+ // unambiguous qualified-name match, then fall back to the trailing simple
144
+ // name the way receiver resolution does elsewhere (#2708).
145
+ if (lastDot === -1)
146
+ return undefined;
147
+ const qualifiedIds = scopes.qualifiedNames.get(baseName);
148
+ if (qualifiedIds.length === 1) {
149
+ const qualified = scopes.defs.get(qualifiedIds[0]);
150
+ if (qualified !== undefined && isClassLike(qualified.type))
151
+ return qualified;
152
+ }
153
+ const simpleName = baseName.slice(lastDot + 1);
154
+ if (simpleName.length === 0)
155
+ return undefined;
156
+ const viaSimpleName = findClassBindingInScope(inScope, simpleName, scopes);
157
+ return viaSimpleName !== undefined && isClassLike(viaSimpleName.type) ? viaSimpleName : undefined;
158
+ }
159
+ /**
160
+ * The class a receiver position's DECLARED TYPE denotes — the one lookup every
161
+ * route in this file uses to turn a `TypeRef` into an owner to look the next
162
+ * member up on.
163
+ *
164
+ * ── WHY NOT `findClassBindingInScope(scope, typeRef.rawName)` ────────────────
165
+ *
166
+ * `rawName` is post-normalization, and several providers reduce a type
167
+ * APPLICATION to its base name at capture time (`Mapped[User]` → `Mapped`,
168
+ * `Repo<User>` → `Repo`). Handing that base name to the bare lookup takes its
169
+ * workspace-wide qualified-name fallback, which consults no scope, no import
170
+ * and no module: it binds whatever the workspace happens to declare under that
171
+ * name. A third-party `Mapped[User]` beside an unrelated workspace
172
+ * `class Mapped` then produces a confident WRONG edge — strictly worse than the
173
+ * missing one it replaced, and not recoverable downstream.
174
+ *
175
+ * `resolveClassBindingForName` owns the grounding rule for exactly this
176
+ * ({@link resolveErasedBaseName}: the scope chain binds the name, or the
177
+ * declaration is in the same file, or the index proves the name is a template
178
+ * family, or the file has no cross-file class channel to be absent from), but it
179
+ * is entered on the SPELLING — a name that already lost its arguments is
180
+ * indistinguishable from an ordinary class name. {@link erasedTypeApplication}
181
+ * restores the application from `declaredSpelling`, which is what puts a
182
+ * capture-time-erased receiver back on the grounded route.
183
+ *
184
+ * ── WHY IT IS ONE HELPER AND NOT FIVE CALL SITES ─────────────────────────────
185
+ *
186
+ * This file types a receiver position from a `TypeRef` in five places — the
187
+ * structural fold's member step and its module-hoist branch, the cascade's
188
+ * bare-identifier binding, the cascade's dotted-chain HEAD, and the cascade's
189
+ * per-segment member walk. They are five routes to ONE question, and only three
190
+ * were wired to the grounded lookup, which is what left the hole: a Python
191
+ * `self.m.save(u)` whose fold step correctly refused fell THROUGH to the
192
+ * cascade — a declined fold is documented as "no answer", never a veto — and
193
+ * the cascade's own ungrounded member walk re-minted the very edge the grounds
194
+ * had just rejected. One shared helper is what makes "the fold refused" and
195
+ * "the cascade refused" the same sentence, rather than two lookups that happen
196
+ * to agree until one of them is edited.
197
+ *
198
+ * `stripDecoration` stays a per-caller argument because it is a DIFFERENT
199
+ * normalization with its own risk — its own docstring records that turning a
200
+ * former `undefined` into a hit suppresses the `?? otherResolver(...)`
201
+ * fallbacks two dozen call sites rely on. The three fold/binding callers pass
202
+ * the provider's stripper as they always have; the two cascade callers pass
203
+ * nothing, as they always have. So the only behaviour this helper changes
204
+ * anywhere is the erasure grounding, and a `TypeRef` that was never reduced
205
+ * resolves through the identical `findClassBindingInScope` call it did before
206
+ * (`resolveClassBindingForName` tries that first, and a name with no `<`
207
+ * returns immediately after it).
208
+ */
209
+ function classOfDeclaredType(typeRef, scopes, stripDecoration, recordReceiverType) {
210
+ // `declaredAtScope`, never a scope the caller chose: all five sites passed
211
+ // exactly this `TypeRef`'s own anchor, and taking it as a parameter is what
212
+ // would let a sixth quietly not — which is the hole this helper exists to
213
+ // close, one level up.
214
+ const spelling = erasedTypeApplication(typeRef) ?? typeRef.rawName;
215
+ const def = resolveClassBindingForName(typeRef.declaredAtScope, spelling, scopes, stripDecoration);
216
+ return noteReceiverType(recordReceiverType, spelling, def);
217
+ }
218
+ /**
219
+ * Report the SPELLING a receiver position was typed from, alongside the class
220
+ * it resolved to (#2912).
221
+ *
222
+ * The fold answers "which class", which is all dispatch needed until generic
223
+ * instantiation mattered: `IValidator<string>` and `IValidator<int>` fold to
224
+ * the same declaration. The spelling is the only place the arguments survive,
225
+ * and it exists at every one of these lookups already — reporting it costs a
226
+ * function call and changes no resolution.
227
+ *
228
+ * Pairing it with the def id is what makes it usable: the caller keeps the LAST
229
+ * report and uses it only if it names the class the fold ultimately returned,
230
+ * so a route that typed an intermediate position, or a later route that
231
+ * answered differently, cannot lend its arguments to another class.
232
+ */
233
+ function noteReceiverType(record, spelling, def) {
234
+ if (def !== undefined)
235
+ record?.(spelling, def.nodeId);
236
+ return def;
237
+ }
238
+ /**
239
+ * The class a CALL's return type names, reported to the receiver-type side
240
+ * channel — the return-type twin of {@link classOfDeclaredType}.
241
+ *
242
+ * The pairing it exists to keep in one place: the lookup goes through
243
+ * `rawName`, while the SPELLING reported alongside it is the erased type
244
+ * application, so an `IValidator<string>` return is reported with its
245
+ * arguments intact. The spelling is built only once the lookup has actually
246
+ * found a class, because it is discarded otherwise — and every fold hop
247
+ * through a call reaches this, generic or not.
248
+ */
249
+ function classOfReturnType(retType, scopes, record) {
250
+ const def = findClassBindingInScope(retType.declaredAtScope, retType.rawName, scopes);
251
+ if (def === undefined || record === undefined)
252
+ return def;
253
+ return noteReceiverType(record, erasedTypeApplication(retType) ?? retType.rawName, def);
254
+ }
255
+ function typeOfMemberOnClass(owner, memberName, scopes, index, options) {
256
+ const classScopeByDefId = index.classScopeByDefId;
257
+ const ownerChain = [owner.nodeId, ...scopes.methodDispatch.mroFor(owner.nodeId)];
258
+ for (const ownerId of ownerChain) {
259
+ const classScope = classScopeByDefId.get(ownerId);
260
+ const memberType = classScope?.typeBindings.get(memberName);
261
+ if (memberType !== undefined) {
262
+ const def = classOfDeclaredType(memberType, scopes, options.stripTypePreservingDecoration, options.recordReceiverType);
263
+ // The declared type is reported even when it resolved to no class:
264
+ // `Promise<User>` and `[]Repo` name nothing in the workspace, and an
265
+ // await or index step unwrapping them is exactly how they become
266
+ // resolvable. Returning `undefined` here would strand those shapes. A
267
+ // `def` that stayed absent is reported as absent, NOT as the previous
268
+ // owner, so nothing may fold an ordinary member off this position.
269
+ return {
270
+ def,
271
+ declaredType: memberType.declaredSpelling ?? memberType.rawName,
272
+ declaredAtScope: memberType.declaredAtScope,
273
+ };
274
+ }
275
+ // Languages whose binding-scope hook hoists a method's return-type binding
276
+ // out of the class body and onto an ancestor (Module) scope keep NOTHING in
277
+ // the class scope to find — TypeScript is one, via `tsBindingScopeFor`, so
278
+ // without this walk the fold cannot type a single step in the first
279
+ // language it ships for. Gated on the same contract flag
280
+ // `resolveCompoundReceiverClass` uses, so a language that does not hoist
281
+ // cannot pick up an unrelated module-level binding of the same name.
282
+ if (classScope !== undefined && options.hoistTypeBindingsToModule === true) {
283
+ let curId = classScope.parent;
284
+ while (curId !== null) {
285
+ const curScope = scopes.scopeTree.getScope(curId);
286
+ if (curScope === undefined)
287
+ break;
288
+ const hoisted = curScope.typeBindings.get(memberName);
289
+ if (hoisted !== undefined) {
290
+ // Same stripper the primary branch above passes. Omitting it here
291
+ // meant a decorated declared type (`*Host`) resolved on one branch and
292
+ // not the other, for the same member of the same class.
293
+ const def = classOfDeclaredType(hoisted, scopes, options.stripTypePreservingDecoration, options.recordReceiverType);
294
+ // Identical to the primary branch: a declared type that named no
295
+ // class is still a usable position when the next step unwraps it.
296
+ // Returning `undefined` here made `svc.getMap()['k'].run()` decline
297
+ // while byte-identical `byId['k'].run()` resolved, purely because ten
298
+ // languages route return-type bindings through this hoisted branch
299
+ // and the other through the class scope.
300
+ return {
301
+ def,
302
+ declaredType: hoisted.declaredSpelling ?? hoisted.rawName,
303
+ declaredAtScope: hoisted.declaredAtScope,
304
+ };
305
+ }
306
+ curId = curScope.parent;
307
+ }
308
+ }
309
+ }
310
+ return undefined;
311
+ }
312
+ /**
313
+ * Type a receiver from its decoded structure instead of from its source text.
314
+ *
315
+ * Resolves the base, then folds the steps base-first, each step typed against
316
+ * the class the previous step produced. Returns `undefined` the moment any step
317
+ * fails to type, so the caller falls back to the existing text cascade rather
318
+ * than receiving a partially-folded guess — a missing edge is recoverable, a
319
+ * confidently wrong one is not.
320
+ *
321
+ * The base is resolved by handing it to `resolveCompoundReceiverClass`, which
322
+ * already owns the bare-identifier path in full: type binding, static
323
+ * class-name receivers, map-tuple sentinels, member aliases and call-result
324
+ * aliases. A second implementation of that would drift from it.
325
+ *
326
+ * Called from `resolveCompoundReceiverClass` ahead of the text cascade, and only
327
+ * when the site carries a `receiverChain` (see the `depth === 0` gate below).
328
+ */
329
+ export function foldReceiverChain(chain, inScope, scopes, index, options = {}) {
330
+ // A truncated chain is missing the head that decides the final type. The
331
+ // producer refuses to mint one, so this is defence in depth against a
332
+ // future producer that does.
333
+ if (chain.truncated)
334
+ return undefined;
335
+ if (chain.steps.length === 0)
336
+ return undefined;
337
+ // `receiverChain` is dropped before resolving the base: it describes the
338
+ // whole receiver, and handing it back to the resolver would re-enter this
339
+ // fold on the base and never terminate.
340
+ const baseDef = resolveCompoundReceiverClass(chain.baseReceiverName, inScope, scopes, index, {
341
+ ...options,
342
+ fieldFallback: false,
343
+ receiverChain: undefined,
344
+ strictBaseBinding: true,
345
+ });
346
+ // The base's own declared type is carried too, so a chain whose FIRST step is
347
+ // an unwrap (`repos[0].save()` — index applied directly to the base) has the
348
+ // container spelling available. Without it that shape declines at step 1.
349
+ // Looked up ONLY when something will read it: the base failed to resolve (so
350
+ // an unwrap step is the last chance), or an index step will unwrap the
351
+ // container. `resolveCompoundReceiverClass` already walked the scope chain for
352
+ // this same name above, so doing it unconditionally duplicated that walk on
353
+ // every fold — and the U10 census says 86% of chains are pure field/call and
354
+ // never read it.
355
+ const needsBaseDeclaredType = baseDef === undefined || chain.steps.some((step) => step.kind === 'index');
356
+ const baseBinding = needsBaseDeclaredType
357
+ ? findReceiverTypeBinding(inScope, chain.baseReceiverName, scopes)
358
+ : undefined;
359
+ // A base whose declared type names no class is NOT automatically a dead end:
360
+ // `repos: User[]` binds to the literal `User[]`, which matches no class
361
+ // because a container is not one. That position is still usable IF the next
362
+ // step unwraps it — which is exactly what an index step does. Carrying it
363
+ // forward with the marker lets that step recover; every other step kind
364
+ // declines on the marker, so nothing folds against a phantom owner.
365
+ if (baseDef === undefined && baseBinding === undefined)
366
+ return undefined;
367
+ let current = {
368
+ def: baseDef,
369
+ declaredType: baseBinding?.declaredSpelling ?? baseBinding?.rawName,
370
+ declaredAtScope: baseBinding?.declaredAtScope,
371
+ };
372
+ for (const step of chain.steps) {
373
+ // A position whose declared type named no class can only be advanced by an
374
+ // unwrapping step. Folding an ordinary member off it would look the member
375
+ // up on the PREVIOUS class — a wrong owner, silently.
376
+ //
377
+ // `await` IS identity, and soundly so: every language whose capture layer
378
+ // reduces the wrapper has ALREADY done it by the time a binding reaches the
379
+ // fold (TypeScript strips `Promise<X>`, C# strips `Task<X>`), and awaiting a
380
+ // value that is NOT a thenable yields that same value — so both regimes land
381
+ // on the identical answer and there is nothing to distinguish.
382
+ if (step.kind === 'await')
383
+ continue;
384
+ if (step.kind === 'index') {
385
+ // An index step is NOT identity, and that asymmetry with `await` above is
386
+ // the whole point. `await` on a non-promise is a no-op; a subscript on a
387
+ // non-container is not — it yields the element of an indexer whose type
388
+ // is a different class entirely.
389
+ //
390
+ // The NORMALIZED type name cannot tell the two regimes apart: capture
391
+ // reduces `repos: User[]` to `User`, so a reduced container and a class
392
+ // the source merely subscripted (`grid: Grid` where `Grid` declares an
393
+ // index signature) both arrive as a bare, resolvable class name. Falling
394
+ // back to identity there kept `current` on the CONTAINER and looked the
395
+ // next member up on it — `grid[0].run()` → `Grid.run`, `t[0].Render()` →
396
+ // `Table.Render`. A confidently wrong owner, which is strictly worse than
397
+ // no edge and invisible to a bench that scores edge PRESENCE.
398
+ //
399
+ // So the step demands positive evidence instead: `declaredType`, the
400
+ // AS-WRITTEN spelling (`TypeRef.declaredSpelling`, preserved precisely
401
+ // because `rawName` threw it away), handed to the language's
402
+ // `elementTypeOf`. A provider that does not recognize the spelling as a
403
+ // container is answering "not a container", and the only sound move is to
404
+ // decline — a language must therefore answer the `index` route to get
405
+ // index folding at all.
406
+ const declared = current.declaredType;
407
+ const element = declared === undefined ? undefined : options.elementTypeOf?.(declared, { kind: 'index' });
408
+ if (element === undefined)
409
+ return undefined;
410
+ const scopeForLookup = current.declaredAtScope ?? inScope;
411
+ const elementClass = findClassBindingInScope(scopeForLookup, element, scopes, options.stripTypePreservingDecoration);
412
+ if (elementClass === undefined)
413
+ return undefined;
414
+ current = {
415
+ def: elementClass,
416
+ declaredType: element,
417
+ declaredAtScope: scopeForLookup,
418
+ };
419
+ continue;
420
+ }
421
+ // Construction is NOT an ordinary member lookup. `Factory.new` on a class
422
+ // constant denotes an instance of Factory, and the cascade already encodes
423
+ // that (`isConstructionSelectorHop`) along with the class-constant test that
424
+ // separates it from an instance method genuinely named `new`. The fold
425
+ // carries no such distinction — a chain step records a name, not whether its
426
+ // base was a class reference or a value — so folding one would resolve
427
+ // `Factory.new.run` against whatever member named `new` the lookup reaches
428
+ // first. That turned a correct edge into a WRONG one (Ruby
429
+ // `Factory.new.run` → `Product.run`), which is the failure mode this whole
430
+ // line of work exists to avoid. Decline and let the cascade answer.
431
+ //
432
+ // Placed AFTER the name-free continues above, deliberately. When it sat
433
+ // first, `options.constructionSyntax?.selector === step.name` compared
434
+ // `undefined === undefined` for every await/index step in a language with no
435
+ // construction selector, vetoing the entire fold before it ran — which is
436
+ // why those receivers minted a chain, fired the gate, and produced no edge.
437
+ // Position, not a guard, is what makes that unreachable: only named steps
438
+ // get here.
439
+ if (options.constructionSyntax?.selector === step.name)
440
+ return undefined;
441
+ if (current.def === undefined)
442
+ return undefined;
443
+ const next = typeOfMemberOnClass(current.def, step.name, scopes, index, options);
444
+ if (next === undefined)
445
+ return undefined;
446
+ current = next;
447
+ }
448
+ // A chain that ended without a class returns undefined naturally — no
449
+ // separate guard, because `def` IS the signal.
450
+ //
451
+ // The receiver-type report is made HERE, from the final `FoldState`, because
452
+ // that record pairs the class with the spelling that produced it BY
453
+ // CONSTRUCTION — same step, same lookup. The individual `classOfDeclaredType`
454
+ // calls inside the fold also report, including from steps that were later
455
+ // folded past, so the last of those is not reliably about the class the fold
456
+ // returns. Reporting the final state last makes it the one that stands.
457
+ if (current.def !== undefined && current.declaredType !== undefined) {
458
+ options.recordReceiverType?.(current.declaredType, current.def.nodeId);
459
+ }
460
+ return current.def;
461
+ }
462
+ /**
463
+ * {@link resolveCompoundReceiverClass}, paired with the spelling that typed the
464
+ * position (#2912).
465
+ *
466
+ * The sink is created and read HERE, per call, which is the whole point: a
467
+ * recorder that outlives one resolution has to be reset by hand before every
468
+ * call, and the retry shapes in this pass make two calls in a row — a reset
469
+ * missed at one of them silently attributes the previous receiver's spelling to
470
+ * this one. A local cannot be forgotten.
471
+ *
472
+ * The def-id guard is the second half. Lookups that lost — an MRO walk that
473
+ * moved on, a fold step later folded past — report too, so a report counts only
474
+ * when it names the class actually returned. `foldReceiverChain` reports its
475
+ * final state last for exactly this reason, so the structural route wins.
476
+ */
477
+ export function resolveCompoundReceiverTyped(receiverText, inScope, scopes, index, options = {}) {
478
+ let spelling;
479
+ let spellingDefId;
480
+ const def = resolveCompoundReceiverClass(receiverText, inScope, scopes, index, {
481
+ ...options,
482
+ recordReceiverType: (reported, defId) => {
483
+ spelling = reported;
484
+ spellingDefId = defId;
485
+ },
486
+ });
487
+ if (def === undefined)
488
+ return undefined;
489
+ return { def, declaredSpelling: spellingDefId === def.nodeId ? spelling : undefined };
490
+ }
55
491
  export function resolveCompoundReceiverClass(receiverText, inScope, scopes, index, options = {}, depth = 0) {
56
492
  const classScopeByDefId = index.classScopeByDefId;
57
493
  if (depth > COMPOUND_RECEIVER_MAX_DEPTH)
@@ -60,6 +496,26 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
60
496
  if (text.length === 0)
61
497
  return undefined;
62
498
  const fieldFallback = options.fieldFallback ?? true;
499
+ // ── Structural fold, ahead of the text cascade ───────────────────
500
+ // When the capture layer produced a chain for this site, type the receiver
501
+ // from that structure. The cascade below dispatches on enumerated textual
502
+ // shapes, so every new spelling (`?.`, `!`, `<T>`, `->`) needs another branch;
503
+ // the AST already knew the answer and the chain carries it.
504
+ //
505
+ // Only at depth 0 — the chain describes THIS site's receiver, not the inner
506
+ // expressions the cascade recurses into.
507
+ //
508
+ // A failed fold falls through rather than returning: structure is an
509
+ // additional route to an answer, never a veto on the existing one, so a site
510
+ // the cascade could already resolve keeps resolving.
511
+ if (depth === 0 && options.receiverChain !== undefined) {
512
+ const decoded = decodeReceiverChain(options.receiverChain);
513
+ if (decoded !== undefined) {
514
+ const folded = foldReceiverChain(decoded, inScope, scopes, index, options);
515
+ if (folded !== undefined)
516
+ return folded;
517
+ }
518
+ }
63
519
  // ── Pre-processing: strip C-style cast expressions (opt-in) ──────
64
520
  // Cast-wrapped receivers like ((Type)((Object)this.field)).method()
65
521
  // produce parenthesized-expression receiver text. For languages that
@@ -103,6 +559,20 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
103
559
  return undefined;
104
560
  return findClassBindingInScope(rhsTb.declaredAtScope, arg, scopes);
105
561
  }
562
+ // A language may declare that `this` IS the enclosing class rather than a
563
+ // per-function-scope binding (`ScopeResolver.resolveThisViaEnclosingClass`,
564
+ // the same flag Case 0.5 in `receiver-bound-calls` uses for a BARE `this`
565
+ // receiver). Such a language synthesizes no `this` typeBinding anywhere, so
566
+ // a chain whose BASE is `this` — `this->repo.save(u)`, `this.repo.save(u)` —
567
+ // had no way to seed its head and folded to nothing. Measured for the
568
+ // NON-generic control too, so it was never a generics gap.
569
+ // Placed before the typeBinding read: a language that DOES bind `this` per
570
+ // function scope never sets the flag, so nothing else can reach this.
571
+ if (workingText === 'this' && options.resolveThisViaEnclosingClass === true) {
572
+ const enclosing = findEnclosingClassDef(inScope, scopes);
573
+ if (enclosing !== undefined)
574
+ return enclosing;
575
+ }
106
576
  const tb = findReceiverTypeBinding(inScope, workingText, scopes);
107
577
  if (tb !== undefined) {
108
578
  // Map for-of: binding name is `user` but rawType is
@@ -118,7 +588,7 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
118
588
  return undefined;
119
589
  return findClassBindingInScope(rhsTb.declaredAtScope, arg, scopes);
120
590
  }
121
- const viaTb = findClassBindingInScope(tb.declaredAtScope, tb.rawName, scopes);
591
+ const viaTb = classOfDeclaredType(tb, scopes, options.stripTypePreservingDecoration, options.recordReceiverType);
122
592
  if (viaTb !== undefined)
123
593
  return viaTb;
124
594
  // Member-alias / call-result shapes store the RHS path on rawName
@@ -148,6 +618,12 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
148
618
  return compound;
149
619
  }
150
620
  }
621
+ // Mirror the dotted-chain head rule below (`headType ? … : …`): a binding
622
+ // that EXISTS but resolves to no class means "not a typed receiver", not
623
+ // "try the class namespace instead". Only the structural fold opts in; the
624
+ // cascade keeps its historical fallthrough so no existing edge moves.
625
+ if (tb !== undefined && options.strictBaseBinding === true)
626
+ return undefined;
151
627
  return findClassBindingInScope(inScope, workingText, scopes);
152
628
  }
153
629
  // Trailing `()` — call expression. Strip it and resolve the function
@@ -161,26 +637,66 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
161
637
  const fnExpr = workingText.slice(0, openIdx).trim();
162
638
  if (fnExpr.length === 0)
163
639
  return undefined;
640
+ // A keyword-marked construction is never an `obj.method()` call, even when
641
+ // the type is qualified (`new ns.Service()`), so it must be resolved before
642
+ // the dot-split below routes it into member resolution (#2708).
643
+ const keyword = options.constructionSyntax?.keyword;
644
+ if (keyword !== undefined && new RegExp(`^${escapeForRegExp(keyword)}\\s`).test(fnExpr)) {
645
+ return resolveConstructionExpressionClass(fnExpr, inScope, scopes, index, options);
646
+ }
164
647
  const lastDot = fnExpr.lastIndexOf('.');
165
648
  if (lastDot === -1) {
166
649
  // Free call `name()`. Look up function in scope, then its
167
650
  // return-type typeBinding (which lives in the function's
168
651
  // enclosing scope per the language's return-type hoist rule).
169
652
  const fnDef = findExportedDefByName(fnExpr, inScope, scopes, index);
170
- if (fnDef === undefined)
171
- return undefined;
172
- const retType = findReceiverTypeBinding(inScope, fnExpr, scopes);
173
- if (retType === undefined)
174
- return undefined;
175
- return findClassBindingInScope(retType.declaredAtScope, retType.rawName, scopes);
653
+ if (fnDef !== undefined) {
654
+ const retType = findReceiverTypeBinding(inScope, fnExpr, scopes);
655
+ const viaReturn = retType === undefined
656
+ ? undefined
657
+ : classOfReturnType(retType, scopes, options.recordReceiverType);
658
+ if (viaReturn !== undefined)
659
+ return viaReturn;
660
+ }
661
+ // Inline construction — `Service(db).m()` / `new Service(db).m()`.
662
+ // The constructed value IS the receiver, so there is no binding to
663
+ // read a type off; the return-type path above cannot help either,
664
+ // because a class has no return-type binding. Type it from the
665
+ // class the callee names (#2708).
666
+ return resolveConstructionExpressionClass(fnExpr, inScope, scopes, index, options);
176
667
  }
177
668
  // `obj.method()` — resolve obj's class, look up method's return
178
669
  // type on that class scope (or the MRO).
179
670
  const objExpr = fnExpr.slice(0, lastDot);
180
671
  const methodName = fnExpr.slice(lastDot + 1);
181
672
  const objClass = resolveCompoundReceiverClass(objExpr, inScope, scopes, index, options, depth + 1);
182
- if (objClass === undefined)
673
+ if (objClass === undefined) {
674
+ // A verified namespace-qualified bare constructor is syntactically
675
+ // indistinguishable from an untyped member call here. Only the namespace
676
+ // map makes the constructor interpretation safe.
677
+ if (options.namespaceTargets?.has(objExpr) === true) {
678
+ return resolveConstructionExpressionClass(fnExpr, inScope, scopes, index, options);
679
+ }
183
680
  return undefined;
681
+ }
682
+ // Does `objExpr` name the CLASS ITSELF (`Factory.new`) rather than a
683
+ // value whose type is that class (`factory.new`)? Only the former is
684
+ // a construction — see the selector fallback below. A bare identifier
685
+ // that resolves straight to the class binding is the class constant;
686
+ // anything reached through a typeBinding is an instance.
687
+ const objIsClassConstant = !objExpr.includes('(') &&
688
+ !objExpr.includes('.') &&
689
+ findClassBindingInScope(inScope, objExpr, scopes)?.nodeId === objClass.nodeId;
690
+ // Selector-form construction — `Factory.new.do_work` (#2708). Gated on the
691
+ // receiver naming the CLASS: `factory.new` is an ordinary call to a member
692
+ // named `new` on an instance, and reading that as construction replaced a
693
+ // correct edge with a wrong one. For the class constant, construction wins
694
+ // over any recorded binding for the selector, because a member named `new`
695
+ // on a class is an instance method Ruby never reaches through the constant
696
+ // (see the contract's KNOWN LIMITATION note for the `def self.new` case).
697
+ if (isConstructionSelectorHop(methodName, objClass, objIsClassConstant, options)) {
698
+ return objClass;
699
+ }
184
700
  let retType;
185
701
  const ownerChain = [objClass.nodeId, ...scopes.methodDispatch.mroFor(objClass.nodeId)];
186
702
  for (const ownerId of ownerChain) {
@@ -246,7 +762,7 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
246
762
  }
247
763
  if (retType === undefined)
248
764
  return undefined;
249
- return findClassBindingInScope(retType.declaredAtScope, retType.rawName, scopes);
765
+ return classOfReturnType(retType, scopes, options.recordReceiverType);
250
766
  }
251
767
  // Mixed dotted + call chain: `obj.field.method().field.method()…`.
252
768
  // Split at top-level `.` (those NOT inside balanced `(...)`) so a
@@ -263,7 +779,7 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
263
779
  // the final segment and unwraps the receiver's generic, return
264
780
  // the element class directly. Resolved before the field-walk
265
781
  // because Dictionary-family types aren't local class defs.
266
- if (options.unwrapCollectionAccessor !== undefined && parts.length >= 2) {
782
+ if (options.elementTypeOf !== undefined && parts.length >= 2) {
267
783
  const last = parts[parts.length - 1];
268
784
  const headInner = parts[0];
269
785
  if (last === undefined || headInner === undefined)
@@ -294,7 +810,12 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
294
810
  prefixType = cur;
295
811
  }
296
812
  if (prefixType !== undefined) {
297
- const elemName = options.unwrapCollectionAccessor(prefixType.rawName, last);
813
+ // `rawName`, not `declaredSpelling`, and deliberately: the accessor route
814
+ // only fires on a multi-arg container (`Dictionary<K,V>`), which every
815
+ // provider's capture-time normalization leaves ALONE — so the two are the
816
+ // same string here, and reading the spelling would change nothing except
817
+ // to widen an unmeasured surface.
818
+ const elemName = options.elementTypeOf(prefixType.rawName, { kind: 'accessor', name: last });
298
819
  if (elemName !== undefined) {
299
820
  return findClassBindingInScope(prefixType.declaredAtScope, elemName, scopes);
300
821
  }
@@ -305,9 +826,27 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
305
826
  return undefined;
306
827
  const headMemberName = stripCallParens(head);
307
828
  const headType = findReceiverTypeBinding(inScope, headMemberName, scopes);
829
+ // The typed arm reads a DECLARED TYPE and so goes through the grounded lookup
830
+ // (see {@link classOfDeclaredType}); the untyped arm resolves the head NAME as
831
+ // the source WROTE it — a static class receiver — which was never erased and
832
+ // keeps the bare lookup.
833
+ //
834
+ // NO MEASURED CASE OF ITS OWN, and that is worth saying plainly: every fixture
835
+ // reaching here has an un-erased head (`self`, `this`, a local), for which the
836
+ // two lookups are the same call. It is changed because leaving one of five
837
+ // sibling reads of a `TypeRef` on the ungrounded lookup is precisely how the
838
+ // hole below survived — three were wired, two were not, and only one of the
839
+ // two had a fixture. See `classOfDeclaredType` for why this cannot change a
840
+ // `TypeRef` that was never reduced.
308
841
  let currentClass = headType
309
- ? findClassBindingInScope(headType.declaredAtScope, headType.rawName, scopes)
842
+ ? classOfDeclaredType(headType, scopes, undefined, options.recordReceiverType)
310
843
  : findClassBindingInScope(inScope, headMemberName, scopes);
844
+ // Whether the walk currently sits on the CLASS ITSELF rather than on a
845
+ // value of that class. Seeded true only when the head resolved straight to
846
+ // a class binding (`Factory.new…`); a head reached through a typeBinding
847
+ // (`factory = Factory.new` then `factory.new…`) is already an instance.
848
+ // Every hop past the head yields a value, so it clears below (#2708).
849
+ let currentIsClassConstant = headType === undefined && currentClass !== undefined;
311
850
  // Head seed for a literal `this` head with no receiver typeBinding in
312
851
  // scope: languages synthesize `this` typeBindings per function scope,
313
852
  // so a chain site outside any function scope (a field initializer or
@@ -320,10 +859,20 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
320
859
  // lexically enclosing class would fabricate edges. Head resolution
321
860
  // only; the per-segment walk below is shared with every other
322
861
  // chain shape.
862
+ //
863
+ // A language may ALSO declare that `this` is always the enclosing class —
864
+ // `ScopeResolver.resolveThisViaEnclosingClass`, the same flag Case 0.5 in
865
+ // `receiver-bound-calls` already uses for a bare `this` receiver. Such a
866
+ // language deliberately synthesizes no `this` typeBinding anywhere, so the
867
+ // initializer-context test above can never be true inside a method body and
868
+ // every `this->field.m()` / `this.field.m()` chain folded to nothing —
869
+ // measured for the NON-generic control too, so it was never a generics gap.
870
+ // Reading the provider flag keeps the rule language-free: a language that
871
+ // does bind `this` per function scope does not set it, and is unaffected.
323
872
  if (currentClass === undefined &&
324
873
  headType === undefined &&
325
874
  headMemberName === 'this' &&
326
- isInitializerContext(inScope, scopes)) {
875
+ (isInitializerContext(inScope, scopes) || options.resolveThisViaEnclosingClass === true)) {
327
876
  currentClass = findEnclosingClassDef(inScope, scopes);
328
877
  }
329
878
  // `const user = getUser(); user.address` — the typeBinding for `user`
@@ -336,11 +885,30 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
336
885
  !headType.rawName.includes('(')) {
337
886
  currentClass = resolveCompoundReceiverClass(`${headType.rawName}()`, inScope, scopes, index, options, depth + 1);
338
887
  }
888
+ // Construction in the chain HEAD — `new Service().inner.doWork()` (#2708).
889
+ // The head arrives as `new Service()`, which `stripCallParens` reduces to
890
+ // `new Service`: no binding and no class of that name, so the walk was never
891
+ // seeded and the whole chain resolved to nothing. A constructed value is an
892
+ // instance, so `currentIsClassConstant` correctly stays false here.
893
+ if (currentClass === undefined) {
894
+ currentClass = resolveConstructionExpressionClass(headMemberName, inScope, scopes, index, options);
895
+ }
339
896
  for (let i = 1; i < parts.length && currentClass !== undefined; i++) {
340
897
  const segment = parts[i];
341
898
  if (segment === undefined)
342
899
  break;
343
900
  const memberName = stripCallParens(segment);
901
+ // Selector-form construction mid-chain — `Factory.new.do_work`, including
902
+ // the parenthesis-less spelling that never reaches the call branch above
903
+ // (#2708). Gated on the walk sitting on the CLASS itself: after
904
+ // `factory = Factory.new`, `factory.new` is an ordinary instance-member
905
+ // call and must keep normal resolution.
906
+ if (isConstructionSelectorHop(memberName, currentClass, currentIsClassConstant, options)) {
907
+ // Constructing yields an INSTANCE of the same class: the walk stays on
908
+ // `currentClass` but no longer sits on the class constant.
909
+ currentIsClassConstant = false;
910
+ continue;
911
+ }
344
912
  const cs = classScopeByDefId.get(currentClass.nodeId);
345
913
  let memberType = cs?.typeBindings.get(memberName);
346
914
  if (memberType === undefined &&
@@ -371,13 +939,20 @@ export function resolveCompoundReceiverClass(receiverText, inScope, scopes, inde
371
939
  }
372
940
  return undefined;
373
941
  }
374
- let nextClass = findClassBindingInScope(memberType.declaredAtScope, memberType.rawName, scopes);
942
+ // THE MEASURED HOLE (#2833 follow-up). This is the cascade's copy of the
943
+ // fold's member step, and it read the possibly-erased `rawName` directly.
944
+ // A Python `self.m.save(u)` whose fold step refused `Mapped[User]` on
945
+ // grounds fell through here — a declined fold is documented as "no answer",
946
+ // never a veto — and this walk re-minted `other.py:Mapped` from the
947
+ // workspace index. Same rule, same lookup, so the two routes now agree.
948
+ let nextClass = classOfDeclaredType(memberType, scopes, undefined, options.recordReceiverType);
375
949
  if (nextClass === undefined) {
376
950
  const fromMap = unwrapMapValueToClass(memberType, scopes);
377
951
  if (fromMap !== undefined)
378
952
  nextClass = fromMap;
379
953
  }
380
954
  currentClass = nextClass;
955
+ currentIsClassConstant = false;
381
956
  }
382
957
  return currentClass;
383
958
  }
@@ -445,24 +1020,6 @@ function isInitializerContext(startScope, scopes) {
445
1020
  }
446
1021
  return false;
447
1022
  }
448
- /** Find the index of the `(` that matches the trailing `)` of a
449
- * call-expression text. Returns -1 if unbalanced. */
450
- function matchingOpenParen(text) {
451
- if (!text.endsWith(')'))
452
- return -1;
453
- let depth = 0;
454
- for (let i = text.length - 1; i >= 0; i--) {
455
- const ch = text[i];
456
- if (ch === ')')
457
- depth++;
458
- else if (ch === '(') {
459
- depth--;
460
- if (depth === 0)
461
- return i;
462
- }
463
- }
464
- return -1;
465
- }
466
1023
  /** Max peel iterations for `stripCastWrappers`. Real cast nesting —
467
1024
  * including decompiler output like `((Target)((Object)expr))` —
468
1025
  * is a handful of levels, and each cast level costs at most two