gitnexus 1.6.10-rc.21 → 1.6.10-rc.211

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 (870) hide show
  1. package/README.md +212 -22
  2. package/dist/_shared/graph/types.d.ts +27 -8
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/index.d.ts +4 -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 +19 -1
  11. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  12. package/dist/_shared/integrations/resilient-fetch.js +23 -10
  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/callable-flow-site.d.ts +110 -0
  20. package/dist/_shared/scope-resolution/callable-flow-site.d.ts.map +1 -0
  21. package/dist/_shared/scope-resolution/callable-flow-site.js +11 -0
  22. package/dist/_shared/scope-resolution/callable-flow-site.js.map +1 -0
  23. package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
  24. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +6 -1
  25. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
  26. package/dist/_shared/scope-resolution/finalize-algorithm.js +316 -37
  27. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  28. package/dist/_shared/scope-resolution/parsed-file.d.ts +7 -0
  29. package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
  30. package/dist/_shared/scope-resolution/reference-site.d.ts +124 -1
  31. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  32. package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
  33. package/dist/_shared/scope-resolution/registries/lookup-core.d.ts.map +1 -1
  34. package/dist/_shared/scope-resolution/registries/lookup-core.js +58 -2
  35. package/dist/_shared/scope-resolution/registries/lookup-core.js.map +1 -1
  36. package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
  37. package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
  38. package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
  39. package/dist/_shared/scope-resolution/symbol-definition.d.ts +47 -0
  40. package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
  41. package/dist/_shared/scope-resolution/types.d.ts +297 -5
  42. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  43. package/dist/cli/ai-context.d.ts +10 -2
  44. package/dist/cli/ai-context.js +128 -61
  45. package/dist/cli/analyze-config.d.ts +1 -1
  46. package/dist/cli/analyze-options.d.ts +131 -0
  47. package/dist/cli/analyze-options.js +1 -0
  48. package/dist/cli/analyze.d.ts +25 -114
  49. package/dist/cli/analyze.js +194 -36
  50. package/dist/cli/cli-message.d.ts +1 -1
  51. package/dist/cli/detect-changes-format.js +19 -2
  52. package/dist/cli/doctor.d.ts +23 -0
  53. package/dist/cli/doctor.js +72 -9
  54. package/dist/cli/editor-targets.js +6 -0
  55. package/dist/cli/eval-server.d.ts +23 -1
  56. package/dist/cli/eval-server.js +128 -9
  57. package/dist/cli/format-symbol.d.ts +15 -0
  58. package/dist/cli/format-symbol.js +17 -0
  59. package/dist/cli/generated-skill.d.ts +17 -0
  60. package/dist/cli/generated-skill.js +1 -0
  61. package/dist/cli/group.js +23 -2
  62. package/dist/cli/help-i18n.js +3 -0
  63. package/dist/cli/i18n/en.d.ts +17 -8
  64. package/dist/cli/i18n/en.js +19 -8
  65. package/dist/cli/i18n/resources.d.ts +26 -8
  66. package/dist/cli/i18n/zh-CN.d.ts +9 -0
  67. package/dist/cli/i18n/zh-CN.js +17 -8
  68. package/dist/cli/index.js +16 -9
  69. package/dist/cli/lazy-action.d.ts +7 -0
  70. package/dist/cli/lazy-action.js +27 -0
  71. package/dist/cli/mcp.js +6 -3
  72. package/dist/cli/resolve-invocation.d.ts +7 -3
  73. package/dist/cli/resolve-invocation.js +7 -3
  74. package/dist/cli/setup.d.ts +8 -0
  75. package/dist/cli/setup.js +30 -7
  76. package/dist/cli/skill-gen.d.ts +1 -6
  77. package/dist/cli/skill-gen.js +88 -18
  78. package/dist/cli/standard-skills.d.ts +76 -0
  79. package/dist/cli/standard-skills.js +45 -0
  80. package/dist/cli/status.d.ts +4 -1
  81. package/dist/cli/status.js +57 -4
  82. package/dist/cli/tool.d.ts +1 -0
  83. package/dist/cli/tool.js +75 -7
  84. package/dist/cli/uninstall.js +7 -2
  85. package/dist/cli/wiki.d.ts +1 -0
  86. package/dist/cli/wiki.js +59 -10
  87. package/dist/config/ignore-service.d.ts +2 -0
  88. package/dist/config/ignore-service.js +31 -4
  89. package/dist/core/analysis-features.d.ts +21 -0
  90. package/dist/core/analysis-features.js +59 -0
  91. package/dist/core/analyzer-identity.d.ts +154 -0
  92. package/dist/core/analyzer-identity.js +2158 -0
  93. package/dist/core/augmentation/engine.js +95 -76
  94. package/dist/core/embedding-checkpoint.d.ts +143 -0
  95. package/dist/core/embedding-checkpoint.js +221 -0
  96. package/dist/core/embedding-count.d.ts +61 -0
  97. package/dist/core/embedding-count.js +69 -0
  98. package/dist/core/embeddings/ast-utils.js +9 -1
  99. package/dist/core/embeddings/embedder.d.ts +3 -2
  100. package/dist/core/embeddings/embedder.js +8 -5
  101. package/dist/core/embeddings/embedding-identity.d.ts +11 -0
  102. package/dist/core/embeddings/embedding-identity.js +24 -0
  103. package/dist/core/embeddings/embedding-pipeline.d.ts +24 -1
  104. package/dist/core/embeddings/embedding-pipeline.js +341 -19
  105. package/dist/core/embeddings/http-client.d.ts +10 -2
  106. package/dist/core/embeddings/http-client.js +282 -47
  107. package/dist/core/embeddings/node-module-compat.d.ts +4 -2
  108. package/dist/core/embeddings/node-module-compat.js +4 -2
  109. package/dist/core/embeddings/onnxruntime-common-resolver.js +5 -5
  110. package/dist/core/embeddings/onnxruntime-node-resolver.js +2 -2
  111. package/dist/core/embeddings/runtime-install.js +1 -1
  112. package/dist/core/git-staleness.js +1 -1
  113. package/dist/core/graph/graph.js +3 -0
  114. package/dist/core/graph/import-cycles.d.ts +194 -3
  115. package/dist/core/graph/import-cycles.js +522 -73
  116. package/dist/core/graph/types.d.ts +18 -0
  117. package/dist/core/group/bridge-db.js +5 -27
  118. package/dist/core/group/cross-impact.d.ts +21 -0
  119. package/dist/core/group/cross-impact.js +128 -15
  120. package/dist/core/group/cross-trace.js +27 -16
  121. package/dist/core/group/extractors/http-patterns/java.js +91 -14
  122. package/dist/core/group/extractors/http-patterns/node.js +19 -0
  123. package/dist/core/group/extractors/http-patterns/types.d.ts +8 -0
  124. package/dist/core/group/extractors/http-route-extractor.d.ts +1 -0
  125. package/dist/core/group/extractors/http-route-extractor.js +122 -48
  126. package/dist/core/group/extractors/include-extractor.js +20 -2
  127. package/dist/core/group/extractors/manifest-extractor.d.ts +1 -1
  128. package/dist/core/group/extractors/manifest-extractor.js +7 -7
  129. package/dist/core/group/service.js +10 -1
  130. package/dist/core/group/storage.js +2 -33
  131. package/dist/core/group/types.d.ts +18 -0
  132. package/dist/core/incremental/subgraph-extract.d.ts +9 -6
  133. package/dist/core/incremental/subgraph-extract.js +33 -10
  134. package/dist/core/index-freshness.d.ts +80 -0
  135. package/dist/core/index-freshness.js +120 -0
  136. package/dist/core/ingestion/call-processor.d.ts +13 -1
  137. package/dist/core/ingestion/call-processor.js +110 -3
  138. package/dist/core/ingestion/cfg/callee-cell-format.d.ts +42 -0
  139. package/dist/core/ingestion/cfg/callee-cell-format.js +42 -0
  140. package/dist/core/ingestion/cfg/emit.d.ts +8 -23
  141. package/dist/core/ingestion/cfg/emit.js +9 -23
  142. package/dist/core/ingestion/class-extractors/configs/go.js +10 -5
  143. package/dist/core/ingestion/class-extractors/configs/jvm.js +29 -0
  144. package/dist/core/ingestion/cluster-enricher.js +8 -4
  145. package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
  146. package/dist/core/ingestion/community-processor.d.ts +21 -3
  147. package/dist/core/ingestion/community-processor.js +88 -83
  148. package/dist/core/ingestion/di-extractors/index.d.ts +22 -34
  149. package/dist/core/ingestion/di-extractors/index.js +17 -18
  150. package/dist/core/ingestion/di-extractors/spring.d.ts +27 -5
  151. package/dist/core/ingestion/di-extractors/spring.js +87 -3
  152. package/dist/core/ingestion/di-extractors/types.d.ts +60 -0
  153. package/dist/core/ingestion/di-extractors/types.js +15 -0
  154. package/dist/core/ingestion/emit-references.js +4 -0
  155. package/dist/core/ingestion/filesystem-walker.js +16 -12
  156. package/dist/core/ingestion/finalize-orchestrator.js +1 -0
  157. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +9 -0
  158. package/dist/core/ingestion/frameworks/spring/analysis-features.js +41 -0
  159. package/dist/core/ingestion/frameworks/spring/annotation-arguments.d.ts +13 -0
  160. package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +227 -0
  161. package/dist/core/ingestion/frameworks/spring/aop-candidates.d.ts +15 -0
  162. package/dist/core/ingestion/frameworks/spring/aop-candidates.js +85 -0
  163. package/dist/core/ingestion/frameworks/spring/aop.d.ts +118 -0
  164. package/dist/core/ingestion/frameworks/spring/aop.js +476 -0
  165. package/dist/core/ingestion/frameworks/spring/auto-configuration.d.ts +8 -0
  166. package/dist/core/ingestion/frameworks/spring/auto-configuration.js +16 -0
  167. package/dist/core/ingestion/frameworks/spring/bean-candidates.d.ts +30 -0
  168. package/dist/core/ingestion/frameworks/spring/bean-candidates.js +182 -0
  169. package/dist/core/ingestion/frameworks/spring/bean-catalog.d.ts +12 -0
  170. package/dist/core/ingestion/frameworks/spring/bean-catalog.js +27 -0
  171. package/dist/core/ingestion/frameworks/spring/bean-factories.d.ts +33 -0
  172. package/dist/core/ingestion/frameworks/spring/bean-factories.js +65 -0
  173. package/dist/core/ingestion/frameworks/spring/conditionals.d.ts +25 -0
  174. package/dist/core/ingestion/frameworks/spring/conditionals.js +319 -0
  175. package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +24 -0
  176. package/dist/core/ingestion/frameworks/spring/config-bindings.js +115 -0
  177. package/dist/core/ingestion/frameworks/spring/di-metadata.d.ts +48 -0
  178. package/dist/core/ingestion/frameworks/spring/di-metadata.js +379 -0
  179. package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +28 -0
  180. package/dist/core/ingestion/frameworks/spring/non-http-handlers.js +152 -0
  181. package/dist/core/ingestion/frameworks/spring/resource-injection.d.ts +5 -0
  182. package/dist/core/ingestion/frameworks/spring/resource-injection.js +91 -0
  183. package/dist/core/ingestion/import-resolvers/configs/csharp.js +5 -1
  184. package/dist/core/ingestion/import-resolvers/configs/swift.js +13 -0
  185. package/dist/core/ingestion/import-resolvers/csharp.d.ts +9 -1
  186. package/dist/core/ingestion/import-resolvers/csharp.js +234 -27
  187. package/dist/core/ingestion/import-resolvers/go.d.ts +11 -1
  188. package/dist/core/ingestion/import-resolvers/go.js +44 -17
  189. package/dist/core/ingestion/import-resolvers/jvm.d.ts +2 -2
  190. package/dist/core/ingestion/import-resolvers/node-workspace-packages.d.ts +90 -0
  191. package/dist/core/ingestion/import-resolvers/node-workspace-packages.js +428 -0
  192. package/dist/core/ingestion/import-resolvers/package-dir-index.d.ts +124 -0
  193. package/dist/core/ingestion/import-resolvers/package-dir-index.js +223 -0
  194. package/dist/core/ingestion/import-resolvers/pass-cache.d.ts +50 -0
  195. package/dist/core/ingestion/import-resolvers/pass-cache.js +60 -0
  196. package/dist/core/ingestion/import-resolvers/per-file-set.d.ts +71 -0
  197. package/dist/core/ingestion/import-resolvers/per-file-set.js +11 -0
  198. package/dist/core/ingestion/import-resolvers/php.d.ts +1 -1
  199. package/dist/core/ingestion/import-resolvers/php.js +27 -8
  200. package/dist/core/ingestion/import-resolvers/python-file-index.d.ts +201 -0
  201. package/dist/core/ingestion/import-resolvers/python-file-index.js +302 -0
  202. package/dist/core/ingestion/import-resolvers/python.js +25 -6
  203. package/dist/core/ingestion/import-resolvers/ruby.d.ts +1 -1
  204. package/dist/core/ingestion/import-resolvers/rust.d.ts +2 -2
  205. package/dist/core/ingestion/import-resolvers/standard.d.ts +1 -1
  206. package/dist/core/ingestion/import-resolvers/types.d.ts +1 -12
  207. package/dist/core/ingestion/import-resolvers/utils.d.ts +65 -6
  208. package/dist/core/ingestion/import-resolvers/utils.js +215 -36
  209. package/dist/core/ingestion/import-resolvers/workspace-file-index.d.ts +72 -0
  210. package/dist/core/ingestion/import-resolvers/workspace-file-index.js +58 -0
  211. package/dist/core/ingestion/language-config.d.ts +20 -1
  212. package/dist/core/ingestion/language-config.js +18 -23
  213. package/dist/core/ingestion/language-provider.d.ts +133 -7
  214. package/dist/core/ingestion/languages/c/captures.js +63 -0
  215. package/dist/core/ingestion/languages/c/import-target.js +12 -16
  216. package/dist/core/ingestion/languages/c/query.js +17 -0
  217. package/dist/core/ingestion/languages/c/scope-resolver.js +26 -19
  218. package/dist/core/ingestion/languages/c/static-linkage.js +12 -16
  219. package/dist/core/ingestion/languages/c-cpp.js +13 -0
  220. package/dist/core/ingestion/languages/cobol/captures.js +93 -0
  221. package/dist/core/ingestion/languages/cobol/scope-resolver.js +34 -20
  222. package/dist/core/ingestion/languages/cobol.js +13 -0
  223. package/dist/core/ingestion/languages/cpp/adl.d.ts +2 -2
  224. package/dist/core/ingestion/languages/cpp/adl.js +67 -44
  225. package/dist/core/ingestion/languages/cpp/captures.js +222 -3
  226. package/dist/core/ingestion/languages/cpp/file-local-linkage.js +11 -15
  227. package/dist/core/ingestion/languages/cpp/inline-namespaces.d.ts +28 -8
  228. package/dist/core/ingestion/languages/cpp/inline-namespaces.js +242 -68
  229. package/dist/core/ingestion/languages/cpp/interpret.d.ts +2 -0
  230. package/dist/core/ingestion/languages/cpp/interpret.js +126 -6
  231. package/dist/core/ingestion/languages/cpp/query.js +106 -0
  232. package/dist/core/ingestion/languages/cpp/scope-resolver.js +62 -20
  233. package/dist/core/ingestion/languages/csharp/accessor-unwrap.d.ts +2 -15
  234. package/dist/core/ingestion/languages/csharp/accessor-unwrap.js +18 -10
  235. package/dist/core/ingestion/languages/csharp/captures.js +44 -0
  236. package/dist/core/ingestion/languages/csharp/import-target.js +46 -72
  237. package/dist/core/ingestion/languages/csharp/namespace-siblings.js +5 -1
  238. package/dist/core/ingestion/languages/csharp/query.js +25 -5
  239. package/dist/core/ingestion/languages/csharp/scope-resolver.js +75 -2
  240. package/dist/core/ingestion/languages/dart/captures.d.ts +10 -0
  241. package/dist/core/ingestion/languages/dart/captures.js +686 -16
  242. package/dist/core/ingestion/languages/dart/extension-type-preprocess.d.ts +7 -0
  243. package/dist/core/ingestion/languages/dart/extension-type-preprocess.js +30 -0
  244. package/dist/core/ingestion/languages/dart/import-target.js +32 -9
  245. package/dist/core/ingestion/languages/dart/index.d.ts +1 -1
  246. package/dist/core/ingestion/languages/dart/index.js +1 -1
  247. package/dist/core/ingestion/languages/dart/query.js +98 -1
  248. package/dist/core/ingestion/languages/dart/scope-resolver.js +14 -3
  249. package/dist/core/ingestion/languages/dart/simple-hooks.js +9 -0
  250. package/dist/core/ingestion/languages/dart.js +8 -1
  251. package/dist/core/ingestion/languages/go/captures.js +142 -3
  252. package/dist/core/ingestion/languages/go/generic-type-parameters.d.ts +31 -0
  253. package/dist/core/ingestion/languages/go/generic-type-parameters.js +140 -0
  254. package/dist/core/ingestion/languages/go/import-target.d.ts +3 -10
  255. package/dist/core/ingestion/languages/go/import-target.js +34 -30
  256. package/dist/core/ingestion/languages/go/index.d.ts +1 -1
  257. package/dist/core/ingestion/languages/go/interface-impls.d.ts +9 -1
  258. package/dist/core/ingestion/languages/go/interface-impls.js +693 -87
  259. package/dist/core/ingestion/languages/go/interpret.d.ts +2 -0
  260. package/dist/core/ingestion/languages/go/interpret.js +22 -8
  261. package/dist/core/ingestion/languages/go/method-owners.js +31 -12
  262. package/dist/core/ingestion/languages/go/package-clause.d.ts +46 -0
  263. package/dist/core/ingestion/languages/go/package-clause.js +75 -0
  264. package/dist/core/ingestion/languages/go/package-siblings.js +7 -11
  265. package/dist/core/ingestion/languages/go/query.js +56 -3
  266. package/dist/core/ingestion/languages/go/scope-resolver.js +39 -0
  267. package/dist/core/ingestion/languages/go.js +9 -0
  268. package/dist/core/ingestion/languages/java/analysis-features.d.ts +7 -0
  269. package/dist/core/ingestion/languages/java/analysis-features.js +25 -0
  270. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +38 -0
  271. package/dist/core/ingestion/languages/java/capture-side-channel.js +124 -0
  272. package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
  273. package/dist/core/ingestion/languages/java/captures.js +321 -49
  274. package/dist/core/ingestion/languages/java/import-target.d.ts +49 -9
  275. package/dist/core/ingestion/languages/java/import-target.js +68 -88
  276. package/dist/core/ingestion/languages/java/interpret.js +3 -2
  277. package/dist/core/ingestion/languages/java/module-resolution.d.ts +62 -0
  278. package/dist/core/ingestion/languages/java/module-resolution.js +142 -0
  279. package/dist/core/ingestion/languages/java/package-facts.d.ts +5 -0
  280. package/dist/core/ingestion/languages/java/package-facts.js +9 -0
  281. package/dist/core/ingestion/languages/java/package-siblings.d.ts +3 -16
  282. package/dist/core/ingestion/languages/java/package-siblings.js +8 -147
  283. package/dist/core/ingestion/languages/java/query.js +39 -3
  284. package/dist/core/ingestion/languages/java/record-components.d.ts +14 -0
  285. package/dist/core/ingestion/languages/java/record-components.js +185 -0
  286. package/dist/core/ingestion/languages/java/scope-resolver.js +35 -2
  287. package/dist/core/ingestion/languages/java/spring-aop.d.ts +12 -0
  288. package/dist/core/ingestion/languages/java/spring-aop.js +49 -0
  289. package/dist/core/ingestion/languages/java/spring-bean-metadata.d.ts +2 -0
  290. package/dist/core/ingestion/languages/java/spring-bean-metadata.js +8 -0
  291. package/dist/core/ingestion/languages/java/spring-conditionals.d.ts +11 -0
  292. package/dist/core/ingestion/languages/java/spring-conditionals.js +48 -0
  293. package/dist/core/ingestion/languages/java/spring-config-bindings.d.ts +23 -0
  294. package/dist/core/ingestion/languages/java/spring-config-bindings.js +215 -0
  295. package/dist/core/ingestion/languages/java/spring-di.d.ts +20 -0
  296. package/dist/core/ingestion/languages/java/spring-di.js +160 -0
  297. package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +7 -0
  298. package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +32 -0
  299. package/dist/core/ingestion/languages/java.js +76 -3
  300. package/dist/core/ingestion/languages/javascript/captures.d.ts +6 -1
  301. package/dist/core/ingestion/languages/javascript/captures.js +278 -4
  302. package/dist/core/ingestion/languages/javascript/import-target.d.ts +17 -21
  303. package/dist/core/ingestion/languages/javascript/import-target.js +24 -41
  304. package/dist/core/ingestion/languages/javascript/index.d.ts +54 -5
  305. package/dist/core/ingestion/languages/javascript/index.js +54 -5
  306. package/dist/core/ingestion/languages/javascript/query.d.ts +1 -0
  307. package/dist/core/ingestion/languages/javascript/query.js +232 -5
  308. package/dist/core/ingestion/languages/javascript/scope-resolver.js +12 -0
  309. package/dist/core/ingestion/languages/javascript/simple-hooks.js +2 -1
  310. package/dist/core/ingestion/languages/jvm/package-facts.d.ts +35 -0
  311. package/dist/core/ingestion/languages/jvm/package-facts.js +40 -0
  312. package/dist/core/ingestion/languages/jvm/package-siblings.d.ts +14 -0
  313. package/dist/core/ingestion/languages/jvm/package-siblings.js +197 -0
  314. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +40 -3
  315. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +111 -8
  316. package/dist/core/ingestion/languages/kotlin/captures.js +112 -0
  317. package/dist/core/ingestion/languages/kotlin/import-target.d.ts +8 -1
  318. package/dist/core/ingestion/languages/kotlin/import-target.js +20 -123
  319. package/dist/core/ingestion/languages/kotlin/index.d.ts +1 -0
  320. package/dist/core/ingestion/languages/kotlin/index.js +1 -0
  321. package/dist/core/ingestion/languages/kotlin/module-resolution.d.ts +22 -0
  322. package/dist/core/ingestion/languages/kotlin/module-resolution.js +108 -0
  323. package/dist/core/ingestion/languages/kotlin/package-facts.d.ts +5 -0
  324. package/dist/core/ingestion/languages/kotlin/package-facts.js +9 -0
  325. package/dist/core/ingestion/languages/kotlin/package-siblings.d.ts +4 -0
  326. package/dist/core/ingestion/languages/kotlin/package-siblings.js +8 -0
  327. package/dist/core/ingestion/languages/kotlin/query.js +47 -2
  328. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +36 -3
  329. package/dist/core/ingestion/languages/kotlin/spring-aop.d.ts +12 -0
  330. package/dist/core/ingestion/languages/kotlin/spring-aop.js +64 -0
  331. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.d.ts +2 -0
  332. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.js +8 -0
  333. package/dist/core/ingestion/languages/kotlin/spring-conditionals.d.ts +12 -0
  334. package/dist/core/ingestion/languages/kotlin/spring-conditionals.js +49 -0
  335. package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +20 -0
  336. package/dist/core/ingestion/languages/kotlin/spring-di.js +299 -0
  337. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +10 -0
  338. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +41 -0
  339. package/dist/core/ingestion/languages/kotlin.js +5 -6
  340. package/dist/core/ingestion/languages/php/captures.d.ts +5 -0
  341. package/dist/core/ingestion/languages/php/captures.js +359 -51
  342. package/dist/core/ingestion/languages/php/import-decomposer.js +12 -0
  343. package/dist/core/ingestion/languages/php/import-target.d.ts +2 -1
  344. package/dist/core/ingestion/languages/php/import-target.js +229 -7
  345. package/dist/core/ingestion/languages/php/interpret.js +10 -0
  346. package/dist/core/ingestion/languages/php/query.js +31 -0
  347. package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
  348. package/dist/core/ingestion/languages/python/arity-metadata.d.ts +1 -0
  349. package/dist/core/ingestion/languages/python/arity-metadata.js +1 -0
  350. package/dist/core/ingestion/languages/python/captures.d.ts +3 -4
  351. package/dist/core/ingestion/languages/python/captures.js +53 -5
  352. package/dist/core/ingestion/languages/python/import-decomposer.js +22 -1
  353. package/dist/core/ingestion/languages/python/import-target.d.ts +42 -1
  354. package/dist/core/ingestion/languages/python/import-target.js +277 -91
  355. package/dist/core/ingestion/languages/python/index.d.ts +1 -1
  356. package/dist/core/ingestion/languages/python/index.js +1 -1
  357. package/dist/core/ingestion/languages/python/interpret.d.ts +52 -0
  358. package/dist/core/ingestion/languages/python/interpret.js +249 -3
  359. package/dist/core/ingestion/languages/python/query.js +9 -0
  360. package/dist/core/ingestion/languages/python/receiver-binding.d.ts +17 -2
  361. package/dist/core/ingestion/languages/python/receiver-binding.js +192 -2
  362. package/dist/core/ingestion/languages/python/scope-resolver.js +27 -4
  363. package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
  364. package/dist/core/ingestion/languages/python/simple-hooks.js +9 -5
  365. package/dist/core/ingestion/languages/ruby/captures.js +200 -0
  366. package/dist/core/ingestion/languages/ruby/import-target.js +7 -5
  367. package/dist/core/ingestion/languages/ruby/query.js +93 -0
  368. package/dist/core/ingestion/languages/ruby/scope-resolver.js +2 -0
  369. package/dist/core/ingestion/languages/ruby/simple-hooks.d.ts +1 -1
  370. package/dist/core/ingestion/languages/ruby/simple-hooks.js +22 -1
  371. package/dist/core/ingestion/languages/rust/captures.js +52 -1
  372. package/dist/core/ingestion/languages/rust/interpret.js +18 -0
  373. package/dist/core/ingestion/languages/rust/method-owners.js +11 -1
  374. package/dist/core/ingestion/languages/rust/module-path.d.ts +126 -0
  375. package/dist/core/ingestion/languages/rust/module-path.js +214 -0
  376. package/dist/core/ingestion/languages/rust/qualified-call.d.ts +41 -0
  377. package/dist/core/ingestion/languages/rust/qualified-call.js +481 -0
  378. package/dist/core/ingestion/languages/rust/query.js +48 -6
  379. package/dist/core/ingestion/languages/rust/range-binding.d.ts +1 -11
  380. package/dist/core/ingestion/languages/rust/range-binding.js +149 -63
  381. package/dist/core/ingestion/languages/rust/scope-resolver.js +21 -2
  382. package/dist/core/ingestion/languages/rust.js +17 -0
  383. package/dist/core/ingestion/languages/swift/captures.js +99 -3
  384. package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.d.ts +48 -0
  385. package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.js +253 -0
  386. package/dist/core/ingestion/languages/swift/import-target.js +4 -9
  387. package/dist/core/ingestion/languages/swift/query.js +17 -0
  388. package/dist/core/ingestion/languages/swift/receiver-binding.d.ts +8 -0
  389. package/dist/core/ingestion/languages/swift/receiver-binding.js +6 -2
  390. package/dist/core/ingestion/languages/swift.js +2 -0
  391. package/dist/core/ingestion/languages/typescript/captures.d.ts +90 -1
  392. package/dist/core/ingestion/languages/typescript/captures.js +288 -5
  393. package/dist/core/ingestion/languages/typescript/cjs-export-assignment.d.ts +134 -0
  394. package/dist/core/ingestion/languages/typescript/cjs-export-assignment.js +523 -0
  395. package/dist/core/ingestion/languages/typescript/cjs-module-exports.d.ts +54 -0
  396. package/dist/core/ingestion/languages/typescript/cjs-module-exports.js +191 -0
  397. package/dist/core/ingestion/languages/typescript/file-candidates.d.ts +29 -0
  398. package/dist/core/ingestion/languages/typescript/file-candidates.js +70 -0
  399. package/dist/core/ingestion/languages/typescript/import-decomposer.d.ts +28 -1
  400. package/dist/core/ingestion/languages/typescript/import-decomposer.js +125 -10
  401. package/dist/core/ingestion/languages/typescript/import-target.d.ts +25 -37
  402. package/dist/core/ingestion/languages/typescript/import-target.js +24 -26
  403. package/dist/core/ingestion/languages/typescript/interpret.d.ts +21 -1
  404. package/dist/core/ingestion/languages/typescript/interpret.js +45 -5
  405. package/dist/core/ingestion/languages/typescript/module-resolution.d.ts +48 -0
  406. package/dist/core/ingestion/languages/typescript/module-resolution.js +171 -0
  407. package/dist/core/ingestion/languages/typescript/nuxt-auto-imports.js +2 -1
  408. package/dist/core/ingestion/languages/typescript/query.d.ts +1 -0
  409. package/dist/core/ingestion/languages/typescript/query.js +340 -14
  410. package/dist/core/ingestion/languages/typescript/receiver-binding.d.ts +17 -0
  411. package/dist/core/ingestion/languages/typescript/receiver-binding.js +27 -0
  412. package/dist/core/ingestion/languages/typescript/scope-resolver.js +27 -40
  413. package/dist/core/ingestion/languages/typescript/simple-hooks.d.ts +0 -10
  414. package/dist/core/ingestion/languages/typescript/simple-hooks.js +22 -22
  415. package/dist/core/ingestion/languages/typescript/tsconfig.d.ts +59 -0
  416. package/dist/core/ingestion/languages/typescript/tsconfig.js +291 -0
  417. package/dist/core/ingestion/languages/typescript.js +87 -1
  418. package/dist/core/ingestion/languages/vue/import-target.d.ts +6 -22
  419. package/dist/core/ingestion/languages/vue/import-target.js +11 -47
  420. package/dist/core/ingestion/languages/vue/scope-resolver.js +4 -2
  421. package/dist/core/ingestion/local-symbol-pruner.js +11 -11
  422. package/dist/core/ingestion/method-extractors/configs/csharp.js +1 -0
  423. package/dist/core/ingestion/method-extractors/generic.js +1 -0
  424. package/dist/core/ingestion/method-types.d.ts +16 -0
  425. package/dist/core/ingestion/parsing-processor.js +32 -1
  426. package/dist/core/ingestion/pipeline-phases/di.d.ts +8 -33
  427. package/dist/core/ingestion/pipeline-phases/di.js +275 -157
  428. package/dist/core/ingestion/pipeline-phases/index.d.ts +3 -0
  429. package/dist/core/ingestion/pipeline-phases/index.js +3 -0
  430. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +15 -0
  431. package/dist/core/ingestion/pipeline-phases/parse-impl.js +158 -3
  432. package/dist/core/ingestion/pipeline-phases/parse.js +5 -0
  433. package/dist/core/ingestion/pipeline-phases/processes.d.ts +11 -2
  434. package/dist/core/ingestion/pipeline-phases/processes.js +102 -7
  435. package/dist/core/ingestion/pipeline-phases/routes.js +56 -10
  436. package/dist/core/ingestion/pipeline-phases/spring-aop.d.ts +34 -0
  437. package/dist/core/ingestion/pipeline-phases/spring-aop.js +439 -0
  438. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +34 -0
  439. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +255 -0
  440. package/dist/core/ingestion/pipeline-phases/spring-config.d.ts +37 -0
  441. package/dist/core/ingestion/pipeline-phases/spring-config.js +433 -0
  442. package/dist/core/ingestion/pipeline-phases/types.d.ts +7 -0
  443. package/dist/core/ingestion/pipeline.d.ts +27 -3
  444. package/dist/core/ingestion/pipeline.js +62 -12
  445. package/dist/core/ingestion/process-processor.d.ts +109 -2
  446. package/dist/core/ingestion/process-processor.js +464 -52
  447. package/dist/core/ingestion/resolve-references.d.ts +6 -1
  448. package/dist/core/ingestion/resolve-references.js +78 -6
  449. package/dist/core/ingestion/route-extractors/data-route-table.d.ts +25 -0
  450. package/dist/core/ingestion/route-extractors/data-route-table.js +864 -0
  451. package/dist/core/ingestion/route-extractors/dispatch-guard.d.ts +96 -0
  452. package/dist/core/ingestion/route-extractors/dispatch-guard.js +1184 -0
  453. package/dist/core/ingestion/route-extractors/spring-shared.d.ts +11 -0
  454. package/dist/core/ingestion/route-extractors/spring-shared.js +89 -0
  455. package/dist/core/ingestion/route-extractors/spring.js +109 -24
  456. package/dist/core/ingestion/scope-extractor-bridge.js +9 -1
  457. package/dist/core/ingestion/scope-extractor.d.ts +22 -7
  458. package/dist/core/ingestion/scope-extractor.js +617 -59
  459. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +381 -22
  460. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +16 -5
  461. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +7 -7
  462. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +8 -7
  463. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +15 -1
  464. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +53 -0
  465. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +20 -15
  466. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +275 -41
  467. package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.d.ts +123 -0
  468. package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +171 -17
  469. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.d.ts +56 -1
  470. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +130 -32
  471. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +30 -1
  472. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +46 -3
  473. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +64 -0
  474. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1233 -0
  475. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +107 -5
  476. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +590 -33
  477. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +19 -4
  478. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +160 -4
  479. package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.d.ts +34 -0
  480. package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.js +62 -0
  481. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +64 -0
  482. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +118 -0
  483. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +109 -8
  484. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +931 -92
  485. package/dist/core/ingestion/scope-resolution/passes/return-shape-members.d.ts +58 -0
  486. package/dist/core/ingestion/scope-resolution/passes/return-shape-members.js +458 -0
  487. package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.d.ts +180 -0
  488. package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.js +418 -0
  489. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +34 -0
  490. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +82 -38
  491. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +61 -1
  492. package/dist/core/ingestion/scope-resolution/pipeline/run.js +384 -48
  493. package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +112 -2
  494. package/dist/core/ingestion/scope-resolution/resolution-outcome.js +38 -1
  495. package/dist/core/ingestion/scope-resolution/scope/namespace-targets.d.ts +25 -3
  496. package/dist/core/ingestion/scope-resolution/scope/namespace-targets.js +36 -16
  497. package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +210 -9
  498. package/dist/core/ingestion/scope-resolution/scope/walkers.js +968 -56
  499. package/dist/core/ingestion/scope-resolution/summary-maps.d.ts +28 -0
  500. package/dist/core/ingestion/scope-resolution/summary-maps.js +50 -0
  501. package/dist/core/ingestion/scope-resolution/undecided-satisfaction.d.ts +55 -0
  502. package/dist/core/ingestion/scope-resolution/undecided-satisfaction.js +37 -0
  503. package/dist/core/ingestion/scope-resolution/unresolved-receivers.d.ts +109 -0
  504. package/dist/core/ingestion/scope-resolution/unresolved-receivers.js +204 -0
  505. package/dist/core/ingestion/scope-resolution/utils/definition-id.d.ts +13 -0
  506. package/dist/core/ingestion/scope-resolution/utils/definition-id.js +19 -0
  507. package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.d.ts +171 -0
  508. package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.js +218 -0
  509. package/dist/core/ingestion/scope-resolution/workspace-index-types.d.ts +34 -0
  510. package/dist/core/ingestion/scope-resolution/workspace-index-types.js +15 -0
  511. package/dist/core/ingestion/scope-resolution/workspace-index.d.ts +7 -20
  512. package/dist/core/ingestion/taint/typescript-model.js +34 -2
  513. package/dist/core/ingestion/tree-sitter-queries.d.ts +11 -11
  514. package/dist/core/ingestion/tree-sitter-queries.js +688 -5
  515. package/dist/core/ingestion/type-env.js +11 -7
  516. package/dist/core/ingestion/type-extractors/jvm.js +17 -2
  517. package/dist/core/ingestion/type-extractors/shared.d.ts +17 -0
  518. package/dist/core/ingestion/type-extractors/shared.js +16 -0
  519. package/dist/core/ingestion/type-extractors/types.d.ts +12 -0
  520. package/dist/core/ingestion/type-extractors/typescript.d.ts +20 -0
  521. package/dist/core/ingestion/type-extractors/typescript.js +26 -0
  522. package/dist/core/ingestion/utils/ast-helpers.d.ts +311 -14
  523. package/dist/core/ingestion/utils/ast-helpers.js +745 -48
  524. package/dist/core/ingestion/utils/call-analysis.d.ts +27 -22
  525. package/dist/core/ingestion/utils/call-analysis.js +202 -7
  526. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +153 -0
  527. package/dist/core/ingestion/utils/callable-flow-captures.js +928 -0
  528. package/dist/core/ingestion/utils/callable-labels.d.ts +25 -0
  529. package/dist/core/ingestion/utils/callable-labels.js +31 -0
  530. package/dist/core/ingestion/utils/effective-ram.d.ts +40 -0
  531. package/dist/core/ingestion/utils/effective-ram.js +58 -0
  532. package/dist/core/ingestion/utils/line-base.d.ts +14 -0
  533. package/dist/core/ingestion/utils/line-base.js +14 -0
  534. package/dist/core/ingestion/utils/method-props.d.ts +27 -4
  535. package/dist/core/ingestion/utils/method-props.js +29 -4
  536. package/dist/core/ingestion/utils/receiver-chain-captures.d.ts +31 -0
  537. package/dist/core/ingestion/utils/receiver-chain-captures.js +57 -0
  538. package/dist/core/ingestion/utils/receiver-chain-codec.d.ts +89 -0
  539. package/dist/core/ingestion/utils/receiver-chain-codec.js +182 -0
  540. package/dist/core/ingestion/utils/scope-tree-walk.d.ts +22 -0
  541. package/dist/core/ingestion/utils/scope-tree-walk.js +33 -0
  542. package/dist/core/ingestion/utils/template-arguments.d.ts +96 -0
  543. package/dist/core/ingestion/utils/template-arguments.js +196 -0
  544. package/dist/core/ingestion/utils/type-parameters.d.ts +49 -0
  545. package/dist/core/ingestion/utils/type-parameters.js +206 -0
  546. package/dist/core/ingestion/workers/callable-id.d.ts +72 -0
  547. package/dist/core/ingestion/workers/callable-id.js +116 -0
  548. package/dist/core/ingestion/workers/parse-worker.d.ts +14 -1
  549. package/dist/core/ingestion/workers/parse-worker.js +409 -39
  550. package/dist/core/ingestion/workers/worker-pool.d.ts +34 -27
  551. package/dist/core/ingestion/workers/worker-pool.js +133 -25
  552. package/dist/core/lbug/csv-generator.d.ts +27 -0
  553. package/dist/core/lbug/csv-generator.js +80 -17
  554. package/dist/core/lbug/extension-load-error.d.ts +2 -2
  555. package/dist/core/lbug/extension-load-error.js +44 -27
  556. package/dist/core/lbug/extension-loader.d.ts +29 -0
  557. package/dist/core/lbug/extension-loader.js +32 -7
  558. package/dist/core/lbug/graph-emit-sink.d.ts +264 -0
  559. package/dist/core/lbug/graph-emit-sink.js +581 -0
  560. package/dist/core/lbug/lbug-adapter.d.ts +337 -3
  561. package/dist/core/lbug/lbug-adapter.js +772 -67
  562. package/dist/core/lbug/lbug-config.d.ts +93 -6
  563. package/dist/core/lbug/lbug-config.js +269 -9
  564. package/dist/core/lbug/native-check.d.ts +39 -0
  565. package/dist/core/lbug/native-check.js +323 -46
  566. package/dist/core/lbug/pdg-emit-sink.d.ts +13 -4
  567. package/dist/core/lbug/pdg-emit-sink.js +21 -111
  568. package/dist/core/lbug/pool-adapter.d.ts +23 -1
  569. package/dist/core/lbug/pool-adapter.js +115 -7
  570. package/dist/core/lbug/query-batch.d.ts +75 -0
  571. package/dist/core/lbug/query-batch.js +102 -0
  572. package/dist/core/lbug/rel-pair-routing.d.ts +160 -2
  573. package/dist/core/lbug/rel-pair-routing.js +228 -10
  574. package/dist/core/lbug/schema.d.ts +162 -3
  575. package/dist/core/lbug/schema.js +392 -157
  576. package/dist/core/lbug/sidecar-recovery.d.ts +1 -0
  577. package/dist/core/lbug/sidecar-recovery.js +1 -1
  578. package/dist/core/lbug/sync-csv-writer.d.ts +47 -0
  579. package/dist/core/lbug/sync-csv-writer.js +108 -0
  580. package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
  581. package/dist/core/platform/capabilities.d.ts +0 -1
  582. package/dist/core/platform/capabilities.js +12 -7
  583. package/dist/core/run-analyze.d.ts +150 -3
  584. package/dist/core/run-analyze.js +1562 -151
  585. package/dist/core/search/bm25-index.d.ts +11 -0
  586. package/dist/core/search/bm25-index.js +60 -26
  587. package/dist/core/search/fts-indexes.d.ts +167 -2
  588. package/dist/core/search/fts-indexes.js +264 -10
  589. package/dist/core/wiki/graph-queries.js +145 -112
  590. package/dist/core/wiki/llm-client.d.ts +37 -5
  591. package/dist/core/wiki/llm-client.js +88 -17
  592. package/dist/core/wiki/prompts.d.ts +19 -0
  593. package/dist/core/wiki/prompts.js +20 -1
  594. package/dist/lib/utils.d.ts +113 -0
  595. package/dist/lib/utils.js +185 -0
  596. package/dist/mcp/http-transport.d.ts +5 -0
  597. package/dist/mcp/http-transport.js +19 -5
  598. package/dist/mcp/local/aop-metadata.d.ts +77 -0
  599. package/dist/mcp/local/aop-metadata.js +227 -0
  600. package/dist/mcp/local/bean-metadata.d.ts +3 -0
  601. package/dist/mcp/local/bean-metadata.js +46 -0
  602. package/dist/mcp/local/local-backend.d.ts +167 -6
  603. package/dist/mcp/local/local-backend.js +1756 -405
  604. package/dist/mcp/local/path-predicate.d.ts +19 -0
  605. package/dist/mcp/local/path-predicate.js +21 -0
  606. package/dist/mcp/local/pdg-impact.d.ts +132 -10
  607. package/dist/mcp/local/pdg-impact.js +391 -98
  608. package/dist/mcp/output-budget.d.ts +5 -0
  609. package/dist/mcp/output-budget.js +52 -0
  610. package/dist/mcp/read-only-policy.d.ts +12 -0
  611. package/dist/mcp/read-only-policy.js +102 -0
  612. package/dist/mcp/repository-policy.d.ts +35 -0
  613. package/dist/mcp/repository-policy.js +333 -0
  614. package/dist/mcp/resources.js +34 -7
  615. package/dist/mcp/server.d.ts +5 -2
  616. package/dist/mcp/server.js +48 -18
  617. package/dist/mcp/tools.d.ts +8 -8
  618. package/dist/mcp/tools.js +91 -20
  619. package/dist/server/analyze-job.d.ts +40 -2
  620. package/dist/server/analyze-job.js +30 -2
  621. package/dist/server/analyze-launch.d.ts +1 -1
  622. package/dist/server/analyze-launch.js +79 -10
  623. package/dist/server/analyze-worker-core.d.ts +3 -2
  624. package/dist/server/analyze-worker-core.js +15 -3
  625. package/dist/server/analyze-worker-ipc.d.ts +1 -1
  626. package/dist/server/analyze-worker-ipc.js +4 -0
  627. package/dist/server/analyze-worker-protocol.d.ts +59 -0
  628. package/dist/server/analyze-worker-protocol.js +1 -0
  629. package/dist/server/analyze-worker.d.ts +1 -17
  630. package/dist/server/analyze-worker.js +29 -6
  631. package/dist/server/api.d.ts +2 -11
  632. package/dist/server/api.js +200 -155
  633. package/dist/server/embed-run-outcome.d.ts +89 -0
  634. package/dist/server/embed-run-outcome.js +88 -0
  635. package/dist/server/git-clone.js +6 -2
  636. package/dist/server/mcp-http.d.ts +1 -1
  637. package/dist/server/mcp-http.js +4 -2
  638. package/dist/server/middleware.d.ts +116 -9
  639. package/dist/server/middleware.js +291 -22
  640. package/dist/server/sse-progress.d.ts +41 -0
  641. package/dist/server/sse-progress.js +125 -0
  642. package/dist/server/upload-ingest.js +2 -1
  643. package/dist/server/validation.js +2 -1
  644. package/dist/storage/branch-index.d.ts +11 -6
  645. package/dist/storage/branch-index.js +15 -7
  646. package/dist/storage/file-hash.js +2 -2
  647. package/dist/storage/fs-atomic.d.ts +25 -0
  648. package/dist/storage/fs-atomic.js +42 -0
  649. package/dist/storage/git.d.ts +165 -0
  650. package/dist/storage/git.js +352 -3
  651. package/dist/storage/index-lock.d.ts +83 -0
  652. package/dist/storage/index-lock.js +654 -0
  653. package/dist/storage/parse-cache.js +482 -1
  654. package/dist/storage/parsedfile-store.d.ts +8 -0
  655. package/dist/storage/parsedfile-store.js +235 -1
  656. package/dist/storage/repo-manager.d.ts +29 -309
  657. package/dist/storage/repo-manager.js +187 -165
  658. package/dist/storage/repo-meta.d.ts +530 -0
  659. package/dist/storage/repo-meta.js +100 -0
  660. package/dist/types/pipeline.d.ts +37 -0
  661. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +1 -1
  662. package/hooks/claude/gitnexus-hook.cjs +1 -1
  663. package/hooks/claude/resolve-analyze-cmd.cjs +80 -13
  664. package/package.json +20 -12
  665. package/scripts/cross-platform-shard.ts +143 -0
  666. package/scripts/cross-platform-tests.ts +94 -0
  667. package/scripts/ensure-fts.ts +14 -3
  668. package/scripts/run-cross-platform.ts +36 -10
  669. package/scripts/sync-plugin-manifests.mjs +192 -0
  670. package/skills/gitnexus-cli.md +3 -3
  671. package/skills/gitnexus-debugging.md +37 -7
  672. package/skills/gitnexus-exploring.md +26 -4
  673. package/skills/gitnexus-impact-analysis.md +71 -10
  674. package/skills/gitnexus-lfg/README.md +55 -0
  675. package/skills/gitnexus-lfg/SKILL.md +86 -0
  676. package/skills/gitnexus-plan/README.md +147 -0
  677. package/skills/gitnexus-plan/SKILL.md +348 -0
  678. package/skills/gitnexus-plan/references/context-ledger.md +137 -0
  679. package/skills/gitnexus-plan/references/context-pack.md +126 -0
  680. package/skills/gitnexus-plan/references/evidence-provenance.md +309 -0
  681. package/skills/gitnexus-plan/references/pdg-slice.md +109 -0
  682. package/skills/gitnexus-plan/references/plan-template.md +201 -0
  683. package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +2366 -0
  684. package/skills/gitnexus-refactoring.md +48 -5
  685. package/skills/gitnexus-review/SKILL.md +279 -0
  686. package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +42 -0
  687. package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +39 -0
  688. package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +37 -0
  689. package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +40 -0
  690. package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +42 -0
  691. package/skills/gitnexus-review/ci-personas/ci-security-lens.md +39 -0
  692. package/skills/gitnexus-taint-analysis.md +13 -7
  693. package/skills/gitnexus-work/README.md +71 -0
  694. package/skills/gitnexus-work/SKILL.md +272 -0
  695. package/skills/gitnexus-work/references/evidence-provenance.md +309 -0
  696. package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2366 -0
  697. package/vendor/leiden/utils.cjs +28 -1
  698. package/web/assets/ProcessFlowModal-Badh2Pbg.js +24 -0
  699. package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
  700. package/web/assets/abnfDiagram-QNN2D4NM-Cq2djWWe.js +1 -0
  701. package/web/assets/agent-DIzEQ1JJ.js +626 -0
  702. package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +1 -0
  703. package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +36 -0
  704. package/web/assets/blockDiagram-54WLDVWM-Dg_hrRWE.js +132 -0
  705. package/web/assets/{c4Diagram-Y2BXMSZH-DOXVs7-C.js → c4Diagram-X2LASM7V-CnhoT4aV.js} +6 -6
  706. package/web/assets/chunk-224SPVON-B8gxtXpy.js +1 -0
  707. package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +127 -0
  708. package/web/assets/chunk-2SREHG4O-Dip42xOq.js +1 -0
  709. package/web/assets/chunk-4RFN2BYJ-DHHWuC-n.js +1 -0
  710. package/web/assets/chunk-66DQ2XMT-CM0xjFAN.js +1 -0
  711. package/web/assets/chunk-6BELYETK-ChsYtfHW.js +1 -0
  712. package/web/assets/chunk-6L755F7B-CMhLBxi2.js +1 -0
  713. package/web/assets/chunk-7CWYLC5S-DRgGkkpF.js +2 -0
  714. package/web/assets/chunk-A7VWPJGB-B4O3oQdQ.js +1 -0
  715. package/web/assets/chunk-BI6VK774-D0oaWk8V.js +1 -0
  716. package/web/assets/chunk-D6VWDJW2-BxcBdZ9c.js +2 -0
  717. package/web/assets/chunk-DMV4VAQV-Bn6WXDSX.js +4 -0
  718. package/web/assets/chunk-E5QJAATJ-dh-5CtIV.js +2 -0
  719. package/web/assets/chunk-EQFTRU2I-1ix7TzW9.js +2 -0
  720. package/web/assets/chunk-FWYVLQTC-BgDItRzJ.js +1 -0
  721. package/web/assets/chunk-HNC4WDU7-DoU3KnA7.js +1 -0
  722. package/web/assets/chunk-L5GCOVLC-CE2w8Nm_.js +161 -0
  723. package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +321 -0
  724. package/web/assets/chunk-LORZLZWG-B57uGw2N.js +88 -0
  725. package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +62 -0
  726. package/web/assets/chunk-NV3KIAZN-5yvcpMiu.js +1 -0
  727. package/web/assets/chunk-OIYT25JQ-CQ6KOZGX.js +1 -0
  728. package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +10 -0
  729. package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +156 -0
  730. package/web/assets/chunk-RRFMTAIC-CMN0wcYA.js +1 -0
  731. package/web/assets/{chunk-RLI5ZMPA-CkXZ0y0U.js → chunk-SATU7PGQ-B1zhgOvc.js} +1 -1
  732. package/web/assets/chunk-STOV2HOB-GnExfzIX.js +1 -0
  733. package/web/assets/chunk-SZD42YQK-ijyKKVr1.js +70 -0
  734. package/web/assets/chunk-TFPGFQPA-Dj6a-0pC.js +231 -0
  735. package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +2 -0
  736. package/web/assets/chunk-TZUXEDM2-B7p9AcTw.js +1 -0
  737. package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +1 -0
  738. package/web/assets/{chunk-6764PJDD-C7xxk063.js → chunk-VE5CLXGZ-C1vB7wpY.js} +1 -1
  739. package/web/assets/chunk-VJFVEZTB-CX66F2ep.js +206 -0
  740. package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +1 -0
  741. package/web/assets/chunk-WJBAP47W-BckNkuEN.js +1 -0
  742. package/web/assets/chunk-XNMVGMAZ-Cg_LnPtj.js +1 -0
  743. package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +1 -0
  744. package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +1 -0
  745. package/web/assets/{cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js → cose-bilkent-RZA4XIPR-BHpK4Crp.js} +1 -1
  746. package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +1 -0
  747. package/web/assets/cynefinDiagram-TR7LZUCG-C3Iar9lZ.js +62 -0
  748. package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +4 -0
  749. package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +30 -0
  750. package/web/assets/diagram-JCD7PQ7C-DC5-9FRr.js +24 -0
  751. package/web/assets/diagram-KFBZAVDW-Dfmf_4ti.js +3 -0
  752. package/web/assets/diagram-L7DVE3PN-GIRyVUtt.js +41 -0
  753. package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +24 -0
  754. package/web/assets/ebnfDiagram-DRHRQJWO-D8_CI4ZF.js +1 -0
  755. package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +85 -0
  756. package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +1 -0
  757. package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +1 -0
  758. package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +292 -0
  759. package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +1 -0
  760. package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +106 -0
  761. package/web/assets/{index-B4eB4dNZ.js → index-BBNl0qfX.js} +51 -51
  762. package/web/assets/index-CJDpyH-n.css +2 -0
  763. package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +1 -0
  764. package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +2 -0
  765. package/web/assets/{ishikawaDiagram-BNXS4ZKH-BLjivjXL.js → ishikawaDiagram-4JDSWWDM-DmqWtjkl.js} +6 -6
  766. package/web/assets/{journeyDiagram-M6C3CM3L-Cetgs3NH.js → journeyDiagram-QUS3FAKT-XAzVzrQW.js} +6 -6
  767. package/web/assets/{kanban-definition-75IXJCU3-DMlCaIpf.js → kanban-definition-D4L7SQKK-YurRnmYn.js} +27 -27
  768. package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +257 -0
  769. package/web/assets/{mindmap-definition-2TDM6QVE-B4GbXQBc.js → mindmap-definition-66QP5TD6-ChrWWnil.js} +29 -29
  770. package/web/assets/node-Ct_zna8U.js +8 -0
  771. package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +1 -0
  772. package/web/assets/pegDiagram-YKIO5C6U-QGeQLEq2.js +1 -0
  773. package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +1 -0
  774. package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +39 -0
  775. package/web/assets/preload-helper-Czpn1I53.js +1 -0
  776. package/web/assets/{quadrantDiagram-VICAPDV7-B1TQnlm0.js → quadrantDiagram-VO5QLCXA-B7098wSc.js} +6 -6
  777. package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +1 -0
  778. package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +1 -0
  779. package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +1 -0
  780. package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +1 -0
  781. package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +1 -0
  782. package/web/assets/railroadDiagram-M77LTMSB-AXu4vxk_.js +1 -0
  783. package/web/assets/requirementDiagram-RASO5HTO-B-l8InpK.js +84 -0
  784. package/web/assets/sankeyDiagram-F32LOJ6L-Kd7zjJgX.js +40 -0
  785. package/web/assets/sdk-CzHHH8tD.js +37 -0
  786. package/web/assets/sequenceDiagram-URATNSBD-BlcdY9DS.js +162 -0
  787. package/web/assets/sizeCapture-5GORAGP4-BEqQzsxs.js +1 -0
  788. package/web/assets/src-C5sx_gMp.js +1 -0
  789. package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +1 -0
  790. package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +1 -0
  791. package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +2 -0
  792. package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +8 -0
  793. package/web/assets/timeline-definition-WJXWRH4I-DUfp1R3E.js +120 -0
  794. package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +1 -0
  795. package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +1 -0
  796. package/web/assets/vennDiagram-K3VCMQLI-Bj-FN-XS.js +34 -0
  797. package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +1 -0
  798. package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +78 -0
  799. package/web/assets/xychartDiagram-5VRUVLCW-CK_rbSWE.js +7 -0
  800. package/web/index.html +17 -15
  801. package/dist/core/ingestion/languages/python/index-stats.d.ts +0 -18
  802. package/dist/core/ingestion/languages/python/index-stats.js +0 -25
  803. package/skills/gitnexus-pr-review.md +0 -163
  804. package/web/assets/ProcessFlowModal-Dna7GkwO.js +0 -22
  805. package/web/assets/agent-DNYDy-KA.js +0 -660
  806. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +0 -1
  807. package/web/assets/architectureDiagram-UL44E2DR-BU5ZRITg.js +0 -36
  808. package/web/assets/blockDiagram-7IZFK4PR-Dut1BpTV.js +0 -132
  809. package/web/assets/chunk-2T2R6R2M-pkw2oXHH.js +0 -4
  810. package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +0 -1
  811. package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +0 -321
  812. package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +0 -159
  813. package/web/assets/chunk-67TQ5CYL-zxhDWgyF.js +0 -124
  814. package/web/assets/chunk-7J6CGLKN-AmkN8jJN.js +0 -10
  815. package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +0 -1
  816. package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +0 -1
  817. package/web/assets/chunk-INKRHTLW-D9BM9HWZ.js +0 -70
  818. package/web/assets/chunk-J5EP6P6S-L19oz55R.js +0 -1
  819. package/web/assets/chunk-KGFNY3KK-tD2F6wxK.js +0 -62
  820. package/web/assets/chunk-KGYTTC2M-zm6n242I.js +0 -1
  821. package/web/assets/chunk-KNLZD3CH-BGlP6X9R.js +0 -1
  822. package/web/assets/chunk-LCXTWHL2-Ba9JK-6F.js +0 -231
  823. package/web/assets/chunk-LII3EMHJ-EGx-eBIu.js +0 -1
  824. package/web/assets/chunk-LRIF4GLE-C3_PqUBq.js +0 -1
  825. package/web/assets/chunk-QA3QBVWF-D4cSJBf6.js +0 -2
  826. package/web/assets/chunk-RERM46MO-B5dAdWpP.js +0 -1
  827. package/web/assets/chunk-RG4AUYOV-OqBBMwuQ.js +0 -206
  828. package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +0 -1
  829. package/web/assets/chunk-T2UQINTJ-BJusEiGe.js +0 -1
  830. package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +0 -1
  831. package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +0 -1
  832. package/web/assets/chunk-UY5QBCOK-BCpUlARQ.js +0 -1
  833. package/web/assets/chunk-VU6ZFW4Y-BeXVk45_.js +0 -2
  834. package/web/assets/chunk-ZXARS5L4-BI_qR2Nm.js +0 -1
  835. package/web/assets/classDiagram-KGZ6W3CR-D9zSIg0x.js +0 -1
  836. package/web/assets/classDiagram-v2-72OJOZXJ-D9zSIg0x.js +0 -1
  837. package/web/assets/dagre-ND4H6XIP-CpcV5kbl.js +0 -4
  838. package/web/assets/diagram-3NCE3AQN-6SMxBRpj.js +0 -43
  839. package/web/assets/diagram-GF46GFSD-BZEdNcRZ.js +0 -24
  840. package/web/assets/diagram-HNR7UZ2L-DxKW2a2Y.js +0 -3
  841. package/web/assets/diagram-QXG6HAR7-HfTHcXX_.js +0 -24
  842. package/web/assets/diagram-WEQXMOUZ-CyijUS8r.js +0 -10
  843. package/web/assets/erDiagram-L5TCEMPS-D0fvpWEX.js +0 -85
  844. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +0 -1
  845. package/web/assets/flowDiagram-H6V6AXG4-Bvr9bbhk.js +0 -162
  846. package/web/assets/ganttDiagram-JCBTUEKG-TzODrLzv.js +0 -292
  847. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +0 -1
  848. package/web/assets/gitGraphDiagram-S2ZK5IYY-ONQSwJIY.js +0 -106
  849. package/web/assets/index-CX_fADmQ.css +0 -2
  850. package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +0 -1
  851. package/web/assets/infoDiagram-3YFTVSEB-DIPVUIQ6.js +0 -2
  852. package/web/assets/katex-K3KEBU37-qRQBy-EZ.js +0 -261
  853. package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +0 -1
  854. package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +0 -1
  855. package/web/assets/pieDiagram-CU6KROY3-D3YC_xyg.js +0 -30
  856. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +0 -1
  857. package/web/assets/requirementDiagram-JXO7QTGE-f8wczLQf.js +0 -84
  858. package/web/assets/sankeyDiagram-URQDO5SZ-BTxzG5j0.js +0 -40
  859. package/web/assets/sequenceDiagram-VS2MUI6T-DuamM-IR.js +0 -162
  860. package/web/assets/src-BNCXICdA.js +0 -1
  861. package/web/assets/stateDiagram-7D4R322I-Ch2pEUcw.js +0 -1
  862. package/web/assets/stateDiagram-v2-36443NZ5-7ANuoZLL.js +0 -1
  863. package/web/assets/timeline-definition-O6YCAMPW-07BR8R8G.js +0 -120
  864. package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +0 -1
  865. package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +0 -1
  866. package/web/assets/vennDiagram-MWXL3ELB-BQX2ossk.js +0 -34
  867. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +0 -1
  868. package/web/assets/wardleyDiagram-CUQ6CDDI-CGIJBBiK.js +0 -78
  869. package/web/assets/xychartDiagram-N2JHSOCM-B3HNMuWp.js +0 -7
  870. /package/web/assets/{chunk-7W6UQGC5-pyKGssV3.js → chunk-LIEV3EAG-pyKGssV3.js} +0 -0
@@ -6,6 +6,7 @@
6
6
  * analysis.
7
7
  */
8
8
  import { findAncestorBeforeBoundary, FUNCTION_NODE_TYPES } from '../../utils/ast-helpers.js';
9
+ import { walkToScope } from '../../utils/scope-tree-walk.js';
9
10
  const PYTHON_METHOD_CONTAINER_TYPES = new Set(['class_definition']);
10
11
  export function pythonFunctionDefinitionLabel(functionNode, defaultLabel) {
11
12
  if (defaultLabel !== 'Function')
@@ -15,11 +16,14 @@ export function pythonFunctionDefinitionLabel(functionNode, defaultLabel) {
15
16
  }
16
17
  // ─── bindingScopeFor ──────────────────────────────────────────────────────
17
18
  /** Python has no block scope, so the central extractor's "innermost
18
- * enclosing scope" default is already correct: `for x in …` creates
19
- * `x` in the enclosing function/module scope (because we never emit a
20
- * `@scope.block` for the for-loop body), comprehension variables stay
21
- * in their expression context, etc. Returns `null` to delegate. */
22
- export function pythonBindingScopeFor(_decl, _innermost, _tree) {
19
+ * enclosing scope" default is already correct for ordinary bindings.
20
+ * Constructor-injected instance fields are the exception: their marker is
21
+ * anchored inside `__init__`, but compound receiver resolution needs the
22
+ * field type on the enclosing Class scope. */
23
+ export function pythonBindingScopeFor(decl, innermost, tree) {
24
+ if (decl['@type-binding.instance-field'] !== undefined) {
25
+ return walkToScope(innermost, tree, 'Class');
26
+ }
23
27
  return null;
24
28
  }
25
29
  // ─── importOwningScope ────────────────────────────────────────────────────
@@ -6,6 +6,8 @@ import { getTreeSitterBufferSize } from '../../constants.js';
6
6
  import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
7
7
  import { splitQualifiedName } from '../../utils/qualified-name.js';
8
8
  import { encodeMarker } from '../../utils/heritage-marker.js';
9
+ import { synthesizeCallableFlowCaptures } from '../../utils/callable-flow-captures.js';
10
+ import { synthesizeReceiverChainCapture } from '../../utils/receiver-chain-captures.js';
9
11
  const FUNCTION_NODE_TYPES = ['method', 'singleton_method'];
10
12
  const HERITAGE_CALL_NAMES = new Set(['include', 'extend', 'prepend']);
11
13
  const ATTR_CALL_NAMES = new Set([
@@ -13,6 +15,46 @@ const ATTR_CALL_NAMES = new Set([
13
15
  'attr_reader',
14
16
  'attr_writer',
15
17
  ]);
18
+ const RUBY_CALLABLE_CAPTURE_OPTIONS = {
19
+ functionNodeTypes: new Set(['method', 'singleton_method', 'lambda']),
20
+ callNodeTypes: new Set(['call']),
21
+ parameterListNodeTypes: new Set(['method_parameters', 'argument_list']),
22
+ parameterNodeTypes: new Set([
23
+ 'identifier',
24
+ 'optional_parameter',
25
+ 'splat_parameter',
26
+ 'hash_splat_parameter',
27
+ 'block_parameter',
28
+ ]),
29
+ bindingNodeTypes: new Set(['assignment']),
30
+ assignmentNodeTypes: new Set(['assignment', 'operator_assignment']),
31
+ identifierNodeTypes: new Set([
32
+ 'identifier',
33
+ 'constant',
34
+ 'instance_variable',
35
+ 'class_variable',
36
+ 'global_variable',
37
+ ]),
38
+ functionScopedValueBindings: true,
39
+ callableProtocolMethods: new Set(['call']),
40
+ // A bare receiver-less identifier in value position is a method CALL in
41
+ // Ruby (`action = process` stores process's RETURN value) — only explicit
42
+ // reference forms (method(:x), &:x, lambda/proc) reference the callable.
43
+ bareNamesAreCalls: true,
44
+ extractCallableReference: (node) => {
45
+ if (node.type !== 'call')
46
+ return undefined;
47
+ const method = node.childForFieldName('method');
48
+ if (method?.text !== 'method' && method?.text !== 'public_method')
49
+ return undefined;
50
+ const args = node.childForFieldName('arguments');
51
+ const symbol = args?.namedChildren.find((child) => child !== null && child.type === 'simple_symbol');
52
+ if (symbol === undefined)
53
+ return undefined;
54
+ const name = symbol.text.replace(/^:/, '');
55
+ return name.length === 0 ? undefined : { name, anchor: symbol };
56
+ },
57
+ };
16
58
  /**
17
59
  * Build the full `.`-joined qualified owner name for a heritage/attr call by
18
60
  * walking ALL enclosing class/module ancestors (not just the immediate one),
@@ -42,6 +84,123 @@ function buildEnclosingQualifiedName(callNode) {
42
84
  }
43
85
  return segments.length > 0 ? segments.join('.') : undefined;
44
86
  }
87
+ /**
88
+ * Does this `@ivar` write land on an INSTANCE of the enclosing LEXICAL class?
89
+ *
90
+ * In Ruby an instance variable belongs to whatever `self` is at the point of
91
+ * the write, so this is really a question about `self`, and `self` is an
92
+ * instance of the enclosing lexical class only inside an ordinary `def` whose
93
+ * own definition site is that class's body. Every other arrangement writes an
94
+ * ivar some instance of this class will never see:
95
+ *
96
+ * class C
97
+ * @shared = Outer.new # class body: self == C
98
+ * def self.build # singleton_method: self == C
99
+ * @pool = Outer.new
100
+ * end
101
+ * class << self # singleton_class: self == C
102
+ * def warm; @cache = Outer.new; end
103
+ * end
104
+ * Other.class_eval do # block receiver: self == Other
105
+ * def warm; @far = Outer.new; end
106
+ * end
107
+ * other.instance_eval { @alien = Outer.new } # self == other
108
+ * def run; @pool.inner; end # reads nil — @pool was never set on an instance
109
+ * end
110
+ *
111
+ * So the walk stops on the FIRST ancestor that decides who `self` is, and
112
+ * answers true only for an ordinary `method` reached without crossing any
113
+ * boundary that could have moved `self` elsewhere. `method` alone is NOT
114
+ * sufficient — a `def` nested in a `class << self` body, or in a `class_eval`
115
+ * block, is reached through a `method` node first — hence the flag rather than
116
+ * an early return (#2807).
117
+ *
118
+ * ── WHY BLOCKS ARE A HARD STOP, WITHOUT LOOKING AT THE CALL THEY BELONG TO ──
119
+ *
120
+ * A block is the one construct whose `self` (and whose "default definee", the
121
+ * class a `def` inside it attaches to) is chosen by its RECEIVER, not by its
122
+ * syntax. `Foo.class_eval do … end`, `Class.new do … end`, `Struct.new(:x) do …
123
+ * end`, `Data.define(:x) do … end`, `Module.new`, `refine`, `define_method`,
124
+ * `instance_eval`, `instance_exec`, `module_eval` and `class_exec` all rebind
125
+ * it; `[1].each do … end` does not.
126
+ *
127
+ * Telling those apart would need an enumeration of every method that rebinds a
128
+ * block's `self`, and that set is OPEN: any user-defined method can do it to a
129
+ * block it merely receives —
130
+ *
131
+ * def helper(&blk) = Foo.class_eval(&blk)
132
+ * helper { def warm; @far = Outer.new; end } # attaches to Foo, not here
133
+ *
134
+ * — so no allow-list of "safe" call names is sound, and a deny-list of known
135
+ * rebinders is exactly the incomplete enumeration that produced this bug. The
136
+ * only complete answer available from the block's own syntax is that ownership
137
+ * is unprovable, so every block boundary is a stop. That over-discards a plain
138
+ * `each`/`tap` block, whose `self` really is the instance; per the safety
139
+ * doctrine (see `scope-resolution/passes/compound-receiver.ts`) a missed edge is
140
+ * the acceptable cost and a fabricated edge on the wrong class is not.
141
+ *
142
+ * A `class` / `module` keyword nested INSIDE a block still terminates the walk
143
+ * with a true answer, and correctly so: that keyword sets the definee lexically
144
+ * no matter what surrounds it, so `Class.new do class Inner; def m; @a = …`
145
+ * writes a real `Inner` instance field.
146
+ *
147
+ * ── FORMS THAT CANNOT REACH HERE AT ALL ────────────────────────────────────
148
+ *
149
+ * `obj.instance_variable_set(:@a, Outer.new)` is a `call`, not an `assignment`,
150
+ * and `Foo.class_eval "def warm; @a = Outer.new; end"` hides its body in a
151
+ * `string` node. Neither parses into the `(assignment left: (instance_variable)
152
+ * …)` pattern in query.ts, so neither ever produces the marker this gate reads.
153
+ *
154
+ * Deliberately conservative. A write this returns false for simply binds no
155
+ * type at all, which costs at most a missed edge; returning true too eagerly
156
+ * invents a call from a receiver that is always nil.
157
+ */
158
+ function isRubyInstanceIvarWrite(ivarNode) {
159
+ if (ivarNode === undefined)
160
+ return false;
161
+ let insideMethodBody = false;
162
+ for (let ancestor = ivarNode.parent; ancestor !== null; ancestor = ancestor.parent) {
163
+ switch (ancestor.type) {
164
+ // `def self.x` / `def obj.x`, and `class << self` / `class << obj`.
165
+ case 'singleton_method':
166
+ case 'singleton_class':
167
+ return false;
168
+ // Every block body: `do … end` and `{ … }` are the only two the grammar
169
+ // produces. `lambda` (`->`) always wraps its body in one of them, so it
170
+ // can never be the first boundary today — it is listed because the
171
+ // boundary IS the lambda, and a grammar change must not silently
172
+ // un-guard it.
173
+ case 'do_block':
174
+ case 'block':
175
+ case 'lambda':
176
+ return false;
177
+ // `BEGIN { … }` / `END { … }` are program-level bodies whose execution is
178
+ // relocated out of the enclosing method (before the program, and at exit);
179
+ // Ruby warns when they appear in a method body at all. Rather than assert
180
+ // whose `self` runs them, the doctrine applies: unprovable, so discard.
181
+ // Reachable — tree-sitter parses `END { @a = Outer.new }` inside a `def`
182
+ // as an `end_block` under that method's body.
183
+ case 'begin_block':
184
+ case 'end_block':
185
+ return false;
186
+ case 'method':
187
+ insideMethodBody = true;
188
+ break;
189
+ // The owning body. Reaching it without crossing any of the boundaries
190
+ // above means the write is an instance write exactly when a `def` body
191
+ // enclosed it.
192
+ case 'class':
193
+ case 'module':
194
+ case 'program':
195
+ return insideMethodBody;
196
+ // Everything else is control flow that cannot move `self`: `if`/`unless`
197
+ // (`then`), `case`/`when`, `while`, `for`/`do`, `begin`/`rescue`/`ensure`.
198
+ default:
199
+ break;
200
+ }
201
+ }
202
+ return false;
203
+ }
45
204
  export function emitRubyScopeCaptures(sourceText, _filePath, cachedTree) {
46
205
  let tree = cachedTree;
47
206
  if (tree === undefined) {
@@ -83,6 +242,22 @@ export function emitRubyScopeCaptures(sourceText, _filePath, cachedTree) {
83
242
  }
84
243
  if (Object.keys(grouped).length === 0)
85
244
  continue;
245
+ // A tree-sitter pattern cannot say "and no singleton ancestor", so the
246
+ // ownership test is a walk and the whole binding is dropped here when `self`
247
+ // is the class object rather than an instance.
248
+ //
249
+ // Dropping the MARKER alone is not enough, and the class-body shape is why:
250
+ // with the marker gone `rubyBindingScopeFor` declines to hoist and the
251
+ // binding falls back to its innermost scope — which for `@shared = Outer.new`
252
+ // written straight in the class body already IS the Class scope. It would
253
+ // arrive at the wrong place by default. Discarding the match is the only
254
+ // uniform answer, and it costs nothing that existed before: these ivar
255
+ // patterns are new in #2807, so a class-object ivar simply goes back to
256
+ // binding nothing, exactly as it did before the pattern was added.
257
+ if (grouped['@type-binding.ivar-field'] !== undefined &&
258
+ !isRubyInstanceIvarWrite(nodeMap['@type-binding.ivar-field'])) {
259
+ continue;
260
+ }
86
261
  // Decompose require/require_relative/load into import captures
87
262
  if (grouped['@import.statement'] !== undefined) {
88
263
  const anchor = grouped['@import.statement'];
@@ -94,6 +269,12 @@ export function emitRubyScopeCaptures(sourceText, _filePath, cachedTree) {
94
269
  continue;
95
270
  }
96
271
  }
272
+ // Structural receiver chain for a call whose receiver is itself an
273
+ // expression, so resolution can type it by folding over structure
274
+ // instead of re-parsing the receiver's source text. Self-gating: a
275
+ // non-call match, an absent receiver, or a chain with no nameable base
276
+ // all leave `grouped` untouched.
277
+ synthesizeReceiverChainCapture(grouped, nodeMap['@reference.receiver']);
97
278
  out.push(grouped);
98
279
  continue;
99
280
  }
@@ -106,6 +287,12 @@ export function emitRubyScopeCaptures(sourceText, _filePath, cachedTree) {
106
287
  if (receiver !== null)
107
288
  out.push(receiver);
108
289
  }
290
+ // Structural receiver chain for a call whose receiver is itself an
291
+ // expression, so resolution can type it by folding over structure
292
+ // instead of re-parsing the receiver's source text. Self-gating: a
293
+ // non-call match, an absent receiver, or a chain with no nameable base
294
+ // all leave `grouped` untouched.
295
+ synthesizeReceiverChainCapture(grouped, nodeMap['@reference.receiver']);
109
296
  out.push(grouped);
110
297
  continue;
111
298
  }
@@ -133,6 +320,12 @@ export function emitRubyScopeCaptures(sourceText, _filePath, cachedTree) {
133
320
  grouped['@declaration.parameter-types'] = syntheticCapture('@declaration.parameter-types', fnNode, JSON.stringify(arity.parameterTypes));
134
321
  }
135
322
  }
323
+ // Structural receiver chain for a call whose receiver is itself an
324
+ // expression, so resolution can type it by folding over structure
325
+ // instead of re-parsing the receiver's source text. Self-gating: a
326
+ // non-call match, an absent receiver, or a chain with no nameable base
327
+ // all leave `grouped` untouched.
328
+ synthesizeReceiverChainCapture(grouped, nodeMap['@reference.receiver']);
136
329
  out.push(grouped);
137
330
  continue;
138
331
  }
@@ -215,6 +408,12 @@ export function emitRubyScopeCaptures(sourceText, _filePath, cachedTree) {
215
408
  grouped['@reference.arity'] = syntheticCapture('@reference.arity', callNode, String(arity));
216
409
  }
217
410
  }
411
+ // Structural receiver chain for a call whose receiver is itself an
412
+ // expression, so resolution can type it by folding over structure
413
+ // instead of re-parsing the receiver's source text. Self-gating: a
414
+ // non-call match, an absent receiver, or a chain with no nameable base
415
+ // all leave `grouped` untouched.
416
+ synthesizeReceiverChainCapture(grouped, nodeMap['@reference.receiver']);
218
417
  out.push(grouped);
219
418
  }
220
419
  // Second pass: member-call-return type bindings
@@ -400,6 +599,7 @@ export function emitRubyScopeCaptures(sourceText, _filePath, cachedTree) {
400
599
  // flow through `emitHeritageEdges` (the `__heritage__:` import path above),
401
600
  // an independent lane that stays intact when the legacy heritage leg is gated off.
402
601
  out.push(...synthesizeRubySuperclassReferences(tree.rootNode));
602
+ out.push(...synthesizeCallableFlowCaptures(tree.rootNode, RUBY_CALLABLE_CAPTURE_OPTIONS));
403
603
  return out;
404
604
  }
405
605
  /**
@@ -7,7 +7,7 @@
7
7
  * - External gems → null (unresolvable within the repo)
8
8
  */
9
9
  import { resolveRubyImportInternal } from '../../import-resolvers/ruby.js';
10
- import { buildSuffixIndex } from '../../import-resolvers/utils.js';
10
+ import { getWorkspaceFileIndex } from '../../import-resolvers/workspace-file-index.js';
11
11
  import { isHeritageMarker } from '../../utils/heritage-marker.js';
12
12
  // ─── resolveRubyImportTarget ──────────────────────────────────────────────
13
13
  /**
@@ -78,8 +78,10 @@ function resolveRelative(targetRaw, fromDir, allFilePaths) {
78
78
  * via suffix matching using the existing Ruby import resolver.
79
79
  */
80
80
  function resolveBare(targetRaw, allFilePaths) {
81
- const normalizedFileList = [...allFilePaths].map((f) => f.replace(/\\/g, '/'));
82
- const allFileList = [...allFilePaths];
83
- const index = buildSuffixIndex(normalizedFileList, allFileList);
84
- return resolveRubyImportInternal(targetRaw, normalizedFileList, allFileList, index);
81
+ // Was: two array materializations plus a full `buildSuffixIndex` per require,
82
+ // thrown away on return — every require paid to index every file in the repo
83
+ // (#2880). `buildSuffixIndex` is a pure function of the file set, so this is a
84
+ // hoist, not a behaviour change.
85
+ const { normalized, all, index } = getWorkspaceFileIndex(allFilePaths);
86
+ return resolveRubyImportInternal(targetRaw, normalized, all, index);
85
87
  }
@@ -77,6 +77,64 @@ const RUBY_SCOPE_QUERY = `
77
77
  (singleton_method
78
78
  name: (identifier) @declaration.name) @declaration.function
79
79
 
80
+ ;; ── Declarations — closure bound to a local ──────────────────────────────
81
+ ;;
82
+ ;; handler = ->(x) { target(x) } / lambda { |x| ... } / proc { |x| ... }
83
+ ;;
84
+ ;; Anchor discipline (same contract as javascript/query.ts): @declaration.function
85
+ ;; sits on the INNER (block), NOT on the assignment wrapper and NOT on the
86
+ ;; (lambda) node — the block is what carries @scope.block above, so anchoring
87
+ ;; there aligns anchor.range with the scope range. That alignment is what lets
88
+ ;; pickCallerCallableDef accept a Block-kind scope as a callable boundary.
89
+ ;; do_block/block stay @scope.block deliberately — do NOT re-kind them.
90
+ ;;
91
+ ;; The call forms are restricted to lambda/proc by name. An unrestricted
92
+ ;; (call block: (block)) would match ANY method call with a block, so
93
+ ;; mapped = items.map { |i| ... } would wrongly declare mapped a callable.
94
+ ;; Separate #eq? patterns rather than one #match? alternation: alternation
95
+ ;; predicates are a known hazard on this tree-sitter line.
96
+ ;; BOTH block forms in every pattern. do...end produces (do_block), braces
97
+ ;; produce (block), and do/end is the dominant MULTI-LINE style — covering only
98
+ ;; braces left lambda-do-end with a Block scope owning nothing, so its
99
+ ;; calls fell through to the enclosing method. @scope.block above already covers
100
+ ;; both, so the two channels now agree.
101
+ ;;
102
+ ;; The !receiver constraint is load-bearing: without it #eq? tests the method
103
+ ;; NAME only, so MyMod.lambda {...} / obj.proc {...} would be captured as
104
+ ;; closure bindings. Verified against the grammar: with !receiver those are
105
+ ;; rejected while bare lambda/proc still match.
106
+ (assignment
107
+ left: (identifier) @declaration.name
108
+ right: (lambda body: [(block) (do_block)] @declaration.function))
109
+
110
+ (assignment
111
+ left: (identifier) @declaration.name
112
+ right: (call
113
+ !receiver
114
+ method: (identifier) @_lambda-kw
115
+ block: [(block) (do_block)] @declaration.function)
116
+ (#eq? @_lambda-kw "lambda"))
117
+
118
+ (assignment
119
+ left: (identifier) @declaration.name
120
+ right: (call
121
+ !receiver
122
+ method: (identifier) @_proc-kw
123
+ block: [(block) (do_block)] @declaration.function)
124
+ (#eq? @_proc-kw "proc"))
125
+
126
+ ;; Proc.new { ... } / Proc.new do ... end — the explicit constructor form.
127
+ ;; Receiver IS required here and must be the Proc constant, so this cannot
128
+ ;; collide with the bare-call patterns above.
129
+ (assignment
130
+ left: (identifier) @declaration.name
131
+ right: (call
132
+ receiver: (constant) @_proc-const
133
+ method: (identifier) @_new-kw
134
+ block: [(block) (do_block)] @declaration.function)
135
+ (#eq? @_proc-const "Proc")
136
+ (#eq? @_new-kw "new"))
137
+
80
138
  ;; ── Declarations — variable assignment ───────────────────────────────────
81
139
 
82
140
  (assignment
@@ -118,6 +176,41 @@ const RUBY_SCOPE_QUERY = `
118
176
  method: (identifier) @_new_method2
119
177
  (#eq? @_new_method2 "new"))) @type-binding.constructor
120
178
 
179
+ ;; Instance-variable constructor: \`@service = UserService.new\` (#2807).
180
+ ;; The patterns above bind locals and constants; an instance variable — the
181
+ ;; only way a Ruby object gets a field at all — bound nothing, so \`@service.run\`
182
+ ;; had no receiver type and the fold declined the whole chain.
183
+ ;;
184
+ ;; \`@type-binding.name\` is captured on the \`instance_variable\` node, so the
185
+ ;; bound name keeps its \`@\` sigil and matches the receiver text at the call
186
+ ;; site verbatim. The narrow \`@type-binding.ivar-field\` marker rides the same
187
+ ;; node for \`rubyBindingScopeFor\` to hoist on; anchorCaptureFor takes the
188
+ ;; broadest range, so the assignment stays the anchor and the source stays
189
+ ;; \`constructor-inferred\`.
190
+ ;;
191
+ ;; These patterns match unconditionally HERE; captures.ts then discards the
192
+ ;; whole binding via \`isRubyInstanceIvarWrite\` unless \`self\` at the write is
193
+ ;; provably an instance of the enclosing lexical class — which rules out
194
+ ;; \`def self.x\`, \`class << self\`, the class body itself, and any write reached
195
+ ;; through a block, whose \`self\` its receiver chooses (\`class_eval\`,
196
+ ;; \`Class.new\`, \`instance_eval\`, \`define_method\`, …). A tree-sitter pattern
197
+ ;; cannot state "and no singleton or block ancestor", so the ownership test has
198
+ ;; to be a walk.
199
+
200
+ (assignment
201
+ left: (instance_variable) @type-binding.name @type-binding.ivar-field
202
+ right: (call
203
+ receiver: (constant) @type-binding.type
204
+ method: (identifier) @_new_ivar
205
+ (#eq? @_new_ivar "new"))) @type-binding.constructor
206
+
207
+ (assignment
208
+ left: (instance_variable) @type-binding.name @type-binding.ivar-field
209
+ right: (call
210
+ receiver: (scope_resolution) @type-binding.type
211
+ method: (identifier) @_new_ivar_q
212
+ (#eq? @_new_ivar_q "new"))) @type-binding.constructor
213
+
121
214
  ;; Constant constructor: SERVICE = UserService.new (left is constant, not identifier)
122
215
 
123
216
  (assignment
@@ -241,6 +241,8 @@ function expandRubyWildcardNames(targetModuleScope, parsedFiles) {
241
241
  return names;
242
242
  }
243
243
  export const rubyScopeResolver = {
244
+ // Construction is a selector on the class: `Service.new.do_work` (#2708).
245
+ constructionSyntax: { selector: 'new' },
244
246
  language: SupportedLanguages.Ruby,
245
247
  languageProvider: rubyProvider,
246
248
  importEdgeReason: 'ruby-scope: import',
@@ -1,6 +1,6 @@
1
1
  import type { CaptureMatch, ParsedImport, Scope, ScopeId, ScopeTree, TypeRef, NodeLabel } from '../../../../_shared/index.js';
2
2
  import type { SyntaxNode } from '../../utils/ast-helpers.js';
3
- export declare function rubyBindingScopeFor(decl: CaptureMatch, innermost: Scope, _tree: ScopeTree): ScopeId | null;
3
+ export declare function rubyBindingScopeFor(decl: CaptureMatch, innermost: Scope, tree: ScopeTree): ScopeId | null;
4
4
  /**
5
5
  * Ruby `require` / `include` inside a function or class body should attach
6
6
  * at that scope, not module scope.
@@ -1,9 +1,30 @@
1
- export function rubyBindingScopeFor(decl, innermost, _tree) {
1
+ import { walkToScope } from '../../utils/scope-tree-walk.js';
2
+ export function rubyBindingScopeFor(decl, innermost, tree) {
2
3
  // Keep self typeBindings in the method's Function scope so
3
4
  // populateClassOwnedMembers can match Method defs to their receiver types.
4
5
  if (decl['@type-binding.self'] !== undefined) {
5
6
  return innermost.id;
6
7
  }
8
+ // `@ivar = Foo.new` in `initialize` (or any method) declares a FIELD of the
9
+ // enclosing class, so its type binding belongs on the Class scope — the only
10
+ // place `typeOfMemberOnClass` reads it. Left on the method's own Function
11
+ // scope it would be invisible to every other method (#2807).
12
+ //
13
+ // Gated on the marker that pattern emits, never on `@type-binding.constructor`
14
+ // at large: that capture also fires for `x = Foo.new` locals, and hoisting
15
+ // those to the class would leak a method local into every sibling method.
16
+ //
17
+ // Reaching this hook already means the write is an INSTANCE write. `Capture`
18
+ // carries only name/range/text — no AST node — so this hook cannot ask whose
19
+ // `self` owns the ivar; `isRubyInstanceIvarWrite` (captures.ts) answers that
20
+ // upstream and discards the binding entirely whenever `self` is anything but
21
+ // an instance of the enclosing lexical class — the class object itself
22
+ // (`def self.x`, `class << self`, the class body), or whatever object a block
23
+ // receiver rebinds it to (`class_eval`, `Class.new`, `instance_eval`, …).
24
+ // None of those reach an instance, so none may be published as its field.
25
+ if (decl['@type-binding.ivar-field'] !== undefined) {
26
+ return walkToScope(innermost, tree, 'Class');
27
+ }
7
28
  return null;
8
29
  }
9
30
  /**
@@ -1,10 +1,23 @@
1
- import { nodeIfType, nodeToCapture, syntheticCapture, walkNamedTree, } from '../../utils/ast-helpers.js';
1
+ import { findChild, nodeIfType, nodeToCapture, syntheticCapture, walkNamedTree, } from '../../utils/ast-helpers.js';
2
2
  import { getRustParser, getRustScopeQuery } from './query.js';
3
3
  import { recordRustCacheHit, recordRustCacheMiss } from './cache-stats.js';
4
4
  import { splitRustUseDeclaration } from './import-decomposer.js';
5
5
  import { synthesizeRustReceiverBinding } from './receiver-binding.js';
6
6
  import { getTreeSitterBufferSize } from '../../constants.js';
7
7
  import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
8
+ import { synthesizeCallableFlowCaptures } from '../../utils/callable-flow-captures.js';
9
+ import { synthesizeReceiverChainCapture } from '../../utils/receiver-chain-captures.js';
10
+ const RUST_CALLABLE_CAPTURE_OPTIONS = {
11
+ functionNodeTypes: new Set(['function_item', 'closure_expression']),
12
+ callNodeTypes: new Set(['call_expression']),
13
+ parameterListNodeTypes: new Set(['parameters', 'arguments']),
14
+ parameterNodeTypes: new Set(['parameter', 'self_parameter']),
15
+ bindingNodeTypes: new Set(['let_declaration']),
16
+ assignmentNodeTypes: new Set(['assignment_expression']),
17
+ identifierNodeTypes: new Set(['identifier', 'type_identifier', 'field_identifier']),
18
+ callableReferenceNodeTypes: new Set(['scoped_identifier']),
19
+ normalizeQualifiedName: (raw) => raw.replaceAll('::', '.'),
20
+ };
8
21
  export function emitRustScopeCaptures(sourceText, _filePath, cachedTree) {
9
22
  let tree = cachedTree;
10
23
  if (tree === undefined) {
@@ -82,6 +95,26 @@ export function emitRustScopeCaptures(sourceText, _filePath, cachedTree) {
82
95
  }
83
96
  }
84
97
  }
98
+ // `Self` in a type binding names the enclosing impl's type, not a type
99
+ // called "Self". `let fresh = Self { … }` inside `impl User` binds
100
+ // `fresh: User`; recorded verbatim it binds `fresh: Self`, which resolves
101
+ // to nothing and leaves the receiver's type unknown.
102
+ //
103
+ // The type-env channel already substitutes this
104
+ // (`type-extractors/rust.ts` → `findEnclosingImplType`); the
105
+ // scope-resolution channel did not, so the two disagreed. That went
106
+ // unnoticed while `lookupCore` Step 1 still walked the lexical chain for
107
+ // named receivers — the impl scope binds the method by name, so
108
+ // `fresh.validate()` resolved by accident. #2714 stopped that walk for
109
+ // named receivers and the gap became a lost edge (#2699 follow-up).
110
+ const tbTypeNode = nodeMap['@type-binding.type'];
111
+ if (grouped['@type-binding.type']?.text === 'Self' && tbTypeNode !== undefined) {
112
+ const implNode = findEnclosingImpl(tbTypeNode);
113
+ const implTypeNode = implNode?.childForFieldName('type') ?? null;
114
+ if (implTypeNode !== null) {
115
+ grouped['@type-binding.type'] = syntheticCapture('@type-binding.type', tbTypeNode, implTypeNode.text);
116
+ }
117
+ }
85
118
  // Hoist return-type bindings from impl block functions to module level.
86
119
  // The auto-hoist in the scope-extractor places a type binding whose
87
120
  // anchor matches its innermost scope on the parent scope. By using the
@@ -114,9 +147,16 @@ export function emitRustScopeCaptures(sourceText, _filePath, cachedTree) {
114
147
  grouped['@reference.arity'] = syntheticCapture('@reference.arity', callNode, String(arity));
115
148
  }
116
149
  }
150
+ // Structural receiver chain for a call whose receiver is itself an
151
+ // expression, so resolution can type it by folding over structure
152
+ // instead of re-parsing the receiver's source text. Self-gating: a
153
+ // non-call match, an absent receiver, or a chain with no nameable base
154
+ // all leave `grouped` untouched.
155
+ synthesizeReceiverChainCapture(grouped, nodeMap['@reference.receiver']);
117
156
  out.push(grouped);
118
157
  }
119
158
  out.push(...synthesizeRustInheritanceReferences(tree.rootNode));
159
+ out.push(...synthesizeCallableFlowCaptures(tree.rootNode, RUST_CALLABLE_CAPTURE_OPTIONS));
120
160
  return out;
121
161
  }
122
162
  /**
@@ -161,10 +201,21 @@ function synthesizeRustInheritanceReferences(root) {
161
201
  const structName = bareTypeIdentifier(typeField);
162
202
  if (traitName === null || structName === null)
163
203
  return;
204
+ // The trait's generic ARGUMENTS (`impl Validator<String> for V`), so
205
+ // interface dispatch can tell one instantiation of a trait from another
206
+ // (#2912). Emitted as a sub-tag rather than by widening the anchor: the
207
+ // anchor is the bare `type_identifier` inside the `generic_type`, and its
208
+ // range is part of the inheritance edge's id.
209
+ const traitArguments = traitField.type === 'generic_type' ? findChild(traitField, 'type_arguments') : null;
164
210
  out.push({
165
211
  '@reference.inherits': nodeToCapture('@reference.inherits', traitName),
166
212
  '@reference.name': nodeToCapture('@reference.name', traitName),
167
213
  '@reference.receiver': syntheticCapture('@reference.receiver', structName, structName.text),
214
+ ...(traitArguments === null
215
+ ? {}
216
+ : {
217
+ '@reference.type-arguments': nodeToCapture('@reference.type-arguments', traitArguments),
218
+ }),
168
219
  });
169
220
  });
170
221
  return out;
@@ -1,6 +1,22 @@
1
1
  const REF_PREFIX_RE = /^&\s*(mut\s+)?/;
2
2
  const PTR_PREFIX_RE = /^\*\s*(const|mut)?\s*/;
3
+ const DYN_PREFIX_RE = /^dyn\s+/;
3
4
  const ENUM_VARIANT_NAMES = new Set(['Some', 'None', 'Ok', 'Err']);
5
+ // `dyn Trait`, `&dyn Trait`, `Box<dyn Trait>` all name a trait object whose
6
+ // receiver-dispatch target is the trait itself (#2604) — strip the `dyn`
7
+ // keyword and any auto-trait/lifetime bound list (`dyn Trait + Send`) down to
8
+ // the principal trait name. Reference/pointer sigils are stripped by the
9
+ // caller first; wrapper unwrapping (Box<T> etc.) runs before this so the
10
+ // unwrapped inner text still gets the same treatment.
11
+ function stripDynBound(t) {
12
+ if (!DYN_PREFIX_RE.test(t))
13
+ return t;
14
+ t = t.replace(DYN_PREFIX_RE, '');
15
+ const plus = t.indexOf('+');
16
+ if (plus !== -1)
17
+ t = t.slice(0, plus);
18
+ return t.trim();
19
+ }
4
20
  // ─── interpretImport ──────────────────────────────────────────────────────
5
21
  export function interpretRustImport(captures) {
6
22
  const kind = captures['@import.kind']?.text;
@@ -104,6 +120,7 @@ export function normalizeRustTypeName(text) {
104
120
  if (inner !== null)
105
121
  t = inner;
106
122
  }
123
+ t = stripDynBound(t);
107
124
  const bracket = t.indexOf('<');
108
125
  if (bracket !== -1)
109
126
  t = t.slice(0, bracket);
@@ -168,6 +185,7 @@ function normalizeRustReturnType(text) {
168
185
  }
169
186
  }
170
187
  }
188
+ t = stripDynBound(t);
171
189
  const bracket = t.indexOf('<');
172
190
  if (bracket !== -1)
173
191
  t = t.slice(0, bracket);
@@ -1,4 +1,4 @@
1
- import { isClassLike, populateClassOwnedMembers } from '../../scope-resolution/scope/walkers.js';
1
+ import { isClassLike, populateClassOwnedMembers, tagNamespacePrefixes, } from '../../scope-resolution/scope/walkers.js';
2
2
  /**
3
3
  * Populate `ownerId` on Rust method defs.
4
4
  *
@@ -19,6 +19,16 @@ import { isClassLike, populateClassOwnedMembers } from '../../scope-resolution/s
19
19
  export function populateRustOwners(parsed) {
20
20
  populateClassOwnedMembers(parsed);
21
21
  populateRustImplOwners(parsed);
22
+ // #2730: tag defs declared inside `mod` blocks with their enclosing module
23
+ // path (`inner`, `a.b`) on the `namespacePrefix` sidecar. Rust modules are
24
+ // Namespace scopes owning a Namespace def (see the `mod_item` capture), so
25
+ // the shared C++-era pass applies unchanged. Qualified call resolution reads
26
+ // this to tell `inner::dispatch` apart from a same-named crate-root `fn`.
27
+ // Rust `qualifiedName`s never encode the enclosing module, so the shared
28
+ // "already namespaced" guard must be off: with it on, `mod a { pub fn a() }`
29
+ // matched by coincidence and the member was left looking like it belonged to
30
+ // the parent module (#2741 review).
31
+ tagNamespacePrefixes(parsed, { qualifiedNamesCarryNamespace: false });
22
32
  }
23
33
  function populateRustImplOwners(parsed) {
24
34
  // Build a map of struct name → def nodeId from all scopes.