gitnexus 1.6.9 → 1.6.10-aptos.0

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 (539) hide show
  1. package/README.md +211 -53
  2. package/dist/_shared/graph/types.d.ts +67 -3
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/index.d.ts +1 -0
  5. package/dist/_shared/index.d.ts.map +1 -1
  6. package/dist/_shared/index.js.map +1 -1
  7. package/dist/_shared/integrations/resilient-fetch.d.ts +3 -1
  8. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  9. package/dist/_shared/integrations/resilient-fetch.js +4 -3
  10. package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
  11. package/dist/_shared/language-detection.d.ts.map +1 -1
  12. package/dist/_shared/language-detection.js +2 -0
  13. package/dist/_shared/language-detection.js.map +1 -1
  14. package/dist/_shared/languages.d.ts +2 -0
  15. package/dist/_shared/languages.d.ts.map +1 -1
  16. package/dist/_shared/languages.js +2 -0
  17. package/dist/_shared/languages.js.map +1 -1
  18. package/dist/_shared/lbug/schema-constants.d.ts +2 -2
  19. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  20. package/dist/_shared/lbug/schema-constants.js +8 -0
  21. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  22. package/dist/_shared/pipeline.d.ts +1 -1
  23. package/dist/_shared/pipeline.d.ts.map +1 -1
  24. package/dist/_shared/scope-resolution/callable-flow-site.d.ts +110 -0
  25. package/dist/_shared/scope-resolution/callable-flow-site.d.ts.map +1 -0
  26. package/dist/_shared/scope-resolution/callable-flow-site.js +11 -0
  27. package/dist/_shared/scope-resolution/callable-flow-site.js.map +1 -0
  28. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +1 -1
  29. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
  30. package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -1
  31. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  32. package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
  33. package/dist/_shared/scope-resolution/language-classification.js +1 -0
  34. package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
  35. package/dist/_shared/scope-resolution/parsed-file.d.ts +7 -0
  36. package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
  37. package/dist/_shared/scope-resolution/reference-site.d.ts +9 -1
  38. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  39. package/dist/_shared/scope-resolution/types.d.ts +20 -3
  40. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  41. package/dist/cli/ai-context.d.ts +1 -1
  42. package/dist/cli/ai-context.js +25 -44
  43. package/dist/cli/analyze.d.ts +5 -2
  44. package/dist/cli/analyze.js +197 -11
  45. package/dist/cli/clean.js +17 -3
  46. package/dist/cli/cli-message.d.ts +1 -1
  47. package/dist/cli/doctor.d.ts +18 -0
  48. package/dist/cli/doctor.js +96 -5
  49. package/dist/cli/editor-targets.d.ts +17 -2
  50. package/dist/cli/editor-targets.js +44 -0
  51. package/dist/cli/embeddings.d.ts +12 -0
  52. package/dist/cli/embeddings.js +49 -0
  53. package/dist/cli/eval-server.d.ts +23 -1
  54. package/dist/cli/eval-server.js +126 -8
  55. package/dist/cli/help-i18n.js +6 -0
  56. package/dist/cli/i18n/en.d.ts +18 -8
  57. package/dist/cli/i18n/en.js +18 -8
  58. package/dist/cli/i18n/resources.d.ts +28 -8
  59. package/dist/cli/i18n/zh-CN.d.ts +10 -0
  60. package/dist/cli/i18n/zh-CN.js +18 -8
  61. package/dist/cli/index.js +21 -7
  62. package/dist/cli/lazy-action.d.ts +7 -0
  63. package/dist/cli/lazy-action.js +27 -0
  64. package/dist/cli/mcp.js +6 -3
  65. package/dist/cli/move-availability.d.ts +5 -0
  66. package/dist/cli/move-availability.js +11 -0
  67. package/dist/cli/setup.d.ts +8 -0
  68. package/dist/cli/setup.js +230 -32
  69. package/dist/cli/skill-gen.js +38 -18
  70. package/dist/cli/standard-skills.d.ts +76 -0
  71. package/dist/cli/standard-skills.js +45 -0
  72. package/dist/cli/status.d.ts +4 -1
  73. package/dist/cli/status.js +57 -4
  74. package/dist/cli/tool.js +11 -0
  75. package/dist/cli/uninstall.js +77 -18
  76. package/dist/cli/wiki.d.ts +1 -0
  77. package/dist/cli/wiki.js +7 -1
  78. package/dist/config/ignore-service.d.ts +2 -0
  79. package/dist/config/ignore-service.js +27 -0
  80. package/dist/core/analysis-features.d.ts +21 -0
  81. package/dist/core/analysis-features.js +59 -0
  82. package/dist/core/analyzer-identity.d.ts +74 -0
  83. package/dist/core/analyzer-identity.js +1820 -0
  84. package/dist/core/augmentation/engine.js +13 -8
  85. package/dist/core/embeddings/embedder.d.ts +3 -2
  86. package/dist/core/embeddings/embedder.js +24 -7
  87. package/dist/core/embeddings/embedding-identity.d.ts +11 -0
  88. package/dist/core/embeddings/embedding-identity.js +24 -0
  89. package/dist/core/embeddings/embedding-pipeline.d.ts +36 -1
  90. package/dist/core/embeddings/embedding-pipeline.js +100 -9
  91. package/dist/core/embeddings/http-client.d.ts +33 -3
  92. package/dist/core/embeddings/http-client.js +237 -25
  93. package/dist/core/embeddings/node-module-compat.d.ts +25 -0
  94. package/dist/core/embeddings/node-module-compat.js +25 -0
  95. package/dist/core/embeddings/onnxruntime-common-resolver.js +8 -5
  96. package/dist/core/embeddings/onnxruntime-node-resolver.js +33 -7
  97. package/dist/core/embeddings/runtime-install.d.ts +119 -0
  98. package/dist/core/embeddings/runtime-install.js +372 -0
  99. package/dist/core/embeddings/runtime-support.d.ts +48 -17
  100. package/dist/core/embeddings/runtime-support.js +96 -0
  101. package/dist/core/git-staleness.js +1 -1
  102. package/dist/core/group/bridge-db.js +2 -0
  103. package/dist/core/group/extractors/http-patterns/python.js +246 -108
  104. package/dist/core/group/extractors/manifest-extractor.js +4 -0
  105. package/dist/core/incremental/escalation-gate.d.ts +38 -0
  106. package/dist/core/incremental/escalation-gate.js +48 -0
  107. package/dist/core/incremental/shadow-candidates.d.ts +3 -3
  108. package/dist/core/incremental/shadow-candidates.js +3 -3
  109. package/dist/core/incremental/subgraph-extract.d.ts +2 -2
  110. package/dist/core/incremental/subgraph-extract.js +2 -2
  111. package/dist/core/index-freshness.d.ts +5 -0
  112. package/dist/core/index-freshness.js +13 -0
  113. package/dist/core/ingestion/class-extractors/configs/jvm.js +29 -0
  114. package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
  115. package/dist/core/ingestion/cobol/jcl-processor.js +9 -8
  116. package/dist/core/ingestion/cobol-processor.js +27 -26
  117. package/dist/core/ingestion/community-processor.d.ts +51 -1
  118. package/dist/core/ingestion/community-processor.js +323 -64
  119. package/dist/core/ingestion/emit-references.js +7 -2
  120. package/dist/core/ingestion/filesystem-walker.js +4 -0
  121. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +3 -0
  122. package/dist/core/ingestion/frameworks/spring/analysis-features.js +7 -0
  123. package/dist/core/ingestion/frameworks/spring/bean-candidates.d.ts +30 -0
  124. package/dist/core/ingestion/frameworks/spring/bean-candidates.js +182 -0
  125. package/dist/core/ingestion/frameworks/spring/bean-catalog.d.ts +12 -0
  126. package/dist/core/ingestion/frameworks/spring/bean-catalog.js +26 -0
  127. package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +24 -0
  128. package/dist/core/ingestion/frameworks/spring/config-bindings.js +115 -0
  129. package/dist/core/ingestion/languages/c/captures.js +56 -0
  130. package/dist/core/ingestion/languages/c/query.js +17 -0
  131. package/dist/core/ingestion/languages/c/scope-resolver.js +6 -0
  132. package/dist/core/ingestion/languages/cobol/captures.js +93 -0
  133. package/dist/core/ingestion/languages/cobol/scope-resolver.js +7 -0
  134. package/dist/core/ingestion/languages/cpp/captures.js +365 -75
  135. package/dist/core/ingestion/languages/cpp/scope-resolver.js +14 -0
  136. package/dist/core/ingestion/languages/csharp/captures.js +25 -0
  137. package/dist/core/ingestion/languages/dart/captures.js +90 -2
  138. package/dist/core/ingestion/languages/dart/extension-type-preprocess.d.ts +7 -0
  139. package/dist/core/ingestion/languages/dart/extension-type-preprocess.js +30 -0
  140. package/dist/core/ingestion/languages/dart.js +2 -0
  141. package/dist/core/ingestion/languages/go/captures.js +34 -0
  142. package/dist/core/ingestion/languages/index.d.ts +1 -0
  143. package/dist/core/ingestion/languages/index.js +2 -0
  144. package/dist/core/ingestion/languages/java/analysis-features.d.ts +3 -0
  145. package/dist/core/ingestion/languages/java/analysis-features.js +13 -0
  146. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +22 -0
  147. package/dist/core/ingestion/languages/java/capture-side-channel.js +58 -0
  148. package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
  149. package/dist/core/ingestion/languages/java/captures.js +193 -17
  150. package/dist/core/ingestion/languages/java/package-facts.d.ts +5 -0
  151. package/dist/core/ingestion/languages/java/package-facts.js +9 -0
  152. package/dist/core/ingestion/languages/java/package-siblings.d.ts +3 -16
  153. package/dist/core/ingestion/languages/java/package-siblings.js +8 -147
  154. package/dist/core/ingestion/languages/java/query.js +23 -0
  155. package/dist/core/ingestion/languages/java/scope-resolver.js +23 -0
  156. package/dist/core/ingestion/languages/java/spring-bean-metadata.d.ts +2 -0
  157. package/dist/core/ingestion/languages/java/spring-bean-metadata.js +8 -0
  158. package/dist/core/ingestion/languages/java/spring-config-bindings.d.ts +23 -0
  159. package/dist/core/ingestion/languages/java/spring-config-bindings.js +215 -0
  160. package/dist/core/ingestion/languages/java.js +3 -0
  161. package/dist/core/ingestion/languages/javascript/captures.js +16 -0
  162. package/dist/core/ingestion/languages/javascript/query.js +21 -0
  163. package/dist/core/ingestion/languages/jvm/package-facts.d.ts +35 -0
  164. package/dist/core/ingestion/languages/jvm/package-facts.js +40 -0
  165. package/dist/core/ingestion/languages/jvm/package-siblings.d.ts +14 -0
  166. package/dist/core/ingestion/languages/jvm/package-siblings.js +129 -0
  167. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +17 -3
  168. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +42 -8
  169. package/dist/core/ingestion/languages/kotlin/captures.js +59 -0
  170. package/dist/core/ingestion/languages/kotlin/package-facts.d.ts +5 -0
  171. package/dist/core/ingestion/languages/kotlin/package-facts.js +9 -0
  172. package/dist/core/ingestion/languages/kotlin/package-siblings.d.ts +4 -0
  173. package/dist/core/ingestion/languages/kotlin/package-siblings.js +8 -0
  174. package/dist/core/ingestion/languages/kotlin/query.js +19 -0
  175. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +9 -1
  176. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.d.ts +2 -0
  177. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.js +8 -0
  178. package/dist/core/ingestion/languages/kotlin.js +5 -6
  179. package/dist/core/ingestion/languages/move.d.ts +1 -0
  180. package/dist/core/ingestion/languages/move.js +27 -0
  181. package/dist/core/ingestion/languages/php/captures.js +40 -0
  182. package/dist/core/ingestion/languages/php/import-decomposer.js +12 -0
  183. package/dist/core/ingestion/languages/php/import-target.d.ts +2 -1
  184. package/dist/core/ingestion/languages/php/import-target.js +110 -2
  185. package/dist/core/ingestion/languages/php/interpret.js +10 -0
  186. package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
  187. package/dist/core/ingestion/languages/python/captures.d.ts +3 -4
  188. package/dist/core/ingestion/languages/python/captures.js +24 -5
  189. package/dist/core/ingestion/languages/python/interpret.js +4 -0
  190. package/dist/core/ingestion/languages/python/receiver-binding.d.ts +15 -2
  191. package/dist/core/ingestion/languages/python/receiver-binding.js +96 -2
  192. package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
  193. package/dist/core/ingestion/languages/python/simple-hooks.js +15 -5
  194. package/dist/core/ingestion/languages/ruby/captures.js +42 -0
  195. package/dist/core/ingestion/languages/rust/captures.js +13 -0
  196. package/dist/core/ingestion/languages/rust/interpret.js +18 -0
  197. package/dist/core/ingestion/languages/rust/query.js +9 -0
  198. package/dist/core/ingestion/languages/rust/range-binding.js +6 -2
  199. package/dist/core/ingestion/languages/swift/captures.js +12 -0
  200. package/dist/core/ingestion/languages/typescript/captures.js +21 -0
  201. package/dist/core/ingestion/languages/typescript/nuxt-auto-imports.js +2 -1
  202. package/dist/core/ingestion/languages/typescript/query.js +37 -0
  203. package/dist/core/ingestion/markdown-processor.js +3 -2
  204. package/dist/core/ingestion/model/registration-table.js +1 -0
  205. package/dist/core/ingestion/parsing-processor.d.ts +3 -1
  206. package/dist/core/ingestion/parsing-processor.js +36 -1
  207. package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
  208. package/dist/core/ingestion/pipeline-phases/index.js +2 -0
  209. package/dist/core/ingestion/pipeline-phases/parse-impl.js +56 -2
  210. package/dist/core/ingestion/pipeline-phases/parse.d.ts +0 -2
  211. package/dist/core/ingestion/pipeline-phases/parse.js +12 -3
  212. package/dist/core/ingestion/pipeline-phases/processes.d.ts +8 -0
  213. package/dist/core/ingestion/pipeline-phases/processes.js +11 -1
  214. package/dist/core/ingestion/pipeline-phases/spring-config.d.ts +37 -0
  215. package/dist/core/ingestion/pipeline-phases/spring-config.js +433 -0
  216. package/dist/core/ingestion/pipeline-phases/standalone-ingest.d.ts +10 -0
  217. package/dist/core/ingestion/pipeline-phases/standalone-ingest.js +6 -0
  218. package/dist/core/ingestion/pipeline.d.ts +4 -2
  219. package/dist/core/ingestion/pipeline.js +5 -2
  220. package/dist/core/ingestion/resolve-references.js +12 -0
  221. package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +83 -0
  222. package/dist/core/ingestion/route-extractors/constant-resolver.js +131 -0
  223. package/dist/core/ingestion/route-extractors/python-const-resolver.d.ts +75 -0
  224. package/dist/core/ingestion/route-extractors/python-const-resolver.js +299 -0
  225. package/dist/core/ingestion/scope-extractor.js +306 -43
  226. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +71 -2
  227. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +7 -7
  228. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +8 -7
  229. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +3 -1
  230. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +6 -0
  231. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +1 -0
  232. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +4 -1
  233. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +7 -2
  234. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +47 -0
  235. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1138 -0
  236. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +16 -4
  237. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +97 -1
  238. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +60 -0
  239. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +111 -0
  240. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +4 -3
  241. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +5 -0
  242. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +25 -38
  243. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +6 -0
  244. package/dist/core/ingestion/scope-resolution/pipeline/run.js +147 -35
  245. package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
  246. package/dist/core/ingestion/scope-resolution/scope/walkers.js +73 -44
  247. package/dist/core/ingestion/taint/typescript-model.js +34 -2
  248. package/dist/core/ingestion/tree-sitter-queries.d.ts +2 -2
  249. package/dist/core/ingestion/tree-sitter-queries.js +23 -2
  250. package/dist/core/ingestion/type-extractors/jvm.js +17 -2
  251. package/dist/core/ingestion/utils/ast-helpers.d.ts +1 -0
  252. package/dist/core/ingestion/utils/ast-helpers.js +153 -2
  253. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +94 -0
  254. package/dist/core/ingestion/utils/callable-flow-captures.js +878 -0
  255. package/dist/core/ingestion/utils/line-base.d.ts +20 -0
  256. package/dist/core/ingestion/utils/line-base.js +20 -0
  257. package/dist/core/ingestion/utils/symbol-labels.d.ts +21 -0
  258. package/dist/core/ingestion/utils/symbol-labels.js +45 -0
  259. package/dist/core/ingestion/workers/parse-worker.d.ts +34 -0
  260. package/dist/core/ingestion/workers/parse-worker.js +40 -5
  261. package/dist/core/ingestion/workers/result-merge.js +4 -0
  262. package/dist/core/ingestion/workers/worker-pool.d.ts +28 -0
  263. package/dist/core/ingestion/workers/worker-pool.js +128 -28
  264. package/dist/core/lbug/csv-generator.d.ts +15 -0
  265. package/dist/core/lbug/csv-generator.js +124 -27
  266. package/dist/core/lbug/cypher-escape.d.ts +20 -0
  267. package/dist/core/lbug/cypher-escape.js +20 -0
  268. package/dist/core/lbug/extension-load-error.d.ts +67 -0
  269. package/dist/core/lbug/extension-load-error.js +326 -0
  270. package/dist/core/lbug/extension-loader.d.ts +17 -2
  271. package/dist/core/lbug/extension-loader.js +38 -13
  272. package/dist/core/lbug/lbug-adapter.d.ts +203 -2
  273. package/dist/core/lbug/lbug-adapter.js +527 -86
  274. package/dist/core/lbug/lbug-config.d.ts +56 -2
  275. package/dist/core/lbug/lbug-config.js +267 -7
  276. package/dist/core/lbug/move-columns.d.ts +7 -0
  277. package/dist/core/lbug/move-columns.js +86 -0
  278. package/dist/core/lbug/native-check.d.ts +40 -0
  279. package/dist/core/lbug/native-check.js +90 -0
  280. package/dist/core/lbug/node-table-layout.d.ts +29 -0
  281. package/dist/core/lbug/node-table-layout.js +119 -0
  282. package/dist/core/lbug/pool-adapter.d.ts +23 -1
  283. package/dist/core/lbug/pool-adapter.js +115 -8
  284. package/dist/core/lbug/schema.d.ts +4 -3
  285. package/dist/core/lbug/schema.js +16 -16
  286. package/dist/core/lbug/sidecar-recovery.d.ts +172 -0
  287. package/dist/core/lbug/sidecar-recovery.js +418 -16
  288. package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
  289. package/dist/core/move/artifact-download.d.ts +19 -0
  290. package/dist/core/move/artifact-download.js +179 -0
  291. package/dist/core/move/compiler-facts.d.ts +120 -0
  292. package/dist/core/move/compiler-facts.js +9 -0
  293. package/dist/core/move/consistency.d.ts +28 -0
  294. package/dist/core/move/consistency.js +98 -0
  295. package/dist/core/move/constants.d.ts +98 -0
  296. package/dist/core/move/constants.js +136 -0
  297. package/dist/core/move/discovery.d.ts +10 -0
  298. package/dist/core/move/discovery.js +22 -0
  299. package/dist/core/move/entry-points.d.ts +14 -0
  300. package/dist/core/move/entry-points.js +40 -0
  301. package/dist/core/move/facts-mapper.d.ts +75 -0
  302. package/dist/core/move/facts-mapper.js +534 -0
  303. package/dist/core/move/install-lock.d.ts +14 -0
  304. package/dist/core/move/install-lock.js +102 -0
  305. package/dist/core/move/install.d.ts +39 -0
  306. package/dist/core/move/install.js +391 -0
  307. package/dist/core/move/mcp-client.d.ts +115 -0
  308. package/dist/core/move/mcp-client.js +436 -0
  309. package/dist/core/move/move-ingest.d.ts +49 -0
  310. package/dist/core/move/move-ingest.js +320 -0
  311. package/dist/core/move/provision.d.ts +19 -0
  312. package/dist/core/move/provision.js +91 -0
  313. package/dist/core/move/release.d.ts +6 -0
  314. package/dist/core/move/release.js +10 -0
  315. package/dist/core/move/symbol-id.d.ts +35 -0
  316. package/dist/core/move/symbol-id.js +65 -0
  317. package/dist/core/move/type-parser.d.ts +11 -0
  318. package/dist/core/move/type-parser.js +38 -0
  319. package/dist/core/platform/capabilities.d.ts +0 -1
  320. package/dist/core/platform/capabilities.js +39 -8
  321. package/dist/core/run-analyze.d.ts +3 -3
  322. package/dist/core/run-analyze.js +1001 -184
  323. package/dist/core/search/fts-indexes.d.ts +31 -0
  324. package/dist/core/search/fts-indexes.js +73 -0
  325. package/dist/core/search/fts-schema.js +2 -0
  326. package/dist/core/tree-sitter/safe-parse.d.ts +8 -3
  327. package/dist/core/tree-sitter/safe-parse.js +21 -7
  328. package/dist/core/wiki/graph-queries.js +6 -5
  329. package/dist/core/wiki/llm-client.d.ts +8 -2
  330. package/dist/core/wiki/llm-client.js +41 -5
  331. package/dist/mcp/core/embedder.js +16 -2
  332. package/dist/mcp/http-transport.d.ts +5 -0
  333. package/dist/mcp/http-transport.js +19 -5
  334. package/dist/mcp/local/bean-metadata.d.ts +2 -0
  335. package/dist/mcp/local/bean-metadata.js +25 -0
  336. package/dist/mcp/local/line-display.d.ts +22 -0
  337. package/dist/mcp/local/line-display.js +3 -0
  338. package/dist/mcp/local/local-backend.d.ts +19 -1
  339. package/dist/mcp/local/local-backend.js +402 -155
  340. package/dist/mcp/local/pdg-impact.d.ts +5 -3
  341. package/dist/mcp/local/pdg-impact.js +5 -2
  342. package/dist/mcp/output-budget.d.ts +5 -0
  343. package/dist/mcp/output-budget.js +52 -0
  344. package/dist/mcp/read-only-policy.d.ts +12 -0
  345. package/dist/mcp/read-only-policy.js +102 -0
  346. package/dist/mcp/repository-policy.d.ts +34 -0
  347. package/dist/mcp/repository-policy.js +328 -0
  348. package/dist/mcp/resources.js +32 -5
  349. package/dist/mcp/server.d.ts +5 -2
  350. package/dist/mcp/server.js +29 -9
  351. package/dist/mcp/tools.d.ts +0 -8
  352. package/dist/mcp/tools.js +102 -5
  353. package/dist/server/analyze-job.d.ts +3 -0
  354. package/dist/server/analyze-job.js +17 -0
  355. package/dist/server/analyze-launch.d.ts +6 -0
  356. package/dist/server/analyze-launch.js +82 -6
  357. package/dist/server/analyze-worker-core.d.ts +2 -1
  358. package/dist/server/analyze-worker-core.js +5 -2
  359. package/dist/server/analyze-worker.js +29 -6
  360. package/dist/server/api.d.ts +30 -0
  361. package/dist/server/api.js +120 -34
  362. package/dist/server/mcp-http.d.ts +1 -1
  363. package/dist/server/mcp-http.js +4 -2
  364. package/dist/server/upload-ingest.js +2 -1
  365. package/dist/server/validation.js +2 -1
  366. package/dist/storage/git.d.ts +31 -0
  367. package/dist/storage/git.js +111 -1
  368. package/dist/storage/parse-cache.js +7 -1
  369. package/dist/storage/parsedfile-store.d.ts +8 -0
  370. package/dist/storage/parsedfile-store.js +165 -1
  371. package/dist/storage/repo-manager.d.ts +194 -2
  372. package/dist/storage/repo-manager.js +56 -1
  373. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +50 -3
  374. package/hooks/claude/gitnexus-hook.cjs +59 -9
  375. package/hooks/claude/pre-tool-use.sh +0 -0
  376. package/hooks/claude/session-start.sh +0 -0
  377. package/package.json +21 -15
  378. package/scripts/cross-platform-tests.ts +56 -0
  379. package/scripts/ensure-fts.ts +43 -0
  380. package/scripts/install-duckdb-extension.mjs +85 -24
  381. package/scripts/run-cross-platform.ts +61 -6
  382. package/scripts/shard-arg.ts +30 -0
  383. package/scripts/sync-plugin-manifests.mjs +192 -0
  384. package/skills/gitnexus-lfg/README.md +55 -0
  385. package/skills/gitnexus-lfg/SKILL.md +86 -0
  386. package/skills/gitnexus-plan/README.md +142 -0
  387. package/skills/gitnexus-plan/SKILL.md +348 -0
  388. package/skills/gitnexus-plan/references/context-ledger.md +137 -0
  389. package/skills/gitnexus-plan/references/context-pack.md +126 -0
  390. package/skills/gitnexus-plan/references/evidence-provenance.md +272 -0
  391. package/skills/gitnexus-plan/references/pdg-slice.md +109 -0
  392. package/skills/gitnexus-plan/references/plan-template.md +201 -0
  393. package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +2084 -0
  394. package/skills/gitnexus-review/SKILL.md +273 -0
  395. package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +42 -0
  396. package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +39 -0
  397. package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +37 -0
  398. package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +40 -0
  399. package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +42 -0
  400. package/skills/gitnexus-review/ci-personas/ci-security-lens.md +39 -0
  401. package/skills/gitnexus-work/README.md +71 -0
  402. package/skills/gitnexus-work/SKILL.md +269 -0
  403. package/skills/gitnexus-work/references/evidence-provenance.md +272 -0
  404. package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2084 -0
  405. package/web/assets/ProcessFlowModal-B_bfBySy.js +22 -0
  406. package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
  407. package/web/assets/agent-Bqxn-abU.js +626 -0
  408. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +1 -0
  409. package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +36 -0
  410. package/web/assets/{blockDiagram-7IZFK4PR-BkWhpzWB.js → blockDiagram-7IZFK4PR-DBefcjof.js} +7 -7
  411. package/web/assets/{c4Diagram-Y2BXMSZH-DtBvpzWD.js → c4Diagram-Y2BXMSZH-EjWnjEJl.js} +6 -6
  412. package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +4 -0
  413. package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +1 -0
  414. package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +321 -0
  415. package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +159 -0
  416. package/web/assets/{chunk-6764PJDD-DpIS7hxD.js → chunk-6764PJDD-C7xxk063.js} +1 -1
  417. package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +124 -0
  418. package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +32 -0
  419. package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +10 -0
  420. package/web/assets/chunk-7W6UQGC5-pyKGssV3.js +1 -0
  421. package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +1 -0
  422. package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +1 -0
  423. package/web/assets/{chunk-INKRHTLW-Nu4ri9P-.js → chunk-INKRHTLW-Ckl3_KkO.js} +13 -13
  424. package/web/assets/chunk-J5EP6P6S-L19oz55R.js +1 -0
  425. package/web/assets/{chunk-KGFNY3KK-JGMJvKCK.js → chunk-KGFNY3KK-BZeP-55u.js} +17 -17
  426. package/web/assets/chunk-KGYTTC2M-zm6n242I.js +1 -0
  427. package/web/assets/{chunk-KRXBNO2N-BW5o0KUN.js → chunk-KRXBNO2N-C-UNuKKf.js} +1 -1
  428. package/web/assets/{chunk-LCXTWHL2-CfLLCywY.js → chunk-LCXTWHL2-C162wE5z.js} +5 -5
  429. package/web/assets/chunk-LII3EMHJ-BL6lKJ_P.js +1 -0
  430. package/web/assets/chunk-LRIF4GLE-n59lhprL.js +1 -0
  431. package/web/assets/chunk-QA3QBVWF-DVXPOIxe.js +2 -0
  432. package/web/assets/chunk-RERM46MO-B5dAdWpP.js +1 -0
  433. package/web/assets/chunk-RG4AUYOV-ZNgyLFq6.js +206 -0
  434. package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +1 -0
  435. package/web/assets/chunk-RLI5ZMPA-CkXZ0y0U.js +1 -0
  436. package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +1 -0
  437. package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +1 -0
  438. package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +1 -0
  439. package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +1 -0
  440. package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +2 -0
  441. package/web/assets/{chunk-W44A43WB-JqMLIpR0.js → chunk-W44A43WB-BN8EQc_u.js} +1 -1
  442. package/web/assets/chunk-ZXARS5L4-C3v-4Fsw.js +1 -0
  443. package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +1 -0
  444. package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +1 -0
  445. package/web/assets/cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js +1 -0
  446. package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +4 -0
  447. package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +43 -0
  448. package/web/assets/diagram-GF46GFSD-B2atbzmU.js +24 -0
  449. package/web/assets/diagram-HNR7UZ2L-DVRltWbL.js +3 -0
  450. package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +24 -0
  451. package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +10 -0
  452. package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +85 -0
  453. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +1 -0
  454. package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +162 -0
  455. package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +292 -0
  456. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +1 -0
  457. package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +106 -0
  458. package/web/assets/index-CX_fADmQ.css +2 -0
  459. package/web/assets/index-D1Z3dGGz.js +575 -0
  460. package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +1 -0
  461. package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +2 -0
  462. package/web/assets/{ishikawaDiagram-BNXS4ZKH-DfYpxnE5.js → ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js} +6 -6
  463. package/web/assets/journeyDiagram-M6C3CM3L-C6wjooas.js +139 -0
  464. package/web/assets/kanban-definition-75IXJCU3-5_UVY79g.js +89 -0
  465. package/web/assets/{katex-K3KEBU37-CTc5BslQ.js → katex-K3KEBU37-qRQBy-EZ.js} +2 -2
  466. package/web/assets/{mindmap-definition-2TDM6QVE-DypvbOMQ.js → mindmap-definition-2TDM6QVE-8xDLzk2e.js} +29 -29
  467. package/web/assets/node-Ct_zna8U.js +8 -0
  468. package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +1 -0
  469. package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +1 -0
  470. package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +30 -0
  471. package/web/assets/preload-helper-Czpn1I53.js +1 -0
  472. package/web/assets/{quadrantDiagram-VICAPDV7-yXSZ2lLz.js → quadrantDiagram-VICAPDV7-DR54jOeR.js} +6 -6
  473. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +1 -0
  474. package/web/assets/requirementDiagram-JXO7QTGE-PEkg7sKC.js +84 -0
  475. package/web/assets/rolldown-runtime-QTnfLwEv.js +1 -0
  476. package/web/assets/sankeyDiagram-URQDO5SZ-DDWEtjcs.js +40 -0
  477. package/web/assets/sdk-CzHHH8tD.js +37 -0
  478. package/web/assets/sequenceDiagram-VS2MUI6T-Bv-uwANx.js +162 -0
  479. package/web/assets/src-JV30wyV8.js +1 -0
  480. package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +1 -0
  481. package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +1 -0
  482. package/web/assets/timeline-definition-O6YCAMPW-Qmsuo7qS.js +120 -0
  483. package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +1 -0
  484. package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +1 -0
  485. package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +34 -0
  486. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +1 -0
  487. package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +78 -0
  488. package/web/assets/{xychartDiagram-N2JHSOCM-BOLm0eNm.js → xychartDiagram-N2JHSOCM-CoZ_Tits.js} +6 -6
  489. package/web/index.html +18 -10
  490. package/skills/gitnexus-pr-review.md +0 -163
  491. package/web/assets/agent-Dli_x7bU.js +0 -660
  492. package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +0 -1
  493. package/web/assets/architectureDiagram-UL44E2DR-dEkqUZN9.js +0 -36
  494. package/web/assets/chunk-3SSMPTDK-B4_etUhr.js +0 -321
  495. package/web/assets/chunk-67TQ5CYL-4sNPJU1q.js +0 -124
  496. package/web/assets/chunk-7W6UQGC5-KyEG0HQg.js +0 -1
  497. package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +0 -161
  498. package/web/assets/chunk-LII3EMHJ-D-jm-dLa.js +0 -1
  499. package/web/assets/chunk-QA3QBVWF-BgRW3SXd.js +0 -2
  500. package/web/assets/chunk-RG4AUYOV-CqWzWsV3.js +0 -206
  501. package/web/assets/chunk-T2UQINTJ-DSBqkzH7.js +0 -1
  502. package/web/assets/chunk-UY5QBCOK-DyF0vyGd.js +0 -1
  503. package/web/assets/chunk-ZXARS5L4-CxN8oiwI.js +0 -1
  504. package/web/assets/classDiagram-KGZ6W3CR-CMne4tG9.js +0 -1
  505. package/web/assets/classDiagram-v2-72OJOZXJ-CMne4tG9.js +0 -1
  506. package/web/assets/cose-bilkent-UX7MHV2Q-D71wNYRJ.js +0 -1
  507. package/web/assets/dagre-ND4H6XIP-Co5rRx9X.js +0 -4
  508. package/web/assets/diagram-3NCE3AQN-DBp4O00j.js +0 -43
  509. package/web/assets/diagram-GF46GFSD-6N_8yS0i.js +0 -24
  510. package/web/assets/diagram-HNR7UZ2L-DFCfd5LI.js +0 -3
  511. package/web/assets/diagram-QXG6HAR7-Di093rFg.js +0 -24
  512. package/web/assets/diagram-WEQXMOUZ-DZWi4SUN.js +0 -10
  513. package/web/assets/erDiagram-L5TCEMPS-8X1y6R4Y.js +0 -85
  514. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +0 -1
  515. package/web/assets/flowDiagram-H6V6AXG4-CMpY8Ufn.js +0 -162
  516. package/web/assets/ganttDiagram-JCBTUEKG-D3iL2Aet.js +0 -292
  517. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +0 -1
  518. package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +0 -106
  519. package/web/assets/index-KctnI3Vq.js +0 -635
  520. package/web/assets/index-_lgn7hs5.css +0 -2
  521. package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +0 -1
  522. package/web/assets/infoDiagram-3YFTVSEB-BaLMZkUg.js +0 -2
  523. package/web/assets/journeyDiagram-M6C3CM3L-CvArszLo.js +0 -139
  524. package/web/assets/kanban-definition-75IXJCU3-CpfVLLf9.js +0 -89
  525. package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +0 -1
  526. package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +0 -1
  527. package/web/assets/pieDiagram-CU6KROY3-s27EFWgP.js +0 -30
  528. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +0 -1
  529. package/web/assets/requirementDiagram-JXO7QTGE-CWhqInuf.js +0 -84
  530. package/web/assets/sankeyDiagram-URQDO5SZ-1qEjlFIB.js +0 -40
  531. package/web/assets/sequenceDiagram-VS2MUI6T-RyTlZ5cR.js +0 -162
  532. package/web/assets/stateDiagram-7D4R322I-DTjVfX4A.js +0 -1
  533. package/web/assets/stateDiagram-v2-36443NZ5-xY9_k9_Q.js +0 -1
  534. package/web/assets/timeline-definition-O6YCAMPW-DrrqLYAf.js +0 -120
  535. package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +0 -1
  536. package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +0 -1
  537. package/web/assets/vennDiagram-MWXL3ELB-B0RkWAim.js +0 -34
  538. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +0 -1
  539. package/web/assets/wardleyDiagram-CUQ6CDDI-boUxiQ5F.js +0 -78
@@ -111,6 +111,11 @@ export function extract(matches, filePath, provider) {
111
111
  // ── Pass 5: collect reference sites ─────────────────────────────────
112
112
  const referenceSites = [];
113
113
  pass5CollectReferences(partitioned.reference, positionIndex, filePath, referenceSites, provider, scopeTree);
114
+ // ── Pass 6: collect normalized callable-value-flow facts ───────────
115
+ // Kept after (and independent from) Pass 5 so existing reference-site
116
+ // extraction remains byte-identical.
117
+ const callableFlowSites = [];
118
+ pass6CollectCallableFlows(partitioned.callableFlow, positionIndex, filePath, callableFlowSites);
114
119
  // Freeze Scope drafts into final shape and return.
115
120
  const frozenScopes = scopeDrafts.map(draftToScope);
116
121
  return Object.freeze({
@@ -120,12 +125,15 @@ export function extract(matches, filePath, provider) {
120
125
  parsedImports: Object.freeze(parsedImports.slice()),
121
126
  localDefs: Object.freeze(localDefs.slice()),
122
127
  referenceSites: Object.freeze(referenceSites.slice()),
128
+ ...(callableFlowSites.length > 0
129
+ ? { callableFlowSites: Object.freeze(callableFlowSites.slice()) }
130
+ : {}),
123
131
  });
124
132
  }
125
133
  /**
126
- * Bucket each match by the topic of its anchor capture. The anchor is the
127
- * capture whose name is prefixed with the match's topic (`@scope.*`,
128
- * `@declaration.*`, `@import.*`, `@type-binding.*`, `@reference.*`).
134
+ * Bucket each match by every topic represented by its anchor captures. An
135
+ * emitter may deliberately group a lexical scope and its declaration in one
136
+ * match so both passes observe the exact same source range.
129
137
  *
130
138
  * A match may contain additional captures (e.g., `@import.source`,
131
139
  * `@declaration.class.name`) that are used by the provider hooks to
@@ -138,49 +146,50 @@ function partitionByTopic(matches) {
138
146
  const import_ = [];
139
147
  const typeBinding = [];
140
148
  const reference = [];
149
+ const callableFlow = [];
141
150
  for (const match of matches) {
142
- const topic = topicOf(match);
143
- switch (topic) {
144
- case 'scope':
145
- scope.push(match);
146
- break;
147
- case 'declaration':
148
- declaration.push(match);
149
- break;
150
- case 'import':
151
- import_.push(match);
152
- break;
153
- case 'type-binding':
154
- typeBinding.push(match);
155
- break;
156
- case 'reference':
157
- reference.push(match);
158
- break;
159
- case 'unknown':
160
- // Unrecognized anchor — silently skip. Providers may emit extra
161
- // captures (e.g., `@comment`) that the extractor has no topic for.
162
- break;
151
+ for (const topic of topicsOf(match)) {
152
+ switch (topic) {
153
+ case 'scope':
154
+ scope.push(match);
155
+ break;
156
+ case 'declaration':
157
+ declaration.push(match);
158
+ break;
159
+ case 'import':
160
+ import_.push(match);
161
+ break;
162
+ case 'type-binding':
163
+ typeBinding.push(match);
164
+ break;
165
+ case 'reference':
166
+ reference.push(match);
167
+ break;
168
+ case 'callable-flow':
169
+ callableFlow.push(match);
170
+ break;
171
+ }
163
172
  }
164
173
  }
165
- return { scope, declaration, import_, typeBinding, reference };
174
+ return { scope, declaration, import_, typeBinding, reference, callableFlow };
166
175
  }
167
- function topicOf(match) {
168
- // The anchor is the capture whose name uses one of the known topic
169
- // prefixes. For multi-capture matches, ALL captures share the topic;
170
- // we pick the first matching key for efficiency.
176
+ function topicsOf(match) {
177
+ const topics = new Set();
171
178
  for (const name of Object.keys(match)) {
172
179
  if (name.startsWith('@scope.'))
173
- return 'scope';
174
- if (name.startsWith('@declaration.'))
175
- return 'declaration';
176
- if (name.startsWith('@import.'))
177
- return 'import';
178
- if (name.startsWith('@type-binding.'))
179
- return 'type-binding';
180
- if (name.startsWith('@reference.'))
181
- return 'reference';
182
- }
183
- return 'unknown';
180
+ topics.add('scope');
181
+ else if (name.startsWith('@declaration.'))
182
+ topics.add('declaration');
183
+ else if (name.startsWith('@import.'))
184
+ topics.add('import');
185
+ else if (name.startsWith('@type-binding.'))
186
+ topics.add('type-binding');
187
+ else if (name.startsWith('@reference.'))
188
+ topics.add('reference');
189
+ else if (name.startsWith('@callable-flow.'))
190
+ topics.add('callable-flow');
191
+ }
192
+ return topics;
184
193
  }
185
194
  function ensureModuleScope(scopeDrafts, filePath, allMatches) {
186
195
  const moduleScope = scopeDrafts.find((s) => s.kind === 'Module');
@@ -299,6 +308,8 @@ function resolveKindForScopeMatch(match, anchor, provider) {
299
308
  return 'Block';
300
309
  case 'expression':
301
310
  return 'Expression';
311
+ case 'object':
312
+ return 'Object';
302
313
  default:
303
314
  return null;
304
315
  }
@@ -574,6 +585,8 @@ function normalizeNodeLabel(kindStr) {
574
585
  return 'Annotation';
575
586
  case 'namespace':
576
587
  return 'Namespace';
588
+ case 'program':
589
+ return 'Module';
577
590
  case 'macro':
578
591
  return 'Macro';
579
592
  default:
@@ -757,13 +770,15 @@ function followChainedRef(start, draftById) {
757
770
  * name in the same scope. Higher number wins; ties keep the later match
758
771
  * (last-write-wins preserves historical order within a tier).
759
772
  *
760
- * Rationale: explicit annotations always beat inferred ones because they
761
- * reflect user intent. `self`/`cls` are treated as strongly as annotations
762
- * because they are language-required receiver types.
773
+ * Rationale: explicit variable and field annotations always beat bindings
774
+ * derived from parameter annotations or inference because they reflect the
775
+ * most specific user intent. `self`/`cls` are treated as strongly as other
776
+ * declared types because they are language-required receiver types.
763
777
  */
764
778
  function typeBindingStrength(source) {
765
779
  switch (source) {
766
780
  case 'annotation':
781
+ return 3;
767
782
  case 'parameter-annotation':
768
783
  case 'return-annotation':
769
784
  case 'self':
@@ -801,6 +816,9 @@ function pass5CollectReferences(matches, positionIndex, filePath, referenceSites
801
816
  const arity = extractArity(match);
802
817
  const argumentTypes = extractArgumentTypes(match);
803
818
  const argumentTypeClasses = parseJsonParameterTypeClassesCapture(match['@reference.parameter-type-classes']);
819
+ // Object-literal key for value-ref sites (`{ key: fn }` / shorthand);
820
+ // consumed by the property-dispatch pass (#2437).
821
+ const propertyKeyCap = match['@reference.property-key'];
804
822
  const site = {
805
823
  name: nameCap.text,
806
824
  atRange: anchor.range,
@@ -809,6 +827,9 @@ function pass5CollectReferences(matches, positionIndex, filePath, referenceSites
809
827
  ...(qualifiedCap?.text !== undefined && qualifiedCap.text.length > 0
810
828
  ? { rawQualifiedName: qualifiedCap.text }
811
829
  : {}),
830
+ ...(propertyKeyCap?.text !== undefined && propertyKeyCap.text.length > 0
831
+ ? { propertyKey: propertyKeyCap.text }
832
+ : {}),
812
833
  ...(callForm !== undefined ? { callForm } : {}),
813
834
  ...(explicitReceiver !== undefined ? { explicitReceiver } : {}),
814
835
  ...(arity !== undefined ? { arity } : {}),
@@ -840,6 +861,8 @@ function referenceKindFromAnchor(name) {
840
861
  return 'import-use';
841
862
  case 'macro':
842
863
  return 'macro';
864
+ case 'value-ref':
865
+ return 'value-ref';
843
866
  default:
844
867
  return undefined;
845
868
  }
@@ -893,6 +916,245 @@ function extractArgumentTypes(match) {
893
916
  }
894
917
  return undefined;
895
918
  }
919
+ // ─── Pass 6: collect callable-value-flow facts ─────────────────────────────
920
+ const CALLABLE_FLOW_KINDS = [
921
+ 'seed',
922
+ 'copy',
923
+ 'alias',
924
+ 'address',
925
+ 'store',
926
+ 'load',
927
+ 'formal',
928
+ 'argument',
929
+ 'invoke',
930
+ ];
931
+ function pass6CollectCallableFlows(matches, positionIndex, filePath, out) {
932
+ for (const match of matches) {
933
+ const kind = callableFlowKind(match);
934
+ if (kind === undefined)
935
+ continue;
936
+ const anchor = match[`@callable-flow.${kind}`];
937
+ if (anchor === undefined)
938
+ continue;
939
+ switch (kind) {
940
+ case 'seed': {
941
+ const destination = callableFlowOperand(match, 'destination', positionIndex, filePath);
942
+ const target = match['@callable-flow.target'];
943
+ const targetName = match['@callable-flow.target-name']?.text ?? target?.text;
944
+ if (destination === undefined || target === undefined || !nonEmpty(targetName))
945
+ continue;
946
+ const expectedSignature = callableFlowExpectedSignature(match);
947
+ out.push({
948
+ kind,
949
+ destination,
950
+ targetName,
951
+ targetRange: target.range,
952
+ ...(nonEmpty(match['@callable-flow.target-qualified-name']?.text)
953
+ ? { targetQualifiedName: match['@callable-flow.target-qualified-name'].text }
954
+ : {}),
955
+ ...(expectedSignature !== undefined ? { expectedSignature } : {}),
956
+ });
957
+ break;
958
+ }
959
+ case 'copy':
960
+ case 'alias': {
961
+ const source = callableFlowOperand(match, 'source', positionIndex, filePath);
962
+ const destination = callableFlowOperand(match, 'destination', positionIndex, filePath);
963
+ if (source === undefined || destination === undefined)
964
+ continue;
965
+ out.push({ kind, source, destination });
966
+ break;
967
+ }
968
+ case 'address': {
969
+ const source = callableFlowOperand(match, 'source', positionIndex, filePath);
970
+ const destination = callableFlowOperand(match, 'destination', positionIndex, filePath);
971
+ if (source === undefined || destination === undefined)
972
+ continue;
973
+ out.push({ kind, source, destination });
974
+ break;
975
+ }
976
+ case 'store': {
977
+ const source = callableFlowOperand(match, 'source', positionIndex, filePath);
978
+ const pointer = callableFlowOperand(match, 'pointer', positionIndex, filePath);
979
+ if (source === undefined || pointer === undefined)
980
+ continue;
981
+ out.push({ kind, source, pointer });
982
+ break;
983
+ }
984
+ case 'load': {
985
+ const pointer = callableFlowOperand(match, 'pointer', positionIndex, filePath);
986
+ const destination = callableFlowOperand(match, 'destination', positionIndex, filePath);
987
+ if (pointer === undefined || destination === undefined)
988
+ continue;
989
+ out.push({ kind, pointer, destination });
990
+ break;
991
+ }
992
+ case 'formal': {
993
+ const owner = match['@callable-flow.owner'];
994
+ const binding = callableFlowOperand(match, 'binding', positionIndex, filePath);
995
+ const parameterIndex = parseNonNegativeInt(match['@callable-flow.parameter-index']?.text);
996
+ const passingMode = parseCallablePassingMode(match['@callable-flow.passing-mode']?.text);
997
+ if (owner === undefined ||
998
+ !nonEmpty(owner.text) ||
999
+ binding === undefined ||
1000
+ parameterIndex === undefined ||
1001
+ passingMode === undefined) {
1002
+ continue;
1003
+ }
1004
+ const expectedSignature = callableFlowExpectedSignature(match);
1005
+ out.push({
1006
+ kind,
1007
+ ownerName: owner.text,
1008
+ ownerRange: owner.range,
1009
+ parameterIndex,
1010
+ binding,
1011
+ passingMode,
1012
+ ...(expectedSignature !== undefined ? { expectedSignature } : {}),
1013
+ });
1014
+ break;
1015
+ }
1016
+ case 'argument': {
1017
+ const source = callableFlowOperand(match, 'source', positionIndex, filePath);
1018
+ const parameterIndex = parseNonNegativeInt(match['@callable-flow.parameter-index']?.text);
1019
+ if (source === undefined || parameterIndex === undefined)
1020
+ continue;
1021
+ out.push({
1022
+ kind,
1023
+ callSite: anchor.range,
1024
+ parameterIndex,
1025
+ source,
1026
+ ...(nonEmpty(match['@callable-flow.direct-callee-name']?.text)
1027
+ ? { directCalleeName: match['@callable-flow.direct-callee-name'].text }
1028
+ : {}),
1029
+ });
1030
+ break;
1031
+ }
1032
+ case 'invoke': {
1033
+ const callee = callableFlowOperand(match, 'callee', positionIndex, filePath);
1034
+ const inScope = positionIndex.atPosition(filePath, anchor.range.startLine, anchor.range.startCol);
1035
+ const invocationKind = parseCallableInvocationKind(match['@callable-flow.invocation-kind']?.text);
1036
+ if (callee === undefined || inScope === undefined || invocationKind === undefined)
1037
+ continue;
1038
+ const receiver = callableFlowOperand(match, 'receiver', positionIndex, filePath);
1039
+ const arity = parseNonNegativeInt(match['@callable-flow.arity']?.text);
1040
+ out.push({
1041
+ kind,
1042
+ callSite: anchor.range,
1043
+ inScope,
1044
+ callee,
1045
+ invocationKind,
1046
+ ...(receiver !== undefined ? { receiver } : {}),
1047
+ ...(arity !== undefined ? { arity } : {}),
1048
+ });
1049
+ break;
1050
+ }
1051
+ }
1052
+ }
1053
+ }
1054
+ function callableFlowKind(match) {
1055
+ return CALLABLE_FLOW_KINDS.find((kind) => match[`@callable-flow.${kind}`] !== undefined);
1056
+ }
1057
+ function callableFlowOperand(match, role, positionIndex, filePath) {
1058
+ const cap = match[`@callable-flow.${role}`];
1059
+ if (cap === undefined || !nonEmpty(cap.text))
1060
+ return undefined;
1061
+ const inScope = positionIndex.atPosition(filePath, cap.range.startLine, cap.range.startCol);
1062
+ if (inScope === undefined)
1063
+ return undefined;
1064
+ const expressionKind = parseCallableOperandKind(match[`@callable-flow.${role}-kind`]?.text);
1065
+ const indirection = parseNonNegativeInt(match[`@callable-flow.${role}-indirection`]?.text);
1066
+ if (indirection !== undefined && indirection > 16)
1067
+ return undefined;
1068
+ return {
1069
+ name: cap.text,
1070
+ inScope,
1071
+ atRange: cap.range,
1072
+ indirection: indirection ?? 0,
1073
+ addressOf: match[`@callable-flow.${role}-address`]?.text === 'true',
1074
+ ...(expressionKind !== undefined ? { expressionKind } : {}),
1075
+ ...(nonEmpty(match[`@callable-flow.${role}-qualified-name`]?.text)
1076
+ ? { qualifiedName: match[`@callable-flow.${role}-qualified-name`].text }
1077
+ : {}),
1078
+ };
1079
+ }
1080
+ function callableFlowExpectedSignature(match) {
1081
+ const parameterCount = parseNonNegativeInt(match['@callable-flow.expected-arity']?.text);
1082
+ const parameterTypes = parseJsonStringArray(match['@callable-flow.expected-types']?.text);
1083
+ const parameterTypeClasses = parseJsonParameterTypeClassesCapture(match['@callable-flow.expected-type-classes']);
1084
+ const isConst = parseBooleanText(match['@callable-flow.expected-const']?.text);
1085
+ if (parameterCount === undefined &&
1086
+ parameterTypes === undefined &&
1087
+ parameterTypeClasses === undefined &&
1088
+ isConst === undefined) {
1089
+ return undefined;
1090
+ }
1091
+ return {
1092
+ ...(parameterCount !== undefined ? { parameterCount } : {}),
1093
+ ...(parameterTypes !== undefined ? { parameterTypes } : {}),
1094
+ ...(parameterTypeClasses !== undefined ? { parameterTypeClasses } : {}),
1095
+ ...(isConst !== undefined ? { isConst } : {}),
1096
+ };
1097
+ }
1098
+ function parseCallableOperandKind(text) {
1099
+ switch (text) {
1100
+ case 'binding':
1101
+ case 'callable-designator':
1102
+ case 'bound-member':
1103
+ case 'anonymous-callable':
1104
+ return text;
1105
+ default:
1106
+ return undefined;
1107
+ }
1108
+ }
1109
+ function parseBooleanText(text) {
1110
+ if (text === 'true')
1111
+ return true;
1112
+ if (text === 'false')
1113
+ return false;
1114
+ return undefined;
1115
+ }
1116
+ function parseJsonStringArray(text) {
1117
+ if (text === undefined)
1118
+ return undefined;
1119
+ try {
1120
+ const parsed = JSON.parse(text);
1121
+ return Array.isArray(parsed) && parsed.every((value) => typeof value === 'string')
1122
+ ? parsed
1123
+ : undefined;
1124
+ }
1125
+ catch {
1126
+ return undefined;
1127
+ }
1128
+ }
1129
+ function parseNonNegativeInt(text) {
1130
+ if (text === undefined || !/^\d+$/.test(text))
1131
+ return undefined;
1132
+ const value = Number.parseInt(text, 10);
1133
+ return Number.isSafeInteger(value) ? value : undefined;
1134
+ }
1135
+ function parseCallablePassingMode(text) {
1136
+ switch (text) {
1137
+ case 'value':
1138
+ case 'reference':
1139
+ case 'pointer':
1140
+ return text;
1141
+ default:
1142
+ return undefined;
1143
+ }
1144
+ }
1145
+ function parseCallableInvocationKind(text) {
1146
+ switch (text) {
1147
+ case 'indirect':
1148
+ case 'member-pointer':
1149
+ case 'callable-object':
1150
+ return text;
1151
+ default:
1152
+ return undefined;
1153
+ }
1154
+ }
1155
+ function nonEmpty(value) {
1156
+ return value !== undefined && value.length > 0;
1157
+ }
896
1158
  // ─── Internal: range + capture utilities ───────────────────────────────────
897
1159
  function rangesEqual(a, b) {
898
1160
  return (a.startLine === b.startLine &&
@@ -919,6 +1181,7 @@ const KNOWN_SUB_TAGS = new Set([
919
1181
  '@type-binding.type',
920
1182
  '@reference.name',
921
1183
  '@reference.qualified-name',
1184
+ '@reference.property-key',
922
1185
  '@reference.receiver',
923
1186
  '@reference.operator',
924
1187
  '@reference.arity',
@@ -267,7 +267,7 @@
267
267
  * Plan that introduced most of these invariants:
268
268
  * `docs/plans/2026-04-20-001-refactor-emit-pipeline-generalization-plan.md`.
269
269
  */
270
- import type { BindingRef, Callsite, ConstraintContext, ParsedFile, ReferenceSite, ScopeId, SupportedLanguages, SymbolDefinition } from '../../../../_shared/index.js';
270
+ import type { BindingRef, Callsite, ConstraintContext, ParsedFile, ParsedImport, ReferenceSite, ScopeId, SupportedLanguages, SymbolDefinition } from '../../../../_shared/index.js';
271
271
  import type { KnowledgeGraph } from '../../../graph/types.js';
272
272
  import type { GraphNodeLookup } from '../graph-bridge/node-lookup.js';
273
273
  import { LanguageProvider } from '../../language-provider.js';
@@ -288,6 +288,10 @@ export type ReceiverMemberResolution = {
288
288
  readonly kind: 'ambiguous';
289
289
  readonly candidateIds: readonly string[];
290
290
  };
291
+ export interface ImportResolutionContext {
292
+ readonly parsedFiles: readonly ParsedFile[];
293
+ readonly parsedImport?: ParsedImport;
294
+ }
291
295
  /** Re-exported for ScopeResolver consumers — same shape as
292
296
  * `RegistryProviders.constraintCompatibility`'s third parameter. */
293
297
  export type { ConstraintContext } from '../../../../_shared/index.js';
@@ -320,8 +324,13 @@ export interface ScopeResolver {
320
324
  * orchestrator). TypeScript uses this to thread `tsconfig.json` path
321
325
  * aliases through to the standard resolver. Languages that don't
322
326
  * need any extra config ignore the parameter.
327
+ *
328
+ * `context.parsedFiles` is the complete, read-only language workspace. It is
329
+ * optional so resolvers that only need paths retain their existing shape.
330
+ * `context.parsedImport` is the exact import being finalized. PHP uses both
331
+ * when a PSR-4 import names a function instead of a file.
323
332
  */
324
- resolveImportTarget(targetRaw: string, fromFile: string, allFilePaths: ReadonlySet<string>, resolutionConfig?: unknown): string | readonly string[] | null;
333
+ resolveImportTarget(targetRaw: string, fromFile: string, allFilePaths: ReadonlySet<string>, resolutionConfig?: unknown, context?: ImportResolutionContext): string | readonly string[] | null;
325
334
  /**
326
335
  * Enumerate names visible through a wildcard import after the target
327
336
  * module scope has been linked. Languages that do not support
@@ -364,6 +373,21 @@ export interface ScopeResolver {
364
373
  * `(def, callsite)` and need an adapter at the wiring site.
365
374
  */
366
375
  arityCompatibility(callsite: Callsite, def: SymbolDefinition): ArityVerdict;
376
+ /**
377
+ * Add provider-specific callable value targets beyond the shared
378
+ * Function/Method/Constructor set. This is intentionally a predicate hook:
379
+ * shared flow analysis never branches on a language name or syntax kind.
380
+ */
381
+ readonly isCallableValueTarget?: (def: SymbolDefinition) => boolean;
382
+ /**
383
+ * Restrict this provider's scope-resolution graph mutations to callable-value
384
+ * CALLS edges. Providers with an existing structural edge pipeline can use
385
+ * the shared scope model and callable solver without duplicating their
386
+ * established CALLS, IMPORTS, heritage, or property-dispatch edges.
387
+ *
388
+ * Default: `all`.
389
+ */
390
+ readonly scopeResolutionEdgeMode?: 'all' | 'callable-flow-only';
367
391
  /**
368
392
  * Per-language constraint compatibility between a callsite and a
369
393
  * candidate `def` that carries `templateConstraints` metadata.
@@ -555,6 +579,21 @@ export interface ScopeResolver {
555
579
  * and any text the simple `isSuperReceiver` hook also rejects.
556
580
  */
557
581
  readonly isSuperReceiverInContext?: (receiverText: string, callerScope: ScopeId, scopes: ScopeResolutionIndexes) => boolean;
582
+ /**
583
+ * Source-text retention policy for post-extraction hooks that receive a
584
+ * `fileContents` context (`populateWorkspaceOwners`,
585
+ * `populateNamespaceSiblings`, `populateRangeBindings`, and
586
+ * `emitPostResolutionEdges`).
587
+ *
588
+ * The default, `all-files`, preserves the existing contract: source text is
589
+ * loaded for every file before any of those hooks run. A resolver may choose
590
+ * `uncached-files` only when all of its hooks derive cached-file facts from
591
+ * `ParsedFile` / capture side-channels and tolerate an empty content string
592
+ * for pre-extracted files. This keeps the durable ParsedFile path at
593
+ * O(uncached source) memory without putting language checks in the shared
594
+ * pipeline.
595
+ */
596
+ readonly postExtractSourceTextPolicy?: 'all-files' | 'uncached-files';
558
597
  /**
559
598
  * Whether the orchestrator should run `propagateImportedReturnTypes`
560
599
  * after finalize. Default `true`. TypeScript with explicit type
@@ -602,6 +641,23 @@ export interface ScopeResolver {
602
641
  * but is too loose as a default for strict module systems.
603
642
  */
604
643
  readonly allowGlobalFreeCallFallback?: boolean;
644
+ /**
645
+ * In this language every `Method` belongs to a class instance, so a
646
+ * FREE (receiver-less) call may resolve to a `Method` only when the
647
+ * caller's enclosing class chain — the class itself plus its MRO —
648
+ * contains the method's owner (#2550). Suppresses the finalize-bucket
649
+ * leak where an unqualified call matched any same-file method by bare
650
+ * name (`materializeBindings` flattens every declaration onto module
651
+ * scope). Java opts in; C# is the intended next adopter.
652
+ *
653
+ * NOT implemented via `LanguageProvider.builtInNames`: that mechanism
654
+ * has unrelated consumers (`parse-worker`'s call-site extraction gate
655
+ * suppresses member calls too; `type-env`'s return-type lookup) which
656
+ * assume a flagged name is never a real repository declaration —
657
+ * false for common method names like `run`/`get`/`compare` (verified
658
+ * regression).
659
+ */
660
+ readonly freeCallsRequireInstanceOwnership?: boolean;
605
661
  /**
606
662
  * When true, a constructor-form call `Type(...)` links to the Class def
607
663
  * itself rather than its explicit Constructor def. Default
@@ -644,6 +700,19 @@ export interface ScopeResolver {
644
700
  * Languages without file-local linkage semantics leave this undefined.
645
701
  */
646
702
  readonly isFileLocalDef?: (def: SymbolDefinition) => boolean;
703
+ /**
704
+ * Optional precise linkage predicate used when callable-value flow joins a
705
+ * declaration graph node (for example a C/C++ prototype in a caller file)
706
+ * to its out-of-file definition. Unlike `isFileLocalDef`, this hook MUST
707
+ * answer only language-level internal/file-local linkage. It must not fold
708
+ * in broader unqualified-name visibility rules such as namespace or member
709
+ * lookup: an explicit declaration already establishes caller visibility.
710
+ *
711
+ * C and C++ provide this hook for `static` free functions. Languages whose
712
+ * declaration/definition identity is already represented by imports or one
713
+ * graph node leave it undefined, disabling cross-file prototype joining.
714
+ */
715
+ readonly hasFileLocalCallableLinkage?: (def: SymbolDefinition) => boolean;
647
716
  /**
648
717
  * Optional predicate to identify members for which dispatch through
649
718
  * an instance receiver is **invalid at the language level** — i.e.
@@ -21,9 +21,9 @@
21
21
  * `(atRange.startLine, atRange.startCol)` is byte-equal to U1's `at` — no
22
22
  * normalization needed.
23
23
  *
24
- * Gating (R4): the concrete sink is created in `run.ts` only when
25
- * `input.pdg === true`; otherwise `undefined` is threaded through, so off-mode
26
- * does zero work and emits byte-identical output.
24
+ * Gating (R4): the concrete sink is created in `run.ts` when PDG is enabled OR
25
+ * always-on callable-flow facts need direct call targets for actual→formal
26
+ * propagation. The read-side CFG join remains strictly PDG-gated.
27
27
  *
28
28
  * Multi-target dispatch (R2/KTD8): one site → multiple emit calls → the `Set`
29
29
  * accumulates every resolved target. Capture is per-emit-call, so the
@@ -67,9 +67,9 @@ export interface CalleeIdMapView {
67
67
  /** The concrete accumulator: a write sink that also exposes the read view. */
68
68
  export interface CalleeIdAccumulator extends CalleeIdSink, CalleeIdMapView {
69
69
  }
70
+ export type CalleeIdCaptureFilter = (filePath: string, line: number, col: number) => boolean;
70
71
  /**
71
- * Create the concrete nested-`Map` accumulator. Call ONLY when
72
- * `input.pdg === true` (else thread `undefined` for byte-identity / zero
73
- * overhead — R4).
72
+ * Create the concrete nested-`Map` accumulator for PDG callee capture or
73
+ * callable-value-flow's direct-target index.
74
74
  */
75
- export declare function createCalleeIdAccumulator(): CalleeIdAccumulator;
75
+ export declare function createCalleeIdAccumulator(shouldCapture?: CalleeIdCaptureFilter): CalleeIdAccumulator;
@@ -21,9 +21,9 @@
21
21
  * `(atRange.startLine, atRange.startCol)` is byte-equal to U1's `at` — no
22
22
  * normalization needed.
23
23
  *
24
- * Gating (R4): the concrete sink is created in `run.ts` only when
25
- * `input.pdg === true`; otherwise `undefined` is threaded through, so off-mode
26
- * does zero work and emits byte-identical output.
24
+ * Gating (R4): the concrete sink is created in `run.ts` when PDG is enabled OR
25
+ * always-on callable-flow facts need direct call targets for actual→formal
26
+ * propagation. The read-side CFG join remains strictly PDG-gated.
27
27
  *
28
28
  * Multi-target dispatch (R2/KTD8): one site → multiple emit calls → the `Set`
29
29
  * accumulates every resolved target. Capture is per-emit-call, so the
@@ -36,14 +36,15 @@ export function calleeIdPosKey(line, col) {
36
36
  return `${line}:${col}`;
37
37
  }
38
38
  /**
39
- * Create the concrete nested-`Map` accumulator. Call ONLY when
40
- * `input.pdg === true` (else thread `undefined` for byte-identity / zero
41
- * overhead — R4).
39
+ * Create the concrete nested-`Map` accumulator for PDG callee capture or
40
+ * callable-value-flow's direct-target index.
42
41
  */
43
- export function createCalleeIdAccumulator() {
42
+ export function createCalleeIdAccumulator(shouldCapture) {
44
43
  const byFile = new Map();
45
44
  return {
46
45
  add(filePath, line, col, calleeId) {
46
+ if (shouldCapture?.(filePath, line, col) === false)
47
+ return;
47
48
  let byPos = byFile.get(filePath);
48
49
  if (byPos === undefined) {
49
50
  byPos = new Map();
@@ -21,7 +21,9 @@ import type { GraphNodeLookup } from '../graph-bridge/node-lookup.js';
21
21
  import type { CalleeIdSink } from './callee-id-sink.js';
22
22
  /**
23
23
  * Optional resolved-callee-id capture context (#2227 follow-up U2). Threaded
24
- * in only under `--pdg` (else `undefined` → zero overhead, byte-identity R4).
24
+ * in under `--pdg` OR when always-on callable-flow facts need direct call
25
+ * targets (#2437 — the accumulator then carries a position filter); else
26
+ * `undefined` → zero overhead, byte-identity (R4).
25
27
  * `filePath` is NOT on the `site` param, so it rides here alongside the sink.
26
28
  */
27
29
  export interface CalleeIdCaptureCtx {
@@ -31,6 +31,12 @@ export function mapReferenceKindToEdgeType(kind) {
31
31
  return 'EXTENDS';
32
32
  case 'type-reference':
33
33
  return 'USES';
34
+ // A function registered as an object-literal property value emits a
35
+ // reference-class USES edge, NOT CALLS — a registration is not an
36
+ // invocation (Kythe `ref` vs `ref/call`; Joern `METHOD_REF`). The
37
+ // invocation side is synthesized by the property-dispatch pass (#2437).
38
+ case 'value-ref':
39
+ return 'USES';
34
40
  // Macro invocations resolve to a `Macro` node (never a function), so
35
41
  // they emit `USES` — kept out of the `CALLS` keyspace which denotes
36
42
  // function/method dispatch (#1934 review).
@@ -44,6 +44,7 @@ function isCallerAnchorLabel(label) {
44
44
  return (label === 'Function' ||
45
45
  label === 'Method' ||
46
46
  label === 'Constructor' ||
47
+ label === 'Module' ||
47
48
  label === 'Class' ||
48
49
  label === 'Interface' ||
49
50
  label === 'Struct' ||