gitnexus 1.6.11-rc.8 → 1.6.11

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 (531) hide show
  1. package/README.md +95 -26
  2. package/dist/_shared/graph/types.d.ts +81 -2
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/integrations/circuit-breaker.d.ts.map +1 -1
  5. package/dist/_shared/integrations/circuit-breaker.js.map +1 -1
  6. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  7. package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
  8. package/dist/_shared/language-detection.d.ts.map +1 -1
  9. package/dist/_shared/language-detection.js +2 -0
  10. package/dist/_shared/language-detection.js.map +1 -1
  11. package/dist/_shared/languages.d.ts +2 -1
  12. package/dist/_shared/languages.d.ts.map +1 -1
  13. package/dist/_shared/languages.js +1 -0
  14. package/dist/_shared/languages.js.map +1 -1
  15. package/dist/_shared/lbug/schema-constants.d.ts +2 -2
  16. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  17. package/dist/_shared/lbug/schema-constants.js +4 -0
  18. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  19. package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
  20. package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -0
  21. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  22. package/dist/_shared/scope-resolution/language-classification.d.ts +3 -0
  23. package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
  24. package/dist/_shared/scope-resolution/language-classification.js +4 -0
  25. package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
  26. package/dist/_shared/scope-resolution/reference-site.d.ts +10 -0
  27. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  28. package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
  29. package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
  30. package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
  31. package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
  32. package/dist/_shared/scope-resolution/types.d.ts +15 -0
  33. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  34. package/dist/cli/ai-context.d.ts +4 -0
  35. package/dist/cli/ai-context.js +90 -14
  36. package/dist/cli/analyze-config.js +14 -0
  37. package/dist/cli/analyze-options.d.ts +14 -0
  38. package/dist/cli/analyze-watch.d.ts +20 -0
  39. package/dist/cli/analyze-watch.js +434 -0
  40. package/dist/cli/analyze.js +27 -9
  41. package/dist/cli/auto-sync.d.ts +1 -0
  42. package/dist/cli/auto-sync.js +107 -0
  43. package/dist/cli/command-banner.d.ts +15 -0
  44. package/dist/cli/command-banner.js +42 -0
  45. package/dist/cli/detect-changes-format.js +21 -0
  46. package/dist/cli/doctor.d.ts +7 -0
  47. package/dist/cli/doctor.js +14 -0
  48. package/dist/cli/group.js +7 -1
  49. package/dist/cli/help-i18n.js +4 -0
  50. package/dist/cli/i18n/en.d.ts +18 -3
  51. package/dist/cli/i18n/en.js +18 -3
  52. package/dist/cli/i18n/resources.d.ts +33 -3
  53. package/dist/cli/i18n/zh-CN.d.ts +15 -0
  54. package/dist/cli/i18n/zh-CN.js +18 -3
  55. package/dist/cli/index.js +34 -7
  56. package/dist/cli/mcp.d.ts +15 -0
  57. package/dist/cli/mcp.js +44 -0
  58. package/dist/cli/optional-grammars.d.ts +3 -2
  59. package/dist/cli/optional-grammars.js +19 -3
  60. package/dist/cli/setup.js +41 -15
  61. package/dist/cli/update-notice.d.ts +34 -0
  62. package/dist/cli/update-notice.js +91 -0
  63. package/dist/cli/update.d.ts +21 -0
  64. package/dist/cli/update.js +93 -0
  65. package/dist/cli/watch.d.ts +1 -20
  66. package/dist/cli/watch.js +5 -371
  67. package/dist/core/analysis-feature-registry.d.ts +2 -0
  68. package/dist/core/analysis-feature-registry.js +15 -0
  69. package/dist/core/analyzer-identity.js +21 -3
  70. package/dist/core/auto-sync/analysis-worker-launch.d.ts +30 -0
  71. package/dist/core/auto-sync/analysis-worker-launch.js +166 -0
  72. package/dist/core/auto-sync/config.d.ts +33 -0
  73. package/dist/core/auto-sync/config.js +320 -0
  74. package/dist/core/auto-sync/index.d.ts +6 -0
  75. package/dist/core/auto-sync/index.js +6 -0
  76. package/dist/core/auto-sync/path-security.d.ts +9 -0
  77. package/dist/core/auto-sync/path-security.js +251 -0
  78. package/dist/core/auto-sync/repo.d.ts +1 -0
  79. package/dist/core/auto-sync/repo.js +6 -0
  80. package/dist/core/auto-sync/runner.d.ts +44 -0
  81. package/dist/core/auto-sync/runner.js +428 -0
  82. package/dist/core/auto-sync/starter.d.ts +50 -0
  83. package/dist/core/auto-sync/starter.js +497 -0
  84. package/dist/core/auto-sync/state.d.ts +37 -0
  85. package/dist/core/auto-sync/state.js +119 -0
  86. package/dist/core/group/config-parser.js +8 -1
  87. package/dist/core/group/cross-impact.d.ts +3 -0
  88. package/dist/core/group/cross-impact.js +36 -4
  89. package/dist/core/group/extractors/http-patterns/java.js +22 -8
  90. package/dist/core/group/extractors/http-patterns/kotlin.js +86 -31
  91. package/dist/core/group/extractors/http-patterns/node.js +145 -8
  92. package/dist/core/group/extractors/http-patterns/python.js +11 -7
  93. package/dist/core/group/extractors/http-route-extractor.js +63 -17
  94. package/dist/core/group/extractors/java-workspace-extractor.js +244 -31
  95. package/dist/core/group/group-lock.js +5 -6
  96. package/dist/core/group/normalization.d.ts +38 -1
  97. package/dist/core/group/normalization.js +59 -3
  98. package/dist/core/group/service.d.ts +11 -0
  99. package/dist/core/group/service.js +13 -1
  100. package/dist/core/group/storage.js +2 -2
  101. package/dist/core/group/sync.d.ts +24 -1
  102. package/dist/core/group/sync.js +46 -8
  103. package/dist/core/group/types.d.ts +13 -0
  104. package/dist/core/incremental/derived-writeback.d.ts +36 -0
  105. package/dist/core/incremental/derived-writeback.js +68 -0
  106. package/dist/core/incremental/spring-config-drift.d.ts +12 -0
  107. package/dist/core/incremental/spring-config-drift.js +46 -0
  108. package/dist/core/incremental/subgraph-extract.d.ts +7 -4
  109. package/dist/core/incremental/subgraph-extract.js +30 -5
  110. package/dist/core/ingestion/asyncapi/document.d.ts +226 -0
  111. package/dist/core/ingestion/asyncapi/document.js +758 -0
  112. package/dist/core/ingestion/asyncapi/protocol.d.ts +79 -0
  113. package/dist/core/ingestion/asyncapi/protocol.js +203 -0
  114. package/dist/core/ingestion/call-extractors/configs/zig.d.ts +2 -0
  115. package/dist/core/ingestion/call-extractors/configs/zig.js +4 -0
  116. package/dist/core/ingestion/call-extractors/zig-static-gating.d.ts +100 -0
  117. package/dist/core/ingestion/call-extractors/zig-static-gating.js +319 -0
  118. package/dist/core/ingestion/call-processor.js +3 -1
  119. package/dist/core/ingestion/class-extractors/configs/zig.d.ts +2 -0
  120. package/dist/core/ingestion/class-extractors/configs/zig.js +32 -0
  121. package/dist/core/ingestion/class-extractors/generic.js +4 -1
  122. package/dist/core/ingestion/class-types.d.ts +6 -2
  123. package/dist/core/ingestion/destination-key.d.ts +59 -0
  124. package/dist/core/ingestion/destination-key.js +61 -0
  125. package/dist/core/ingestion/entry-point-scoring.d.ts +6 -2
  126. package/dist/core/ingestion/entry-point-scoring.js +8 -44
  127. package/dist/core/ingestion/export-detection.d.ts +37 -0
  128. package/dist/core/ingestion/export-detection.js +60 -0
  129. package/dist/core/ingestion/field-extractors/configs/zig.d.ts +8 -0
  130. package/dist/core/ingestion/field-extractors/configs/zig.js +49 -0
  131. package/dist/core/ingestion/field-extractors/generic.d.ts +1 -1
  132. package/dist/core/ingestion/field-extractors/generic.js +12 -1
  133. package/dist/core/ingestion/frameworks/spring/actuator-runtime.d.ts +26 -0
  134. package/dist/core/ingestion/frameworks/spring/actuator-runtime.js +843 -0
  135. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +5 -0
  136. package/dist/core/ingestion/frameworks/spring/analysis-features.js +9 -0
  137. package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +8 -1
  138. package/dist/core/ingestion/frameworks/spring/argument-facts.d.ts +80 -0
  139. package/dist/core/ingestion/frameworks/spring/argument-facts.js +85 -0
  140. package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +1 -0
  141. package/dist/core/ingestion/frameworks/spring/config-bindings.js +2 -1
  142. package/dist/core/ingestion/frameworks/spring/destinations.d.ts +539 -0
  143. package/dist/core/ingestion/frameworks/spring/destinations.js +840 -0
  144. package/dist/core/ingestion/frameworks/spring/dynamic-lookups.d.ts +22 -0
  145. package/dist/core/ingestion/frameworks/spring/dynamic-lookups.js +124 -0
  146. package/dist/core/ingestion/frameworks/spring/message-producers.d.ts +78 -0
  147. package/dist/core/ingestion/frameworks/spring/message-producers.js +90 -0
  148. package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +29 -0
  149. package/dist/core/ingestion/frameworks/spring/vendor-prefixes.d.ts +7 -0
  150. package/dist/core/ingestion/frameworks/spring/vendor-prefixes.js +22 -0
  151. package/dist/core/ingestion/import-resolvers/configs/zig.d.ts +13 -0
  152. package/dist/core/ingestion/import-resolvers/configs/zig.js +26 -0
  153. package/dist/core/ingestion/import-resolvers/zig.d.ts +34 -0
  154. package/dist/core/ingestion/import-resolvers/zig.js +193 -0
  155. package/dist/core/ingestion/language-config.d.ts +177 -0
  156. package/dist/core/ingestion/language-config.js +719 -0
  157. package/dist/core/ingestion/language-provider.d.ts +178 -1
  158. package/dist/core/ingestion/language-provider.js +22 -0
  159. package/dist/core/ingestion/languages/csharp/razor-view-components.d.ts +62 -0
  160. package/dist/core/ingestion/languages/csharp/razor-view-components.js +954 -0
  161. package/dist/core/ingestion/languages/csharp/resolution-config.d.ts +3 -0
  162. package/dist/core/ingestion/languages/csharp/resolution-config.js +6 -1
  163. package/dist/core/ingestion/languages/csharp/scope-resolver.js +8 -0
  164. package/dist/core/ingestion/languages/index.d.ts +1 -0
  165. package/dist/core/ingestion/languages/index.js +2 -0
  166. package/dist/core/ingestion/languages/java/analysis-features.d.ts +1 -1
  167. package/dist/core/ingestion/languages/java/analysis-features.js +14 -6
  168. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +8 -0
  169. package/dist/core/ingestion/languages/java/capture-side-channel.js +34 -0
  170. package/dist/core/ingestion/languages/java/captures.js +22 -1
  171. package/dist/core/ingestion/languages/java/lombok-synthesizer.d.ts +42 -0
  172. package/dist/core/ingestion/languages/java/lombok-synthesizer.js +439 -0
  173. package/dist/core/ingestion/languages/java/scope-resolver.js +2 -0
  174. package/dist/core/ingestion/languages/java/spring-actuator.d.ts +2 -0
  175. package/dist/core/ingestion/languages/java/spring-actuator.js +62 -0
  176. package/dist/core/ingestion/languages/java/spring-di.d.ts +17 -1
  177. package/dist/core/ingestion/languages/java/spring-di.js +44 -2
  178. package/dist/core/ingestion/languages/java/spring-dynamic-lookup.d.ts +8 -0
  179. package/dist/core/ingestion/languages/java/spring-dynamic-lookup.js +62 -0
  180. package/dist/core/ingestion/languages/java/spring-message-producers.d.ts +20 -0
  181. package/dist/core/ingestion/languages/java/spring-message-producers.js +83 -0
  182. package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +11 -1
  183. package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +13 -3
  184. package/dist/core/ingestion/languages/java.js +18 -8
  185. package/dist/core/ingestion/languages/jvm/accessor-synthesis.d.ts +99 -0
  186. package/dist/core/ingestion/languages/jvm/accessor-synthesis.js +173 -0
  187. package/dist/core/ingestion/languages/jvm/beanspec.d.ts +17 -0
  188. package/dist/core/ingestion/languages/jvm/beanspec.js +42 -0
  189. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
  190. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +50 -0
  191. package/dist/core/ingestion/languages/kotlin/captures.js +24 -1
  192. package/dist/core/ingestion/languages/kotlin/lombok-synthesizer.d.ts +26 -0
  193. package/dist/core/ingestion/languages/kotlin/lombok-synthesizer.js +417 -0
  194. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +4 -0
  195. package/dist/core/ingestion/languages/kotlin/spring-actuator.d.ts +4 -0
  196. package/dist/core/ingestion/languages/kotlin/spring-actuator.js +172 -0
  197. package/dist/core/ingestion/languages/kotlin/spring-config-bindings.d.ts +18 -0
  198. package/dist/core/ingestion/languages/kotlin/spring-config-bindings.js +411 -0
  199. package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +51 -1
  200. package/dist/core/ingestion/languages/kotlin/spring-di.js +86 -6
  201. package/dist/core/ingestion/languages/kotlin/spring-dynamic-lookup.d.ts +8 -0
  202. package/dist/core/ingestion/languages/kotlin/spring-dynamic-lookup.js +77 -0
  203. package/dist/core/ingestion/languages/kotlin/spring-message-producers.d.ts +17 -0
  204. package/dist/core/ingestion/languages/kotlin/spring-message-producers.js +119 -0
  205. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +16 -0
  206. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +77 -2
  207. package/dist/core/ingestion/languages/kotlin.js +24 -0
  208. package/dist/core/ingestion/languages/python.js +2 -0
  209. package/dist/core/ingestion/languages/rust/query.js +8 -8
  210. package/dist/core/ingestion/languages/zig/captures.d.ts +260 -0
  211. package/dist/core/ingestion/languages/zig/captures.js +2070 -0
  212. package/dist/core/ingestion/languages/zig/index.d.ts +4 -0
  213. package/dist/core/ingestion/languages/zig/index.js +4 -0
  214. package/dist/core/ingestion/languages/zig/interpret.d.ts +36 -0
  215. package/dist/core/ingestion/languages/zig/interpret.js +176 -0
  216. package/dist/core/ingestion/languages/zig/query.d.ts +3 -0
  217. package/dist/core/ingestion/languages/zig/query.js +426 -0
  218. package/dist/core/ingestion/languages/zig/range-binding.d.ts +37 -0
  219. package/dist/core/ingestion/languages/zig/range-binding.js +373 -0
  220. package/dist/core/ingestion/languages/zig/scope-resolver.d.ts +12 -0
  221. package/dist/core/ingestion/languages/zig/scope-resolver.js +58 -0
  222. package/dist/core/ingestion/languages/zig/simple-hooks.d.ts +25 -0
  223. package/dist/core/ingestion/languages/zig/simple-hooks.js +143 -0
  224. package/dist/core/ingestion/languages/zig.d.ts +32 -0
  225. package/dist/core/ingestion/languages/zig.js +130 -0
  226. package/dist/core/ingestion/method-extractors/configs/zig.d.ts +2 -0
  227. package/dist/core/ingestion/method-extractors/configs/zig.js +120 -0
  228. package/dist/core/ingestion/method-extractors/generic.js +16 -4
  229. package/dist/core/ingestion/method-types.d.ts +10 -4
  230. package/dist/core/ingestion/model/field-registry.d.ts +3 -3
  231. package/dist/core/ingestion/model/field-registry.js +11 -7
  232. package/dist/core/ingestion/model/method-registry.d.ts +3 -3
  233. package/dist/core/ingestion/model/method-registry.js +13 -8
  234. package/dist/core/ingestion/model/registration-table.js +3 -0
  235. package/dist/core/ingestion/model/type-registry.js +8 -4
  236. package/dist/core/ingestion/pipeline-phases/di.js +47 -14
  237. package/dist/core/ingestion/pipeline-phases/index.d.ts +1 -0
  238. package/dist/core/ingestion/pipeline-phases/index.js +1 -0
  239. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +7 -1
  240. package/dist/core/ingestion/pipeline-phases/parse-impl.js +79 -91
  241. package/dist/core/ingestion/pipeline-phases/parse.d.ts +17 -0
  242. package/dist/core/ingestion/pipeline-phases/processes.d.ts +2 -1
  243. package/dist/core/ingestion/pipeline-phases/processes.js +39 -4
  244. package/dist/core/ingestion/pipeline-phases/routes.js +27 -18
  245. package/dist/core/ingestion/pipeline-phases/runner.d.ts +4 -1
  246. package/dist/core/ingestion/pipeline-phases/runner.js +34 -14
  247. package/dist/core/ingestion/pipeline-phases/scan.js +82 -1
  248. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +2 -0
  249. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +8 -0
  250. package/dist/core/ingestion/pipeline-phases/spring-destinations.d.ts +123 -0
  251. package/dist/core/ingestion/pipeline-phases/spring-destinations.js +688 -0
  252. package/dist/core/ingestion/pipeline.d.ts +30 -1
  253. package/dist/core/ingestion/pipeline.js +52 -14
  254. package/dist/core/ingestion/resolve-references.js +5 -0
  255. package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +16 -0
  256. package/dist/core/ingestion/route-extractors/constant-resolver.js +10 -0
  257. package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +27 -1
  258. package/dist/core/ingestion/route-extractors/java-const-resolver.js +161 -13
  259. package/dist/core/ingestion/route-extractors/kotlin-const-resolver.d.ts +12 -18
  260. package/dist/core/ingestion/route-extractors/kotlin-const-resolver.js +214 -33
  261. package/dist/core/ingestion/route-extractors/kotlin-spring.d.ts +13 -0
  262. package/dist/core/ingestion/route-extractors/kotlin-spring.js +259 -0
  263. package/dist/core/ingestion/route-extractors/python-decorator-handler.d.ts +6 -0
  264. package/dist/core/ingestion/route-extractors/python-decorator-handler.js +16 -0
  265. package/dist/core/ingestion/route-extractors/spring-shared.d.ts +30 -1
  266. package/dist/core/ingestion/route-extractors/spring-shared.js +77 -9
  267. package/dist/core/ingestion/route-extractors/spring.js +9 -5
  268. package/dist/core/ingestion/scope-extractor.js +8 -0
  269. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +62 -0
  270. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +4 -0
  271. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +2 -0
  272. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +28 -0
  273. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +11 -2
  274. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +23 -2
  275. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +24 -3
  276. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +11 -1
  277. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +26 -6
  278. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +11 -0
  279. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +29 -3
  280. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +8 -1
  281. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +35 -9
  282. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +1 -4
  283. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +277 -9
  284. package/dist/core/ingestion/scope-resolution/pipeline/registry.js +2 -0
  285. package/dist/core/ingestion/scope-resolution/pipeline/run.js +7 -3
  286. package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +43 -9
  287. package/dist/core/ingestion/scope-resolution/scope/walkers.js +71 -10
  288. package/dist/core/ingestion/tree-sitter-queries.d.ts +1 -0
  289. package/dist/core/ingestion/tree-sitter-queries.js +161 -0
  290. package/dist/core/ingestion/type-extractors/zig.d.ts +2 -0
  291. package/dist/core/ingestion/type-extractors/zig.js +17 -0
  292. package/dist/core/ingestion/utils/ast-helpers.d.ts +40 -1
  293. package/dist/core/ingestion/utils/ast-helpers.js +124 -6
  294. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +9 -0
  295. package/dist/core/ingestion/utils/callable-flow-captures.js +75 -14
  296. package/dist/core/ingestion/utils/test-file-path.d.ts +28 -0
  297. package/dist/core/ingestion/utils/test-file-path.js +87 -0
  298. package/dist/core/ingestion/variable-extractors/configs/zig.d.ts +2 -0
  299. package/dist/core/ingestion/variable-extractors/configs/zig.js +71 -0
  300. package/dist/core/ingestion/workers/parse-worker.js +85 -14
  301. package/dist/core/install-context.d.ts +4 -0
  302. package/dist/core/install-context.js +152 -0
  303. package/dist/core/lbug/csv-generator.d.ts +10 -1
  304. package/dist/core/lbug/csv-generator.js +92 -22
  305. package/dist/core/lbug/graph-emit-sink.d.ts +3 -2
  306. package/dist/core/lbug/graph-emit-sink.js +4 -2
  307. package/dist/core/lbug/lbug-adapter.d.ts +100 -5
  308. package/dist/core/lbug/lbug-adapter.js +236 -24
  309. package/dist/core/lbug/schema.d.ts +6 -5
  310. package/dist/core/lbug/schema.js +84 -22
  311. package/dist/core/net/url-guard.d.ts +6 -0
  312. package/dist/core/net/url-guard.js +147 -0
  313. package/dist/core/package-version.d.ts +5 -0
  314. package/dist/core/package-version.js +10 -0
  315. package/dist/core/run-analyze.d.ts +21 -4
  316. package/dist/core/run-analyze.js +426 -117
  317. package/dist/core/search/fts-indexes.d.ts +19 -1
  318. package/dist/core/search/fts-indexes.js +28 -1
  319. package/dist/core/tree-sitter/parser-loader.js +16 -0
  320. package/dist/core/update-cache.d.ts +39 -0
  321. package/dist/core/update-cache.js +141 -0
  322. package/dist/core/update-check.d.ts +31 -0
  323. package/dist/core/update-check.js +274 -0
  324. package/dist/mcp/local/local-backend.d.ts +27 -13
  325. package/dist/mcp/local/local-backend.js +148 -60
  326. package/dist/mcp/repository-policy.d.ts +5 -1
  327. package/dist/mcp/repository-policy.js +48 -4
  328. package/dist/mcp/resources.js +10 -1
  329. package/dist/mcp/server.js +8 -9
  330. package/dist/mcp/tools.js +32 -22
  331. package/dist/server/analyze-launch.d.ts +2 -0
  332. package/dist/server/analyze-launch.js +2 -0
  333. package/dist/server/analyze-worker-protocol.d.ts +6 -1
  334. package/dist/server/analyze-worker.d.ts +1 -0
  335. package/dist/server/analyze-worker.js +38 -20
  336. package/dist/server/api.d.ts +5 -1
  337. package/dist/server/api.js +105 -88
  338. package/dist/server/git-clone.d.ts +40 -16
  339. package/dist/server/git-clone.js +253 -199
  340. package/dist/server/grep-params.d.ts +18 -0
  341. package/dist/server/grep-params.js +83 -0
  342. package/dist/server/grep-scan.d.ts +23 -0
  343. package/dist/server/grep-scan.js +107 -0
  344. package/dist/server/grep-worker.d.ts +1 -0
  345. package/dist/server/grep-worker.js +12 -0
  346. package/dist/server/mcp-http.d.ts +8 -0
  347. package/dist/server/mcp-http.js +16 -1
  348. package/dist/server/update-controller.d.ts +29 -0
  349. package/dist/server/update-controller.js +82 -0
  350. package/dist/storage/file-lock.d.ts +15 -0
  351. package/dist/storage/file-lock.js +155 -0
  352. package/dist/storage/fs-atomic.d.ts +24 -0
  353. package/dist/storage/fs-atomic.js +86 -2
  354. package/dist/storage/global-dir.d.ts +2 -0
  355. package/dist/storage/global-dir.js +6 -0
  356. package/dist/storage/parse-cache.d.ts +45 -7
  357. package/dist/storage/parse-cache.js +189 -42
  358. package/dist/storage/parsedfile-store.d.ts +41 -60
  359. package/dist/storage/parsedfile-store.js +247 -171
  360. package/dist/storage/repo-manager.d.ts +10 -4
  361. package/dist/storage/repo-manager.js +35 -25
  362. package/dist/storage/repo-meta.d.ts +34 -0
  363. package/dist/storage/v8-sidecar.d.ts +48 -0
  364. package/dist/storage/v8-sidecar.js +347 -0
  365. package/dist/types/pipeline.d.ts +14 -0
  366. package/dist/utils/process-identity.d.ts +2 -0
  367. package/dist/utils/process-identity.js +35 -0
  368. package/package.json +10 -4
  369. package/scripts/assert-web-assets.mjs +35 -0
  370. package/scripts/build-web.js +72 -0
  371. package/scripts/build.js +31 -28
  372. package/scripts/cross-platform-tests.ts +5 -0
  373. package/skills/gitnexus-cli.md +5 -1
  374. package/web/assets/ProcessFlowModal-DAeX2BHW.js +24 -0
  375. package/web/assets/{abnfDiagram-QNN2D4NM-Cq2djWWe.js → abnfDiagram-PAR5IXJI-J3OdeHLl.js} +1 -1
  376. package/web/assets/{agent-BWAXPjC5.js → agent-BMRqXorA.js} +6 -4
  377. package/web/assets/architecture-7GRP2DOG-M7G3SWCO-G3sWyX6M.js +1 -0
  378. package/web/assets/architectureDiagram-2PNWDENW-ysKcRlGT.js +36 -0
  379. package/web/assets/blockDiagram-PUWGUBOA-oLXTa1lY.js +129 -0
  380. package/web/assets/c4Diagram-3NLNHZP5-D3iu4eC0.js +38 -0
  381. package/web/assets/{chunk-2SREHG4O-Dip42xOq.js → chunk-2NMSUPJH-B24w-wng.js} +1 -1
  382. package/web/assets/{chunk-VJFVEZTB-CX66F2ep.js → chunk-32MCUW2P-ByUyt0Sa.js} +3 -3
  383. package/web/assets/{chunk-4RFN2BYJ-DHHWuC-n.js → chunk-3NPNU5GP-DocZ07Sg.js} +1 -1
  384. package/web/assets/{chunk-XNMVGMAZ-Cg_LnPtj.js → chunk-3SMGFRGC-CAu4JRLv.js} +1 -1
  385. package/web/assets/{chunk-W44A43WB-BN8EQc_u.js → chunk-4CAJECRU-DRYMwG9z.js} +1 -1
  386. package/web/assets/chunk-4OADUZ5Q-CxrSvOwZ.js +10 -0
  387. package/web/assets/{chunk-DMV4VAQV-Bn6WXDSX.js → chunk-5IQCK5RY-CCMhl4so.js} +2 -2
  388. package/web/assets/{chunk-RRFMTAIC-CMN0wcYA.js → chunk-5MVFYWFU-Db9KvrYO.js} +1 -1
  389. package/web/assets/chunk-CLS4B6BI-Uvx5QNsu.js +168 -0
  390. package/web/assets/chunk-DZP67EKU-B3Mt380j.js +70 -0
  391. package/web/assets/{chunk-6L755F7B-CMhLBxi2.js → chunk-EICP7K5X-CqwE9hui.js} +1 -1
  392. package/web/assets/{chunk-BI6VK774-D0oaWk8V.js → chunk-GDY2UAB4-CtQQR0a8.js} +1 -1
  393. package/web/assets/chunk-H7VHZCWX-CE1nAmt6.js +1 -0
  394. package/web/assets/chunk-IJBDOHL6-BUKtY6oF.js +1 -0
  395. package/web/assets/{chunk-OIYT25JQ-CQ6KOZGX.js → chunk-JFFVMJIA-0fJenqia.js} +1 -1
  396. package/web/assets/{chunk-HNC4WDU7-DoU3KnA7.js → chunk-JZGDI5JK-BeTMSSkJ.js} +1 -1
  397. package/web/assets/{chunk-EQFTRU2I-1ix7TzW9.js → chunk-KD6SPIPN-Qp1Pflah.js} +1 -1
  398. package/web/assets/chunk-NF366YI6-CpSpya3n.js +231 -0
  399. package/web/assets/chunk-NUDPKBEF-CU1-BQIW.js +34 -0
  400. package/web/assets/{chunk-SATU7PGQ-B1zhgOvc.js → chunk-OJINMHTS-zOCQe4eI.js} +1 -1
  401. package/web/assets/{chunk-E5QJAATJ-dh-5CtIV.js → chunk-Q6NGPIAH-yyBomb63.js} +1 -1
  402. package/web/assets/chunk-QJSWEUOL-D_rf9gPD.js +128 -0
  403. package/web/assets/chunk-R7JDMUKV-CRoqKpD6.js +1 -0
  404. package/web/assets/{chunk-VE5CLXGZ-C1vB7wpY.js → chunk-RCXAM2GK-CUqrWQDV.js} +1 -1
  405. package/web/assets/{chunk-66DQ2XMT-CM0xjFAN.js → chunk-RT4MAWR3-zXy9-Lvt.js} +1 -1
  406. package/web/assets/{chunk-TZUXEDM2-B7p9AcTw.js → chunk-SFMINX4W-J2UrvMpD.js} +1 -1
  407. package/web/assets/{chunk-LORZLZWG-B57uGw2N.js → chunk-SLDQ463B-CHY6e_bQ.js} +2 -2
  408. package/web/assets/{chunk-FWYVLQTC-BgDItRzJ.js → chunk-TCEHX7R3-CXPDEVbm.js} +1 -1
  409. package/web/assets/{chunk-224SPVON-B8gxtXpy.js → chunk-VQC2EELJ-Dc8fIy4R.js} +1 -1
  410. package/web/assets/chunk-VRZKL3EH-DB3KixTQ.js +1 -0
  411. package/web/assets/{chunk-A7VWPJGB-B4O3oQdQ.js → chunk-VTHDQ7BV-b7FsPQZO.js} +1 -1
  412. package/web/assets/chunk-VY2OSTJR-Dkgc3Brg.js +2 -0
  413. package/web/assets/chunk-WUBWJARI-7FwILJ3k.js +2 -0
  414. package/web/assets/{chunk-D6VWDJW2-BxcBdZ9c.js → chunk-YBMQ5JGJ-BSnyWZmd.js} +1 -1
  415. package/web/assets/chunk-YDMLL4PJ-IHhMngTz.js +2 -0
  416. package/web/assets/chunk-Z6V44ARX-BjCEsF0Q.js +62 -0
  417. package/web/assets/chunk-ZJJ7VQJP-Dz089b-K.js +321 -0
  418. package/web/assets/chunk-ZNLK7HRR-B0iFpmW4.js +1 -0
  419. package/web/assets/chunk-ZQN7UHIL-Cy7KAjQt.js +1 -0
  420. package/web/assets/{chunk-L5GCOVLC-CE2w8Nm_.js → chunk-ZS6VBONO-DBjJO0w9.js} +2 -2
  421. package/web/assets/{chunk-NV3KIAZN-5yvcpMiu.js → chunk-ZUNWM646-DNRJyNPe.js} +1 -1
  422. package/web/assets/classDiagram-FGAMPOII-C5Ibyode.js +1 -0
  423. package/web/assets/classDiagram-v2-AI5RJEK4-C5Ibyode.js +1 -0
  424. package/web/assets/{cose-bilkent-RZA4XIPR-BHpK4Crp.js → cose-bilkent-Q72C2OJ3-DMeFXnK8.js} +1 -1
  425. package/web/assets/cynefin-OW5HDTMX-6OCTWOGG-vlqakYcO.js +1 -0
  426. package/web/assets/{cynefinDiagram-TR7LZUCG-C3Iar9lZ.js → cynefinDiagram-2OOWUY4M-BY6DZkTt.js} +1 -1
  427. package/web/assets/dagre-MPVFI544-DWO70fy_.js +4 -0
  428. package/web/assets/diagram-AE4NWXFW-f7JRVRUL.js +24 -0
  429. package/web/assets/{diagram-L7DVE3PN-GIRyVUtt.js → diagram-BUJID5UG-BXZv1rCS.js} +2 -2
  430. package/web/assets/{diagram-JCD7PQ7C-DC5-9FRr.js → diagram-C44CZ5NI-CRNfvjCq.js} +1 -1
  431. package/web/assets/diagram-EYOLEXXS-DZOjKQVE.js +30 -0
  432. package/web/assets/diagram-P7B6PWOJ-D3SQmw3_.js +3 -0
  433. package/web/assets/{ebnfDiagram-DRHRQJWO-D8_CI4ZF.js → ebnfDiagram-FTPZ3PV6-jKWpIDN2.js} +1 -1
  434. package/web/assets/erDiagram-H3ERR26V-BqJntEuJ.js +99 -0
  435. package/web/assets/eventmodeling-NTZA5JFV-WKSWQHFS-Bq4FqtBL.js +1 -0
  436. package/web/assets/flowDiagram-YHGXBVSY-Dnlk2bEu.js +1 -0
  437. package/web/assets/ganttDiagram-RWFTB7ED-Bl6Y1K5T.js +292 -0
  438. package/web/assets/gitGraph-4MIJSDKK-JH2HKYUO-B3yc4GkH.js +1 -0
  439. package/web/assets/gitGraphDiagram-MAR6GKOP-CkNvsrdw.js +106 -0
  440. package/web/assets/{index-CJDpyH-n.css → index-C2_aej58.css} +1 -1
  441. package/web/assets/{index-DDRie6_8.js → index-Dj3vQOHK.js} +51 -51
  442. package/web/assets/info-A6RAGUB7-3TX3OFWW-BM3N5_Dv.js +1 -0
  443. package/web/assets/infoDiagram-LV547AFH-COkFutAf.js +2 -0
  444. package/web/assets/{ishikawaDiagram-4JDSWWDM-DmqWtjkl.js → ishikawaDiagram-PUJQGNDS-Bb8FylSR.js} +2 -2
  445. package/web/assets/{journeyDiagram-QUS3FAKT-XAzVzrQW.js → journeyDiagram-EW5QJT4W-BzoHUBhM.js} +4 -4
  446. package/web/assets/{kanban-definition-D4L7SQKK-YurRnmYn.js → kanban-definition-JSQERAZB-Uy2Pi0yQ.js} +4 -4
  447. package/web/assets/katex-CZ4GXH2S-C0Fcou7U.js +257 -0
  448. package/web/assets/{mindmap-definition-66QP5TD6-ChrWWnil.js → mindmap-definition-VBJCLQLM-B-CnOnt_.js} +3 -3
  449. package/web/assets/packet-AYTQ26CC-MKII6P3Y-Bd52ZE3V.js +1 -0
  450. package/web/assets/{pegDiagram-YKIO5C6U-QGeQLEq2.js → pegDiagram-7WILOQTJ-D9sneKXg.js} +1 -1
  451. package/web/assets/pie-WAS4IAKB-6B4OPMJ5-DW5Xy69Z.js +1 -0
  452. package/web/assets/pieDiagram-EFA7CBSB-Dx2NQofL.js +39 -0
  453. package/web/assets/{quadrantDiagram-VO5QLCXA-B7098wSc.js → quadrantDiagram-WARVYA7P-DPKL9_0A.js} +3 -3
  454. package/web/assets/radar-RG4KPBEZ-UPTR3XUL-CkzibT2h.js +1 -0
  455. package/web/assets/railroad-74A4TZTK-MEFUPFMS-D9zF-mDN.js +1 -0
  456. package/web/assets/railroad-abnf-HS5TGJTU-R5YG2S5D-ruacjUbX.js +1 -0
  457. package/web/assets/railroad-ebnf-LZEXJU2U-G5QEX2L6-S1zc5OiO.js +1 -0
  458. package/web/assets/railroad-peg-WCYAUIDC-H5I2ZRY2-Cbcr0XzY.js +1 -0
  459. package/web/assets/{railroadDiagram-M77LTMSB-AXu4vxk_.js → railroadDiagram-5NIQVNLQ-DsweTo14.js} +1 -1
  460. package/web/assets/{requirementDiagram-RASO5HTO-B-l8InpK.js → requirementDiagram-SXREGOKZ-CXwdNSVR.js} +4 -4
  461. package/web/assets/{sankeyDiagram-F32LOJ6L-Kd7zjJgX.js → sankeyDiagram-VV74M2VP-CA6jtP9P.js} +3 -3
  462. package/web/assets/{sequenceDiagram-URATNSBD-BlcdY9DS.js → sequenceDiagram-52ZFIFDL-k_5rEbzm.js} +15 -15
  463. package/web/assets/src-Df5C1Nz4.js +1 -0
  464. package/web/assets/stateDiagram-3QAKPIVI-BejHTf31.js +1 -0
  465. package/web/assets/stateDiagram-v2-HN2P4RDZ-BrfoRuOc.js +1 -0
  466. package/web/assets/swimlanes-QLVP42QD-CQSVO5D6.js +1 -0
  467. package/web/assets/swimlanesDiagram-JKPDBFCN-DrWB9kcD.js +8 -0
  468. package/web/assets/{timeline-definition-WJXWRH4I-DUfp1R3E.js → timeline-definition-GS45XAXW-C0Ks8rPP.js} +4 -4
  469. package/web/assets/treeView-Q6P3EWNA-ZRJGANNQ-DmKOCo6L.js +1 -0
  470. package/web/assets/treemap-WGGIJYW6-K64VN5AS-DO3xY92U.js +1 -0
  471. package/web/assets/{vennDiagram-K3VCMQLI-Bj-FN-XS.js → vennDiagram-QIQU2ZRJ-rgPiS837.js} +3 -3
  472. package/web/assets/wardley-WFR3VGLG-D67OWCCH-DiDPBNft.js +1 -0
  473. package/web/assets/wardleyDiagram-U6YNM66N-DRVr7SPi.js +78 -0
  474. package/web/assets/{xychartDiagram-5VRUVLCW-CK_rbSWE.js → xychartDiagram-XJAZEDNM-COtlZzYb.js} +3 -3
  475. package/web/index.html +19 -17
  476. package/web/assets/ProcessFlowModal-Badh2Pbg.js +0 -24
  477. package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +0 -1
  478. package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +0 -36
  479. package/web/assets/blockDiagram-54WLDVWM-Dg_hrRWE.js +0 -132
  480. package/web/assets/c4Diagram-X2LASM7V-CnhoT4aV.js +0 -10
  481. package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +0 -127
  482. package/web/assets/chunk-5VCL7Z4A-CQ-2dYWj.js +0 -1
  483. package/web/assets/chunk-6BELYETK-ChsYtfHW.js +0 -1
  484. package/web/assets/chunk-7CWYLC5S-DRgGkkpF.js +0 -2
  485. package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +0 -32
  486. package/web/assets/chunk-KRXBNO2N-C-UNuKKf.js +0 -1
  487. package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +0 -321
  488. package/web/assets/chunk-LIEV3EAG-pyKGssV3.js +0 -1
  489. package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +0 -62
  490. package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +0 -10
  491. package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +0 -156
  492. package/web/assets/chunk-SZD42YQK-ijyKKVr1.js +0 -70
  493. package/web/assets/chunk-TFPGFQPA-Dj6a-0pC.js +0 -231
  494. package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +0 -2
  495. package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +0 -1
  496. package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +0 -1
  497. package/web/assets/chunk-WJBAP47W-BckNkuEN.js +0 -1
  498. package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +0 -1
  499. package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +0 -1
  500. package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +0 -1
  501. package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +0 -4
  502. package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +0 -30
  503. package/web/assets/diagram-KFBZAVDW-Dfmf_4ti.js +0 -3
  504. package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +0 -24
  505. package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +0 -85
  506. package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +0 -1
  507. package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +0 -1
  508. package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +0 -292
  509. package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +0 -1
  510. package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +0 -106
  511. package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +0 -1
  512. package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +0 -2
  513. package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +0 -257
  514. package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +0 -1
  515. package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +0 -1
  516. package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +0 -39
  517. package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +0 -1
  518. package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +0 -1
  519. package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +0 -1
  520. package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +0 -1
  521. package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +0 -1
  522. package/web/assets/src-C5sx_gMp.js +0 -1
  523. package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +0 -1
  524. package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +0 -1
  525. package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +0 -2
  526. package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +0 -8
  527. package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +0 -1
  528. package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +0 -1
  529. package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +0 -1
  530. package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +0 -78
  531. /package/web/assets/{sizeCapture-5GORAGP4-BEqQzsxs.js → sizeCapture-FGA5AGYP-BEqQzsxs.js} +0 -0
@@ -0,0 +1,439 @@
1
+ /**
2
+ * Lombok accessor synthesizer for Java.
3
+ *
4
+ * Lombok generates getters/setters at compile time. They are absent from the
5
+ * AST, so calls like `obj.getOrderId()` on a `@Data` class would otherwise
6
+ * leave unresolved CALLS edges. This module walks the tree-sitter Java AST
7
+ * and synthesizes Method graph members for the accessors Lombok would emit
8
+ * under the supported subset.
9
+ *
10
+ * ## Supported subset (v1)
11
+ * - Proven `lombok.Data` / `lombok.Getter` / `lombok.Setter` (FQN or import).
12
+ * - Class- or field-level enable; `AccessLevel.NONE` disables.
13
+ * - Default JavaBeans naming; primitive `boolean isX` → `isX` / `setX`.
14
+ * - Access levels PUBLIC/PROTECTED/PRIVATE/PACKAGE.
15
+ * - `@Accessors(chain=true)` modeled as setter return = declaring type.
16
+ * - `@Accessors(fluent=true)` / `prefix=…`: omit affected accessors (names
17
+ * cannot be proven without full Lombok config).
18
+ * - External `lombok.config`: unsupported (may change semantics invisibly).
19
+ *
20
+ * ## Identity
21
+ * Owner lookup uses in-memory AST node ids only. Method ids are derived from
22
+ * the stable declaring-owner graph key (the Class node id's name segment),
23
+ * never from persisted tree-sitter node ids.
24
+ */
25
+ import { jvmGetterName, jvmSetterName } from '../jvm/beanspec.js';
26
+ import { createExistingMethodIndex, createJvmAccessorSynthesis, hasExistingMethod, rememberExistingMethodRange, } from '../jvm/accessor-synthesis.js';
27
+ const JAVA_TYPE_DECLS = new Set([
28
+ 'class_declaration',
29
+ 'enum_declaration',
30
+ 'interface_declaration',
31
+ 'record_declaration',
32
+ ]);
33
+ const LOMBOK_ANNOTATION_PACKAGE = new Map([
34
+ ['Data', 'lombok'],
35
+ ['Getter', 'lombok'],
36
+ ['Setter', 'lombok'],
37
+ ['Accessors', 'lombok.experimental'],
38
+ ['Tolerate', 'lombok.experimental'],
39
+ ]);
40
+ export function getterName(fieldName, fieldType) {
41
+ return jvmGetterName(fieldName, fieldType === 'boolean');
42
+ }
43
+ export function setterName(fieldName, fieldType) {
44
+ return jvmSetterName(fieldName, fieldType === 'boolean');
45
+ }
46
+ // ── Provenance / imports ──────────────────────────────────────────────────
47
+ function annotationSimpleName(nameText) {
48
+ return nameText.split('.').pop() ?? nameText;
49
+ }
50
+ /**
51
+ * Compilation-unit imports only — Java `import` is never nested in a type body.
52
+ */
53
+ function collectLombokImports(root) {
54
+ const bySimple = new Map();
55
+ const starPackages = new Set();
56
+ const shadowedSimpleNames = new Set();
57
+ for (const child of root.children) {
58
+ if (!JAVA_TYPE_DECLS.has(child.type) && child.type !== 'annotation_type_declaration')
59
+ continue;
60
+ const name = child.childForFieldName('name')?.text;
61
+ if (name)
62
+ shadowedSimpleNames.add(name);
63
+ }
64
+ for (const child of root.children) {
65
+ if (child.type !== 'import_declaration')
66
+ continue;
67
+ if (/^import\s+static\b/.test(child.text))
68
+ continue;
69
+ const text = child.text
70
+ .replace(/^import\s+/, '')
71
+ .replace(/;\s*$/, '')
72
+ .replace(/\/\*[\s\S]*?\*\//g, '')
73
+ .replace(/\s+/g, '')
74
+ .trim();
75
+ if (text === 'lombok.*') {
76
+ starPackages.add('lombok');
77
+ }
78
+ else if (text === 'lombok.experimental.*') {
79
+ starPackages.add('lombok.experimental');
80
+ }
81
+ else if (!text.endsWith('.*')) {
82
+ bySimple.set(annotationSimpleName(text), text);
83
+ }
84
+ }
85
+ return { bySimple, starPackages, shadowedSimpleNames };
86
+ }
87
+ function isProvenLombokAnnotation(nameText, imports) {
88
+ const simple = annotationSimpleName(nameText);
89
+ const packageName = LOMBOK_ANNOTATION_PACKAGE.get(simple);
90
+ if (packageName === undefined)
91
+ return false;
92
+ if (nameText.includes('.'))
93
+ return nameText === `${packageName}.${simple}`;
94
+ const imported = imports.bySimple.get(simple);
95
+ if (imported !== undefined)
96
+ return imported === `${packageName}.${simple}`;
97
+ if (imports.shadowedSimpleNames.has(simple))
98
+ return false;
99
+ return imports.starPackages.has(packageName);
100
+ }
101
+ // ── AccessLevel / Accessors structural parse ──────────────────────────────
102
+ function parseAccessLevelToken(text) {
103
+ const simple = annotationSimpleName(text.trim());
104
+ switch (simple) {
105
+ case 'PUBLIC':
106
+ return 'public';
107
+ case 'PROTECTED':
108
+ return 'protected';
109
+ case 'PRIVATE':
110
+ return 'private';
111
+ case 'PACKAGE':
112
+ case 'MODULE': // treated as package-private for graph metadata
113
+ return 'package';
114
+ case 'NONE':
115
+ return 'none';
116
+ default:
117
+ return null;
118
+ }
119
+ }
120
+ function findAccessLevelInAnnotation(ann) {
121
+ // Positional: @Getter(AccessLevel.PROTECTED) or @Getter(lombok.AccessLevel.NONE)
122
+ // Named: @Getter(value = AccessLevel.PRIVATE)
123
+ const stack = [...ann.children];
124
+ while (stack.length > 0) {
125
+ const n = stack.pop();
126
+ if (!n)
127
+ break;
128
+ if (n.type === 'field_access' || n.type === 'identifier') {
129
+ const level = parseAccessLevelToken(n.text);
130
+ if (level !== null)
131
+ return level;
132
+ }
133
+ for (const c of n.children)
134
+ stack.push(c);
135
+ }
136
+ return null;
137
+ }
138
+ function defaultAccessors() {
139
+ return { fluent: false, hasPrefix: false, chain: false };
140
+ }
141
+ function parseAccessorsAnnotation(ann) {
142
+ const opts = defaultAccessors();
143
+ const stack = [...ann.children];
144
+ while (stack.length > 0) {
145
+ const n = stack.pop();
146
+ if (!n)
147
+ break;
148
+ if (n.type === 'element_value_pair') {
149
+ const key = n.childForFieldName('key')?.text ?? n.children.find((c) => c.type === 'identifier')?.text;
150
+ const valueNode = n.childForFieldName('value') ??
151
+ n.children.find((c) => c.type === 'true' || c.type === 'false' || c.type === 'element_value_array_initializer');
152
+ if (key === 'fluent' && (valueNode?.type === 'true' || valueNode?.type === 'false')) {
153
+ opts.fluent = valueNode.type === 'true';
154
+ }
155
+ if (key === 'chain' && (valueNode?.type === 'true' || valueNode?.type === 'false')) {
156
+ opts.chain = valueNode.type === 'true';
157
+ }
158
+ if (key === 'prefix')
159
+ opts.hasPrefix = true;
160
+ }
161
+ for (const c of n.children)
162
+ stack.push(c);
163
+ }
164
+ const text = ann.text;
165
+ if (/\bprefix\s*=/.test(text))
166
+ opts.hasPrefix = true;
167
+ if (/\bfluent\s*=\s*true\b/.test(text))
168
+ opts.fluent = true;
169
+ if (/\bfluent\s*=\s*false\b/.test(text))
170
+ opts.fluent = false;
171
+ if (/\bchain\s*=\s*true\b/.test(text))
172
+ opts.chain = true;
173
+ if (/\bchain\s*=\s*false\b/.test(text))
174
+ opts.chain = false;
175
+ return opts;
176
+ }
177
+ function parseModifierAnnotations(modifiersNode, imports) {
178
+ const result = {
179
+ getter: null,
180
+ setter: null,
181
+ accessors: defaultAccessors(),
182
+ accessorsPresent: false,
183
+ tolerate: false,
184
+ };
185
+ if (!modifiersNode)
186
+ return result;
187
+ for (const child of modifiersNode.children) {
188
+ if (child.type !== 'marker_annotation' && child.type !== 'annotation')
189
+ continue;
190
+ const nameNode = child.childForFieldName('name');
191
+ const nameText = nameNode?.text ?? '';
192
+ if (!isProvenLombokAnnotation(nameText, imports))
193
+ continue;
194
+ const simple = annotationSimpleName(nameText);
195
+ if (simple === 'Tolerate') {
196
+ result.tolerate = true;
197
+ continue;
198
+ }
199
+ if (simple === 'Accessors') {
200
+ result.accessors = parseAccessorsAnnotation(child);
201
+ result.accessorsPresent = true;
202
+ continue;
203
+ }
204
+ if (simple === 'Data') {
205
+ result.getter ??= { enabled: true, visibility: 'public' };
206
+ result.setter ??= { enabled: true, visibility: 'public' };
207
+ continue;
208
+ }
209
+ if (simple === 'Getter' || simple === 'Setter') {
210
+ const level = child.type === 'annotation' ? findAccessLevelInAnnotation(child) : null;
211
+ const cfg = level === 'none'
212
+ ? { enabled: false, visibility: 'public' }
213
+ : { enabled: true, visibility: level ?? 'public' };
214
+ if (simple === 'Getter')
215
+ result.getter = cfg;
216
+ else
217
+ result.setter = cfg;
218
+ }
219
+ }
220
+ return result;
221
+ }
222
+ function mergeAccessors(classOpts, fieldOpts, fieldAccessorsPresent) {
223
+ return fieldAccessorsPresent ? fieldOpts : classOpts;
224
+ }
225
+ function effectiveAccessor(classCfg, fieldCfg) {
226
+ if (fieldCfg !== null)
227
+ return fieldCfg;
228
+ return classCfg;
229
+ }
230
+ // ── Field / method collection ─────────────────────────────────────────────
231
+ function parseFieldDeclaration(fieldNode, imports) {
232
+ const typeNode = fieldNode.childForFieldName('type');
233
+ const fieldType = typeNode?.text ?? 'Object';
234
+ const modifiers = fieldNode.children.find((c) => c.type === 'modifiers') ?? null;
235
+ let isStatic = false;
236
+ let isFinal = false;
237
+ if (modifiers) {
238
+ for (const mod of modifiers.children) {
239
+ if (mod.text === 'static')
240
+ isStatic = true;
241
+ else if (mod.text === 'final')
242
+ isFinal = true;
243
+ }
244
+ }
245
+ const fieldAnn = parseModifierAnnotations(modifiers, imports);
246
+ const declarators = [];
247
+ const declaratorField = fieldNode.childForFieldName('declarator');
248
+ if (declaratorField)
249
+ declarators.push(declaratorField);
250
+ for (const child of fieldNode.children) {
251
+ if (child.type === 'variable_declarator' && child !== declaratorField) {
252
+ declarators.push(child);
253
+ }
254
+ }
255
+ const startLine = fieldNode.startPosition.row + 1;
256
+ const endLine = fieldNode.endPosition.row + 1;
257
+ const out = [];
258
+ for (const declaratorNode of declarators) {
259
+ const nameNode = declaratorNode.childForFieldName('name');
260
+ if (!nameNode)
261
+ continue;
262
+ out.push({
263
+ name: nameNode.text,
264
+ type: fieldType,
265
+ isStatic,
266
+ isFinal,
267
+ startLine,
268
+ endLine,
269
+ declaratorNode,
270
+ fieldGetter: fieldAnn.getter,
271
+ fieldSetter: fieldAnn.setter,
272
+ accessors: fieldAnn.accessors,
273
+ accessorsPresent: fieldAnn.accessorsPresent,
274
+ });
275
+ }
276
+ return out;
277
+ }
278
+ function methodArityRange(methodNode) {
279
+ const params = methodNode.childForFieldName('parameters');
280
+ if (!params)
281
+ return { min: 0, max: 0 };
282
+ let count = 0;
283
+ for (const child of params.namedChildren) {
284
+ if (child.type === 'spread_parameter')
285
+ return { min: count, max: Number.POSITIVE_INFINITY };
286
+ if (child.type === 'formal_parameter')
287
+ count += 1;
288
+ }
289
+ return { min: count, max: count };
290
+ }
291
+ function collectExistingMethods(classBody, imports) {
292
+ const index = createExistingMethodIndex('case-folded');
293
+ if (!classBody)
294
+ return index;
295
+ const scan = (container) => {
296
+ for (const child of container.children) {
297
+ if (child.type === 'enum_body_declarations') {
298
+ scan(child);
299
+ continue;
300
+ }
301
+ if (child.type !== 'method_declaration')
302
+ continue;
303
+ const mods = child.children.find((c) => c.type === 'modifiers') ?? null;
304
+ const ann = parseModifierAnnotations(mods, imports);
305
+ if (ann.tolerate)
306
+ continue;
307
+ const nameNode = child.childForFieldName('name');
308
+ if (!nameNode)
309
+ continue;
310
+ const arity = methodArityRange(child);
311
+ rememberExistingMethodRange(index, nameNode.text, arity.min, arity.max);
312
+ }
313
+ };
314
+ scan(classBody);
315
+ return index;
316
+ }
317
+ const TYPE_BODIES = new Set(['class_body', 'enum_body']);
318
+ function findTypeBody(node) {
319
+ return node.children.find((c) => TYPE_BODIES.has(c.type)) ?? null;
320
+ }
321
+ function findLombokClasses(root, imports) {
322
+ const classes = [];
323
+ function walk(node) {
324
+ if (node.type === 'class_declaration' || node.type === 'enum_declaration') {
325
+ const modifiers = node.children.find((c) => c.type === 'modifiers') ?? null;
326
+ const classAnn = parseModifierAnnotations(modifiers, imports);
327
+ const nameNode = node.childForFieldName('name');
328
+ const className = nameNode?.text ?? '';
329
+ if (className) {
330
+ const body = findTypeBody(node);
331
+ const fields = [];
332
+ if (body) {
333
+ const collectFields = (container) => {
334
+ for (const child of container.children) {
335
+ if (child.type === 'field_declaration') {
336
+ for (const f of parseFieldDeclaration(child, imports)) {
337
+ if (f.isStatic)
338
+ continue;
339
+ fields.push(f);
340
+ }
341
+ }
342
+ else if (child.type === 'enum_body_declarations') {
343
+ collectFields(child);
344
+ }
345
+ }
346
+ };
347
+ collectFields(body);
348
+ }
349
+ const anyFieldEnable = fields.some((f) => f.fieldGetter?.enabled === true || f.fieldSetter?.enabled === true);
350
+ const classEnable = classAnn.getter?.enabled === true || classAnn.setter?.enabled === true;
351
+ // Class-level NONE alone is not enable — getter/setter configs may be disabled
352
+ if (classEnable || anyFieldEnable) {
353
+ classes.push({
354
+ node,
355
+ name: className,
356
+ classGetter: classAnn.getter,
357
+ classSetter: classAnn.setter,
358
+ classAccessors: classAnn.accessors,
359
+ fields,
360
+ existingMethods: collectExistingMethods(body, imports),
361
+ });
362
+ }
363
+ }
364
+ }
365
+ for (const child of node.children)
366
+ walk(child);
367
+ }
368
+ walk(root);
369
+ return classes;
370
+ }
371
+ function planAccessors(cls) {
372
+ const planned = [];
373
+ for (const field of cls.fields) {
374
+ const accessors = mergeAccessors(cls.classAccessors, field.accessors, field.accessorsPresent);
375
+ // fluent/prefix change names — omit rather than invent wrong names
376
+ if (accessors.fluent || accessors.hasPrefix)
377
+ continue;
378
+ const getterCfg = effectiveAccessor(cls.classGetter, field.fieldGetter);
379
+ const setterCfg = effectiveAccessor(cls.classSetter, field.fieldSetter);
380
+ if (getterCfg?.enabled) {
381
+ const gName = getterName(field.name, field.type);
382
+ if (!hasExistingMethod(cls.existingMethods, gName, 0)) {
383
+ planned.push({
384
+ kind: 'getter',
385
+ name: gName,
386
+ returnType: field.type,
387
+ parameterTypes: [],
388
+ visibility: getterCfg.visibility,
389
+ isStatic: false,
390
+ isAbstract: false,
391
+ startLine: field.startLine,
392
+ endLine: field.endLine,
393
+ declaratorNode: field.declaratorNode,
394
+ });
395
+ }
396
+ }
397
+ if (setterCfg?.enabled && !field.isFinal) {
398
+ const sName = setterName(field.name, field.type);
399
+ if (!hasExistingMethod(cls.existingMethods, sName, 1)) {
400
+ // chain=true → setter returns declaring type; never emit void in that case
401
+ const returnType = accessors.chain ? cls.name : 'void';
402
+ planned.push({
403
+ kind: 'setter',
404
+ name: sName,
405
+ returnType,
406
+ parameterTypes: [field.type],
407
+ visibility: setterCfg.visibility,
408
+ isStatic: false,
409
+ isAbstract: false,
410
+ startLine: field.startLine,
411
+ endLine: field.endLine,
412
+ declaratorNode: field.declaratorNode,
413
+ });
414
+ }
415
+ }
416
+ }
417
+ return planned;
418
+ }
419
+ function planLombokAccessorOwners(root) {
420
+ const imports = collectLombokImports(root);
421
+ return findLombokClasses(root, imports).map((cls) => ({
422
+ node: cls.node,
423
+ name: cls.name,
424
+ accessors: planAccessors(cls),
425
+ }));
426
+ }
427
+ const lombokAccessorSynthesis = createJvmAccessorSynthesis({
428
+ language: 'java',
429
+ synthetic: 'lombok',
430
+ planOwners: planLombokAccessorOwners,
431
+ });
432
+ // ── Main API ──────────────────────────────────────────────────────────────
433
+ export function synthesizeLombokAccessors(tree, filePath, classOwnersById) {
434
+ return lombokAccessorSynthesis.synthesize(tree, filePath, classOwnersById);
435
+ }
436
+ /** Scope captures for Lombok accessors (dual-path parity with record components). */
437
+ export function synthesizeLombokAccessorCaptures(rootNode) {
438
+ return lombokAccessorSynthesis.captures(rootNode);
439
+ }
@@ -19,6 +19,7 @@ import { attachJavaSpringConfigBindings } from './spring-config-bindings.js';
19
19
  import { attachJavaSpringConditionalMetadata } from './spring-conditionals.js';
20
20
  import { attachJavaSpringDiMetadata } from './spring-di.js';
21
21
  import { attachJavaSpringNonHttpHandlerMetadata } from './spring-non-http-handlers.js';
22
+ import { attachJavaSpringDynamicLookup } from './spring-dynamic-lookup.js';
22
23
  import { applyJavaCaptureSideChannel, clearJavaClassAnnotationFacts, } from './capture-side-channel.js';
23
24
  import { clearJavaPackageFacts } from './package-facts.js';
24
25
  const javaScopeResolver = {
@@ -65,6 +66,7 @@ const javaScopeResolver = {
65
66
  attachJavaSpringDiMetadata(graph, parsedFiles, nodeLookup, indexes);
66
67
  attachJavaSpringNonHttpHandlerMetadata(graph, parsedFiles, nodeLookup, indexes);
67
68
  attachJavaSpringConfigBindings(graph, parsedFiles, nodeLookup, indexes, ctx);
69
+ attachJavaSpringDynamicLookup(graph, parsedFiles, nodeLookup, indexes);
68
70
  },
69
71
  };
70
72
  export { javaScopeResolver };
@@ -0,0 +1,2 @@
1
+ import type { RuntimeSymbolStrategy } from '../../language-provider.js';
2
+ export declare const javaRuntimeSymbolStrategy: RuntimeSymbolStrategy;
@@ -0,0 +1,62 @@
1
+ const JVM_PRIMITIVES = {
2
+ B: 'byte',
3
+ C: 'char',
4
+ D: 'double',
5
+ F: 'float',
6
+ I: 'int',
7
+ J: 'long',
8
+ S: 'short',
9
+ Z: 'boolean',
10
+ };
11
+ function normalizedType(value, runtime) {
12
+ let erased = value.trim();
13
+ let arrayDimensions = 0;
14
+ if (erased.endsWith('...')) {
15
+ arrayDimensions++;
16
+ erased = erased.slice(0, -3);
17
+ }
18
+ while (erased.endsWith('[]')) {
19
+ arrayDimensions++;
20
+ erased = erased.slice(0, -2);
21
+ }
22
+ erased = erased.replace(/<.*>$/, '').replaceAll('$', '.').replaceAll('/', '.');
23
+ const simple = erased.slice(erased.lastIndexOf('.') + 1);
24
+ const base = runtime ? (JVM_PRIMITIVES[simple] ?? simple) : simple;
25
+ return `${base}${'[]'.repeat(arrayDimensions)}`;
26
+ }
27
+ function sourceTypeIsUnknown(value) {
28
+ const type = normalizedType(value, false).replace(/(?:\[\])+$/, '');
29
+ return type === '?' || /^[A-Z]$/.test(type);
30
+ }
31
+ function matchesJavaCallable(node, runtime) {
32
+ if (node.label !== 'Method' || node.properties.name !== runtime.name)
33
+ return false;
34
+ const descriptorTypes = runtime.descriptorParameterTypes;
35
+ if (descriptorTypes === undefined)
36
+ return true;
37
+ const parameterCount = node.properties.parameterCount;
38
+ if (typeof parameterCount === 'number' && parameterCount !== descriptorTypes.length)
39
+ return false;
40
+ const sourceTypes = node.properties.parameterTypes;
41
+ if (!Array.isArray(sourceTypes) ||
42
+ sourceTypes.length !== descriptorTypes.length ||
43
+ !sourceTypes.every((type) => typeof type === 'string')) {
44
+ return true;
45
+ }
46
+ return sourceTypes.every((sourceType, index) => {
47
+ if (sourceTypeIsUnknown(sourceType))
48
+ return true;
49
+ const source = normalizedType(sourceType, false);
50
+ const descriptor = normalizedType(descriptorTypes[index] ?? '', true);
51
+ if (source === descriptor)
52
+ return true;
53
+ // Java parser metadata currently drops the ellipsis from varargs and also
54
+ // leaves parameterCount open-ended. Only in that shape may T match JVM T[].
55
+ return (typeof parameterCount !== 'number' &&
56
+ descriptor.endsWith('[]') &&
57
+ source === descriptor.slice(0, -2));
58
+ });
59
+ }
60
+ export const javaRuntimeSymbolStrategy = {
61
+ matchesCallable: matchesJavaCallable,
62
+ };
@@ -1,13 +1,29 @@
1
1
  import { type SpringDiAnnotationFact, type SpringDiClassFact, type SpringDiDependencyFact, type SpringDiInjectionSiteFact } from '../../frameworks/spring/di-metadata.js';
2
+ import { type SpringArgumentFact } from '../../frameworks/spring/argument-facts.js';
2
3
  import { type SyntaxNode } from '../../utils/ast-helpers.js';
3
4
  export interface JavaAnnotationSyntaxFact extends SpringDiAnnotationFact {
4
5
  readonly line: number;
6
+ /** Present only for callers that opt in via `javaSpringAnnotationFacts`. */
7
+ readonly args?: readonly SpringArgumentFact[];
8
+ }
9
+ /**
10
+ * Options for `javaSpringAnnotationFacts`.
11
+ *
12
+ * The STRUCTURED arguments are opt-in because DI captures every annotated
13
+ * field, constructor, and method in the repository, and none of its consumers
14
+ * reads them. Note what this does and does not save: every fact already carries
15
+ * `text`, the annotation's full source, so the argument TEXT crosses the worker
16
+ * boundary either way. What the opt-in avoids is a second, parsed copy of that
17
+ * same text on facts that would never look at it.
18
+ */
19
+ export interface JavaSpringAnnotationFactOptions {
20
+ readonly includeArguments?: boolean;
5
21
  }
6
22
  export type JavaSpringDependencyFact = SpringDiDependencyFact<JavaAnnotationSyntaxFact>;
7
23
  type JavaSpringInjectionSiteKind = 'field' | 'constructor' | 'method';
8
24
  export type JavaSpringInjectionSiteFact = SpringDiInjectionSiteFact<JavaAnnotationSyntaxFact, JavaSpringInjectionSiteKind>;
9
25
  export type JavaSpringDiClassFact = SpringDiClassFact<JavaAnnotationSyntaxFact, JavaSpringInjectionSiteKind>;
10
- export declare function javaSpringAnnotationFacts(node: SyntaxNode): JavaAnnotationSyntaxFact[];
26
+ export declare function javaSpringAnnotationFacts(node: SyntaxNode, options?: JavaSpringAnnotationFactOptions): JavaAnnotationSyntaxFact[];
11
27
  /**
12
28
  * Capture one class already surfaced by Java's scope query.
13
29
  *
@@ -1,11 +1,51 @@
1
1
  import { makeScopeId } from '../../../../_shared/index.js';
2
2
  import { createSpringDiMetadataAttacher, hasSpringDiRelevantAnnotation, hasSpringStereotypeSyntax, } from '../../frameworks/spring/di-metadata.js';
3
3
  import { hasSpringBeanFactorySyntax, } from '../../frameworks/spring/bean-factories.js';
4
+ import { normalizeSpringFactText, } from '../../frameworks/spring/argument-facts.js';
4
5
  import { parseSpringInjectionType } from '../../di-extractors/spring.js';
5
- import { nodeToCapture } from '../../utils/ast-helpers.js';
6
+ import { hasRecoveredSyntax, nodeToCapture } from '../../utils/ast-helpers.js';
6
7
  import { isJavaPackageSiblingVisibilityIncomplete } from './package-siblings.js';
7
8
  import { getJavaSpringDiFacts } from './capture-side-channel.js';
8
- export function javaSpringAnnotationFacts(node) {
9
+ const JAVA_COMMENT_NODE_TYPES = new Set(['line_comment', 'block_comment']);
10
+ /**
11
+ * Annotation arguments as written, or `undefined` for a marker annotation.
12
+ *
13
+ * `@Scheduled` yields `undefined` (no argument list in the syntax) while
14
+ * `@Scheduled()` yields `[]` (an empty list was written). Named arguments keep
15
+ * their key, single-element ones stay positional, and array initializers are
16
+ * kept as one raw `{...}` text — splitting or dereferencing them would be
17
+ * resolution, which does not belong at capture time.
18
+ *
19
+ * An argument list that did not parse also yields `undefined`. Error recovery
20
+ * fills gaps with invented nodes — `@KafkaListener(topics = "orders", groupId =`
21
+ * hands back a `groupId` whose value is a `{}` that nobody wrote — and there is
22
+ * no fourth state here for "unreadable". Collapsing it into the marker case is
23
+ * deliberate: both tell a consumer there is nothing here to resolve, which is
24
+ * true, whereas a fabricated value would send it somewhere real and wrong.
25
+ */
26
+ function javaAnnotationArgumentFacts(annotation) {
27
+ const argumentList = annotation.childForFieldName('arguments');
28
+ if (argumentList === null || hasRecoveredSyntax(argumentList))
29
+ return undefined;
30
+ const args = [];
31
+ for (const child of argumentList.namedChildren) {
32
+ if (JAVA_COMMENT_NODE_TYPES.has(child.type))
33
+ continue;
34
+ if (child.type === 'element_value_pair') {
35
+ const key = child.childForFieldName('key');
36
+ const value = child.childForFieldName('value');
37
+ if (key === null || value === null) {
38
+ args.push({ text: normalizeSpringFactText(child.text) });
39
+ continue;
40
+ }
41
+ args.push({ name: key.text.trim(), text: normalizeSpringFactText(value.text) });
42
+ continue;
43
+ }
44
+ args.push({ text: normalizeSpringFactText(child.text) });
45
+ }
46
+ return args;
47
+ }
48
+ export function javaSpringAnnotationFacts(node, options = {}) {
9
49
  const facts = [];
10
50
  for (const child of node.namedChildren) {
11
51
  if (child.type !== 'modifiers')
@@ -16,10 +56,12 @@ export function javaSpringAnnotationFacts(node) {
16
56
  const nameNode = modifier.childForFieldName('name') ?? modifier.firstNamedChild;
17
57
  if (nameNode === null)
18
58
  continue;
59
+ const args = options.includeArguments === true ? javaAnnotationArgumentFacts(modifier) : undefined;
19
60
  facts.push({
20
61
  name: nameNode.text.trim(),
21
62
  text: modifier.text.trim(),
22
63
  line: modifier.startPosition.row + 1,
64
+ ...(args === undefined ? {} : { args }),
23
65
  });
24
66
  }
25
67
  }
@@ -0,0 +1,8 @@
1
+ import { type SpringDynamicLookupFact } from '../../frameworks/spring/dynamic-lookups.js';
2
+ import { type SyntaxNode } from '../../utils/ast-helpers.js';
3
+ /** Capture real Java method invocations; comments and literals are never visited as calls. */
4
+ export declare function captureJavaSpringDynamicLookupFact(node: SyntaxNode, filePath: string): SpringDynamicLookupFact | null;
5
+ /** Standalone extractor for focused tests; production reuses scope-query call nodes. */
6
+ export declare function captureJavaSpringDynamicLookupFacts(rootNode: SyntaxNode, filePath: string): SpringDynamicLookupFact[];
7
+ /** Attach Java lookup facts for later resolution by the shared DI phase. */
8
+ export declare const attachJavaSpringDynamicLookup: (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;