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
@@ -15,8 +15,189 @@
15
15
  * `linkStatus: 'unresolved'`.
16
16
  */
17
17
  import { resolvePhpImportInternal } from '../../import-resolvers/php.js';
18
+ import { perFileSet } from '../../import-resolvers/per-file-set.js';
19
+ import { getWorkspaceFileIndex } from '../../import-resolvers/workspace-file-index.js';
18
20
  import { readFileSync } from 'node:fs';
19
21
  import { join } from 'node:path';
22
+ function normalizePhpPath(value) {
23
+ return value.replace(/\\/g, '/').replace(/^\.\//, '').replace(/\/+$/, '');
24
+ }
25
+ function namespaceDirectories(targetRaw, composerConfig, resolved) {
26
+ const directories = new Set();
27
+ if (resolved !== null) {
28
+ const normalizedResolved = normalizePhpPath(resolved);
29
+ const separator = normalizedResolved.lastIndexOf('/');
30
+ if (separator >= 0)
31
+ directories.add(normalizedResolved.slice(0, separator));
32
+ }
33
+ if (composerConfig === null)
34
+ return [...directories];
35
+ const normalizedTarget = normalizePhpPath(targetRaw);
36
+ const mappings = [...composerConfig.psr4.entries()].sort((left, right) => {
37
+ const lengthDifference = right[0].length - left[0].length;
38
+ return lengthDifference !== 0 ? lengthDifference : left[0].localeCompare(right[0]);
39
+ });
40
+ for (const [namespacePrefix, directoryPrefix] of mappings) {
41
+ const normalizedPrefix = normalizePhpPath(namespacePrefix);
42
+ if (normalizedTarget !== normalizedPrefix &&
43
+ !normalizedTarget.startsWith(`${normalizedPrefix}/`)) {
44
+ continue;
45
+ }
46
+ const remainder = normalizedTarget.slice(normalizedPrefix.length).replace(/^\//, '');
47
+ const separator = remainder.lastIndexOf('/');
48
+ const relativeNamespace = separator >= 0 ? remainder.slice(0, separator) : '';
49
+ directories.add(normalizePhpPath(relativeNamespace === '' ? directoryPrefix : `${directoryPrefix}/${relativeNamespace}`));
50
+ break;
51
+ }
52
+ return [...directories];
53
+ }
54
+ function parentDirectory(filePath) {
55
+ const normalizedPath = normalizePhpPath(filePath);
56
+ const separator = normalizedPath.lastIndexOf('/');
57
+ return separator < 0 ? '' : normalizedPath.slice(0, separator);
58
+ }
59
+ function directoryAliases(filePath) {
60
+ const normalizedPath = normalizePhpPath(filePath);
61
+ const separator = normalizedPath.lastIndexOf('/');
62
+ if (separator < 0)
63
+ return [''];
64
+ const parent = normalizedPath.slice(0, separator);
65
+ const aliases = new Set([parent]);
66
+ const segments = parent.split('/').filter(Boolean);
67
+ for (let index = 0; index < segments.length; index++) {
68
+ aliases.add(segments.slice(index).join('/'));
69
+ }
70
+ return [...aliases];
71
+ }
72
+ /**
73
+ * Directory alias → the files under it, built once per pass.
74
+ *
75
+ * A scope-resolution pass shares one stable `parsedFiles` array across imports,
76
+ * so the array identity is the memo key — see `perFileSet`.
77
+ */
78
+ const filesByDirectory = perFileSet((parsedFiles) => {
79
+ const mutable = new Map();
80
+ for (const parsed of parsedFiles) {
81
+ for (const directory of directoryAliases(parsed.filePath)) {
82
+ const files = mutable.get(directory) ?? [];
83
+ files.push(parsed);
84
+ mutable.set(directory, files);
85
+ }
86
+ }
87
+ return mutable;
88
+ });
89
+ /** Memoized on the `allFilePaths` Set identity, like `getWorkspaceFileIndex`. */
90
+ const getPhpWorkspaceIndex = perFileSet((allFilePaths) => {
91
+ // The Set is passed THROUGH to the shared cache, never copied — a defensive
92
+ // `new Set(...)` here or in `scope-resolver.ts` would hand both WeakMaps a
93
+ // fresh key per import and silently restore O(imports × files) (#1918 P1).
94
+ const { normalized, all, index } = getWorkspaceFileIndex(allFilePaths);
95
+ /**
96
+ * Whole-path-lowercase → the first PROPER-suffix match, the correction `get`
97
+ * applies to a whole-path hit from the shared index.
98
+ *
99
+ * DEFERRED, and deferred all the way to the branch that reads it rather than
100
+ * to the first `get`. The builder walks every slash of every path and
101
+ * lowercases a slice at each, so it is O(paths × depth) in both time and
102
+ * allocation — measured 46.0 ms at 32 000 paths on the PHP arm of
103
+ * `bench/import-target/`, filling a map that held ZERO entries, because it
104
+ * can only hold one when some file's whole path is also a proper suffix of
105
+ * another's. Most repos never produce that, and the ones that do reach this
106
+ * branch only for the imports that actually hit a whole path. Pure function
107
+ * of `normalized`/`all`, both of which the returned object already retains,
108
+ * so building it late is behaviour-identical and retains nothing new.
109
+ *
110
+ * `wholePathLower` is a scratch set of the builder, not state: nothing reads
111
+ * it afterwards, so deferring the map defers it too.
112
+ */
113
+ let firstProperSuffixMatch = null;
114
+ const getFirstProperSuffixMatch = () => {
115
+ if (firstProperSuffixMatch !== null)
116
+ return firstProperSuffixMatch;
117
+ const wholePathLower = new Set();
118
+ for (const path of normalized)
119
+ wholePathLower.add(path.toLowerCase());
120
+ // Only the suffixes that a whole path can shadow are worth storing; see the
121
+ // header. Built from `normalized`, so it costs no traversal of the Set.
122
+ const built = new Map();
123
+ for (let i = 0; i < normalized.length; i++) {
124
+ const lower = normalized[i].toLowerCase();
125
+ for (let slash = lower.indexOf('/'); slash >= 0; slash = lower.indexOf('/', slash + 1)) {
126
+ const suffix = lower.slice(slash + 1);
127
+ if (!wholePathLower.has(suffix))
128
+ continue;
129
+ if (!built.has(suffix))
130
+ built.set(suffix, all[i]);
131
+ }
132
+ }
133
+ firstProperSuffixMatch = built;
134
+ return built;
135
+ };
136
+ /**
137
+ * Raw directory → the files directly in it, for `getFilesInDir`.
138
+ *
139
+ * DEFERRED for the same reason as the shared `dirMap` (#2903), and here the
140
+ * case is stronger: `getFilesInDir` has exactly one caller,
141
+ * `import-resolvers/php.ts`'s PSR-4 function/constant fallback, and that
142
+ * caller sits inside `if (composerConfig) { … }`. `resolvePhpImportTarget`
143
+ * hard-codes `composerConfig: null`, so on the LanguageProvider path the map
144
+ * is statically unreachable; on the ScopeResolver path it is reachable only
145
+ * in a repo that has a parseable `composer.json` with `autoload.psr-4`.
146
+ * Measured 6.8 ms / 3.56 MiB at 32 000 paths, paid by every PHP repo without
147
+ * one. Pure function of `all`, which the returned object retains.
148
+ */
149
+ let filesByRawDirectory = null;
150
+ const getFilesByRawDirectory = () => {
151
+ if (filesByRawDirectory !== null)
152
+ return filesByRawDirectory;
153
+ // Raw paths, not normalized: the scan this replaces tests `f.startsWith(...)`
154
+ // against the Set's own strings, so a backslash path is a miss there and must
155
+ // stay a miss here. Insertion order is Set order, so `[0]` is the file the
156
+ // scan would have returned first.
157
+ const built = new Map();
158
+ for (const raw of all) {
159
+ const separator = raw.lastIndexOf('/');
160
+ if (separator < 0)
161
+ continue;
162
+ const directory = raw.slice(0, separator);
163
+ const bucket = built.get(directory);
164
+ if (bucket === undefined)
165
+ built.set(directory, [raw]);
166
+ else
167
+ bucket.push(raw);
168
+ }
169
+ filesByRawDirectory = built;
170
+ return built;
171
+ };
172
+ const suffixIndex = {
173
+ get: (suffix) => {
174
+ const hit = index.getInsensitive(suffix);
175
+ if (hit === undefined)
176
+ return undefined;
177
+ const lower = suffix.toLowerCase();
178
+ // A proper-suffix hit is already the scan's answer: the shared map holds
179
+ // the first file matching EITHER way, so nothing earlier matched at all.
180
+ if (hit.replace(/\\/g, '/').toLowerCase() !== lower)
181
+ return hit;
182
+ // Whole-path hit — invisible to `endsWith('/' + S)`. The scan keeps going.
183
+ // The only branch that needs the correction map, hence the only one that
184
+ // builds it.
185
+ return getFirstProperSuffixMatch().get(lower);
186
+ },
187
+ // Site 1 must stay a no-op, and `suffixResolve` folds this into `get`.
188
+ getInsensitive: () => undefined,
189
+ getFilesInDir: (dirSuffix, extension) => {
190
+ // `nsDirPrefix` is `nsDir` when it already ends in `/`, else `nsDir + '/'`
191
+ // — either way the directory is `nsDir` minus one trailing slash.
192
+ const directory = dirSuffix.endsWith('/') ? dirSuffix.slice(0, -1) : dirSuffix;
193
+ const bucket = getFilesByRawDirectory().get(directory);
194
+ if (bucket === undefined)
195
+ return [];
196
+ return bucket.filter((file) => file.endsWith(extension));
197
+ },
198
+ };
199
+ return { normalized, all, suffixIndex };
200
+ });
20
201
  // ─── loadResolutionConfig ──────────────────────────────────────────────────
21
202
  /**
22
203
  * Load and parse `composer.json` from the repo root. Returns a
@@ -74,11 +255,11 @@ export function resolvePhpImportTarget(parsedImport, workspaceIndex) {
74
255
  return null;
75
256
  if (parsedImport.targetRaw === null || parsedImport.targetRaw === '')
76
257
  return null;
258
+ // Cast, not copy: `getPhpWorkspaceIndex` memoizes on this exact Set object.
77
259
  const allFiles = ctx.allFilePaths;
78
- const normalizedFileList = [...allFiles].map((f) => f.replace(/\\/g, '/'));
79
- const allFileList = [...allFiles];
260
+ const { normalized, all, suffixIndex } = getPhpWorkspaceIndex(allFiles);
80
261
  return resolvePhpImportInternal(parsedImport.targetRaw, null, // composerConfig not available through LanguageProvider path
81
- allFiles, normalizedFileList, allFileList, undefined);
262
+ allFiles, normalized, all, suffixIndex);
82
263
  }
83
264
  /**
84
265
  * ScopeResolver-shaped adapter: `(targetRaw, fromFile, allFilePaths, resolutionConfig?) → string | null`.
@@ -87,14 +268,55 @@ export function resolvePhpImportTarget(parsedImport, workspaceIndex) {
87
268
  * (a `ComposerConfig | null` loaded once per workspace by
88
269
  * `loadPhpComposerConfig`) and threads it into `resolvePhpImportInternal`.
89
270
  */
90
- export function resolvePhpImportTargetInternal(targetRaw, _fromFile, allFilePaths, resolutionConfig) {
271
+ export function resolvePhpImportTargetInternal(targetRaw, _fromFile, allFilePaths, resolutionConfig, context) {
91
272
  if (targetRaw === '')
92
273
  return null;
93
274
  const composerConfig = resolutionConfig !== undefined && resolutionConfig !== null
94
275
  ? resolutionConfig
95
276
  : null;
277
+ // Cast, not copy: `getPhpWorkspaceIndex` memoizes on this exact Set object.
96
278
  const allFiles = allFilePaths;
97
- const normalizedFileList = [...allFiles].map((f) => f.replace(/\\/g, '/'));
98
- const allFileList = [...allFiles];
99
- return resolvePhpImportInternal(targetRaw, composerConfig, allFiles, normalizedFileList, allFileList, undefined);
279
+ const { normalized, all, suffixIndex } = getPhpWorkspaceIndex(allFiles);
280
+ const resolved = resolvePhpImportInternal(targetRaw, composerConfig, allFiles, normalized, all, suffixIndex);
281
+ const parsedImport = context?.parsedImport;
282
+ const symbolKind = parsedImport?.kind === 'named' || parsedImport?.kind === 'alias'
283
+ ? parsedImport.importedSymbolKind
284
+ : undefined;
285
+ if (context === undefined ||
286
+ parsedImport === undefined ||
287
+ (symbolKind !== 'function' && symbolKind !== 'const')) {
288
+ return resolved;
289
+ }
290
+ const importedName = targetRaw.replace(/\\/g, '/').split('/').filter(Boolean).at(-1);
291
+ if (importedName === undefined)
292
+ return resolved;
293
+ const directories = namespaceDirectories(targetRaw, composerConfig, resolved);
294
+ const directoryIndex = filesByDirectory(context.parsedFiles);
295
+ const candidateFiles = [
296
+ ...new Set(directories.flatMap((directory) => {
297
+ const files = directoryIndex.get(normalizePhpPath(directory)) ?? [];
298
+ // A suffix alias can match directories under different roots (for
299
+ // example app/Models and vendor/pkg/app/Models). Picking either root
300
+ // would be a guess, so fail closed to the composer resolution instead.
301
+ const distinctParents = new Set(files.map((file) => parentDirectory(file.filePath)));
302
+ return distinctParents.size > 1 ? [] : files;
303
+ })),
304
+ ];
305
+ const expectedType = symbolKind === 'function' ? 'Function' : 'Variable';
306
+ const declaringFiles = candidateFiles.filter((parsed) => parsed.localDefs.some((def) => {
307
+ if (def.type !== expectedType)
308
+ return false;
309
+ const simpleName = (def.qualifiedName ?? '').split(/[\\.]/).at(-1);
310
+ return simpleName === importedName;
311
+ }));
312
+ if (declaringFiles.length > 1)
313
+ return null;
314
+ if (declaringFiles.length === 1)
315
+ return declaringFiles[0].filePath;
316
+ // PHP constants are not currently emitted as local definitions. A single
317
+ // file in the namespace directory is still unambiguous; multiple files must
318
+ // fail closed rather than inheriting Set iteration order.
319
+ if (symbolKind === 'const' && candidateFiles.length === 1)
320
+ return candidateFiles[0].filePath;
321
+ return resolved;
100
322
  }
@@ -16,12 +16,18 @@ export function interpretPhpImport(captures) {
16
16
  const sourceCap = captures['@import.source'];
17
17
  const nameCap = captures['@import.name'];
18
18
  const aliasCap = captures['@import.alias'];
19
+ const symbolKindCap = captures['@import.symbol-kind'];
19
20
  const kind = kindCap?.text;
20
21
  if (kind === undefined || sourceCap === undefined)
21
22
  return null;
22
23
  const source = sourceCap.text.trim();
23
24
  if (source === '')
24
25
  return null;
26
+ const importedSymbolKind = symbolKindCap?.text === 'function' || symbolKindCap?.text === 'const'
27
+ ? symbolKindCap.text
28
+ : kind === 'function' || kind === 'const'
29
+ ? kind
30
+ : 'type';
25
31
  switch (kind) {
26
32
  case 'namespace': {
27
33
  // `use Foo\Bar;` — PHP `use` is a NAMED import (binds the class
@@ -34,6 +40,7 @@ export function interpretPhpImport(captures) {
34
40
  localName,
35
41
  importedName: localName,
36
42
  targetRaw: source,
43
+ importedSymbolKind,
37
44
  };
38
45
  }
39
46
  case 'alias': {
@@ -50,6 +57,7 @@ export function interpretPhpImport(captures) {
50
57
  importedName,
51
58
  alias,
52
59
  targetRaw: source,
60
+ importedSymbolKind,
53
61
  };
54
62
  }
55
63
  case 'function': {
@@ -61,6 +69,7 @@ export function interpretPhpImport(captures) {
61
69
  localName,
62
70
  importedName: localName,
63
71
  targetRaw: source,
72
+ importedSymbolKind,
64
73
  };
65
74
  }
66
75
  case 'const': {
@@ -71,6 +80,7 @@ export function interpretPhpImport(captures) {
71
80
  localName,
72
81
  importedName: localName,
73
82
  targetRaw: source,
83
+ importedSymbolKind,
74
84
  };
75
85
  }
76
86
  default:
@@ -84,6 +84,23 @@ const PHP_SCOPE_QUERY = `
84
84
  (function_definition
85
85
  name: (name) @declaration.name) @declaration.function
86
86
 
87
+ ;; Closure assigned to a variable: $handler = function () {...}; or fn() => ...;
88
+ ;; Anchor discipline (same contract as javascript/query.ts): @declaration.function
89
+ ;; sits on the INNER anonymous_function / arrow_function, NOT on the
90
+ ;; assignment_expression wrapper. That aligns anchor.range with the
91
+ ;; @scope.function range above, so pass2AttachDeclarations attaches the
92
+ ;; declaration to the CLOSURE's own scope rather than the enclosing function's.
93
+ ;; Without this the closure scope owns no callable def and
94
+ ;; pickCallerCallableDef falls through to the enclosing callable, making the
95
+ ;; closure a call TARGET but never a call SOURCE (#2699).
96
+ (assignment_expression
97
+ left: (variable_name) @declaration.name
98
+ right: (anonymous_function) @declaration.function)
99
+
100
+ (assignment_expression
101
+ left: (variable_name) @declaration.name
102
+ right: (arrow_function) @declaration.function)
103
+
87
104
  ;; ── Declarations — properties ─────────────────────────────────────────────
88
105
 
89
106
  ;; PHP 7.4+ typed property: private UserRepo $repo;
@@ -104,6 +121,20 @@ const PHP_SCOPE_QUERY = `
104
121
  (property_element
105
122
  name: (variable_name) @declaration.name)) @declaration.variable
106
123
 
124
+ ;; ── Declarations — closure bindings (#2693) ───────────────────────────────
125
+ ;; A dollar-name bound to a closure (fn(x) => x, or function(x){...}) IS a
126
+ ;; callable. PHP emitted the callable-flow seed and invoke for it already, but
127
+ ;; nothing DECLARED the name, so the flow pass had no SymbolDefinition to attach
128
+ ;; the seed to and the call stayed unresolved.
129
+ ;; Restricted to a closure value: declaring every PHP assignment would mint defs
130
+ ;; repo-wide for no resolution benefit.
131
+ (assignment_expression
132
+ left: (variable_name (name) @declaration.name)
133
+ right: (arrow_function)) @declaration.variable
134
+ (assignment_expression
135
+ left: (variable_name (name) @declaration.name)
136
+ right: (anonymous_function)) @declaration.variable
137
+
107
138
  ;; ── Imports — namespace_use_declaration ───────────────────────────────────
108
139
  ;;
109
140
  ;; Captures ALL forms: plain, alias, function/const qualifiers, and grouped.
@@ -308,7 +308,7 @@ const phpScopeResolver = {
308
308
  language: SupportedLanguages.PHP,
309
309
  languageProvider: phpProvider,
310
310
  importEdgeReason: 'php-scope: use',
311
- resolveImportTarget: (targetRaw, fromFile, allFilePaths, resolutionConfig) => resolvePhpImportTargetInternal(targetRaw, fromFile, allFilePaths, resolutionConfig),
311
+ resolveImportTarget: (targetRaw, fromFile, allFilePaths, resolutionConfig, context) => resolvePhpImportTargetInternal(targetRaw, fromFile, allFilePaths, resolutionConfig, context),
312
312
  loadResolutionConfig: (repoPath) => loadPhpComposerConfig(repoPath),
313
313
  // PHP LEGB-like precedence: local > import/namespace/reexport > wildcard.
314
314
  // The per-scope id is unused by phpMergeBindings (tier ordering computed
@@ -19,6 +19,7 @@ interface PythonArityMetadata {
19
19
  readonly parameterCount: number | undefined;
20
20
  readonly requiredParameterCount: number | undefined;
21
21
  readonly parameterTypes: readonly string[] | undefined;
22
+ readonly parameterNames: readonly string[];
22
23
  }
23
24
  export declare function computePythonArityMetadata(fnNode: SyntaxNode): PythonArityMetadata;
24
25
  export {};
@@ -41,5 +41,6 @@ export function computePythonArityMetadata(fnNode) {
41
41
  parameterCount,
42
42
  requiredParameterCount,
43
43
  parameterTypes: types.length > 0 ? types : undefined,
44
+ parameterNames: params.map((parameter) => parameter.name),
44
45
  };
45
46
  }
@@ -8,10 +8,9 @@
8
8
  * 1. **Per-name import statements** — `import a, b` and
9
9
  * `from m import x, y` decompose to one match per imported name
10
10
  * (see `import-decomposer.ts`).
11
- * 2. **Receiver type bindings** — each `function_definition` inside a
12
- * class body emits a `@type-binding.self` (or `@type-binding.cls`
13
- * for `@classmethod`) capture so Pass-4 attaches the implicit
14
- * receiver (see `receiver-binding.ts`).
11
+ * 2. **Receiver type bindings** — methods emit an implicit `self` / `cls`
12
+ * binding, and `__init__` assignments from annotated parameters emit
13
+ * class-scoped instance-field bindings (see `receiver-binding.ts`).
15
14
  *
16
15
  * Pure given the input source text. No I/O, no globals consulted.
17
16
  */
@@ -8,23 +8,41 @@
8
8
  * 1. **Per-name import statements** — `import a, b` and
9
9
  * `from m import x, y` decompose to one match per imported name
10
10
  * (see `import-decomposer.ts`).
11
- * 2. **Receiver type bindings** — each `function_definition` inside a
12
- * class body emits a `@type-binding.self` (or `@type-binding.cls`
13
- * for `@classmethod`) capture so Pass-4 attaches the implicit
14
- * receiver (see `receiver-binding.ts`).
11
+ * 2. **Receiver type bindings** — methods emit an implicit `self` / `cls`
12
+ * binding, and `__init__` assignments from annotated parameters emit
13
+ * class-scoped instance-field bindings (see `receiver-binding.ts`).
15
14
  *
16
15
  * Pure given the input source text. No I/O, no globals consulted.
17
16
  */
18
17
  import { nodeToCapture, syntheticCapture, walkNamedTree, } from '../../utils/ast-helpers.js';
19
18
  import { splitImportStatement } from './import-decomposer.js';
20
19
  import { getPythonParser, getPythonScopeQuery } from './query.js';
21
- import { synthesizeReceiverTypeBinding } from './receiver-binding.js';
20
+ import { synthesizeConstructorFieldTypeBindings, synthesizeReceiverTypeBinding, } from './receiver-binding.js';
22
21
  import { synthesizeDependsReferences } from './depends-references.js';
23
22
  import { computePythonArityMetadata } from './arity-metadata.js';
24
23
  import { recordCacheHit, recordCacheMiss } from './cache-stats.js';
25
24
  import { getTreeSitterBufferSize } from '../../constants.js';
26
25
  import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
27
26
  import { pythonFunctionDefinitionLabel } from './simple-hooks.js';
27
+ import { synthesizeCallableFlowCaptures } from '../../utils/callable-flow-captures.js';
28
+ import { synthesizeReceiverChainCapture } from '../../utils/receiver-chain-captures.js';
29
+ const PYTHON_CALLABLE_CAPTURE_OPTIONS = {
30
+ functionNodeTypes: new Set(['function_definition', 'lambda']),
31
+ callNodeTypes: new Set(['call']),
32
+ parameterListNodeTypes: new Set(['parameters', 'argument_list']),
33
+ parameterNodeTypes: new Set([
34
+ 'identifier',
35
+ 'default_parameter',
36
+ 'typed_parameter',
37
+ 'typed_default_parameter',
38
+ 'list_splat_pattern',
39
+ 'dictionary_splat_pattern',
40
+ ]),
41
+ bindingNodeTypes: new Set(['assignment', 'named_expression']),
42
+ assignmentNodeTypes: new Set(['assignment', 'named_expression']),
43
+ identifierNodeTypes: new Set(['identifier']),
44
+ functionScopedValueBindings: true,
45
+ };
28
46
  export function emitPythonScopeCaptures(sourceText, _filePath, cachedTree) {
29
47
  // Skip the parse when the caller (the scope-resolution orchestrator's
30
48
  // `treeCache`) already produced a Tree for this source — empty under
@@ -89,11 +107,23 @@ export function emitPythonScopeCaptures(sourceText, _filePath, cachedTree) {
89
107
  }
90
108
  else {
91
109
  // Defensive fallback: emit the raw match.
110
+ // Structural receiver chain for a call whose receiver is itself an
111
+ // expression, so resolution can type it by folding over structure
112
+ // instead of re-parsing the receiver's source text. Self-gating: a
113
+ // non-call match, an absent receiver, or a chain with no nameable base
114
+ // all leave `grouped` untouched.
115
+ synthesizeReceiverChainCapture(grouped, nodeMap['@reference.receiver']);
92
116
  out.push(grouped);
93
117
  }
94
118
  continue;
95
119
  }
96
120
  if (grouped['@scope.function'] !== undefined) {
121
+ // Structural receiver chain for a call whose receiver is itself an
122
+ // expression, so resolution can type it by folding over structure
123
+ // instead of re-parsing the receiver's source text. Self-gating: a
124
+ // non-call match, an absent receiver, or a chain with no nameable base
125
+ // all leave `grouped` untouched.
126
+ synthesizeReceiverChainCapture(grouped, nodeMap['@reference.receiver']);
97
127
  out.push(grouped);
98
128
  // `@scope.function` is captured directly on the `function_definition`
99
129
  // node (query: `(function_definition) @scope.function`), so it IS the
@@ -101,9 +131,14 @@ export function emitPythonScopeCaptures(sourceText, _filePath, cachedTree) {
101
131
  const scopeNode = nodeMap['@scope.function'];
102
132
  const fnNode = scopeNode.type === 'function_definition' ? scopeNode : null;
103
133
  if (fnNode !== null) {
134
+ const parameterNames = computePythonArityMetadata(fnNode).parameterNames;
135
+ if (parameterNames.length > 0) {
136
+ grouped['@scope.lexical-names'] = syntheticCapture('@scope.lexical-names', fnNode, JSON.stringify(parameterNames));
137
+ }
104
138
  const synth = synthesizeReceiverTypeBinding(fnNode);
105
139
  if (synth !== null)
106
140
  out.push(synth);
141
+ out.push(...synthesizeConstructorFieldTypeBindings(fnNode));
107
142
  for (const depRef of synthesizeDependsReferences(fnNode))
108
143
  out.push(depRef);
109
144
  }
@@ -139,12 +174,25 @@ export function emitPythonScopeCaptures(sourceText, _filePath, cachedTree) {
139
174
  grouped['@declaration.parameter-types'] = syntheticCapture('@declaration.parameter-types', fnNode, JSON.stringify(arity.parameterTypes));
140
175
  }
141
176
  }
177
+ // Structural receiver chain for a call whose receiver is itself an
178
+ // expression, so resolution can type it by folding over structure
179
+ // instead of re-parsing the receiver's source text. Self-gating: a
180
+ // non-call match, an absent receiver, or a chain with no nameable base
181
+ // all leave `grouped` untouched.
182
+ synthesizeReceiverChainCapture(grouped, nodeMap['@reference.receiver']);
142
183
  out.push(grouped);
143
184
  continue;
144
185
  }
186
+ // Structural receiver chain for a call whose receiver is itself an
187
+ // expression, so resolution can type it by folding over structure
188
+ // instead of re-parsing the receiver's source text. Self-gating: a
189
+ // non-call match, an absent receiver, or a chain with no nameable base
190
+ // all leave `grouped` untouched.
191
+ synthesizeReceiverChainCapture(grouped, nodeMap['@reference.receiver']);
145
192
  out.push(grouped);
146
193
  }
147
194
  out.push(...synthesizePythonInheritanceReferences(tree.rootNode));
195
+ out.push(...synthesizeCallableFlowCaptures(tree.rootNode, PYTHON_CALLABLE_CAPTURE_OPTIONS));
148
196
  return out;
149
197
  }
150
198
  /**
@@ -10,7 +10,18 @@
10
10
  * carry everything `interpretPythonImport` needs to recover the original
11
11
  * `ParsedImport` shape — see `interpret.ts`.
12
12
  */
13
- import { findChild, nodeToCapture, syntheticCapture, } from '../../utils/ast-helpers.js';
13
+ import { findAncestorBeforeBoundary, findChild, nodeToCapture, syntheticCapture, } from '../../utils/ast-helpers.js';
14
+ /**
15
+ * The only two constructs that stop a module-level `from m import x` from
16
+ * publishing `x` as `<module>.x`. Python has no block scope, so an import
17
+ * under `if` / `try` / `for` / `with` still publishes when its branch runs —
18
+ * verified against CPython 3.11; only `def` and `class` bodies suppress it.
19
+ */
20
+ const PUBLICATION_SUPPRESSING_ANCESTORS = new Set([
21
+ 'function_definition',
22
+ 'class_definition',
23
+ ]);
24
+ const NO_BOUNDARY = new Set();
14
25
  export function splitImportStatement(stmtNode) {
15
26
  if (stmtNode.type === 'import_statement')
16
27
  return splitImportStmt(stmtNode);
@@ -54,6 +65,8 @@ function splitImportFromStmt(stmtNode) {
54
65
  const out = [];
55
66
  const moduleField = stmtNode.childForFieldName('module_name');
56
67
  const moduleText = moduleField?.text ?? '';
68
+ // Once per statement, not once per name.
69
+ const publishesToModule = findAncestorBeforeBoundary(stmtNode, PUBLICATION_SUPPRESSING_ANCESTORS, NO_BOUNDARY) === null;
57
70
  // Wildcard? tree-sitter-python represents `*` as a `wildcard_import`
58
71
  // child and emits no name children.
59
72
  const wildcardChild = findChild(stmtNode, 'wildcard_import');
@@ -79,6 +92,7 @@ function splitImportFromStmt(stmtNode) {
79
92
  source: moduleText,
80
93
  name: child.text,
81
94
  atNode: child,
95
+ publishesToModule,
82
96
  }));
83
97
  }
84
98
  else if (child.type === 'aliased_import') {
@@ -91,6 +105,7 @@ function splitImportFromStmt(stmtNode) {
91
105
  name: dotted.text,
92
106
  alias: alias.text,
93
107
  atNode: child,
108
+ publishesToModule,
94
109
  }));
95
110
  }
96
111
  }
@@ -108,5 +123,11 @@ function buildImportMatch(stmtNode, spec) {
108
123
  if (spec.alias !== undefined) {
109
124
  m['@import.alias'] = syntheticCapture('@import.alias', spec.atNode, spec.alias);
110
125
  }
126
+ // Anchored at `spec.atNode`, never `stmtNode`: `anchorCaptureFor` picks the
127
+ // broadest span with a strict `>`, so a statement-wide span here would tie
128
+ // with `@import.statement` and let key order decide the anchor.
129
+ if (spec.publishesToModule === true) {
130
+ m['@import.publishes'] = syntheticCapture('@import.publishes', spec.atNode, 'module');
131
+ }
111
132
  return m;
112
133
  }
@@ -9,12 +9,53 @@
9
9
  * Returning `null` lets the finalize algorithm mark the edge as
10
10
  * `linkStatus: 'unresolved'`.
11
11
  */
12
- import type { ParsedImport, WorkspaceIndex } from '../../../../_shared/index.js';
12
+ import type { ParsedFile, ParsedImport, WorkspaceIndex } from '../../../../_shared/index.js';
13
13
  export interface PythonResolveContext {
14
14
  readonly fromFile: string;
15
15
  /** `ReadonlySet` so the orchestrator's stable run-level set flows straight
16
16
  * through to `getPythonFileIndex`'s `WeakMap` key (built once per run, not
17
17
  * copied per import). The whole resolver chain only reads the set. */
18
18
  readonly allFilePaths: ReadonlySet<string>;
19
+ /** Optional parsed workspace used to preserve a package's explicit export
20
+ * when it collides with a same-named concrete submodule. */
21
+ readonly parsedFiles?: readonly ParsedFile[];
19
22
  }
20
23
  export declare function resolvePythonImportTarget(parsedImport: ParsedImport, workspaceIndex: WorkspaceIndex): string | null;
24
+ /**
25
+ * A named Python import is a namespace handle only when its resolved file is
26
+ * the concrete submodule formed by appending the imported name. This keeps
27
+ * ordinary symbol imports on the named-binding path.
28
+ */
29
+ export declare function isPythonImportedModule(parsedImport: ParsedImport, targetFile: string, fromFile: string): boolean;
30
+ /**
31
+ * The receiver spellings `import a.b.c` makes callable, and the file each one
32
+ * names (#2826).
33
+ *
34
+ * `import a.b.c` binds ONE name — `a` — but makes three attribute paths
35
+ * reachable, and they name three different files:
36
+ *
37
+ * a → a/__init__.py
38
+ * a.b → a/b/__init__.py
39
+ * a.b.c → a/b/c.py (the edge's own target)
40
+ *
41
+ * The shared default keyed `a` to the LEAF, which is wrong in both directions:
42
+ * `a.helper()` resolved into `a/b/c.py` whenever that module happened to export
43
+ * `helper`, and `a.b.mid()` resolved to nothing.
44
+ *
45
+ * Returns `undefined` — meaning "use the shared default" — for every spelling
46
+ * where the bound name is not the path's root:
47
+ * - `import single` — no dotted path to expand;
48
+ * - `import a.b as x` — binds only `x`; writing `a.b.f()` there is a
49
+ * NameError, so `a.b` must NOT become a key;
50
+ * - `from pkg import db` — reclassified to a namespace edge whose
51
+ * importPath is the bare name `db`.
52
+ *
53
+ * Prefix files are proposed, not asserted: `moduleFileExists` drops any that
54
+ * the workspace did not parse, so a PEP-420 namespace package (no
55
+ * `__init__.py`) contributes no key rather than one pointing at a missing file.
56
+ */
57
+ export declare function pythonNamespaceReceiverPaths(edge: {
58
+ readonly localName: string;
59
+ readonly importPath: string;
60
+ readonly targetFile: string;
61
+ }, moduleFileExists: (filePath: string) => boolean): readonly (readonly [string, string])[] | undefined;