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
@@ -44,13 +44,19 @@ const classAnnotations = createClassAnnotationFactStore();
44
44
  const springAopFacts = new Map();
45
45
  const springConditionalFacts = new Map();
46
46
  const springDiFacts = new Map();
47
+ const springDynamicLookupFacts = new Map();
47
48
  const springNonHttpHandlerFacts = new Map();
49
+ const springConfigConsumerFacts = new Map();
50
+ const springMessageProducerFacts = new Map();
48
51
  export function clearKotlinClassAnnotationFacts() {
49
52
  classAnnotations.clear();
50
53
  springAopFacts.clear();
51
54
  springConditionalFacts.clear();
52
55
  springDiFacts.clear();
56
+ springDynamicLookupFacts.clear();
53
57
  springNonHttpHandlerFacts.clear();
58
+ springConfigConsumerFacts.clear();
59
+ springMessageProducerFacts.clear();
54
60
  }
55
61
  export function setKotlinSpringAopFacts(filePath, facts) {
56
62
  if (facts.length === 0)
@@ -85,6 +91,15 @@ export function setKotlinSpringDiFacts(filePath, facts) {
85
91
  export function getKotlinSpringDiFacts(filePath) {
86
92
  return springDiFacts.get(filePath) ?? [];
87
93
  }
94
+ export function setKotlinSpringDynamicLookupFacts(filePath, facts) {
95
+ if (facts.length === 0)
96
+ springDynamicLookupFacts.delete(filePath);
97
+ else
98
+ springDynamicLookupFacts.set(filePath, facts);
99
+ }
100
+ export function getKotlinSpringDynamicLookupFacts(filePath) {
101
+ return springDynamicLookupFacts.get(filePath) ?? [];
102
+ }
88
103
  export function setKotlinSpringNonHttpHandlerFacts(filePath, facts) {
89
104
  if (facts.length === 0)
90
105
  springNonHttpHandlerFacts.delete(filePath);
@@ -94,6 +109,24 @@ export function setKotlinSpringNonHttpHandlerFacts(filePath, facts) {
94
109
  export function getKotlinSpringNonHttpHandlerFacts(filePath) {
95
110
  return springNonHttpHandlerFacts.get(filePath) ?? [];
96
111
  }
112
+ export function setKotlinSpringConfigConsumerFacts(filePath, facts) {
113
+ if (facts.length === 0)
114
+ springConfigConsumerFacts.delete(filePath);
115
+ else
116
+ springConfigConsumerFacts.set(filePath, facts);
117
+ }
118
+ export function getKotlinSpringConfigConsumerFacts(filePath) {
119
+ return springConfigConsumerFacts.get(filePath) ?? [];
120
+ }
121
+ export function setKotlinSpringMessageProducerFacts(filePath, facts) {
122
+ if (facts.length === 0)
123
+ springMessageProducerFacts.delete(filePath);
124
+ else
125
+ springMessageProducerFacts.set(filePath, facts);
126
+ }
127
+ export function getKotlinSpringMessageProducerFacts(filePath) {
128
+ return springMessageProducerFacts.get(filePath) ?? [];
129
+ }
97
130
  /**
98
131
  * `LanguageProvider.collectCaptureSideChannel` implementation for Kotlin.
99
132
  * Returns `undefined` when this file recorded no side-channel state at all, so
@@ -105,14 +138,20 @@ export function collectKotlinCaptureSideChannel(filePath) {
105
138
  const aopFacts = springAopFacts.get(filePath) ?? [];
106
139
  const conditionFacts = springConditionalFacts.get(filePath) ?? [];
107
140
  const diFacts = springDiFacts.get(filePath) ?? [];
141
+ const dynamicLookupFacts = springDynamicLookupFacts.get(filePath) ?? [];
108
142
  const nonHttpHandlerFacts = springNonHttpHandlerFacts.get(filePath) ?? [];
143
+ const configConsumerFacts = springConfigConsumerFacts.get(filePath) ?? [];
144
+ const messageProducerFacts = springMessageProducerFacts.get(filePath) ?? [];
109
145
  const packageFact = getKotlinPackageFact(filePath);
110
146
  if (companionScopes.length === 0 &&
111
147
  annotationFacts.length === 0 &&
112
148
  aopFacts.length === 0 &&
113
149
  conditionFacts.length === 0 &&
114
150
  diFacts.length === 0 &&
151
+ dynamicLookupFacts.length === 0 &&
115
152
  nonHttpHandlerFacts.length === 0 &&
153
+ configConsumerFacts.length === 0 &&
154
+ messageProducerFacts.length === 0 &&
116
155
  packageFact === undefined) {
117
156
  return undefined;
118
157
  }
@@ -124,7 +163,12 @@ export function collectKotlinCaptureSideChannel(filePath) {
124
163
  ...(aopFacts.length > 0 ? { springAopFacts: aopFacts } : {}),
125
164
  ...(conditionFacts.length > 0 ? { springConditionalFacts: conditionFacts } : {}),
126
165
  ...(diFacts.length > 0 ? { springDiFacts: diFacts } : {}),
166
+ ...(dynamicLookupFacts.length > 0 ? { springDynamicLookupFacts: dynamicLookupFacts } : {}),
127
167
  ...(nonHttpHandlerFacts.length > 0 ? { springNonHttpHandlerFacts: nonHttpHandlerFacts } : {}),
168
+ ...(configConsumerFacts.length > 0 ? { springConfigConsumerFacts: configConsumerFacts } : {}),
169
+ ...(messageProducerFacts.length > 0
170
+ ? { springMessageProducerFacts: messageProducerFacts }
171
+ : {}),
128
172
  };
129
173
  }
130
174
  /**
@@ -147,7 +191,10 @@ export function applyKotlinCaptureSideChannel(parsed) {
147
191
  setKotlinSpringAopFacts(parsed.filePath, []);
148
192
  setKotlinSpringConditionalFacts(parsed.filePath, []);
149
193
  setKotlinSpringDiFacts(parsed.filePath, []);
194
+ setKotlinSpringDynamicLookupFacts(parsed.filePath, []);
150
195
  setKotlinSpringNonHttpHandlerFacts(parsed.filePath, []);
196
+ setKotlinSpringConfigConsumerFacts(parsed.filePath, []);
197
+ setKotlinSpringMessageProducerFacts(parsed.filePath, []);
151
198
  setKotlinPackageFact(parsed.filePath, UNKNOWN_JVM_PACKAGE_FACT);
152
199
  return;
153
200
  }
@@ -158,6 +205,9 @@ export function applyKotlinCaptureSideChannel(parsed) {
158
205
  setKotlinSpringAopFacts(parsed.filePath, Array.isArray(data.springAopFacts) ? data.springAopFacts : []);
159
206
  setKotlinSpringConditionalFacts(parsed.filePath, Array.isArray(data.springConditionalFacts) ? data.springConditionalFacts : []);
160
207
  setKotlinSpringDiFacts(parsed.filePath, Array.isArray(data.springDiFacts) ? data.springDiFacts : []);
208
+ setKotlinSpringDynamicLookupFacts(parsed.filePath, Array.isArray(data.springDynamicLookupFacts) ? data.springDynamicLookupFacts : []);
161
209
  setKotlinSpringNonHttpHandlerFacts(parsed.filePath, Array.isArray(data.springNonHttpHandlerFacts) ? data.springNonHttpHandlerFacts : []);
210
+ setKotlinSpringConfigConsumerFacts(parsed.filePath, Array.isArray(data.springConfigConsumerFacts) ? data.springConfigConsumerFacts : []);
211
+ setKotlinSpringMessageProducerFacts(parsed.filePath, Array.isArray(data.springMessageProducerFacts) ? data.springMessageProducerFacts : []);
162
212
  setKotlinPackageFact(parsed.filePath, isJvmPackageFact(data.packageFact) ? data.packageFact : UNKNOWN_JVM_PACKAGE_FACT);
163
213
  }
@@ -10,10 +10,14 @@ import { normalizeKotlinType } from './interpret.js';
10
10
  import { synthesizeKotlinReceiverBinding } from './receiver-binding.js';
11
11
  import { getKotlinParser, getKotlinScopeQuery } from './query.js';
12
12
  import { markCompanionScope } from './companion-scopes.js';
13
- import { setKotlinClassAnnotationFacts, setKotlinSpringAopFacts, setKotlinSpringConditionalFacts, setKotlinSpringDiFacts, setKotlinSpringNonHttpHandlerFacts, } from './capture-side-channel.js';
13
+ import { setKotlinClassAnnotationFacts, setKotlinSpringAopFacts, setKotlinSpringConditionalFacts, setKotlinSpringDiFacts, setKotlinSpringDynamicLookupFacts, setKotlinSpringMessageProducerFacts, setKotlinSpringNonHttpHandlerFacts, setKotlinSpringConfigConsumerFacts, } from './capture-side-channel.js';
14
14
  import { captureKotlinPackageFact } from './package-facts.js';
15
15
  import { synthesizeCallableFlowCaptures } from '../../utils/callable-flow-captures.js';
16
+ import { synthesizeLombokAccessorCaptures } from './lombok-synthesizer.js';
16
17
  import { captureKotlinSpringDiClassFact } from './spring-di.js';
18
+ import { captureKotlinSpringConfigConsumerFacts } from './spring-config-bindings.js';
19
+ import { captureKotlinSpringDynamicLookupFact } from './spring-dynamic-lookup.js';
20
+ import { captureKotlinSpringMessageProducerFact } from './spring-message-producers.js';
17
21
  import { synthesizeReceiverChainCapture } from '../../utils/receiver-chain-captures.js';
18
22
  import { captureKotlinSpringAopFacts } from './spring-aop.js';
19
23
  import { captureKotlinSpringConditionalFacts, } from './spring-conditionals.js';
@@ -75,6 +79,9 @@ export function emitKotlinScopeCaptures(sourceText, filePath, cachedTree) {
75
79
  const springNonHttpHandlerFacts = [];
76
80
  const springNonHttpHandlerTypeNodeIds = new Set();
77
81
  const springDiClassNodeIds = new Set();
82
+ const springDynamicLookupFacts = [];
83
+ const springMessageProducerFacts = [];
84
+ const springMemberCallNodeIds = new Set();
78
85
  const returnTypes = collectKotlinReturnTypeTexts(tree.rootNode);
79
86
  out.push(...synthesizeKotlinLocalAssignmentBindings(tree.rootNode, returnTypes));
80
87
  out.push(...synthesizeKotlinLoopBindings(tree.rootNode, returnTypes));
@@ -97,6 +104,18 @@ export function emitKotlinScopeCaptures(sourceText, filePath, cachedTree) {
97
104
  }
98
105
  if (Object.keys(grouped).length === 0)
99
106
  continue;
107
+ // One visit per member call node: the same invocation can back several
108
+ // query matches, and both Spring call-shape captures must see it once.
109
+ const memberCallNode = nodeIfType(groupedNodes['@reference.call.member'], 'call_expression');
110
+ if (memberCallNode !== null && !springMemberCallNodeIds.has(memberCallNode.id)) {
111
+ springMemberCallNodeIds.add(memberCallNode.id);
112
+ const lookupFact = captureKotlinSpringDynamicLookupFact(memberCallNode, filePath);
113
+ if (lookupFact !== null)
114
+ springDynamicLookupFacts.push(lookupFact);
115
+ const producerFact = captureKotlinSpringMessageProducerFact(memberCallNode, filePath);
116
+ if (producerFact !== null)
117
+ springMessageProducerFacts.push(producerFact);
118
+ }
100
119
  // tree-sitter-kotlin represents both classes and interfaces with
101
120
  // `class_declaration`; `object_declaration` is the separate object form.
102
121
  const springAopTypeNode = [
@@ -279,7 +298,11 @@ export function emitKotlinScopeCaptures(sourceText, filePath, cachedTree) {
279
298
  setKotlinSpringAopFacts(filePath, springAopFacts);
280
299
  setKotlinSpringConditionalFacts(filePath, springConditionalFacts);
281
300
  setKotlinSpringDiFacts(filePath, springDiFacts);
301
+ setKotlinSpringDynamicLookupFacts(filePath, springDynamicLookupFacts);
282
302
  setKotlinSpringNonHttpHandlerFacts(filePath, springNonHttpHandlerFacts);
303
+ setKotlinSpringConfigConsumerFacts(filePath, captureKotlinSpringConfigConsumerFacts(tree.rootNode, filePath));
304
+ setKotlinSpringMessageProducerFacts(filePath, springMessageProducerFacts);
305
+ out.push(...synthesizeLombokAccessorCaptures(tree.rootNode));
283
306
  out.push(...synthesizeCallableFlowCaptures(tree.rootNode, KOTLIN_CALLABLE_CAPTURE_OPTIONS));
284
307
  return out;
285
308
  }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Kotlin accessor synthesizer (same provider-hook role as Java Lombok).
3
+ *
4
+ * kotlinc emits JavaBeans getters/setters for `val`/`var` properties. Those
5
+ * methods are absent from the tree-sitter AST, so Java (and Kotlin) calls
6
+ * like `user.getName()` miss CALLS edges. Planning is Kotlin-specific;
7
+ * naming and Method emission share `jvm/beanspec` + `jvm/accessor-synthesis`.
8
+ *
9
+ * ## Supported subset (v1)
10
+ * - Class / data class / object / companion / interface `val`/`var` properties
11
+ * (interface accessors without a custom body are abstract JVM methods).
12
+ * - Primary-constructor `val`/`var` class parameters.
13
+ * - Names beginning with `is` + a non-lowercase character keep that getter name; all other
14
+ * properties, including `Boolean`, use `get`.
15
+ * - Custom `get()`/`set()` bodies still emit their JVM accessor Methods.
16
+ * - Explicit `fun getX` / `@JvmField` / `const` skip synthesis.
17
+ * - `@JvmName`-renamed accessors are suppressed until custom-name emission lands.
18
+ * Unsupported: `@JvmStatic` renaming, file-facade top-level properties.
19
+ */
20
+ import type Parser from 'tree-sitter';
21
+ import type { CaptureMatch } from '../../../../_shared/index.js';
22
+ import { type SyntheticAccessorResult } from '../jvm/accessor-synthesis.js';
23
+ export declare function kotlinGetterName(propertyName: string): string;
24
+ export declare function kotlinSetterName(propertyName: string): string;
25
+ export declare function synthesizeLombokAccessors(tree: Parser.Tree, filePath: string, classOwnersById: ReadonlyMap<number, string>): SyntheticAccessorResult;
26
+ export declare function synthesizeLombokAccessorCaptures(rootNode: Parser.SyntaxNode): CaptureMatch[];
@@ -0,0 +1,417 @@
1
+ import { booleanIsPrefixBase, jvmGetterName, jvmSetterName } from '../jvm/beanspec.js';
2
+ import { createExistingMethodIndex, createJvmAccessorSynthesis, hasExistingMethod, jvmTypeSimpleName, rememberExistingMethod, } from '../jvm/accessor-synthesis.js';
3
+ const KOTLIN_TYPE_DECLS = new Set(['class_declaration', 'object_declaration', 'companion_object']);
4
+ function capitalizeAscii(name) {
5
+ const first = name.charAt(0);
6
+ return first >= 'a' && first <= 'z'
7
+ ? String.fromCharCode(first.charCodeAt(0) - 32) + name.slice(1)
8
+ : name;
9
+ }
10
+ export function kotlinGetterName(propertyName) {
11
+ return jvmGetterName(propertyName, booleanIsPrefixBase(propertyName, true) !== null, capitalizeAscii);
12
+ }
13
+ export function kotlinSetterName(propertyName) {
14
+ return jvmSetterName(propertyName, true, capitalizeAscii);
15
+ }
16
+ function collectKotlinImports(root) {
17
+ const byLocalName = new Map();
18
+ const shadowedSimpleNames = new Set();
19
+ for (const child of root.children) {
20
+ if (child.type !== 'class_declaration')
21
+ continue;
22
+ const name = jvmTypeSimpleName(child);
23
+ if (name)
24
+ shadowedSimpleNames.add(name);
25
+ }
26
+ const importList = root.children.find((child) => child.type === 'import_list');
27
+ for (const child of importList?.children ?? []) {
28
+ if (child.type !== 'import_header')
29
+ continue;
30
+ const text = child.text
31
+ .replace(/^import\s+/, '')
32
+ .replace(/\/\*[\s\S]*?\*\//g, '')
33
+ .trim();
34
+ const [pathText, aliasText] = text.split(/\s+as\s+/, 2);
35
+ const importPath = pathText?.replace(/\s+/g, '');
36
+ if (!importPath || importPath.endsWith('.*'))
37
+ continue;
38
+ const localName = aliasText?.trim() || importPath.split('.').pop();
39
+ if (localName)
40
+ byLocalName.set(localName, importPath);
41
+ }
42
+ return { byLocalName, shadowedSimpleNames };
43
+ }
44
+ function annotationUserTypeText(annotation) {
45
+ const constructor = annotation.namedChildren.find((c) => c.type === 'constructor_invocation');
46
+ const userType = constructor?.namedChildren.find((c) => c.type === 'user_type') ??
47
+ annotation.namedChildren.find((c) => c.type === 'user_type');
48
+ return userType?.text ?? '';
49
+ }
50
+ function isKotlinJvmAnnotation(annotation, name, imports) {
51
+ const typeText = annotationUserTypeText(annotation);
52
+ const canonical = `kotlin.jvm.${name}`;
53
+ if (typeText.includes('.'))
54
+ return typeText === canonical;
55
+ const imported = imports.byLocalName.get(typeText);
56
+ if (imported !== undefined)
57
+ return imported === canonical;
58
+ if (imports.shadowedSimpleNames.has(typeText))
59
+ return false;
60
+ return typeText === name;
61
+ }
62
+ function kotlinVisibility(modifiers) {
63
+ if (!modifiers)
64
+ return 'public';
65
+ for (const child of modifiers.namedChildren) {
66
+ if (child.type !== 'visibility_modifier')
67
+ continue;
68
+ if (child.text === 'private')
69
+ return 'private';
70
+ if (child.text === 'protected')
71
+ return 'protected';
72
+ if (child.text === 'internal')
73
+ return 'package';
74
+ }
75
+ return 'public';
76
+ }
77
+ function hasJvmField(node, imports) {
78
+ const mods = node.children.find((c) => c.type === 'modifiers');
79
+ return (mods?.namedChildren.some((child) => child.type === 'annotation' && isKotlinJvmAnnotation(child, 'JvmField', imports)) === true);
80
+ }
81
+ function hasConst(node) {
82
+ const mods = node.children.find((c) => c.type === 'modifiers');
83
+ if (mods?.namedChildren.some((child) => child.type === 'property_modifier' && child.text === 'const')) {
84
+ return true;
85
+ }
86
+ return node.namedChildren.some((child) => child.type === 'const');
87
+ }
88
+ function isVarBinding(node) {
89
+ const kind = node.children.find((c) => c.type === 'binding_pattern_kind');
90
+ const text = kind?.text;
91
+ if (text === 'var')
92
+ return true;
93
+ if (text === 'val')
94
+ return false;
95
+ return null;
96
+ }
97
+ function inferredInitializerType(node) {
98
+ switch (node.type) {
99
+ case 'string_literal':
100
+ case 'line_string_literal':
101
+ case 'multi_line_string_literal':
102
+ return 'String';
103
+ case 'character_literal':
104
+ return 'Char';
105
+ case 'boolean_literal':
106
+ case 'true':
107
+ case 'false':
108
+ return 'Boolean';
109
+ case 'long_literal':
110
+ return 'Long';
111
+ case 'unsigned_literal':
112
+ return /l$/i.test(node.text) ? 'ULong' : 'UInt';
113
+ case 'integer_literal':
114
+ case 'decimal_integer_literal':
115
+ case 'hex_integer_literal':
116
+ case 'octal_integer_literal':
117
+ case 'binary_integer_literal':
118
+ return 'Int';
119
+ case 'real_literal':
120
+ case 'decimal_floating_point_literal':
121
+ return /f$/i.test(node.text) ? 'Float' : 'Double';
122
+ case 'prefix_expression': {
123
+ const operand = node.namedChildren.at(-1);
124
+ return operand ? inferredInitializerType(operand) : undefined;
125
+ }
126
+ case 'call_expression': {
127
+ const callee = node.namedChildren.find((child) => child.type === 'simple_identifier');
128
+ if (!callee)
129
+ return undefined;
130
+ const first = callee.text.charAt(0);
131
+ return first !== '' && first === first.toUpperCase() ? callee.text : undefined;
132
+ }
133
+ default:
134
+ return undefined;
135
+ }
136
+ }
137
+ function propertyTypeText(node) {
138
+ const declarator = node.type === 'class_parameter'
139
+ ? node
140
+ : (node.children.find((c) => c.type === 'variable_declaration') ?? node);
141
+ const colon = declarator.children.find((c) => c.type === ':');
142
+ let typeNode = colon?.nextNamedSibling ?? null;
143
+ while (typeNode?.type === 'type_modifiers')
144
+ typeNode = typeNode.nextNamedSibling;
145
+ if (typeNode)
146
+ return typeNode.text;
147
+ const initializer = node.namedChildren.find((child) => child.id !== declarator.id &&
148
+ child.type !== 'binding_pattern_kind' &&
149
+ child.type !== 'modifiers');
150
+ return initializer ? (inferredInitializerType(initializer) ?? 'unknown') : 'unknown';
151
+ }
152
+ function propertyNameNode(node) {
153
+ if (node.type === 'class_parameter') {
154
+ return node.children.find((c) => c.type === 'simple_identifier') ?? null;
155
+ }
156
+ const decl = node.children.find((c) => c.type === 'variable_declaration');
157
+ if (decl) {
158
+ return decl.children.find((c) => c.type === 'simple_identifier') ?? null;
159
+ }
160
+ return node.children.find((c) => c.type === 'simple_identifier') ?? null;
161
+ }
162
+ function accessorMetadata(prop, propertyVisibility, imports) {
163
+ let getter = propertyVisibility;
164
+ let setter = propertyVisibility;
165
+ let skipGetter = false;
166
+ let skipSetter = false;
167
+ const propertyModifiers = prop.children.find((c) => c.type === 'modifiers');
168
+ for (const annotation of propertyModifiers?.namedChildren ?? []) {
169
+ if (annotation.type !== 'annotation' ||
170
+ !isKotlinJvmAnnotation(annotation, 'JvmName', imports)) {
171
+ continue;
172
+ }
173
+ const target = annotation.children.find((c) => c.type === 'use_site_target')?.text;
174
+ if (target === 'get:')
175
+ skipGetter = true;
176
+ if (target === 'set:')
177
+ skipSetter = true;
178
+ }
179
+ const apply = (node) => {
180
+ const modifiers = node.children.find((c) => c.type === 'modifiers');
181
+ if (!modifiers)
182
+ return;
183
+ if (node.type === 'getter')
184
+ getter = kotlinVisibility(modifiers);
185
+ if (node.type === 'setter')
186
+ setter = kotlinVisibility(modifiers);
187
+ if (modifiers.namedChildren.some((annotation) => isKotlinJvmAnnotation(annotation, 'JvmName', imports))) {
188
+ if (node.type === 'getter')
189
+ skipGetter = true;
190
+ if (node.type === 'setter')
191
+ skipSetter = true;
192
+ }
193
+ };
194
+ for (const child of prop.children) {
195
+ if (child.type === 'getter' || child.type === 'setter')
196
+ apply(child);
197
+ }
198
+ let sib = prop.nextNamedSibling;
199
+ while (sib && (sib.type === 'getter' || sib.type === 'setter')) {
200
+ apply(sib);
201
+ sib = sib.nextNamedSibling;
202
+ }
203
+ return {
204
+ getterVisibility: getter,
205
+ setterVisibility: setter,
206
+ skipGetter,
207
+ skipSetter,
208
+ };
209
+ }
210
+ function hasKotlinAccessorBody(prop, kind) {
211
+ const hasBody = (node) => node.type === kind && node.children.some((child) => child.type === 'function_body');
212
+ if (prop.children.some(hasBody))
213
+ return true;
214
+ let sib = prop.nextNamedSibling;
215
+ while (sib && (sib.type === 'getter' || sib.type === 'setter')) {
216
+ if (hasBody(sib))
217
+ return true;
218
+ sib = sib.nextNamedSibling;
219
+ }
220
+ return false;
221
+ }
222
+ function functionName(node) {
223
+ return node.children.find((c) => c.type === 'simple_identifier')?.text;
224
+ }
225
+ function functionArity(node) {
226
+ const params = node.children.find((c) => c.type === 'function_value_parameters');
227
+ let arity = node.childForFieldName('receiver') !== null ||
228
+ node.namedChildren.some((child) => child.type === 'receiver_type')
229
+ ? 1
230
+ : 0;
231
+ const modifiers = node.children.find((child) => child.type === 'modifiers');
232
+ if (modifiers?.namedChildren.some((child) => child.type === 'function_modifier' && child.text === 'suspend')) {
233
+ arity += 1;
234
+ }
235
+ for (const child of params?.namedChildren ?? []) {
236
+ if (child.type === 'parameter' || child.type === 'parameter_with_optional_type')
237
+ arity += 1;
238
+ }
239
+ return arity;
240
+ }
241
+ function collectExistingMethods(...bodies) {
242
+ const index = createExistingMethodIndex('exact');
243
+ for (const body of bodies) {
244
+ if (!body)
245
+ continue;
246
+ for (const child of body.children) {
247
+ if (child.type !== 'function_declaration')
248
+ continue;
249
+ const name = functionName(child);
250
+ if (!name)
251
+ continue;
252
+ rememberExistingMethod(index, name, functionArity(child));
253
+ }
254
+ }
255
+ return index;
256
+ }
257
+ function toKtProperty(child, imports) {
258
+ const isVar = isVarBinding(child);
259
+ if (isVar === null)
260
+ return null;
261
+ if (hasJvmField(child, imports) || hasConst(child))
262
+ return null;
263
+ const nameNode = propertyNameNode(child);
264
+ if (!nameNode)
265
+ return null;
266
+ const mods = child.children.find((c) => c.type === 'modifiers');
267
+ const visibility = kotlinVisibility(mods);
268
+ const accessor = accessorMetadata(child, visibility, imports);
269
+ return {
270
+ name: nameNode.text,
271
+ type: propertyTypeText(child),
272
+ isVar,
273
+ skipGetter: accessor.skipGetter,
274
+ skipSetter: accessor.skipSetter,
275
+ getterVisibility: accessor.getterVisibility,
276
+ setterVisibility: accessor.setterVisibility,
277
+ startLine: child.startPosition.row + 1,
278
+ endLine: child.endPosition.row + 1,
279
+ propertyNode: child,
280
+ declaratorNode: nameNode,
281
+ };
282
+ }
283
+ function collectTypedProperties(parent, type, imports) {
284
+ if (!parent)
285
+ return [];
286
+ const out = [];
287
+ for (const child of parent.namedChildren) {
288
+ if (child.type !== type)
289
+ continue;
290
+ const prop = toKtProperty(child, imports);
291
+ if (prop)
292
+ out.push(prop);
293
+ }
294
+ return out;
295
+ }
296
+ function findKtClasses(root, imports) {
297
+ const classes = [];
298
+ const graphOwnerNode = (node) => {
299
+ if (node.type !== 'companion_object')
300
+ return node;
301
+ if (jvmTypeSimpleName(node))
302
+ return node;
303
+ let current = node.parent;
304
+ while (current && !KOTLIN_TYPE_DECLS.has(current.type))
305
+ current = current.parent;
306
+ return current ?? node;
307
+ };
308
+ const walk = (node) => {
309
+ if (KOTLIN_TYPE_DECLS.has(node.type)) {
310
+ const ownerNode = graphOwnerNode(node);
311
+ const name = jvmTypeSimpleName(ownerNode) ?? '';
312
+ const ctor = node.children.find((c) => c.type === 'primary_constructor') ?? null;
313
+ const body = node.children.find((c) => c.type === 'class_body') ?? null;
314
+ if (name) {
315
+ const properties = [
316
+ ...collectTypedProperties(ctor, 'class_parameter', imports),
317
+ ...collectTypedProperties(body, 'property_declaration', imports),
318
+ ];
319
+ if (properties.length > 0) {
320
+ const ownerBody = ownerNode.id === node.id
321
+ ? null
322
+ : (ownerNode.children.find((child) => child.type === 'class_body') ?? null);
323
+ classes.push({
324
+ node: ownerNode,
325
+ name,
326
+ isStatic: node.type === 'companion_object',
327
+ isInterface: node.children.some((child) => child.type === 'interface'),
328
+ wasHoisted: ownerNode.id !== node.id,
329
+ properties,
330
+ existingMethods: collectExistingMethods(body, ownerBody),
331
+ });
332
+ }
333
+ }
334
+ if (body) {
335
+ for (const child of body.namedChildren) {
336
+ if (KOTLIN_TYPE_DECLS.has(child.type))
337
+ walk(child);
338
+ }
339
+ }
340
+ return;
341
+ }
342
+ for (const child of node.namedChildren)
343
+ walk(child);
344
+ };
345
+ walk(root);
346
+ return classes;
347
+ }
348
+ function planAccessors(cls) {
349
+ const planned = [];
350
+ for (const prop of cls.properties) {
351
+ const gName = kotlinGetterName(prop.name);
352
+ if (!prop.skipGetter && !hasExistingMethod(cls.existingMethods, gName, 0)) {
353
+ planned.push({
354
+ kind: 'getter',
355
+ name: gName,
356
+ returnType: prop.type,
357
+ parameterTypes: [],
358
+ visibility: prop.getterVisibility,
359
+ isStatic: cls.isStatic,
360
+ isAbstract: cls.isInterface && !hasKotlinAccessorBody(prop.propertyNode, 'getter'),
361
+ startLine: prop.startLine,
362
+ endLine: prop.endLine,
363
+ declaratorNode: prop.declaratorNode,
364
+ });
365
+ }
366
+ if (prop.isVar && !prop.skipSetter) {
367
+ const sName = kotlinSetterName(prop.name);
368
+ if (!hasExistingMethod(cls.existingMethods, sName, 1)) {
369
+ planned.push({
370
+ kind: 'setter',
371
+ name: sName,
372
+ returnType: 'void',
373
+ parameterTypes: [prop.type],
374
+ visibility: prop.setterVisibility,
375
+ isStatic: cls.isStatic,
376
+ isAbstract: cls.isInterface && !hasKotlinAccessorBody(prop.propertyNode, 'setter'),
377
+ startLine: prop.startLine,
378
+ endLine: prop.endLine,
379
+ declaratorNode: prop.declaratorNode,
380
+ });
381
+ }
382
+ }
383
+ }
384
+ return planned;
385
+ }
386
+ function planKotlinAccessorOwners(rootNode) {
387
+ const owners = [];
388
+ const imports = collectKotlinImports(rootNode);
389
+ for (const cls of findKtClasses(rootNode, imports)) {
390
+ const accessors = planAccessors(cls);
391
+ const existingIndex = cls.wasHoisted
392
+ ? owners.findIndex((owner) => owner.node.id === cls.node.id)
393
+ : -1;
394
+ const existing = existingIndex >= 0 ? owners[existingIndex] : undefined;
395
+ if (existing) {
396
+ owners[existingIndex] = {
397
+ ...existing,
398
+ accessors: [...existing.accessors, ...accessors],
399
+ };
400
+ }
401
+ else {
402
+ owners.push({ node: cls.node, name: cls.name, accessors });
403
+ }
404
+ }
405
+ return owners;
406
+ }
407
+ const lombokAccessorSynthesis = createJvmAccessorSynthesis({
408
+ language: 'kotlin',
409
+ synthetic: 'kotlin-jvm',
410
+ planOwners: planKotlinAccessorOwners,
411
+ });
412
+ export function synthesizeLombokAccessors(tree, filePath, classOwnersById) {
413
+ return lombokAccessorSynthesis.synthesize(tree, filePath, classOwnersById);
414
+ }
415
+ export function synthesizeLombokAccessorCaptures(rootNode) {
416
+ return lombokAccessorSynthesis.captures(rootNode);
417
+ }
@@ -15,6 +15,8 @@ import { clearKotlinPackageFacts } from './package-facts.js';
15
15
  import { attachKotlinSpringDiMetadata } from './spring-di.js';
16
16
  import { attachKotlinSpringConditionalMetadata } from './spring-conditionals.js';
17
17
  import { attachKotlinSpringNonHttpHandlerMetadata } from './spring-non-http-handlers.js';
18
+ import { attachKotlinSpringConfigBindings } from './spring-config-bindings.js';
19
+ import { attachKotlinSpringDynamicLookup } from './spring-dynamic-lookup.js';
18
20
  /**
19
21
  * Kotlin scope resolver for RFC #909 Ring 3.
20
22
  *
@@ -121,6 +123,8 @@ export const kotlinScopeResolver = {
121
123
  attachKotlinSpringConditionalMetadata(graph, parsedFiles, nodeLookup, indexes);
122
124
  attachKotlinSpringDiMetadata(graph, parsedFiles, nodeLookup, indexes);
123
125
  attachKotlinSpringNonHttpHandlerMetadata(graph, parsedFiles, nodeLookup, indexes);
126
+ attachKotlinSpringDynamicLookup(graph, parsedFiles, nodeLookup, indexes);
127
+ attachKotlinSpringConfigBindings(graph, parsedFiles, nodeLookup, indexes);
124
128
  },
125
129
  };
126
130
  /**
@@ -0,0 +1,4 @@
1
+ import type { DefinitionPropertiesContext, RuntimeSymbolStrategy } from '../../language-provider.js';
2
+ /** Transient graph metadata used only by the same analysis run's runtime import. */
3
+ export declare function extractKotlinRuntimeSymbolProperties(context: DefinitionPropertiesContext): Readonly<Record<string, unknown>> | undefined;
4
+ export declare const kotlinRuntimeSymbolStrategy: RuntimeSymbolStrategy;