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
@@ -25,6 +25,34 @@ export interface PipelineOptions {
25
25
  * to retain those nodes under `skipGraphPhases`.
26
26
  */
27
27
  skipGraphPhases?: boolean;
28
+ /**
29
+ * Skip only Leiden community detection and process/flow extraction (#3016).
30
+ * MRO/DI still run. Used on warm incremental analyze so persisted
31
+ * Community/Process rows can be kept instead of wipe+rewrite.
32
+ */
33
+ skipDerivedGraphPhases?: boolean;
34
+ /**
35
+ * Explicit local Spring Boot Actuator snapshot input. Accepts a directory
36
+ * containing endpoint-named JSON files or a JSON bundle keyed by endpoint.
37
+ * Undefined keeps runtime enrichment completely disabled.
38
+ */
39
+ springActuatorPath?: string;
40
+ /** Repo-relative Actuator inputs retained only for a cleanup scan. */
41
+ springActuatorScanExclusions?: readonly string[];
42
+ /**
43
+ * Explicit local AsyncAPI 3.x document input, read by the `springDestinations`
44
+ * phase. Accepts a directory of documents or a single document; the path is
45
+ * resolved against the repository root, so a committed `docs/asyncapi` and an
46
+ * absolute cache populated out of band are equally natural. Undefined keeps
47
+ * specification reading completely disabled.
48
+ *
49
+ * There is deliberately no glob-based auto-discovery to go with it. Scanning
50
+ * a repository for anything that parses as a document would make every
51
+ * existing index grow destination nodes on its next run without an operator
52
+ * having decided anything — the same reason new contract extractors ship
53
+ * opt-in rather than on.
54
+ */
55
+ asyncApiSpecPath?: string;
28
56
  /** Per-advice Spring AOP candidate inspection cap. `0` disables this cap. */
29
57
  springAopMaxCandidateInspectionsPerAdvice?: number;
30
58
  /** Aggregate Spring AOP candidate inspection cap for one analysis. `0` disables this cap. */
@@ -226,7 +254,8 @@ export interface PipelineOptions {
226
254
  * Phase dependency graph:
227
255
  *
228
256
  * scan → structure → [springConfig, markdown, cobol] → parse → [routes, tools, orm]
229
- * → crossFile → scopeResolution → [springAutoConfiguration, springAop] → pruneLocalSymbols
257
+ * → crossFile → scopeResolution → [springAutoConfiguration, springAop,
258
+ * springDestinations] → pruneLocalSymbols
230
259
  * → mro → springAopInheritance → di → communities → processes
231
260
  *
232
261
  * To add a new phase: create a file in pipeline-phases/, export the phase
@@ -16,7 +16,7 @@
16
16
  */
17
17
  import { createKnowledgeGraph } from '../graph/graph.js';
18
18
  import { GraphEmitSink } from '../lbug/graph-emit-sink.js';
19
- import { runPipeline, getPhaseOutput, scanPhase, structurePhase, markdownPhase, cobolPhase, parsePhase, routesPhase, toolsPhase, ormPhase, crossFilePhase, scopeResolutionPhase, springConfigPhase, springAutoConfigurationPhase, springAopPhase, springAopInheritancePhase, pruneLocalSymbolsPhase, taintSummariesPhase, callSummariesPhase, mroPhase, diPhase, communitiesPhase, processesPhase, PhaseRegistry, } from './pipeline-phases/index.js';
19
+ import { runPipeline, getPhaseOutput, scanPhase, structurePhase, markdownPhase, cobolPhase, parsePhase, routesPhase, toolsPhase, ormPhase, crossFilePhase, scopeResolutionPhase, springConfigPhase, springAutoConfigurationPhase, springAopPhase, springDestinationsPhase, springAopInheritancePhase, pruneLocalSymbolsPhase, taintSummariesPhase, callSummariesPhase, mroPhase, diPhase, communitiesPhase, processesPhase, PhaseRegistry, } from './pipeline-phases/index.js';
20
20
  // ── Phase registry ─────────────────────────────────────────────────────────
21
21
  /**
22
22
  * All pipeline phases with their dependency relationships.
@@ -24,7 +24,8 @@ import { runPipeline, getPhaseOutput, scanPhase, structurePhase, markdownPhase,
24
24
  * Phase dependency graph:
25
25
  *
26
26
  * scan → structure → [springConfig, markdown, cobol] → parse → [routes, tools, orm]
27
- * → crossFile → scopeResolution → [springAutoConfiguration, springAop] → pruneLocalSymbols
27
+ * → crossFile → scopeResolution → [springAutoConfiguration, springAop,
28
+ * springDestinations] → pruneLocalSymbols
28
29
  * → mro → springAopInheritance → di → communities → processes
29
30
  *
30
31
  * To add a new phase: create a file in pipeline-phases/, export the phase
@@ -52,6 +53,11 @@ export function buildPhaseList(options) {
52
53
  .register(scopeResolutionPhase)
53
54
  .register(springAutoConfigurationPhase)
54
55
  .register(springAopPhase)
56
+ // Async messaging overlay. Must follow scopeResolution twice over: the
57
+ // owner Method/Function nodes have to exist, and each provider's
58
+ // `applyCaptureSideChannel` has to have restored the messaging facts onto
59
+ // the main thread. It also reads the Property nodes springConfig emits.
60
+ .register(springDestinationsPhase)
55
61
  .register(pruneLocalSymbolsPhase)
56
62
  // M4 (#2084): interprocedural taint fixpoint — the first real opt-in
57
63
  // pdg-gated phase. Off ⇒ absent ⇒ byte-identical graph. No always-on
@@ -61,8 +67,12 @@ export function buildPhaseList(options) {
61
67
  .register(mroPhase, { enabledWhen: (o) => !o.skipGraphPhases })
62
68
  .register(springAopInheritancePhase, { enabledWhen: (o) => !o.skipGraphPhases })
63
69
  .register(diPhase, { enabledWhen: (o) => !o.skipGraphPhases })
64
- .register(communitiesPhase, { enabledWhen: (o) => !o.skipGraphPhases })
65
- .register(processesPhase, { enabledWhen: (o) => !o.skipGraphPhases })
70
+ .register(communitiesPhase, {
71
+ enabledWhen: (o) => !o.skipGraphPhases && o.skipDerivedGraphPhases !== true,
72
+ })
73
+ .register(processesPhase, {
74
+ enabledWhen: (o) => !o.skipGraphPhases && o.skipDerivedGraphPhases !== true,
75
+ })
66
76
  // Normalize a missing options object once here so phase predicates above
67
77
  // take a required PipelineOptions and need no `?.` guard (#2080 review S1).
68
78
  .build(options ?? {}));
@@ -91,17 +101,18 @@ export const runPipelineFromRepo = async (repoPath, onProgress, options) => {
91
101
  graphEmitSink = new GraphEmitSink(graph, options.graphEmitCsvDir);
92
102
  }
93
103
  const phases = buildPhaseList(options);
104
+ const ctx = {
105
+ repoPath,
106
+ graph: graphEmitSink ?? graph,
107
+ onProgress,
108
+ options,
109
+ pipelineStart,
110
+ graphEmit: graphEmitSink,
111
+ };
94
112
  let graphEmitManifest;
95
113
  let results;
96
114
  try {
97
- results = await runPipeline(phases, {
98
- repoPath,
99
- graph: graphEmitSink ?? graph,
100
- onProgress,
101
- options,
102
- pipelineStart,
103
- graphEmit: graphEmitSink,
104
- });
115
+ results = await runPipeline(phases, ctx);
105
116
  graphEmitManifest = graphEmitSink?.finalize();
106
117
  }
107
118
  finally {
@@ -109,7 +120,7 @@ export const runPipelineFromRepo = async (repoPath, onProgress, options) => {
109
120
  graphEmitSink?.close();
110
121
  }
111
122
  // Extract final results for the PipelineResult contract
112
- const { totalFiles, usedWorkerPool, reparsedFileCount, unavailableScopeLanguageFiles } = getPhaseOutput(results, 'parse');
123
+ const { totalFiles, usedWorkerPool, reparsedFileCount, parseCacheHitFileCount, unavailableScopeLanguageFiles, } = getPhaseOutput(results, 'parse');
113
124
  let communityResult;
114
125
  let processResult;
115
126
  const scopeResolutionOutput = getPhaseOutput(results, 'scopeResolution');
@@ -140,7 +151,7 @@ export const runPipelineFromRepo = async (repoPath, onProgress, options) => {
140
151
  nodesCreated: graph.nodeCount,
141
152
  },
142
153
  });
143
- return {
154
+ const result = {
144
155
  // The RAW graph, deliberately — NOT `graphEmitSink`. Phases above received
145
156
  // the sink so their reads are complete, but `loadGraphToLbug` feeds this to
146
157
  // `streamAllCSVsToDisk`, and the sink's complete iterator would then emit
@@ -157,9 +168,36 @@ export const runPipelineFromRepo = async (repoPath, onProgress, options) => {
157
168
  undecidedSatisfaction,
158
169
  usedWorkerPool,
159
170
  reparsedFileCount,
171
+ parseCacheHitFileCount,
160
172
  scopeExtractionFailures,
161
173
  unavailableScopeLanguageFiles,
162
174
  pdgEmitManifest,
163
175
  propertyInference,
164
176
  };
177
+ // #3016: hand back a way to run the derived phases `skipDerivedGraphPhases`
178
+ // held back. Which phases those are is answered by re-asking the registry
179
+ // with only that flag cleared — the one form of the question that stays
180
+ // correct when a different predicate (`skipGraphPhases`) also disables them,
181
+ // since then they are absent for a reason a deferred run cannot fix and the
182
+ // filter yields nothing. The sink guard mirrors the `graph` note above: a
183
+ // streaming run is a full rebuild, which never sets the skip flag, so an
184
+ // active sink here means the two got combined by mistake — and deferred
185
+ // phases writing into a finalized sink would emit past its manifest.
186
+ const deferredDerivedPhases = options?.skipDerivedGraphPhases === true && graphEmitSink === undefined
187
+ ? buildPhaseList({ ...options, skipDerivedGraphPhases: false }).filter((p) => (p.name === 'communities' || p.name === 'processes') && !results.has(p.name))
188
+ : [];
189
+ if (deferredDerivedPhases.length > 0) {
190
+ result.runDeferredDerivedPhases = async () => {
191
+ const derived = await runPipeline(deferredDerivedPhases, ctx, results);
192
+ // Presence-checked for the same reason as the block above: a phase the
193
+ // registry filtered out is absent, and `getPhaseOutput` throws on absent.
194
+ if (derived.has('communities')) {
195
+ result.communityResult = getPhaseOutput(derived, 'communities').communityResult;
196
+ }
197
+ if (derived.has('processes')) {
198
+ result.processResult = getPhaseOutput(derived, 'processes').processResult;
199
+ }
200
+ };
201
+ }
202
+ return result;
165
203
  };
@@ -252,6 +252,11 @@ function buildReference(site, top) {
252
252
  toDef: top.def.nodeId,
253
253
  atRange: site.atRange,
254
254
  kind: site.kind,
255
+ // The call form survives resolution so the graph bridge can mark
256
+ // construction sites (`callForm: 'constructor'`) on the CALLS edge it
257
+ // emits — a `Reference` otherwise keeps only the resolved def.
258
+ ...(site.kind === 'call' && site.callForm !== undefined ? { callForm: site.callForm } : {}),
259
+ ...(site.kind === 'call' && site.staticGated === true ? { staticGated: true } : {}),
255
260
  confidence: top.confidence,
256
261
  evidence: top.evidence,
257
262
  };
@@ -62,7 +62,23 @@ export interface ModuleConstants {
62
62
  readonly literals: Map<string, string>;
63
63
  readonly exprs: Map<string, readonly Operand[]>;
64
64
  readonly imports: Map<string, ImportBinding>;
65
+ /**
66
+ * On-demand (wildcard) import specifiers whose bound member names could not
67
+ * be enumerated at extract time — Java `import static a.b.C.*;`, Python
68
+ * `from m import *`. The agnostic fold never reads this (it has no way to
69
+ * enumerate a target module's exports); a language binding materializes the
70
+ * promised bindings from a repo-wide map after extraction — see
71
+ * `expandJavaWildcardStaticImports` in the Java binding — so they resolve
72
+ * through the plain `imports` path with no special cases in the fold.
73
+ */
74
+ readonly wildcardImports?: readonly string[];
65
75
  }
76
+ /**
77
+ * Declaration keys a language extractor found but could not fold. Java and
78
+ * Kotlin both use this metadata to keep lower-priority imports from replacing
79
+ * a real local declaration; other producers simply return the empty set.
80
+ */
81
+ export declare function unfoldableDeclarationsOf(mc: ModuleConstants | undefined): ReadonlySet<string>;
66
82
  /** Repo-wide map: unique file key (e.g. `app/constants.py`) → that file's
67
83
  * {@link ModuleConstants}. */
68
84
  export type RepoConstants = ReadonlyMap<string, ModuleConstants>;
@@ -32,6 +32,16 @@ const MAX_RESOLVE_DEPTH = 8;
32
32
  * so we floor to `null` (skip) instead (#2393). The depth cap bounds recursion but
33
33
  * NOT output size, which grows multiplicatively; this bounds the output. */
34
34
  export const MAX_FOLD_LENGTH = 8192;
35
+ const NO_UNFOLDABLE_DECLARATIONS = new Set();
36
+ /**
37
+ * Declaration keys a language extractor found but could not fold. Java and
38
+ * Kotlin both use this metadata to keep lower-priority imports from replacing
39
+ * a real local declaration; other producers simply return the empty set.
40
+ */
41
+ export function unfoldableDeclarationsOf(mc) {
42
+ const declarations = mc?.unfoldableDeclarations;
43
+ return declarations instanceof Set ? declarations : NO_UNFOLDABLE_DECLARATIONS;
44
+ }
35
45
  /**
36
46
  * Fold an operand list to its concatenated literal, or `null` if any operand is
37
47
  * unresolvable (an unknown name, a non-string term, a cycle, or a depth overrun).
@@ -42,6 +42,10 @@
42
42
  import type Parser from 'tree-sitter';
43
43
  import { type ImportResolver, type ModuleConstants, type Operand, type RepoConstants } from './constant-resolver.js';
44
44
  export type { ImportBinding, ModuleConstants, Operand, RepoConstants, } from './constant-resolver.js';
45
+ export interface JavaModuleConstants extends ModuleConstants {
46
+ /** Declaration keys whose initializer exists but cannot be folded. */
47
+ readonly unfoldableDeclarations: ReadonlySet<string>;
48
+ }
45
49
  export declare function isJavaConstantFile(source: string): boolean;
46
50
  /**
47
51
  * The Java {@link ImportResolver}: map a fully-qualified import specifier to
@@ -96,7 +100,7 @@ export declare function parseJavaConstOperands(node: Parser.SyntaxNode | null |
96
100
  * Last-wins in source order; a non-foldable rebind (`X = compute()`) drops X
97
101
  * to unresolvable rather than keeping a stale literal.
98
102
  */
99
- export declare function extractJavaModuleConstants(tree: Parser.Tree): ModuleConstants;
103
+ export declare function extractJavaModuleConstants(tree: Parser.Tree): JavaModuleConstants;
100
104
  /**
101
105
  * Resolve a single Java constant referenced in `fileKey` to its literal string
102
106
  * value, folding `+` concatenation and following import chains via
@@ -112,3 +116,25 @@ export declare function resolveJavaConstant(fileKey: string, name: string, repo:
112
116
  * `fileKey`, or null when any piece is unresolvable (skip floor).
113
117
  */
114
118
  export declare function foldJavaOperands(fileKey: string, operands: readonly Operand[], repo: RepoConstants): string | null;
119
+ /**
120
+ * Constant-defining file keys used by Java import resolution.
121
+ *
122
+ * Build once per repo pass. Recomputing this set for every wildcard-importing
123
+ * controller makes expansion quadratic in controller count.
124
+ */
125
+ export declare function buildJavaConstantKeys(repo: RepoConstants): ReadonlySet<string>;
126
+ export interface JavaConstantIndex {
127
+ readonly keys: ReadonlySet<string>;
128
+ /** Every resolvable path suffix as a dotted module name; null means ambiguous. */
129
+ readonly byModule: ReadonlyMap<string, string | null>;
130
+ /** Direct members by constant-defining file, built once for all importers. */
131
+ readonly membersByFile: ReadonlyMap<string, ReadonlySet<string>>;
132
+ }
133
+ /**
134
+ * Build all Java import suffixes once, turning repeated wildcard target lookup
135
+ * from O(importers × constant files) into O(path segments + importers).
136
+ */
137
+ export declare function buildJavaConstantIndex(repo: RepoConstants): JavaConstantIndex;
138
+ export declare function expandJavaWildcardStaticImports(mc: ModuleConstants, _fileKey: string, repo: RepoConstants, index?: JavaConstantIndex): ModuleConstants;
139
+ /** Prepare every Java constants entry with one shared suffix index. */
140
+ export declare function prepareJavaRouteConstants(repo: RepoConstants): JavaConstantIndex;
@@ -40,7 +40,7 @@
40
40
  * the import is ambiguous and returns null (skip floor), never a wrong path.
41
41
  */
42
42
  import { unquoteSpringLiteral } from './spring-shared.js';
43
- import { MAX_FOLD_LENGTH, } from './constant-resolver.js';
43
+ import { MAX_FOLD_LENGTH, unfoldableDeclarationsOf, } from './constant-resolver.js';
44
44
  /**
45
45
  * Cheap content gate: can this Java file DEFINE a string constant that a route
46
46
  * annotation might reference?
@@ -121,10 +121,15 @@ export const resolveJavaImport = (_importingFileKey, moduleSpec, repoKeys) => {
121
121
  // trimming the last segment when the direct hit fails covers both shapes.
122
122
  const asPath = moduleSpec.replace(/\./g, '/');
123
123
  const classFile = `${asPath}.java`;
124
+ // Compare in POSIX space: on Windows the repo keys can carry backslash
125
+ // separators, which would otherwise never match a '/'-joined class file
126
+ // (observed as 675 calls with zero hits on a backslash-keyed repo).
127
+ const toPosix = (p) => p.replace(/\\/g, '/');
124
128
  // Exact package-path suffix match, unique or nothing.
125
129
  let hit = null;
126
130
  for (const key of repoKeys) {
127
- if (key === classFile || key.endsWith(`/${classFile}`)) {
131
+ const posixKey = toPosix(key);
132
+ if (posixKey === classFile || posixKey.endsWith(`/${classFile}`)) {
128
133
  if (hit !== null)
129
134
  return null; // 2+ modules carry this FQN — unresolvable
130
135
  hit = key;
@@ -251,25 +256,48 @@ export function extractJavaModuleConstants(tree) {
251
256
  const literals = new Map();
252
257
  const exprs = new Map();
253
258
  const imports = new Map();
259
+ const unfoldableDeclarations = new Set();
260
+ // On-demand static imports (`import static a.b.C.*`) — expanded post-map
261
+ // by expandJavaWildcardStaticImports below.
262
+ const wildcardImports = [];
254
263
  // Pass 1: imports (both shapes).
255
264
  const walkImports = (node) => {
256
265
  if (node.type === 'import_declaration') {
257
266
  // import a.b.C; | import static a.b.C; | import static a.b.C.F;
267
+ // import static a.b.C.*; — asterisk is a sibling of scoped_identifier
268
+ // (tree-sitter-java), not the last path segment. Same detection as
269
+ // import-decomposer.ts (`static-wildcard`).
258
270
  const isStatic = node.children.some((c) => c.type === 'static' && c.text === 'static');
259
- const scoped = node.children.find((c) => c.type === 'scoped_identifier');
271
+ const isWildcard = node.children.some((c) => c.type === 'asterisk');
272
+ const scoped = node.children.find((c) => c.type === 'scoped_identifier') ??
273
+ node.children.find((c) => c.type === 'identifier');
260
274
  if (scoped) {
261
275
  const text = scoped.text;
262
- const lastDot = text.lastIndexOf('.');
263
- const fqn = text.slice(0, lastDot);
264
- const name = text.slice(lastDot + 1);
265
- if (isStatic) {
266
- // import static a.b.C.F → local F from module a.b.C, original F.
267
- imports.set(name, { module: fqn, originalName: name });
276
+ if (isStatic && isWildcard) {
277
+ // Class FQN only — members are materialized post-map.
278
+ if (text.length > 0 && !wildcardImports.includes(text)) {
279
+ wildcardImports.push(text);
280
+ }
268
281
  }
269
282
  else {
270
- // import a.b.C → module IS the class FQN; originalName is the class
271
- // simple name. resolveJavaImport maps `a.b.C` → `a/b/C.java`.
272
- imports.set(name, { module: text, originalName: name });
283
+ const lastDot = text.lastIndexOf('.');
284
+ const fqn = text.slice(0, lastDot);
285
+ const name = text.slice(lastDot + 1);
286
+ if (isStatic) {
287
+ // Preserve the declaring type in the target lookup. Constants from
288
+ // multiple types share one file-level map, so a bare `F` could
289
+ // otherwise resolve to a sibling type's flattened field.
290
+ const declaringClass = fqn.slice(fqn.lastIndexOf('.') + 1);
291
+ imports.set(name, {
292
+ module: fqn,
293
+ originalName: `${declaringClass}.${name}`,
294
+ });
295
+ }
296
+ else {
297
+ // import a.b.C → module IS the class FQN; originalName is the class
298
+ // simple name. resolveJavaImport maps `a.b.C` → `a/b/C.java`.
299
+ imports.set(name, { module: text, originalName: name });
300
+ }
273
301
  }
274
302
  }
275
303
  }
@@ -328,6 +356,7 @@ export function extractJavaModuleConstants(tree) {
328
356
  if (operands === null) {
329
357
  literals.delete(name);
330
358
  exprs.delete(name);
359
+ unfoldableDeclarations.add(name);
331
360
  // …and the static IMPORT of the same simple name. A local
332
361
  // `static final String` shadows `import static a.b.C.PATH` inside
333
362
  // that class (JLS 6.4.1), so the correct answer for a non-foldable
@@ -348,9 +377,13 @@ export function extractJavaModuleConstants(tree) {
348
377
  if (qname) {
349
378
  literals.delete(qname);
350
379
  exprs.delete(qname);
380
+ unfoldableDeclarations.add(qname);
351
381
  }
352
382
  continue;
353
383
  }
384
+ unfoldableDeclarations.delete(name);
385
+ if (qname)
386
+ unfoldableDeclarations.delete(qname);
354
387
  const literalValue = operands.length === 1 && operands[0].kind === 'literal'
355
388
  ? operands[0].value
356
389
  : null;
@@ -419,7 +452,13 @@ export function extractJavaModuleConstants(tree) {
419
452
  }
420
453
  };
421
454
  walkTypes(tree.rootNode, false);
422
- return { literals, exprs, imports: imports };
455
+ return {
456
+ literals,
457
+ exprs,
458
+ imports: imports,
459
+ wildcardImports,
460
+ unfoldableDeclarations,
461
+ };
423
462
  }
424
463
  function newFoldState(repo) {
425
464
  const constantKeys = new Set();
@@ -524,6 +563,8 @@ function computeJavaFold(fileKey, name, state, depth) {
524
563
  const expr = mc.exprs.get(name);
525
564
  if (expr !== undefined)
526
565
  return foldOperands(fileKey, expr, state, depth + 1);
566
+ if (unfoldableDeclarationsOf(mc).has(name))
567
+ return null;
527
568
  const imp = mc.imports.get(name);
528
569
  if (imp !== undefined) {
529
570
  const targetFile = resolveJavaImport(fileKey, imp.module, constantKeys);
@@ -567,3 +608,110 @@ export function foldJavaOperands(fileKey, operands, repo) {
567
608
  const out = foldOperands(fileKey, operands, newFoldState(repo), 0);
568
609
  return out === '' ? null : out;
569
610
  }
611
+ /**
612
+ * Constant-defining file keys used by Java import resolution.
613
+ *
614
+ * Build once per repo pass. Recomputing this set for every wildcard-importing
615
+ * controller makes expansion quadratic in controller count.
616
+ */
617
+ export function buildJavaConstantKeys(repo) {
618
+ const repoKeys = new Set();
619
+ for (const [key, target] of repo) {
620
+ if (target.literals.size > 0 || target.exprs.size > 0)
621
+ repoKeys.add(key);
622
+ }
623
+ return repoKeys;
624
+ }
625
+ /** Direct static members owned by `classSimple`, excluding nested-type members. */
626
+ function directJavaMembers(target, classSimple) {
627
+ const members = new Set();
628
+ const prefix = `${classSimple}.`;
629
+ for (const map of [target.literals, target.exprs]) {
630
+ for (const key of map.keys()) {
631
+ if (!key.startsWith(prefix))
632
+ continue;
633
+ const member = key.slice(prefix.length);
634
+ if (member.length > 0 && !member.includes('.'))
635
+ members.add(member);
636
+ }
637
+ }
638
+ return members;
639
+ }
640
+ /**
641
+ * Build all Java import suffixes once, turning repeated wildcard target lookup
642
+ * from O(importers × constant files) into O(path segments + importers).
643
+ */
644
+ export function buildJavaConstantIndex(repo) {
645
+ const keys = buildJavaConstantKeys(repo);
646
+ const byModule = new Map();
647
+ const membersByFile = new Map();
648
+ for (const key of keys) {
649
+ const normalized = key.replace(/\\/g, '/').replace(/^\.\//, '');
650
+ if (!normalized.endsWith('.java'))
651
+ continue;
652
+ const segments = normalized.slice(0, -'.java'.length).split('/');
653
+ const classSimple = segments[segments.length - 1];
654
+ const constants = repo.get(key);
655
+ if (constants)
656
+ membersByFile.set(key, directJavaMembers(constants, classSimple));
657
+ for (let start = 0; start < segments.length; start++) {
658
+ const moduleName = segments.slice(start).join('.');
659
+ const existing = byModule.get(moduleName);
660
+ if (existing === undefined)
661
+ byModule.set(moduleName, key);
662
+ else if (existing !== key)
663
+ byModule.set(moduleName, null);
664
+ }
665
+ }
666
+ return { keys, byModule, membersByFile };
667
+ }
668
+ export function expandJavaWildcardStaticImports(mc, _fileKey, repo, index = buildJavaConstantIndex(repo)) {
669
+ const wildcards = mc.wildcardImports;
670
+ if (!wildcards || wildcards.length === 0)
671
+ return mc;
672
+ // Resolve targets against constant-DEFINING files only. Ingestion's harvest
673
+ // also admits import-only files; measuring uniqueness over every key made
674
+ // a duplicate empty FQN floor ingestion to skip while group still folded
675
+ // (#2980 R4).
676
+ const explicitImports = new Set(mc.imports.keys());
677
+ const pending = new Map();
678
+ for (const fqn of wildcards) {
679
+ const targetKey = index.byModule.get(fqn) ?? null;
680
+ if (targetKey === null)
681
+ continue;
682
+ const classSimple = fqn.slice(fqn.lastIndexOf('.') + 1);
683
+ const members = index.membersByFile.get(targetKey);
684
+ if (!members)
685
+ continue;
686
+ for (const name of members) {
687
+ // Same-file declarations and explicit imports have higher precedence
688
+ // than on-demand imports. An unfoldable declaration must remain a skip,
689
+ // not be resurrected from a wildcard target.
690
+ if (mc.literals.has(name) ||
691
+ mc.exprs.has(name) ||
692
+ unfoldableDeclarationsOf(mc).has(name) ||
693
+ explicitImports.has(name)) {
694
+ continue;
695
+ }
696
+ const binding = { module: fqn, originalName: `${classSimple}.${name}` };
697
+ const previous = pending.get(name);
698
+ if (previous === undefined)
699
+ pending.set(name, binding);
700
+ else if (previous !== null && previous.module !== fqn)
701
+ pending.set(name, null);
702
+ }
703
+ }
704
+ for (const [name, binding] of pending) {
705
+ if (binding !== null)
706
+ mc.imports.set(name, binding);
707
+ }
708
+ return mc;
709
+ }
710
+ /** Prepare every Java constants entry with one shared suffix index. */
711
+ export function prepareJavaRouteConstants(repo) {
712
+ const index = buildJavaConstantIndex(repo);
713
+ for (const [fileKey, mc] of repo) {
714
+ expandJavaWildcardStaticImports(mc, fileKey, repo, index);
715
+ }
716
+ return index;
717
+ }
@@ -95,6 +95,7 @@
95
95
  * @PostMapping(ApiPaths.ORDERS) // qualified
96
96
  * @PostMapping(com.example.app.api.ApiPaths.ORDERS) // FQN-qualified
97
97
  * @PostMapping(ORDERS) // single-name import
98
+ * @PostMapping(ORDERS) after import com.example.api.* // package-star import
98
99
  * @PostMapping(ApiPaths.BASE + "/orders") // inline concat
99
100
  *
100
101
  * Which ANNOTATIONS count as routes is a separate question this module has no
@@ -122,20 +123,16 @@
122
123
  *
123
124
  * WHERE THIS IS WIRED. Java reaches its binding from BOTH layers: the group
124
125
  * extractor (`group/extractors/http-patterns/java.ts`) and the ingestion
125
- * provider (`languages/java.ts`, via `extractModuleConstants` +
126
- * `foldRoutePathOperands`). Kotlin is wired into the GROUP layer only, because
127
- * the ingestion fold in `pipeline-phases/parse-impl.ts` runs exclusively over
128
- * `decoratorRoutes` — and `languages/kotlin.ts` declares no
129
- * `extractDecoratorRoutes`, since the ingestion Spring extractor (`spring.ts`)
130
- * is bound to `tree-sitter-java` and its node types. Declaring the constant
131
- * hooks on the Kotlin provider today would harvest a map on every Kotlin file
132
- * that nothing consumes. An ingestion-side Kotlin route extractor is the
133
- * prerequisite; when it lands, this binding is what its provider hooks should
134
- * point at, and no change here is needed.
126
+ * provider (`languages/java.ts`). Kotlin now does the same: the group extractor
127
+ * (`group/extractors/http-patterns/kotlin.ts`) plus `languages/kotlin.ts`
128
+ * (`extractDecoratorRoutes`, `extractModuleConstants`, `foldRoutePathOperands`).
129
+ * The dedicated ingestion walker is `route-extractors/kotlin-spring.ts`; it
130
+ * does not reuse Java `spring.ts`.
135
131
  */
136
132
  import type Parser from 'tree-sitter';
137
133
  import { type ModuleConstants, type Operand, type RepoConstants } from './constant-resolver.js';
138
134
  export type { ImportBinding, ModuleConstants, Operand, RepoConstants, } from './constant-resolver.js';
135
+ export { unfoldableDeclarationsOf } from './constant-resolver.js';
139
136
  /**
140
137
  * What {@link extractKotlinModuleConstants} returns: the agnostic
141
138
  * {@link ModuleConstants} plus the one piece of per-file metadata JVM import
@@ -162,12 +159,9 @@ export interface KotlinModuleConstants extends ModuleConstants {
162
159
  readonly packageName: string;
163
160
  /** Declaration keys whose initializer cannot be folded. */
164
161
  readonly unfoldableDeclarations: ReadonlySet<string>;
162
+ /** Top-level properties and types that shadow lower-priority star imports. */
163
+ readonly topLevelDeclarations: ReadonlySet<string>;
165
164
  }
166
- /**
167
- * Kotlin declaration keys known to exist but not fold, or an empty set when
168
- * `mc` came from another language binding.
169
- */
170
- export declare function unfoldableDeclarationsOf(mc: ModuleConstants | undefined): ReadonlySet<string>;
171
165
  /**
172
166
  * The name a backtick-quoted Kotlin identifier denotes: `` `api` `` → `api`.
173
167
  *
@@ -294,9 +288,9 @@ export declare function resolveKotlinImportWithIndex(rawModuleSpec: string, inde
294
288
  */
295
289
  export declare function parseKotlinConstOperands(node: Parser.SyntaxNode | null | undefined, depth?: number): Operand[] | null;
296
290
  /**
297
- * Extract the declared package, file-level string constants and import bindings
298
- * of one parsed Kotlin file into the {@link KotlinModuleConstants} shape the
299
- * resolver consumes.
291
+ * Extract the declared package, file-level string constants, named imports and
292
+ * package-star import scopes of one parsed Kotlin file into the
293
+ * {@link KotlinModuleConstants} shape the resolver consumes.
300
294
  *
301
295
  * Constants come from the three carriers Kotlin allows a caller to reach without
302
296
  * an instance: file top level, `object` members, and `companion object` members.