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
@@ -0,0 +1,40 @@
1
+ export const UNKNOWN_JVM_PACKAGE_FACT = Object.freeze({ status: 'unknown' });
2
+ /** Validate a package fact restored from an opaque worker payload. */
3
+ export function isJvmPackageFact(value) {
4
+ if (value === null || typeof value !== 'object')
5
+ return false;
6
+ const fact = value;
7
+ return (fact.status === 'unknown' || (fact.status === 'known' && typeof fact.packageName === 'string'));
8
+ }
9
+ /**
10
+ * Create one language-local package fact store.
11
+ *
12
+ * Package facts are captured while the language's scope extractor already
13
+ * owns a tree-sitter Tree, then serialized through ParsedFile's side-channel.
14
+ * Resolution hooks consume only this plain data and never parse source again.
15
+ */
16
+ export function createJvmPackageFactStore(options) {
17
+ const factsByFile = new Map();
18
+ return {
19
+ clear: () => factsByFile.clear(),
20
+ capture: (filePath, root) => factsByFile.set(filePath, extractJvmPackageFact(root, options)),
21
+ set: (filePath, fact) => factsByFile.set(filePath, fact),
22
+ get: (filePath) => factsByFile.get(filePath),
23
+ };
24
+ }
25
+ export function extractJvmPackageFact(root, options) {
26
+ const packageNode = root.namedChildren.find((child) => child.type === options.packageNodeType);
27
+ if (packageNode === undefined) {
28
+ // A syntax error elsewhere in a default-package file does not make its
29
+ // package ambiguous. Only a top-level ERROR that contains the reserved
30
+ // package keyword is evidence of a malformed package header.
31
+ const malformedHeader = root.namedChildren.some((child) => child.type === 'ERROR' && /\bpackage\b/.test(child.text));
32
+ return malformedHeader ? UNKNOWN_JVM_PACKAGE_FACT : { status: 'known', packageName: '' };
33
+ }
34
+ const nameNode = packageNode.namedChildren.find((child) => options.packageNameNodeTypes.includes(child.type));
35
+ const packageName = nameNode?.text.trim();
36
+ if (packageNode.hasError || packageName === undefined || packageName.length === 0) {
37
+ return UNKNOWN_JVM_PACKAGE_FACT;
38
+ }
39
+ return { status: 'known', packageName };
40
+ }
@@ -0,0 +1,14 @@
1
+ import type { ParsedFile } from '../../../../_shared/index.js';
2
+ import type { ScopeResolutionIndexes } from '../../model/scope-resolution-indexes.js';
3
+ import type { JvmPackageFact } from './package-facts.js';
4
+ export interface JvmPackageSiblingOptions {
5
+ readonly languageLabel: string;
6
+ readonly getPackageFact: (filePath: string) => JvmPackageFact | undefined;
7
+ }
8
+ export interface JvmPackageSiblingVisibility {
9
+ readonly populateNamespaceSiblings: (parsedFiles: readonly ParsedFile[], indexes: ScopeResolutionIndexes, ctx: {
10
+ readonly fileContents: ReadonlyMap<string, string>;
11
+ }) => void;
12
+ readonly isVisibilityIncomplete: (filePath: string) => boolean;
13
+ }
14
+ export declare function createJvmPackageSiblingVisibility(options: JvmPackageSiblingOptions): JvmPackageSiblingVisibility;
@@ -0,0 +1,129 @@
1
+ import { logger } from '../../../logger.js';
2
+ import { isClassLike } from '../../scope-resolution/scope/walkers.js';
3
+ const MAX_PACKAGE_FILES = 500;
4
+ export function createJvmPackageSiblingVisibility(options) {
5
+ const incompleteFiles = new Set();
6
+ function populateNamespaceSiblings(parsedFiles, indexes, ctx) {
7
+ incompleteFiles.clear();
8
+ const buckets = new Map();
9
+ const unknownPackageFiles = new Set();
10
+ const parsedPaths = new Set(parsedFiles.map((parsed) => parsed.filePath));
11
+ // A file that failed scope extraction has no ParsedFile or side-channel,
12
+ // but it may still declare a shadowing type in any package. Keep its source
13
+ // path in the uncertainty set without re-parsing it on the main thread.
14
+ for (const filePath of ctx.fileContents.keys()) {
15
+ if (!parsedPaths.has(filePath))
16
+ unknownPackageFiles.add(filePath);
17
+ }
18
+ for (const parsed of parsedFiles) {
19
+ const packageFact = options.getPackageFact(parsed.filePath);
20
+ if (!ctx.fileContents.has(parsed.filePath) || packageFact?.status !== 'known') {
21
+ incompleteFiles.add(parsed.filePath);
22
+ unknownPackageFiles.add(parsed.filePath);
23
+ continue;
24
+ }
25
+ const packageName = packageFact.packageName;
26
+ const bucket = buckets.get(packageName) ?? { parsed: [], moduleScopes: [] };
27
+ buckets.set(packageName, bucket);
28
+ bucket.parsed.push(parsed);
29
+ const moduleScope = parsed.scopes.find((scope) => scope.kind === 'Module');
30
+ if (moduleScope !== undefined) {
31
+ bucket.moduleScopes.push({ filePath: parsed.filePath, scope: moduleScope });
32
+ }
33
+ }
34
+ // A file whose package cannot be proven may shadow a wildcard-imported
35
+ // type in any package. Conservatively disable wildcard attribution for the
36
+ // language workspace while leaving explicit/FQN imports available.
37
+ if (unknownPackageFiles.size > 0) {
38
+ for (const parsed of parsedFiles)
39
+ incompleteFiles.add(parsed.filePath);
40
+ logger.warn(`[${options.languageLabel}-package-siblings] ${unknownPackageFiles.size} file(s) lacked reliable package facts; wildcard attribution disabled for this language workspace`);
41
+ }
42
+ const augmentations = indexes.bindingAugmentations;
43
+ for (const bucket of buckets.values()) {
44
+ if (bucket.moduleScopes.length < 2)
45
+ continue;
46
+ if (bucket.moduleScopes.length > MAX_PACKAGE_FILES) {
47
+ for (const parsed of bucket.parsed)
48
+ incompleteFiles.add(parsed.filePath);
49
+ logger.warn(`[${options.languageLabel}-package-siblings] skipping package with ${bucket.moduleScopes.length} files (cap=${MAX_PACKAGE_FILES}); same-package implicit visibility disabled for this package`);
50
+ continue;
51
+ }
52
+ const classDefs = [];
53
+ for (const parsed of bucket.parsed) {
54
+ const moduleScopeId = parsed.scopes.find((scope) => scope.kind === 'Module')?.id;
55
+ for (const scope of parsed.scopes) {
56
+ if (scope.kind !== 'Class' || scope.parent !== moduleScopeId)
57
+ continue;
58
+ const def = scope.ownedDefs.find((candidate) => isClassLike(candidate.type));
59
+ if (def !== undefined)
60
+ classDefs.push({ def, filePath: parsed.filePath });
61
+ }
62
+ }
63
+ for (const { filePath, scope } of bucket.moduleScopes) {
64
+ let scopeAug = augmentations.get(scope.id);
65
+ if (scopeAug === undefined) {
66
+ scopeAug = new Map();
67
+ augmentations.set(scope.id, scopeAug);
68
+ }
69
+ const proximityCache = new Map();
70
+ const candidates = classDefs.filter((candidate) => candidate.filePath !== filePath);
71
+ for (const candidate of candidates) {
72
+ if (!proximityCache.has(candidate.filePath)) {
73
+ proximityCache.set(candidate.filePath, sharedSegmentCount(candidate.filePath, filePath));
74
+ }
75
+ }
76
+ candidates.sort((a, b) => (proximityCache.get(b.filePath) ?? 0) - (proximityCache.get(a.filePath) ?? 0));
77
+ const injectedIds = new Set();
78
+ for (const { def } of candidates) {
79
+ if (injectedIds.has(def.nodeId) || def.qualifiedName === undefined)
80
+ continue;
81
+ injectedIds.add(def.nodeId);
82
+ const simpleName = def.qualifiedName.includes('.')
83
+ ? def.qualifiedName.slice(def.qualifiedName.lastIndexOf('.') + 1)
84
+ : def.qualifiedName;
85
+ const bindings = scopeAug.get(simpleName) ?? [];
86
+ if (!scopeAug.has(simpleName))
87
+ scopeAug.set(simpleName, bindings);
88
+ bindings.push({ def, origin: 'namespace' });
89
+ }
90
+ const typeBindings = scope.typeBindings;
91
+ for (const sibling of bucket.moduleScopes) {
92
+ if (sibling.filePath === filePath)
93
+ continue;
94
+ for (const [name, ref] of sibling.scope.typeBindings) {
95
+ if (!typeBindings.has(name))
96
+ typeBindings.set(name, ref);
97
+ }
98
+ }
99
+ for (const sibling of bucket.parsed) {
100
+ if (sibling.filePath === filePath)
101
+ continue;
102
+ for (const siblingScope of sibling.scopes) {
103
+ if (siblingScope.kind !== 'Class')
104
+ continue;
105
+ for (const [name, ref] of siblingScope.typeBindings) {
106
+ if (ref.source !== 'self' && !typeBindings.has(name))
107
+ typeBindings.set(name, ref);
108
+ }
109
+ }
110
+ }
111
+ }
112
+ }
113
+ }
114
+ return {
115
+ populateNamespaceSiblings,
116
+ isVisibilityIncomplete: (filePath) => incompleteFiles.has(filePath),
117
+ };
118
+ }
119
+ function sharedSegmentCount(a, b) {
120
+ const aSegments = a.replace(/\\/g, '/').split('/');
121
+ const bSegments = b.replace(/\\/g, '/').split('/');
122
+ let index = 0;
123
+ while (index < aSegments.length &&
124
+ index < bSegments.length &&
125
+ aSegments[index] === bSegments[index]) {
126
+ index++;
127
+ }
128
+ return index;
129
+ }
@@ -7,6 +7,10 @@
7
7
  * - `companionScopesByFile` (companion-scopes.ts) — the `ScopeId`s that came
8
8
  * from a `companion_object` AST node, recorded via `markCompanionScope`
9
9
  * from the `@scope.companion` marker capture.
10
+ * - Spring Bean class-annotation facts collected during the same scope-query
11
+ * traversal, consumed only after imports and package visibility finalize.
12
+ * - A JVM package fact read from the already-parsed root, so package-sibling
13
+ * visibility never re-parses Kotlin source on the main thread.
10
14
  *
11
15
  * On the worker path that map is filled in the WORKER process and lost across
12
16
  * the worker→main MessageChannel (and the disk-backed parsedfile-store),
@@ -25,10 +29,13 @@
25
29
  * The single generic `ParsedFile.captureSideChannel` field is shared with C++,
26
30
  * which is safe because each file is one language (a `.kt` file uses the kotlin
27
31
  * provider, a `.cpp` file the cpp provider). The payload is self-describing
28
- * (`{ kind: 'kotlin', companionScopes }`) so `applyKotlinCaptureSideChannel`
29
- * only restores kotlin state and ignores a foreign-shaped snapshot.
32
+ * (`{ kind: 'kotlin', companionScopes, packageFact, classAnnotations }`) so
33
+ * `applyKotlinCaptureSideChannel` only restores kotlin state and ignores a
34
+ * foreign-shaped snapshot.
30
35
  */
31
36
  import type { ParsedFile, ScopeId } from '../../../../_shared/index.js';
37
+ import { type ClassAnnotationFact } from '../../frameworks/spring/bean-candidates.js';
38
+ import { type JvmPackageFact } from '../jvm/package-facts.js';
32
39
  /**
33
40
  * Plain JSON-serializable snapshot of the per-file Kotlin capture-time
34
41
  * side-channel. Carried opaquely on `ParsedFile.captureSideChannel`. The
@@ -39,10 +46,17 @@ export interface KotlinCaptureSideChannel {
39
46
  readonly kind: 'kotlin';
40
47
  /** Companion-object scope ids recorded for this file. */
41
48
  readonly companionScopes: readonly ScopeId[];
49
+ /** Package visibility captured from the existing Kotlin AST. */
50
+ readonly packageFact: JvmPackageFact;
51
+ /** Class annotation syntax collected by the existing scope traversal. */
52
+ readonly classAnnotations: readonly ClassAnnotationFact[];
42
53
  }
54
+ export declare function clearKotlinClassAnnotationFacts(): void;
55
+ export declare function setKotlinClassAnnotationFacts(filePath: string, facts: readonly ClassAnnotationFact[]): void;
56
+ export declare function getKotlinClassAnnotationFacts(filePath: string): readonly ClassAnnotationFact[];
43
57
  /**
44
58
  * `LanguageProvider.collectCaptureSideChannel` implementation for Kotlin.
45
- * Returns `undefined` when this file recorded no companion scopes at all, so
59
+ * Returns `undefined` when this file recorded no side-channel state at all, so
46
60
  * the produced `ParsedFile` carries the field only when there's data to ship.
47
61
  */
48
62
  export declare function collectKotlinCaptureSideChannel(filePath: string): KotlinCaptureSideChannel | undefined;
@@ -7,6 +7,10 @@
7
7
  * - `companionScopesByFile` (companion-scopes.ts) — the `ScopeId`s that came
8
8
  * from a `companion_object` AST node, recorded via `markCompanionScope`
9
9
  * from the `@scope.companion` marker capture.
10
+ * - Spring Bean class-annotation facts collected during the same scope-query
11
+ * traversal, consumed only after imports and package visibility finalize.
12
+ * - A JVM package fact read from the already-parsed root, so package-sibling
13
+ * visibility never re-parses Kotlin source on the main thread.
10
14
  *
11
15
  * On the worker path that map is filled in the WORKER process and lost across
12
16
  * the worker→main MessageChannel (and the disk-backed parsedfile-store),
@@ -25,20 +29,42 @@
25
29
  * The single generic `ParsedFile.captureSideChannel` field is shared with C++,
26
30
  * which is safe because each file is one language (a `.kt` file uses the kotlin
27
31
  * provider, a `.cpp` file the cpp provider). The payload is self-describing
28
- * (`{ kind: 'kotlin', companionScopes }`) so `applyKotlinCaptureSideChannel`
29
- * only restores kotlin state and ignores a foreign-shaped snapshot.
32
+ * (`{ kind: 'kotlin', companionScopes, packageFact, classAnnotations }`) so
33
+ * `applyKotlinCaptureSideChannel` only restores kotlin state and ignores a
34
+ * foreign-shaped snapshot.
30
35
  */
36
+ import { createClassAnnotationFactStore, } from '../../frameworks/spring/bean-candidates.js';
37
+ import { isJvmPackageFact, UNKNOWN_JVM_PACKAGE_FACT, } from '../jvm/package-facts.js';
31
38
  import { getCompanionScopesForFile, markCompanionScope } from './companion-scopes.js';
39
+ import { getKotlinPackageFact, setKotlinPackageFact } from './package-facts.js';
40
+ const classAnnotations = createClassAnnotationFactStore();
41
+ export function clearKotlinClassAnnotationFacts() {
42
+ classAnnotations.clear();
43
+ }
44
+ export function setKotlinClassAnnotationFacts(filePath, facts) {
45
+ classAnnotations.set(filePath, facts);
46
+ }
47
+ export function getKotlinClassAnnotationFacts(filePath) {
48
+ return classAnnotations.get(filePath);
49
+ }
32
50
  /**
33
51
  * `LanguageProvider.collectCaptureSideChannel` implementation for Kotlin.
34
- * Returns `undefined` when this file recorded no companion scopes at all, so
52
+ * Returns `undefined` when this file recorded no side-channel state at all, so
35
53
  * the produced `ParsedFile` carries the field only when there's data to ship.
36
54
  */
37
55
  export function collectKotlinCaptureSideChannel(filePath) {
38
56
  const companionScopes = getCompanionScopesForFile(filePath);
39
- if (companionScopes.length === 0)
57
+ const annotationFacts = classAnnotations.get(filePath);
58
+ const packageFact = getKotlinPackageFact(filePath);
59
+ if (companionScopes.length === 0 && annotationFacts.length === 0 && packageFact === undefined) {
40
60
  return undefined;
41
- return { kind: 'kotlin', companionScopes };
61
+ }
62
+ return {
63
+ kind: 'kotlin',
64
+ companionScopes,
65
+ packageFact: packageFact ?? UNKNOWN_JVM_PACKAGE_FACT,
66
+ classAnnotations: annotationFacts,
67
+ };
42
68
  }
43
69
  /**
44
70
  * `ScopeResolver.applyCaptureSideChannel` implementation for Kotlin. Reads the
@@ -50,11 +76,19 @@ export function collectKotlinCaptureSideChannel(filePath) {
50
76
  */
51
77
  export function applyKotlinCaptureSideChannel(parsed) {
52
78
  const data = parsed.captureSideChannel;
53
- if (data === undefined || data === null || typeof data !== 'object')
54
- return;
55
- if (data.kind !== 'kotlin' || !Array.isArray(data.companionScopes))
79
+ if (data === undefined ||
80
+ data === null ||
81
+ typeof data !== 'object' ||
82
+ data.kind !== 'kotlin' ||
83
+ !Array.isArray(data.companionScopes) ||
84
+ !Array.isArray(data.classAnnotations)) {
85
+ classAnnotations.set(parsed.filePath, []);
86
+ setKotlinPackageFact(parsed.filePath, UNKNOWN_JVM_PACKAGE_FACT);
56
87
  return;
88
+ }
57
89
  for (const scopeId of data.companionScopes) {
58
90
  markCompanionScope(parsed.filePath, scopeId);
59
91
  }
92
+ classAnnotations.set(parsed.filePath, data.classAnnotations);
93
+ setKotlinPackageFact(parsed.filePath, isJvmPackageFact(data.packageFact) ? data.packageFact : UNKNOWN_JVM_PACKAGE_FACT);
60
94
  }
@@ -1,4 +1,5 @@
1
1
  import { makeScopeId } from '../../../../_shared/index.js';
2
+ import { materializeClassAnnotationFacts, recordClassAnnotationCapture, } from '../../frameworks/spring/bean-candidates.js';
2
3
  import { nodeIfType, nodeToCapture, syntheticCapture, } from '../../utils/ast-helpers.js';
3
4
  import { getTreeSitterBufferSize } from '../../constants.js';
4
5
  import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
@@ -9,7 +10,45 @@ import { normalizeKotlinType } from './interpret.js';
9
10
  import { synthesizeKotlinReceiverBinding } from './receiver-binding.js';
10
11
  import { getKotlinParser, getKotlinScopeQuery } from './query.js';
11
12
  import { markCompanionScope } from './companion-scopes.js';
13
+ import { setKotlinClassAnnotationFacts } from './capture-side-channel.js';
14
+ import { captureKotlinPackageFact } from './package-facts.js';
15
+ import { synthesizeCallableFlowCaptures } from '../../utils/callable-flow-captures.js';
12
16
  const FUNCTION_DECL_TAGS = ['@declaration.function'];
17
+ const KOTLIN_CALLABLE_CAPTURE_OPTIONS = {
18
+ functionNodeTypes: new Set(['function_declaration', 'anonymous_function', 'lambda_literal']),
19
+ callNodeTypes: new Set(['call_expression']),
20
+ parameterListNodeTypes: new Set(['function_value_parameters', 'value_arguments']),
21
+ parameterNodeTypes: new Set(['parameter']),
22
+ bindingNodeTypes: new Set(['property_declaration']),
23
+ assignmentNodeTypes: new Set(['assignment']),
24
+ identifierNodeTypes: new Set(['simple_identifier', 'type_identifier']),
25
+ callableReferenceNodeTypes: new Set(['callable_reference']),
26
+ callableProtocolMethods: new Set(['invoke']),
27
+ functionName: (node) => node.namedChildren.find((child) => child !== null && child.type === 'simple_identifier')?.text,
28
+ extractAssignment: (node) => {
29
+ // tree-sitter-kotlin's `assignment` node is FIELDLESS (positional
30
+ // `directly_assignable_expression` then the value), so the shared
31
+ // field-based fallback returned nothing and nested reassignments
32
+ // (`chosen = ::target` inside a block) never produced flow facts
33
+ // (#2522 review, shallow-coverage gap).
34
+ if (node.type === 'assignment') {
35
+ const named = node.namedChildren.filter((child) => child !== null);
36
+ if (named.length < 2)
37
+ return undefined;
38
+ return { destination: named[0], source: named[named.length - 1] };
39
+ }
40
+ if (node.type !== 'property_declaration')
41
+ return undefined;
42
+ if (!node.children.some((child) => child.text === '='))
43
+ return undefined;
44
+ const destination = node.namedChildren.find((child) => child !== null && child.type === 'variable_declaration');
45
+ const source = [...node.namedChildren]
46
+ .reverse()
47
+ .find((child) => child !== null && child.id !== destination?.id && child.type !== 'binding_pattern_kind');
48
+ return destination === undefined || source === undefined ? undefined : { destination, source };
49
+ },
50
+ normalizeQualifiedName: (raw) => raw.replaceAll('::', '.'),
51
+ };
13
52
  export function emitKotlinScopeCaptures(sourceText, filePath, cachedTree) {
14
53
  let tree = cachedTree;
15
54
  if (tree === undefined) {
@@ -21,7 +60,9 @@ export function emitKotlinScopeCaptures(sourceText, filePath, cachedTree) {
21
60
  else {
22
61
  recordKotlinCacheHit();
23
62
  }
63
+ captureKotlinPackageFact(filePath, tree.rootNode);
24
64
  const out = [];
65
+ const classAnnotations = new Map();
25
66
  const returnTypes = collectKotlinReturnTypeTexts(tree.rootNode);
26
67
  out.push(...synthesizeKotlinLocalAssignmentBindings(tree.rootNode, returnTypes));
27
68
  out.push(...synthesizeKotlinLoopBindings(tree.rootNode, returnTypes));
@@ -44,6 +85,15 @@ export function emitKotlinScopeCaptures(sourceText, filePath, cachedTree) {
44
85
  }
45
86
  if (Object.keys(grouped).length === 0)
46
87
  continue;
88
+ const annotatedClass = grouped['@class-annotation.class'];
89
+ const annotationName = grouped['@class-annotation.name'];
90
+ if (annotatedClass !== undefined && annotationName !== undefined) {
91
+ const classNode = nodeIfType(groupedNodes['@class-annotation.class'], 'class_declaration');
92
+ if (classNode !== null && isKotlinBeanCandidateClass(classNode)) {
93
+ recordClassAnnotationCapture(classAnnotations, filePath, annotatedClass, annotationName.text);
94
+ }
95
+ continue;
96
+ }
47
97
  // Companion-object marker (#1756 / U4). The `@scope.companion`
48
98
  // capture is a side-channel marker — it shares its range with the
49
99
  // existing `(companion_object) @scope.class` rule, so the Class
@@ -176,8 +226,17 @@ export function emitKotlinScopeCaptures(sourceText, filePath, cachedTree) {
176
226
  if (extensionFallback !== null)
177
227
  out.push(extensionFallback);
178
228
  }
229
+ setKotlinClassAnnotationFacts(filePath, materializeClassAnnotationFacts(classAnnotations));
230
+ out.push(...synthesizeCallableFlowCaptures(tree.rootNode, KOTLIN_CALLABLE_CAPTURE_OPTIONS));
179
231
  return out;
180
232
  }
233
+ function isKotlinBeanCandidateClass(classNode) {
234
+ if (classNode.children.some((child) => child.type === 'interface' || child.type === 'enum')) {
235
+ return false;
236
+ }
237
+ const modifiers = classNode.namedChildren.find((child) => child.type === 'modifiers');
238
+ return !modifiers?.namedChildren.some((child) => child.type === 'class_modifier' && child.text.trim() === 'annotation');
239
+ }
181
240
  /**
182
241
  * Synthesize `@reference.inherits` captures from Kotlin `class_declaration`
183
242
  * delegation specifiers so the registry-primary scope-resolution path emits
@@ -0,0 +1,5 @@
1
+ import { type JvmPackageFact, type JvmPackageSyntaxNode } from '../jvm/package-facts.js';
2
+ export declare const clearKotlinPackageFacts: () => void;
3
+ export declare const captureKotlinPackageFact: (filePath: string, root: JvmPackageSyntaxNode) => void;
4
+ export declare const setKotlinPackageFact: (filePath: string, fact: JvmPackageFact) => void;
5
+ export declare const getKotlinPackageFact: (filePath: string) => JvmPackageFact | undefined;
@@ -0,0 +1,9 @@
1
+ import { createJvmPackageFactStore, } from '../jvm/package-facts.js';
2
+ const kotlinPackageFacts = createJvmPackageFactStore({
3
+ packageNodeType: 'package_header',
4
+ packageNameNodeTypes: ['identifier'],
5
+ });
6
+ export const clearKotlinPackageFacts = () => kotlinPackageFacts.clear();
7
+ export const captureKotlinPackageFact = (filePath, root) => kotlinPackageFacts.capture(filePath, root);
8
+ export const setKotlinPackageFact = (filePath, fact) => kotlinPackageFacts.set(filePath, fact);
9
+ export const getKotlinPackageFact = (filePath) => kotlinPackageFacts.get(filePath);
@@ -0,0 +1,4 @@
1
+ export declare const populateKotlinPackageSiblings: (parsedFiles: readonly import('../../../../_shared/index.js').ParsedFile[], indexes: import("../../model/scope-resolution-indexes.js").ScopeResolutionIndexes, ctx: {
2
+ readonly fileContents: ReadonlyMap<string, string>;
3
+ }) => void;
4
+ export declare const isKotlinPackageSiblingVisibilityIncomplete: (filePath: string) => boolean;
@@ -0,0 +1,8 @@
1
+ import { createJvmPackageSiblingVisibility } from '../jvm/package-siblings.js';
2
+ import { getKotlinPackageFact } from './package-facts.js';
3
+ const kotlinPackageSiblingVisibility = createJvmPackageSiblingVisibility({
4
+ languageLabel: 'kotlin',
5
+ getPackageFact: getKotlinPackageFact,
6
+ });
7
+ export const populateKotlinPackageSiblings = kotlinPackageSiblingVisibility.populateNamespaceSiblings;
8
+ export const isKotlinPackageSiblingVisibilityIncomplete = kotlinPackageSiblingVisibility.isVisibilityIncomplete;
@@ -15,6 +15,12 @@ const KOTLIN_SCOPE_QUERY = `
15
15
  (class_declaration) @scope.class
16
16
  (object_declaration) @scope.class
17
17
  (companion_object) @scope.class
18
+ ;; Anonymous object expression: \`val h = object { fun fetch() {} }\`
19
+ ;; (distinct from the named \`object_declaration\`/\`companion_object\` above).
20
+ ;; Without its own scope, a method's auto-hoist (scope-extractor.ts) has
21
+ ;; nowhere to stop and leaks the name past the literal into the enclosing
22
+ ;; scope -- the same failure mode fixed for TS/JS object literals (#2545).
23
+ (object_literal) @scope.class
18
24
  (function_declaration) @scope.function
19
25
 
20
26
  ;; Secondary-constructor body scope (issue #1919 review CF1). A
@@ -91,6 +97,19 @@ const KOTLIN_SCOPE_QUERY = `
91
97
  (type_alias
92
98
  (type_identifier) @declaration.name) @declaration.type_alias
93
99
 
100
+ ;; Class annotation syntax is carried to post-resolution enrichment. Keeping
101
+ ;; this in the existing scope query avoids a second AST traversal. Eligibility
102
+ ;; filtering (class vs interface/enum/annotation class) happens in captures.ts.
103
+ (class_declaration
104
+ (modifiers
105
+ [
106
+ (annotation
107
+ (user_type) @class-annotation.name)
108
+ (annotation
109
+ (constructor_invocation
110
+ (user_type) @class-annotation.name))
111
+ ])) @class-annotation.class
112
+
94
113
  ;; Declarations — functions / methods / properties
95
114
  (function_declaration
96
115
  (simple_identifier) @declaration.name) @declaration.function
@@ -5,8 +5,11 @@ import { isClassLike } from '../../scope-resolution/scope/walkers.js';
5
5
  import { kotlinProvider } from '../kotlin.js';
6
6
  import { kotlinArityCompatibility, kotlinMergeBindings, populateKotlinOwners, resolveKotlinImportTarget, } from './index.js';
7
7
  import { clearCompanionScopes } from './companion-scopes.js';
8
- import { applyKotlinCaptureSideChannel } from './capture-side-channel.js';
8
+ import { applyKotlinCaptureSideChannel, clearKotlinClassAnnotationFacts, } from './capture-side-channel.js';
9
9
  import { isKotlinStaticOnly } from './owners.js';
10
+ import { populateKotlinPackageSiblings } from './package-siblings.js';
11
+ import { attachKotlinSpringBeanCandidateMetadata } from './spring-bean-metadata.js';
12
+ import { clearKotlinPackageFacts } from './package-facts.js';
10
13
  /**
11
14
  * Kotlin scope resolver for RFC #909 Ring 3.
12
15
  *
@@ -57,6 +60,8 @@ export const kotlinScopeResolver = {
57
60
  // `undefined` because Kotlin has no external resolution config
58
61
  // to load.
59
62
  clearCompanionScopes();
63
+ clearKotlinClassAnnotationFacts();
64
+ clearKotlinPackageFacts();
60
65
  return undefined;
61
66
  },
62
67
  resolveImportTarget: (targetRaw, fromFile, allFilePaths) => {
@@ -89,6 +94,9 @@ export const kotlinScopeResolver = {
89
94
  propagatesReturnTypesAcrossImports: true,
90
95
  collapseMemberCallsByCallerTarget: false,
91
96
  hoistTypeBindingsToModule: true,
97
+ postExtractSourceTextPolicy: 'uncached-files',
98
+ populateNamespaceSiblings: populateKotlinPackageSiblings,
99
+ emitPostResolutionEdges: attachKotlinSpringBeanCandidateMetadata,
92
100
  };
93
101
  /**
94
102
  * Kotlin MRO builder — extends `defaultLinearize` (EXTENDS-only) with
@@ -0,0 +1,2 @@
1
+ /** Kotlin wiring for the language-neutral Spring candidate engine. */
2
+ export declare const attachKotlinSpringBeanCandidateMetadata: (graph: import("../../../graph/types.js").KnowledgeGraph, parsedFiles: readonly import('../../../../_shared/index.js').ParsedFile[], nodeLookup: import("../../scope-resolution/graph-bridge/node-lookup.js").GraphNodeLookup, indexes: import("../../model/scope-resolution-indexes.js").ScopeResolutionIndexes) => void;
@@ -0,0 +1,8 @@
1
+ import { createSpringBeanCandidateAttacher } from '../../frameworks/spring/bean-candidates.js';
2
+ import { getKotlinClassAnnotationFacts } from './capture-side-channel.js';
3
+ import { isKotlinPackageSiblingVisibilityIncomplete } from './package-siblings.js';
4
+ /** Kotlin wiring for the language-neutral Spring candidate engine. */
5
+ export const attachKotlinSpringBeanCandidateMetadata = createSpringBeanCandidateAttacher({
6
+ getClassAnnotationFacts: getKotlinClassAnnotationFacts,
7
+ isPackageVisibilityIncomplete: isKotlinPackageSiblingVisibilityIncomplete,
8
+ });
@@ -167,12 +167,11 @@ export const kotlinProvider = defineLanguage({
167
167
  emitScopeCaptures: emitKotlinScopeCaptures,
168
168
  // ── #2195 PDG layer: Kotlin CFG visitor (vendored grammar) ──
169
169
  cfgVisitor: createKotlinCfgVisitor(),
170
- // Worker-side: snapshot the module-level companion-scope marks
171
- // `emitKotlinScopeCaptures` just populated for this file (`markCompanionScope`
172
- // → `companionScopesByFile`) into plain data on `ParsedFile.captureSideChannel`,
173
- // so the main thread can restore them via `applyCaptureSideChannel` WITHOUT a
174
- // re-parse (#1983). Without this, companion/static dispatch emits no CALLS
175
- // edges on the worker path. See `kotlin/capture-side-channel.ts`.
170
+ // Worker-side: snapshot companion-scope marks, package visibility, and
171
+ // class-annotation facts `emitKotlinScopeCaptures` just populated into plain
172
+ // data on `ParsedFile.captureSideChannel`, so the main thread can restore all
173
+ // three via `applyCaptureSideChannel` WITHOUT a re-parse (#1983). See
174
+ // `kotlin/capture-side-channel.ts`.
176
175
  // `assertCloneable` is a runtime identity; it makes a future non-serializable
177
176
  // value in the side-channel payload a compile error here, at the source, rather
178
177
  // than a DataCloneError at the worker boundary (#2143).
@@ -0,0 +1 @@
1
+ export declare const moveProvider: import("../language-provider.js").LanguageProvider;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Move Language Provider (stub).
3
+ *
4
+ * Move/Aptos is ingested compiler-first via the move-flow MCP server in the
5
+ * `moveIngest` phase — GitNexus never tree-sits or regex-scans Move source.
6
+ * This provider exists only to satisfy the exhaustive `SupportedLanguages`
7
+ * provider table; it declares no extensions, so `.move` files are never routed
8
+ * through the generic tree-sitter / scope-resolution pipeline (the `parse`
9
+ * phase additionally excludes every file ingested by `moveIngest`).
10
+ */
11
+ import { SupportedLanguages } from '../../../_shared/index.js';
12
+ import { defineLanguage } from '../language-provider.js';
13
+ export const moveProvider = defineLanguage({
14
+ id: SupportedLanguages.Move,
15
+ parseStrategy: 'standalone',
16
+ extensions: [], // .move files are handled by the moveIngest phase, not here
17
+ entryPointPatterns: [],
18
+ astFrameworkPatterns: [],
19
+ treeSitterQueries: '',
20
+ typeConfig: {
21
+ declarationNodeTypes: new Set(),
22
+ extractDeclaration: () => null,
23
+ extractParameter: () => null,
24
+ },
25
+ exportChecker: () => false,
26
+ importResolver: () => null,
27
+ });
@@ -38,6 +38,36 @@ import { getPhpParser, getPhpScopeQuery } from './query.js';
38
38
  import { recordCacheHit, recordCacheMiss } from './cache-stats.js';
39
39
  import { getTreeSitterBufferSize } from '../../constants.js';
40
40
  import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
41
+ import { synthesizeCallableFlowCaptures } from '../../utils/callable-flow-captures.js';
42
+ const PHP_CALLABLE_CAPTURE_OPTIONS = {
43
+ functionNodeTypes: new Set([
44
+ 'function_definition',
45
+ 'method_declaration',
46
+ 'anonymous_function',
47
+ 'arrow_function',
48
+ ]),
49
+ callNodeTypes: new Set(['function_call_expression']),
50
+ parameterListNodeTypes: new Set(['formal_parameters', 'arguments']),
51
+ // tree-sitter-php has no 'optional_parameter' node (defaults ride on
52
+ // simple_parameter); property promotion is constructor-only and carries no
53
+ // callable-flow value (#2522 review).
54
+ parameterNodeTypes: new Set(['simple_parameter', 'variadic_parameter']),
55
+ bindingNodeTypes: new Set(['assignment_expression']),
56
+ assignmentNodeTypes: new Set(['assignment_expression']),
57
+ identifierNodeTypes: new Set(['name', 'qualified_name', 'namespace_name']),
58
+ functionScopedValueBindings: true,
59
+ emitCanonicalInvokeReference: true,
60
+ extractCallableReference: (node) => {
61
+ if (node.type !== 'function_call_expression')
62
+ return undefined;
63
+ const args = node.childForFieldName('arguments');
64
+ const isFirstClass = args?.namedChildren.some((child) => child !== null && child.type === 'variadic_placeholder') === true;
65
+ const target = node.childForFieldName('function');
66
+ if (!isFirstClass || target === null || target.type === 'variable_name')
67
+ return undefined;
68
+ return { name: target.text.replace(/^\\+/, ''), anchor: target };
69
+ },
70
+ };
41
71
  /** Declaration anchors that carry function-like arity metadata. */
42
72
  const FUNCTION_DECL_TAGS = ['@declaration.method', '@declaration.function'];
43
73
  /** tree-sitter-php node types that the method extractor accepts. */
@@ -220,6 +250,15 @@ export function emitPhpScopeCaptures(sourceText, _filePath, cachedTree) {
220
250
  // the backing `arguments` node. Mirrors C#'s pattern (csharp/captures.ts
221
251
  // lines 149-186). PHP needs this for arity-based dispatch (Cluster H).
222
252
  const callTag = ['@reference.call.free', '@reference.call.member', '@reference.call.constructor'].find((t) => grouped[t] !== undefined);
253
+ if (callTag !== undefined) {
254
+ const possibleFirstClass = nodeIfType(nodeMap[callTag], 'function_call_expression');
255
+ const argumentsNode = possibleFirstClass?.childForFieldName('arguments');
256
+ if (argumentsNode?.namedChildren.some((child) => child !== null && child.type === 'variadic_placeholder') === true) {
257
+ // PHP 8.1 `target(...)` creates a Closure; it does not invoke target.
258
+ // Callable-flow synthesis below owns this site as a seed.
259
+ continue;
260
+ }
261
+ }
223
262
  if (callTag !== undefined && grouped['@reference.arity'] === undefined) {
224
263
  const callNode = nodeIfType(nodeMap[callTag], 'function_call_expression', 'member_call_expression', 'nullsafe_member_call_expression', 'scoped_call_expression', 'object_creation_expression');
225
264
  if (callNode !== null) {
@@ -242,6 +281,7 @@ export function emitPhpScopeCaptures(sourceText, _filePath, cachedTree) {
242
281
  out.push(grouped);
243
282
  }
244
283
  out.push(...synthesizePhpInheritanceReferences(tree.rootNode));
284
+ out.push(...synthesizeCallableFlowCaptures(tree.rootNode, PHP_CALLABLE_CAPTURE_OPTIONS));
245
285
  return out;
246
286
  }
247
287
  // ─── PHP inheritance synthesis ───────────────────────────────────────────────