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,928 @@
1
+ /**
2
+ * Configurable AST-to-`@callable-flow.*` capture synthesis.
3
+ *
4
+ * The traversal is language-neutral: providers supply their grammar's node
5
+ * vocabulary and the small semantic callbacks (true-reference bindings,
6
+ * callable signatures, protocol invocation names). The central extractor
7
+ * never sees a parser node and shared ingestion code never branches on a
8
+ * language name.
9
+ *
10
+ * ## The cell/site model
11
+ *
12
+ * A *cell* is a named storage location that may hold a callable — a variable,
13
+ * parameter, field or pointer, canonicalized to a binding key by the scope
14
+ * tree. A *site* is one observed fact about cells, emitted here as a capture
15
+ * match and consumed by `passes/callable-value-flow.ts`, which runs them to a
16
+ * fixpoint. The site kinds (`CallableFlowSite`) are:
17
+ *
18
+ * - `seed` — a cell acquires a named callable: `f = target`. Carries
19
+ * `@callable-flow.target-name`, the name the pass resolves against.
20
+ * - `copy` / `alias` — a cell takes another cell's contents, so targets flow
21
+ * between them.
22
+ * - `address` / `store` / `load` — indirection through a pointer cell.
23
+ * - `formal` — a parameter cell of a known function, by index.
24
+ * - `argument` — a callable passed at a call site, binding to that `formal`.
25
+ * - `invoke` — a call THROUGH a cell (`f()`), the site that ultimately becomes
26
+ * a `CALLS` edge once the cell's target set is known.
27
+ *
28
+ * ## The anonymous-callable convention
29
+ *
30
+ * A closure literal has no name to resolve against, so a `seed` whose source
31
+ * is an anonymous callable takes its **destination's** name as
32
+ * `@callable-flow.target-name` — `val f = { }` seeds "the cell `f` holds the
33
+ * callable named `f`". That is deliberately self-referential and only resolves
34
+ * because the binding itself is a callable target: `buildGraphTargetIndex`
35
+ * admits it on the label of the graph node it resolves to, which #2687 makes a
36
+ * `Function` for exactly this construct. Languages whose closure binding does
37
+ * NOT emit a callable graph node get no resolution from the convention alone
38
+ * (#2693).
39
+ *
40
+ * ## Adding a language
41
+ *
42
+ * Supply `CallableFlowCaptureOptions` from `<lang>/captures.ts` and call
43
+ * `synthesizeCallableFlowCaptures`. Two recurring traps:
44
+ *
45
+ * - A **fieldless** assignment/binding node decomposes to nothing under the
46
+ * shared `left`/`name`/`value` fallback in `assignmentParts`. Supply
47
+ * `extractAssignment` (Kotlin's `assignment`, Dart's
48
+ * `initialized_identifier`). Returning `undefined` falls back to the shared
49
+ * path, so one callback can handle the odd node and leave the rest alone.
50
+ * - A binding needs a `SymbolDefinition` for the pass to attach to. Captures
51
+ * alone are not enough: without a `@declaration.*` for the bound name, the
52
+ * seed has no cell to key on.
53
+ *
54
+ * `c/captures.ts` is the fullest worked example (pointers, signatures,
55
+ * overload selection); `dart/captures.ts` the smallest interesting one.
56
+ */
57
+ import { nodeToCapture, syntheticCapture } from './ast-helpers.js';
58
+ /**
59
+ * Emit normalized flow captures in deterministic source order.
60
+ *
61
+ * One explicit DFS supplies all phases below. Query-backed emitters may still
62
+ * perform their existing query walk; this helper never reparses and remains
63
+ * linear in AST size (the scope-capture benchmark guards the scaling ratio).
64
+ */
65
+ export function synthesizeCallableFlowCaptures(root, options) {
66
+ const nodes = collectNodes(root);
67
+ const functions = collectFunctions(nodes, options);
68
+ const knownCallableNames = new Set(functions.map((fn) => fn.name));
69
+ const assignments = collectAssignments(nodes, options);
70
+ const valueBindings = buildValueBindingIndex(nodes, assignments, functions, options);
71
+ const out = [];
72
+ for (const assignment of assignments) {
73
+ emitAssignmentFact(assignment, knownCallableNames, valueBindings, options, out);
74
+ }
75
+ for (const fn of functions)
76
+ emitFormalFacts(fn, options, out);
77
+ for (const node of nodes) {
78
+ if (options.callNodeTypes.has(node.type) &&
79
+ (options.isCallNode === undefined || options.isCallNode(node))) {
80
+ emitCallFacts(node, knownCallableNames, valueBindings, options, out);
81
+ }
82
+ }
83
+ out.sort((a, b) => compareCaptures(firstCapture(a), firstCapture(b)));
84
+ return out;
85
+ }
86
+ function collectNodes(root) {
87
+ const out = [];
88
+ const stack = [root];
89
+ while (stack.length > 0) {
90
+ const node = stack.pop();
91
+ out.push(node);
92
+ const children = node.namedChildren;
93
+ for (let i = children.length - 1; i >= 0; i--) {
94
+ const child = children[i];
95
+ if (child !== null)
96
+ stack.push(child);
97
+ }
98
+ }
99
+ return out;
100
+ }
101
+ function collectFunctions(nodes, options) {
102
+ const out = [];
103
+ for (const node of nodes) {
104
+ if (!options.functionNodeTypes.has(node.type))
105
+ continue;
106
+ const name = options.functionName?.(node) ?? defaultFunctionName(node, options);
107
+ if (name === undefined || name.length === 0)
108
+ continue;
109
+ out.push({ node, name, parameters: functionParameters(node, options) });
110
+ }
111
+ return out;
112
+ }
113
+ function defaultFunctionName(node, options) {
114
+ const direct = node.childForFieldName('name');
115
+ if (direct !== null) {
116
+ const id = terminalIdentifier(direct, options);
117
+ if (id !== undefined)
118
+ return id.text;
119
+ }
120
+ const declarator = node.childForFieldName('declarator');
121
+ if (declarator !== null) {
122
+ const id = bindingIdentifier(declarator, options);
123
+ if (id !== undefined)
124
+ return id.text;
125
+ }
126
+ const parent = node.parent;
127
+ if (parent !== null && options.bindingNodeTypes.has(parent.type)) {
128
+ const destination = assignmentParts(parent, options)[0]?.destination;
129
+ if (destination !== undefined)
130
+ return bindingIdentifier(destination, options)?.text;
131
+ }
132
+ return undefined;
133
+ }
134
+ function functionParameters(node, options) {
135
+ const providerParameters = options.extractFunctionParameters?.(node);
136
+ if (providerParameters !== undefined)
137
+ return providerParameters;
138
+ const explicit = node.childForFieldName('parameters') ??
139
+ node.childForFieldName('parameter') ??
140
+ findFirstDescendantOfTypes(node, options.parameterListNodeTypes);
141
+ if (explicit === null)
142
+ return [];
143
+ const direct = explicit.namedChildren.filter((child) => child !== null &&
144
+ (options.parameterNodeTypes.has(child.type) ||
145
+ (options.parameterListNodeTypes.has(explicit.type) &&
146
+ bindingIdentifier(child, options) !== undefined)));
147
+ return direct;
148
+ }
149
+ function collectAssignments(nodes, options) {
150
+ const out = [];
151
+ const seen = new Set();
152
+ for (const node of nodes) {
153
+ if (!options.bindingNodeTypes.has(node.type) && !options.assignmentNodeTypes.has(node.type)) {
154
+ continue;
155
+ }
156
+ if (seen.has(node.id))
157
+ continue;
158
+ const parts = assignmentParts(node, options);
159
+ if (parts.length === 0)
160
+ continue;
161
+ seen.add(node.id);
162
+ out.push(...parts);
163
+ }
164
+ return out;
165
+ }
166
+ function buildValueBindingIndex(nodes, assignments, functions, options) {
167
+ const assignmentRegionIdsByName = new Map();
168
+ const formalByOwner = new Map();
169
+ const signatureByNameAndRegion = new Map();
170
+ const add = (index, owner, name) => {
171
+ let names = index.get(owner);
172
+ if (names === undefined) {
173
+ names = new Set();
174
+ index.set(owner, names);
175
+ }
176
+ names.add(name);
177
+ };
178
+ for (const assignment of assignments) {
179
+ const destinationNames = new Set();
180
+ const destination = operandSyntax(assignment.destination, options, true);
181
+ if (destination !== undefined)
182
+ destinationNames.add(destination.name);
183
+ // Member-path destinations (`o->run = handler`) store into the MEMBER's
184
+ // name-cell — the seed fact is keyed on `run`, so the store must be
185
+ // visible under that name too or the member-call invoke gate never sees
186
+ // it (#2522 review, M3 ops-vtable pattern).
187
+ const terminal = terminalIdentifier(assignment.destination, options);
188
+ if (terminal !== undefined)
189
+ destinationNames.add(terminal.text);
190
+ for (const name of destinationNames) {
191
+ const region = nearestLexicalRegion(assignment.container, options);
192
+ let regionIds = assignmentRegionIdsByName.get(name);
193
+ if (regionIds === undefined) {
194
+ regionIds = new Set();
195
+ assignmentRegionIdsByName.set(name, regionIds);
196
+ }
197
+ regionIds.add(region.id);
198
+ if (options.functionScopedValueBindings === true) {
199
+ const functionOwner = nearestFunctionOwner(assignment.container, options);
200
+ if (functionOwner !== undefined)
201
+ regionIds.add(functionOwner.id);
202
+ }
203
+ }
204
+ }
205
+ for (const fn of functions) {
206
+ for (const parameter of fn.parameters) {
207
+ const binding = bindingIdentifier(parameter, options);
208
+ if (binding !== undefined)
209
+ add(formalByOwner, fn.node.id, binding.text);
210
+ }
211
+ }
212
+ for (const node of nodes) {
213
+ if (options.callableSignatureDeclarationNodeTypes?.has(node.type) !== true)
214
+ continue;
215
+ const binding = bindingIdentifier(node, options);
216
+ const signature = options.expectedSignature?.(node, node);
217
+ if (binding === undefined || signature === undefined)
218
+ continue;
219
+ // Only callable-typed VARIABLE declarations (`void (*fp)(int);`) create
220
+ // value cells — a plain function/method prototype (`void f(int);`)
221
+ // declares a callee, not a value. A variable declarator interposes a
222
+ // pointer/parenthesized declarator between the declaration and its
223
+ // identifier; a prototype's identifier hangs directly off the function
224
+ // declarator. Indexing prototypes here turned every call to a declared
225
+ // function into an indirect invoke — and, with
226
+ // `emitCanonicalInvokeReference`, minted a free-call reference that
227
+ // bypassed the precise passes' two-phase/ambiguity suppression
228
+ // (#2522 CI: eight cpp resolver tests gained a phantom edge).
229
+ if (!bindingInterposesValueDeclarator(node, binding))
230
+ continue;
231
+ const region = nearestLexicalRegion(node, options);
232
+ let byRegion = signatureByNameAndRegion.get(binding.text);
233
+ if (byRegion === undefined) {
234
+ byRegion = new Map();
235
+ signatureByNameAndRegion.set(binding.text, byRegion);
236
+ }
237
+ byRegion.set(region.id, signature);
238
+ if (options.functionScopedValueBindings === true) {
239
+ const functionOwner = nearestFunctionOwner(node, options);
240
+ if (functionOwner !== undefined)
241
+ byRegion.set(functionOwner.id, signature);
242
+ }
243
+ }
244
+ return { assignmentRegionIdsByName, formalByOwner, signatureByNameAndRegion };
245
+ }
246
+ /** True when a pointer/parenthesized declarator sits between the declaration
247
+ * and its binding identifier — the shape of a callable-typed variable, never
248
+ * of a plain prototype. Only C/C++ supply signature-declaration node types,
249
+ * so the type-name sniff stays scoped to those grammars. */
250
+ function bindingInterposesValueDeclarator(declaration, binding) {
251
+ let node = binding.parent;
252
+ while (node !== null && node.id !== declaration.id) {
253
+ if (node.type.includes('pointer') || node.type.includes('parenthesized'))
254
+ return true;
255
+ node = node.parent;
256
+ }
257
+ return false;
258
+ }
259
+ function nearestFunctionOwner(input, options) {
260
+ const providerOwner = options.lexicalFunctionOwner?.(input);
261
+ if (providerOwner !== undefined)
262
+ return providerOwner;
263
+ let node = input;
264
+ while (node !== null) {
265
+ if (options.functionNodeTypes.has(node.type))
266
+ return node;
267
+ node = node.parent;
268
+ }
269
+ return undefined;
270
+ }
271
+ function nearestLexicalRegion(input, options) {
272
+ const providerOwner = options.lexicalFunctionOwner?.(input);
273
+ let node = input.parent;
274
+ let outermost = input;
275
+ while (node !== null) {
276
+ outermost = node;
277
+ if (providerOwner !== undefined && node.id === providerOwner.id)
278
+ return node;
279
+ if (options.functionNodeTypes.has(node.type) || isLexicalRegionNode(node))
280
+ return node;
281
+ node = node.parent;
282
+ }
283
+ return providerOwner ?? outermost;
284
+ }
285
+ function isLexicalRegionNode(node) {
286
+ return /(?:^|_)(?:block|body|compound_statement|source_file|program|module|script)(?:$|_)/.test(node.type);
287
+ }
288
+ function isVisibleValueBinding(input, name, bindings, options) {
289
+ const assignmentRegionIds = bindings.assignmentRegionIdsByName.get(name);
290
+ const providerOwner = options.lexicalFunctionOwner?.(input);
291
+ if (providerOwner !== undefined &&
292
+ (assignmentRegionIds?.has(providerOwner.id) === true ||
293
+ bindings.formalByOwner.get(providerOwner.id)?.has(name) === true)) {
294
+ return true;
295
+ }
296
+ let node = input;
297
+ while (node !== null) {
298
+ if (assignmentRegionIds?.has(node.id) === true)
299
+ return true;
300
+ if (options.functionNodeTypes.has(node.type) &&
301
+ bindings.formalByOwner.get(node.id)?.has(name) === true) {
302
+ return true;
303
+ }
304
+ node = node.parent;
305
+ }
306
+ if (bindings.formalByOwner.get(undefined)?.has(name) === true)
307
+ return true;
308
+ // A declared callable-typed binding (file-scope `void (*fp)(int);`) is a
309
+ // value binding wherever its declaration is visible — its assignments may
310
+ // live in OTHER functions (the init/register callback pattern), so
311
+ // assignment regions alone under-approximate visibility and the cross-
312
+ // function call emitted no invoke fact at all (#2522 review, H1).
313
+ return visibleCallableSignature(input, name, bindings, options) !== undefined;
314
+ }
315
+ function visibleCallableSignature(input, name, bindings, options) {
316
+ const byRegion = bindings.signatureByNameAndRegion.get(name);
317
+ if (byRegion === undefined)
318
+ return undefined;
319
+ const providerOwner = options.lexicalFunctionOwner?.(input);
320
+ if (providerOwner !== undefined) {
321
+ const signature = byRegion.get(providerOwner.id);
322
+ if (signature !== undefined)
323
+ return signature;
324
+ }
325
+ let node = input;
326
+ while (node !== null) {
327
+ const signature = byRegion.get(node.id);
328
+ if (signature !== undefined)
329
+ return signature;
330
+ node = node.parent;
331
+ }
332
+ return undefined;
333
+ }
334
+ function assignmentParts(node, options) {
335
+ const providerParts = options.extractAssignment?.(node);
336
+ if (providerParts !== undefined) {
337
+ const pairs = Array.isArray(providerParts) ? providerParts : [providerParts];
338
+ return pairs.map((pair) => ({ container: node, ...pair }));
339
+ }
340
+ const destination = node.childForFieldName('left') ??
341
+ node.childForFieldName('name') ??
342
+ node.childForFieldName('pattern') ??
343
+ node.childForFieldName('declarator') ??
344
+ node.childForFieldName('target'); // Swift assignment
345
+ const source = node.childForFieldName('right') ??
346
+ node.childForFieldName('value') ??
347
+ node.childForFieldName('initializer') ??
348
+ node.childForFieldName('default_value') ??
349
+ node.childForFieldName('result'); // Swift assignment
350
+ // Declaration wrappers often contain the real initialized declarator one
351
+ // level below (for example a declarator list).
352
+ if (destination === null || source === null) {
353
+ for (const child of node.namedChildren) {
354
+ if (child === null || child.id === node.id)
355
+ continue;
356
+ if (!options.bindingNodeTypes.has(child.type))
357
+ continue;
358
+ const nested = assignmentParts(child, options);
359
+ if (nested.length > 0)
360
+ return nested;
361
+ }
362
+ }
363
+ if (destination === null || source === null)
364
+ return [];
365
+ return [{ container: node, destination, source }];
366
+ }
367
+ function emitAssignmentFact(assignment, knownCallableNames, valueBindings, options, out) {
368
+ const destination = operandSyntax(assignment.destination, options, options.bindingNodeTypes.has(assignment.container.type));
369
+ const source = operandSyntax(assignment.source, options);
370
+ if (destination === undefined || source === undefined)
371
+ return;
372
+ const signature = options.expectedSignature?.(assignment.container, assignment.destination) ??
373
+ visibleCallableSignature(assignment.container, destination.name, valueBindings, options);
374
+ const sourceIsValueBinding = isVisibleValueBinding(assignment.source, source.name, valueBindings, options);
375
+ if (options.bareNamesAreCalls === true &&
376
+ source.directDesignator &&
377
+ !source.callableReference &&
378
+ !source.anonymousCallable &&
379
+ !sourceIsValueBinding) {
380
+ // The RHS is the produced value of a call, not a reference to the callee.
381
+ return;
382
+ }
383
+ const sourceIsKnownCallable = source.callableReference ||
384
+ source.anonymousCallable ||
385
+ (source.directDesignator &&
386
+ !sourceIsValueBinding &&
387
+ (knownCallableNames.has(source.name) ||
388
+ source.qualifiedName !== undefined ||
389
+ signature !== undefined));
390
+ const flowSource = sourceIsKnownCallable ? asCallableDesignator(source) : source;
391
+ // A call/constructor/composite result is not the function designator that
392
+ // appears inside it. This guard must precede the store path: otherwise
393
+ // `*slot = factory()` stores `factory` itself into `slot`.
394
+ if (!source.directDesignator &&
395
+ !sourceIsKnownCallable &&
396
+ source.indirection === 0 &&
397
+ !source.addressOf) {
398
+ return;
399
+ }
400
+ if (destination.indirection > 0) {
401
+ out.push(binaryFact('store', assignment.container, 'pointer', destination, 'source', flowSource));
402
+ return;
403
+ }
404
+ if (source.addressOf && !sourceIsKnownCallable) {
405
+ // An address of a value binding creates an abstract-cell edge. Addresses
406
+ // of named callables are seeds instead (function designator semantics).
407
+ if (sourceIsValueBinding) {
408
+ out.push(binaryFact('address', assignment.container, 'destination', destination, 'source', source));
409
+ }
410
+ else if (source.directDesignator) {
411
+ // A declaration imported from another file is only visible after scope
412
+ // finalization. Preserve both interpretations here: the address relation
413
+ // supports pointer-to-pointer cells, while the copy lets the solver's
414
+ // exact lexical/import lookup recognize `auto fp = &importedTarget`.
415
+ out.push(binaryFact('address', assignment.container, 'destination', destination, 'source', source));
416
+ out.push(binaryFact('copy', assignment.container, 'destination', destination, 'source', source));
417
+ }
418
+ return;
419
+ }
420
+ if (source.indirection > 0 && !sourceIsKnownCallable) {
421
+ out.push(binaryFact('load', assignment.container, 'destination', destination, 'pointer', source));
422
+ return;
423
+ }
424
+ if (sourceIsKnownCallable) {
425
+ const match = {
426
+ '@callable-flow.seed': nodeToCapture('@callable-flow.seed', assignment.container),
427
+ '@callable-flow.destination': operandCapture('@callable-flow.destination', destination),
428
+ '@callable-flow.target': operandCapture('@callable-flow.target', flowSource),
429
+ '@callable-flow.target-name': syntheticCapture('@callable-flow.target-name', flowSource.node, flowSource.anonymousCallable ? destination.name : flowSource.name),
430
+ };
431
+ if (flowSource.qualifiedName !== undefined) {
432
+ match['@callable-flow.target-qualified-name'] = syntheticCapture('@callable-flow.target-qualified-name', flowSource.node, options.normalizeQualifiedName?.(flowSource.qualifiedName) ?? flowSource.qualifiedName);
433
+ }
434
+ addSignatureCaptures(match, assignment.container, signature);
435
+ out.push(match);
436
+ return;
437
+ }
438
+ const kind = options.isTrueReferenceBinding?.(assignment.container, assignment.destination)
439
+ ? 'alias'
440
+ : 'copy';
441
+ out.push(binaryFact(kind, assignment.container, 'destination', destination, 'source', flowSource));
442
+ }
443
+ function emitFormalFacts(fn, options, out) {
444
+ for (let index = 0; index < fn.parameters.length; index++) {
445
+ const parameter = fn.parameters[index];
446
+ const binding = bindingIdentifier(parameter, options);
447
+ if (binding === undefined)
448
+ continue;
449
+ const mode = options.parameterPassingMode?.(parameter) ?? 'value';
450
+ const match = {
451
+ '@callable-flow.formal': nodeToCapture('@callable-flow.formal', fn.node),
452
+ '@callable-flow.owner': syntheticCapture('@callable-flow.owner', fn.node, fn.name),
453
+ '@callable-flow.binding': syntheticCapture('@callable-flow.binding', binding, binding.text),
454
+ '@callable-flow.parameter-index': syntheticCapture('@callable-flow.parameter-index', binding, String(index)),
455
+ '@callable-flow.passing-mode': syntheticCapture('@callable-flow.passing-mode', parameter, mode),
456
+ };
457
+ addSignatureCaptures(match, parameter, options.expectedSignature?.(parameter, parameter));
458
+ out.push(match);
459
+ }
460
+ }
461
+ function emitCallFacts(call, knownCallableNames, valueBindings, options, out) {
462
+ const calleeNode = options.extractCallCallee?.(call) ??
463
+ call.childForFieldName('function') ??
464
+ call.childForFieldName('callee') ??
465
+ call.childForFieldName('name') ??
466
+ call.childForFieldName('method') ??
467
+ call.firstNamedChild;
468
+ if (calleeNode === null)
469
+ return;
470
+ const callSite = options.callSiteNode?.(call) ?? call;
471
+ const args = callArguments(call, options);
472
+ const member = directCallMemberParts(call, options) ?? memberParts(calleeNode, options);
473
+ const callee = operandSyntax(calleeNode, options);
474
+ const calleeIsValueBinding = callee !== undefined && isVisibleValueBinding(call, callee.name, valueBindings, options);
475
+ const directCalleeName = member === undefined &&
476
+ callee !== undefined &&
477
+ callee.indirection === 0 &&
478
+ !calleeIsValueBinding
479
+ ? callee.name
480
+ : undefined;
481
+ for (let index = 0; index < args.length; index++) {
482
+ const rawSource = operandSyntax(args[index], options);
483
+ if (rawSource === undefined)
484
+ continue;
485
+ // A call/constructor/composite result is a produced value, not a reference
486
+ // to the terminal identifier inside the expression.
487
+ if (!rawSource.directDesignator && rawSource.indirection === 0 && !rawSource.addressOf) {
488
+ continue;
489
+ }
490
+ const sourceIsValueBinding = isVisibleValueBinding(args[index], rawSource.name, valueBindings, options);
491
+ if (options.bareNamesAreCalls === true &&
492
+ rawSource.directDesignator &&
493
+ !rawSource.callableReference &&
494
+ !rawSource.anonymousCallable &&
495
+ !sourceIsValueBinding) {
496
+ // Bare argument name = a call's produced value in this language.
497
+ continue;
498
+ }
499
+ const sourceIsKnownCallable = rawSource.callableReference ||
500
+ rawSource.anonymousCallable ||
501
+ (rawSource.directDesignator &&
502
+ !sourceIsValueBinding &&
503
+ (knownCallableNames.has(rawSource.name) || rawSource.qualifiedName !== undefined));
504
+ // Keep unresolved direct identifiers (not arbitrary expressions): imports
505
+ // and cross-file callable bindings are only known after registry finalize.
506
+ // The solver requires an exact callable lexical binding before propagating,
507
+ // so ordinary value arguments remain inert.
508
+ if (!sourceIsValueBinding &&
509
+ !sourceIsKnownCallable &&
510
+ !rawSource.directDesignator &&
511
+ !rawSource.addressOf) {
512
+ continue;
513
+ }
514
+ const source = sourceIsKnownCallable ? asCallableDesignator(rawSource) : rawSource;
515
+ out.push({
516
+ '@callable-flow.argument': nodeToCapture('@callable-flow.argument', callSite),
517
+ '@callable-flow.source': operandCapture('@callable-flow.source', source),
518
+ ...operandMetadataCaptures('source', source),
519
+ ...(source.indirection > 0
520
+ ? {
521
+ '@callable-flow.source-indirection': syntheticCapture('@callable-flow.source-indirection', source.node, String(source.indirection)),
522
+ }
523
+ : {}),
524
+ ...(source.addressOf
525
+ ? {
526
+ '@callable-flow.source-address': syntheticCapture('@callable-flow.source-address', source.node, 'true'),
527
+ }
528
+ : {}),
529
+ '@callable-flow.parameter-index': syntheticCapture('@callable-flow.parameter-index', args[index], String(index)),
530
+ ...(directCalleeName !== undefined
531
+ ? {
532
+ '@callable-flow.direct-callee-name': syntheticCapture('@callable-flow.direct-callee-name', callee.node, directCalleeName),
533
+ }
534
+ : {}),
535
+ });
536
+ }
537
+ if (member !== undefined) {
538
+ if (member.operator !== undefined &&
539
+ options.memberPointerOperators?.has(member.operator) === true) {
540
+ emitInvoke(callSite, member.member, 'member-pointer', args.length, out, options, member.receiver);
541
+ return;
542
+ }
543
+ if (options.callableProtocolMethods?.has(member.member.name) === true) {
544
+ emitInvoke(callSite, member.receiver, 'callable-object', args.length, out, options);
545
+ return;
546
+ }
547
+ // Field-stored callables (`o->run = handler; o->run(1)` — the C ops-vtable
548
+ // pattern): when a visible assignment wrote this member's name-cell, the
549
+ // member call is an indirect invoke through that cell (#2522 review, M3).
550
+ // Gated on the store so plain accessor calls (`map.get(x)`) stay inert;
551
+ // name-keyed field collapse matches the solver's store/load model.
552
+ // ponytail: same-region joins only — cross-function vtable installs need
553
+ // a field-sensitive cell model.
554
+ if (isVisibleValueBinding(call, member.member.name, valueBindings, options)) {
555
+ emitInvoke(callSite, member.member, 'indirect', args.length, out, options, member.receiver);
556
+ }
557
+ return;
558
+ }
559
+ if (callee === undefined)
560
+ return;
561
+ if (callee.indirection > 0 || calleeIsValueBinding) {
562
+ const invokeCallee = !calleeIsValueBinding && knownCallableNames.has(callee.name)
563
+ ? asCallableDesignator(callee)
564
+ : callee;
565
+ emitInvoke(callSite, invokeCallee, 'indirect', args.length, out, options);
566
+ }
567
+ }
568
+ function emitInvoke(call, callee, invocationKind, arity, out, options, receiver) {
569
+ out.push({
570
+ '@callable-flow.invoke': nodeToCapture('@callable-flow.invoke', call),
571
+ '@callable-flow.callee': operandCapture('@callable-flow.callee', callee),
572
+ ...operandMetadataCaptures('callee', callee),
573
+ ...(callee.indirection > 0
574
+ ? {
575
+ '@callable-flow.callee-indirection': syntheticCapture('@callable-flow.callee-indirection', callee.node, String(callee.indirection)),
576
+ }
577
+ : {}),
578
+ ...(receiver !== undefined
579
+ ? {
580
+ '@callable-flow.receiver': operandCapture('@callable-flow.receiver', receiver),
581
+ ...operandMetadataCaptures('receiver', receiver),
582
+ }
583
+ : {}),
584
+ '@callable-flow.invocation-kind': syntheticCapture('@callable-flow.invocation-kind', call, invocationKind),
585
+ '@callable-flow.arity': syntheticCapture('@callable-flow.arity', call, String(arity)),
586
+ });
587
+ if (invocationKind === 'member-pointer' && receiver !== undefined) {
588
+ // Parenthesized member-pointer callees are not matched by the ordinary
589
+ // member-call query shape.
590
+ // Supply the same canonical callsite contract so the shared resolver can
591
+ // exact-join this fact instead of trusting an unanchored/stale side fact.
592
+ out.push({
593
+ '@reference.call.member': nodeToCapture('@reference.call.member', call),
594
+ '@reference.receiver': operandCapture('@reference.receiver', receiver),
595
+ '@reference.name': operandCapture('@reference.name', callee),
596
+ '@reference.arity': syntheticCapture('@reference.arity', call, String(arity)),
597
+ });
598
+ }
599
+ else if (options.emitCanonicalInvokeReference === true) {
600
+ out.push({
601
+ '@reference.call.free': nodeToCapture('@reference.call.free', call),
602
+ '@reference.name': operandCapture('@reference.name', callee),
603
+ '@reference.arity': syntheticCapture('@reference.arity', call, String(arity)),
604
+ });
605
+ }
606
+ }
607
+ function callArguments(call, options) {
608
+ const list = call.childForFieldName('arguments') ??
609
+ call.childForFieldName('argument') ??
610
+ call.namedChildren.find((child) => child !== null && options.parameterListNodeTypes.has(child.type)) ??
611
+ findFirstDescendantOfTypes(call, options.parameterListNodeTypes) ??
612
+ null;
613
+ if (list === null)
614
+ return [];
615
+ if (options.parameterListNodeTypes.has(list.type)) {
616
+ return list.namedChildren.filter((child) => child !== null && child.type !== 'comment');
617
+ }
618
+ return [list];
619
+ }
620
+ function directCallMemberParts(call, options) {
621
+ const receiverNode = call.childForFieldName('object') ?? call.childForFieldName('receiver');
622
+ const memberNode = call.childForFieldName('method') ?? call.childForFieldName('name');
623
+ if (receiverNode === null || memberNode === null)
624
+ return undefined;
625
+ const receiver = operandSyntax(receiverNode, options);
626
+ const member = operandSyntax(memberNode, options);
627
+ return receiver === undefined || member === undefined ? undefined : { receiver, member };
628
+ }
629
+ function memberParts(input, options) {
630
+ const providerParts = options.memberPointerParts?.(input);
631
+ if (providerParts !== undefined) {
632
+ const receiver = operandSyntax(providerParts.receiver, options);
633
+ const member = operandSyntax(providerParts.member, options);
634
+ if (receiver !== undefined && member !== undefined) {
635
+ return { receiver, member, operator: providerParts.operator };
636
+ }
637
+ }
638
+ let node = input;
639
+ for (let guard = 0; guard < 8; guard++) {
640
+ const wrapped = wrappedExpression(node);
641
+ if (wrapped === null)
642
+ break;
643
+ node = wrapped;
644
+ }
645
+ const receiverNode = node.childForFieldName('object') ??
646
+ node.childForFieldName('argument') ??
647
+ node.childForFieldName('receiver');
648
+ const memberNode = node.childForFieldName('property') ??
649
+ node.childForFieldName('field') ??
650
+ node.childForFieldName('method');
651
+ if (receiverNode === null || memberNode === null)
652
+ return undefined;
653
+ const receiver = operandSyntax(receiverNode, options);
654
+ const member = operandSyntax(memberNode, options);
655
+ if (receiver === undefined || member === undefined)
656
+ return undefined;
657
+ const operator = node.children.find((child) => options.memberPointerOperators?.has(child.type) === true ||
658
+ options.memberPointerOperators?.has(child.text) === true);
659
+ return { receiver, member, ...(operator !== undefined ? { operator: operator.text } : {}) };
660
+ }
661
+ function operandSyntax(input, options, declarationBinding = false) {
662
+ if (declarationBinding) {
663
+ const binding = bindingIdentifier(input, options);
664
+ if (binding === undefined)
665
+ return undefined;
666
+ return {
667
+ name: binding.text,
668
+ node: binding,
669
+ indirection: 0,
670
+ addressOf: false,
671
+ directDesignator: false,
672
+ callableReference: false,
673
+ anonymousCallable: false,
674
+ expressionKind: 'binding',
675
+ };
676
+ }
677
+ const providerReference = options.extractCallableReference?.(input);
678
+ if (providerReference !== undefined) {
679
+ return {
680
+ name: providerReference.name,
681
+ node: providerReference.anchor,
682
+ indirection: 0,
683
+ addressOf: false,
684
+ ...(providerReference.qualifiedName !== undefined
685
+ ? { qualifiedName: providerReference.qualifiedName }
686
+ : {}),
687
+ directDesignator: true,
688
+ callableReference: true,
689
+ anonymousCallable: false,
690
+ expressionKind: providerReference.qualifiedName === undefined ? 'callable-designator' : 'bound-member',
691
+ };
692
+ }
693
+ let node = input;
694
+ let indirection = 0;
695
+ let addressOf = false;
696
+ for (let guard = 0; guard < 16; guard++) {
697
+ if (options.functionNodeTypes.has(node.type)) {
698
+ return {
699
+ name: '<anonymous>',
700
+ node,
701
+ indirection,
702
+ addressOf,
703
+ directDesignator: true,
704
+ callableReference: true,
705
+ anonymousCallable: true,
706
+ expressionKind: 'anonymous-callable',
707
+ };
708
+ }
709
+ const operator = unaryOperator(node);
710
+ if (operator === '&')
711
+ addressOf = true;
712
+ if (operator === '*')
713
+ indirection++;
714
+ const wrapped = wrappedExpression(node);
715
+ if (wrapped === null)
716
+ break;
717
+ node = wrapped;
718
+ }
719
+ const id = terminalIdentifier(node, options);
720
+ if (id === undefined)
721
+ return undefined;
722
+ const isQualified = id.id !== node.id && hasMultipleIdentifierLeaves(node, options);
723
+ const singleNameText = node.text.trim().replace(/^[\$@]+/, '');
724
+ const valueProducingExpression = /call|invocation|creation|new_expression|composite_literal/.test(node.type);
725
+ return {
726
+ name: id.text,
727
+ node: id,
728
+ indirection,
729
+ addressOf,
730
+ ...(isQualified ? { qualifiedName: node.text } : {}),
731
+ directDesignator: options.identifierNodeTypes.has(node.type) ||
732
+ (!isQualified && singleNameText === id.text) ||
733
+ (isQualified && !valueProducingExpression && !/[([{]/.test(node.text)),
734
+ callableReference: options.callableReferenceNodeTypes?.has(node.type) === true,
735
+ anonymousCallable: false,
736
+ expressionKind: isQualified
737
+ ? 'bound-member'
738
+ : options.callableReferenceNodeTypes?.has(node.type) === true
739
+ ? 'callable-designator'
740
+ : 'binding',
741
+ };
742
+ }
743
+ function asCallableDesignator(operand) {
744
+ if (operand.expressionKind !== 'binding')
745
+ return operand;
746
+ return { ...operand, expressionKind: 'callable-designator' };
747
+ }
748
+ function wrappedExpression(node) {
749
+ const field = node.childForFieldName('argument') ??
750
+ node.childForFieldName('expression') ??
751
+ node.childForFieldName('value');
752
+ if (field !== null && field.id !== node.id && node.namedChildCount === 1)
753
+ return field;
754
+ if (node.type.includes('parenthesized') ||
755
+ node.type.includes('reference_expression') ||
756
+ node.type.includes('pointer_expression') ||
757
+ node.type.includes('unary_expression') ||
758
+ node.type.includes('cast_expression')) {
759
+ return node.namedChild(node.namedChildCount - 1);
760
+ }
761
+ return null;
762
+ }
763
+ function unaryOperator(node) {
764
+ for (const child of node.children) {
765
+ if (child.text === '&' || child.text === '*')
766
+ return child.text;
767
+ }
768
+ const trimmed = node.text.trimStart();
769
+ if (trimmed.startsWith('&'))
770
+ return '&';
771
+ if (trimmed.startsWith('*'))
772
+ return '*';
773
+ return undefined;
774
+ }
775
+ /**
776
+ * For a subscript/index expression, the identifier of interest is always in
777
+ * the container operand, never the index: `tbl[i] = h` must bind the cell
778
+ * `tbl` (index-insensitive, Andersen-style), not the index variable `i` —
779
+ * seeding `i` both pollutes a same-named formal and misses the later
780
+ * `tbl[i]()` join (#2522 review). Field names cover the grammars that field
781
+ * their subscript nodes; others keep the generic traversal.
782
+ */
783
+ /** The container operand of a subscript node, per grammar. Exported because the
784
+ * receiver-chain walk needs the same per-grammar answer — two divergent field
785
+ * tables for one question is how a new grammar gets half-supported. */
786
+ export function subscriptBase(node) {
787
+ if (node.childForFieldName('index') === null)
788
+ return null;
789
+ return (node.childForFieldName('argument') ?? // C/C++ subscript_expression
790
+ node.childForFieldName('object') ?? // JS/TS subscript_expression
791
+ node.childForFieldName('value') ?? // Python subscript
792
+ node.childForFieldName('operand') ?? // Go index_expression
793
+ node.childForFieldName('array') // Java array_access
794
+ );
795
+ }
796
+ function bindingIdentifier(node, options) {
797
+ if (options.identifierNodeTypes.has(node.type))
798
+ return node;
799
+ const base = subscriptBase(node);
800
+ if (base !== null)
801
+ return bindingIdentifier(base, options);
802
+ for (const fieldName of ['name', 'declarator', 'pattern', 'left']) {
803
+ const field = node.childForFieldName(fieldName);
804
+ if (field === null || field.id === node.id)
805
+ continue;
806
+ const found = bindingIdentifier(field, options);
807
+ if (found !== undefined)
808
+ return found;
809
+ }
810
+ for (const child of node.namedChildren) {
811
+ if (child === null)
812
+ continue;
813
+ const found = bindingIdentifier(child, options);
814
+ if (found !== undefined)
815
+ return found;
816
+ }
817
+ return undefined;
818
+ }
819
+ function terminalIdentifier(node, options) {
820
+ if (options.identifierNodeTypes.has(node.type))
821
+ return node;
822
+ const base = subscriptBase(node);
823
+ if (base !== null)
824
+ return terminalIdentifier(base, options);
825
+ for (const fieldName of ['name', 'property', 'field', 'method', 'declarator']) {
826
+ const field = node.childForFieldName(fieldName);
827
+ if (field === null || field.id === node.id)
828
+ continue;
829
+ const found = terminalIdentifier(field, options);
830
+ if (found !== undefined)
831
+ return found;
832
+ }
833
+ for (let i = node.namedChildCount - 1; i >= 0; i--) {
834
+ const child = node.namedChild(i);
835
+ if (child === null)
836
+ continue;
837
+ const found = terminalIdentifier(child, options);
838
+ if (found !== undefined)
839
+ return found;
840
+ }
841
+ return undefined;
842
+ }
843
+ function hasMultipleIdentifierLeaves(node, options) {
844
+ let count = 0;
845
+ const stack = [node];
846
+ while (stack.length > 0) {
847
+ const current = stack.pop();
848
+ if (options.identifierNodeTypes.has(current.type)) {
849
+ if (++count > 1)
850
+ return true;
851
+ continue;
852
+ }
853
+ for (const child of current.namedChildren)
854
+ if (child !== null)
855
+ stack.push(child);
856
+ }
857
+ return false;
858
+ }
859
+ function findFirstDescendantOfTypes(root, types) {
860
+ const stack = [...root.namedChildren].filter((child) => child !== null);
861
+ while (stack.length > 0) {
862
+ const node = stack.shift();
863
+ if (types.has(node.type))
864
+ return node;
865
+ for (const child of node.namedChildren)
866
+ if (child !== null)
867
+ stack.push(child);
868
+ }
869
+ return null;
870
+ }
871
+ function binaryFact(kind, anchor, leftRole, left, rightRole, right) {
872
+ return {
873
+ [`@callable-flow.${kind}`]: nodeToCapture(`@callable-flow.${kind}`, anchor),
874
+ [`@callable-flow.${leftRole}`]: operandCapture(`@callable-flow.${leftRole}`, left),
875
+ ...operandMetadataCaptures(leftRole, left),
876
+ ...(left.indirection > 0
877
+ ? {
878
+ [`@callable-flow.${leftRole}-indirection`]: syntheticCapture(`@callable-flow.${leftRole}-indirection`, left.node, String(left.indirection)),
879
+ }
880
+ : {}),
881
+ [`@callable-flow.${rightRole}`]: operandCapture(`@callable-flow.${rightRole}`, right),
882
+ ...operandMetadataCaptures(rightRole, right),
883
+ ...(right.indirection > 0
884
+ ? {
885
+ [`@callable-flow.${rightRole}-indirection`]: syntheticCapture(`@callable-flow.${rightRole}-indirection`, right.node, String(right.indirection)),
886
+ }
887
+ : {}),
888
+ };
889
+ }
890
+ function operandCapture(name, operand) {
891
+ return syntheticCapture(name, operand.node, operand.name);
892
+ }
893
+ function operandMetadataCaptures(role, operand) {
894
+ return {
895
+ [`@callable-flow.${role}-kind`]: syntheticCapture(`@callable-flow.${role}-kind`, operand.node, operand.expressionKind),
896
+ ...(operand.qualifiedName !== undefined
897
+ ? {
898
+ [`@callable-flow.${role}-qualified-name`]: syntheticCapture(`@callable-flow.${role}-qualified-name`, operand.node, operand.qualifiedName),
899
+ }
900
+ : {}),
901
+ };
902
+ }
903
+ function addSignatureCaptures(match, anchor, signature) {
904
+ if (signature?.parameterCount !== undefined) {
905
+ match['@callable-flow.expected-arity'] = syntheticCapture('@callable-flow.expected-arity', anchor, String(signature.parameterCount));
906
+ }
907
+ if (signature?.parameterTypes !== undefined) {
908
+ match['@callable-flow.expected-types'] = syntheticCapture('@callable-flow.expected-types', anchor, JSON.stringify(signature.parameterTypes));
909
+ }
910
+ if (signature?.parameterTypeClasses !== undefined) {
911
+ match['@callable-flow.expected-type-classes'] = syntheticCapture('@callable-flow.expected-type-classes', anchor, JSON.stringify(signature.parameterTypeClasses));
912
+ }
913
+ if (signature?.isConst !== undefined) {
914
+ match['@callable-flow.expected-const'] = syntheticCapture('@callable-flow.expected-const', anchor, String(signature.isConst));
915
+ }
916
+ }
917
+ function firstCapture(match) {
918
+ return Object.values(match)[0];
919
+ }
920
+ function compareCaptures(a, b) {
921
+ if (a === undefined)
922
+ return b === undefined ? 0 : 1;
923
+ if (b === undefined)
924
+ return -1;
925
+ return (a.range.startLine - b.range.startLine ||
926
+ a.range.startCol - b.range.startCol ||
927
+ a.name.localeCompare(b.name));
928
+ }