gitnexus 1.6.10-rc.99 → 1.6.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (775) hide show
  1. package/README.md +177 -18
  2. package/dist/_shared/graph/types.d.ts +21 -2
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/index.d.ts +3 -3
  5. package/dist/_shared/index.d.ts.map +1 -1
  6. package/dist/_shared/index.js +1 -1
  7. package/dist/_shared/index.js.map +1 -1
  8. package/dist/_shared/integrations/circuit-breaker.d.ts.map +1 -1
  9. package/dist/_shared/integrations/circuit-breaker.js.map +1 -1
  10. package/dist/_shared/integrations/resilient-fetch.d.ts +16 -0
  11. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  12. package/dist/_shared/integrations/resilient-fetch.js +19 -7
  13. package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
  14. package/dist/_shared/language-detection.d.ts.map +1 -1
  15. package/dist/_shared/lbug/schema-constants.d.ts +2 -2
  16. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  17. package/dist/_shared/lbug/schema-constants.js +3 -0
  18. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  19. package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
  20. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +5 -0
  21. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
  22. package/dist/_shared/scope-resolution/finalize-algorithm.js +315 -36
  23. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  24. package/dist/_shared/scope-resolution/reference-site.d.ts +115 -0
  25. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  26. package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
  27. package/dist/_shared/scope-resolution/registries/lookup-core.d.ts.map +1 -1
  28. package/dist/_shared/scope-resolution/registries/lookup-core.js +58 -2
  29. package/dist/_shared/scope-resolution/registries/lookup-core.js.map +1 -1
  30. package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
  31. package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
  32. package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
  33. package/dist/_shared/scope-resolution/symbol-definition.d.ts +47 -0
  34. package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
  35. package/dist/_shared/scope-resolution/types.d.ts +278 -3
  36. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  37. package/dist/cli/ai-context.d.ts +3 -2
  38. package/dist/cli/ai-context.js +71 -16
  39. package/dist/cli/analyze-config.d.ts +1 -1
  40. package/dist/cli/analyze-options.d.ts +131 -0
  41. package/dist/cli/analyze-options.js +1 -0
  42. package/dist/cli/analyze.d.ts +21 -113
  43. package/dist/cli/analyze.js +172 -29
  44. package/dist/cli/cli-message.d.ts +1 -1
  45. package/dist/cli/detect-changes-format.js +19 -2
  46. package/dist/cli/doctor.d.ts +12 -0
  47. package/dist/cli/doctor.js +32 -5
  48. package/dist/cli/editor-targets.js +6 -0
  49. package/dist/cli/eval-server.js +2 -1
  50. package/dist/cli/format-symbol.d.ts +15 -0
  51. package/dist/cli/format-symbol.js +17 -0
  52. package/dist/cli/generated-skill.d.ts +17 -0
  53. package/dist/cli/generated-skill.js +1 -0
  54. package/dist/cli/group.js +229 -21
  55. package/dist/cli/help-i18n.js +1 -2
  56. package/dist/cli/i18n/en.d.ts +11 -9
  57. package/dist/cli/i18n/en.js +13 -9
  58. package/dist/cli/i18n/resources.d.ts +15 -11
  59. package/dist/cli/i18n/zh-CN.d.ts +4 -2
  60. package/dist/cli/i18n/zh-CN.js +11 -9
  61. package/dist/cli/index.js +8 -4
  62. package/dist/cli/resolve-invocation.d.ts +7 -3
  63. package/dist/cli/resolve-invocation.js +7 -3
  64. package/dist/cli/setup.js +4 -3
  65. package/dist/cli/skill-gen.d.ts +1 -6
  66. package/dist/cli/tool.d.ts +1 -0
  67. package/dist/cli/tool.js +74 -17
  68. package/dist/cli/wiki.js +53 -10
  69. package/dist/config/ignore-service.d.ts +2 -0
  70. package/dist/config/ignore-service.js +54 -13
  71. package/dist/core/analyzer-identity.d.ts +80 -0
  72. package/dist/core/analyzer-identity.js +364 -26
  73. package/dist/core/augmentation/engine.js +86 -71
  74. package/dist/core/embedding-checkpoint.d.ts +143 -0
  75. package/dist/core/embedding-checkpoint.js +221 -0
  76. package/dist/core/embedding-count.d.ts +61 -0
  77. package/dist/core/embedding-count.js +69 -0
  78. package/dist/core/embeddings/ast-utils.js +9 -1
  79. package/dist/core/embeddings/embedding-pipeline.d.ts +8 -0
  80. package/dist/core/embeddings/embedding-pipeline.js +253 -14
  81. package/dist/core/embeddings/http-client.d.ts +5 -0
  82. package/dist/core/embeddings/http-client.js +142 -27
  83. package/dist/core/graph/graph.js +3 -0
  84. package/dist/core/graph/import-cycles.d.ts +194 -3
  85. package/dist/core/graph/import-cycles.js +522 -73
  86. package/dist/core/graph/types.d.ts +18 -0
  87. package/dist/core/group/bridge-db.d.ts +204 -1
  88. package/dist/core/group/bridge-db.js +401 -28
  89. package/dist/core/group/completeness.d.ts +130 -0
  90. package/dist/core/group/completeness.js +83 -0
  91. package/dist/core/group/config-parser.js +0 -5
  92. package/dist/core/group/cross-impact.d.ts +46 -1
  93. package/dist/core/group/cross-impact.js +220 -19
  94. package/dist/core/group/cross-trace.d.ts +32 -11
  95. package/dist/core/group/cross-trace.js +114 -20
  96. package/dist/core/group/extractors/http-patterns/java.js +278 -22
  97. package/dist/core/group/extractors/http-patterns/node.js +332 -216
  98. package/dist/core/group/extractors/http-patterns/types.d.ts +8 -0
  99. package/dist/core/group/extractors/http-route-extractor.d.ts +1 -0
  100. package/dist/core/group/extractors/http-route-extractor.js +122 -48
  101. package/dist/core/group/extractors/include-extractor.js +20 -2
  102. package/dist/core/group/extractors/manifest-extractor.d.ts +1 -1
  103. package/dist/core/group/extractors/manifest-extractor.js +7 -7
  104. package/dist/core/group/extractors/python-workspace-extractor.js +5 -2
  105. package/dist/core/group/group-lock.d.ts +31 -0
  106. package/dist/core/group/group-lock.js +166 -0
  107. package/dist/core/group/service.js +297 -16
  108. package/dist/core/group/storage.d.ts +3 -0
  109. package/dist/core/group/storage.js +7 -39
  110. package/dist/core/group/sync.d.ts +49 -3
  111. package/dist/core/group/sync.js +0 -0
  112. package/dist/core/group/types.d.ts +183 -8
  113. package/dist/core/group/types.js +28 -1
  114. package/dist/core/incremental/subgraph-extract.d.ts +9 -6
  115. package/dist/core/incremental/subgraph-extract.js +33 -10
  116. package/dist/core/index-freshness.d.ts +77 -2
  117. package/dist/core/index-freshness.js +109 -2
  118. package/dist/core/ingestion/call-processor.d.ts +13 -1
  119. package/dist/core/ingestion/call-processor.js +110 -3
  120. package/dist/core/ingestion/cfg/callee-cell-format.d.ts +42 -0
  121. package/dist/core/ingestion/cfg/callee-cell-format.js +42 -0
  122. package/dist/core/ingestion/cfg/emit.d.ts +8 -23
  123. package/dist/core/ingestion/cfg/emit.js +9 -23
  124. package/dist/core/ingestion/class-extractors/configs/go.js +10 -5
  125. package/dist/core/ingestion/cluster-enricher.js +8 -4
  126. package/dist/core/ingestion/community-processor.d.ts +21 -3
  127. package/dist/core/ingestion/community-processor.js +81 -82
  128. package/dist/core/ingestion/di-extractors/index.d.ts +9 -33
  129. package/dist/core/ingestion/di-extractors/spring.d.ts +1 -1
  130. package/dist/core/ingestion/di-extractors/spring.js +8 -1
  131. package/dist/core/ingestion/di-extractors/types.d.ts +60 -0
  132. package/dist/core/ingestion/di-extractors/types.js +15 -0
  133. package/dist/core/ingestion/filesystem-walker.js +30 -14
  134. package/dist/core/ingestion/finalize-orchestrator.js +1 -0
  135. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +6 -0
  136. package/dist/core/ingestion/frameworks/spring/analysis-features.js +35 -1
  137. package/dist/core/ingestion/frameworks/spring/annotation-arguments.d.ts +13 -0
  138. package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +227 -0
  139. package/dist/core/ingestion/frameworks/spring/aop-candidates.d.ts +15 -0
  140. package/dist/core/ingestion/frameworks/spring/aop-candidates.js +85 -0
  141. package/dist/core/ingestion/frameworks/spring/aop.d.ts +118 -0
  142. package/dist/core/ingestion/frameworks/spring/aop.js +476 -0
  143. package/dist/core/ingestion/frameworks/spring/auto-configuration.d.ts +8 -0
  144. package/dist/core/ingestion/frameworks/spring/auto-configuration.js +16 -0
  145. package/dist/core/ingestion/frameworks/spring/bean-catalog.js +1 -0
  146. package/dist/core/ingestion/frameworks/spring/bean-factories.d.ts +33 -0
  147. package/dist/core/ingestion/frameworks/spring/bean-factories.js +65 -0
  148. package/dist/core/ingestion/frameworks/spring/conditionals.d.ts +25 -0
  149. package/dist/core/ingestion/frameworks/spring/conditionals.js +319 -0
  150. package/dist/core/ingestion/frameworks/spring/di-metadata.d.ts +3 -0
  151. package/dist/core/ingestion/frameworks/spring/di-metadata.js +162 -13
  152. package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +28 -0
  153. package/dist/core/ingestion/frameworks/spring/non-http-handlers.js +152 -0
  154. package/dist/core/ingestion/frameworks/spring/resource-injection.d.ts +5 -0
  155. package/dist/core/ingestion/frameworks/spring/resource-injection.js +91 -0
  156. package/dist/core/ingestion/import-resolvers/configs/csharp.js +5 -1
  157. package/dist/core/ingestion/import-resolvers/configs/swift.js +13 -0
  158. package/dist/core/ingestion/import-resolvers/csharp.d.ts +9 -1
  159. package/dist/core/ingestion/import-resolvers/csharp.js +234 -27
  160. package/dist/core/ingestion/import-resolvers/go.d.ts +11 -1
  161. package/dist/core/ingestion/import-resolvers/go.js +44 -17
  162. package/dist/core/ingestion/import-resolvers/jvm.d.ts +2 -2
  163. package/dist/core/ingestion/import-resolvers/node-workspace-packages.d.ts +90 -0
  164. package/dist/core/ingestion/import-resolvers/node-workspace-packages.js +429 -0
  165. package/dist/core/ingestion/import-resolvers/package-dir-index.d.ts +124 -0
  166. package/dist/core/ingestion/import-resolvers/package-dir-index.js +223 -0
  167. package/dist/core/ingestion/import-resolvers/pass-cache.d.ts +50 -0
  168. package/dist/core/ingestion/import-resolvers/pass-cache.js +60 -0
  169. package/dist/core/ingestion/import-resolvers/per-file-set.d.ts +71 -0
  170. package/dist/core/ingestion/import-resolvers/per-file-set.js +11 -0
  171. package/dist/core/ingestion/import-resolvers/php.d.ts +1 -1
  172. package/dist/core/ingestion/import-resolvers/php.js +65 -19
  173. package/dist/core/ingestion/import-resolvers/python-file-index.d.ts +201 -0
  174. package/dist/core/ingestion/import-resolvers/python-file-index.js +302 -0
  175. package/dist/core/ingestion/import-resolvers/python.js +25 -6
  176. package/dist/core/ingestion/import-resolvers/ruby.d.ts +1 -1
  177. package/dist/core/ingestion/import-resolvers/rust.d.ts +2 -2
  178. package/dist/core/ingestion/import-resolvers/standard.d.ts +1 -1
  179. package/dist/core/ingestion/import-resolvers/types.d.ts +1 -12
  180. package/dist/core/ingestion/import-resolvers/utils.d.ts +65 -6
  181. package/dist/core/ingestion/import-resolvers/utils.js +215 -36
  182. package/dist/core/ingestion/import-resolvers/workspace-file-index.d.ts +72 -0
  183. package/dist/core/ingestion/import-resolvers/workspace-file-index.js +58 -0
  184. package/dist/core/ingestion/language-config.d.ts +29 -1
  185. package/dist/core/ingestion/language-config.js +110 -35
  186. package/dist/core/ingestion/language-provider.d.ts +209 -7
  187. package/dist/core/ingestion/language-provider.js +37 -0
  188. package/dist/core/ingestion/languages/c/captures.js +7 -0
  189. package/dist/core/ingestion/languages/c/import-target.js +12 -16
  190. package/dist/core/ingestion/languages/c/scope-resolver.js +20 -19
  191. package/dist/core/ingestion/languages/c/static-linkage.js +12 -16
  192. package/dist/core/ingestion/languages/c-cpp.js +13 -0
  193. package/dist/core/ingestion/languages/cobol/scope-resolver.js +27 -20
  194. package/dist/core/ingestion/languages/cobol.js +13 -0
  195. package/dist/core/ingestion/languages/cpp/adl.d.ts +2 -2
  196. package/dist/core/ingestion/languages/cpp/adl.js +67 -44
  197. package/dist/core/ingestion/languages/cpp/captures.js +14 -2
  198. package/dist/core/ingestion/languages/cpp/file-local-linkage.js +11 -15
  199. package/dist/core/ingestion/languages/cpp/inline-namespaces.d.ts +28 -8
  200. package/dist/core/ingestion/languages/cpp/inline-namespaces.js +242 -68
  201. package/dist/core/ingestion/languages/cpp/interpret.d.ts +2 -0
  202. package/dist/core/ingestion/languages/cpp/interpret.js +126 -6
  203. package/dist/core/ingestion/languages/cpp/query.js +106 -0
  204. package/dist/core/ingestion/languages/cpp/scope-resolver.js +48 -20
  205. package/dist/core/ingestion/languages/csharp/accessor-unwrap.d.ts +2 -15
  206. package/dist/core/ingestion/languages/csharp/accessor-unwrap.js +18 -10
  207. package/dist/core/ingestion/languages/csharp/captures.js +19 -0
  208. package/dist/core/ingestion/languages/csharp/import-target.js +46 -72
  209. package/dist/core/ingestion/languages/csharp/namespace-siblings.js +5 -1
  210. package/dist/core/ingestion/languages/csharp/query.js +25 -5
  211. package/dist/core/ingestion/languages/csharp/scope-resolver.js +75 -2
  212. package/dist/core/ingestion/languages/dart/captures.d.ts +10 -0
  213. package/dist/core/ingestion/languages/dart/captures.js +598 -16
  214. package/dist/core/ingestion/languages/dart/import-target.js +32 -9
  215. package/dist/core/ingestion/languages/dart/index.d.ts +1 -1
  216. package/dist/core/ingestion/languages/dart/index.js +1 -1
  217. package/dist/core/ingestion/languages/dart/query.js +98 -1
  218. package/dist/core/ingestion/languages/dart/scope-resolver.js +14 -3
  219. package/dist/core/ingestion/languages/dart/simple-hooks.js +9 -0
  220. package/dist/core/ingestion/languages/dart.js +6 -1
  221. package/dist/core/ingestion/languages/go/captures.js +108 -3
  222. package/dist/core/ingestion/languages/go/generic-type-parameters.d.ts +31 -0
  223. package/dist/core/ingestion/languages/go/generic-type-parameters.js +140 -0
  224. package/dist/core/ingestion/languages/go/import-target.d.ts +3 -10
  225. package/dist/core/ingestion/languages/go/import-target.js +34 -30
  226. package/dist/core/ingestion/languages/go/index.d.ts +1 -1
  227. package/dist/core/ingestion/languages/go/interface-impls.d.ts +9 -1
  228. package/dist/core/ingestion/languages/go/interface-impls.js +693 -87
  229. package/dist/core/ingestion/languages/go/interpret.d.ts +2 -0
  230. package/dist/core/ingestion/languages/go/interpret.js +22 -8
  231. package/dist/core/ingestion/languages/go/method-owners.js +31 -12
  232. package/dist/core/ingestion/languages/go/package-clause.d.ts +46 -0
  233. package/dist/core/ingestion/languages/go/package-clause.js +75 -0
  234. package/dist/core/ingestion/languages/go/package-siblings.js +7 -11
  235. package/dist/core/ingestion/languages/go/query.js +56 -3
  236. package/dist/core/ingestion/languages/go/scope-resolver.js +39 -0
  237. package/dist/core/ingestion/languages/go.js +9 -0
  238. package/dist/core/ingestion/languages/java/analysis-features.d.ts +4 -0
  239. package/dist/core/ingestion/languages/java/analysis-features.js +12 -0
  240. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +12 -0
  241. package/dist/core/ingestion/languages/java/capture-side-channel.js +48 -0
  242. package/dist/core/ingestion/languages/java/captures.js +77 -32
  243. package/dist/core/ingestion/languages/java/import-target.d.ts +49 -9
  244. package/dist/core/ingestion/languages/java/import-target.js +68 -88
  245. package/dist/core/ingestion/languages/java/interpret.js +3 -2
  246. package/dist/core/ingestion/languages/java/module-resolution.d.ts +62 -0
  247. package/dist/core/ingestion/languages/java/module-resolution.js +142 -0
  248. package/dist/core/ingestion/languages/java/query.js +15 -3
  249. package/dist/core/ingestion/languages/java/record-components.d.ts +14 -0
  250. package/dist/core/ingestion/languages/java/record-components.js +185 -0
  251. package/dist/core/ingestion/languages/java/scope-resolver.js +10 -2
  252. package/dist/core/ingestion/languages/java/spring-aop.d.ts +12 -0
  253. package/dist/core/ingestion/languages/java/spring-aop.js +49 -0
  254. package/dist/core/ingestion/languages/java/spring-conditionals.d.ts +11 -0
  255. package/dist/core/ingestion/languages/java/spring-conditionals.js +48 -0
  256. package/dist/core/ingestion/languages/java/spring-di.d.ts +4 -1
  257. package/dist/core/ingestion/languages/java/spring-di.js +41 -9
  258. package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +7 -0
  259. package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +32 -0
  260. package/dist/core/ingestion/languages/java.js +94 -3
  261. package/dist/core/ingestion/languages/javascript/captures.d.ts +6 -1
  262. package/dist/core/ingestion/languages/javascript/captures.js +262 -4
  263. package/dist/core/ingestion/languages/javascript/import-target.d.ts +17 -21
  264. package/dist/core/ingestion/languages/javascript/import-target.js +24 -41
  265. package/dist/core/ingestion/languages/javascript/index.d.ts +54 -5
  266. package/dist/core/ingestion/languages/javascript/index.js +54 -5
  267. package/dist/core/ingestion/languages/javascript/query.d.ts +1 -0
  268. package/dist/core/ingestion/languages/javascript/query.js +211 -5
  269. package/dist/core/ingestion/languages/javascript/scope-resolver.js +12 -0
  270. package/dist/core/ingestion/languages/javascript/simple-hooks.js +2 -1
  271. package/dist/core/ingestion/languages/jvm/package-siblings.js +77 -9
  272. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
  273. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +48 -0
  274. package/dist/core/ingestion/languages/kotlin/captures.js +43 -1
  275. package/dist/core/ingestion/languages/kotlin/import-target.d.ts +8 -1
  276. package/dist/core/ingestion/languages/kotlin/import-target.js +20 -123
  277. package/dist/core/ingestion/languages/kotlin/index.d.ts +1 -0
  278. package/dist/core/ingestion/languages/kotlin/index.js +1 -0
  279. package/dist/core/ingestion/languages/kotlin/module-resolution.d.ts +22 -0
  280. package/dist/core/ingestion/languages/kotlin/module-resolution.js +108 -0
  281. package/dist/core/ingestion/languages/kotlin/query.js +28 -2
  282. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +23 -2
  283. package/dist/core/ingestion/languages/kotlin/spring-aop.d.ts +12 -0
  284. package/dist/core/ingestion/languages/kotlin/spring-aop.js +64 -0
  285. package/dist/core/ingestion/languages/kotlin/spring-conditionals.d.ts +12 -0
  286. package/dist/core/ingestion/languages/kotlin/spring-conditionals.js +49 -0
  287. package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +2 -0
  288. package/dist/core/ingestion/languages/kotlin/spring-di.js +60 -11
  289. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +10 -0
  290. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +41 -0
  291. package/dist/core/ingestion/languages/php/captures.d.ts +5 -0
  292. package/dist/core/ingestion/languages/php/captures.js +319 -51
  293. package/dist/core/ingestion/languages/php/import-target.d.ts +3 -4
  294. package/dist/core/ingestion/languages/php/import-target.js +192 -62
  295. package/dist/core/ingestion/languages/php/query.js +31 -0
  296. package/dist/core/ingestion/languages/python/arity-metadata.d.ts +1 -0
  297. package/dist/core/ingestion/languages/python/arity-metadata.js +1 -0
  298. package/dist/core/ingestion/languages/python/captures.js +29 -0
  299. package/dist/core/ingestion/languages/python/import-decomposer.js +22 -1
  300. package/dist/core/ingestion/languages/python/import-target.d.ts +42 -1
  301. package/dist/core/ingestion/languages/python/import-target.js +277 -91
  302. package/dist/core/ingestion/languages/python/index.d.ts +1 -1
  303. package/dist/core/ingestion/languages/python/index.js +1 -1
  304. package/dist/core/ingestion/languages/python/interpret.d.ts +52 -0
  305. package/dist/core/ingestion/languages/python/interpret.js +249 -7
  306. package/dist/core/ingestion/languages/python/query.js +9 -0
  307. package/dist/core/ingestion/languages/python/receiver-binding.d.ts +8 -6
  308. package/dist/core/ingestion/languages/python/receiver-binding.js +108 -12
  309. package/dist/core/ingestion/languages/python/scope-resolver.js +27 -4
  310. package/dist/core/ingestion/languages/python/simple-hooks.js +2 -8
  311. package/dist/core/ingestion/languages/python.js +13 -0
  312. package/dist/core/ingestion/languages/ruby/captures.js +158 -0
  313. package/dist/core/ingestion/languages/ruby/import-target.js +7 -5
  314. package/dist/core/ingestion/languages/ruby/query.js +93 -0
  315. package/dist/core/ingestion/languages/ruby/scope-resolver.js +2 -0
  316. package/dist/core/ingestion/languages/ruby/simple-hooks.d.ts +1 -1
  317. package/dist/core/ingestion/languages/ruby/simple-hooks.js +22 -1
  318. package/dist/core/ingestion/languages/rust/captures.js +39 -1
  319. package/dist/core/ingestion/languages/rust/method-owners.js +11 -1
  320. package/dist/core/ingestion/languages/rust/module-path.d.ts +126 -0
  321. package/dist/core/ingestion/languages/rust/module-path.js +214 -0
  322. package/dist/core/ingestion/languages/rust/qualified-call.d.ts +41 -0
  323. package/dist/core/ingestion/languages/rust/qualified-call.js +481 -0
  324. package/dist/core/ingestion/languages/rust/query.js +39 -6
  325. package/dist/core/ingestion/languages/rust/scope-resolver.js +21 -2
  326. package/dist/core/ingestion/languages/rust.js +17 -0
  327. package/dist/core/ingestion/languages/swift/captures.js +87 -3
  328. package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.d.ts +48 -0
  329. package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.js +253 -0
  330. package/dist/core/ingestion/languages/swift/import-target.js +4 -9
  331. package/dist/core/ingestion/languages/swift/query.js +17 -0
  332. package/dist/core/ingestion/languages/swift/receiver-binding.d.ts +8 -0
  333. package/dist/core/ingestion/languages/swift/receiver-binding.js +6 -2
  334. package/dist/core/ingestion/languages/swift.js +2 -0
  335. package/dist/core/ingestion/languages/typescript/captures.d.ts +90 -1
  336. package/dist/core/ingestion/languages/typescript/captures.js +267 -5
  337. package/dist/core/ingestion/languages/typescript/cjs-export-assignment.d.ts +134 -0
  338. package/dist/core/ingestion/languages/typescript/cjs-export-assignment.js +523 -0
  339. package/dist/core/ingestion/languages/typescript/cjs-module-exports.d.ts +54 -0
  340. package/dist/core/ingestion/languages/typescript/cjs-module-exports.js +191 -0
  341. package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.d.ts +7 -0
  342. package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.js +92 -0
  343. package/dist/core/ingestion/languages/typescript/file-candidates.d.ts +29 -0
  344. package/dist/core/ingestion/languages/typescript/file-candidates.js +70 -0
  345. package/dist/core/ingestion/languages/typescript/import-decomposer.d.ts +28 -1
  346. package/dist/core/ingestion/languages/typescript/import-decomposer.js +125 -10
  347. package/dist/core/ingestion/languages/typescript/import-target.d.ts +25 -37
  348. package/dist/core/ingestion/languages/typescript/import-target.js +24 -26
  349. package/dist/core/ingestion/languages/typescript/interpret.d.ts +21 -1
  350. package/dist/core/ingestion/languages/typescript/interpret.js +45 -5
  351. package/dist/core/ingestion/languages/typescript/module-resolution.d.ts +48 -0
  352. package/dist/core/ingestion/languages/typescript/module-resolution.js +171 -0
  353. package/dist/core/ingestion/languages/typescript/query.d.ts +1 -0
  354. package/dist/core/ingestion/languages/typescript/query.js +303 -14
  355. package/dist/core/ingestion/languages/typescript/receiver-binding.d.ts +17 -0
  356. package/dist/core/ingestion/languages/typescript/receiver-binding.js +27 -0
  357. package/dist/core/ingestion/languages/typescript/scope-resolver.js +27 -40
  358. package/dist/core/ingestion/languages/typescript/simple-hooks.d.ts +0 -10
  359. package/dist/core/ingestion/languages/typescript/simple-hooks.js +22 -22
  360. package/dist/core/ingestion/languages/typescript/tsconfig.d.ts +59 -0
  361. package/dist/core/ingestion/languages/typescript/tsconfig.js +292 -0
  362. package/dist/core/ingestion/languages/typescript.js +93 -2
  363. package/dist/core/ingestion/languages/vue/import-target.d.ts +6 -22
  364. package/dist/core/ingestion/languages/vue/import-target.js +11 -47
  365. package/dist/core/ingestion/languages/vue/scope-resolver.js +4 -2
  366. package/dist/core/ingestion/local-symbol-pruner.js +11 -11
  367. package/dist/core/ingestion/method-extractors/configs/csharp.js +1 -0
  368. package/dist/core/ingestion/method-extractors/generic.js +1 -0
  369. package/dist/core/ingestion/method-types.d.ts +16 -0
  370. package/dist/core/ingestion/pipeline-phases/di.d.ts +1 -1
  371. package/dist/core/ingestion/pipeline-phases/di.js +136 -21
  372. package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
  373. package/dist/core/ingestion/pipeline-phases/index.js +2 -0
  374. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +15 -0
  375. package/dist/core/ingestion/pipeline-phases/parse-impl.js +154 -4
  376. package/dist/core/ingestion/pipeline-phases/parse.js +5 -0
  377. package/dist/core/ingestion/pipeline-phases/processes.d.ts +3 -2
  378. package/dist/core/ingestion/pipeline-phases/processes.js +91 -6
  379. package/dist/core/ingestion/pipeline-phases/routes.js +116 -25
  380. package/dist/core/ingestion/pipeline-phases/spring-aop.d.ts +34 -0
  381. package/dist/core/ingestion/pipeline-phases/spring-aop.js +439 -0
  382. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +34 -0
  383. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +255 -0
  384. package/dist/core/ingestion/pipeline-phases/types.d.ts +7 -0
  385. package/dist/core/ingestion/pipeline.d.ts +26 -2
  386. package/dist/core/ingestion/pipeline.js +60 -11
  387. package/dist/core/ingestion/process-processor.d.ts +109 -2
  388. package/dist/core/ingestion/process-processor.js +464 -52
  389. package/dist/core/ingestion/resolve-references.d.ts +6 -1
  390. package/dist/core/ingestion/resolve-references.js +66 -6
  391. package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +8 -2
  392. package/dist/core/ingestion/route-extractors/constant-resolver.js +11 -7
  393. package/dist/core/ingestion/route-extractors/data-route-table.d.ts +40 -0
  394. package/dist/core/ingestion/route-extractors/data-route-table.js +876 -0
  395. package/dist/core/ingestion/route-extractors/dispatch-guard.d.ts +96 -0
  396. package/dist/core/ingestion/route-extractors/dispatch-guard.js +1184 -0
  397. package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +114 -0
  398. package/dist/core/ingestion/route-extractors/java-const-resolver.js +569 -0
  399. package/dist/core/ingestion/route-extractors/js-const-resolver.d.ts +192 -0
  400. package/dist/core/ingestion/route-extractors/js-const-resolver.js +1033 -0
  401. package/dist/core/ingestion/route-extractors/nest.d.ts +53 -0
  402. package/dist/core/ingestion/route-extractors/nest.js +523 -0
  403. package/dist/core/ingestion/route-extractors/spring-shared.d.ts +11 -0
  404. package/dist/core/ingestion/route-extractors/spring-shared.js +89 -0
  405. package/dist/core/ingestion/route-extractors/spring.js +214 -29
  406. package/dist/core/ingestion/scope-extractor-bridge.js +9 -1
  407. package/dist/core/ingestion/scope-extractor.d.ts +22 -7
  408. package/dist/core/ingestion/scope-extractor.js +309 -15
  409. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +311 -21
  410. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +16 -5
  411. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +12 -0
  412. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +47 -0
  413. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +20 -15
  414. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +280 -42
  415. package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.d.ts +123 -0
  416. package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +171 -17
  417. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.d.ts +58 -1
  418. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +137 -34
  419. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +30 -1
  420. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +39 -1
  421. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +18 -1
  422. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +113 -18
  423. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +107 -5
  424. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +590 -33
  425. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +3 -0
  426. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +101 -41
  427. package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.d.ts +34 -0
  428. package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.js +62 -0
  429. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +5 -1
  430. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +8 -1
  431. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +105 -5
  432. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +931 -92
  433. package/dist/core/ingestion/scope-resolution/passes/return-shape-members.d.ts +58 -0
  434. package/dist/core/ingestion/scope-resolution/passes/return-shape-members.js +458 -0
  435. package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.d.ts +180 -0
  436. package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.js +418 -0
  437. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +29 -0
  438. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +57 -0
  439. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +55 -1
  440. package/dist/core/ingestion/scope-resolution/pipeline/run.js +241 -19
  441. package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +112 -2
  442. package/dist/core/ingestion/scope-resolution/resolution-outcome.js +38 -1
  443. package/dist/core/ingestion/scope-resolution/scope/namespace-targets.d.ts +25 -3
  444. package/dist/core/ingestion/scope-resolution/scope/namespace-targets.js +36 -16
  445. package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +210 -9
  446. package/dist/core/ingestion/scope-resolution/scope/walkers.js +905 -22
  447. package/dist/core/ingestion/scope-resolution/summary-maps.d.ts +28 -0
  448. package/dist/core/ingestion/scope-resolution/summary-maps.js +50 -0
  449. package/dist/core/ingestion/scope-resolution/undecided-satisfaction.d.ts +55 -0
  450. package/dist/core/ingestion/scope-resolution/undecided-satisfaction.js +37 -0
  451. package/dist/core/ingestion/scope-resolution/unresolved-receivers.d.ts +109 -0
  452. package/dist/core/ingestion/scope-resolution/unresolved-receivers.js +204 -0
  453. package/dist/core/ingestion/scope-resolution/utils/definition-id.d.ts +13 -0
  454. package/dist/core/ingestion/scope-resolution/utils/definition-id.js +19 -0
  455. package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.d.ts +171 -0
  456. package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.js +218 -0
  457. package/dist/core/ingestion/scope-resolution/workspace-index-types.d.ts +34 -0
  458. package/dist/core/ingestion/scope-resolution/workspace-index-types.js +15 -0
  459. package/dist/core/ingestion/scope-resolution/workspace-index.d.ts +7 -20
  460. package/dist/core/ingestion/tree-sitter-queries.d.ts +11 -11
  461. package/dist/core/ingestion/tree-sitter-queries.js +678 -4
  462. package/dist/core/ingestion/type-env.js +11 -7
  463. package/dist/core/ingestion/type-extractors/shared.d.ts +17 -0
  464. package/dist/core/ingestion/type-extractors/shared.js +16 -0
  465. package/dist/core/ingestion/type-extractors/types.d.ts +12 -0
  466. package/dist/core/ingestion/type-extractors/typescript.d.ts +20 -0
  467. package/dist/core/ingestion/type-extractors/typescript.js +26 -0
  468. package/dist/core/ingestion/utils/ast-helpers.d.ts +297 -15
  469. package/dist/core/ingestion/utils/ast-helpers.js +578 -46
  470. package/dist/core/ingestion/utils/call-analysis.d.ts +27 -22
  471. package/dist/core/ingestion/utils/call-analysis.js +202 -7
  472. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +59 -0
  473. package/dist/core/ingestion/utils/callable-flow-captures.js +51 -1
  474. package/dist/core/ingestion/utils/callable-labels.d.ts +25 -0
  475. package/dist/core/ingestion/utils/callable-labels.js +31 -0
  476. package/dist/core/ingestion/utils/effective-ram.d.ts +40 -0
  477. package/dist/core/ingestion/utils/effective-ram.js +58 -0
  478. package/dist/core/ingestion/utils/line-base.d.ts +14 -0
  479. package/dist/core/ingestion/utils/line-base.js +14 -0
  480. package/dist/core/ingestion/utils/method-props.d.ts +27 -4
  481. package/dist/core/ingestion/utils/method-props.js +29 -4
  482. package/dist/core/ingestion/utils/receiver-chain-captures.d.ts +31 -0
  483. package/dist/core/ingestion/utils/receiver-chain-captures.js +57 -0
  484. package/dist/core/ingestion/utils/receiver-chain-codec.d.ts +89 -0
  485. package/dist/core/ingestion/utils/receiver-chain-codec.js +182 -0
  486. package/dist/core/ingestion/utils/scope-tree-walk.d.ts +22 -0
  487. package/dist/core/ingestion/utils/scope-tree-walk.js +33 -0
  488. package/dist/core/ingestion/utils/template-arguments.d.ts +96 -0
  489. package/dist/core/ingestion/utils/template-arguments.js +196 -0
  490. package/dist/core/ingestion/utils/type-parameters.d.ts +49 -0
  491. package/dist/core/ingestion/utils/type-parameters.js +206 -0
  492. package/dist/core/ingestion/workers/callable-id.d.ts +80 -0
  493. package/dist/core/ingestion/workers/callable-id.js +125 -0
  494. package/dist/core/ingestion/workers/parse-worker.d.ts +14 -1
  495. package/dist/core/ingestion/workers/parse-worker.js +493 -54
  496. package/dist/core/ingestion/workers/worker-pool.d.ts +20 -27
  497. package/dist/core/ingestion/workers/worker-pool.js +91 -3
  498. package/dist/core/lbug/csv-generator.d.ts +27 -0
  499. package/dist/core/lbug/csv-generator.js +72 -17
  500. package/dist/core/lbug/extension-load-error.js +13 -2
  501. package/dist/core/lbug/extension-loader.d.ts +29 -0
  502. package/dist/core/lbug/extension-loader.js +31 -6
  503. package/dist/core/lbug/graph-emit-sink.d.ts +264 -0
  504. package/dist/core/lbug/graph-emit-sink.js +581 -0
  505. package/dist/core/lbug/lbug-adapter.d.ts +290 -11
  506. package/dist/core/lbug/lbug-adapter.js +652 -69
  507. package/dist/core/lbug/native-check.d.ts +21 -0
  508. package/dist/core/lbug/native-check.js +248 -32
  509. package/dist/core/lbug/pdg-emit-sink.d.ts +13 -4
  510. package/dist/core/lbug/pdg-emit-sink.js +21 -111
  511. package/dist/core/lbug/pool-adapter.d.ts +9 -0
  512. package/dist/core/lbug/pool-adapter.js +164 -14
  513. package/dist/core/lbug/query-batch.d.ts +75 -0
  514. package/dist/core/lbug/query-batch.js +102 -0
  515. package/dist/core/lbug/rel-pair-routing.d.ts +160 -2
  516. package/dist/core/lbug/rel-pair-routing.js +228 -10
  517. package/dist/core/lbug/schema.d.ts +163 -4
  518. package/dist/core/lbug/schema.js +404 -159
  519. package/dist/core/lbug/sync-csv-writer.d.ts +47 -0
  520. package/dist/core/lbug/sync-csv-writer.js +108 -0
  521. package/dist/core/run-analyze.d.ts +147 -0
  522. package/dist/core/run-analyze.js +1215 -179
  523. package/dist/core/search/bm25-index.d.ts +11 -0
  524. package/dist/core/search/bm25-index.js +60 -26
  525. package/dist/core/search/fts-indexes.d.ts +150 -9
  526. package/dist/core/search/fts-indexes.js +241 -23
  527. package/dist/core/wiki/graph-queries.js +145 -112
  528. package/dist/core/wiki/llm-client.d.ts +29 -3
  529. package/dist/core/wiki/llm-client.js +47 -12
  530. package/dist/core/wiki/prompts.d.ts +19 -0
  531. package/dist/core/wiki/prompts.js +20 -1
  532. package/dist/lib/utils.d.ts +113 -0
  533. package/dist/lib/utils.js +185 -0
  534. package/dist/mcp/local/aop-metadata.d.ts +77 -0
  535. package/dist/mcp/local/aop-metadata.js +227 -0
  536. package/dist/mcp/local/bean-metadata.d.ts +2 -1
  537. package/dist/mcp/local/bean-metadata.js +22 -1
  538. package/dist/mcp/local/convex-metadata.d.ts +8 -0
  539. package/dist/mcp/local/convex-metadata.js +45 -0
  540. package/dist/mcp/local/local-backend.d.ts +174 -11
  541. package/dist/mcp/local/local-backend.js +1678 -331
  542. package/dist/mcp/local/path-predicate.d.ts +19 -0
  543. package/dist/mcp/local/path-predicate.js +21 -0
  544. package/dist/mcp/local/pdg-impact.d.ts +132 -10
  545. package/dist/mcp/local/pdg-impact.js +391 -98
  546. package/dist/mcp/repository-policy.d.ts +1 -0
  547. package/dist/mcp/repository-policy.js +5 -0
  548. package/dist/mcp/resources.js +26 -4
  549. package/dist/mcp/server.js +23 -13
  550. package/dist/mcp/tools.d.ts +8 -0
  551. package/dist/mcp/tools.js +76 -23
  552. package/dist/server/analyze-job.d.ts +37 -2
  553. package/dist/server/analyze-job.js +13 -2
  554. package/dist/server/analyze-launch.d.ts +1 -1
  555. package/dist/server/analyze-launch.js +79 -10
  556. package/dist/server/analyze-worker-core.d.ts +1 -1
  557. package/dist/server/analyze-worker-core.js +10 -1
  558. package/dist/server/analyze-worker-ipc.d.ts +1 -1
  559. package/dist/server/analyze-worker-ipc.js +4 -0
  560. package/dist/server/analyze-worker-protocol.d.ts +59 -0
  561. package/dist/server/analyze-worker-protocol.js +1 -0
  562. package/dist/server/analyze-worker.d.ts +1 -17
  563. package/dist/server/api.d.ts +2 -11
  564. package/dist/server/api.js +164 -163
  565. package/dist/server/embed-run-outcome.d.ts +89 -0
  566. package/dist/server/embed-run-outcome.js +88 -0
  567. package/dist/server/git-clone.js +6 -2
  568. package/dist/server/middleware.d.ts +116 -9
  569. package/dist/server/middleware.js +291 -22
  570. package/dist/server/sse-progress.d.ts +41 -0
  571. package/dist/server/sse-progress.js +125 -0
  572. package/dist/storage/branch-index.d.ts +11 -6
  573. package/dist/storage/branch-index.js +15 -7
  574. package/dist/storage/file-hash.js +2 -2
  575. package/dist/storage/fs-atomic.d.ts +25 -0
  576. package/dist/storage/fs-atomic.js +42 -0
  577. package/dist/storage/git.d.ts +131 -0
  578. package/dist/storage/git.js +236 -2
  579. package/dist/storage/index-lock.d.ts +102 -0
  580. package/dist/storage/index-lock.js +660 -0
  581. package/dist/storage/parse-cache.js +588 -6
  582. package/dist/storage/parsedfile-store.js +76 -6
  583. package/dist/storage/repo-manager.d.ts +54 -441
  584. package/dist/storage/repo-manager.js +312 -221
  585. package/dist/storage/repo-meta.d.ts +530 -0
  586. package/dist/storage/repo-meta.js +100 -0
  587. package/dist/types/pipeline.d.ts +37 -0
  588. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +1 -1
  589. package/hooks/claude/gitnexus-hook.cjs +1 -1
  590. package/hooks/claude/resolve-analyze-cmd.cjs +80 -13
  591. package/package.json +11 -2
  592. package/scripts/cross-platform-shard.ts +153 -0
  593. package/scripts/cross-platform-tests.ts +122 -0
  594. package/scripts/run-cross-platform.ts +16 -5
  595. package/skills/gitnexus-cli.md +3 -3
  596. package/skills/gitnexus-debugging.md +37 -7
  597. package/skills/gitnexus-exploring.md +26 -4
  598. package/skills/gitnexus-impact-analysis.md +71 -10
  599. package/skills/gitnexus-plan/README.md +11 -6
  600. package/skills/gitnexus-plan/references/evidence-provenance.md +49 -12
  601. package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +654 -372
  602. package/skills/gitnexus-refactoring.md +48 -5
  603. package/skills/gitnexus-review/SKILL.md +12 -6
  604. package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +1 -1
  605. package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +1 -1
  606. package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +1 -1
  607. package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +1 -1
  608. package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +1 -1
  609. package/skills/gitnexus-review/ci-personas/ci-security-lens.md +1 -1
  610. package/skills/gitnexus-taint-analysis.md +13 -7
  611. package/skills/gitnexus-work/SKILL.md +4 -1
  612. package/skills/gitnexus-work/references/evidence-provenance.md +49 -12
  613. package/skills/gitnexus-work/scripts/evidence-provenance.mjs +654 -372
  614. package/vendor/leiden/utils.cjs +28 -1
  615. package/web/assets/ProcessFlowModal-Badh2Pbg.js +24 -0
  616. package/web/assets/{__vite-browser-external-bMKyYQkO.js → __vite-browser-external-COxE8F0G.js} +1 -1
  617. package/web/assets/abnfDiagram-QNN2D4NM-Cq2djWWe.js +1 -0
  618. package/web/assets/agent-Dr4l5EOp.js +662 -0
  619. package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +1 -0
  620. package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +36 -0
  621. package/web/assets/{blockDiagram-7IZFK4PR-DBefcjof.js → blockDiagram-54WLDVWM-Dg_hrRWE.js} +4 -4
  622. package/web/assets/{c4Diagram-Y2BXMSZH-EjWnjEJl.js → c4Diagram-X2LASM7V-CnhoT4aV.js} +2 -2
  623. package/web/assets/chunk-224SPVON-B8gxtXpy.js +1 -0
  624. package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +127 -0
  625. package/web/assets/chunk-2SREHG4O-Dip42xOq.js +1 -0
  626. package/web/assets/chunk-4RFN2BYJ-DHHWuC-n.js +1 -0
  627. package/web/assets/chunk-66DQ2XMT-CM0xjFAN.js +1 -0
  628. package/web/assets/chunk-6BELYETK-ChsYtfHW.js +1 -0
  629. package/web/assets/{chunk-LII3EMHJ-BL6lKJ_P.js → chunk-6L755F7B-CMhLBxi2.js} +1 -1
  630. package/web/assets/{chunk-QA3QBVWF-DVXPOIxe.js → chunk-7CWYLC5S-DRgGkkpF.js} +1 -1
  631. package/web/assets/{chunk-ZXARS5L4-C3v-4Fsw.js → chunk-A7VWPJGB-B4O3oQdQ.js} +1 -1
  632. package/web/assets/chunk-BI6VK774-D0oaWk8V.js +1 -0
  633. package/web/assets/chunk-D6VWDJW2-BxcBdZ9c.js +2 -0
  634. package/web/assets/chunk-DMV4VAQV-Bn6WXDSX.js +4 -0
  635. package/web/assets/chunk-E5QJAATJ-dh-5CtIV.js +2 -0
  636. package/web/assets/chunk-EQFTRU2I-1ix7TzW9.js +2 -0
  637. package/web/assets/chunk-FWYVLQTC-BgDItRzJ.js +1 -0
  638. package/web/assets/chunk-HNC4WDU7-DoU3KnA7.js +1 -0
  639. package/web/assets/chunk-L5GCOVLC-CE2w8Nm_.js +161 -0
  640. package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +321 -0
  641. package/web/assets/chunk-LORZLZWG-B57uGw2N.js +88 -0
  642. package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +62 -0
  643. package/web/assets/chunk-NV3KIAZN-5yvcpMiu.js +1 -0
  644. package/web/assets/chunk-OIYT25JQ-CQ6KOZGX.js +1 -0
  645. package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +10 -0
  646. package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +156 -0
  647. package/web/assets/chunk-RRFMTAIC-CMN0wcYA.js +1 -0
  648. package/web/assets/{chunk-RLI5ZMPA-CkXZ0y0U.js → chunk-SATU7PGQ-B1zhgOvc.js} +1 -1
  649. package/web/assets/chunk-STOV2HOB-GnExfzIX.js +1 -0
  650. package/web/assets/{chunk-INKRHTLW-Ckl3_KkO.js → chunk-SZD42YQK-ijyKKVr1.js} +21 -21
  651. package/web/assets/{chunk-LCXTWHL2-C162wE5z.js → chunk-TFPGFQPA-Dj6a-0pC.js} +3 -3
  652. package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +2 -0
  653. package/web/assets/chunk-TZUXEDM2-B7p9AcTw.js +1 -0
  654. package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +1 -0
  655. package/web/assets/{chunk-6764PJDD-C7xxk063.js → chunk-VE5CLXGZ-C1vB7wpY.js} +1 -1
  656. package/web/assets/{chunk-RG4AUYOV-ZNgyLFq6.js → chunk-VJFVEZTB-CX66F2ep.js} +3 -3
  657. package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +1 -0
  658. package/web/assets/chunk-WJBAP47W-BckNkuEN.js +1 -0
  659. package/web/assets/chunk-XNMVGMAZ-Cg_LnPtj.js +1 -0
  660. package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +1 -0
  661. package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +1 -0
  662. package/web/assets/{cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js → cose-bilkent-RZA4XIPR-BHpK4Crp.js} +1 -1
  663. package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +1 -0
  664. package/web/assets/cynefinDiagram-TR7LZUCG-C3Iar9lZ.js +62 -0
  665. package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +4 -0
  666. package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +30 -0
  667. package/web/assets/diagram-JCD7PQ7C-DC5-9FRr.js +24 -0
  668. package/web/assets/{diagram-HNR7UZ2L-DVRltWbL.js → diagram-KFBZAVDW-Dfmf_4ti.js} +3 -3
  669. package/web/assets/diagram-L7DVE3PN-GIRyVUtt.js +41 -0
  670. package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +24 -0
  671. package/web/assets/ebnfDiagram-DRHRQJWO-D8_CI4ZF.js +1 -0
  672. package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +85 -0
  673. package/web/assets/error-D9MtuG9s.js +1 -0
  674. package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +1 -0
  675. package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +1 -0
  676. package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +292 -0
  677. package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +1 -0
  678. package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +106 -0
  679. package/web/assets/{index-D7mTFcvQ.js → index-2zdvEdzg.js} +51 -51
  680. package/web/assets/index-CJDpyH-n.css +2 -0
  681. package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +1 -0
  682. package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +2 -0
  683. package/web/assets/{ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js → ishikawaDiagram-4JDSWWDM-DmqWtjkl.js} +2 -2
  684. package/web/assets/{journeyDiagram-M6C3CM3L-C6wjooas.js → journeyDiagram-QUS3FAKT-XAzVzrQW.js} +3 -3
  685. package/web/assets/{kanban-definition-75IXJCU3-5_UVY79g.js → kanban-definition-D4L7SQKK-YurRnmYn.js} +6 -6
  686. package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +257 -0
  687. package/web/assets/{mindmap-definition-2TDM6QVE-8xDLzk2e.js → mindmap-definition-66QP5TD6-ChrWWnil.js} +5 -5
  688. package/web/assets/node.browser-U-KyT5AW.js +1 -0
  689. package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +1 -0
  690. package/web/assets/pegDiagram-YKIO5C6U-QGeQLEq2.js +1 -0
  691. package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +1 -0
  692. package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +39 -0
  693. package/web/assets/{quadrantDiagram-VICAPDV7-DR54jOeR.js → quadrantDiagram-VO5QLCXA-B7098wSc.js} +3 -3
  694. package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +1 -0
  695. package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +1 -0
  696. package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +1 -0
  697. package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +1 -0
  698. package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +1 -0
  699. package/web/assets/railroadDiagram-M77LTMSB-AXu4vxk_.js +1 -0
  700. package/web/assets/{requirementDiagram-JXO7QTGE-PEkg7sKC.js → requirementDiagram-RASO5HTO-B-l8InpK.js} +4 -4
  701. package/web/assets/{sankeyDiagram-URQDO5SZ-DDWEtjcs.js → sankeyDiagram-F32LOJ6L-Kd7zjJgX.js} +3 -3
  702. package/web/assets/{sequenceDiagram-VS2MUI6T-Bv-uwANx.js → sequenceDiagram-URATNSBD-BlcdY9DS.js} +7 -7
  703. package/web/assets/sizeCapture-5GORAGP4-BEqQzsxs.js +1 -0
  704. package/web/assets/src-C5sx_gMp.js +1 -0
  705. package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +1 -0
  706. package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +1 -0
  707. package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +2 -0
  708. package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +8 -0
  709. package/web/assets/{timeline-definition-O6YCAMPW-Qmsuo7qS.js → timeline-definition-WJXWRH4I-DUfp1R3E.js} +3 -3
  710. package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +1 -0
  711. package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +1 -0
  712. package/web/assets/vennDiagram-K3VCMQLI-Bj-FN-XS.js +34 -0
  713. package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +1 -0
  714. package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +78 -0
  715. package/web/assets/xychartDiagram-5VRUVLCW-CK_rbSWE.js +7 -0
  716. package/web/index.html +16 -15
  717. package/dist/core/ingestion/languages/python/index-stats.d.ts +0 -18
  718. package/dist/core/ingestion/languages/python/index-stats.js +0 -25
  719. package/web/assets/ProcessFlowModal-CwkpVkv-.js +0 -22
  720. package/web/assets/agent-Ds-lkZjX.js +0 -626
  721. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +0 -1
  722. package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +0 -36
  723. package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +0 -4
  724. package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +0 -1
  725. package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +0 -321
  726. package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +0 -159
  727. package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +0 -124
  728. package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +0 -10
  729. package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +0 -1
  730. package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +0 -1
  731. package/web/assets/chunk-J5EP6P6S-L19oz55R.js +0 -1
  732. package/web/assets/chunk-KGFNY3KK-BZeP-55u.js +0 -62
  733. package/web/assets/chunk-KGYTTC2M-zm6n242I.js +0 -1
  734. package/web/assets/chunk-KNLZD3CH-BGlP6X9R.js +0 -1
  735. package/web/assets/chunk-LRIF4GLE-n59lhprL.js +0 -1
  736. package/web/assets/chunk-RERM46MO-B5dAdWpP.js +0 -1
  737. package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +0 -1
  738. package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +0 -1
  739. package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +0 -1
  740. package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +0 -1
  741. package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +0 -1
  742. package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +0 -2
  743. package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +0 -1
  744. package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +0 -1
  745. package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +0 -4
  746. package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +0 -43
  747. package/web/assets/diagram-GF46GFSD-B2atbzmU.js +0 -24
  748. package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +0 -24
  749. package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +0 -10
  750. package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +0 -85
  751. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +0 -1
  752. package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +0 -162
  753. package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +0 -292
  754. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +0 -1
  755. package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +0 -106
  756. package/web/assets/index-CX_fADmQ.css +0 -2
  757. package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +0 -1
  758. package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +0 -2
  759. package/web/assets/katex-K3KEBU37-qRQBy-EZ.js +0 -261
  760. package/web/assets/node-Ct_zna8U.js +0 -8
  761. package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +0 -1
  762. package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +0 -1
  763. package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +0 -30
  764. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +0 -1
  765. package/web/assets/sdk-CzHHH8tD.js +0 -37
  766. package/web/assets/src-Cv1eWg0o.js +0 -1
  767. package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +0 -1
  768. package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +0 -1
  769. package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +0 -1
  770. package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +0 -1
  771. package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +0 -34
  772. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +0 -1
  773. package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +0 -78
  774. package/web/assets/xychartDiagram-N2JHSOCM-CoZ_Tits.js +0 -7
  775. /package/web/assets/{chunk-7W6UQGC5-pyKGssV3.js → chunk-LIEV3EAG-pyKGssV3.js} +0 -0
@@ -17,10 +17,17 @@ export function interpretPythonImport(captures) {
17
17
  // `@import.name` : the imported symbol name (or module name for plain imports)
18
18
  // `@import.alias` : the local alias name (for `as` forms)
19
19
  // `@import.source`: the module path (always present except for `dynamic`)
20
+ // `@import.publishes`: present iff the statement is at module level
20
21
  const kindCap = captures['@import.kind'];
21
22
  const nameCap = captures['@import.name'];
22
23
  const aliasCap = captures['@import.alias'];
23
24
  const sourceCap = captures['@import.source'];
25
+ // Python has no dedicated re-export form: a module-level `from m import x`
26
+ // binds `x` AND publishes it as `<this module>.x`. See `reexportsName` on
27
+ // `ParsedImport` for the contract, and `import-decomposer.ts` for why the
28
+ // marker — not this function — decides whether the statement is at module
29
+ // level.
30
+ const republishes = captures['@import.publishes'] !== undefined;
24
31
  const kind = kindCap?.text;
25
32
  if (kind === undefined)
26
33
  return null;
@@ -56,10 +63,14 @@ export function interpretPythonImport(captures) {
56
63
  localName: nameCap.text,
57
64
  importedName: nameCap.text,
58
65
  targetRaw: sourceCap.text,
66
+ ...(republishes ? { reexportsName: true } : {}),
59
67
  };
60
68
  }
61
69
  case 'from-alias': {
62
- // `from m import x as y`
70
+ // `from m import x as y` — republished under the alias (`<module>.y`).
71
+ // PEP 484 treats `import x as x` as an explicit re-export; Python's
72
+ // runtime namespace republishes every module-level form, so the flag
73
+ // follows module level rather than the redundant-alias case.
63
74
  if (sourceCap === undefined || nameCap === undefined || aliasCap === undefined)
64
75
  return null;
65
76
  return {
@@ -68,6 +79,7 @@ export function interpretPythonImport(captures) {
68
79
  importedName: nameCap.text,
69
80
  alias: aliasCap.text,
70
81
  targetRaw: sourceCap.text,
82
+ ...(republishes ? { reexportsName: true } : {}),
71
83
  };
72
84
  }
73
85
  case 'wildcard': {
@@ -118,12 +130,18 @@ export function interpretPythonTypeBinding(captures) {
118
130
  // `Registry.lookup` Step 2 treats them identically.
119
131
  else if (captures['@type-binding.cls'] !== undefined)
120
132
  source = 'self';
121
- else if (captures['@type-binding.instance-field'] !== undefined) {
122
- source =
123
- captures['@type-binding.parameter'] !== undefined ? 'parameter-annotation' : 'annotation';
124
- }
133
+ // Before the instance-field arm, not after it: `self.x = Outer()` (#2807)
134
+ // carries BOTH markers, and its type is inferred from the CONSTRUCTOR CALL —
135
+ // the weakest of the three tiers — so a class that also annotates the field
136
+ // keeps the annotation. Testing constructor first is what lets the
137
+ // instance-field arm below stay flat; the two orders agree on every input,
138
+ // since they differ only where both markers are present and both then say
139
+ // 'constructor-inferred'.
125
140
  else if (captures['@type-binding.constructor'] !== undefined)
126
141
  source = 'constructor-inferred';
142
+ else if (captures['@type-binding.instance-field'] !== undefined)
143
+ source =
144
+ captures['@type-binding.parameter'] !== undefined ? 'parameter-annotation' : 'annotation';
127
145
  else if (captures['@type-binding.annotation'] !== undefined)
128
146
  source = 'annotation';
129
147
  else if (captures['@type-binding.alias'] !== undefined)
@@ -139,6 +157,41 @@ function stripForwardRefQuotes(text) {
139
157
  }
140
158
  return text;
141
159
  }
160
+ /**
161
+ * Container bases whose SINGLE type argument is the element type.
162
+ *
163
+ * The single source of truth for both the matcher below and the property test
164
+ * that asserts every one of them is also declined as a user generic — the two
165
+ * lists drifting apart is the defect this arrangement exists to make
166
+ * impossible. Order is significant only in that it is the regex alternation
167
+ * order; keep additions grouped with their family.
168
+ */
169
+ export const SINGLE_ARG_CONTAINERS = [
170
+ 'list',
171
+ 'List',
172
+ 'set',
173
+ 'Set',
174
+ 'tuple',
175
+ 'Tuple',
176
+ 'Iterable',
177
+ 'Iterator',
178
+ 'Sequence',
179
+ 'Generator',
180
+ 'AsyncIterable',
181
+ 'AsyncIterator',
182
+ ];
183
+ /** Container bases whose SECOND type argument is the value type. See {@link SINGLE_ARG_CONTAINERS}. */
184
+ export const MAPPING_CONTAINERS = [
185
+ 'dict',
186
+ 'Dict',
187
+ 'Mapping',
188
+ 'MutableMapping',
189
+ 'OrderedDict',
190
+ 'DefaultDict',
191
+ ];
192
+ const QUALIFIER = '(?:[A-Za-z_][A-Za-z0-9_]*\\.)?';
193
+ const SINGLE_ARG_CONTAINER_RE = new RegExp(`^${QUALIFIER}(?:${SINGLE_ARG_CONTAINERS.join('|')})\\[([^,\\]]+)\\]$`);
194
+ const MAPPING_CONTAINER_RE = new RegExp(`^${QUALIFIER}(?:${MAPPING_CONTAINERS.join('|')})\\[[^,\\]]+,\\s*([^\\]]+)\\]$`);
142
195
  /**
143
196
  * Unwrap a single-arg generic collection wrapper — `list[User]`,
144
197
  * `set[User]`, `Iterable[User]`, `Sequence[User]`, `Iterator[User]`,
@@ -151,7 +204,7 @@ function stripForwardRefQuotes(text) {
151
204
  * resolution time.
152
205
  */
153
206
  function stripGeneric(text) {
154
- const single = text.match(/^(?:[A-Za-z_][A-Za-z0-9_]*\.)?(?:list|List|set|Set|tuple|Tuple|Iterable|Iterator|Sequence|Generator|AsyncIterable|AsyncIterator)\[([^,\]]+)\]$/);
207
+ const single = text.match(SINGLE_ARG_CONTAINER_RE);
155
208
  if (single !== null)
156
209
  return single[1].trim();
157
210
  // dict[K, V] / Dict[K, V] / Mapping[K, V] — strip to value type V.
@@ -161,11 +214,200 @@ function stripGeneric(text) {
161
214
  // only shape worth handling. Match a top-level K up to the first
162
215
  // comma and a V to the closing bracket; nested generics in V (e.g.
163
216
  // `dict[str, list[User]]`) are left for a downstream strip pass.
164
- const dict = text.match(/^(?:[A-Za-z_][A-Za-z0-9_]*\.)?(?:dict|Dict|Mapping|MutableMapping|OrderedDict|DefaultDict)\[[^,\]]+,\s*([^\]]+)\]$/);
217
+ const dict = text.match(MAPPING_CONTAINER_RE);
165
218
  if (dict !== null)
166
219
  return dict[1].trim();
220
+ // A subscripted type the two allow-lists above did NOT claim is a
221
+ // user-defined GENERIC, not a container: `Repo[User]`, `Handler[Req, Res]`.
222
+ // Its base names one declaration — `Repo[User]` and `Repo[Order]` are the
223
+ // same `class Repo(Generic[T])` — so reduce to that base, exactly as Java's
224
+ // and Swift's interpreters already do for their `<…>` spelling (#2833).
225
+ //
226
+ // Guarded by a DENY set rather than reached by fallthrough, because "the two
227
+ // rules above did not match" is NOT the same as "not a container". Two
228
+ // measured counterexamples, both of which this branch got wrong before the
229
+ // guard existed:
230
+ // - `dict[str, list[User]]` — the dict rule's value group cannot span a
231
+ // nested `]`, so it declines and the shape falls through. Reducing it to
232
+ // `dict` destroys the value type the dict rule explicitly leaves "for a
233
+ // downstream strip pass"; the annotation must survive intact instead.
234
+ // - `Callable[[int], User]`, `Literal["a"]`, `Annotated[int, F()]`,
235
+ // `Union[A, B]`, `tuple[int, ...]` — typing SPECIAL FORMS, not classes.
236
+ // Reducing them yields a bare `Callable`/`Literal`/`Union`, which binds
237
+ // to a workspace class of that name if one exists — a fabricated edge,
238
+ // and those names are ordinary enough for a real codebase to declare.
239
+ // Anything named here keeps its as-written text and resolves as it did
240
+ // before #2833.
241
+ //
242
+ // Only reached for genuine annotations: every Python `@type-binding.type`
243
+ // capture is a `(type)`, `(identifier)`, `(attribute)` or `(dotted_name)`
244
+ // node, so a subscripted VALUE expression (`arr[0]`) never arrives here.
245
+ //
246
+ // The as-written spelling is not lost — `scope-extractor` keeps it on
247
+ // `TypeRef.declaredSpelling` whenever it differs from the reduced name,
248
+ // which is what the receiver fold's index step reads.
249
+ const userGeneric = text.match(/^((?:[A-Za-z_][A-Za-z0-9_]*\.)*[A-Za-z_][A-Za-z0-9_]*)\[.+\]$/s);
250
+ if (userGeneric !== null) {
251
+ const qualified = userGeneric[1].trim();
252
+ const base = qualified.slice(qualified.lastIndexOf('.') + 1);
253
+ if (!isNotAUserGenericBase(base))
254
+ return qualified;
255
+ }
167
256
  return text;
168
257
  }
258
+ /**
259
+ * Whether a subscripted annotation's base names a Python type-system construct
260
+ * rather than a workspace class — see {@link NOT_A_USER_GENERIC_SPELLINGS}.
261
+ *
262
+ * CASE-FOLDED, and that is the load-bearing part. PEP 585 gave nearly every
263
+ * container two spellings — the builtin/`collections` one and the `typing`
264
+ * alias (`deque` / `typing.Deque`, `frozenset` / `typing.FrozenSet`,
265
+ * `defaultdict` / `typing.DefaultDict`) — which differ ONLY in case. Matching
266
+ * exactly meant each pair had to be listed twice and any half-pair was a silent
267
+ * escape: `deque` was listed, `Deque` was not, so `self.dq: Deque[User]`
268
+ * reduced to `Deque` and bound to a workspace `class Deque` (#2855). Folding
269
+ * case closes that axis by construction instead of by vigilance.
270
+ *
271
+ * The cost is that a workspace class whose name is a case VARIANT of a stdlib
272
+ * construct (`class deque(Generic[T])`) stops reducing. PEP 8 makes such a
273
+ * class vanishingly rare, and the loss is a missing edge — recoverable — where
274
+ * the gain is not minting a confident wrong one.
275
+ */
276
+ function isNotAUserGenericBase(base) {
277
+ return NOT_A_USER_GENERIC.has(base.toLowerCase());
278
+ }
279
+ /**
280
+ * Bases a subscripted annotation may carry that are NOT user-defined generics.
281
+ *
282
+ * SCOPE — the standard library, and deliberately nothing else. The names below
283
+ * are the documented Python type-system surface (`typing`'s deprecated PEP 585
284
+ * aliases and its special forms, plus the stdlib classes those aliases point
285
+ * at); that universe is CLOSED and versioned by CPython, so the list is
286
+ * auditable against
287
+ * <https://docs.python.org/3/library/typing.html#deprecated-aliases>.
288
+ *
289
+ * Third-party generics (`Mapped[int]`, `QuerySet[User]`) are NOT listed. That
290
+ * universe is open, so enumerating it only ever chases the last escape, and
291
+ * denying an ordinary name like `Model` would cost real edges in the many
292
+ * projects that legitimately declare one. Those spellings still reduce to their
293
+ * base, and the base is now admitted only on the grounds `resolveErasedBaseName`
294
+ * applies at resolution time — the file's scope chain binds it, the declaration
295
+ * is in this very file, the index proves the name is a template family, or the
296
+ * file has no cross-file class channel to be absent from. A `Mapped[User]` whose
297
+ * base the file cannot see therefore binds nothing, which is the structural
298
+ * answer this parse-time pass cannot give and no longer has to.
299
+ *
300
+ * Two distinct reasons to decline, both always-correct at this layer:
301
+ * - CONTAINERS, including ones the two rules above do not own. Reducing
302
+ * `deque[User]` to `deque` types a receiver as the container and retargets
303
+ * every call in a for-loop chain, and reducing `dict[str, list[User]]` to
304
+ * `dict` destroys the value type the dict rule leaves for a downstream pass.
305
+ * - `typing` SPECIAL FORMS, which are not classes at all. `Callable`,
306
+ * `Literal`, `Union` reduce to a bare name that binds to a workspace class
307
+ * of that name if one exists — a fabricated edge.
308
+ *
309
+ * Members are listed ONCE per case-insensitive concept: {@link
310
+ * isNotAUserGenericBase} folds case, so the builtin spelling covers its PEP 585
311
+ * `typing` twin (`deque` covers `Deque`, `frozenset` covers `FrozenSet`).
312
+ * Non-generic ABCs (`Hashable`, `Sized`) are omitted — they cannot be written
313
+ * subscripted, so they never reach this branch.
314
+ *
315
+ * Exported for the property test that asserts the case-fold closure holds
316
+ * behaviourally; nothing else should read it.
317
+ */
318
+ export const NOT_A_USER_GENERIC_SPELLINGS = [
319
+ // ── builtins subscriptable since PEP 585 ──────────────────────────────────
320
+ 'list',
321
+ 'set',
322
+ 'frozenset',
323
+ 'tuple',
324
+ 'dict',
325
+ 'type',
326
+ // ── `collections` ─────────────────────────────────────────────────────────
327
+ 'defaultdict',
328
+ 'OrderedDict',
329
+ 'ChainMap',
330
+ 'Counter',
331
+ 'deque',
332
+ // ── `collections.abc`, the subscriptable members ──────────────────────────
333
+ 'Mapping',
334
+ 'MutableMapping',
335
+ 'Sequence',
336
+ 'MutableSequence',
337
+ 'AbstractSet',
338
+ 'MutableSet',
339
+ 'Collection',
340
+ 'Container',
341
+ 'Reversible',
342
+ 'Iterable',
343
+ 'Iterator',
344
+ 'Generator',
345
+ 'AsyncIterable',
346
+ 'AsyncIterator',
347
+ 'AsyncGenerator',
348
+ 'Awaitable',
349
+ 'Coroutine',
350
+ 'KeysView',
351
+ 'ValuesView',
352
+ 'ItemsView',
353
+ 'MappingView',
354
+ // ── `contextlib`, and the `typing` aliases to it ──────────────────────────
355
+ 'ContextManager',
356
+ 'AsyncContextManager',
357
+ 'AbstractContextManager',
358
+ 'AbstractAsyncContextManager',
359
+ // ── `re`, and the `typing` aliases to it ──────────────────────────────────
360
+ // `Pattern` and `Match` ARE classes, so reducing them is not wrong the way
361
+ // reducing `Callable` is; they are declined because in Python annotations
362
+ // these spellings are overwhelmingly the `re` types, while a workspace class
363
+ // of the same name is a parser's own `Pattern`/`Match` and would be bound
364
+ // with no import evidence whatsoever. Same policy as the receiver-chain
365
+ // resolver's: a missing edge is recoverable, a confident wrong one is not.
366
+ 'Pattern',
367
+ 'Match',
368
+ // ── I/O streams (`typing.IO` and its two subclasses) ──────────────────────
369
+ 'IO',
370
+ 'TextIO',
371
+ 'BinaryIO',
372
+ // ── stdlib generic classes with ordinary names ────────────────────────────
373
+ // Same policy call as `Pattern`/`Match` above, and the sharpest instance of
374
+ // it: `asyncio.Task[Result]` reduces to `asyncio.Task`, whose dotted-tail
375
+ // fallback then single-matches an unrelated workspace `class Task`.
376
+ 'Queue',
377
+ 'Task',
378
+ 'Future',
379
+ 'PathLike',
380
+ // ── `typing` special forms — not classes ──────────────────────────────────
381
+ 'Callable',
382
+ 'Literal',
383
+ 'Annotated',
384
+ 'Union',
385
+ 'Optional',
386
+ 'Final',
387
+ 'ClassVar',
388
+ // `typing.Type` is the PEP 585 alias for the builtin `type` listed above, and
389
+ // the case fold already covers it — see the one-entry-per-concept rule.
390
+ 'TypeGuard',
391
+ 'TypeIs',
392
+ 'Unpack',
393
+ 'Required',
394
+ 'NotRequired',
395
+ 'ReadOnly',
396
+ 'Concatenate',
397
+ 'LiteralString',
398
+ // ── generic machinery: bases and type-parameter declarations ──────────────
399
+ // `Generic[T]`/`Protocol[T]` are written subscripted for real. The three
400
+ // declaration forms are not subscriptable in valid Python, but this
401
+ // interpreter checks no grammar — it reduces whatever text the annotation
402
+ // capture carried — so they are declined defensively.
403
+ 'Generic',
404
+ 'Protocol',
405
+ 'TypeVar',
406
+ 'ParamSpec',
407
+ 'TypeVarTuple',
408
+ ];
409
+ /** Case-folded lookup index over {@link NOT_A_USER_GENERIC_SPELLINGS}. */
410
+ const NOT_A_USER_GENERIC = new Set(NOT_A_USER_GENERIC_SPELLINGS.map((name) => name.toLowerCase()));
169
411
  /**
170
412
  * Unwrap nullable type annotations so downstream resolution treats
171
413
  * `User | None`, `None | User`, and `Optional[User]` identically to
@@ -20,6 +20,15 @@ const PYTHON_SCOPE_QUERY = `
20
20
  (function_definition
21
21
  name: (identifier) @declaration.name) @declaration.function
22
22
 
23
+ ;; Lambda bindings (\`f = lambda x: x\`). The \`@declaration.function\` anchor
24
+ ;; sits on the INNER lambda so its range aligns with \`(lambda) @scope.function\`
25
+ ;; above; otherwise the def is owned by the module scope and calls inside the
26
+ ;; lambda lose caller attribution. Mirrors the TypeScript arrow patterns (#2687).
27
+ (expression_statement
28
+ (assignment
29
+ left: (identifier) @declaration.name
30
+ right: (lambda) @declaration.function))
31
+
23
32
  (assignment
24
33
  left: (identifier) @declaration.name) @declaration.variable
25
34
 
@@ -21,14 +21,16 @@ import { type SyntaxNode } from '../../utils/ast-helpers.js';
21
21
  export declare function synthesizeReceiverTypeBinding(fnNode: SyntaxNode): CaptureMatch | null;
22
22
  /**
23
23
  * Synthesize class-scope field bindings for the common Python constructor
24
- * injection pattern:
24
+ * injection patterns:
25
25
  *
26
26
  * def __init__(self, service: Service):
27
- * self.service = service
27
+ * self.service = service # from the PARAMETER's annotation
28
+ * self.cache: Cache = build() # from the FIELD's own annotation
29
+ * self.outer = Outer() # from the CONSTRUCTOR called (#2807)
28
30
  *
29
- * An explicit field annotation (`self.service: Service = ...`) is also
30
- * accepted and takes precedence over a parameter annotation. Deliberately do
31
- * not infer from arbitrary unannotated RHS expressions: the receiver resolver
32
- * needs a declared type, not a name-only guess.
31
+ * The three tiers rank in that order — an explicit field annotation beats a
32
+ * parameter annotation, which beats a construction. Anything else is still
33
+ * refused: the receiver resolver needs positive evidence, not a name-only
34
+ * guess from an arbitrary RHS.
33
35
  */
34
36
  export declare function synthesizeConstructorFieldTypeBindings(fnNode: SyntaxNode): CaptureMatch[];
@@ -114,17 +114,79 @@ export function synthesizeReceiverTypeBinding(fnNode) {
114
114
  '@type-binding.type': syntheticCapture('@type-binding.type', first, className),
115
115
  };
116
116
  }
117
+ /**
118
+ * The class name of a direct constructor call — `Outer()` — or `undefined` for
119
+ * anything else. Python has no `new`, so a call is the only syntactic
120
+ * construction form, and a call to a plain name is the shape every other
121
+ * language spells `= new X()`.
122
+ *
123
+ * BARE NAMES ONLY. A dotted callee (`models.User()`, `f.Alpha()`) is refused.
124
+ * The first cut of #2807 returned the callee's full dotted text, on the theory
125
+ * that a dotted name resolves through `QualifiedNameIndex` the way the
126
+ * module-level `u = models.User()` capture in `query.ts` does. Measured on a
127
+ * fixture carrying both shapes, that arm produced no correct edge and did
128
+ * produce wrong ones:
129
+ *
130
+ * - `self.svc = f.Alpha()`, where `Alpha` is a METHOD on an unrelated object
131
+ * and `Alpha` is also a class elsewhere: the dotted lookup matches the
132
+ * TRAILING segment against a same-named class, so `self.svc.ping()` emitted
133
+ * a FABRICATED edge to `Alpha.ping`. The root does not have to be a
134
+ * parameter — a module-level `shared_factory.Alpha()` fabricates the same
135
+ * way — so no test on the root's binding form contains this.
136
+ * - `self.u = models.User()`, the shape the arm was written FOR, emitted no
137
+ * edge with the arm or without it. An instance field's binding lands in
138
+ * CLASS scope, which never reaches the namespace split that makes the
139
+ * module-level local form resolve.
140
+ *
141
+ * Accepted cost, stated plainly: `self.u = models.User()` still does not type
142
+ * its field. It did not before this narrowing either, so nothing that worked is
143
+ * given up — and declining to bind is the doctrine `compound-receiver.ts`
144
+ * states, that a confidently WRONG owner is strictly worse than a missing edge.
145
+ * Re-enabling dotted callees is a RESOLUTION-side change (teach the field path
146
+ * the namespace split that #2826/#2828 is reworking); redoing it here could
147
+ * only re-open the trailing-segment fabrication.
148
+ *
149
+ * This is also why the tier tie-break below can stay last-write-wins: the
150
+ * displacement it used to suffer — `self.conn = Outer()` then
151
+ * `self.conn = Registry.get()`, where the second, dotted, non-type candidate
152
+ * overwrote the real constructor binding at the shared weakest tier and left
153
+ * the field untyped — cannot arise once a dotted callee yields no candidate at
154
+ * all. The weakest tier now ranks only REAL constructions against each other,
155
+ * where the last write in `__init__` genuinely is the live one.
156
+ */
157
+ function constructorCallTypeName(right, receiverName) {
158
+ if (right === null || right.type !== 'call')
159
+ return undefined;
160
+ const callee = right.childForFieldName('function');
161
+ if (callee === null)
162
+ return undefined;
163
+ // An `attribute` callee is the dotted path refused above; `self.p =
164
+ // self.build()` is one instance of it, and a method call is not a
165
+ // construction.
166
+ if (callee.type !== 'identifier')
167
+ return undefined;
168
+ const text = callee.text.trim();
169
+ if (text.length === 0)
170
+ return undefined;
171
+ // `self.p = self()` invokes the instance's own `__call__`. It is a call to a
172
+ // bare name, but that name is the receiver, not a type.
173
+ if (text === receiverName)
174
+ return undefined;
175
+ return text;
176
+ }
117
177
  /**
118
178
  * Synthesize class-scope field bindings for the common Python constructor
119
- * injection pattern:
179
+ * injection patterns:
120
180
  *
121
181
  * def __init__(self, service: Service):
122
- * self.service = service
182
+ * self.service = service # from the PARAMETER's annotation
183
+ * self.cache: Cache = build() # from the FIELD's own annotation
184
+ * self.outer = Outer() # from the CONSTRUCTOR called (#2807)
123
185
  *
124
- * An explicit field annotation (`self.service: Service = ...`) is also
125
- * accepted and takes precedence over a parameter annotation. Deliberately do
126
- * not infer from arbitrary unannotated RHS expressions: the receiver resolver
127
- * needs a declared type, not a name-only guess.
186
+ * The three tiers rank in that order — an explicit field annotation beats a
187
+ * parameter annotation, which beats a construction. Anything else is still
188
+ * refused: the receiver resolver needs positive evidence, not a name-only
189
+ * guess from an arbitrary RHS.
128
190
  */
129
191
  export function synthesizeConstructorFieldTypeBindings(fnNode) {
130
192
  if (fnNode.childForFieldName('name')?.text !== '__init__')
@@ -151,6 +213,17 @@ export function synthesizeConstructorFieldTypeBindings(fnNode) {
151
213
  if (name !== null && annotation !== null)
152
214
  parameterTypes.set(name, annotation.text);
153
215
  }
216
+ // Three evidence tiers for one field, strongest first. A later assignment of
217
+ // the SAME tier still wins (last write in `__init__` is the live one), but a
218
+ // weaker one never displaces a stronger: `self.x: Outer = make()` keeps its
219
+ // annotation even if a later branch does `self.x = Other()`.
220
+ //
221
+ // Same-tier last-write-wins is only sound because `constructorCallTypeName`
222
+ // admits nothing but real constructions into the weakest tier — see the note
223
+ // there on the `self.conn = Registry.get()` displacement it used to allow.
224
+ const TIER_EXPLICIT = 2;
225
+ const TIER_PARAMETER = 1;
226
+ const TIER_CONSTRUCTOR = 0;
154
227
  const candidates = new Map();
155
228
  const stack = [body];
156
229
  while (stack.length > 0) {
@@ -175,21 +248,44 @@ export function synthesizeConstructorFieldTypeBindings(fnNode) {
175
248
  if (object?.type === 'identifier' && object.text === receiverName && field !== null) {
176
249
  const explicitType = node.childForFieldName('type');
177
250
  const parameterType = right?.type === 'identifier' ? parameterTypes.get(right.text) : undefined;
178
- const typeName = explicitType?.text ?? parameterType;
251
+ // `self.x = Outer()` — the type comes from the CONSTRUCTOR being
252
+ // called (#2807). This is not the "arbitrary unannotated RHS" the
253
+ // header warns against: a call to a name that resolves to a class is
254
+ // the same positive evidence every other language reads from
255
+ // `= new X()`, and without it an unannotated instance field could
256
+ // never act as a call receiver at all. Weakest of the three tiers, so
257
+ // an explicit annotation or a parameter annotation still wins.
258
+ const constructedType = explicitType === null && parameterType === undefined
259
+ ? constructorCallTypeName(right, receiverName)
260
+ : undefined;
261
+ const typeName = explicitType?.text ?? parameterType ?? constructedType;
179
262
  if (typeName !== undefined) {
180
263
  const explicit = explicitType !== null;
264
+ const inferredFromConstructor = constructedType !== undefined;
265
+ const tier = explicit
266
+ ? TIER_EXPLICIT
267
+ : inferredFromConstructor
268
+ ? TIER_CONSTRUCTOR
269
+ : TIER_PARAMETER;
181
270
  const existing = candidates.get(field.text);
182
- if (existing === undefined || explicit || !existing.explicit) {
271
+ if (existing === undefined || tier >= existing.tier) {
183
272
  candidates.set(field.text, {
184
- explicit,
273
+ tier,
185
274
  match: {
186
275
  '@type-binding.name': syntheticCapture('@type-binding.name', field, field.text),
187
276
  '@type-binding.type': syntheticCapture('@type-binding.type', explicitType ?? right ?? field, typeName),
277
+ // The marker that tells `interpretPythonTypeBinding` which
278
+ // tier this is; an explicit annotation carries neither and
279
+ // reads as `annotation`.
188
280
  ...(explicit
189
281
  ? {}
190
- : {
191
- '@type-binding.parameter': syntheticCapture('@type-binding.parameter', right ?? field, '1'),
192
- }),
282
+ : inferredFromConstructor
283
+ ? {
284
+ '@type-binding.constructor': syntheticCapture('@type-binding.constructor', right ?? field, '1'),
285
+ }
286
+ : {
287
+ '@type-binding.parameter': syntheticCapture('@type-binding.parameter', right ?? field, '1'),
288
+ }),
193
289
  '@type-binding.instance-field': syntheticCapture('@type-binding.instance-field', node, '1'),
194
290
  },
195
291
  });
@@ -14,24 +14,37 @@
14
14
  import { SupportedLanguages } from '../../../../_shared/index.js';
15
15
  import { buildMro, defaultLinearize } from '../../scope-resolution/passes/mro.js';
16
16
  import { populateClassOwnedMembers } from '../../scope-resolution/scope/walkers.js';
17
+ import { indexOnlyElementType } from '../../type-extractors/shared.js';
17
18
  import { pythonProvider } from '../python.js';
18
- import { pythonArityCompatibility, pythonMergeBindings, resolvePythonImportTarget, } from './index.js';
19
+ import { isPythonImportedModule, pythonNamespaceReceiverPaths, pythonArityCompatibility, pythonMergeBindings, resolvePythonImportTarget, } from './index.js';
19
20
  const pythonScopeResolver = {
21
+ // A free call naming a class constructs it: `Service(db).do_work()` (#2708).
22
+ constructionSyntax: { bare: true },
20
23
  language: SupportedLanguages.Python,
21
24
  languageProvider: pythonProvider,
22
25
  importEdgeReason: 'python-scope: import',
23
- resolveImportTarget: (targetRaw, fromFile, allFilePaths) => {
26
+ resolveImportTarget: (targetRaw, fromFile, allFilePaths, _resolutionConfig, context) => {
24
27
  // Pass the orchestrator's stable run-level `ReadonlySet` straight through
25
28
  // (no per-import copy). The Python resolver chain only reads the set, and
26
29
  // `getPythonFileIndex` memoizes its index on the set's identity via a
27
30
  // WeakMap — so the index is built once per run and reused across every
28
31
  // import. Copying here (the previous `new Set(allFilePaths)`) handed a
29
32
  // fresh identity to every import, defeating that cache (PR #1918 review P1).
30
- const ws = { fromFile, allFilePaths };
33
+ const ws = {
34
+ fromFile,
35
+ allFilePaths,
36
+ parsedFiles: context?.parsedFiles,
37
+ };
31
38
  // `WorkspaceIndex` is an opaque `unknown` placeholder in the
32
39
  // shared contract, so `ws` passes structurally without a cast.
33
- return resolvePythonImportTarget({ kind: 'named', localName: '_', importedName: '_', targetRaw }, ws);
40
+ return resolvePythonImportTarget(context?.parsedImport ?? { kind: 'namespace', localName: '_', importedName: '_', targetRaw }, ws);
34
41
  },
42
+ isNamespaceImport: (parsedImport, targetFile, fromFile) => isPythonImportedModule(parsedImport, targetFile, fromFile),
43
+ // `import a.b.c` binds only `a`, yet makes `a`, `a.b` and `a.b.c` all
44
+ // callable — each naming a different file. Without this the absolute-import
45
+ // style is invisible to the call graph, and the root key points at the leaf
46
+ // module instead of the package (#2826).
47
+ namespaceReceiverPaths: pythonNamespaceReceiverPaths,
35
48
  // Python LEGB precedence: local > import/namespace/reexport > wildcard.
36
49
  // The per-scope id is unused by pythonMergeBindings (tier ordering
37
50
  // is computed purely from BindingRef.origin), so we don't need to
@@ -45,6 +58,16 @@ const pythonScopeResolver = {
45
58
  buildMro: (graph, parsedFiles, nodeLookup) => buildMro(graph, parsedFiles, nodeLookup, defaultLinearize),
46
59
  populateOwners: (parsed) => populateClassOwnedMembers(parsed),
47
60
  isSuperReceiver: (text) => /^super\s*\(/.test(text),
61
+ // Subscript route only — Python spells collection views as method calls
62
+ // (`.values()`), which the compound resolver's call branch already handles.
63
+ //
64
+ // The hook receives the annotation AS WRITTEN (`List[User]`, `Dict[str, User]`),
65
+ // not the name `interpret.ts`'s `stripGeneric` reduced it to, so `undefined`
66
+ // here means "this spelling is not a container" — which is what stops
67
+ // `cfg['k'].run()` on a `__getitem__`-bearing class from folding onto the
68
+ // class itself. Answering the route at all is what keeps `repos[0].save()`
69
+ // resolving.
70
+ elementTypeOf: indexOnlyElementType,
48
71
  // Python is dynamically typed — field-fallback heuristic on, return-
49
72
  // type propagation across imports on. Both default to true; listed
50
73
  // explicitly here for documentation.
@@ -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')
@@ -21,14 +22,7 @@ export function pythonFunctionDefinitionLabel(functionNode, defaultLabel) {
21
22
  * field type on the enclosing Class scope. */
22
23
  export function pythonBindingScopeFor(decl, innermost, tree) {
23
24
  if (decl['@type-binding.instance-field'] !== undefined) {
24
- let current = innermost;
25
- while (current !== undefined) {
26
- if (current.kind === 'Class')
27
- return current.id;
28
- if (current.parent === null)
29
- break;
30
- current = tree.getScope(current.parent);
31
- }
25
+ return walkToScope(innermost, tree, 'Class');
32
26
  }
33
27
  return null;
34
28
  }
@@ -28,6 +28,7 @@ import { createPythonCfgVisitor } from '../cfg/visitors/python.js';
28
28
  import { emitPythonScopeCaptures, pythonFunctionDefinitionLabel, interpretPythonImport, interpretPythonTypeBinding, pythonArityCompatibility, pythonBindingScopeFor, pythonImportOwningScope, pythonMergeBindings, pythonReceiverBinding, resolvePythonImportTarget, } from './python/index.js';
29
29
  import { extractDjangoRoutes } from '../route-extractors/django.js';
30
30
  import { discoverDjangoRootUrls } from '../route-extractors/django-root-discovery.js';
31
+ import { extractPythonModuleConstants } from '../route-extractors/python-const-resolver.js';
31
32
  const BUILT_INS = new Set([
32
33
  'print',
33
34
  'len',
@@ -134,4 +135,16 @@ export const pythonProvider = defineLanguage({
134
135
  receiverBinding: pythonReceiverBinding,
135
136
  arityCompatibility: pythonArityCompatibility,
136
137
  resolveImportTarget: resolvePythonImportTarget,
138
+ // ── #2391 constant harvest, provider-hook form (#2980): module-level string
139
+ // constants + from-imports for non-literal decorator route paths. Bare-name
140
+ // refs fold through the shared resolver (no foldRoutePathOperands needed).
141
+ // No `moduleConstantHeuristic`: Python harvests unconditionally, exactly as
142
+ // #2391 shipped it. A content gate was tried here and removed on review — it
143
+ // required `NAME` immediately followed by `=`, so it silently dropped the two
144
+ // idiomatic typed-FastAPI shapes (`API: str = "/api"`,
145
+ // `API: Final[str] = "/api"`) and every composed constant whose RHS starts
146
+ // with an identifier (`USERS = BASE + "/users"`), i.e. it REGRESSED routes
147
+ // that already resolve on main. The worker treats a missing heuristic as
148
+ // default-open; only Java opts into a gate, where the cost actually bites.
149
+ extractModuleConstants: extractPythonModuleConstants,
137
150
  });