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
@@ -34,9 +34,24 @@
34
34
  * as `ownedDefs` + a local `BindingRef { origin: 'local' }`.
35
35
  * 3. **Collect raw imports.** Walk `@import.*` matches. Call
36
36
  * `provider.interpretImport` per match; attach the returned
37
- * `ParsedImport` to the ParsedFile (not to any `Scope` — finalize
38
- * reconstructs the owning scope via `provider.importOwningScope`
39
- * during Phase 2).
37
+ * `ParsedImport` to the ParsedFile — not to any `Scope`.
38
+ * `provider.importOwningScope` is declared on `LanguageProvider` and
39
+ * implemented by a dozen providers, but has no call site anywhere; this
40
+ * step's output is a flat per-file list.
41
+ *
42
+ * One scope fact is read before that list flattens it away:
43
+ * `runsOnlyWhenCalled`, set when the statement sits anywhere inside a
44
+ * `Function`. It is decided here because here is the last stage that can
45
+ * — finalize receives the flat list, and its consumer receives a map
46
+ * keyed by the file's Module scope only (see
47
+ * `ParsedImport.runsOnlyWhenCalled`). This is a position fact, not a
48
+ * syntax one, so it is decided centrally for every language rather than
49
+ * per provider — with one capability a provider may declare to opt out
50
+ * of it entirely, `importsExecuteWhereWritten: false`, because position
51
+ * cannot defer an import that never executes (C/C++ `#include`, Rust
52
+ * `use`, COBOL `COPY`). Providers still decide their own *syntactic* nesting
53
+ * facts in their capture emitters, where the node is in hand (see
54
+ * `languages/python/import-decomposer.ts`).
40
55
  * 4. **Collect type bindings.** Walk `@type-binding.*` matches. Call
41
56
  * `provider.interpretTypeBinding` per match. Attach the resulting
42
57
  * `TypeRef` to the innermost containing scope's `typeBindings`
@@ -59,7 +74,9 @@
59
74
  * - `ParsedFile.referenceSites` — pre-resolution usage facts.
60
75
  */
61
76
  import { buildPositionIndex, buildScopeTree, canParentScope, makeScopeId } from '../../_shared/index.js';
62
- import { extractTemplateArguments } from './utils/template-arguments.js';
77
+ import { isValidReceiverChain } from './utils/receiver-chain-codec.js';
78
+ import { extractTemplateArguments, stripTrailingCallSuffix, typeApplicationArguments, } from './utils/template-arguments.js';
79
+ import { parseTypeParameterList } from './utils/type-parameters.js';
63
80
  // ─── Public entry point ─────────────────────────────────────────────────────
64
81
  /**
65
82
  * Drive the five extraction passes and return a `ParsedFile`.
@@ -84,7 +101,11 @@ export function extract(matches, filePath, provider) {
84
101
  for (let i = 0; i < scopeDrafts.length; i++) {
85
102
  const d = scopeDrafts[i];
86
103
  if (d.parent === null && d.kind !== 'Module') {
87
- scopeDrafts[i] = makeDraft(d.id, moduleScope.id, d.kind, d.range, d.filePath);
104
+ // `ownsReceivers` must be carried across: it is decided from the scope's
105
+ // own capture in pass 1 and re-parenting does not change what the scope
106
+ // binds. Dropping it here would silently un-mark every function scope in
107
+ // a file whose root parsed as ERROR (the only way a scope is orphaned).
108
+ scopeDrafts[i] = makeDraft(d.id, moduleScope.id, d.kind, d.range, d.filePath, d.ownsReceivers, d.lexicalNames);
88
109
  }
89
110
  }
90
111
  const scopes = scopeDrafts.map(draftToScope);
@@ -105,12 +126,17 @@ export function extract(matches, filePath, provider) {
105
126
  pass2AttachDeclarations(partitioned.declaration, scopeDrafts, positionIndex, localDefs, filePath, provider, scopeTree);
106
127
  // ── Pass 3: collect raw imports ─────────────────────────────────────
107
128
  const parsedImports = [];
108
- pass3CollectImports(partitioned.import_, parsedImports, provider);
129
+ pass3CollectImports(partitioned.import_, positionIndex, filePath, parsedImports, provider, scopeTree);
109
130
  // ── Pass 4: collect type bindings ───────────────────────────────────
110
131
  pass4CollectTypeBindings(partitioned.typeBinding, scopeDrafts, positionIndex, filePath, provider, scopeTree);
111
132
  // ── Pass 5: collect reference sites ─────────────────────────────────
112
133
  const referenceSites = [];
113
134
  pass5CollectReferences(partitioned.reference, positionIndex, filePath, referenceSites, provider, scopeTree);
135
+ // ── Pass 6: collect normalized callable-value-flow facts ───────────
136
+ // Kept after (and independent from) Pass 5 so existing reference-site
137
+ // extraction remains byte-identical.
138
+ const callableFlowSites = [];
139
+ pass6CollectCallableFlows(partitioned.callableFlow, positionIndex, filePath, callableFlowSites);
114
140
  // Freeze Scope drafts into final shape and return.
115
141
  const frozenScopes = scopeDrafts.map(draftToScope);
116
142
  return Object.freeze({
@@ -120,12 +146,15 @@ export function extract(matches, filePath, provider) {
120
146
  parsedImports: Object.freeze(parsedImports.slice()),
121
147
  localDefs: Object.freeze(localDefs.slice()),
122
148
  referenceSites: Object.freeze(referenceSites.slice()),
149
+ ...(callableFlowSites.length > 0
150
+ ? { callableFlowSites: Object.freeze(callableFlowSites.slice()) }
151
+ : {}),
123
152
  });
124
153
  }
125
154
  /**
126
- * Bucket each match by the topic of its anchor capture. The anchor is the
127
- * capture whose name is prefixed with the match's topic (`@scope.*`,
128
- * `@declaration.*`, `@import.*`, `@type-binding.*`, `@reference.*`).
155
+ * Bucket each match by every topic represented by its anchor captures. An
156
+ * emitter may deliberately group a lexical scope and its declaration in one
157
+ * match so both passes observe the exact same source range.
129
158
  *
130
159
  * A match may contain additional captures (e.g., `@import.source`,
131
160
  * `@declaration.class.name`) that are used by the provider hooks to
@@ -138,49 +167,50 @@ function partitionByTopic(matches) {
138
167
  const import_ = [];
139
168
  const typeBinding = [];
140
169
  const reference = [];
170
+ const callableFlow = [];
141
171
  for (const match of matches) {
142
- const topic = topicOf(match);
143
- switch (topic) {
144
- case 'scope':
145
- scope.push(match);
146
- break;
147
- case 'declaration':
148
- declaration.push(match);
149
- break;
150
- case 'import':
151
- import_.push(match);
152
- break;
153
- case 'type-binding':
154
- typeBinding.push(match);
155
- break;
156
- case 'reference':
157
- reference.push(match);
158
- break;
159
- case 'unknown':
160
- // Unrecognized anchor — silently skip. Providers may emit extra
161
- // captures (e.g., `@comment`) that the extractor has no topic for.
162
- break;
172
+ for (const topic of topicsOf(match)) {
173
+ switch (topic) {
174
+ case 'scope':
175
+ scope.push(match);
176
+ break;
177
+ case 'declaration':
178
+ declaration.push(match);
179
+ break;
180
+ case 'import':
181
+ import_.push(match);
182
+ break;
183
+ case 'type-binding':
184
+ typeBinding.push(match);
185
+ break;
186
+ case 'reference':
187
+ reference.push(match);
188
+ break;
189
+ case 'callable-flow':
190
+ callableFlow.push(match);
191
+ break;
192
+ }
163
193
  }
164
194
  }
165
- return { scope, declaration, import_, typeBinding, reference };
195
+ return { scope, declaration, import_, typeBinding, reference, callableFlow };
166
196
  }
167
- function topicOf(match) {
168
- // The anchor is the capture whose name uses one of the known topic
169
- // prefixes. For multi-capture matches, ALL captures share the topic;
170
- // we pick the first matching key for efficiency.
197
+ function topicsOf(match) {
198
+ const topics = new Set();
171
199
  for (const name of Object.keys(match)) {
172
200
  if (name.startsWith('@scope.'))
173
- return 'scope';
174
- if (name.startsWith('@declaration.'))
175
- return 'declaration';
176
- if (name.startsWith('@import.'))
177
- return 'import';
178
- if (name.startsWith('@type-binding.'))
179
- return 'type-binding';
180
- if (name.startsWith('@reference.'))
181
- return 'reference';
182
- }
183
- return 'unknown';
201
+ topics.add('scope');
202
+ else if (name.startsWith('@declaration.'))
203
+ topics.add('declaration');
204
+ else if (name.startsWith('@import.'))
205
+ topics.add('import');
206
+ else if (name.startsWith('@type-binding.'))
207
+ topics.add('type-binding');
208
+ else if (name.startsWith('@reference.'))
209
+ topics.add('reference');
210
+ else if (name.startsWith('@callable-flow.'))
211
+ topics.add('callable-flow');
212
+ }
213
+ return topics;
184
214
  }
185
215
  function ensureModuleScope(scopeDrafts, filePath, allMatches) {
186
216
  const moduleScope = scopeDrafts.find((s) => s.kind === 'Module');
@@ -221,6 +251,8 @@ function draftToScope(draft) {
221
251
  ownedDefs: Object.freeze(draft.ownedDefs.slice()),
222
252
  imports: Object.freeze(draft.imports.slice()),
223
253
  typeBindings: new Map(draft.typeBindings),
254
+ lexicalNames: draft.lexicalNames,
255
+ ownsReceivers: draft.ownsReceivers,
224
256
  };
225
257
  }
226
258
  // ─── Pass 1: build scope tree ──────────────────────────────────────────────
@@ -274,7 +306,7 @@ function pass1BuildScopes(matches, filePath, provider) {
274
306
  stack.pop();
275
307
  }
276
308
  const parent = stack.length > 0 ? stack[stack.length - 1].id : null;
277
- drafts.push(makeDraft(cand.id, parent, cand.kind, cand.range, filePath));
309
+ drafts.push(makeDraft(cand.id, parent, cand.kind, cand.range, filePath, provider.scopeOwnsReceivers?.(cand.match), parseScopeLexicalNames(cand.match)));
278
310
  stack.push(cand);
279
311
  }
280
312
  return drafts;
@@ -299,11 +331,13 @@ function resolveKindForScopeMatch(match, anchor, provider) {
299
331
  return 'Block';
300
332
  case 'expression':
301
333
  return 'Expression';
334
+ case 'object':
335
+ return 'Object';
302
336
  default:
303
337
  return null;
304
338
  }
305
339
  }
306
- function makeDraft(id, parent, kind, range, filePath) {
340
+ function makeDraft(id, parent, kind, range, filePath, ownsReceivers, lexicalNames) {
307
341
  return {
308
342
  id,
309
343
  parent,
@@ -314,13 +348,35 @@ function makeDraft(id, parent, kind, range, filePath) {
314
348
  ownedDefs: [],
315
349
  imports: [],
316
350
  typeBindings: new Map(),
351
+ lexicalNames,
352
+ ownsReceivers,
317
353
  };
318
354
  }
355
+ function parseScopeLexicalNames(match) {
356
+ const raw = match['@scope.lexical-names']?.text;
357
+ if (raw === undefined)
358
+ return undefined;
359
+ try {
360
+ const parsed = JSON.parse(raw);
361
+ if (!Array.isArray(parsed))
362
+ return undefined;
363
+ const names = parsed.filter((name) => typeof name === 'string' && name.length > 0);
364
+ return names.length > 0 ? new Set(names) : undefined;
365
+ }
366
+ catch {
367
+ return undefined;
368
+ }
369
+ }
319
370
  // ─── Pass 2: attach declarations + local bindings ──────────────────────────
320
371
  function pass2AttachDeclarations(matches, drafts, positionIndex, localDefs, filePath, provider, scopeTree) {
321
372
  const draftById = new Map();
322
373
  for (const d of drafts)
323
374
  draftById.set(d.id, d);
375
+ // First def seen per `nodeId`, for the duplicate backfill below. Two query
376
+ // patterns can legitimately match ONE declaration — a C++ templated struct
377
+ // matches both the standalone `struct_specifier` rule and the
378
+ // `template_declaration` rule that wraps it — and both mint the same def id.
379
+ const firstDefByNodeId = new Map();
324
380
  for (const match of matches) {
325
381
  const anchor = anchorCaptureFor(match, '@declaration.');
326
382
  if (anchor === undefined)
@@ -328,6 +384,32 @@ function pass2AttachDeclarations(matches, drafts, positionIndex, localDefs, file
328
384
  const def = buildDefFromDeclarationMatch(match, anchor, filePath);
329
385
  if (def === undefined)
330
386
  continue;
387
+ // ── Duplicate-declaration backfill ───────────────────────────────────────
388
+ // `buildDefIndex` is FIRST-WRITE-WINS, so when one declaration produces two
389
+ // defs under one id, whichever match tree-sitter reported first is the one
390
+ // resolution sees. That was harmless while the twins were byte-identical.
391
+ // It stops being harmless the moment one twin can carry a field the other
392
+ // structurally cannot: a C++ `template <class T> struct Vec` has its
393
+ // parameter list on the ENCLOSING `template_declaration`, so the standalone
394
+ // `struct_specifier` twin can never see it, and match order would silently
395
+ // decide whether `Vec` remembers `T`. Source order deciding a resolution
396
+ // fact is the failure mode this subsystem rejects everywhere else.
397
+ //
398
+ // Copying the field onto BOTH twins makes the outcome identical whichever
399
+ // one wins. Deliberately narrow — only `typeParameters`, the one field with
400
+ // an asymmetric twin today. Widening this to "merge all metadata" would
401
+ // change what every existing duplicate resolves to, which is a different
402
+ // change with a different blast radius and no evidence behind it yet.
403
+ const first = firstDefByNodeId.get(def.nodeId);
404
+ if (first === undefined) {
405
+ firstDefByNodeId.set(def.nodeId, def);
406
+ }
407
+ else if (first.typeParameters === undefined && def.typeParameters !== undefined) {
408
+ first.typeParameters = def.typeParameters;
409
+ }
410
+ else if (def.typeParameters === undefined && first.typeParameters !== undefined) {
411
+ def.typeParameters = first.typeParameters;
412
+ }
331
413
  // Find the innermost scope that contains the declaration's anchor range.
332
414
  const innermostId = positionIndex.atPosition(filePath, anchor.range.startLine, anchor.range.startCol);
333
415
  if (innermostId === undefined)
@@ -398,8 +480,15 @@ function buildDefFromDeclarationMatch(match, anchor, filePath) {
398
480
  const declaredType = match['@declaration.field-type']?.text;
399
481
  const returnType = match['@declaration.return-type']?.text;
400
482
  const templateConstraints = parseJsonCapture(match['@declaration.template-constraints']);
483
+ // The DECLARED parameters, a different axis from `templateArguments` above:
484
+ // that reads the arguments written on the name, this reads the list the
485
+ // declaration was written in terms of. A declaration can carry both, and for a
486
+ // C++ partial specialization the pairing is the only thing that tells it apart
487
+ // from a full specialization with the identical arguments.
488
+ const typeParameters = parseTypeParameterList(match['@declaration.type-parameters']?.text ?? '');
401
489
  const isExplicit = parseBooleanCapture(match['@declaration.is-explicit']);
402
490
  const isDeleted = parseBooleanCapture(match['@declaration.is-deleted']);
491
+ const isSynthetic = parseBooleanCapture(match['@declaration.is-synthetic']);
403
492
  return {
404
493
  nodeId: makeDefId(filePath, anchor.range, type, nameCap.text),
405
494
  filePath,
@@ -412,9 +501,11 @@ function buildDefFromDeclarationMatch(match, anchor, filePath) {
412
501
  ...(declaredType !== undefined ? { declaredType } : {}),
413
502
  ...(returnType !== undefined ? { returnType } : {}),
414
503
  ...(templateArguments !== undefined ? { templateArguments } : {}),
504
+ ...(typeParameters !== undefined ? { typeParameters } : {}),
415
505
  ...(templateConstraints !== undefined ? { templateConstraints } : {}),
416
506
  ...(isExplicit === true ? { isExplicit: true } : {}),
417
507
  ...(isDeleted === true ? { isDeleted: true } : {}),
508
+ ...(isSynthetic === true ? { isSynthetic: true } : {}),
418
509
  };
419
510
  }
420
511
  /** Parse an opaque JSON payload synthesized by per-language captures
@@ -511,7 +602,8 @@ function parseJsonStringArrayCapture(cap) {
511
602
  }
512
603
  }
513
604
  function deriveDeclarationName(match, def) {
514
- const nameCap = match['@declaration.name'] ??
605
+ const nameCap = match['@declaration.binding-name'] ??
606
+ match['@declaration.name'] ??
515
607
  match[Object.keys(match).find((k) => k.startsWith('@declaration.') && k.endsWith('.name')) ?? ''];
516
608
  if (nameCap !== undefined)
517
609
  return nameCap.text;
@@ -574,6 +666,8 @@ function normalizeNodeLabel(kindStr) {
574
666
  return 'Annotation';
575
667
  case 'namespace':
576
668
  return 'Namespace';
669
+ case 'program':
670
+ return 'Module';
577
671
  case 'macro':
578
672
  return 'Macro';
579
673
  default:
@@ -637,9 +731,74 @@ function makeDefId(filePath, range, type, name) {
637
731
  return `def:${filePath}#${range.startLine}:${range.startCol}:${type}:${name}`;
638
732
  }
639
733
  // ─── Pass 3: collect raw imports ───────────────────────────────────────────
640
- function pass3CollectImports(matches, parsedImports, provider) {
734
+ /**
735
+ * Does this import run only when something calls the function it sits in?
736
+ *
737
+ * Walks the scope chain to the file root rather than reading the immediate
738
+ * kind, because the immediate kind is not enough in either direction. A `Block`
739
+ * at the top of a module (`if (FLAG) { require('./x'); }`) runs during
740
+ * initialization; the same `Block` inside a function does not. `Class`,
741
+ * `Namespace`, `Expression` and `Object` bodies execute where they are defined,
742
+ * so they are initialization-time too. Only an enclosing `Function` — anywhere
743
+ * up the chain — defers execution.
744
+ *
745
+ * Language-agnostic on purpose: it is what catches Python's
746
+ * `def f(): from x import Y`, Ruby's `def f; require 'x'; end` and a CommonJS
747
+ * `require()` in a function body, none of which any `kind` marks as deferred —
748
+ * only their position says it.
749
+ *
750
+ * The rule is about EXECUTION, so it does not hold for a language whose
751
+ * imports are not executed statements at all — a C/C++ `#include` (spliced by
752
+ * the preprocessor before the program runs) or a Rust `use` (a compile-time
753
+ * path alias). Both are legal inside a function body and neither is deferred
754
+ * by sitting there, so a cycle they form is REAL. Marking one deferred would
755
+ * make `check --cycles` drop that cycle, and suppressing a true cycle is the
756
+ * failure direction that matters. Such a language opts out by declaring
757
+ * `LanguageProvider.importsExecuteWhereWritten: false`, checked by the caller
758
+ * — the capability is named on the provider rather than the language being
759
+ * named here, because shared ingestion code must not branch on language
760
+ * (AGENTS.md).
761
+ *
762
+ * Decided HERE and nowhere later because this is the last stage that knows the
763
+ * answer — see `ParsedImport.runsOnlyWhenCalled` for why finalize and the graph
764
+ * bridge cannot recover it.
765
+ */
766
+ function runsOnlyWhenCalled(scopeTree, scopeId) {
767
+ // Inline rather than `utils/scope-tree-walk.ts`'s `walkToScope`, which is the
768
+ // shared primitive for exactly this climb and IS the right call everywhere it
769
+ // is used today — five `bindingScopeFor` hooks, all per-BINDING. This runs per
770
+ // IMPORT on every file of every analyze, and `walkToScope` takes `...kinds`
771
+ // and builds `new Set(kinds)` per call: measured on this host, 1.0 ns inline
772
+ // against 32.3 ns through the helper for the module-level case that is ~99% of
773
+ // imports, plus ~232 B of allocation each. Rewriting the helper's membership
774
+ // test as `kinds.includes` takes it to 8.8 ns — still 8x, because the rest
775
+ // array allocates regardless. Reuse loses to a two-field loop here; it would
776
+ // not on a colder path.
777
+ //
778
+ // No depth cap: the chain is acyclic by construction, since `buildScopeTree`
779
+ // only parents a scope to one that STRICTLY contains it.
780
+ let current = scopeId;
781
+ while (current !== null) {
782
+ const scope = scopeTree.getScope(current);
783
+ if (scope === undefined)
784
+ return false;
785
+ if (scope.kind === 'Function')
786
+ return true;
787
+ current = scope.parent;
788
+ }
789
+ return false;
790
+ }
791
+ function pass3CollectImports(matches, positionIndex, filePath, parsedImports, provider, scopeTree) {
641
792
  if (provider.interpretImport === undefined)
642
793
  return;
794
+ // Hoisted: the capability is a property of the language, identical for every
795
+ // match in the file. A provider that declares its imports do not execute
796
+ // where they are written (C/C++ `#include`, Rust `use`, COBOL `COPY`) skips
797
+ // the position walk entirely — position cannot defer something that never
798
+ // runs, and marking one deferred would hide a real cycle. Absent reads as
799
+ // `true`, so an undeclared provider is unchanged. See
800
+ // `LanguageProvider.importsExecuteWhereWritten`.
801
+ const positionCanDefer = provider.importsExecuteWhereWritten !== false;
643
802
  for (const match of matches) {
644
803
  const anchor = anchorCaptureFor(match, '@import.');
645
804
  if (anchor === undefined)
@@ -647,10 +806,24 @@ function pass3CollectImports(matches, parsedImports, provider) {
647
806
  const parsed = provider.interpretImport(match);
648
807
  if (parsed === null)
649
808
  continue;
650
- parsedImports.push(parsed);
809
+ // The statement's own position, resolved to the innermost scope holding
810
+ // it. An unlocatable anchor leaves the import unmarked, which reads as
811
+ // "runs at initialization" — the fail-safe direction, since it can only
812
+ // make `check --cycles` over-report.
813
+ const inScopeId = positionCanDefer
814
+ ? positionIndex.atPosition(filePath, anchor.range.startLine, anchor.range.startCol)
815
+ : undefined;
816
+ const deferred = inScopeId !== undefined && runsOnlyWhenCalled(scopeTree, inScopeId);
817
+ parsedImports.push(deferred ? { ...parsed, runsOnlyWhenCalled: true } : parsed);
651
818
  }
652
819
  }
653
820
  // ─── Pass 4: collect type bindings ─────────────────────────────────────────
821
+ /** Cap on the retained as-written annotation. Real container spellings are a
822
+ * handful of characters; a multi-line mapped/conditional type is neither a
823
+ * container any `elementTypeOf` parses nor worth keeping one copy of per
824
+ * binding on a kernel-scale repo. Over the cap the spelling is dropped, which
825
+ * makes an index step decline — the safe direction. */
826
+ const MAX_DECLARED_SPELLING_LENGTH = 256;
654
827
  function pass4CollectTypeBindings(matches, drafts, positionIndex, filePath, provider, scopeTree) {
655
828
  const draftById = new Map();
656
829
  for (const d of drafts)
@@ -680,11 +853,39 @@ function pass4CollectTypeBindings(matches, drafts, positionIndex, filePath, prov
680
853
  // `bindingScopeFor` may hoist the type binding to an outer scope.
681
854
  const hostId = provider.bindingScopeFor?.(match, draftToScope(innermost), scopeTree) ?? autoHostedId;
682
855
  const host = draftById.get(hostId) ?? innermost;
683
- const typeRef = {
684
- rawName: parsed.rawTypeName,
685
- declaredAtScope: host.id,
686
- source: parsed.source,
687
- };
856
+ // The annotation as the source wrote it, kept only when the provider's
857
+ // interpretation is not already it. `interpretTypeBinding` normalizes
858
+ // container spellings away (`User[]` → `User`, `List[User]` → `User`,
859
+ // `[]*User` → `User`), which makes a reduced container indistinguishable
860
+ // from a class of the same name — and an index step folding on that
861
+ // ambiguity typed `grid[0]` as `Grid`. Read at the one place the
862
+ // distinction matters; see `TypeRef.declaredSpelling`.
863
+ //
864
+ // Read from the capture rather than from `ParsedTypeBinding` deliberately:
865
+ // `@type-binding.type` is the shared anchor EVERY provider already reads to
866
+ // build `rawTypeName`, so nothing has to be threaded through fourteen
867
+ // interpreters (and none can forget to).
868
+ // A provider may override when its grammar keeps part of the written type
869
+ // outside `@type-binding.type` (C++ hangs `*` on the declarator).
870
+ const writtenType = (parsed.declaredSpelling ?? match['@type-binding.type']?.text)?.trim();
871
+ const declaredSpelling = writtenType !== undefined &&
872
+ writtenType.length > 0 &&
873
+ writtenType.length <= MAX_DECLARED_SPELLING_LENGTH &&
874
+ writtenType !== parsed.rawTypeName
875
+ ? writtenType
876
+ : undefined;
877
+ const typeRef = declaredSpelling === undefined
878
+ ? {
879
+ rawName: parsed.rawTypeName,
880
+ declaredAtScope: host.id,
881
+ source: parsed.source,
882
+ }
883
+ : {
884
+ rawName: parsed.rawTypeName,
885
+ declaredSpelling,
886
+ declaredAtScope: host.id,
887
+ source: parsed.source,
888
+ };
688
889
  // Prefer stronger sources when multiple matches fire for the same
689
890
  // bound name in the same scope. Example: `u: User = find()` matches
690
891
  // both the annotation and constructor-inferred patterns; the explicit
@@ -757,13 +958,15 @@ function followChainedRef(start, draftById) {
757
958
  * name in the same scope. Higher number wins; ties keep the later match
758
959
  * (last-write-wins preserves historical order within a tier).
759
960
  *
760
- * Rationale: explicit annotations always beat inferred ones because they
761
- * reflect user intent. `self`/`cls` are treated as strongly as annotations
762
- * because they are language-required receiver types.
961
+ * Rationale: explicit variable and field annotations always beat bindings
962
+ * derived from parameter annotations or inference because they reflect the
963
+ * most specific user intent. `self`/`cls` are treated as strongly as other
964
+ * declared types because they are language-required receiver types.
763
965
  */
764
966
  function typeBindingStrength(source) {
765
967
  switch (source) {
766
968
  case 'annotation':
969
+ return 3;
767
970
  case 'parameter-annotation':
768
971
  case 'return-annotation':
769
972
  case 'self':
@@ -791,6 +994,11 @@ function pass5CollectReferences(matches, positionIndex, filePath, referenceSites
791
994
  // sibling via the full-path QualifiedNameIndex before the simple-tail walk
792
995
  // (#1982). Absent for unqualified references — resolution stays unchanged.
793
996
  const qualifiedCap = match['@reference.qualified-name'];
997
+ // Generic ARGUMENTS written on a heritage reference (`: IValidator<string>`);
998
+ // `inherits` only, because a call/read/write anchor spans the whole call
999
+ // expression, whose `<…>` would be an argument list, a comparison, or
1000
+ // nothing at all — widening the kind would mint confident nonsense (#2912).
1001
+ const typeArguments = kind === 'inherits' ? heritageTypeArguments(match, anchor, nameCap) : undefined;
794
1002
  const inScopeId = positionIndex.atPosition(filePath, anchor.range.startLine, anchor.range.startCol);
795
1003
  if (inScopeId === undefined)
796
1004
  continue;
@@ -801,6 +1009,28 @@ function pass5CollectReferences(matches, positionIndex, filePath, referenceSites
801
1009
  const arity = extractArity(match);
802
1010
  const argumentTypes = extractArgumentTypes(match);
803
1011
  const argumentTypeClasses = parseJsonParameterTypeClassesCapture(match['@reference.parameter-type-classes']);
1012
+ // Object-literal key for value-ref sites (`{ key: fn }` / shorthand);
1013
+ // consumed by the property-dispatch pass (#2437).
1014
+ const propertyKeyCap = match['@reference.property-key'];
1015
+ // Compact receiver chain, when the emitter produced one. Validated HERE as
1016
+ // well as at the store boundary: bounds applied only on load are a
1017
+ // recurring defect in this codebase — the writer keeps minting payloads the
1018
+ // reader keeps rejecting, which is a permanent warm-cache-miss reparse loop
1019
+ // that logs nothing.
1020
+ const receiverChain = extractReceiverChain(match);
1021
+ // Callee-position marker: a member-read capture that is actually the callee
1022
+ // of an enclosing call (`obj.f` in `obj.f()`). Recorded, not acted on —
1023
+ // whether the read is a phantom or a genuine func-typed-field read depends
1024
+ // on the resolved tail's kind, which only edge emission knows. Emitted by
1025
+ // languages whose read pattern has no call-position exclusion; absent
1026
+ // everywhere else, so the site stays byte-identical for them.
1027
+ const inCalleePosition = match['@reference.callee-position'] !== undefined;
1028
+ // Pointer-embedding marker: `struct S { *T }` rather than `struct S { T }`.
1029
+ // Recorded, not acted on — Go's method-set rules make the two forms differ
1030
+ // (see `ReferenceSite.embeddedAsPointer`), and only structural interface
1031
+ // detection knows what to do with that. Absent for every language without
1032
+ // pointer embedding, so their sites stay byte-identical.
1033
+ const embeddedAsPointer = match['@reference.embedded-pointer'] !== undefined;
804
1034
  const site = {
805
1035
  name: nameCap.text,
806
1036
  atRange: anchor.range,
@@ -809,15 +1039,68 @@ function pass5CollectReferences(matches, positionIndex, filePath, referenceSites
809
1039
  ...(qualifiedCap?.text !== undefined && qualifiedCap.text.length > 0
810
1040
  ? { rawQualifiedName: qualifiedCap.text }
811
1041
  : {}),
1042
+ ...(typeArguments !== undefined ? { typeArguments } : {}),
1043
+ ...(propertyKeyCap?.text !== undefined && propertyKeyCap.text.length > 0
1044
+ ? { propertyKey: propertyKeyCap.text }
1045
+ : {}),
812
1046
  ...(callForm !== undefined ? { callForm } : {}),
813
1047
  ...(explicitReceiver !== undefined ? { explicitReceiver } : {}),
814
1048
  ...(arity !== undefined ? { arity } : {}),
815
1049
  ...(argumentTypes !== undefined ? { argumentTypes } : {}),
816
1050
  ...(argumentTypeClasses !== undefined ? { argumentTypeClasses } : {}),
1051
+ ...(receiverChain !== undefined ? { receiverChain } : {}),
1052
+ ...(inCalleePosition ? { inCalleePosition: true } : {}),
1053
+ ...(embeddedAsPointer ? { embeddedAsPointer: true } : {}),
817
1054
  };
818
1055
  referenceSites.push(site);
819
1056
  }
820
1057
  }
1058
+ /**
1059
+ * The generic arguments a heritage reference was written with, by whichever of
1060
+ * the two routes this emitter uses (#2912).
1061
+ *
1062
+ * `@reference.type-arguments` is the explicit route, for an emitter whose anchor
1063
+ * is the bare NAME node (Rust's `impl Trait for S` anchors on the trait
1064
+ * identifier inside a `generic_type`). It wins where present: moving such an
1065
+ * anchor to cover the arguments would change the site's range, and that range is
1066
+ * part of every inheritance EDGE ID — a spelling detail must not renumber the
1067
+ * graph. Every other emitter already anchors on the whole base, so its spelling
1068
+ * is read directly and no query changed.
1069
+ */
1070
+ function heritageTypeArguments(match, anchor, nameCap) {
1071
+ const explicit = match['@reference.type-arguments']?.text;
1072
+ return explicit !== undefined
1073
+ ? typeApplicationArguments(explicit)
1074
+ : referenceTypeArguments(anchor.text, nameCap.text);
1075
+ }
1076
+ /**
1077
+ * Type arguments written on a heritage reference, read from the anchor's own
1078
+ * spelling — `IValidator<string>` → `['string']` (#2912).
1079
+ *
1080
+ * Two shapes are handled before the spelling is read as an application:
1081
+ *
1082
+ * - A trailing CONSTRUCTOR INVOCATION is dropped. `record R : Base<int>(x)`
1083
+ * and Kotlin `class C : Bar<Int>()` write a call in the heritage position;
1084
+ * the call is not part of the type, and leaving it attached would make the
1085
+ * list fail to close at the end and lose the arguments entirely.
1086
+ * - The application's base must BE the referenced name (`Other::Inner<T>`
1087
+ * ends with `Inner`). An anchor that spans more than the base type is not
1088
+ * read at all rather than read wrongly.
1089
+ *
1090
+ * `undefined` for a non-generic base and for every spelling that is not exactly
1091
+ * one balanced argument list — absence is the "unknown" value that consumers
1092
+ * fail open on, so declining is always safe here.
1093
+ */
1094
+ function referenceTypeArguments(anchorText, baseName) {
1095
+ const text = stripTrailingCallSuffix(anchorText.trim());
1096
+ const opener = text.search(OPENING_BRACKET);
1097
+ if (opener === -1)
1098
+ return undefined;
1099
+ if (!text.slice(0, opener).trimEnd().endsWith(baseName))
1100
+ return undefined;
1101
+ return typeApplicationArguments(text);
1102
+ }
1103
+ const OPENING_BRACKET = /[<[]/;
821
1104
  function referenceKindFromAnchor(name) {
822
1105
  const suffix = name.slice('@reference.'.length);
823
1106
  // Strip sub-tag after the kind (`@reference.call.member` → `call`).
@@ -840,6 +1123,8 @@ function referenceKindFromAnchor(name) {
840
1123
  return 'import-use';
841
1124
  case 'macro':
842
1125
  return 'macro';
1126
+ case 'value-ref':
1127
+ return 'value-ref';
843
1128
  default:
844
1129
  return undefined;
845
1130
  }
@@ -872,6 +1157,19 @@ function extractExplicitReceiver(match) {
872
1157
  return undefined;
873
1158
  return { name: cap.text };
874
1159
  }
1160
+ /**
1161
+ * The compact receiver chain, when the language emitter synthesized one.
1162
+ *
1163
+ * Returns `undefined` for anything that does not decode, so a malformed or
1164
+ * over-bound payload degrades to the existing text cascade rather than
1165
+ * poisoning the durable store. Never throws — this runs per reference site.
1166
+ */
1167
+ function extractReceiverChain(match) {
1168
+ const cap = match['@reference.receiver-chain'];
1169
+ if (cap === undefined)
1170
+ return undefined;
1171
+ return isValidReceiverChain(cap.text) ? cap.text : undefined;
1172
+ }
875
1173
  function extractArity(match) {
876
1174
  const cap = match['@reference.arity'];
877
1175
  if (cap === undefined)
@@ -893,6 +1191,245 @@ function extractArgumentTypes(match) {
893
1191
  }
894
1192
  return undefined;
895
1193
  }
1194
+ // ─── Pass 6: collect callable-value-flow facts ─────────────────────────────
1195
+ const CALLABLE_FLOW_KINDS = [
1196
+ 'seed',
1197
+ 'copy',
1198
+ 'alias',
1199
+ 'address',
1200
+ 'store',
1201
+ 'load',
1202
+ 'formal',
1203
+ 'argument',
1204
+ 'invoke',
1205
+ ];
1206
+ function pass6CollectCallableFlows(matches, positionIndex, filePath, out) {
1207
+ for (const match of matches) {
1208
+ const kind = callableFlowKind(match);
1209
+ if (kind === undefined)
1210
+ continue;
1211
+ const anchor = match[`@callable-flow.${kind}`];
1212
+ if (anchor === undefined)
1213
+ continue;
1214
+ switch (kind) {
1215
+ case 'seed': {
1216
+ const destination = callableFlowOperand(match, 'destination', positionIndex, filePath);
1217
+ const target = match['@callable-flow.target'];
1218
+ const targetName = match['@callable-flow.target-name']?.text ?? target?.text;
1219
+ if (destination === undefined || target === undefined || !nonEmpty(targetName))
1220
+ continue;
1221
+ const expectedSignature = callableFlowExpectedSignature(match);
1222
+ out.push({
1223
+ kind,
1224
+ destination,
1225
+ targetName,
1226
+ targetRange: target.range,
1227
+ ...(nonEmpty(match['@callable-flow.target-qualified-name']?.text)
1228
+ ? { targetQualifiedName: match['@callable-flow.target-qualified-name'].text }
1229
+ : {}),
1230
+ ...(expectedSignature !== undefined ? { expectedSignature } : {}),
1231
+ });
1232
+ break;
1233
+ }
1234
+ case 'copy':
1235
+ case 'alias': {
1236
+ const source = callableFlowOperand(match, 'source', positionIndex, filePath);
1237
+ const destination = callableFlowOperand(match, 'destination', positionIndex, filePath);
1238
+ if (source === undefined || destination === undefined)
1239
+ continue;
1240
+ out.push({ kind, source, destination });
1241
+ break;
1242
+ }
1243
+ case 'address': {
1244
+ const source = callableFlowOperand(match, 'source', positionIndex, filePath);
1245
+ const destination = callableFlowOperand(match, 'destination', positionIndex, filePath);
1246
+ if (source === undefined || destination === undefined)
1247
+ continue;
1248
+ out.push({ kind, source, destination });
1249
+ break;
1250
+ }
1251
+ case 'store': {
1252
+ const source = callableFlowOperand(match, 'source', positionIndex, filePath);
1253
+ const pointer = callableFlowOperand(match, 'pointer', positionIndex, filePath);
1254
+ if (source === undefined || pointer === undefined)
1255
+ continue;
1256
+ out.push({ kind, source, pointer });
1257
+ break;
1258
+ }
1259
+ case 'load': {
1260
+ const pointer = callableFlowOperand(match, 'pointer', positionIndex, filePath);
1261
+ const destination = callableFlowOperand(match, 'destination', positionIndex, filePath);
1262
+ if (pointer === undefined || destination === undefined)
1263
+ continue;
1264
+ out.push({ kind, pointer, destination });
1265
+ break;
1266
+ }
1267
+ case 'formal': {
1268
+ const owner = match['@callable-flow.owner'];
1269
+ const binding = callableFlowOperand(match, 'binding', positionIndex, filePath);
1270
+ const parameterIndex = parseNonNegativeInt(match['@callable-flow.parameter-index']?.text);
1271
+ const passingMode = parseCallablePassingMode(match['@callable-flow.passing-mode']?.text);
1272
+ if (owner === undefined ||
1273
+ !nonEmpty(owner.text) ||
1274
+ binding === undefined ||
1275
+ parameterIndex === undefined ||
1276
+ passingMode === undefined) {
1277
+ continue;
1278
+ }
1279
+ const expectedSignature = callableFlowExpectedSignature(match);
1280
+ out.push({
1281
+ kind,
1282
+ ownerName: owner.text,
1283
+ ownerRange: owner.range,
1284
+ parameterIndex,
1285
+ binding,
1286
+ passingMode,
1287
+ ...(expectedSignature !== undefined ? { expectedSignature } : {}),
1288
+ });
1289
+ break;
1290
+ }
1291
+ case 'argument': {
1292
+ const source = callableFlowOperand(match, 'source', positionIndex, filePath);
1293
+ const parameterIndex = parseNonNegativeInt(match['@callable-flow.parameter-index']?.text);
1294
+ if (source === undefined || parameterIndex === undefined)
1295
+ continue;
1296
+ out.push({
1297
+ kind,
1298
+ callSite: anchor.range,
1299
+ parameterIndex,
1300
+ source,
1301
+ ...(nonEmpty(match['@callable-flow.direct-callee-name']?.text)
1302
+ ? { directCalleeName: match['@callable-flow.direct-callee-name'].text }
1303
+ : {}),
1304
+ });
1305
+ break;
1306
+ }
1307
+ case 'invoke': {
1308
+ const callee = callableFlowOperand(match, 'callee', positionIndex, filePath);
1309
+ const inScope = positionIndex.atPosition(filePath, anchor.range.startLine, anchor.range.startCol);
1310
+ const invocationKind = parseCallableInvocationKind(match['@callable-flow.invocation-kind']?.text);
1311
+ if (callee === undefined || inScope === undefined || invocationKind === undefined)
1312
+ continue;
1313
+ const receiver = callableFlowOperand(match, 'receiver', positionIndex, filePath);
1314
+ const arity = parseNonNegativeInt(match['@callable-flow.arity']?.text);
1315
+ out.push({
1316
+ kind,
1317
+ callSite: anchor.range,
1318
+ inScope,
1319
+ callee,
1320
+ invocationKind,
1321
+ ...(receiver !== undefined ? { receiver } : {}),
1322
+ ...(arity !== undefined ? { arity } : {}),
1323
+ });
1324
+ break;
1325
+ }
1326
+ }
1327
+ }
1328
+ }
1329
+ function callableFlowKind(match) {
1330
+ return CALLABLE_FLOW_KINDS.find((kind) => match[`@callable-flow.${kind}`] !== undefined);
1331
+ }
1332
+ function callableFlowOperand(match, role, positionIndex, filePath) {
1333
+ const cap = match[`@callable-flow.${role}`];
1334
+ if (cap === undefined || !nonEmpty(cap.text))
1335
+ return undefined;
1336
+ const inScope = positionIndex.atPosition(filePath, cap.range.startLine, cap.range.startCol);
1337
+ if (inScope === undefined)
1338
+ return undefined;
1339
+ const expressionKind = parseCallableOperandKind(match[`@callable-flow.${role}-kind`]?.text);
1340
+ const indirection = parseNonNegativeInt(match[`@callable-flow.${role}-indirection`]?.text);
1341
+ if (indirection !== undefined && indirection > 16)
1342
+ return undefined;
1343
+ return {
1344
+ name: cap.text,
1345
+ inScope,
1346
+ atRange: cap.range,
1347
+ indirection: indirection ?? 0,
1348
+ addressOf: match[`@callable-flow.${role}-address`]?.text === 'true',
1349
+ ...(expressionKind !== undefined ? { expressionKind } : {}),
1350
+ ...(nonEmpty(match[`@callable-flow.${role}-qualified-name`]?.text)
1351
+ ? { qualifiedName: match[`@callable-flow.${role}-qualified-name`].text }
1352
+ : {}),
1353
+ };
1354
+ }
1355
+ function callableFlowExpectedSignature(match) {
1356
+ const parameterCount = parseNonNegativeInt(match['@callable-flow.expected-arity']?.text);
1357
+ const parameterTypes = parseJsonStringArray(match['@callable-flow.expected-types']?.text);
1358
+ const parameterTypeClasses = parseJsonParameterTypeClassesCapture(match['@callable-flow.expected-type-classes']);
1359
+ const isConst = parseBooleanText(match['@callable-flow.expected-const']?.text);
1360
+ if (parameterCount === undefined &&
1361
+ parameterTypes === undefined &&
1362
+ parameterTypeClasses === undefined &&
1363
+ isConst === undefined) {
1364
+ return undefined;
1365
+ }
1366
+ return {
1367
+ ...(parameterCount !== undefined ? { parameterCount } : {}),
1368
+ ...(parameterTypes !== undefined ? { parameterTypes } : {}),
1369
+ ...(parameterTypeClasses !== undefined ? { parameterTypeClasses } : {}),
1370
+ ...(isConst !== undefined ? { isConst } : {}),
1371
+ };
1372
+ }
1373
+ function parseCallableOperandKind(text) {
1374
+ switch (text) {
1375
+ case 'binding':
1376
+ case 'callable-designator':
1377
+ case 'bound-member':
1378
+ case 'anonymous-callable':
1379
+ return text;
1380
+ default:
1381
+ return undefined;
1382
+ }
1383
+ }
1384
+ function parseBooleanText(text) {
1385
+ if (text === 'true')
1386
+ return true;
1387
+ if (text === 'false')
1388
+ return false;
1389
+ return undefined;
1390
+ }
1391
+ function parseJsonStringArray(text) {
1392
+ if (text === undefined)
1393
+ return undefined;
1394
+ try {
1395
+ const parsed = JSON.parse(text);
1396
+ return Array.isArray(parsed) && parsed.every((value) => typeof value === 'string')
1397
+ ? parsed
1398
+ : undefined;
1399
+ }
1400
+ catch {
1401
+ return undefined;
1402
+ }
1403
+ }
1404
+ function parseNonNegativeInt(text) {
1405
+ if (text === undefined || !/^\d+$/.test(text))
1406
+ return undefined;
1407
+ const value = Number.parseInt(text, 10);
1408
+ return Number.isSafeInteger(value) ? value : undefined;
1409
+ }
1410
+ function parseCallablePassingMode(text) {
1411
+ switch (text) {
1412
+ case 'value':
1413
+ case 'reference':
1414
+ case 'pointer':
1415
+ return text;
1416
+ default:
1417
+ return undefined;
1418
+ }
1419
+ }
1420
+ function parseCallableInvocationKind(text) {
1421
+ switch (text) {
1422
+ case 'indirect':
1423
+ case 'member-pointer':
1424
+ case 'callable-object':
1425
+ return text;
1426
+ default:
1427
+ return undefined;
1428
+ }
1429
+ }
1430
+ function nonEmpty(value) {
1431
+ return value !== undefined && value.length > 0;
1432
+ }
896
1433
  // ─── Internal: range + capture utilities ───────────────────────────────────
897
1434
  function rangesEqual(a, b) {
898
1435
  return (a.startLine === b.startLine &&
@@ -910,15 +1447,27 @@ function rangesEqual(a, b) {
910
1447
  * change.
911
1448
  */
912
1449
  const KNOWN_SUB_TAGS = new Set([
1450
+ '@scope.lexical-names',
913
1451
  '@declaration.name',
914
1452
  '@declaration.qualified_name',
915
1453
  '@import.name',
916
1454
  '@import.source',
917
1455
  '@import.alias',
1456
+ // Provider-set marker, not a statement anchor. Listed for the same reason as
1457
+ // its siblings: it is emitted on a sub-node of the import statement, and the
1458
+ // anchor must stay `@import.statement` regardless of relative span.
1459
+ '@import.publishes',
918
1460
  '@type-binding.name',
919
1461
  '@type-binding.type',
920
1462
  '@reference.name',
921
1463
  '@reference.qualified-name',
1464
+ // The generic arguments a heritage base was written with, when the emitter's
1465
+ // anchor is the bare name and cannot carry them (#2912). A sub-tag for the
1466
+ // usual reason: it spans a sibling node of the anchor, never the site itself.
1467
+ '@reference.type-arguments',
1468
+ '@reference.property-key',
1469
+ '@reference.callee-position',
1470
+ '@reference.embedded-pointer',
922
1471
  '@reference.receiver',
923
1472
  '@reference.operator',
924
1473
  '@reference.arity',
@@ -930,6 +1479,15 @@ const KNOWN_SUB_TAGS = new Set([
930
1479
  '@declaration.parameter-type-classes',
931
1480
  '@declaration.return-type',
932
1481
  '@declaration.template-constraints',
1482
+ // MUST be listed, and the failure it prevents is silent def LOSS rather than
1483
+ // a missing field. `anchorCaptureFor` picks the broadest-span `@declaration.*`
1484
+ // capture that is not a known sub-tag; a type-parameter list is normally
1485
+ // narrower than the declaration that owns it, but a C++ `template <class A,
1486
+ // class B, …>` or a multi-line Java `<T extends A & B>` written above a short
1487
+ // declaration can out-span it. The anchor would then be `type-parameters`,
1488
+ // `normalizeNodeLabel` would return undefined for it, and the whole class def
1489
+ // would be dropped rather than merely losing its parameters.
1490
+ '@declaration.type-parameters',
933
1491
  '@declaration.is-explicit',
934
1492
  '@declaration.is-deleted',
935
1493
  ]);