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
@@ -0,0 +1,1233 @@
1
+ /**
2
+ * Flow-insensitive, inclusion-based resolution for calls through callable
3
+ * values. Providers own syntax recognition; this pass consumes only the
4
+ * JSON-safe facts carried by ParsedFile.
5
+ */
6
+ import { tryEmitEdgeWithExplicitTargetId } from '../graph-bridge/edges.js';
7
+ import { resolveCallerGraphId, resolveDefGraphId, simpleQualifiedName, } from '../graph-bridge/ids.js';
8
+ import { resolveInheritanceBaseInScope } from '../scope/walkers.js';
9
+ import { definitionIdPosition } from '../utils/definition-id.js';
10
+ import { narrowOverloadCandidates } from './overload-narrowing.js';
11
+ /**
12
+ * Per-site dispatch-target cap. Above it the site is treated as overflowed and
13
+ * its edges are dropped — a cliff, so a repo with a legitimately wide dispatch
14
+ * table (33+ candidates on one callable site) loses the whole call chain.
15
+ *
16
+ * Override via `GITNEXUS_MAX_CALLABLE_VALUE_TARGETS` for such repos.
17
+ */
18
+ export const MAX_CALLABLE_VALUE_TARGETS = (() => {
19
+ const env = Number(process.env.GITNEXUS_MAX_CALLABLE_VALUE_TARGETS);
20
+ return Number.isInteger(env) && env >= 1 ? env : 32;
21
+ })();
22
+ /** Position key shared with the existing free/reference skip-set contract. */
23
+ export function callableFlowSiteKey(filePath, range) {
24
+ return `${filePath}:${range.startLine}:${range.startCol}`;
25
+ }
26
+ /**
27
+ * Return only invoke sites that join to a canonical call ReferenceSite.
28
+ * Malformed/stale facts never suppress ordinary resolution.
29
+ */
30
+ export function collectDeferredIndirectSites(parsedFiles, scopes) {
31
+ const out = new Set();
32
+ const flowCells = new Set();
33
+ if (scopes !== undefined) {
34
+ for (const parsed of parsedFiles) {
35
+ for (const site of parsed.callableFlowSites ?? []) {
36
+ const operand = flowCellOperand(site);
37
+ if (operand !== undefined) {
38
+ flowCells.add(canonicalBindingKey(parsed.filePath, operand, scopes));
39
+ }
40
+ }
41
+ }
42
+ }
43
+ for (const parsed of parsedFiles) {
44
+ const canonical = new Set(parsed.referenceSites
45
+ .filter((site) => site.kind === 'call')
46
+ .map((site) => callableFlowSiteKey(parsed.filePath, site.atRange)));
47
+ for (const site of parsed.callableFlowSites ?? []) {
48
+ if (site.kind !== 'invoke')
49
+ continue;
50
+ const key = callableFlowSiteKey(parsed.filePath, site.callSite);
51
+ if (!canonical.has(key))
52
+ continue;
53
+ if (scopes === undefined ||
54
+ site.invocationKind === 'member-pointer' ||
55
+ site.callee.indirection > 0 ||
56
+ flowCells.has(canonicalBindingKey(parsed.filePath, site.callee, scopes))) {
57
+ out.add(key);
58
+ }
59
+ }
60
+ }
61
+ return out;
62
+ }
63
+ function flowCellOperand(site) {
64
+ switch (site.kind) {
65
+ case 'seed':
66
+ case 'copy':
67
+ case 'alias':
68
+ case 'address':
69
+ case 'load':
70
+ return site.destination;
71
+ case 'store':
72
+ return site.pointer;
73
+ case 'formal':
74
+ return site.binding;
75
+ case 'argument':
76
+ case 'invoke':
77
+ return undefined;
78
+ }
79
+ }
80
+ export function emitCallableValueFlow(input) {
81
+ const facts = [];
82
+ const invokes = [];
83
+ const canonicalInvokeKeys = collectDeferredIndirectSites(input.parsedFiles, input.scopes);
84
+ let unmatchedInvokes = 0;
85
+ for (const parsed of input.parsedFiles) {
86
+ for (const site of parsed.callableFlowSites ?? []) {
87
+ if (site.kind === 'invoke') {
88
+ const key = callableFlowSiteKey(parsed.filePath, site.callSite);
89
+ if (canonicalInvokeKeys.has(key))
90
+ invokes.push({ filePath: parsed.filePath, site });
91
+ else
92
+ unmatchedInvokes++;
93
+ }
94
+ else {
95
+ facts.push({ filePath: parsed.filePath, site });
96
+ }
97
+ }
98
+ }
99
+ if (facts.length === 0 && invokes.length === 0) {
100
+ return { emitted: 0, resolvedInvokes: 0, ambiguousInvokes: 0, unmatchedInvokes, iterations: 0 };
101
+ }
102
+ const targetsByBinding = new Map();
103
+ const addressesByBinding = new Map();
104
+ const overflowedTargets = new Set();
105
+ const overflowedAddresses = new Set();
106
+ const overflowWarnings = new Map();
107
+ const rawGraphTargets = buildGraphTargetIndex(input.scopes, input.nodeLookup, input.isCallableValueTarget, input.graph);
108
+ const rawTargetIndexes = buildCallableTargetIndexes(rawGraphTargets.values(), input.scopes);
109
+ const { targets: graphTargets, aliasesByTargetId } = canonicalizeCallableDeclarations(rawGraphTargets, rawTargetIndexes, input.scopes, input.graph, input.hasFileLocalCallableLinkage);
110
+ const uniqueGraphTargets = dedupeTargets([...graphTargets.values()]);
111
+ const globalBySimpleName = buildGlobalCallableIndex(uniqueGraphTargets);
112
+ const targetIndexes = buildCallableTargetIndexes(uniqueGraphTargets, input.scopes);
113
+ const bindingKey = (filePath, operand) => canonicalBindingKey(filePath, operand, input.scopes);
114
+ // Lexical binding lookup is suppressed ONLY for cells bound by formal
115
+ // facts: a parameter whose grammar emits no declaration binding must not
116
+ // adopt a same-named outer function. Value cells (copy/alias/store/load
117
+ // destinations) keep their declaration in the inclusion union — reassigning
118
+ // a declared function through its own name (`greet = other; greet()`) must
119
+ // still count the declaration as a target, or an unresolvable RHS yields
120
+ // zero CALLS for a call that resolved pre-flow (#2522 review finding 8).
121
+ const formalConstrainedBindings = new Set();
122
+ for (const fact of facts) {
123
+ if (fact.site.kind === 'formal') {
124
+ formalConstrainedBindings.add(bindingKey(fact.filePath, fact.site.binding));
125
+ }
126
+ }
127
+ const warnOverflow = (key, count, context, cap = MAX_CALLABLE_VALUE_TARGETS) => {
128
+ if (overflowWarnings.has(key))
129
+ return;
130
+ overflowWarnings.set(key, {
131
+ language: input.language,
132
+ context,
133
+ candidateCount: count,
134
+ cap,
135
+ });
136
+ };
137
+ // Dependency-indexed worklist. Each constraint records the target/address
138
+ // cells it reads; only consumers of a changed cell are re-enqueued. This is
139
+ // the finite inclusion worklist promised by the plan and avoids rescanning
140
+ // every fact for every hop in a reverse-ordered copy chain.
141
+ const workItems = [];
142
+ const watchers = new Map();
143
+ const queue = [];
144
+ const queued = new Set();
145
+ let activeWorkItem;
146
+ const dependencyKey = (kind, key) => `${kind}\0${key}`;
147
+ const watch = (kind, key) => {
148
+ if (activeWorkItem === undefined)
149
+ return;
150
+ const dependency = dependencyKey(kind, key);
151
+ let bucket = watchers.get(dependency);
152
+ if (bucket === undefined) {
153
+ bucket = new Set();
154
+ watchers.set(dependency, bucket);
155
+ }
156
+ bucket.add(activeWorkItem);
157
+ };
158
+ const schedule = (id) => {
159
+ if (queued.has(id))
160
+ return;
161
+ queued.add(id);
162
+ queue.push(id);
163
+ };
164
+ const notify = (kind, key) => {
165
+ for (const id of watchers.get(dependencyKey(kind, key)) ?? [])
166
+ schedule(id);
167
+ };
168
+ const addWorkItem = (run) => {
169
+ const id = workItems.length;
170
+ workItems.push(run);
171
+ schedule(id);
172
+ };
173
+ const addTarget = (key, target, context) => {
174
+ if (overflowedTargets.has(key))
175
+ return false;
176
+ let bucket = targetsByBinding.get(key);
177
+ if (bucket === undefined) {
178
+ bucket = new Map();
179
+ targetsByBinding.set(key, bucket);
180
+ }
181
+ if (bucket.has(target.id))
182
+ return false;
183
+ if (bucket.size + 1 > MAX_CALLABLE_VALUE_TARGETS) {
184
+ const count = bucket.size + 1;
185
+ bucket.clear();
186
+ overflowedTargets.add(key);
187
+ warnOverflow(`target:${key}`, count, context);
188
+ notify('target', key);
189
+ return true;
190
+ }
191
+ bucket.set(target.id, target);
192
+ notify('target', key);
193
+ return true;
194
+ };
195
+ const addAddress = (key, cell, context) => {
196
+ if (overflowedAddresses.has(key))
197
+ return false;
198
+ let bucket = addressesByBinding.get(key);
199
+ if (bucket === undefined) {
200
+ bucket = new Set();
201
+ addressesByBinding.set(key, bucket);
202
+ }
203
+ if (bucket.has(cell))
204
+ return false;
205
+ if (bucket.size + 1 > MAX_CALLABLE_VALUE_TARGETS) {
206
+ const count = bucket.size + 1;
207
+ bucket.clear();
208
+ overflowedAddresses.add(key);
209
+ warnOverflow(`address:${key}`, count, context);
210
+ notify('address', key);
211
+ return true;
212
+ }
213
+ bucket.add(cell);
214
+ notify('address', key);
215
+ return true;
216
+ };
217
+ const markTargetOverflow = (key, context) => {
218
+ if (overflowedTargets.has(key))
219
+ return false;
220
+ targetsByBinding.get(key)?.clear();
221
+ overflowedTargets.add(key);
222
+ warnOverflow(`target:${key}`, MAX_CALLABLE_VALUE_TARGETS + 1, context);
223
+ notify('target', key);
224
+ return true;
225
+ };
226
+ const markAddressOverflow = (key, context) => {
227
+ if (overflowedAddresses.has(key))
228
+ return false;
229
+ addressesByBinding.get(key)?.clear();
230
+ overflowedAddresses.add(key);
231
+ warnOverflow(`address:${key}`, MAX_CALLABLE_VALUE_TARGETS + 1, context);
232
+ notify('address', key);
233
+ return true;
234
+ };
235
+ const readTargets = (key) => {
236
+ watch('target', key);
237
+ return {
238
+ targets: targetsByBinding.get(key) ?? new Map(),
239
+ overflow: overflowedTargets.has(key),
240
+ };
241
+ };
242
+ const readAddresses = (key) => {
243
+ watch('address', key);
244
+ return {
245
+ cells: addressesByBinding.get(key) ?? new Set(),
246
+ overflow: overflowedAddresses.has(key),
247
+ };
248
+ };
249
+ const transferTargets = (source, destination, context) => {
250
+ const sourceTargets = readTargets(source);
251
+ if (sourceTargets.overflow)
252
+ return markTargetOverflow(destination, context);
253
+ let changed = false;
254
+ for (const target of sourceTargets.targets.values()) {
255
+ if (addTarget(destination, target, context))
256
+ changed = true;
257
+ }
258
+ return changed;
259
+ };
260
+ const transferAddresses = (source, destination, context) => {
261
+ const sourceAddresses = readAddresses(source);
262
+ if (sourceAddresses.overflow)
263
+ return markAddressOverflow(destination, context);
264
+ let changed = false;
265
+ for (const cell of sourceAddresses.cells) {
266
+ if (addAddress(destination, cell, context))
267
+ changed = true;
268
+ }
269
+ return changed;
270
+ };
271
+ const reachedCells = (filePath, operand) => {
272
+ const layers = [new Set([bindingKey(filePath, operand)])];
273
+ let current = layers[0];
274
+ for (let depth = 0; depth < operand.indirection; depth++) {
275
+ const next = new Set();
276
+ for (const cell of current) {
277
+ const addresses = readAddresses(cell);
278
+ if (addresses.overflow)
279
+ return { layers, overflow: true };
280
+ for (const reached of addresses.cells)
281
+ next.add(reached);
282
+ }
283
+ layers.push(next);
284
+ current = next;
285
+ if (current.size === 0)
286
+ break;
287
+ }
288
+ return { layers, overflow: false };
289
+ };
290
+ const operandTargets = (filePath, operand) => {
291
+ const reached = reachedCells(filePath, operand);
292
+ if (reached.overflow)
293
+ return { targets: new Map(), overflow: true };
294
+ const out = new Map();
295
+ // A function-pointer binding already denotes its pointee. Explicit `*`
296
+ // may therefore terminate at any prefix, while pointer-to-pointer cells
297
+ // continue through address edges. This models fp(), (*fp)(), and (**pp)
298
+ // without treating the final function-designator dereference as a cell hop.
299
+ for (const layer of reached.layers) {
300
+ for (const cell of layer) {
301
+ const candidates = readTargets(cell);
302
+ if (candidates.overflow)
303
+ return { targets: new Map(), overflow: true };
304
+ for (const target of candidates.targets.values()) {
305
+ out.set(target.id, target);
306
+ if (out.size > MAX_CALLABLE_VALUE_TARGETS) {
307
+ return { targets: new Map(), overflow: true };
308
+ }
309
+ }
310
+ }
311
+ }
312
+ return { targets: out, overflow: false };
313
+ };
314
+ // Explicit seeds use lexical/qualified registries and contextual signature
315
+ // narrowing. No arbitrary first-overload choice is permitted.
316
+ for (const fact of facts) {
317
+ if (fact.site.kind !== 'seed')
318
+ continue;
319
+ const destination = bindingKey(fact.filePath, fact.site.destination);
320
+ const candidates = resolveSeedCandidates(fact.filePath, fact.site.destination.inScope, fact.site.targetName, fact.site.targetQualifiedName, fact.site.expectedSignature, input.scopes, graphTargets, globalBySimpleName, targetIndexes, input.graph);
321
+ for (const target of candidates)
322
+ addTarget(destination, target, `binding:${destination}`);
323
+ }
324
+ // Direct callable references used as argument/copy sources acquire lexical
325
+ // targets. A nearest non-callable binding is a hard shadowing boundary.
326
+ for (const fact of facts) {
327
+ const source = sourceOperand(fact.site);
328
+ if (source === undefined)
329
+ continue;
330
+ const key = bindingKey(fact.filePath, source);
331
+ for (const target of resolveOperandCandidates(fact.filePath, source, undefined, input.scopes, graphTargets, globalBySimpleName, targetIndexes, input.graph, !formalConstrainedBindings.has(key))) {
332
+ addTarget(key, target, `binding:${key}`);
333
+ }
334
+ }
335
+ // Explicitly dereferenced named functions (`(*target)()`) have no source
336
+ // fact of their own; seed their canonical binding from lexical lookup.
337
+ for (const invoke of invokes) {
338
+ const key = bindingKey(invoke.filePath, invoke.site.callee);
339
+ for (const target of resolveOperandCandidates(invoke.filePath, invoke.site.callee, undefined, input.scopes, graphTargets, globalBySimpleName, targetIndexes, input.graph, !formalConstrainedBindings.has(key))) {
340
+ addTarget(key, target, `binding:${key}`);
341
+ }
342
+ }
343
+ // Address-of constraints are static and seed the abstract-cell graph.
344
+ for (const fact of facts) {
345
+ if (fact.site.kind !== 'address')
346
+ continue;
347
+ addAddress(bindingKey(fact.filePath, fact.site.destination), bindingKey(fact.filePath, fact.site.source), `address:${fact.filePath}:${fact.site.source.name}`);
348
+ }
349
+ const formalsByGraphId = indexFormalsByGraphId(input.parsedFiles, input.scopes, input.nodeLookup, targetIndexes, aliasesByTargetId);
350
+ const callSignaturesBySite = indexCallSignatures(input.parsedFiles);
351
+ const dynamicCallees = new Map();
352
+ const dynamicOverflow = new Set();
353
+ const dynamicTargetHistory = new Map();
354
+ for (const fact of facts) {
355
+ const site = fact.site;
356
+ const context = `${fact.site.kind}:${fact.filePath}`;
357
+ switch (site.kind) {
358
+ case 'copy':
359
+ case 'alias': {
360
+ addWorkItem(() => {
361
+ const source = bindingKey(fact.filePath, site.source);
362
+ const destination = bindingKey(fact.filePath, site.destination);
363
+ transferTargets(source, destination, context);
364
+ transferAddresses(source, destination, context);
365
+ if (site.kind === 'alias') {
366
+ transferTargets(destination, source, context);
367
+ transferAddresses(destination, source, context);
368
+ }
369
+ });
370
+ break;
371
+ }
372
+ case 'load': {
373
+ addWorkItem(() => {
374
+ const destination = bindingKey(fact.filePath, site.destination);
375
+ const reached = reachedCells(fact.filePath, site.pointer);
376
+ if (reached.overflow) {
377
+ markTargetOverflow(destination, context);
378
+ markAddressOverflow(destination, context);
379
+ return;
380
+ }
381
+ for (const cell of reached.layers.at(-1) ?? []) {
382
+ transferTargets(cell, destination, context);
383
+ transferAddresses(cell, destination, context);
384
+ }
385
+ });
386
+ break;
387
+ }
388
+ case 'store': {
389
+ addWorkItem(() => {
390
+ const sourceTargets = operandTargets(fact.filePath, site.source);
391
+ const reached = reachedCells(fact.filePath, site.pointer);
392
+ if (reached.overflow)
393
+ return;
394
+ for (const cell of reached.layers.at(-1) ?? []) {
395
+ if (sourceTargets.overflow) {
396
+ markTargetOverflow(cell, context);
397
+ continue;
398
+ }
399
+ for (const target of sourceTargets.targets.values())
400
+ addTarget(cell, target, context);
401
+ }
402
+ });
403
+ break;
404
+ }
405
+ case 'seed':
406
+ case 'address':
407
+ case 'formal':
408
+ case 'argument':
409
+ case 'invoke':
410
+ break;
411
+ }
412
+ }
413
+ for (const invoke of invokes) {
414
+ addWorkItem(() => {
415
+ const callKey = callableFlowSiteKey(invoke.filePath, invoke.site.callSite);
416
+ const targets = operandTargets(invoke.filePath, invoke.site.callee);
417
+ if (targets.overflow || targets.targets.size > MAX_CALLABLE_VALUE_TARGETS) {
418
+ if (!dynamicOverflow.has(callKey)) {
419
+ dynamicOverflow.add(callKey);
420
+ dynamicCallees.delete(callKey);
421
+ warnOverflow(`invoke:${callKey}`, Math.max(targets.targets.size, MAX_CALLABLE_VALUE_TARGETS + 1), `site:${callKey}`);
422
+ notify('call', callKey);
423
+ }
424
+ return;
425
+ }
426
+ const expanded = expandMemberTargets(invoke, targets.targets, input.scopes, graphTargets, targetIndexes, input.graph);
427
+ const history = dynamicTargetHistory.get(callKey) ?? new Set();
428
+ for (const id of expanded.keys())
429
+ history.add(id);
430
+ dynamicTargetHistory.set(callKey, history);
431
+ const previous = dynamicCallees.get(callKey);
432
+ if (!sameTargetSet(previous, expanded)) {
433
+ dynamicCallees.set(callKey, expanded);
434
+ notify('call', callKey);
435
+ }
436
+ });
437
+ }
438
+ for (const fact of facts) {
439
+ if (fact.site.kind !== 'argument')
440
+ continue;
441
+ const site = fact.site;
442
+ addWorkItem(() => {
443
+ const callKey = callableFlowSiteKey(fact.filePath, site.callSite);
444
+ const callSignature = callSignaturesBySite.get(callKey);
445
+ const indexedFormals = (targetId) => narrowIndexedFormals(formalsByGraphId.get(targetId)?.get(site.parameterIndex) ?? [], callSignature);
446
+ watch('call', callKey);
447
+ const targetIds = new Set();
448
+ for (const id of input.calleeIds.get(fact.filePath)?.get(posKey(site.callSite)) ?? []) {
449
+ targetIds.add(id);
450
+ }
451
+ for (const id of dynamicCallees.get(callKey)?.keys() ?? [])
452
+ targetIds.add(id);
453
+ let hasIndexedFormal = [...targetIds].some((id) => indexedFormals(id).length > 0);
454
+ if (!hasIndexedFormal && site.directCalleeName !== undefined) {
455
+ for (const target of resolveSeedCandidates(fact.filePath, site.source.inScope, site.directCalleeName, undefined, callSignature, input.scopes, graphTargets, globalBySimpleName, targetIndexes, input.graph)) {
456
+ targetIds.add(target.id);
457
+ }
458
+ hasIndexedFormal = [...targetIds].some((id) => indexedFormals(id).length > 0);
459
+ }
460
+ const history = dynamicTargetHistory.get(callKey);
461
+ const callOverflow = dynamicOverflow.has(callKey) || targetIds.size > MAX_CALLABLE_VALUE_TARGETS;
462
+ if (callOverflow) {
463
+ for (const targetId of history ?? targetIds) {
464
+ for (const formal of indexedFormals(targetId)) {
465
+ const formalKey = bindingKey(formal.filePath, formal.site.binding);
466
+ markTargetOverflow(formalKey, `actual-formal-overflow:${callKey}`);
467
+ markAddressOverflow(formalKey, `actual-formal-overflow:${callKey}`);
468
+ }
469
+ }
470
+ return;
471
+ }
472
+ if (targetIds.size === 0 || !hasIndexedFormal)
473
+ return;
474
+ const sourceKey = bindingKey(fact.filePath, site.source);
475
+ const sourceTargets = operandTargets(fact.filePath, site.source);
476
+ for (const targetId of targetIds) {
477
+ for (const formal of indexedFormals(targetId)) {
478
+ const formalKey = bindingKey(formal.filePath, formal.site.binding);
479
+ const context = `actual-formal:${callKey}:${site.parameterIndex}`;
480
+ const contextualTargets = new Map(sourceTargets.targets);
481
+ for (const target of resolveOperandCandidates(fact.filePath, site.source, formal.site.expectedSignature, input.scopes, graphTargets, globalBySimpleName, targetIndexes, input.graph, !formalConstrainedBindings.has(sourceKey))) {
482
+ contextualTargets.set(target.id, target);
483
+ }
484
+ const narrowed = narrowTargetMap(contextualTargets, formal.site.expectedSignature, input.graph);
485
+ if (sourceTargets.overflow || narrowed.size > MAX_CALLABLE_VALUE_TARGETS) {
486
+ markTargetOverflow(formalKey, context);
487
+ }
488
+ else {
489
+ for (const target of narrowed.values())
490
+ addTarget(formalKey, target, context);
491
+ }
492
+ transferAddresses(sourceKey, formalKey, context);
493
+ if (site.source.addressOf)
494
+ addAddress(formalKey, sourceKey, context);
495
+ if (formal.site.passingMode === 'reference') {
496
+ transferTargets(formalKey, sourceKey, context);
497
+ transferAddresses(formalKey, sourceKey, context);
498
+ }
499
+ }
500
+ }
501
+ });
502
+ }
503
+ let iterations = 0;
504
+ const workBudget = Math.max(2_048, workItems.length * 128);
505
+ let queueHead = 0;
506
+ while (queueHead < queue.length && iterations < workBudget) {
507
+ const id = queue[queueHead++];
508
+ queued.delete(id);
509
+ activeWorkItem = id;
510
+ workItems[id]();
511
+ activeWorkItem = undefined;
512
+ iterations++;
513
+ }
514
+ const workBudgetExceeded = queueHead < queue.length;
515
+ if (workBudgetExceeded) {
516
+ // `invokes` are exactly the deferred sites the ordinary passes already
517
+ // skipped (`collectDeferredIndirectSites` feeds both) — every one of them
518
+ // ends this run with zero CALLS, so the count goes in the warning context
519
+ // rather than being lost (#2522 review finding: budget-bailout honesty).
520
+ warnOverflow('work-budget', iterations + queue.length - queueHead, `analysis-work-budget:${invokes.length}-deferred-sites-unresolved`, workBudget);
521
+ }
522
+ for (const warning of overflowWarnings.values())
523
+ input.onWarn?.(warning);
524
+ // No partial graph output when a hostile/corrupt fact graph exhausts the
525
+ // bounded work budget. The caller receives a warning; NOTE this is not
526
+ // free for callers — the deferred invoke sites were already excluded from
527
+ // free-call fallback and reference emission, so they get no edges at all
528
+ // this run. Non-deferred sites keep their ordinary resolution.
529
+ if (workBudgetExceeded) {
530
+ return {
531
+ emitted: 0,
532
+ resolvedInvokes: 0,
533
+ ambiguousInvokes: invokes.length,
534
+ unmatchedInvokes,
535
+ iterations,
536
+ };
537
+ }
538
+ let emitted = 0;
539
+ let resolvedInvokes = 0;
540
+ let ambiguousInvokes = 0;
541
+ const seen = new Set();
542
+ for (const invoke of invokes) {
543
+ const key = callableFlowSiteKey(invoke.filePath, invoke.site.callSite);
544
+ if (dynamicOverflow.has(key)) {
545
+ ambiguousInvokes++;
546
+ continue;
547
+ }
548
+ const targets = dynamicCallees.get(key);
549
+ if (targets === undefined || targets.size === 0)
550
+ continue;
551
+ resolvedInvokes++;
552
+ const confidence = targets.size === 1 ? 0.8 : 0.7;
553
+ for (const target of targets.values()) {
554
+ if (tryEmitEdgeWithExplicitTargetId(input.graph, input.scopes, input.nodeLookup, { inScope: invoke.site.inScope, atRange: invoke.site.callSite, kind: 'call' }, target.id, 'callable-value-flow', seen, confidence, input.collapseByCallerTarget === true, { sink: input.calleeIds, filePath: invoke.filePath })) {
555
+ emitted++;
556
+ }
557
+ }
558
+ }
559
+ return { emitted, resolvedInvokes, ambiguousInvokes, unmatchedInvokes, iterations };
560
+ }
561
+ /**
562
+ * Pure — exported for `bench/callable-value-flow/measure.mjs`, which guards its
563
+ * scaling ratio and result fingerprint. Not part of the pass's public contract.
564
+ */
565
+ export function buildGraphTargetIndex(scopes, nodeLookup, providerTarget, graph) {
566
+ const out = new Map();
567
+ const { byAnchor, callableByPosition } = buildGraphCallableIndexes(graph);
568
+ for (const def of scopes.defs.byId.values()) {
569
+ const callableDef = isCallable(def) || providerTarget?.(def) === true;
570
+ if (!callableDef) {
571
+ // #2693: a closure bound to a name (`val f = { }`) is a callable the def
572
+ // type cannot see — the scope layer declares it with its VALUE label
573
+ // (Kotlin/Swift `Property`, Dart `Variable`) while #2687 makes the graph
574
+ // emit a single callable node for it. Only the graph knows.
575
+ //
576
+ // The join MUST be positional. Resolving such a def through
577
+ // `resolveDefGraphId` is unsafe: every qualified key it builds embeds
578
+ // `def.type`, so for a value def they can only ever hit a value-labelled
579
+ // node — and when the def's own node is absent (Rust `let`) or carries a
580
+ // DIFFERENT label than the def's type (TypeScript declares `const` as
581
+ // `Variable` but emits a `Const` node), the chain falls through to the
582
+ // label-agnostic, first-write-wins `simpleKey(filePath, simpleName)`.
583
+ // That aliases the binding onto ANY same-named callable in the file —
584
+ // `const save = cb` next to an unrelated `Svc.save` mints a CALLS edge to
585
+ // the method, and the result depends on declaration order.
586
+ //
587
+ // A closure binding IS its callable node: same file, same line, same
588
+ // name. An aliasing local is not. So look the node up by position and
589
+ // admit only an exact hit.
590
+ const positionalKey = valueBindingPositionKey(def);
591
+ const positionalId = positionalKey === undefined ? undefined : callableByPosition.get(positionalKey);
592
+ // `''` marks an ambiguous position (two callables claiming one
593
+ // file/line/name) — undecidable, so admit neither.
594
+ if (positionalId === undefined || positionalId === '')
595
+ continue;
596
+ out.set(def.nodeId, { id: positionalId, def });
597
+ continue;
598
+ }
599
+ const anchorKey = definitionAnchorKey(def);
600
+ const anchored = anchorKey === undefined ? undefined : byAnchor.get(anchorKey);
601
+ const id = anchored?.length === 1 ? anchored[0] : resolveDefGraphId(def.filePath, def, nodeLookup);
602
+ if (id === undefined)
603
+ continue;
604
+ // Overloads can intentionally share one graph node ID. Index by the
605
+ // definition identity so contextual signature narrowing still sees the
606
+ // complete overload set before a selected target collapses to graph ID.
607
+ out.set(def.nodeId, { id, def });
608
+ }
609
+ return out;
610
+ }
611
+ /**
612
+ * Leading sigils are part of a name in some grammars and stripped in others:
613
+ * PHP keeps `$` on a variable_name node (deliberately — it is what separates
614
+ * PHP's variable and function namespaces, so `$save` does not collide with
615
+ * `save()`), while the scope layer and the callable-flow synthesizer both
616
+ * normalise it away. The positional join has to see both sides the same way.
617
+ */
618
+ const withoutSigil = (name) => name.replace(/^[$@]+/, '');
619
+ /**
620
+ * `file\0line\0name` for a value binding, matching the callable-node key built
621
+ * in `buildGraphCallableIndexes`. Definition lines come from the def id and are
622
+ * 1-based; graph `startLine` is 0-based, which is the `+ 1` there.
623
+ */
624
+ function valueBindingPositionKey(def) {
625
+ if (!VALUE_BINDING_DEF_TYPES.has(def.type))
626
+ return undefined;
627
+ const line = definitionIdPosition(def.nodeId, def.filePath)?.line;
628
+ const name = simpleQualifiedName(def);
629
+ if (line === undefined || name === undefined)
630
+ return undefined;
631
+ return `${def.filePath}\0${line}\0${withoutSigil(name)}`;
632
+ }
633
+ /**
634
+ * Value-binding labels whose initializer can be a callable. Admitted ONLY on
635
+ * positional graph-node evidence (see `buildGraphTargetIndex`), never on the def
636
+ * type alone.
637
+ *
638
+ * Deliberately NOT `isOwnableValueLabel` (scope/walkers.ts), which lists the
639
+ * same labels for the value-receiver bridge: that predicate is contracted to
640
+ * `reconcileOwnership`, and coupling the two would let a label added for
641
+ * ownership silently widen call-target admission. Two lists, two reasons —
642
+ * changing either means checking the other.
643
+ *
644
+ * `Static` is excluded: `normalizeNodeLabel` (scope-extractor.ts) has no
645
+ * `static` case, so no scope-resolution def can carry that type. Including it
646
+ * added an entry no fixture could ever exercise.
647
+ */
648
+ const VALUE_BINDING_DEF_TYPES = new Set([
649
+ 'Const',
650
+ 'Property',
651
+ 'Variable',
652
+ ]);
653
+ /**
654
+ * Associate declaration-only callable nodes with their unique out-of-file
655
+ * definition. Function scopes are the body/definition signal; prototypes do
656
+ * not create one. The optional provider predicate is deliberately linkage-
657
+ * only, keeping language rules out of this shared pass and preventing `static`
658
+ * symbols from leaking across translation units.
659
+ */
660
+ function canonicalizeCallableDeclarations(rawTargets, rawIndexes, scopes, graph, hasFileLocalCallableLinkage) {
661
+ if (hasFileLocalCallableLinkage === undefined) {
662
+ return { targets: rawTargets, aliasesByTargetId: new Map() };
663
+ }
664
+ const definitionAnchors = new Set();
665
+ for (const scope of scopes.scopeTree.byId.values()) {
666
+ if (scope.kind !== 'Function')
667
+ continue;
668
+ definitionAnchors.add(`${scope.filePath}\0${scope.range.startLine}\0${scope.range.startCol}`);
669
+ }
670
+ const isDefinition = (target) => {
671
+ const position = definitionPosition(target.def);
672
+ return position !== undefined && definitionAnchors.has(position);
673
+ };
674
+ const targets = new Map(rawTargets);
675
+ for (const [defId, declaration] of rawTargets) {
676
+ if (isDefinition(declaration))
677
+ continue;
678
+ const qualifiedName = effectiveQualifiedName(declaration.def, scopes);
679
+ if (qualifiedName === undefined)
680
+ continue;
681
+ const candidates = dedupeTargets((rawIndexes.byQualifiedName.get(qualifiedName) ?? []).filter((candidate) => {
682
+ if (!isDefinition(candidate))
683
+ return false;
684
+ if (candidate.def.filePath === declaration.def.filePath)
685
+ return true;
686
+ if (hasFileLocalCallableLinkage(declaration.def) ||
687
+ hasFileLocalCallableLinkage(candidate.def)) {
688
+ return false;
689
+ }
690
+ return declarationSignatureCompatible(declaration, candidate, graph);
691
+ }));
692
+ const byGraphId = new Map(candidates.map((candidate) => [candidate.id, candidate]));
693
+ if (byGraphId.size === 1) {
694
+ targets.set(defId, byGraphId.values().next().value);
695
+ }
696
+ }
697
+ const aliases = new Map();
698
+ for (const [defId, raw] of rawTargets) {
699
+ const canonical = targets.get(defId);
700
+ if (canonical === undefined || canonical.id === raw.id)
701
+ continue;
702
+ let bucket = aliases.get(canonical.id);
703
+ if (bucket === undefined) {
704
+ bucket = new Set();
705
+ aliases.set(canonical.id, bucket);
706
+ }
707
+ bucket.add(raw.id);
708
+ }
709
+ return {
710
+ targets,
711
+ aliasesByTargetId: new Map([...aliases].map(([targetId, graphIds]) => [targetId, [...graphIds]])),
712
+ };
713
+ }
714
+ function definitionPosition(def) {
715
+ const position = definitionIdPosition(def.nodeId, def.filePath);
716
+ return position === undefined
717
+ ? undefined
718
+ : `${def.filePath}\0${position.line}\0${position.column}`;
719
+ }
720
+ function declarationSignatureCompatible(declaration, definition, graph) {
721
+ const left = declaration.def;
722
+ const right = definition.def;
723
+ if (left.parameterCount !== undefined &&
724
+ right.parameterCount !== undefined &&
725
+ left.parameterCount !== right.parameterCount) {
726
+ return false;
727
+ }
728
+ if (left.parameterTypes !== undefined &&
729
+ !sameOptionalArray(left.parameterTypes, right.parameterTypes)) {
730
+ return false;
731
+ }
732
+ if (left.parameterTypeClasses !== undefined &&
733
+ !sameOptionalArray(left.parameterTypeClasses, right.parameterTypeClasses)) {
734
+ return false;
735
+ }
736
+ const declarationConst = graph.getNode(declaration.id)?.properties.isConst;
737
+ const definitionConst = graph.getNode(definition.id)?.properties.isConst;
738
+ return typeof declarationConst !== 'boolean' || declarationConst === definitionConst;
739
+ }
740
+ function buildGraphCallableIndexes(graph) {
741
+ const byAnchor = new Map();
742
+ const callableByPosition = new Map();
743
+ for (const node of graph.iterNodes()) {
744
+ if (node.label !== 'Function' && node.label !== 'Method' && node.label !== 'Constructor') {
745
+ continue;
746
+ }
747
+ const filePath = node.properties.filePath;
748
+ const name = node.properties.name;
749
+ const zeroBasedLine = node.properties.startLine;
750
+ if (typeof filePath !== 'string' ||
751
+ typeof name !== 'string' ||
752
+ typeof zeroBasedLine !== 'number') {
753
+ continue;
754
+ }
755
+ const oneBasedLine = zeroBasedLine + 1;
756
+ const positionKey = `${filePath}\0${oneBasedLine}\0${withoutSigil(name)}`;
757
+ const existing = callableByPosition.get(positionKey);
758
+ // First wins would be order-dependent; mark the collision instead so an
759
+ // ambiguous position admits nothing rather than something arbitrary.
760
+ callableByPosition.set(positionKey, existing === undefined ? node.id : '');
761
+ const key = `${filePath}\0${node.label}\0${oneBasedLine}\0${name}`;
762
+ const bucket = byAnchor.get(key);
763
+ if (bucket === undefined)
764
+ byAnchor.set(key, [node.id]);
765
+ else
766
+ bucket.push(node.id);
767
+ }
768
+ return { byAnchor, callableByPosition };
769
+ }
770
+ function definitionAnchorKey(def) {
771
+ const line = definitionIdPosition(def.nodeId, def.filePath)?.line;
772
+ const name = simpleName(def.qualifiedName);
773
+ if (line === undefined || name === undefined)
774
+ return undefined;
775
+ return `${def.filePath}\0${def.type}\0${line}\0${name}`;
776
+ }
777
+ function buildGlobalCallableIndex(targets) {
778
+ const out = new Map();
779
+ for (const target of targets) {
780
+ const name = simpleName(target.def.qualifiedName);
781
+ if (name === undefined)
782
+ continue;
783
+ const bucket = out.get(name);
784
+ if (bucket === undefined)
785
+ out.set(name, [target]);
786
+ else
787
+ bucket.push(target);
788
+ }
789
+ return out;
790
+ }
791
+ function buildCallableTargetIndexes(targets, scopes) {
792
+ const byQualifiedName = new Map();
793
+ const byOwnerAndName = new Map();
794
+ const byFileAndName = new Map();
795
+ const add = (index, key, target) => {
796
+ if (key === undefined)
797
+ return;
798
+ const bucket = index.get(key);
799
+ if (bucket === undefined)
800
+ index.set(key, [target]);
801
+ else
802
+ bucket.push(target);
803
+ };
804
+ for (const target of targets) {
805
+ const name = simpleName(target.def.qualifiedName);
806
+ add(byQualifiedName, effectiveQualifiedName(target.def, scopes), target);
807
+ add(byOwnerAndName, target.def.ownerId === undefined || name === undefined
808
+ ? undefined
809
+ : `${target.def.ownerId}\0${name}`, target);
810
+ add(byFileAndName, name === undefined ? undefined : `${target.def.filePath}\0${name}`, target);
811
+ }
812
+ return { byQualifiedName, byOwnerAndName, byFileAndName };
813
+ }
814
+ function resolveSeedCandidates(filePath, inScope, targetName, targetQualifiedName, expected, scopes, graphTargets, globalBySimpleName, targetIndexes, graph) {
815
+ let candidates = [];
816
+ let lexicalShadow = false;
817
+ if (targetQualifiedName !== undefined) {
818
+ for (const defId of scopes.qualifiedNames.get(targetQualifiedName)) {
819
+ const def = scopes.defs.get(defId);
820
+ if (def === undefined)
821
+ continue;
822
+ const target = targetForDef(def, graphTargets);
823
+ if (target !== undefined)
824
+ candidates.push(target);
825
+ }
826
+ if (candidates.length === 0) {
827
+ const normalizedTarget = normalizeSymbolName(targetQualifiedName);
828
+ candidates.push(...(targetIndexes.byQualifiedName.get(normalizedTarget) ?? []));
829
+ }
830
+ if (candidates.length === 0) {
831
+ candidates.push(...resolveBoundMemberCandidates(targetQualifiedName, targetName, inScope, scopes, graphTargets, targetIndexes));
832
+ }
833
+ // HARD INVARIANT — a qualified/bound reference that resolves to nothing
834
+ // must return NOTHING, never degrade to a workspace-wide same-simple-name
835
+ // lookup. Language layers depend on this as their over-capture backstop:
836
+ // Rust's `scoped_identifier` seeds cover non-callables (`Shape::Square`
837
+ // unit variants) and Go emits nothing useful for mis-shaped multi-value
838
+ // forms — both stay edge-free only because this guard holds (#2522
839
+ // review). Relaxing it converts benign over-capture into wrong CALLS.
840
+ if (candidates.length === 0)
841
+ return [];
842
+ }
843
+ else {
844
+ const lexical = lexicalCallableLookup({ name: targetName, inScope, atRange: zeroRange(), indirection: 0, addressOf: false }, scopes, graphTargets);
845
+ candidates = lexical.targets;
846
+ lexicalShadow = lexical.shadowed;
847
+ if (candidates.length === 0 && !lexicalShadow) {
848
+ candidates = [...(globalBySimpleName.get(targetName) ?? [])];
849
+ }
850
+ }
851
+ candidates = narrowTargetCandidates(dedupeTargets(candidates), expected, graph);
852
+ if (isUnresolvedOverloadSet(candidates))
853
+ return [];
854
+ // File-local qualified lookup should not accidentally fan out to same-name
855
+ // defs in unrelated files when the source explicitly names a local target.
856
+ const sameFile = candidates.filter((candidate) => candidate.def.filePath === filePath);
857
+ return sameFile.length > 0 ? sameFile : candidates;
858
+ }
859
+ function resolveOperandCandidates(filePath, operand, expected, scopes, graphTargets, globalBySimpleName, targetIndexes, graph, allowBindingLookup = true) {
860
+ // Plain bindings may resolve through an exact lexical/import binding (needed
861
+ // for cross-file `const assigned = importedTarget`) but never through the
862
+ // workspace-wide simple-name fallback. The latter can attach an unrelated
863
+ // same-named function to a parameter or pointer variable.
864
+ if (operand.expressionKind === undefined || operand.expressionKind === 'anonymous-callable') {
865
+ return [];
866
+ }
867
+ if (operand.expressionKind === 'binding') {
868
+ if (!allowBindingLookup)
869
+ return [];
870
+ const lexical = lexicalCallableLookup(operand, scopes, graphTargets);
871
+ const candidates = narrowTargetCandidates(lexical.targets, expected, graph);
872
+ return isUnresolvedOverloadSet(candidates) ? [] : candidates;
873
+ }
874
+ return resolveSeedCandidates(filePath, operand.inScope, operand.name, operand.qualifiedName, expected, scopes, graphTargets, globalBySimpleName, targetIndexes, graph);
875
+ }
876
+ function resolveBoundMemberCandidates(qualifiedName, memberName, inScope, scopes, graphTargets, targetIndexes) {
877
+ const normalized = normalizeSymbolName(qualifiedName);
878
+ const lastDot = normalized.lastIndexOf('.');
879
+ if (lastDot <= 0)
880
+ return [];
881
+ const receiverRaw = normalized.slice(0, lastDot);
882
+ const receiverName = receiverRaw.slice(receiverRaw.lastIndexOf('.') + 1);
883
+ const receiverOperand = {
884
+ name: receiverName,
885
+ inScope,
886
+ atRange: zeroRange(),
887
+ indirection: 0,
888
+ addressOf: false,
889
+ };
890
+ const typeRef = receiverType(receiverOperand, scopes) ?? receiverName;
891
+ const receiverClass = resolveInheritanceBaseInScope(inScope, typeRef, scopes);
892
+ if (receiverClass === undefined)
893
+ return [];
894
+ const owners = [receiverClass.nodeId, ...scopes.methodDispatch.mroFor(receiverClass.nodeId)];
895
+ const out = [];
896
+ for (const owner of owners) {
897
+ for (const target of targetIndexes.byOwnerAndName.get(`${owner}\0${memberName}`) ?? []) {
898
+ const canonical = targetForDef(target.def, graphTargets);
899
+ if (canonical !== undefined)
900
+ out.push(canonical);
901
+ }
902
+ if (out.length > 0)
903
+ break;
904
+ }
905
+ return dedupeTargets(out);
906
+ }
907
+ function lexicalCallableLookup(operand, scopes, graphTargets) {
908
+ let current = operand.inScope;
909
+ const visited = new Set();
910
+ while (current !== null && !visited.has(current)) {
911
+ visited.add(current);
912
+ const scope = scopes.scopeTree.getScope(current);
913
+ if (scope === undefined)
914
+ return { targets: [], shadowed: false };
915
+ const refs = nearestScopeBindings(current, operand.name, scope.bindings, scopes);
916
+ if (refs.length > 0) {
917
+ const out = [];
918
+ for (const ref of refs) {
919
+ const target = targetForDef(ref.def, graphTargets);
920
+ if (target !== undefined)
921
+ out.push(target);
922
+ }
923
+ return { targets: dedupeTargets(out), shadowed: true };
924
+ }
925
+ current = scope.parent;
926
+ }
927
+ return { targets: [], shadowed: false };
928
+ }
929
+ function nearestScopeBindings(scopeId, name, local, scopes) {
930
+ const out = [];
931
+ const seen = new Set();
932
+ const add = (refs) => {
933
+ for (const ref of refs ?? []) {
934
+ if (seen.has(ref.def.nodeId))
935
+ continue;
936
+ seen.add(ref.def.nodeId);
937
+ out.push(ref);
938
+ }
939
+ };
940
+ add(local.get(name));
941
+ add(scopes.bindings.get(scopeId)?.get(name));
942
+ add(scopes.bindingAugmentations.get(scopeId)?.get(name));
943
+ if (out.length === 0 && scopes.scopeTree.getScope(scopeId)?.kind === 'Module') {
944
+ add(scopes.workspaceFqnBindings.get(name));
945
+ for (const namespace of scopes.accessibleNamespacesByScope.get(scopeId) ?? []) {
946
+ add(scopes.namespaceFqnBindings.get(namespace)?.get(name));
947
+ }
948
+ }
949
+ return out;
950
+ }
951
+ function canonicalBindingKey(filePath, operand, scopes) {
952
+ let current = operand.inScope;
953
+ const visited = new Set();
954
+ let enclosingFunction;
955
+ while (current !== null && !visited.has(current)) {
956
+ visited.add(current);
957
+ const scope = scopes.scopeTree.getScope(current);
958
+ if (scope === undefined)
959
+ break;
960
+ if (enclosingFunction === undefined && scope.kind === 'Function')
961
+ enclosingFunction = current;
962
+ if (nearestScopeBindings(current, operand.name, scope.bindings, scopes).length > 0) {
963
+ return `${filePath}\0${current}\0${operand.name}`;
964
+ }
965
+ current = scope.parent;
966
+ }
967
+ // Some grammars emit parameter type-bindings but no declaration binding.
968
+ // Canonicalize unresolved names to the enclosing function (not the nested
969
+ // block occurrence) so a formal and its body uses still share one cell.
970
+ return `${filePath}\0${enclosingFunction ?? operand.inScope}\0${operand.name}`;
971
+ }
972
+ function sourceOperand(site) {
973
+ switch (site.kind) {
974
+ case 'copy':
975
+ case 'alias':
976
+ case 'address':
977
+ case 'store':
978
+ case 'argument':
979
+ return site.source;
980
+ case 'load':
981
+ return site.pointer;
982
+ default:
983
+ return undefined;
984
+ }
985
+ }
986
+ function indexFormalsByGraphId(parsedFiles, scopes, nodeLookup, targetIndexes, aliasesByTargetId) {
987
+ const building = new Map();
988
+ for (const parsed of parsedFiles) {
989
+ for (const site of parsed.callableFlowSites ?? []) {
990
+ if (site.kind !== 'formal')
991
+ continue;
992
+ const resolvedCaller = resolveCallerGraphId(site.binding.inScope, scopes, nodeLookup, site.ownerRange);
993
+ // Signature-bearing graph ids can be more precise than a scope-only
994
+ // caller lookup. Join the provider-supplied owner identity to canonical
995
+ // defs as a fallback (important for function-reference parameters).
996
+ const fallbackTargets = targetIndexes.byFileAndName.get(`${parsed.filePath}\0${site.ownerName}`) ?? [];
997
+ const anchoredFallbacks = fallbackTargets.filter((target) => target.def.filePath === parsed.filePath &&
998
+ definitionStartsAt(target.def, site.ownerRange.startLine, site.ownerRange.startCol));
999
+ const resolvedFallbacks = fallbackTargets.filter((target) => target.id === resolvedCaller);
1000
+ const ownerTargets = anchoredFallbacks.length > 0
1001
+ ? anchoredFallbacks
1002
+ : resolvedFallbacks.length === 1
1003
+ ? resolvedFallbacks
1004
+ : [];
1005
+ const indexFormal = (graphId, ownerDef) => {
1006
+ let byIndex = building.get(graphId);
1007
+ if (byIndex === undefined) {
1008
+ byIndex = new Map();
1009
+ building.set(graphId, byIndex);
1010
+ }
1011
+ const bucket = byIndex.get(site.parameterIndex);
1012
+ const indexed = { filePath: parsed.filePath, site, ownerDef };
1013
+ if (bucket === undefined)
1014
+ byIndex.set(site.parameterIndex, [indexed]);
1015
+ else if (!bucket.some((entry) => entry.site.binding.inScope === site.binding.inScope &&
1016
+ entry.ownerDef?.nodeId === ownerDef?.nodeId)) {
1017
+ bucket.push(indexed);
1018
+ }
1019
+ };
1020
+ for (const target of ownerTargets) {
1021
+ if (target.def.filePath !== parsed.filePath)
1022
+ continue;
1023
+ if (target.def.parameterCount !== undefined &&
1024
+ site.parameterIndex >= target.def.parameterCount) {
1025
+ continue;
1026
+ }
1027
+ indexFormal(target.id, target.def);
1028
+ for (const aliasId of aliasesByTargetId.get(target.id) ?? []) {
1029
+ indexFormal(aliasId, target.def);
1030
+ }
1031
+ }
1032
+ // Some providers can resolve an owner graph node without retaining a
1033
+ // callable SymbolDefinition. Preserve that established fallback; it
1034
+ // simply cannot participate in overload-owner narrowing.
1035
+ if (ownerTargets.length === 0 &&
1036
+ fallbackTargets.length === 0 &&
1037
+ resolvedCaller !== undefined) {
1038
+ indexFormal(resolvedCaller);
1039
+ }
1040
+ }
1041
+ }
1042
+ return building;
1043
+ }
1044
+ function indexCallSignatures(parsedFiles) {
1045
+ const out = new Map();
1046
+ for (const parsed of parsedFiles) {
1047
+ for (const site of parsed.referenceSites) {
1048
+ if (site.kind !== 'call')
1049
+ continue;
1050
+ const signature = {
1051
+ ...(site.arity !== undefined ? { parameterCount: site.arity } : {}),
1052
+ ...(site.argumentTypes !== undefined ? { parameterTypes: site.argumentTypes } : {}),
1053
+ ...(site.argumentTypeClasses !== undefined
1054
+ ? { parameterTypeClasses: site.argumentTypeClasses }
1055
+ : {}),
1056
+ };
1057
+ const key = callableFlowSiteKey(parsed.filePath, site.atRange);
1058
+ const previous = out.get(key);
1059
+ if (previous === undefined || signatureEvidence(signature) > signatureEvidence(previous)) {
1060
+ out.set(key, signature);
1061
+ }
1062
+ }
1063
+ }
1064
+ return out;
1065
+ }
1066
+ function signatureEvidence(signature) {
1067
+ return ((signature.parameterCount === undefined ? 0 : 1) +
1068
+ (signature.parameterTypes?.filter((type) => type.length > 0).length ?? 0) +
1069
+ (signature.parameterTypeClasses?.length ?? 0));
1070
+ }
1071
+ function narrowIndexedFormals(formals, callSignature) {
1072
+ if (formals.length < 2 || callSignature === undefined)
1073
+ return formals;
1074
+ const owners = dedupeDefinitions(formals.flatMap((formal) => formal.ownerDef ?? []));
1075
+ if (owners.length < 2)
1076
+ return formals;
1077
+ const narrowed = narrowOverloadCandidates(owners, callSignature.parameterCount, callSignature.parameterTypes, { argumentTypeClasses: callSignature.parameterTypeClasses });
1078
+ const allowed = new Set(narrowed.map((owner) => owner.nodeId));
1079
+ return formals.filter((formal) => formal.ownerDef === undefined || allowed.has(formal.ownerDef.nodeId));
1080
+ }
1081
+ function dedupeDefinitions(defs) {
1082
+ return [...new Map(defs.map((def) => [def.nodeId, def])).values()];
1083
+ }
1084
+ function definitionStartsAt(def, line, column) {
1085
+ const position = definitionIdPosition(def.nodeId, def.filePath);
1086
+ return position !== undefined && position.line === line && position.column === column;
1087
+ }
1088
+ function expandMemberTargets(invoke, targets, scopes, graphTargets, targetIndexes, graph) {
1089
+ if (invoke.site.invocationKind !== 'member-pointer' || invoke.site.receiver === undefined) {
1090
+ return new Map(targets);
1091
+ }
1092
+ const typeRef = receiverType(invoke.site.receiver, scopes);
1093
+ if (typeRef === undefined)
1094
+ return new Map(targets);
1095
+ const receiverClass = resolveInheritanceBaseInScope(invoke.site.receiver.inScope, typeRef, scopes);
1096
+ if (receiverClass === undefined)
1097
+ return new Map(targets);
1098
+ const ownerChain = [receiverClass.nodeId, ...scopes.methodDispatch.mroFor(receiverClass.nodeId)];
1099
+ const out = new Map();
1100
+ for (const target of targets.values()) {
1101
+ const name = simpleName(target.def.qualifiedName);
1102
+ if (name === undefined || target.def.ownerId === undefined) {
1103
+ out.set(target.id, target);
1104
+ continue;
1105
+ }
1106
+ // A C++ pointer to a non-virtual member names that exact implementation.
1107
+ // Dynamic replacement is legal only when the pointed-to base method is
1108
+ // virtual; treating every member pointer as virtual invents derived calls.
1109
+ if (graph.getNode(target.id)?.properties.isVirtual !== true) {
1110
+ out.set(target.id, target);
1111
+ continue;
1112
+ }
1113
+ let replacement;
1114
+ for (const ownerId of ownerChain) {
1115
+ const compatible = (targetIndexes.byOwnerAndName.get(`${ownerId}\0${name}`) ?? []).filter((candidate) => sameCallableSignature(target, candidate, graph));
1116
+ const distinct = new Map(compatible.map((candidate) => [candidate.id, candidate]));
1117
+ if (distinct.size !== 1)
1118
+ continue;
1119
+ const candidate = distinct.values().next().value;
1120
+ replacement = targetForDef(candidate.def, graphTargets);
1121
+ if (replacement !== undefined)
1122
+ break;
1123
+ }
1124
+ out.set((replacement ?? target).id, replacement ?? target);
1125
+ }
1126
+ return out;
1127
+ }
1128
+ function receiverType(operand, scopes) {
1129
+ let current = operand.inScope;
1130
+ const visited = new Set();
1131
+ while (current !== null && !visited.has(current)) {
1132
+ visited.add(current);
1133
+ const scope = scopes.scopeTree.getScope(current);
1134
+ if (scope === undefined)
1135
+ return undefined;
1136
+ const hit = scope.typeBindings.get(operand.name);
1137
+ if (hit !== undefined)
1138
+ return hit.rawName;
1139
+ current = scope.parent;
1140
+ }
1141
+ return scopes.workspaceTypeBindings.get(operand.name)?.rawName;
1142
+ }
1143
+ function targetForDef(def, targets) {
1144
+ return targets.get(def.nodeId);
1145
+ }
1146
+ function isCallable(def) {
1147
+ return def.type === 'Function' || def.type === 'Method' || def.type === 'Constructor';
1148
+ }
1149
+ function simpleName(qualifiedName) {
1150
+ if (qualifiedName === undefined || qualifiedName.length === 0)
1151
+ return undefined;
1152
+ const normalized = qualifiedName.replaceAll('::', '.').replaceAll('\\', '.');
1153
+ return normalized.slice(normalized.lastIndexOf('.') + 1);
1154
+ }
1155
+ function effectiveQualifiedName(def, scopes) {
1156
+ const ownName = simpleName(def.qualifiedName);
1157
+ if (ownName === undefined)
1158
+ return undefined;
1159
+ if (def.ownerId === undefined)
1160
+ return normalizeSymbolName(def.qualifiedName);
1161
+ const owner = scopes.defs.get(def.ownerId);
1162
+ const ownerName = owner === undefined ? undefined : effectiveQualifiedName(owner, scopes);
1163
+ return ownerName === undefined ? ownName : `${ownerName}.${ownName}`;
1164
+ }
1165
+ function normalizeSymbolName(name) {
1166
+ return name.replaceAll('::', '.').replaceAll('\\', '.');
1167
+ }
1168
+ function dedupeTargets(targets) {
1169
+ return [...new Map(targets.map((target) => [target.def.nodeId, target])).values()];
1170
+ }
1171
+ function narrowTargetCandidates(candidates, expected, graph) {
1172
+ if (candidates.length === 0)
1173
+ return [];
1174
+ const narrowedDefs = narrowOverloadCandidates(candidates.map((candidate) => candidate.def), expected?.parameterCount, expected?.parameterTypes);
1175
+ const allowedDefs = new Set(narrowedDefs.map((def) => def.nodeId));
1176
+ return candidates.filter((candidate) => {
1177
+ if (!allowedDefs.has(candidate.def.nodeId))
1178
+ return false;
1179
+ if (expected?.isConst === undefined)
1180
+ return true;
1181
+ const candidateIsConst = graph.getNode(candidate.id)?.properties.isConst === true;
1182
+ return candidateIsConst === expected.isConst;
1183
+ });
1184
+ }
1185
+ function narrowTargetMap(targets, expected, graph) {
1186
+ return new Map(narrowTargetCandidates([...targets.values()], expected, graph).map((target) => [
1187
+ target.id,
1188
+ target,
1189
+ ]));
1190
+ }
1191
+ function sameTargetSet(left, right) {
1192
+ if (left === undefined || left.size !== right.size)
1193
+ return false;
1194
+ for (const id of left.keys())
1195
+ if (!right.has(id))
1196
+ return false;
1197
+ return true;
1198
+ }
1199
+ function sameCallableSignature(base, candidate, graph) {
1200
+ const left = base.def;
1201
+ const right = candidate.def;
1202
+ if (left.parameterCount !== undefined &&
1203
+ right.parameterCount !== undefined &&
1204
+ left.parameterCount !== right.parameterCount) {
1205
+ return false;
1206
+ }
1207
+ if (!sameOptionalArray(left.parameterTypes, right.parameterTypes))
1208
+ return false;
1209
+ if (!sameOptionalArray(left.parameterTypeClasses, right.parameterTypeClasses))
1210
+ return false;
1211
+ const leftConst = graph.getNode(base.id)?.properties.isConst === true;
1212
+ const rightConst = graph.getNode(candidate.id)?.properties.isConst === true;
1213
+ return leftConst === rightConst;
1214
+ }
1215
+ function sameOptionalArray(left, right) {
1216
+ if (left === undefined || right === undefined)
1217
+ return left === right;
1218
+ return JSON.stringify(left) === JSON.stringify(right);
1219
+ }
1220
+ function isUnresolvedOverloadSet(targets) {
1221
+ if (targets.length <= 1)
1222
+ return false;
1223
+ const first = targets[0].def;
1224
+ return targets.every((target) => target.def.filePath === first.filePath &&
1225
+ target.def.qualifiedName === first.qualifiedName &&
1226
+ target.def.type === first.type);
1227
+ }
1228
+ function posKey(range) {
1229
+ return `${range.startLine}:${range.startCol}`;
1230
+ }
1231
+ function zeroRange() {
1232
+ return { startLine: 0, startCol: 0, endLine: 0, endCol: 0 };
1233
+ }