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
@@ -35,20 +35,51 @@ import { getTreeSitterBufferSize } from '../../constants.js';
35
35
  import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
36
36
  import { encodeMarker } from '../../utils/heritage-marker.js';
37
37
  import { DART_BUILT_INS } from './built-ins.js';
38
+ import { synthesizeCallableFlowCaptures } from '../../utils/callable-flow-captures.js';
39
+ import { preprocessDartExtensionTypes } from './extension-type-preprocess.js';
38
40
  const FUNCTION_DECL_TAGS = [
39
41
  '@declaration.function',
40
42
  '@declaration.method',
41
43
  '@declaration.constructor',
42
44
  ];
45
+ const DART_CALLABLE_CAPTURE_OPTIONS = {
46
+ functionNodeTypes: new Set(['function_signature', 'function_expression']),
47
+ callNodeTypes: new Set(['selector']),
48
+ parameterListNodeTypes: new Set(['formal_parameter_list', 'arguments']),
49
+ parameterNodeTypes: new Set(['formal_parameter']),
50
+ bindingNodeTypes: new Set(['initialized_variable_definition']),
51
+ assignmentNodeTypes: new Set(['assignment_expression']),
52
+ identifierNodeTypes: new Set(['identifier', 'type_identifier']),
53
+ lexicalFunctionOwner: (node) => dartLexicalFunctionOwner(node),
54
+ isCallNode: (node) => node.namedChild(0)?.type === 'argument_part',
55
+ extractCallCallee: (node) => dartCallableCallee(node) ?? undefined,
56
+ callSiteNode: (node) => dartCallableCallee(node) ?? undefined,
57
+ callableProtocolMethods: new Set(['call']),
58
+ };
59
+ function dartLexicalFunctionOwner(input) {
60
+ let node = input;
61
+ while (node !== null) {
62
+ if (node.type === 'function_signature' || node.type === 'function_expression')
63
+ return node;
64
+ if (node.type === 'function_body') {
65
+ const signature = node.previousNamedSibling;
66
+ if (signature?.type === 'function_signature')
67
+ return signature;
68
+ }
69
+ node = node.parent;
70
+ }
71
+ return undefined;
72
+ }
43
73
  export function emitDartScopeCaptures(sourceText, _filePath, cachedTree) {
74
+ const parseText = preprocessDartExtensionTypes(sourceText);
44
75
  let tree;
45
76
  if (cachedTree !== undefined && cachedTree !== null) {
46
77
  tree = cachedTree;
47
78
  recordCacheHit();
48
79
  }
49
80
  else {
50
- tree = parseSourceSafe(getDartParser(), sourceText, undefined, {
51
- bufferSize: getTreeSitterBufferSize(sourceText),
81
+ tree = parseSourceSafe(getDartParser(), parseText, undefined, {
82
+ bufferSize: getTreeSitterBufferSize(parseText),
52
83
  });
53
84
  recordCacheMiss();
54
85
  }
@@ -132,9 +163,25 @@ export function emitDartScopeCaptures(sourceText, _filePath, cachedTree) {
132
163
  emitHeritage(node, out);
133
164
  return;
134
165
  }
166
+ if (node.type === 'extension_declaration') {
167
+ emitExtensionImplementsHeritage(node, out);
168
+ return;
169
+ }
135
170
  });
171
+ out.push(...synthesizeCallableFlowCaptures(root, DART_CALLABLE_CAPTURE_OPTIONS));
136
172
  return out;
137
173
  }
174
+ function dartCallableCallee(selector) {
175
+ if (selector.namedChild(0)?.type !== 'argument_part')
176
+ return null;
177
+ const previous = selector.previousNamedSibling;
178
+ if (previous?.type === 'identifier')
179
+ return previous;
180
+ if (previous?.type !== 'selector')
181
+ return null;
182
+ const inner = previous.namedChild(0);
183
+ return inner !== null && ASSIGNABLE_SELECTORS.has(inner.type) ? selectorName(inner) : null;
184
+ }
138
185
  // ─── Function scope synthesis ───────────────────────────────────────────────
139
186
  /**
140
187
  * The sibling `function_body` of a declaration, or null (abstract/bodyless).
@@ -434,6 +481,47 @@ function emitHeritage(classNode, out) {
434
481
  emitHeritageMarkers(interfaces, 'implements', className, out);
435
482
  }
436
483
  }
484
+ function emitExtensionImplementsHeritage(extensionNode, out) {
485
+ const nameNode = extensionNode.childForFieldName('name');
486
+ if (nameNode === null)
487
+ return;
488
+ const bodyStart = extensionNode.text.indexOf('{');
489
+ const header = bodyStart === -1 ? extensionNode.text : extensionNode.text.slice(0, bodyStart);
490
+ const implementsIndex = header.indexOf('implements');
491
+ if (implementsIndex === -1)
492
+ return;
493
+ const className = nameNode.text;
494
+ const interfaces = header.slice(implementsIndex + 'implements'.length);
495
+ for (const rawInterface of splitTopLevelCommaList(interfaces)) {
496
+ const target = /^[ \t]*([A-Za-z_$][A-Za-z0-9_$]*)/.exec(rawInterface)?.[1];
497
+ if (target === undefined)
498
+ continue;
499
+ const payload = encodeMarker('heritage', ['implements', target, className]);
500
+ out.push({ '@import.heritage': syntheticCapture('@import.heritage', nameNode, payload) });
501
+ }
502
+ }
503
+ function splitTopLevelCommaList(text) {
504
+ const parts = [];
505
+ let start = 0;
506
+ let angleDepth = 0;
507
+ for (let i = 0; i < text.length; i++) {
508
+ const ch = text[i];
509
+ if (ch === '<') {
510
+ angleDepth++;
511
+ continue;
512
+ }
513
+ if (ch === '>' && angleDepth > 0) {
514
+ angleDepth--;
515
+ continue;
516
+ }
517
+ if (ch === ',' && angleDepth === 0) {
518
+ parts.push(text.slice(start, i));
519
+ start = i + 1;
520
+ }
521
+ }
522
+ parts.push(text.slice(start));
523
+ return parts;
524
+ }
437
525
  function emitHeritageMarkers(container, kind, className, out) {
438
526
  for (let i = 0; i < container.namedChildCount; i++) {
439
527
  const c = container.namedChild(i);
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Rewrites Dart 3.3 `extension type Name(Type value)` headers into ordinary
3
+ * extension headers before tree-sitter sees the source. The vendored grammar
4
+ * currently recovers these declarations through an ERROR subtree, while the
5
+ * existing Dart ingestion path already handles `extension Name on Type`.
6
+ */
7
+ export declare function preprocessDartExtensionTypes(sourceText: string): string;
@@ -0,0 +1,30 @@
1
+ const DART_EXTENSION_TYPE_HEADER = /\b(extension)([ \t]+type[ \t]+(?:const[ \t]+)?)([A-Za-z_$][A-Za-z0-9_$]*)([ \t]*<[^()\r\n]*>)?([ \t]*)\(([^()\r\n]*)\)/g;
2
+ function representationType(representation) {
3
+ const trimmed = representation.trim();
4
+ const match = /^(.*\S)\s+[A-Za-z_$][A-Za-z0-9_$]*$/.exec(trimmed);
5
+ const typeName = match?.[1]?.trim();
6
+ return typeName && typeName.length > 0 ? typeName : null;
7
+ }
8
+ /**
9
+ * Rewrites Dart 3.3 `extension type Name(Type value)` headers into ordinary
10
+ * extension headers before tree-sitter sees the source. The vendored grammar
11
+ * currently recovers these declarations through an ERROR subtree, while the
12
+ * existing Dart ingestion path already handles `extension Name on Type`.
13
+ */
14
+ export function preprocessDartExtensionTypes(sourceText) {
15
+ return sourceText.replace(DART_EXTENSION_TYPE_HEADER, (match, extensionKeyword, extensionTypeGap, name, typeParameters, beforeRepresentation, representation) => {
16
+ const typeName = representationType(representation);
17
+ if (typeName === null)
18
+ return match;
19
+ const representationSpanLength = beforeRepresentation.length + representation.length + 2;
20
+ const rewrittenRepresentation = ` on ${typeName}`;
21
+ if (rewrittenRepresentation.length > representationSpanLength)
22
+ return match;
23
+ return (extensionKeyword +
24
+ ' '.repeat(extensionTypeGap.length) +
25
+ name +
26
+ (typeParameters ?? '') +
27
+ rewrittenRepresentation +
28
+ ' '.repeat(representationSpanLength - rewrittenRepresentation.length));
29
+ });
30
+ }
@@ -29,6 +29,7 @@ import { createCallExtractor } from '../call-extractors/generic.js';
29
29
  import { dartCallConfig } from '../call-extractors/configs/dart.js';
30
30
  import { emitDartScopeCaptures, interpretDartImport, interpretDartTypeBinding, dartBindingScopeFor, dartImportOwningScope, dartReceiverBinding, dartMergeBindings, dartArityCompatibility, } from './dart/index.js';
31
31
  import { DART_BUILT_INS } from './dart/built-ins.js';
32
+ import { preprocessDartExtensionTypes } from './dart/extension-type-preprocess.js';
32
33
  /**
33
34
  * Resolve the enclosing function from a `function_body` node by looking at its
34
35
  * previous sibling. In Dart's tree-sitter grammar, function_signature and
@@ -100,6 +101,7 @@ export const dartProvider = defineLanguage({
100
101
  },
101
102
  ],
102
103
  treeSitterQueries: DART_QUERIES,
104
+ preprocessSource: preprocessDartExtensionTypes,
103
105
  typeConfig: dartConfig,
104
106
  exportChecker: dartExportChecker,
105
107
  importResolver: createImportResolver(dartImportConfig),
@@ -7,6 +7,39 @@ import { synthesizeGoReceiverBinding } from './receiver-binding.js';
7
7
  import { synthesizeGoTypeBindings, extractSimpleTypeNameText } from './type-binding.js';
8
8
  import { getTreeSitterBufferSize } from '../../constants.js';
9
9
  import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
10
+ import { synthesizeCallableFlowCaptures } from '../../utils/callable-flow-captures.js';
11
+ const GO_CALLABLE_CAPTURE_OPTIONS = {
12
+ functionNodeTypes: new Set(['function_declaration', 'method_declaration', 'func_literal']),
13
+ callNodeTypes: new Set(['call_expression']),
14
+ parameterListNodeTypes: new Set(['parameter_list', 'argument_list']),
15
+ parameterNodeTypes: new Set(['parameter_declaration', 'variadic_parameter_declaration']),
16
+ bindingNodeTypes: new Set(['short_var_declaration', 'var_spec']),
17
+ assignmentNodeTypes: new Set(['assignment_statement']),
18
+ identifierNodeTypes: new Set(['identifier', 'field_identifier', 'package_identifier']),
19
+ // Multi-value forms (`a, b := f, g`) pair LHS/RHS expression_list entries
20
+ // positionally — the shared field fallback cross-wired first-LHS with
21
+ // last-RHS and synthesized a garbage comma-joined qualified name (#2522
22
+ // review). A length mismatch (multi-return call RHS) recognizes the node
23
+ // but emits nothing.
24
+ extractAssignment: (node) => {
25
+ if (node.type !== 'short_var_declaration' && node.type !== 'assignment_statement') {
26
+ return undefined;
27
+ }
28
+ const left = node.childForFieldName('left');
29
+ const right = node.childForFieldName('right');
30
+ if (left === null || right === null)
31
+ return undefined;
32
+ if (left.type !== 'expression_list' || right.type !== 'expression_list')
33
+ return undefined;
34
+ const destinations = left.namedChildren.filter((child) => child !== null);
35
+ const sources = right.namedChildren.filter((child) => child !== null);
36
+ if (destinations.length <= 1 && sources.length <= 1)
37
+ return undefined;
38
+ if (destinations.length !== sources.length)
39
+ return [];
40
+ return destinations.map((destination, index) => ({ destination, source: sources[index] }));
41
+ },
42
+ };
10
43
  export function emitGoScopeCaptures(sourceText, _filePath, cachedTree) {
11
44
  let tree = cachedTree;
12
45
  if (tree === undefined) {
@@ -136,6 +169,7 @@ export function emitGoScopeCaptures(sourceText, _filePath, cachedTree) {
136
169
  });
137
170
  }
138
171
  out.push(...synthesizeGoInheritanceReferences(tree.rootNode));
172
+ out.push(...synthesizeCallableFlowCaptures(tree.rootNode, GO_CALLABLE_CAPTURE_OPTIONS));
139
173
  return out;
140
174
  }
141
175
  /**
@@ -26,6 +26,7 @@ export declare const providers: {
26
26
  dart: LanguageProvider;
27
27
  vue: LanguageProvider;
28
28
  cobol: LanguageProvider;
29
+ move: LanguageProvider;
29
30
  };
30
31
  /** Get provider by language enum (always succeeds for SupportedLanguages). */
31
32
  export declare function getProvider(language: SupportedLanguages): LanguageProvider;
@@ -22,6 +22,7 @@ import { swiftProvider } from './swift.js';
22
22
  import { dartProvider } from './dart.js';
23
23
  import { vueProvider } from './vue.js';
24
24
  import { cobolProvider } from './cobol.js';
25
+ import { moveProvider } from './move.js';
25
26
  export const providers = {
26
27
  [SupportedLanguages.JavaScript]: javascriptProvider,
27
28
  [SupportedLanguages.TypeScript]: typescriptProvider,
@@ -39,6 +40,7 @@ export const providers = {
39
40
  [SupportedLanguages.Dart]: dartProvider,
40
41
  [SupportedLanguages.Vue]: vueProvider,
41
42
  [SupportedLanguages.Cobol]: cobolProvider,
43
+ [SupportedLanguages.Move]: moveProvider,
42
44
  };
43
45
  /** Get provider by language enum (always succeeds for SupportedLanguages). */
44
46
  export function getProvider(language) {
@@ -0,0 +1,3 @@
1
+ import type { AnalysisFeatureDescriptor } from '../../../analysis-features.js';
2
+ /** Durable completeness contract for Java Spring configuration bindings. */
3
+ export declare const SPRING_CONFIG_BINDINGS_FEATURE: AnalysisFeatureDescriptor;
@@ -0,0 +1,13 @@
1
+ function isSpringApplicationConfig(filePath) {
2
+ const base = filePath.replaceAll('\\', '/').split('/').pop() ?? '';
3
+ return /^application(?:-[^.]+)?\.(?:properties|ya?ml)$/i.test(base);
4
+ }
5
+ /** Durable completeness contract for Java Spring configuration bindings. */
6
+ export const SPRING_CONFIG_BINDINGS_FEATURE = {
7
+ id: 'spring.config-bindings',
8
+ version: 1,
9
+ // Java sources need consumer extraction even without config files (missing
10
+ // placeholders still get unresolved markers). Config-only repositories also
11
+ // need a one-time rebuild to backfill language-agnostic Property nodes.
12
+ appliesTo: (filePaths) => filePaths.some((filePath) => filePath.toLowerCase().endsWith('.java') || isSpringApplicationConfig(filePath)),
13
+ };
@@ -0,0 +1,22 @@
1
+ import type { ParsedFile } from '../../../../_shared/index.js';
2
+ import { type ClassAnnotationFact } from '../../frameworks/spring/bean-candidates.js';
3
+ import { type JvmPackageFact } from '../jvm/package-facts.js';
4
+ import type { JavaSpringConfigConsumerFact } from './spring-config-bindings.js';
5
+ export type JavaClassAnnotationFact = ClassAnnotationFact;
6
+ export interface JavaCaptureSideChannel {
7
+ readonly kind: 'java';
8
+ readonly packageFact: JvmPackageFact;
9
+ readonly classAnnotations: readonly JavaClassAnnotationFact[];
10
+ readonly springConfigConsumers?: readonly JavaSpringConfigConsumerFact[];
11
+ }
12
+ /** Clear facts retained by a prior workspace pass in a long-lived process. */
13
+ export declare function clearJavaClassAnnotationFacts(): void;
14
+ /** Store the annotation syntax collected by Java's existing scope-query traversal. */
15
+ export declare function setJavaClassAnnotationFacts(filePath: string, facts: readonly JavaClassAnnotationFact[]): void;
16
+ export declare function setJavaSpringConfigConsumerFacts(filePath: string, facts: readonly JavaSpringConfigConsumerFact[]): void;
17
+ export declare function getJavaSpringConfigConsumerFacts(filePath: string): readonly JavaSpringConfigConsumerFact[];
18
+ /** Snapshot worker-local Java annotation facts for ParsedFile serialization. */
19
+ export declare function collectJavaCaptureSideChannel(filePath: string): JavaCaptureSideChannel | undefined;
20
+ export declare function getJavaClassAnnotationFacts(filePath: string): readonly JavaClassAnnotationFact[];
21
+ /** Restore worker-collected facts before Java's post-resolution hook runs. */
22
+ export declare function applyJavaCaptureSideChannel(parsed: ParsedFile): void;
@@ -0,0 +1,58 @@
1
+ import { createClassAnnotationFactStore, } from '../../frameworks/spring/bean-candidates.js';
2
+ import { isJvmPackageFact, UNKNOWN_JVM_PACKAGE_FACT, } from '../jvm/package-facts.js';
3
+ import { getJavaPackageFact, setJavaPackageFact } from './package-facts.js';
4
+ const classAnnotations = createClassAnnotationFactStore();
5
+ const springConfigConsumers = new Map();
6
+ /** Clear facts retained by a prior workspace pass in a long-lived process. */
7
+ export function clearJavaClassAnnotationFacts() {
8
+ classAnnotations.clear();
9
+ springConfigConsumers.clear();
10
+ }
11
+ /** Store the annotation syntax collected by Java's existing scope-query traversal. */
12
+ export function setJavaClassAnnotationFacts(filePath, facts) {
13
+ classAnnotations.set(filePath, facts);
14
+ }
15
+ export function setJavaSpringConfigConsumerFacts(filePath, facts) {
16
+ if (facts.length === 0)
17
+ springConfigConsumers.delete(filePath);
18
+ else
19
+ springConfigConsumers.set(filePath, facts);
20
+ }
21
+ export function getJavaSpringConfigConsumerFacts(filePath) {
22
+ return springConfigConsumers.get(filePath) ?? [];
23
+ }
24
+ /** Snapshot worker-local Java annotation facts for ParsedFile serialization. */
25
+ export function collectJavaCaptureSideChannel(filePath) {
26
+ const facts = classAnnotations.get(filePath);
27
+ const configConsumers = springConfigConsumers.get(filePath) ?? [];
28
+ const packageFact = getJavaPackageFact(filePath);
29
+ if (facts.length === 0 && configConsumers.length === 0 && packageFact === undefined) {
30
+ return undefined;
31
+ }
32
+ return {
33
+ kind: 'java',
34
+ packageFact: packageFact ?? UNKNOWN_JVM_PACKAGE_FACT,
35
+ classAnnotations: facts,
36
+ ...(configConsumers.length > 0 ? { springConfigConsumers: configConsumers } : {}),
37
+ };
38
+ }
39
+ export function getJavaClassAnnotationFacts(filePath) {
40
+ return classAnnotations.get(filePath);
41
+ }
42
+ /** Restore worker-collected facts before Java's post-resolution hook runs. */
43
+ export function applyJavaCaptureSideChannel(parsed) {
44
+ const data = parsed.captureSideChannel;
45
+ if (data === undefined ||
46
+ data === null ||
47
+ typeof data !== 'object' ||
48
+ data.kind !== 'java' ||
49
+ !Array.isArray(data.classAnnotations)) {
50
+ setJavaClassAnnotationFacts(parsed.filePath, []);
51
+ setJavaSpringConfigConsumerFacts(parsed.filePath, []);
52
+ setJavaPackageFact(parsed.filePath, UNKNOWN_JVM_PACKAGE_FACT);
53
+ return;
54
+ }
55
+ setJavaClassAnnotationFacts(parsed.filePath, data.classAnnotations);
56
+ setJavaSpringConfigConsumerFacts(parsed.filePath, Array.isArray(data.springConfigConsumers) ? data.springConfigConsumers : []);
57
+ setJavaPackageFact(parsed.filePath, isJvmPackageFact(data.packageFact) ? data.packageFact : UNKNOWN_JVM_PACKAGE_FACT);
58
+ }
@@ -11,7 +11,8 @@
11
11
  * 3. **Arity metadata** on method/constructor declarations.
12
12
  * 4. **Reference arity** on call sites.
13
13
  *
14
- * Pure given the input source text. No I/O, no globals consulted.
14
+ * The returned captures are deterministic. Class-annotation facts are also
15
+ * recorded for the worker side-channel consumed after scope resolution.
15
16
  */
16
- import type { CaptureMatch } from '../../../../_shared/index.js';
17
- export declare function emitJavaScopeCaptures(sourceText: string, _filePath: string, cachedTree?: unknown): readonly CaptureMatch[];
17
+ import { type CaptureMatch } from '../../../../_shared/index.js';
18
+ export declare function emitJavaScopeCaptures(sourceText: string, filePath: string, cachedTree?: unknown): readonly CaptureMatch[];
@@ -1,19 +1,5 @@
1
- /**
2
- * `emitScopeCaptures` for Java.
3
- *
4
- * Drives the Java scope query against tree-sitter-java and groups raw
5
- * matches into `CaptureMatch[]` for the central extractor. Layers:
6
- *
7
- * 1. **Decomposed import declarations** — each `import_declaration`
8
- * is re-emitted with `@import.kind/source/name` markers.
9
- * 2. **Receiver binding synthesis** — `this`/`super` type-bindings
10
- * on instance methods.
11
- * 3. **Arity metadata** on method/constructor declarations.
12
- * 4. **Reference arity** on call sites.
13
- *
14
- * Pure given the input source text. No I/O, no globals consulted.
15
- */
16
- import { nodeIfType, nodeToCapture, syntheticCapture } from '../../utils/ast-helpers.js';
1
+ import { materializeClassAnnotationFacts, recordClassAnnotationCapture, } from '../../frameworks/spring/bean-candidates.js';
2
+ import { nodeIfType, nodeToCapture, synthesizeJavaAnonymousClassName, syntheticCapture, } from '../../utils/ast-helpers.js';
17
3
  import { splitImportDeclaration } from './import-decomposer.js';
18
4
  import { computeJavaArityMetadata } from './arity-metadata.js';
19
5
  import { synthesizeJavaReceiverBinding } from './receiver-binding.js';
@@ -21,10 +7,32 @@ import { getJavaParser, getJavaScopeQuery } from './query.js';
21
7
  import { recordCacheHit, recordCacheMiss } from './cache-stats.js';
22
8
  import { getTreeSitterBufferSize } from '../../constants.js';
23
9
  import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
10
+ import { setJavaClassAnnotationFacts, setJavaSpringConfigConsumerFacts, } from './capture-side-channel.js';
11
+ import { captureJavaPackageFact } from './package-facts.js';
12
+ import { synthesizeCallableFlowCaptures } from '../../utils/callable-flow-captures.js';
13
+ import { captureJavaSpringConfigConsumerFacts } from './spring-config-bindings.js';
24
14
  /** Declaration anchors that carry function-like arity metadata. */
25
15
  const FUNCTION_DECL_TAGS = ['@declaration.method', '@declaration.constructor'];
26
16
  /** tree-sitter-java node types that the method extractor accepts. */
27
17
  const FUNCTION_NODE_TYPES = ['method_declaration', 'constructor_declaration'];
18
+ const JAVA_CALLABLE_CAPTURE_OPTIONS = {
19
+ functionNodeTypes: new Set([...FUNCTION_NODE_TYPES, 'lambda_expression']),
20
+ callNodeTypes: new Set(['method_invocation']),
21
+ parameterListNodeTypes: new Set(['formal_parameters', 'argument_list']),
22
+ parameterNodeTypes: new Set(['formal_parameter', 'spread_parameter', 'receiver_parameter']),
23
+ bindingNodeTypes: new Set(['variable_declarator']),
24
+ assignmentNodeTypes: new Set(['assignment_expression']),
25
+ identifierNodeTypes: new Set(['identifier', 'type_identifier']),
26
+ callableReferenceNodeTypes: new Set(['method_reference']),
27
+ // java.util.function SAM names, MINUS 'get' and 'test': those two collide
28
+ // with ubiquitous non-functional APIs (Map/List/Optional/Future.get,
29
+ // Predicate-unrelated test methods), emitting a spurious callable-object
30
+ // invoke fact for every container access (#2522 review). Supplier.get /
31
+ // Predicate.test dispatch is deliberately traded away until the check can
32
+ // gate on the receiver's declared type.
33
+ callableProtocolMethods: new Set(['run', 'apply', 'accept', 'call']),
34
+ normalizeQualifiedName: (raw) => raw.replaceAll('::', '.'),
35
+ };
28
36
  /** Suppress read.member emissions when the field_access is already
29
37
  * covered by a method_invocation (object of a call) or an
30
38
  * assignment_expression (write target). */
@@ -39,7 +47,7 @@ function shouldEmitReadMember(memberNode) {
39
47
  return true;
40
48
  }
41
49
  }
42
- export function emitJavaScopeCaptures(sourceText, _filePath, cachedTree) {
50
+ export function emitJavaScopeCaptures(sourceText, filePath, cachedTree) {
43
51
  let tree = cachedTree;
44
52
  if (tree === undefined) {
45
53
  tree = parseSourceSafe(getJavaParser(), sourceText, undefined, {
@@ -50,8 +58,10 @@ export function emitJavaScopeCaptures(sourceText, _filePath, cachedTree) {
50
58
  else {
51
59
  recordCacheHit();
52
60
  }
61
+ captureJavaPackageFact(filePath, tree.rootNode);
53
62
  const rawMatches = getJavaScopeQuery().matches(tree.rootNode);
54
63
  const out = [];
64
+ const classAnnotations = new Map();
55
65
  for (const m of rawMatches) {
56
66
  const grouped = {};
57
67
  // Parallel tag -> captured SyntaxNode map. The tree-sitter query already
@@ -70,6 +80,12 @@ export function emitJavaScopeCaptures(sourceText, _filePath, cachedTree) {
70
80
  }
71
81
  if (Object.keys(grouped).length === 0)
72
82
  continue;
83
+ const annotatedClass = grouped['@class-annotation.class'];
84
+ const annotationName = grouped['@class-annotation.name'];
85
+ if (annotatedClass !== undefined && annotationName !== undefined) {
86
+ recordClassAnnotationCapture(classAnnotations, filePath, annotatedClass, annotationName.text);
87
+ continue;
88
+ }
73
89
  // Decompose each `import_declaration`. `@import.statement` is captured
74
90
  // directly on the `import_declaration` node.
75
91
  if (grouped['@import.statement'] !== undefined) {
@@ -95,6 +111,24 @@ export function emitJavaScopeCaptures(sourceText, _filePath, cachedTree) {
95
111
  grouped['@reference.receiver'] !== undefined) {
96
112
  continue;
97
113
  }
114
+ // Normalize a `new`-expression receiver to its constructed type's simple
115
+ // name: `new Local().inner()` binds the WHOLE `object_creation_expression`
116
+ // as `@reference.receiver`, so its raw text is `"new Local()"` — a string
117
+ // that can never match a scope binding, so the compound-receiver resolver
118
+ // silently falls through to name-only fallback resolution and picks the
119
+ // wrong same-named method on a collision (#2564). Rewriting the text to
120
+ // just `Local` lets Case 2 (class-name / static receiver) in
121
+ // receiver-bound-calls.ts resolve it via its normal MRO walk. Mirrors the
122
+ // established `normalizePhpReceiver` precedent (php/captures.ts) — a
123
+ // language-local capture rewrite, no shared-pipeline change.
124
+ if (grouped['@reference.receiver'] !== undefined) {
125
+ const receiverNode = nodeIfType(nodeMap['@reference.receiver'], 'object_creation_expression');
126
+ const typeNode = receiverNode?.childForFieldName('type');
127
+ const simpleName = typeNode ? javaBaseSimpleNameOf(typeNode) : undefined;
128
+ if (simpleName !== undefined) {
129
+ grouped['@reference.receiver'] = syntheticCapture('@reference.receiver', receiverNode, simpleName);
130
+ }
131
+ }
98
132
  // Filter read.member when it's a child of method_invocation or assignment.
99
133
  // `@reference.read.member` is captured directly on the `field_access` node.
100
134
  if (grouped['@reference.read.member'] !== undefined) {
@@ -161,12 +195,147 @@ export function emitJavaScopeCaptures(sourceText, _filePath, cachedTree) {
161
195
  }
162
196
  out.push(grouped);
163
197
  }
198
+ setJavaClassAnnotationFacts(filePath, materializeClassAnnotationFacts(classAnnotations));
199
+ setJavaSpringConfigConsumerFacts(filePath, captureJavaSpringConfigConsumerFacts(tree.rootNode, filePath));
164
200
  return [
165
201
  ...resolveVarTypeBindings(out),
166
202
  ...synthesizeJavaInheritanceReferences(tree.rootNode),
167
203
  ...synthesizeJavaExplicitConstructorReferences(tree.rootNode),
204
+ ...synthesizeJavaAnonymousClassDeclarations(tree.rootNode),
205
+ ...synthesizeCallableFlowCaptures(tree.rootNode, JAVA_CALLABLE_CAPTURE_OPTIONS),
168
206
  ];
169
207
  }
208
+ /**
209
+ * Synthesize `@declaration.class` matches for anonymous class bodies
210
+ * (`new Runnable() { ... }`), named by the same javac-style authority
211
+ * (`synthesizeJavaAnonymousClassName` → `Worker$N`) the structure phase
212
+ * uses — the two layers agree by construction (#2550).
213
+ *
214
+ * The anchor is the `class_body` node: it shares its range with the
215
+ * `(object_creation_expression (class_body) @scope.class)` scope rule in
216
+ * query.ts, so the def is owned by that Class scope's `ownedDefs`
217
+ * (making `populateClassOwnedMembers` stamp `ownerId` on the anonymous
218
+ * class's methods) and the name auto-hoists to the enclosing scope —
219
+ * exactly the binding shape a named class declaration produces.
220
+ */
221
+ function synthesizeJavaAnonymousClassDeclarations(rootNode) {
222
+ const out = [];
223
+ for (const oce of rootNode.descendantsOfType('object_creation_expression')) {
224
+ const name = synthesizeJavaAnonymousClassName(oce);
225
+ if (name === undefined)
226
+ continue;
227
+ const body = oce.namedChildren.find((c) => c.type === 'class_body');
228
+ if (body === undefined)
229
+ continue;
230
+ out.push({
231
+ '@declaration.class': nodeToCapture('@declaration.class', body),
232
+ '@declaration.name': syntheticCapture('@declaration.name', body, name),
233
+ });
234
+ // Inheritance: the anonymous class extends/implements its constructed
235
+ // type. Anchor the `@reference.inherits` on the `class_body` — its
236
+ // range equals the anonymous Class scope, so the reference site's
237
+ // enclosing class resolves to the SYNTHESIZED `Worker$N` def (anchoring
238
+ // on the constructed-type node would sit OUTSIDE the anonymous scope
239
+ // and mis-attribute the edge to the lexically enclosing class). The
240
+ // synthetic `@reference.name` carries the base's simple name; a JDK
241
+ // type with no repo def simply resolves to nothing (no edge). Without
242
+ // this edge `mroFor(Worker$N)` is empty and the #2550 instance-
243
+ // ownership gate suppressed TRUE bare calls to inherited methods
244
+ // inside the anonymous body (empirically caught in review).
245
+ const constructedType = oce.childForFieldName?.('type');
246
+ const baseSimpleName = constructedType !== null && constructedType !== undefined
247
+ ? javaBaseSimpleNameOf(constructedType)
248
+ : undefined;
249
+ if (baseSimpleName !== undefined) {
250
+ out.push({
251
+ '@reference.inherits': nodeToCapture('@reference.inherits', body),
252
+ '@reference.name': syntheticCapture('@reference.name', body, baseSimpleName),
253
+ });
254
+ }
255
+ // Receiver typeBinding: `Runnable handler = new Runnable() { ... }`
256
+ // binds `handler` to the ANONYMOUS class (`Worker$1`), not the declared
257
+ // interface — the instance is what `handler.run()` dispatches into, and
258
+ // the declared type is frequently a JDK interface with no repo def.
259
+ // Appended after the raw matches, so it overwrites the declared-type
260
+ // binding the `@type-binding.annotation` query rule produced for the
261
+ // same variable (pass-4 applies bindings in match order; last wins).
262
+ const declarator = oce.parent;
263
+ if (declarator !== null && declarator.type === 'variable_declarator') {
264
+ const varName = declarator.childForFieldName?.('name');
265
+ const declNode = declarator.parent ?? declarator;
266
+ if (varName !== null && varName !== undefined) {
267
+ out.push({
268
+ '@type-binding.annotation': nodeToCapture('@type-binding.annotation', declNode),
269
+ '@type-binding.name': nodeToCapture('@type-binding.name', varName),
270
+ '@type-binding.type': syntheticCapture('@type-binding.type', oce, name),
271
+ });
272
+ }
273
+ }
274
+ }
275
+ // Enum constant bodies (`enum E { A { ... } }`) — javac's other
276
+ // anonymous shape (#2555). Same synthesis, same body anchor; the
277
+ // constant's class extends its HOST ENUM (javac semantics), so the
278
+ // inherits reference names the enum — giving `mroFor(E$N) ∋ E` and
279
+ // keeping bare calls from the body to the enum's own helpers alive
280
+ // through the ownership gate's MRO arm.
281
+ for (const constant of rootNode.descendantsOfType('enum_constant')) {
282
+ const hostEnum = javaEnclosingEnumNameOf(constant);
283
+ const bodyNode = constant.childForFieldName?.('body');
284
+ const isBodied = bodyNode !== null && bodyNode !== undefined && bodyNode.type === 'class_body';
285
+ const bodiedName = synthesizeJavaAnonymousClassName(constant);
286
+ if (bodiedName !== undefined && isBodied) {
287
+ out.push({
288
+ '@declaration.class': nodeToCapture('@declaration.class', bodyNode),
289
+ '@declaration.name': syntheticCapture('@declaration.name', bodyNode, bodiedName),
290
+ });
291
+ if (hostEnum !== undefined) {
292
+ out.push({
293
+ '@reference.inherits': nodeToCapture('@reference.inherits', bodyNode),
294
+ '@reference.name': syntheticCapture('@reference.name', bodyNode, hostEnum),
295
+ });
296
+ }
297
+ }
298
+ // Receiver dispatch (#2561): `E.CONST.method()` resolves through the
299
+ // generic compound-receiver chain walk, which looks up each dotted
300
+ // segment via the owning class scope's `typeBindings` map — the same
301
+ // mechanism a field declaration uses (`private User user;` binds
302
+ // `user` on the class scope). Binding the constant's own simple name
303
+ // there — to its synthesized `E$N` class when bodied (MRO includes E,
304
+ // so members inherited from the enum still resolve), or to the host
305
+ // enum itself when body-less — makes `E.CONST.method()` resolve with
306
+ // no changes to the shared receiver-binding machinery.
307
+ //
308
+ // A bodied constant binds ONLY to its `E$N` class, never the host enum:
309
+ // if name synthesis fails on a malformed/error-recovery tree (`bodiedName`
310
+ // undefined despite a real body), emit nothing rather than silently
311
+ // misattributing an OVERRIDING constant's receiver to the enum's own
312
+ // (non-overridden) method — a wrong edge is worse than no edge. Mirrors
313
+ // the `object_creation_expression` branch, which skips on synthesis
314
+ // failure. `hostEnum` is used only for genuinely body-less constants.
315
+ const constantNameNode = constant.childForFieldName?.('name');
316
+ const constantType = isBodied ? bodiedName : hostEnum;
317
+ if (constantNameNode !== null && constantNameNode !== undefined && constantType !== undefined) {
318
+ out.push({
319
+ '@type-binding.annotation': nodeToCapture('@type-binding.annotation', constant),
320
+ '@type-binding.name': nodeToCapture('@type-binding.name', constantNameNode),
321
+ '@type-binding.type': syntheticCapture('@type-binding.type', constant, constantType),
322
+ });
323
+ }
324
+ }
325
+ return out;
326
+ }
327
+ /** Simple name of the enum_declaration enclosing an enum_constant, or
328
+ * undefined (grammar guarantees one exists in well-formed source). */
329
+ function javaEnclosingEnumNameOf(constant) {
330
+ let cursor = constant.parent;
331
+ while (cursor !== null) {
332
+ if (cursor.type === 'enum_declaration') {
333
+ return cursor.childForFieldName?.('name')?.text ?? undefined;
334
+ }
335
+ cursor = cursor.parent;
336
+ }
337
+ return undefined;
338
+ }
170
339
  /**
171
340
  * Synthesize `@reference.call.constructor` captures for explicit constructor
172
341
  * invocations — `super(...)` and `this(...)` (F38 #1928). tree-sitter-java
@@ -357,6 +526,13 @@ function emitJavaInheritanceBase(out, base) {
357
526
  });
358
527
  }
359
528
  /** Resolve a Java base-type node to its bare simple-name identifier node. */
529
+ /** Simple name of a constructed/base type node, reusing the same node
530
+ * shapes `javaBaseLookupNameNode` handles (`Runnable`, `a.b.Base`,
531
+ * `Box<T>`). Returns undefined when the node is none of those. */
532
+ function javaBaseSimpleNameOf(typeNode) {
533
+ const nameNode = javaBaseLookupNameNode(typeNode);
534
+ return nameNode === null ? undefined : nameNode.text;
535
+ }
360
536
  function javaBaseLookupNameNode(node) {
361
537
  switch (node.type) {
362
538
  case 'type_identifier':
@@ -0,0 +1,5 @@
1
+ import { type JvmPackageFact, type JvmPackageSyntaxNode } from '../jvm/package-facts.js';
2
+ export declare const clearJavaPackageFacts: () => void;
3
+ export declare const captureJavaPackageFact: (filePath: string, root: JvmPackageSyntaxNode) => void;
4
+ export declare const setJavaPackageFact: (filePath: string, fact: JvmPackageFact) => void;
5
+ export declare const getJavaPackageFact: (filePath: string) => JvmPackageFact | undefined;