gitnexus 1.6.10-rc.21 → 1.6.10-rc.211

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 (870) hide show
  1. package/README.md +212 -22
  2. package/dist/_shared/graph/types.d.ts +27 -8
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/index.d.ts +4 -3
  5. package/dist/_shared/index.d.ts.map +1 -1
  6. package/dist/_shared/index.js +1 -1
  7. package/dist/_shared/index.js.map +1 -1
  8. package/dist/_shared/integrations/circuit-breaker.d.ts.map +1 -1
  9. package/dist/_shared/integrations/circuit-breaker.js.map +1 -1
  10. package/dist/_shared/integrations/resilient-fetch.d.ts +19 -1
  11. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  12. package/dist/_shared/integrations/resilient-fetch.js +23 -10
  13. package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
  14. package/dist/_shared/language-detection.d.ts.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 +3 -0
  18. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  19. package/dist/_shared/scope-resolution/callable-flow-site.d.ts +110 -0
  20. package/dist/_shared/scope-resolution/callable-flow-site.d.ts.map +1 -0
  21. package/dist/_shared/scope-resolution/callable-flow-site.js +11 -0
  22. package/dist/_shared/scope-resolution/callable-flow-site.js.map +1 -0
  23. package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
  24. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +6 -1
  25. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
  26. package/dist/_shared/scope-resolution/finalize-algorithm.js +316 -37
  27. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  28. package/dist/_shared/scope-resolution/parsed-file.d.ts +7 -0
  29. package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
  30. package/dist/_shared/scope-resolution/reference-site.d.ts +124 -1
  31. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  32. package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
  33. package/dist/_shared/scope-resolution/registries/lookup-core.d.ts.map +1 -1
  34. package/dist/_shared/scope-resolution/registries/lookup-core.js +58 -2
  35. package/dist/_shared/scope-resolution/registries/lookup-core.js.map +1 -1
  36. package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
  37. package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
  38. package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
  39. package/dist/_shared/scope-resolution/symbol-definition.d.ts +47 -0
  40. package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
  41. package/dist/_shared/scope-resolution/types.d.ts +297 -5
  42. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  43. package/dist/cli/ai-context.d.ts +10 -2
  44. package/dist/cli/ai-context.js +128 -61
  45. package/dist/cli/analyze-config.d.ts +1 -1
  46. package/dist/cli/analyze-options.d.ts +131 -0
  47. package/dist/cli/analyze-options.js +1 -0
  48. package/dist/cli/analyze.d.ts +25 -114
  49. package/dist/cli/analyze.js +194 -36
  50. package/dist/cli/cli-message.d.ts +1 -1
  51. package/dist/cli/detect-changes-format.js +19 -2
  52. package/dist/cli/doctor.d.ts +23 -0
  53. package/dist/cli/doctor.js +72 -9
  54. package/dist/cli/editor-targets.js +6 -0
  55. package/dist/cli/eval-server.d.ts +23 -1
  56. package/dist/cli/eval-server.js +128 -9
  57. package/dist/cli/format-symbol.d.ts +15 -0
  58. package/dist/cli/format-symbol.js +17 -0
  59. package/dist/cli/generated-skill.d.ts +17 -0
  60. package/dist/cli/generated-skill.js +1 -0
  61. package/dist/cli/group.js +23 -2
  62. package/dist/cli/help-i18n.js +3 -0
  63. package/dist/cli/i18n/en.d.ts +17 -8
  64. package/dist/cli/i18n/en.js +19 -8
  65. package/dist/cli/i18n/resources.d.ts +26 -8
  66. package/dist/cli/i18n/zh-CN.d.ts +9 -0
  67. package/dist/cli/i18n/zh-CN.js +17 -8
  68. package/dist/cli/index.js +16 -9
  69. package/dist/cli/lazy-action.d.ts +7 -0
  70. package/dist/cli/lazy-action.js +27 -0
  71. package/dist/cli/mcp.js +6 -3
  72. package/dist/cli/resolve-invocation.d.ts +7 -3
  73. package/dist/cli/resolve-invocation.js +7 -3
  74. package/dist/cli/setup.d.ts +8 -0
  75. package/dist/cli/setup.js +30 -7
  76. package/dist/cli/skill-gen.d.ts +1 -6
  77. package/dist/cli/skill-gen.js +88 -18
  78. package/dist/cli/standard-skills.d.ts +76 -0
  79. package/dist/cli/standard-skills.js +45 -0
  80. package/dist/cli/status.d.ts +4 -1
  81. package/dist/cli/status.js +57 -4
  82. package/dist/cli/tool.d.ts +1 -0
  83. package/dist/cli/tool.js +75 -7
  84. package/dist/cli/uninstall.js +7 -2
  85. package/dist/cli/wiki.d.ts +1 -0
  86. package/dist/cli/wiki.js +59 -10
  87. package/dist/config/ignore-service.d.ts +2 -0
  88. package/dist/config/ignore-service.js +31 -4
  89. package/dist/core/analysis-features.d.ts +21 -0
  90. package/dist/core/analysis-features.js +59 -0
  91. package/dist/core/analyzer-identity.d.ts +154 -0
  92. package/dist/core/analyzer-identity.js +2158 -0
  93. package/dist/core/augmentation/engine.js +95 -76
  94. package/dist/core/embedding-checkpoint.d.ts +143 -0
  95. package/dist/core/embedding-checkpoint.js +221 -0
  96. package/dist/core/embedding-count.d.ts +61 -0
  97. package/dist/core/embedding-count.js +69 -0
  98. package/dist/core/embeddings/ast-utils.js +9 -1
  99. package/dist/core/embeddings/embedder.d.ts +3 -2
  100. package/dist/core/embeddings/embedder.js +8 -5
  101. package/dist/core/embeddings/embedding-identity.d.ts +11 -0
  102. package/dist/core/embeddings/embedding-identity.js +24 -0
  103. package/dist/core/embeddings/embedding-pipeline.d.ts +24 -1
  104. package/dist/core/embeddings/embedding-pipeline.js +341 -19
  105. package/dist/core/embeddings/http-client.d.ts +10 -2
  106. package/dist/core/embeddings/http-client.js +282 -47
  107. package/dist/core/embeddings/node-module-compat.d.ts +4 -2
  108. package/dist/core/embeddings/node-module-compat.js +4 -2
  109. package/dist/core/embeddings/onnxruntime-common-resolver.js +5 -5
  110. package/dist/core/embeddings/onnxruntime-node-resolver.js +2 -2
  111. package/dist/core/embeddings/runtime-install.js +1 -1
  112. package/dist/core/git-staleness.js +1 -1
  113. package/dist/core/graph/graph.js +3 -0
  114. package/dist/core/graph/import-cycles.d.ts +194 -3
  115. package/dist/core/graph/import-cycles.js +522 -73
  116. package/dist/core/graph/types.d.ts +18 -0
  117. package/dist/core/group/bridge-db.js +5 -27
  118. package/dist/core/group/cross-impact.d.ts +21 -0
  119. package/dist/core/group/cross-impact.js +128 -15
  120. package/dist/core/group/cross-trace.js +27 -16
  121. package/dist/core/group/extractors/http-patterns/java.js +91 -14
  122. package/dist/core/group/extractors/http-patterns/node.js +19 -0
  123. package/dist/core/group/extractors/http-patterns/types.d.ts +8 -0
  124. package/dist/core/group/extractors/http-route-extractor.d.ts +1 -0
  125. package/dist/core/group/extractors/http-route-extractor.js +122 -48
  126. package/dist/core/group/extractors/include-extractor.js +20 -2
  127. package/dist/core/group/extractors/manifest-extractor.d.ts +1 -1
  128. package/dist/core/group/extractors/manifest-extractor.js +7 -7
  129. package/dist/core/group/service.js +10 -1
  130. package/dist/core/group/storage.js +2 -33
  131. package/dist/core/group/types.d.ts +18 -0
  132. package/dist/core/incremental/subgraph-extract.d.ts +9 -6
  133. package/dist/core/incremental/subgraph-extract.js +33 -10
  134. package/dist/core/index-freshness.d.ts +80 -0
  135. package/dist/core/index-freshness.js +120 -0
  136. package/dist/core/ingestion/call-processor.d.ts +13 -1
  137. package/dist/core/ingestion/call-processor.js +110 -3
  138. package/dist/core/ingestion/cfg/callee-cell-format.d.ts +42 -0
  139. package/dist/core/ingestion/cfg/callee-cell-format.js +42 -0
  140. package/dist/core/ingestion/cfg/emit.d.ts +8 -23
  141. package/dist/core/ingestion/cfg/emit.js +9 -23
  142. package/dist/core/ingestion/class-extractors/configs/go.js +10 -5
  143. package/dist/core/ingestion/class-extractors/configs/jvm.js +29 -0
  144. package/dist/core/ingestion/cluster-enricher.js +8 -4
  145. package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
  146. package/dist/core/ingestion/community-processor.d.ts +21 -3
  147. package/dist/core/ingestion/community-processor.js +88 -83
  148. package/dist/core/ingestion/di-extractors/index.d.ts +22 -34
  149. package/dist/core/ingestion/di-extractors/index.js +17 -18
  150. package/dist/core/ingestion/di-extractors/spring.d.ts +27 -5
  151. package/dist/core/ingestion/di-extractors/spring.js +87 -3
  152. package/dist/core/ingestion/di-extractors/types.d.ts +60 -0
  153. package/dist/core/ingestion/di-extractors/types.js +15 -0
  154. package/dist/core/ingestion/emit-references.js +4 -0
  155. package/dist/core/ingestion/filesystem-walker.js +16 -12
  156. package/dist/core/ingestion/finalize-orchestrator.js +1 -0
  157. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +9 -0
  158. package/dist/core/ingestion/frameworks/spring/analysis-features.js +41 -0
  159. package/dist/core/ingestion/frameworks/spring/annotation-arguments.d.ts +13 -0
  160. package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +227 -0
  161. package/dist/core/ingestion/frameworks/spring/aop-candidates.d.ts +15 -0
  162. package/dist/core/ingestion/frameworks/spring/aop-candidates.js +85 -0
  163. package/dist/core/ingestion/frameworks/spring/aop.d.ts +118 -0
  164. package/dist/core/ingestion/frameworks/spring/aop.js +476 -0
  165. package/dist/core/ingestion/frameworks/spring/auto-configuration.d.ts +8 -0
  166. package/dist/core/ingestion/frameworks/spring/auto-configuration.js +16 -0
  167. package/dist/core/ingestion/frameworks/spring/bean-candidates.d.ts +30 -0
  168. package/dist/core/ingestion/frameworks/spring/bean-candidates.js +182 -0
  169. package/dist/core/ingestion/frameworks/spring/bean-catalog.d.ts +12 -0
  170. package/dist/core/ingestion/frameworks/spring/bean-catalog.js +27 -0
  171. package/dist/core/ingestion/frameworks/spring/bean-factories.d.ts +33 -0
  172. package/dist/core/ingestion/frameworks/spring/bean-factories.js +65 -0
  173. package/dist/core/ingestion/frameworks/spring/conditionals.d.ts +25 -0
  174. package/dist/core/ingestion/frameworks/spring/conditionals.js +319 -0
  175. package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +24 -0
  176. package/dist/core/ingestion/frameworks/spring/config-bindings.js +115 -0
  177. package/dist/core/ingestion/frameworks/spring/di-metadata.d.ts +48 -0
  178. package/dist/core/ingestion/frameworks/spring/di-metadata.js +379 -0
  179. package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +28 -0
  180. package/dist/core/ingestion/frameworks/spring/non-http-handlers.js +152 -0
  181. package/dist/core/ingestion/frameworks/spring/resource-injection.d.ts +5 -0
  182. package/dist/core/ingestion/frameworks/spring/resource-injection.js +91 -0
  183. package/dist/core/ingestion/import-resolvers/configs/csharp.js +5 -1
  184. package/dist/core/ingestion/import-resolvers/configs/swift.js +13 -0
  185. package/dist/core/ingestion/import-resolvers/csharp.d.ts +9 -1
  186. package/dist/core/ingestion/import-resolvers/csharp.js +234 -27
  187. package/dist/core/ingestion/import-resolvers/go.d.ts +11 -1
  188. package/dist/core/ingestion/import-resolvers/go.js +44 -17
  189. package/dist/core/ingestion/import-resolvers/jvm.d.ts +2 -2
  190. package/dist/core/ingestion/import-resolvers/node-workspace-packages.d.ts +90 -0
  191. package/dist/core/ingestion/import-resolvers/node-workspace-packages.js +428 -0
  192. package/dist/core/ingestion/import-resolvers/package-dir-index.d.ts +124 -0
  193. package/dist/core/ingestion/import-resolvers/package-dir-index.js +223 -0
  194. package/dist/core/ingestion/import-resolvers/pass-cache.d.ts +50 -0
  195. package/dist/core/ingestion/import-resolvers/pass-cache.js +60 -0
  196. package/dist/core/ingestion/import-resolvers/per-file-set.d.ts +71 -0
  197. package/dist/core/ingestion/import-resolvers/per-file-set.js +11 -0
  198. package/dist/core/ingestion/import-resolvers/php.d.ts +1 -1
  199. package/dist/core/ingestion/import-resolvers/php.js +27 -8
  200. package/dist/core/ingestion/import-resolvers/python-file-index.d.ts +201 -0
  201. package/dist/core/ingestion/import-resolvers/python-file-index.js +302 -0
  202. package/dist/core/ingestion/import-resolvers/python.js +25 -6
  203. package/dist/core/ingestion/import-resolvers/ruby.d.ts +1 -1
  204. package/dist/core/ingestion/import-resolvers/rust.d.ts +2 -2
  205. package/dist/core/ingestion/import-resolvers/standard.d.ts +1 -1
  206. package/dist/core/ingestion/import-resolvers/types.d.ts +1 -12
  207. package/dist/core/ingestion/import-resolvers/utils.d.ts +65 -6
  208. package/dist/core/ingestion/import-resolvers/utils.js +215 -36
  209. package/dist/core/ingestion/import-resolvers/workspace-file-index.d.ts +72 -0
  210. package/dist/core/ingestion/import-resolvers/workspace-file-index.js +58 -0
  211. package/dist/core/ingestion/language-config.d.ts +20 -1
  212. package/dist/core/ingestion/language-config.js +18 -23
  213. package/dist/core/ingestion/language-provider.d.ts +133 -7
  214. package/dist/core/ingestion/languages/c/captures.js +63 -0
  215. package/dist/core/ingestion/languages/c/import-target.js +12 -16
  216. package/dist/core/ingestion/languages/c/query.js +17 -0
  217. package/dist/core/ingestion/languages/c/scope-resolver.js +26 -19
  218. package/dist/core/ingestion/languages/c/static-linkage.js +12 -16
  219. package/dist/core/ingestion/languages/c-cpp.js +13 -0
  220. package/dist/core/ingestion/languages/cobol/captures.js +93 -0
  221. package/dist/core/ingestion/languages/cobol/scope-resolver.js +34 -20
  222. package/dist/core/ingestion/languages/cobol.js +13 -0
  223. package/dist/core/ingestion/languages/cpp/adl.d.ts +2 -2
  224. package/dist/core/ingestion/languages/cpp/adl.js +67 -44
  225. package/dist/core/ingestion/languages/cpp/captures.js +222 -3
  226. package/dist/core/ingestion/languages/cpp/file-local-linkage.js +11 -15
  227. package/dist/core/ingestion/languages/cpp/inline-namespaces.d.ts +28 -8
  228. package/dist/core/ingestion/languages/cpp/inline-namespaces.js +242 -68
  229. package/dist/core/ingestion/languages/cpp/interpret.d.ts +2 -0
  230. package/dist/core/ingestion/languages/cpp/interpret.js +126 -6
  231. package/dist/core/ingestion/languages/cpp/query.js +106 -0
  232. package/dist/core/ingestion/languages/cpp/scope-resolver.js +62 -20
  233. package/dist/core/ingestion/languages/csharp/accessor-unwrap.d.ts +2 -15
  234. package/dist/core/ingestion/languages/csharp/accessor-unwrap.js +18 -10
  235. package/dist/core/ingestion/languages/csharp/captures.js +44 -0
  236. package/dist/core/ingestion/languages/csharp/import-target.js +46 -72
  237. package/dist/core/ingestion/languages/csharp/namespace-siblings.js +5 -1
  238. package/dist/core/ingestion/languages/csharp/query.js +25 -5
  239. package/dist/core/ingestion/languages/csharp/scope-resolver.js +75 -2
  240. package/dist/core/ingestion/languages/dart/captures.d.ts +10 -0
  241. package/dist/core/ingestion/languages/dart/captures.js +686 -16
  242. package/dist/core/ingestion/languages/dart/extension-type-preprocess.d.ts +7 -0
  243. package/dist/core/ingestion/languages/dart/extension-type-preprocess.js +30 -0
  244. package/dist/core/ingestion/languages/dart/import-target.js +32 -9
  245. package/dist/core/ingestion/languages/dart/index.d.ts +1 -1
  246. package/dist/core/ingestion/languages/dart/index.js +1 -1
  247. package/dist/core/ingestion/languages/dart/query.js +98 -1
  248. package/dist/core/ingestion/languages/dart/scope-resolver.js +14 -3
  249. package/dist/core/ingestion/languages/dart/simple-hooks.js +9 -0
  250. package/dist/core/ingestion/languages/dart.js +8 -1
  251. package/dist/core/ingestion/languages/go/captures.js +142 -3
  252. package/dist/core/ingestion/languages/go/generic-type-parameters.d.ts +31 -0
  253. package/dist/core/ingestion/languages/go/generic-type-parameters.js +140 -0
  254. package/dist/core/ingestion/languages/go/import-target.d.ts +3 -10
  255. package/dist/core/ingestion/languages/go/import-target.js +34 -30
  256. package/dist/core/ingestion/languages/go/index.d.ts +1 -1
  257. package/dist/core/ingestion/languages/go/interface-impls.d.ts +9 -1
  258. package/dist/core/ingestion/languages/go/interface-impls.js +693 -87
  259. package/dist/core/ingestion/languages/go/interpret.d.ts +2 -0
  260. package/dist/core/ingestion/languages/go/interpret.js +22 -8
  261. package/dist/core/ingestion/languages/go/method-owners.js +31 -12
  262. package/dist/core/ingestion/languages/go/package-clause.d.ts +46 -0
  263. package/dist/core/ingestion/languages/go/package-clause.js +75 -0
  264. package/dist/core/ingestion/languages/go/package-siblings.js +7 -11
  265. package/dist/core/ingestion/languages/go/query.js +56 -3
  266. package/dist/core/ingestion/languages/go/scope-resolver.js +39 -0
  267. package/dist/core/ingestion/languages/go.js +9 -0
  268. package/dist/core/ingestion/languages/java/analysis-features.d.ts +7 -0
  269. package/dist/core/ingestion/languages/java/analysis-features.js +25 -0
  270. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +38 -0
  271. package/dist/core/ingestion/languages/java/capture-side-channel.js +124 -0
  272. package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
  273. package/dist/core/ingestion/languages/java/captures.js +321 -49
  274. package/dist/core/ingestion/languages/java/import-target.d.ts +49 -9
  275. package/dist/core/ingestion/languages/java/import-target.js +68 -88
  276. package/dist/core/ingestion/languages/java/interpret.js +3 -2
  277. package/dist/core/ingestion/languages/java/module-resolution.d.ts +62 -0
  278. package/dist/core/ingestion/languages/java/module-resolution.js +142 -0
  279. package/dist/core/ingestion/languages/java/package-facts.d.ts +5 -0
  280. package/dist/core/ingestion/languages/java/package-facts.js +9 -0
  281. package/dist/core/ingestion/languages/java/package-siblings.d.ts +3 -16
  282. package/dist/core/ingestion/languages/java/package-siblings.js +8 -147
  283. package/dist/core/ingestion/languages/java/query.js +39 -3
  284. package/dist/core/ingestion/languages/java/record-components.d.ts +14 -0
  285. package/dist/core/ingestion/languages/java/record-components.js +185 -0
  286. package/dist/core/ingestion/languages/java/scope-resolver.js +35 -2
  287. package/dist/core/ingestion/languages/java/spring-aop.d.ts +12 -0
  288. package/dist/core/ingestion/languages/java/spring-aop.js +49 -0
  289. package/dist/core/ingestion/languages/java/spring-bean-metadata.d.ts +2 -0
  290. package/dist/core/ingestion/languages/java/spring-bean-metadata.js +8 -0
  291. package/dist/core/ingestion/languages/java/spring-conditionals.d.ts +11 -0
  292. package/dist/core/ingestion/languages/java/spring-conditionals.js +48 -0
  293. package/dist/core/ingestion/languages/java/spring-config-bindings.d.ts +23 -0
  294. package/dist/core/ingestion/languages/java/spring-config-bindings.js +215 -0
  295. package/dist/core/ingestion/languages/java/spring-di.d.ts +20 -0
  296. package/dist/core/ingestion/languages/java/spring-di.js +160 -0
  297. package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +7 -0
  298. package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +32 -0
  299. package/dist/core/ingestion/languages/java.js +76 -3
  300. package/dist/core/ingestion/languages/javascript/captures.d.ts +6 -1
  301. package/dist/core/ingestion/languages/javascript/captures.js +278 -4
  302. package/dist/core/ingestion/languages/javascript/import-target.d.ts +17 -21
  303. package/dist/core/ingestion/languages/javascript/import-target.js +24 -41
  304. package/dist/core/ingestion/languages/javascript/index.d.ts +54 -5
  305. package/dist/core/ingestion/languages/javascript/index.js +54 -5
  306. package/dist/core/ingestion/languages/javascript/query.d.ts +1 -0
  307. package/dist/core/ingestion/languages/javascript/query.js +232 -5
  308. package/dist/core/ingestion/languages/javascript/scope-resolver.js +12 -0
  309. package/dist/core/ingestion/languages/javascript/simple-hooks.js +2 -1
  310. package/dist/core/ingestion/languages/jvm/package-facts.d.ts +35 -0
  311. package/dist/core/ingestion/languages/jvm/package-facts.js +40 -0
  312. package/dist/core/ingestion/languages/jvm/package-siblings.d.ts +14 -0
  313. package/dist/core/ingestion/languages/jvm/package-siblings.js +197 -0
  314. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +40 -3
  315. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +111 -8
  316. package/dist/core/ingestion/languages/kotlin/captures.js +112 -0
  317. package/dist/core/ingestion/languages/kotlin/import-target.d.ts +8 -1
  318. package/dist/core/ingestion/languages/kotlin/import-target.js +20 -123
  319. package/dist/core/ingestion/languages/kotlin/index.d.ts +1 -0
  320. package/dist/core/ingestion/languages/kotlin/index.js +1 -0
  321. package/dist/core/ingestion/languages/kotlin/module-resolution.d.ts +22 -0
  322. package/dist/core/ingestion/languages/kotlin/module-resolution.js +108 -0
  323. package/dist/core/ingestion/languages/kotlin/package-facts.d.ts +5 -0
  324. package/dist/core/ingestion/languages/kotlin/package-facts.js +9 -0
  325. package/dist/core/ingestion/languages/kotlin/package-siblings.d.ts +4 -0
  326. package/dist/core/ingestion/languages/kotlin/package-siblings.js +8 -0
  327. package/dist/core/ingestion/languages/kotlin/query.js +47 -2
  328. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +36 -3
  329. package/dist/core/ingestion/languages/kotlin/spring-aop.d.ts +12 -0
  330. package/dist/core/ingestion/languages/kotlin/spring-aop.js +64 -0
  331. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.d.ts +2 -0
  332. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.js +8 -0
  333. package/dist/core/ingestion/languages/kotlin/spring-conditionals.d.ts +12 -0
  334. package/dist/core/ingestion/languages/kotlin/spring-conditionals.js +49 -0
  335. package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +20 -0
  336. package/dist/core/ingestion/languages/kotlin/spring-di.js +299 -0
  337. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +10 -0
  338. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +41 -0
  339. package/dist/core/ingestion/languages/kotlin.js +5 -6
  340. package/dist/core/ingestion/languages/php/captures.d.ts +5 -0
  341. package/dist/core/ingestion/languages/php/captures.js +359 -51
  342. package/dist/core/ingestion/languages/php/import-decomposer.js +12 -0
  343. package/dist/core/ingestion/languages/php/import-target.d.ts +2 -1
  344. package/dist/core/ingestion/languages/php/import-target.js +229 -7
  345. package/dist/core/ingestion/languages/php/interpret.js +10 -0
  346. package/dist/core/ingestion/languages/php/query.js +31 -0
  347. package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
  348. package/dist/core/ingestion/languages/python/arity-metadata.d.ts +1 -0
  349. package/dist/core/ingestion/languages/python/arity-metadata.js +1 -0
  350. package/dist/core/ingestion/languages/python/captures.d.ts +3 -4
  351. package/dist/core/ingestion/languages/python/captures.js +53 -5
  352. package/dist/core/ingestion/languages/python/import-decomposer.js +22 -1
  353. package/dist/core/ingestion/languages/python/import-target.d.ts +42 -1
  354. package/dist/core/ingestion/languages/python/import-target.js +277 -91
  355. package/dist/core/ingestion/languages/python/index.d.ts +1 -1
  356. package/dist/core/ingestion/languages/python/index.js +1 -1
  357. package/dist/core/ingestion/languages/python/interpret.d.ts +52 -0
  358. package/dist/core/ingestion/languages/python/interpret.js +249 -3
  359. package/dist/core/ingestion/languages/python/query.js +9 -0
  360. package/dist/core/ingestion/languages/python/receiver-binding.d.ts +17 -2
  361. package/dist/core/ingestion/languages/python/receiver-binding.js +192 -2
  362. package/dist/core/ingestion/languages/python/scope-resolver.js +27 -4
  363. package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
  364. package/dist/core/ingestion/languages/python/simple-hooks.js +9 -5
  365. package/dist/core/ingestion/languages/ruby/captures.js +200 -0
  366. package/dist/core/ingestion/languages/ruby/import-target.js +7 -5
  367. package/dist/core/ingestion/languages/ruby/query.js +93 -0
  368. package/dist/core/ingestion/languages/ruby/scope-resolver.js +2 -0
  369. package/dist/core/ingestion/languages/ruby/simple-hooks.d.ts +1 -1
  370. package/dist/core/ingestion/languages/ruby/simple-hooks.js +22 -1
  371. package/dist/core/ingestion/languages/rust/captures.js +52 -1
  372. package/dist/core/ingestion/languages/rust/interpret.js +18 -0
  373. package/dist/core/ingestion/languages/rust/method-owners.js +11 -1
  374. package/dist/core/ingestion/languages/rust/module-path.d.ts +126 -0
  375. package/dist/core/ingestion/languages/rust/module-path.js +214 -0
  376. package/dist/core/ingestion/languages/rust/qualified-call.d.ts +41 -0
  377. package/dist/core/ingestion/languages/rust/qualified-call.js +481 -0
  378. package/dist/core/ingestion/languages/rust/query.js +48 -6
  379. package/dist/core/ingestion/languages/rust/range-binding.d.ts +1 -11
  380. package/dist/core/ingestion/languages/rust/range-binding.js +149 -63
  381. package/dist/core/ingestion/languages/rust/scope-resolver.js +21 -2
  382. package/dist/core/ingestion/languages/rust.js +17 -0
  383. package/dist/core/ingestion/languages/swift/captures.js +99 -3
  384. package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.d.ts +48 -0
  385. package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.js +253 -0
  386. package/dist/core/ingestion/languages/swift/import-target.js +4 -9
  387. package/dist/core/ingestion/languages/swift/query.js +17 -0
  388. package/dist/core/ingestion/languages/swift/receiver-binding.d.ts +8 -0
  389. package/dist/core/ingestion/languages/swift/receiver-binding.js +6 -2
  390. package/dist/core/ingestion/languages/swift.js +2 -0
  391. package/dist/core/ingestion/languages/typescript/captures.d.ts +90 -1
  392. package/dist/core/ingestion/languages/typescript/captures.js +288 -5
  393. package/dist/core/ingestion/languages/typescript/cjs-export-assignment.d.ts +134 -0
  394. package/dist/core/ingestion/languages/typescript/cjs-export-assignment.js +523 -0
  395. package/dist/core/ingestion/languages/typescript/cjs-module-exports.d.ts +54 -0
  396. package/dist/core/ingestion/languages/typescript/cjs-module-exports.js +191 -0
  397. package/dist/core/ingestion/languages/typescript/file-candidates.d.ts +29 -0
  398. package/dist/core/ingestion/languages/typescript/file-candidates.js +70 -0
  399. package/dist/core/ingestion/languages/typescript/import-decomposer.d.ts +28 -1
  400. package/dist/core/ingestion/languages/typescript/import-decomposer.js +125 -10
  401. package/dist/core/ingestion/languages/typescript/import-target.d.ts +25 -37
  402. package/dist/core/ingestion/languages/typescript/import-target.js +24 -26
  403. package/dist/core/ingestion/languages/typescript/interpret.d.ts +21 -1
  404. package/dist/core/ingestion/languages/typescript/interpret.js +45 -5
  405. package/dist/core/ingestion/languages/typescript/module-resolution.d.ts +48 -0
  406. package/dist/core/ingestion/languages/typescript/module-resolution.js +171 -0
  407. package/dist/core/ingestion/languages/typescript/nuxt-auto-imports.js +2 -1
  408. package/dist/core/ingestion/languages/typescript/query.d.ts +1 -0
  409. package/dist/core/ingestion/languages/typescript/query.js +340 -14
  410. package/dist/core/ingestion/languages/typescript/receiver-binding.d.ts +17 -0
  411. package/dist/core/ingestion/languages/typescript/receiver-binding.js +27 -0
  412. package/dist/core/ingestion/languages/typescript/scope-resolver.js +27 -40
  413. package/dist/core/ingestion/languages/typescript/simple-hooks.d.ts +0 -10
  414. package/dist/core/ingestion/languages/typescript/simple-hooks.js +22 -22
  415. package/dist/core/ingestion/languages/typescript/tsconfig.d.ts +59 -0
  416. package/dist/core/ingestion/languages/typescript/tsconfig.js +291 -0
  417. package/dist/core/ingestion/languages/typescript.js +87 -1
  418. package/dist/core/ingestion/languages/vue/import-target.d.ts +6 -22
  419. package/dist/core/ingestion/languages/vue/import-target.js +11 -47
  420. package/dist/core/ingestion/languages/vue/scope-resolver.js +4 -2
  421. package/dist/core/ingestion/local-symbol-pruner.js +11 -11
  422. package/dist/core/ingestion/method-extractors/configs/csharp.js +1 -0
  423. package/dist/core/ingestion/method-extractors/generic.js +1 -0
  424. package/dist/core/ingestion/method-types.d.ts +16 -0
  425. package/dist/core/ingestion/parsing-processor.js +32 -1
  426. package/dist/core/ingestion/pipeline-phases/di.d.ts +8 -33
  427. package/dist/core/ingestion/pipeline-phases/di.js +275 -157
  428. package/dist/core/ingestion/pipeline-phases/index.d.ts +3 -0
  429. package/dist/core/ingestion/pipeline-phases/index.js +3 -0
  430. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +15 -0
  431. package/dist/core/ingestion/pipeline-phases/parse-impl.js +158 -3
  432. package/dist/core/ingestion/pipeline-phases/parse.js +5 -0
  433. package/dist/core/ingestion/pipeline-phases/processes.d.ts +11 -2
  434. package/dist/core/ingestion/pipeline-phases/processes.js +102 -7
  435. package/dist/core/ingestion/pipeline-phases/routes.js +56 -10
  436. package/dist/core/ingestion/pipeline-phases/spring-aop.d.ts +34 -0
  437. package/dist/core/ingestion/pipeline-phases/spring-aop.js +439 -0
  438. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +34 -0
  439. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +255 -0
  440. package/dist/core/ingestion/pipeline-phases/spring-config.d.ts +37 -0
  441. package/dist/core/ingestion/pipeline-phases/spring-config.js +433 -0
  442. package/dist/core/ingestion/pipeline-phases/types.d.ts +7 -0
  443. package/dist/core/ingestion/pipeline.d.ts +27 -3
  444. package/dist/core/ingestion/pipeline.js +62 -12
  445. package/dist/core/ingestion/process-processor.d.ts +109 -2
  446. package/dist/core/ingestion/process-processor.js +464 -52
  447. package/dist/core/ingestion/resolve-references.d.ts +6 -1
  448. package/dist/core/ingestion/resolve-references.js +78 -6
  449. package/dist/core/ingestion/route-extractors/data-route-table.d.ts +25 -0
  450. package/dist/core/ingestion/route-extractors/data-route-table.js +864 -0
  451. package/dist/core/ingestion/route-extractors/dispatch-guard.d.ts +96 -0
  452. package/dist/core/ingestion/route-extractors/dispatch-guard.js +1184 -0
  453. package/dist/core/ingestion/route-extractors/spring-shared.d.ts +11 -0
  454. package/dist/core/ingestion/route-extractors/spring-shared.js +89 -0
  455. package/dist/core/ingestion/route-extractors/spring.js +109 -24
  456. package/dist/core/ingestion/scope-extractor-bridge.js +9 -1
  457. package/dist/core/ingestion/scope-extractor.d.ts +22 -7
  458. package/dist/core/ingestion/scope-extractor.js +617 -59
  459. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +381 -22
  460. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +16 -5
  461. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +7 -7
  462. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +8 -7
  463. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +15 -1
  464. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +53 -0
  465. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +20 -15
  466. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +275 -41
  467. package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.d.ts +123 -0
  468. package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +171 -17
  469. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.d.ts +56 -1
  470. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +130 -32
  471. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +30 -1
  472. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +46 -3
  473. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +64 -0
  474. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1233 -0
  475. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +107 -5
  476. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +590 -33
  477. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +19 -4
  478. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +160 -4
  479. package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.d.ts +34 -0
  480. package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.js +62 -0
  481. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +64 -0
  482. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +118 -0
  483. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +109 -8
  484. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +931 -92
  485. package/dist/core/ingestion/scope-resolution/passes/return-shape-members.d.ts +58 -0
  486. package/dist/core/ingestion/scope-resolution/passes/return-shape-members.js +458 -0
  487. package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.d.ts +180 -0
  488. package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.js +418 -0
  489. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +34 -0
  490. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +82 -38
  491. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +61 -1
  492. package/dist/core/ingestion/scope-resolution/pipeline/run.js +384 -48
  493. package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +112 -2
  494. package/dist/core/ingestion/scope-resolution/resolution-outcome.js +38 -1
  495. package/dist/core/ingestion/scope-resolution/scope/namespace-targets.d.ts +25 -3
  496. package/dist/core/ingestion/scope-resolution/scope/namespace-targets.js +36 -16
  497. package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +210 -9
  498. package/dist/core/ingestion/scope-resolution/scope/walkers.js +968 -56
  499. package/dist/core/ingestion/scope-resolution/summary-maps.d.ts +28 -0
  500. package/dist/core/ingestion/scope-resolution/summary-maps.js +50 -0
  501. package/dist/core/ingestion/scope-resolution/undecided-satisfaction.d.ts +55 -0
  502. package/dist/core/ingestion/scope-resolution/undecided-satisfaction.js +37 -0
  503. package/dist/core/ingestion/scope-resolution/unresolved-receivers.d.ts +109 -0
  504. package/dist/core/ingestion/scope-resolution/unresolved-receivers.js +204 -0
  505. package/dist/core/ingestion/scope-resolution/utils/definition-id.d.ts +13 -0
  506. package/dist/core/ingestion/scope-resolution/utils/definition-id.js +19 -0
  507. package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.d.ts +171 -0
  508. package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.js +218 -0
  509. package/dist/core/ingestion/scope-resolution/workspace-index-types.d.ts +34 -0
  510. package/dist/core/ingestion/scope-resolution/workspace-index-types.js +15 -0
  511. package/dist/core/ingestion/scope-resolution/workspace-index.d.ts +7 -20
  512. package/dist/core/ingestion/taint/typescript-model.js +34 -2
  513. package/dist/core/ingestion/tree-sitter-queries.d.ts +11 -11
  514. package/dist/core/ingestion/tree-sitter-queries.js +688 -5
  515. package/dist/core/ingestion/type-env.js +11 -7
  516. package/dist/core/ingestion/type-extractors/jvm.js +17 -2
  517. package/dist/core/ingestion/type-extractors/shared.d.ts +17 -0
  518. package/dist/core/ingestion/type-extractors/shared.js +16 -0
  519. package/dist/core/ingestion/type-extractors/types.d.ts +12 -0
  520. package/dist/core/ingestion/type-extractors/typescript.d.ts +20 -0
  521. package/dist/core/ingestion/type-extractors/typescript.js +26 -0
  522. package/dist/core/ingestion/utils/ast-helpers.d.ts +311 -14
  523. package/dist/core/ingestion/utils/ast-helpers.js +745 -48
  524. package/dist/core/ingestion/utils/call-analysis.d.ts +27 -22
  525. package/dist/core/ingestion/utils/call-analysis.js +202 -7
  526. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +153 -0
  527. package/dist/core/ingestion/utils/callable-flow-captures.js +928 -0
  528. package/dist/core/ingestion/utils/callable-labels.d.ts +25 -0
  529. package/dist/core/ingestion/utils/callable-labels.js +31 -0
  530. package/dist/core/ingestion/utils/effective-ram.d.ts +40 -0
  531. package/dist/core/ingestion/utils/effective-ram.js +58 -0
  532. package/dist/core/ingestion/utils/line-base.d.ts +14 -0
  533. package/dist/core/ingestion/utils/line-base.js +14 -0
  534. package/dist/core/ingestion/utils/method-props.d.ts +27 -4
  535. package/dist/core/ingestion/utils/method-props.js +29 -4
  536. package/dist/core/ingestion/utils/receiver-chain-captures.d.ts +31 -0
  537. package/dist/core/ingestion/utils/receiver-chain-captures.js +57 -0
  538. package/dist/core/ingestion/utils/receiver-chain-codec.d.ts +89 -0
  539. package/dist/core/ingestion/utils/receiver-chain-codec.js +182 -0
  540. package/dist/core/ingestion/utils/scope-tree-walk.d.ts +22 -0
  541. package/dist/core/ingestion/utils/scope-tree-walk.js +33 -0
  542. package/dist/core/ingestion/utils/template-arguments.d.ts +96 -0
  543. package/dist/core/ingestion/utils/template-arguments.js +196 -0
  544. package/dist/core/ingestion/utils/type-parameters.d.ts +49 -0
  545. package/dist/core/ingestion/utils/type-parameters.js +206 -0
  546. package/dist/core/ingestion/workers/callable-id.d.ts +72 -0
  547. package/dist/core/ingestion/workers/callable-id.js +116 -0
  548. package/dist/core/ingestion/workers/parse-worker.d.ts +14 -1
  549. package/dist/core/ingestion/workers/parse-worker.js +409 -39
  550. package/dist/core/ingestion/workers/worker-pool.d.ts +34 -27
  551. package/dist/core/ingestion/workers/worker-pool.js +133 -25
  552. package/dist/core/lbug/csv-generator.d.ts +27 -0
  553. package/dist/core/lbug/csv-generator.js +80 -17
  554. package/dist/core/lbug/extension-load-error.d.ts +2 -2
  555. package/dist/core/lbug/extension-load-error.js +44 -27
  556. package/dist/core/lbug/extension-loader.d.ts +29 -0
  557. package/dist/core/lbug/extension-loader.js +32 -7
  558. package/dist/core/lbug/graph-emit-sink.d.ts +264 -0
  559. package/dist/core/lbug/graph-emit-sink.js +581 -0
  560. package/dist/core/lbug/lbug-adapter.d.ts +337 -3
  561. package/dist/core/lbug/lbug-adapter.js +772 -67
  562. package/dist/core/lbug/lbug-config.d.ts +93 -6
  563. package/dist/core/lbug/lbug-config.js +269 -9
  564. package/dist/core/lbug/native-check.d.ts +39 -0
  565. package/dist/core/lbug/native-check.js +323 -46
  566. package/dist/core/lbug/pdg-emit-sink.d.ts +13 -4
  567. package/dist/core/lbug/pdg-emit-sink.js +21 -111
  568. package/dist/core/lbug/pool-adapter.d.ts +23 -1
  569. package/dist/core/lbug/pool-adapter.js +115 -7
  570. package/dist/core/lbug/query-batch.d.ts +75 -0
  571. package/dist/core/lbug/query-batch.js +102 -0
  572. package/dist/core/lbug/rel-pair-routing.d.ts +160 -2
  573. package/dist/core/lbug/rel-pair-routing.js +228 -10
  574. package/dist/core/lbug/schema.d.ts +162 -3
  575. package/dist/core/lbug/schema.js +392 -157
  576. package/dist/core/lbug/sidecar-recovery.d.ts +1 -0
  577. package/dist/core/lbug/sidecar-recovery.js +1 -1
  578. package/dist/core/lbug/sync-csv-writer.d.ts +47 -0
  579. package/dist/core/lbug/sync-csv-writer.js +108 -0
  580. package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
  581. package/dist/core/platform/capabilities.d.ts +0 -1
  582. package/dist/core/platform/capabilities.js +12 -7
  583. package/dist/core/run-analyze.d.ts +150 -3
  584. package/dist/core/run-analyze.js +1562 -151
  585. package/dist/core/search/bm25-index.d.ts +11 -0
  586. package/dist/core/search/bm25-index.js +60 -26
  587. package/dist/core/search/fts-indexes.d.ts +167 -2
  588. package/dist/core/search/fts-indexes.js +264 -10
  589. package/dist/core/wiki/graph-queries.js +145 -112
  590. package/dist/core/wiki/llm-client.d.ts +37 -5
  591. package/dist/core/wiki/llm-client.js +88 -17
  592. package/dist/core/wiki/prompts.d.ts +19 -0
  593. package/dist/core/wiki/prompts.js +20 -1
  594. package/dist/lib/utils.d.ts +113 -0
  595. package/dist/lib/utils.js +185 -0
  596. package/dist/mcp/http-transport.d.ts +5 -0
  597. package/dist/mcp/http-transport.js +19 -5
  598. package/dist/mcp/local/aop-metadata.d.ts +77 -0
  599. package/dist/mcp/local/aop-metadata.js +227 -0
  600. package/dist/mcp/local/bean-metadata.d.ts +3 -0
  601. package/dist/mcp/local/bean-metadata.js +46 -0
  602. package/dist/mcp/local/local-backend.d.ts +167 -6
  603. package/dist/mcp/local/local-backend.js +1756 -405
  604. package/dist/mcp/local/path-predicate.d.ts +19 -0
  605. package/dist/mcp/local/path-predicate.js +21 -0
  606. package/dist/mcp/local/pdg-impact.d.ts +132 -10
  607. package/dist/mcp/local/pdg-impact.js +391 -98
  608. package/dist/mcp/output-budget.d.ts +5 -0
  609. package/dist/mcp/output-budget.js +52 -0
  610. package/dist/mcp/read-only-policy.d.ts +12 -0
  611. package/dist/mcp/read-only-policy.js +102 -0
  612. package/dist/mcp/repository-policy.d.ts +35 -0
  613. package/dist/mcp/repository-policy.js +333 -0
  614. package/dist/mcp/resources.js +34 -7
  615. package/dist/mcp/server.d.ts +5 -2
  616. package/dist/mcp/server.js +48 -18
  617. package/dist/mcp/tools.d.ts +8 -8
  618. package/dist/mcp/tools.js +91 -20
  619. package/dist/server/analyze-job.d.ts +40 -2
  620. package/dist/server/analyze-job.js +30 -2
  621. package/dist/server/analyze-launch.d.ts +1 -1
  622. package/dist/server/analyze-launch.js +79 -10
  623. package/dist/server/analyze-worker-core.d.ts +3 -2
  624. package/dist/server/analyze-worker-core.js +15 -3
  625. package/dist/server/analyze-worker-ipc.d.ts +1 -1
  626. package/dist/server/analyze-worker-ipc.js +4 -0
  627. package/dist/server/analyze-worker-protocol.d.ts +59 -0
  628. package/dist/server/analyze-worker-protocol.js +1 -0
  629. package/dist/server/analyze-worker.d.ts +1 -17
  630. package/dist/server/analyze-worker.js +29 -6
  631. package/dist/server/api.d.ts +2 -11
  632. package/dist/server/api.js +200 -155
  633. package/dist/server/embed-run-outcome.d.ts +89 -0
  634. package/dist/server/embed-run-outcome.js +88 -0
  635. package/dist/server/git-clone.js +6 -2
  636. package/dist/server/mcp-http.d.ts +1 -1
  637. package/dist/server/mcp-http.js +4 -2
  638. package/dist/server/middleware.d.ts +116 -9
  639. package/dist/server/middleware.js +291 -22
  640. package/dist/server/sse-progress.d.ts +41 -0
  641. package/dist/server/sse-progress.js +125 -0
  642. package/dist/server/upload-ingest.js +2 -1
  643. package/dist/server/validation.js +2 -1
  644. package/dist/storage/branch-index.d.ts +11 -6
  645. package/dist/storage/branch-index.js +15 -7
  646. package/dist/storage/file-hash.js +2 -2
  647. package/dist/storage/fs-atomic.d.ts +25 -0
  648. package/dist/storage/fs-atomic.js +42 -0
  649. package/dist/storage/git.d.ts +165 -0
  650. package/dist/storage/git.js +352 -3
  651. package/dist/storage/index-lock.d.ts +83 -0
  652. package/dist/storage/index-lock.js +654 -0
  653. package/dist/storage/parse-cache.js +482 -1
  654. package/dist/storage/parsedfile-store.d.ts +8 -0
  655. package/dist/storage/parsedfile-store.js +235 -1
  656. package/dist/storage/repo-manager.d.ts +29 -309
  657. package/dist/storage/repo-manager.js +187 -165
  658. package/dist/storage/repo-meta.d.ts +530 -0
  659. package/dist/storage/repo-meta.js +100 -0
  660. package/dist/types/pipeline.d.ts +37 -0
  661. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +1 -1
  662. package/hooks/claude/gitnexus-hook.cjs +1 -1
  663. package/hooks/claude/resolve-analyze-cmd.cjs +80 -13
  664. package/package.json +20 -12
  665. package/scripts/cross-platform-shard.ts +143 -0
  666. package/scripts/cross-platform-tests.ts +94 -0
  667. package/scripts/ensure-fts.ts +14 -3
  668. package/scripts/run-cross-platform.ts +36 -10
  669. package/scripts/sync-plugin-manifests.mjs +192 -0
  670. package/skills/gitnexus-cli.md +3 -3
  671. package/skills/gitnexus-debugging.md +37 -7
  672. package/skills/gitnexus-exploring.md +26 -4
  673. package/skills/gitnexus-impact-analysis.md +71 -10
  674. package/skills/gitnexus-lfg/README.md +55 -0
  675. package/skills/gitnexus-lfg/SKILL.md +86 -0
  676. package/skills/gitnexus-plan/README.md +147 -0
  677. package/skills/gitnexus-plan/SKILL.md +348 -0
  678. package/skills/gitnexus-plan/references/context-ledger.md +137 -0
  679. package/skills/gitnexus-plan/references/context-pack.md +126 -0
  680. package/skills/gitnexus-plan/references/evidence-provenance.md +309 -0
  681. package/skills/gitnexus-plan/references/pdg-slice.md +109 -0
  682. package/skills/gitnexus-plan/references/plan-template.md +201 -0
  683. package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +2366 -0
  684. package/skills/gitnexus-refactoring.md +48 -5
  685. package/skills/gitnexus-review/SKILL.md +279 -0
  686. package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +42 -0
  687. package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +39 -0
  688. package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +37 -0
  689. package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +40 -0
  690. package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +42 -0
  691. package/skills/gitnexus-review/ci-personas/ci-security-lens.md +39 -0
  692. package/skills/gitnexus-taint-analysis.md +13 -7
  693. package/skills/gitnexus-work/README.md +71 -0
  694. package/skills/gitnexus-work/SKILL.md +272 -0
  695. package/skills/gitnexus-work/references/evidence-provenance.md +309 -0
  696. package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2366 -0
  697. package/vendor/leiden/utils.cjs +28 -1
  698. package/web/assets/ProcessFlowModal-Badh2Pbg.js +24 -0
  699. package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
  700. package/web/assets/abnfDiagram-QNN2D4NM-Cq2djWWe.js +1 -0
  701. package/web/assets/agent-DIzEQ1JJ.js +626 -0
  702. package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +1 -0
  703. package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +36 -0
  704. package/web/assets/blockDiagram-54WLDVWM-Dg_hrRWE.js +132 -0
  705. package/web/assets/{c4Diagram-Y2BXMSZH-DOXVs7-C.js → c4Diagram-X2LASM7V-CnhoT4aV.js} +6 -6
  706. package/web/assets/chunk-224SPVON-B8gxtXpy.js +1 -0
  707. package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +127 -0
  708. package/web/assets/chunk-2SREHG4O-Dip42xOq.js +1 -0
  709. package/web/assets/chunk-4RFN2BYJ-DHHWuC-n.js +1 -0
  710. package/web/assets/chunk-66DQ2XMT-CM0xjFAN.js +1 -0
  711. package/web/assets/chunk-6BELYETK-ChsYtfHW.js +1 -0
  712. package/web/assets/chunk-6L755F7B-CMhLBxi2.js +1 -0
  713. package/web/assets/chunk-7CWYLC5S-DRgGkkpF.js +2 -0
  714. package/web/assets/chunk-A7VWPJGB-B4O3oQdQ.js +1 -0
  715. package/web/assets/chunk-BI6VK774-D0oaWk8V.js +1 -0
  716. package/web/assets/chunk-D6VWDJW2-BxcBdZ9c.js +2 -0
  717. package/web/assets/chunk-DMV4VAQV-Bn6WXDSX.js +4 -0
  718. package/web/assets/chunk-E5QJAATJ-dh-5CtIV.js +2 -0
  719. package/web/assets/chunk-EQFTRU2I-1ix7TzW9.js +2 -0
  720. package/web/assets/chunk-FWYVLQTC-BgDItRzJ.js +1 -0
  721. package/web/assets/chunk-HNC4WDU7-DoU3KnA7.js +1 -0
  722. package/web/assets/chunk-L5GCOVLC-CE2w8Nm_.js +161 -0
  723. package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +321 -0
  724. package/web/assets/chunk-LORZLZWG-B57uGw2N.js +88 -0
  725. package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +62 -0
  726. package/web/assets/chunk-NV3KIAZN-5yvcpMiu.js +1 -0
  727. package/web/assets/chunk-OIYT25JQ-CQ6KOZGX.js +1 -0
  728. package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +10 -0
  729. package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +156 -0
  730. package/web/assets/chunk-RRFMTAIC-CMN0wcYA.js +1 -0
  731. package/web/assets/{chunk-RLI5ZMPA-CkXZ0y0U.js → chunk-SATU7PGQ-B1zhgOvc.js} +1 -1
  732. package/web/assets/chunk-STOV2HOB-GnExfzIX.js +1 -0
  733. package/web/assets/chunk-SZD42YQK-ijyKKVr1.js +70 -0
  734. package/web/assets/chunk-TFPGFQPA-Dj6a-0pC.js +231 -0
  735. package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +2 -0
  736. package/web/assets/chunk-TZUXEDM2-B7p9AcTw.js +1 -0
  737. package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +1 -0
  738. package/web/assets/{chunk-6764PJDD-C7xxk063.js → chunk-VE5CLXGZ-C1vB7wpY.js} +1 -1
  739. package/web/assets/chunk-VJFVEZTB-CX66F2ep.js +206 -0
  740. package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +1 -0
  741. package/web/assets/chunk-WJBAP47W-BckNkuEN.js +1 -0
  742. package/web/assets/chunk-XNMVGMAZ-Cg_LnPtj.js +1 -0
  743. package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +1 -0
  744. package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +1 -0
  745. package/web/assets/{cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js → cose-bilkent-RZA4XIPR-BHpK4Crp.js} +1 -1
  746. package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +1 -0
  747. package/web/assets/cynefinDiagram-TR7LZUCG-C3Iar9lZ.js +62 -0
  748. package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +4 -0
  749. package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +30 -0
  750. package/web/assets/diagram-JCD7PQ7C-DC5-9FRr.js +24 -0
  751. package/web/assets/diagram-KFBZAVDW-Dfmf_4ti.js +3 -0
  752. package/web/assets/diagram-L7DVE3PN-GIRyVUtt.js +41 -0
  753. package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +24 -0
  754. package/web/assets/ebnfDiagram-DRHRQJWO-D8_CI4ZF.js +1 -0
  755. package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +85 -0
  756. package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +1 -0
  757. package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +1 -0
  758. package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +292 -0
  759. package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +1 -0
  760. package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +106 -0
  761. package/web/assets/{index-B4eB4dNZ.js → index-BBNl0qfX.js} +51 -51
  762. package/web/assets/index-CJDpyH-n.css +2 -0
  763. package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +1 -0
  764. package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +2 -0
  765. package/web/assets/{ishikawaDiagram-BNXS4ZKH-BLjivjXL.js → ishikawaDiagram-4JDSWWDM-DmqWtjkl.js} +6 -6
  766. package/web/assets/{journeyDiagram-M6C3CM3L-Cetgs3NH.js → journeyDiagram-QUS3FAKT-XAzVzrQW.js} +6 -6
  767. package/web/assets/{kanban-definition-75IXJCU3-DMlCaIpf.js → kanban-definition-D4L7SQKK-YurRnmYn.js} +27 -27
  768. package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +257 -0
  769. package/web/assets/{mindmap-definition-2TDM6QVE-B4GbXQBc.js → mindmap-definition-66QP5TD6-ChrWWnil.js} +29 -29
  770. package/web/assets/node-Ct_zna8U.js +8 -0
  771. package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +1 -0
  772. package/web/assets/pegDiagram-YKIO5C6U-QGeQLEq2.js +1 -0
  773. package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +1 -0
  774. package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +39 -0
  775. package/web/assets/preload-helper-Czpn1I53.js +1 -0
  776. package/web/assets/{quadrantDiagram-VICAPDV7-B1TQnlm0.js → quadrantDiagram-VO5QLCXA-B7098wSc.js} +6 -6
  777. package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +1 -0
  778. package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +1 -0
  779. package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +1 -0
  780. package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +1 -0
  781. package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +1 -0
  782. package/web/assets/railroadDiagram-M77LTMSB-AXu4vxk_.js +1 -0
  783. package/web/assets/requirementDiagram-RASO5HTO-B-l8InpK.js +84 -0
  784. package/web/assets/sankeyDiagram-F32LOJ6L-Kd7zjJgX.js +40 -0
  785. package/web/assets/sdk-CzHHH8tD.js +37 -0
  786. package/web/assets/sequenceDiagram-URATNSBD-BlcdY9DS.js +162 -0
  787. package/web/assets/sizeCapture-5GORAGP4-BEqQzsxs.js +1 -0
  788. package/web/assets/src-C5sx_gMp.js +1 -0
  789. package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +1 -0
  790. package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +1 -0
  791. package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +2 -0
  792. package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +8 -0
  793. package/web/assets/timeline-definition-WJXWRH4I-DUfp1R3E.js +120 -0
  794. package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +1 -0
  795. package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +1 -0
  796. package/web/assets/vennDiagram-K3VCMQLI-Bj-FN-XS.js +34 -0
  797. package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +1 -0
  798. package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +78 -0
  799. package/web/assets/xychartDiagram-5VRUVLCW-CK_rbSWE.js +7 -0
  800. package/web/index.html +17 -15
  801. package/dist/core/ingestion/languages/python/index-stats.d.ts +0 -18
  802. package/dist/core/ingestion/languages/python/index-stats.js +0 -25
  803. package/skills/gitnexus-pr-review.md +0 -163
  804. package/web/assets/ProcessFlowModal-Dna7GkwO.js +0 -22
  805. package/web/assets/agent-DNYDy-KA.js +0 -660
  806. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +0 -1
  807. package/web/assets/architectureDiagram-UL44E2DR-BU5ZRITg.js +0 -36
  808. package/web/assets/blockDiagram-7IZFK4PR-Dut1BpTV.js +0 -132
  809. package/web/assets/chunk-2T2R6R2M-pkw2oXHH.js +0 -4
  810. package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +0 -1
  811. package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +0 -321
  812. package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +0 -159
  813. package/web/assets/chunk-67TQ5CYL-zxhDWgyF.js +0 -124
  814. package/web/assets/chunk-7J6CGLKN-AmkN8jJN.js +0 -10
  815. package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +0 -1
  816. package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +0 -1
  817. package/web/assets/chunk-INKRHTLW-D9BM9HWZ.js +0 -70
  818. package/web/assets/chunk-J5EP6P6S-L19oz55R.js +0 -1
  819. package/web/assets/chunk-KGFNY3KK-tD2F6wxK.js +0 -62
  820. package/web/assets/chunk-KGYTTC2M-zm6n242I.js +0 -1
  821. package/web/assets/chunk-KNLZD3CH-BGlP6X9R.js +0 -1
  822. package/web/assets/chunk-LCXTWHL2-Ba9JK-6F.js +0 -231
  823. package/web/assets/chunk-LII3EMHJ-EGx-eBIu.js +0 -1
  824. package/web/assets/chunk-LRIF4GLE-C3_PqUBq.js +0 -1
  825. package/web/assets/chunk-QA3QBVWF-D4cSJBf6.js +0 -2
  826. package/web/assets/chunk-RERM46MO-B5dAdWpP.js +0 -1
  827. package/web/assets/chunk-RG4AUYOV-OqBBMwuQ.js +0 -206
  828. package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +0 -1
  829. package/web/assets/chunk-T2UQINTJ-BJusEiGe.js +0 -1
  830. package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +0 -1
  831. package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +0 -1
  832. package/web/assets/chunk-UY5QBCOK-BCpUlARQ.js +0 -1
  833. package/web/assets/chunk-VU6ZFW4Y-BeXVk45_.js +0 -2
  834. package/web/assets/chunk-ZXARS5L4-BI_qR2Nm.js +0 -1
  835. package/web/assets/classDiagram-KGZ6W3CR-D9zSIg0x.js +0 -1
  836. package/web/assets/classDiagram-v2-72OJOZXJ-D9zSIg0x.js +0 -1
  837. package/web/assets/dagre-ND4H6XIP-CpcV5kbl.js +0 -4
  838. package/web/assets/diagram-3NCE3AQN-6SMxBRpj.js +0 -43
  839. package/web/assets/diagram-GF46GFSD-BZEdNcRZ.js +0 -24
  840. package/web/assets/diagram-HNR7UZ2L-DxKW2a2Y.js +0 -3
  841. package/web/assets/diagram-QXG6HAR7-HfTHcXX_.js +0 -24
  842. package/web/assets/diagram-WEQXMOUZ-CyijUS8r.js +0 -10
  843. package/web/assets/erDiagram-L5TCEMPS-D0fvpWEX.js +0 -85
  844. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +0 -1
  845. package/web/assets/flowDiagram-H6V6AXG4-Bvr9bbhk.js +0 -162
  846. package/web/assets/ganttDiagram-JCBTUEKG-TzODrLzv.js +0 -292
  847. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +0 -1
  848. package/web/assets/gitGraphDiagram-S2ZK5IYY-ONQSwJIY.js +0 -106
  849. package/web/assets/index-CX_fADmQ.css +0 -2
  850. package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +0 -1
  851. package/web/assets/infoDiagram-3YFTVSEB-DIPVUIQ6.js +0 -2
  852. package/web/assets/katex-K3KEBU37-qRQBy-EZ.js +0 -261
  853. package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +0 -1
  854. package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +0 -1
  855. package/web/assets/pieDiagram-CU6KROY3-D3YC_xyg.js +0 -30
  856. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +0 -1
  857. package/web/assets/requirementDiagram-JXO7QTGE-f8wczLQf.js +0 -84
  858. package/web/assets/sankeyDiagram-URQDO5SZ-BTxzG5j0.js +0 -40
  859. package/web/assets/sequenceDiagram-VS2MUI6T-DuamM-IR.js +0 -162
  860. package/web/assets/src-BNCXICdA.js +0 -1
  861. package/web/assets/stateDiagram-7D4R322I-Ch2pEUcw.js +0 -1
  862. package/web/assets/stateDiagram-v2-36443NZ5-7ANuoZLL.js +0 -1
  863. package/web/assets/timeline-definition-O6YCAMPW-07BR8R8G.js +0 -120
  864. package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +0 -1
  865. package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +0 -1
  866. package/web/assets/vennDiagram-MWXL3ELB-BQX2ossk.js +0 -34
  867. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +0 -1
  868. package/web/assets/wardleyDiagram-CUQ6CDDI-CGIJBBiK.js +0 -78
  869. package/web/assets/xychartDiagram-N2JHSOCM-B3HNMuWp.js +0 -7
  870. /package/web/assets/{chunk-7W6UQGC5-pyKGssV3.js → chunk-LIEV3EAG-pyKGssV3.js} +0 -0
@@ -1,12 +1,12 @@
1
1
  import fsp from 'node:fs/promises';
2
2
  import path from 'node:path';
3
- import { createHash, randomBytes } from 'node:crypto';
3
+ import { createHash } from 'node:crypto';
4
4
  import lbug from '@ladybugdb/core';
5
5
  import { BRIDGE_SCHEMA_QUERIES, BRIDGE_SCHEMA_VERSION } from './bridge-schema.js';
6
6
  import { closeLbugConnection, openLbugConnection, } from '../lbug/lbug-config.js';
7
7
  import { dedupeContracts, dedupeCrossLinks } from './normalization.js';
8
8
  import { createLogger } from '../logger.js';
9
- import { retryRename } from '../../storage/fs-atomic.js';
9
+ import { retryRename, writeFileAtomic } from '../../storage/fs-atomic.js';
10
10
  const bridgeLogger = createLogger('bridge-db', {
11
11
  debugEnvVar: 'GITNEXUS_DEBUG_BRIDGE',
12
12
  });
@@ -516,31 +516,7 @@ export async function closeBridgeDb(handle) {
516
516
  /* writeBridgeMeta / readBridgeMeta */
517
517
  /* ------------------------------------------------------------------ */
518
518
  export async function writeBridgeMeta(groupDir, meta) {
519
- const target = path.join(groupDir, 'meta.json');
520
- // Unpredictable suffix + O_EXCL via `'wx'` flag closes the symlink/
521
- // pre-create attack window. The third argument `0o600` is the
522
- // user-only mode mask — CodeQL's `js/insecure-temporary-file` query
523
- // sources its verdict from the `mode` argument, NOT from `flags`:
524
- // its `isSecureMode(mode)` predicate requires the low 6 bits to be
525
- // zero (no group/world bits). Without an explicit mode the file is
526
- // created with the process umask (typically 0o644 = group/world
527
- // readable), which the query treats as the actual vulnerability.
528
- // Both `'wx'` (runtime O_EXCL) AND `0o600` (CodeQL-credited mode)
529
- // are needed: one closes the symlink race, the other closes the
530
- // permissions exposure.
531
- const tmp = `${target}.tmp.${randomBytes(8).toString('hex')}`;
532
- const handle = await fsp.open(tmp, 'wx', 0o600);
533
- try {
534
- await handle.writeFile(JSON.stringify(meta, null, 2), 'utf-8');
535
- }
536
- finally {
537
- await handle.close();
538
- }
539
- // Use retryRename for consistency with writeBridge's atomic swap — on
540
- // Windows a concurrent reader can cause EBUSY/EPERM even on a tiny
541
- // meta.json, and we don't want meta write to be less robust than the
542
- // bridge.lbug swap it accompanies.
543
- await retryRename(tmp, target);
519
+ await writeFileAtomic(path.join(groupDir, 'meta.json'), JSON.stringify(meta, null, 2));
544
520
  }
545
521
  export async function readBridgeMeta(groupDir) {
546
522
  try {
@@ -829,6 +805,8 @@ const LBUG_OPEN_RETRY_PATTERNS = [
829
805
  'could not set lock',
830
806
  'lock held by another process',
831
807
  ];
808
+ // Cross-repo bridge RO open retry. Catalogued as entry 5 of the lbug-config
809
+ // retry-budget registry; caps back-off so total wait ~3s.
832
810
  const LBUG_OPEN_RETRY_ATTEMPTS = 10;
833
811
  const LBUG_OPEN_RETRY_BASE_MS = 100;
834
812
  /** Cap individual back-off delays so the total wait is bounded (~3s). */
@@ -4,10 +4,30 @@
4
4
  */
5
5
  import type { BridgeHandle, CrossRepoImpact, GroupImpactResult } from './types.js';
6
6
  import type { GroupToolPort } from './service.js';
7
+ import { compareCodeUnits } from '../../lib/utils.js';
7
8
  /** Cross-boundary hops beyond this value are clamped (multi-hop reserved for future work). */
8
9
  export declare const MAX_SUPPORTED_CROSS_DEPTH = 1;
9
10
  /** Default wall-clock budget for the Phase 1 `impact` leg when callers omit `timeoutMs`. */
10
11
  export declare const DEFAULT_LOCAL_IMPACT_TIMEOUT_MS = 30000;
12
+ /**
13
+ * Cap on neighbour fan-outs attempted per group-impact request.
14
+ *
15
+ * The bound used to be the wall clock alone, which made the cutoff a function
16
+ * of machine load: an idle host traversed more crossings and `mergeRisk`
17
+ * escalated to CRITICAL at three, while a loaded host stopped at two and
18
+ * reported HIGH or lower — same graph, same arguments, different verdict
19
+ * (#2787). A count is deterministic, and the neighbour list carries a total
20
+ * order over the full crossing identity (confidence DESC, then repo, uid,
21
+ * contract), so the cap keeps the strongest crossings rather than an arbitrary
22
+ * prefix.
23
+ *
24
+ * 50 is borrowed from `MAX_CROSSINGS_TO_TRY` (cross-trace.ts) on cost, not on
25
+ * scope — that one caps ContractLinks per repo pair inside a trace, this one
26
+ * caps the total across all neighbour repos in one impact call, and group impact
27
+ * had no numeric cap at all before #2787. The wall clock stays as a hang
28
+ * backstop below; this is the bound that normally binds.
29
+ */
30
+ export declare const MAX_NEIGHBOR_FANOUT = 50;
11
31
  export type BridgeNeighborRow = {
12
32
  neighborRepo: string;
13
33
  neighborUid: string;
@@ -117,3 +137,4 @@ export declare function runGroupImpact(deps: RunGroupImpactDeps, params: Record<
117
137
  error: string;
118
138
  }>;
119
139
  export { normalizeServicePrefix, fileMatchesServicePrefix } from './group-path-utils.js';
140
+ export { compareCodeUnits };
@@ -9,6 +9,7 @@ import { fileMatchesServicePrefix, normalizeServicePrefix, repoInSubgroup, } fro
9
9
  import { getGroupDir } from './storage.js';
10
10
  import { closeBridgeDb, getCachedBridgeReadOnly, queryBridge, readBridgeMeta, } from './bridge-db.js';
11
11
  import { BRIDGE_SCHEMA_VERSION } from './bridge-schema.js';
12
+ import { compareCodeUnits } from '../../lib/utils.js';
12
13
  // High limit for the local phase of group impact so collectImpactSymbolUids
13
14
  // sees (nearly) all symbols. Bypasses the MCP-facing default of 100.
14
15
  const GROUP_LOCAL_PHASE_LIMIT = 10000;
@@ -16,6 +17,25 @@ const GROUP_LOCAL_PHASE_LIMIT = 10000;
16
17
  export const MAX_SUPPORTED_CROSS_DEPTH = 1;
17
18
  /** Default wall-clock budget for the Phase 1 `impact` leg when callers omit `timeoutMs`. */
18
19
  export const DEFAULT_LOCAL_IMPACT_TIMEOUT_MS = 30_000;
20
+ /**
21
+ * Cap on neighbour fan-outs attempted per group-impact request.
22
+ *
23
+ * The bound used to be the wall clock alone, which made the cutoff a function
24
+ * of machine load: an idle host traversed more crossings and `mergeRisk`
25
+ * escalated to CRITICAL at three, while a loaded host stopped at two and
26
+ * reported HIGH or lower — same graph, same arguments, different verdict
27
+ * (#2787). A count is deterministic, and the neighbour list carries a total
28
+ * order over the full crossing identity (confidence DESC, then repo, uid,
29
+ * contract), so the cap keeps the strongest crossings rather than an arbitrary
30
+ * prefix.
31
+ *
32
+ * 50 is borrowed from `MAX_CROSSINGS_TO_TRY` (cross-trace.ts) on cost, not on
33
+ * scope — that one caps ContractLinks per repo pair inside a trace, this one
34
+ * caps the total across all neighbour repos in one impact call, and group impact
35
+ * had no numeric cap at all before #2787. The wall clock stays as a hang
36
+ * backstop below; this is the bound that normally binds.
37
+ */
38
+ export const MAX_NEIGHBOR_FANOUT = 50;
19
39
  const CY_NEIGHBORS_UPSTREAM = `
20
40
  MATCH (consumer:Contract)-[l:ContractLink]->(provider:Contract)
21
41
  WHERE provider.repo = $localRepo
@@ -256,17 +276,49 @@ function extractProcessNames(impact) {
256
276
  // No behavior change — `'UNKNOWN'` was already handled correctly at the
257
277
  // `(localRisk === 'LOW' || localRisk === 'UNKNOWN')` branch below.
258
278
  export function mergeRisk(localRisk, cross) {
259
- const highConf = cross.some((c) => c.contract.confidence >= 0.85);
279
+ const traversed = cross.filter((c) => c.fanout_status !== 'not_attempted');
280
+ const highConf = traversed.some((c) => c.contract.confidence >= 0.85);
260
281
  if (localRisk === 'CRITICAL')
261
282
  return 'CRITICAL';
262
- if (cross.length >= 3)
283
+ if (traversed.length >= 3)
263
284
  return 'CRITICAL';
264
285
  if (highConf)
265
286
  return 'HIGH';
266
- if (cross.length > 0 && (localRisk === 'LOW' || localRisk === 'UNKNOWN'))
287
+ if (traversed.length > 0 && (localRisk === 'LOW' || localRisk === 'UNKNOWN'))
267
288
  return 'MEDIUM';
268
289
  return localRisk;
269
290
  }
291
+ /**
292
+ * Build the truncation fields every `runGroupImpact` return path shares.
293
+ *
294
+ * `riskEpistemic` must follow `truncated` mechanically: it is the marker that
295
+ * tells a caller the `risk` value is a floor rather than a verdict, and
296
+ * `mergeRisk` can only under-report once a crossing is dropped. Attaching it at
297
+ * each return let two of the four paths set `truncated` without it, so a
298
+ * truncated result read as complete — deriving it in one place is what keeps
299
+ * the invariant from drifting again (#2787).
300
+ */
301
+ function truncationFields(truncated,
302
+ // Only read on the truncated branch, so the not-truncated call sites omit it
303
+ // rather than passing a reason that is thrown away.
304
+ reasonIfTruncated = 'partial') {
305
+ if (!truncated)
306
+ return { truncated: false };
307
+ return { truncated: true, truncationReason: reasonIfTruncated, riskEpistemic: 'lower-bound' };
308
+ }
309
+ function addCrossImpact(cross, candidate) {
310
+ const sameBoundary = (entry) => entry.repo_path === candidate.repo_path && entry.contract.id === candidate.contract.id;
311
+ if (candidate.fanout_status === 'not_attempted') {
312
+ if (cross.some(sameBoundary))
313
+ return;
314
+ }
315
+ else {
316
+ const boundaryOnlyIndex = cross.findIndex((entry) => sameBoundary(entry) && entry.fanout_status === 'not_attempted');
317
+ if (boundaryOnlyIndex >= 0)
318
+ cross.splice(boundaryOnlyIndex, 1);
319
+ }
320
+ cross.push(candidate);
321
+ }
270
322
  export async function ensureBridgeReady(groupDir) {
271
323
  const meta = await readBridgeMeta(groupDir);
272
324
  if (meta.version > 0 && meta.version !== BRIDGE_SCHEMA_VERSION) {
@@ -337,7 +389,15 @@ export async function resolveBridgeNeighbors(handle, opts) {
337
389
  if (n)
338
390
  neighbors.push(n);
339
391
  }
340
- neighbors.sort((a, b) => b.confidence - a.confidence);
392
+ // Sort on the FULL crossing identity — the same triple the fan-out dedups on
393
+ // below (`repo\0uid\0contractId`). Two links that share (confidence, repo,
394
+ // uid) but differ in contract both survive that dedup, so leaving contractId
395
+ // out of the comparator makes them compare 0 and fall back to raw bridge row
396
+ // order, which is what decides who lands past MAX_NEIGHBOR_FANOUT (#2787).
397
+ neighbors.sort((a, b) => b.confidence - a.confidence ||
398
+ compareCodeUnits(a.neighborRepo, b.neighborRepo) ||
399
+ compareCodeUnits(a.neighborUid, b.neighborUid) ||
400
+ compareCodeUnits(a.contractId, b.contractId));
341
401
  return neighbors;
342
402
  }
343
403
  export async function runGroupImpact(deps, params) {
@@ -376,7 +436,7 @@ export async function runGroupImpact(deps, params) {
376
436
  group: name,
377
437
  cross: [],
378
438
  outOfScope: [],
379
- truncated: true,
439
+ ...truncationFields(true, 'timeout'),
380
440
  truncatedRepos: [],
381
441
  summary: {
382
442
  direct: 0,
@@ -386,7 +446,6 @@ export async function runGroupImpact(deps, params) {
386
446
  },
387
447
  risk: 'UNKNOWN',
388
448
  timeoutMs,
389
- truncationReason: 'timeout',
390
449
  crossDepthWarning,
391
450
  };
392
451
  }
@@ -408,7 +467,7 @@ export async function runGroupImpact(deps, params) {
408
467
  group: name,
409
468
  cross: [],
410
469
  outOfScope: [],
411
- truncated: false,
470
+ ...truncationFields(false),
412
471
  truncatedRepos: [],
413
472
  summary: {
414
473
  direct: 0,
@@ -430,7 +489,7 @@ export async function runGroupImpact(deps, params) {
430
489
  group: name,
431
490
  cross: [],
432
491
  outOfScope: [],
433
- truncated: Boolean(local.partial),
492
+ ...truncationFields(Boolean(local.partial), 'partial'),
434
493
  truncatedRepos: [],
435
494
  summary: {
436
495
  direct: s.direct ?? 0,
@@ -440,7 +499,6 @@ export async function runGroupImpact(deps, params) {
440
499
  },
441
500
  risk: String(local.risk ?? 'LOW'),
442
501
  timeoutMs,
443
- truncationReason: local.partial ? 'partial' : undefined,
444
502
  crossDepthWarning,
445
503
  };
446
504
  }
@@ -451,6 +509,10 @@ export async function runGroupImpact(deps, params) {
451
509
  const cross = [];
452
510
  const outOfScope = [];
453
511
  const truncatedRepos = [];
512
+ /** Real `impactByUid` fan-outs issued — what MAX_NEIGHBOR_FANOUT bounds. */
513
+ let attemptedFanouts = 0;
514
+ /** True when the wall-clock backstop, not the count cap, cut the fan-out. */
515
+ let fanoutTimedOut = false;
454
516
  try {
455
517
  const neighbors = await resolveBridgeNeighbors(handle, {
456
518
  localRepo: repoPath,
@@ -459,7 +521,10 @@ export async function runGroupImpact(deps, params) {
459
521
  });
460
522
  const seen = new Set();
461
523
  for (const n of neighbors) {
462
- if (servicePrefix && !fileMatchesServicePrefix(n.neighborFilePath, servicePrefix)) {
524
+ const manifestOnly = n.neighborUid.startsWith('manifest::');
525
+ if (servicePrefix &&
526
+ !manifestOnly &&
527
+ !fileMatchesServicePrefix(n.neighborFilePath, servicePrefix)) {
463
528
  continue;
464
529
  }
465
530
  if (!repoInSubgroup(n.neighborRepo, subgroup)) {
@@ -475,8 +540,18 @@ export async function runGroupImpact(deps, params) {
475
540
  if (seen.has(key))
476
541
  continue;
477
542
  seen.add(key);
478
- const remainingMs = deadline - Date.now();
479
- if (remainingMs <= 0) {
543
+ // Deterministic bound first: the count decides the cutoff on every host.
544
+ // Manifest-only crossings are exempt because they cost no `impactByUid`
545
+ // and dropping them regresses #2784.
546
+ if (!manifestOnly && attemptedFanouts >= MAX_NEIGHBOR_FANOUT) {
547
+ truncatedRepos.push(n.neighborRepo);
548
+ continue;
549
+ }
550
+ // Wall clock second, as a hang backstop only. It is load-dependent by
551
+ // construction, so when it is what fired the response must say `timeout`,
552
+ // not the generic `partial` it used to report.
553
+ if (!manifestOnly && deadline - Date.now() <= 0) {
554
+ fanoutTimedOut = true;
480
555
  truncatedRepos.push(n.neighborRepo);
481
556
  continue;
482
557
  }
@@ -491,11 +566,40 @@ export async function runGroupImpact(deps, params) {
491
566
  truncatedRepos.push(n.neighborRepo);
492
567
  continue;
493
568
  }
569
+ // A manifest link can prove the repository boundary even when its far
570
+ // endpoint has no graph symbol of its own (for example, a string-based
571
+ // RPC dispatch). Those endpoints deliberately use a deterministic
572
+ // `manifest::...` UID. Calling impactByUid with that synthetic value can
573
+ // never succeed because it is not a node in the verified neighbor
574
+ // repository; dropping the crossing here made `group sync` report the
575
+ // manifest link while `group impact` silently returned cross=0 (#2722).
576
+ //
577
+ // Preserve the proven crossing with an empty local fan-out. Real UIDs
578
+ // still take the normal impactByUid path below, where failures remain
579
+ // truncations rather than false successful traversals.
580
+ if (manifestOnly) {
581
+ addCrossImpact(cross, {
582
+ repo: regName,
583
+ repo_path: n.neighborRepo,
584
+ contract: {
585
+ id: n.contractId,
586
+ type: n.contractType,
587
+ match_type: 'manifest',
588
+ confidence: n.confidence,
589
+ },
590
+ by_depth: {},
591
+ affected_processes: [],
592
+ fanout_status: 'not_attempted',
593
+ });
594
+ continue;
595
+ }
596
+ const remainingMs = deadline - Date.now();
494
597
  // Phase-2 hardening: race each impactByUid against a per-call
495
598
  // timeout derived from the remaining budget. Without this wrap a
496
599
  // single hung neighbor would pin the request past the clamped
497
600
  // timeout, which Codex's adversarial review on PR #1331 flagged
498
601
  // as the still-open half of CodeQL #184 / js/resource-exhaustion.
602
+ attemptedFanouts += 1;
499
603
  const { value: fan, timedOut: neighborTimedOut } = await safeNeighborImpact(deps.port, neighborHandle.id, n.neighborUid, direction, {
500
604
  maxDepth,
501
605
  relationTypes: relationTypes ?? [],
@@ -503,10 +607,12 @@ export async function runGroupImpact(deps, params) {
503
607
  includeTests,
504
608
  }, remainingMs);
505
609
  if (neighborTimedOut || fan == null) {
610
+ if (neighborTimedOut)
611
+ fanoutTimedOut = true;
506
612
  truncatedRepos.push(n.neighborRepo);
507
613
  continue;
508
614
  }
509
- cross.push({
615
+ addCrossImpact(cross, {
510
616
  repo: regName,
511
617
  repo_path: n.neighborRepo,
512
618
  contract: {
@@ -532,7 +638,12 @@ export async function runGroupImpact(deps, params) {
532
638
  group: name,
533
639
  cross,
534
640
  outOfScope,
535
- truncated,
641
+ // The risk VALUE is never clamped down. `mergeRisk` is monotone increasing
642
+ // in the traversed-crossing count, so truncation can only under-report —
643
+ // and under-reporting a blast radius is the unsafe direction (an agent told
644
+ // LOW proceeds; told CRITICAL it stops). Marking the floor keeps the
645
+ // warning intact while making the incompleteness legible.
646
+ ...truncationFields(truncated, fanoutTimedOut ? 'timeout' : 'partial'),
536
647
  truncatedRepos: [...new Set(truncatedRepos)],
537
648
  summary: {
538
649
  direct: localSum.direct ?? 0,
@@ -542,9 +653,11 @@ export async function runGroupImpact(deps, params) {
542
653
  },
543
654
  risk: mergeRisk(localRisk, cross),
544
655
  timeoutMs,
545
- truncationReason: truncated ? 'partial' : undefined,
546
656
  crossDepthWarning,
547
657
  };
548
658
  return result;
549
659
  }
550
660
  export { normalizeServicePrefix, fileMatchesServicePrefix } from './group-path-utils.js';
661
+ // Re-exported, not redefined: the single definition lives in lib/utils.ts, but
662
+ // this module's own surface is what the #2787 regression test imports it from.
663
+ export { compareCodeUnits };
@@ -25,6 +25,7 @@
25
25
  import { GroupNotFoundError, loadGroupConfig } from './config-parser.js';
26
26
  import { getGroupDir } from './storage.js';
27
27
  import { ensureBridgeReady, MAX_SUPPORTED_CROSS_DEPTH } from './cross-impact.js';
28
+ import { compareCodeUnits } from '../../lib/utils.js';
28
29
  import { closeBridgeDb, queryBridge } from './bridge-db.js';
29
30
  /**
30
31
  * Centralized degraded-state messages so wording stays consistent and
@@ -115,7 +116,7 @@ RETURN consumer.symbolUid AS consumerUid,
115
116
  l.confidence AS confidence,
116
117
  l.contractId AS contractId,
117
118
  consumer.type AS contractType
118
- ORDER BY l.confidence DESC
119
+ ORDER BY l.confidence DESC, contractId, consumerUid, providerUid
119
120
  LIMIT ${MAX_CROSSINGS_TO_TRY + 1}
120
121
  `;
121
122
  // Destination trace: every ContractLink leaving a consumer repo, to ANY provider
@@ -136,7 +137,7 @@ RETURN consumer.symbolUid AS consumerUid,
136
137
  l.confidence AS confidence,
137
138
  l.contractId AS contractId,
138
139
  consumer.type AS contractType
139
- ORDER BY l.confidence DESC
140
+ ORDER BY l.confidence DESC, contractId, consumerUid, providerUid
140
141
  LIMIT ${MAX_CROSSINGS_TO_TRY + 1}
141
142
  `;
142
143
  function rowToCrossing(r) {
@@ -164,6 +165,28 @@ function rowToCrossing(r) {
164
165
  contractType: String(r.contractType ?? r[7] ?? 'custom'),
165
166
  };
166
167
  }
168
+ /**
169
+ * Sort a crossing list on the full crossing identity, then apply
170
+ * `MAX_CROSSINGS_TO_TRY`.
171
+ *
172
+ * Both bridge queries already order by confidence DESC; this re-sorts
173
+ * defensively so the cap keeps the strongest candidates even if a tuple-mode
174
+ * driver reorders rows. The comparator mirrors BOTH queries' `ORDER BY`
175
+ * key-for-key — a shorter comparator reproduces less than the order it is
176
+ * defending, leaving ties on raw row order (#2787) — so it lives in one place
177
+ * rather than being hand-synced across the two callers and two Cypher clauses.
178
+ */
179
+ function capCrossings(all) {
180
+ all.sort((a, b) => b.confidence - a.confidence ||
181
+ compareCodeUnits(a.contractId, b.contractId) ||
182
+ compareCodeUnits(a.consumerUid, b.consumerUid) ||
183
+ compareCodeUnits(a.providerUid, b.providerUid));
184
+ const truncated = all.length > MAX_CROSSINGS_TO_TRY;
185
+ return {
186
+ crossings: truncated ? all.slice(0, MAX_CROSSINGS_TO_TRY) : all,
187
+ truncated,
188
+ };
189
+ }
167
190
  async function listCrossingsBetween(handle, fromRepo, toRepo) {
168
191
  const rows = await queryBridge(handle, CY_CROSSINGS_BETWEEN, {
169
192
  fromRepo,
@@ -175,14 +198,7 @@ async function listCrossingsBetween(handle, fromRepo, toRepo) {
175
198
  if (c)
176
199
  all.push(c);
177
200
  }
178
- // The query already orders by confidence DESC; re-sort defensively so the cap
179
- // keeps the strongest candidates even if a tuple-mode driver reorders rows.
180
- all.sort((a, b) => b.confidence - a.confidence);
181
- const truncated = all.length > MAX_CROSSINGS_TO_TRY;
182
- return {
183
- crossings: truncated ? all.slice(0, MAX_CROSSINGS_TO_TRY) : all,
184
- truncated,
185
- };
201
+ return capCrossings(all);
186
202
  }
187
203
  function destRowToCrossing(r) {
188
204
  const consumerUid = String(r.consumerUid ?? r[0] ?? '');
@@ -212,12 +228,7 @@ async function listCrossingsFrom(handle, fromRepo) {
212
228
  if (c)
213
229
  all.push(c);
214
230
  }
215
- all.sort((a, b) => b.confidence - a.confidence);
216
- const truncated = all.length > MAX_CROSSINGS_TO_TRY;
217
- return {
218
- crossings: truncated ? all.slice(0, MAX_CROSSINGS_TO_TRY) : all,
219
- truncated,
220
- };
231
+ return capCrossings(all);
221
232
  }
222
233
  /**
223
234
  * Resolve a symbol query across every member repo. Exactly one `ok` match and
@@ -1,11 +1,11 @@
1
1
  import Java from 'tree-sitter-java';
2
2
  import { compilePatterns, runCompiledPatterns, unquoteLiteral, } from '../tree-sitter-scanner.js';
3
- import { METHOD_ANNOTATION_TO_HTTP, isRouteMemberKey, findEnclosingClass, joinPath, } from '../../../ingestion/route-extractors/spring-shared.js';
3
+ import { springAnnotationHttpMethods, intersectSpringHttpMethods, isRouteMemberKey, findEnclosingClass, joinPath, } from '../../../ingestion/route-extractors/spring-shared.js';
4
4
  import { REST_TEMPLATE_TO_HTTP, WEB_CLIENT_SHORT_TO_HTTP, WEB_CLIENT_LONG_VERB_RE, EXCHANGE_ANNOTATION_TO_HTTP, parseRequestLine, pushPrefix, scanSpringInheritanceProject, OPENFEIGN_FRAMEWORK, HTTP_INTERFACE_FRAMEWORK, FEIGN_CONFIDENCE, REQUEST_LINE_CONFIDENCE, EXCHANGE_CONFIDENCE, } from './spring-consumer-shared.js';
5
5
  import { extractStaticPathExpression, inferOkHttpMethod, inferHttpClientMethod, okHttpUrlRootsAtBuilder, httpClientUriRootsAtNewBuilder, httpClientChainHasUriCall, } from './java-static-path.js';
6
6
  /**
7
7
  * Java HTTP plugin. Handles:
8
- * - Spring `@RequestMapping` class prefixes + `@(Get|Post|...)Mapping` method annotations
8
+ * - Spring `@RequestMapping` class prefixes + shortcut/`@RequestMapping` method annotations
9
9
  * - Spring `RestTemplate.getForObject/...`, `exchange(...)`
10
10
  * - Spring `WebClient.method(HttpMethod.X, ...)`, `WebClient.get().uri(...)`
11
11
  * - OkHttp `new Request.Builder().url("...")`
@@ -345,6 +345,33 @@ function getNodeName(node) {
345
345
  function simpleName(text) {
346
346
  return text.split('.').pop() ?? text;
347
347
  }
348
+ function declarationAnnotations(node) {
349
+ const modifiers = node.namedChildren.find((child) => child.type === 'modifiers');
350
+ if (!modifiers)
351
+ return [];
352
+ return modifiers.namedChildren.filter((child) => child.type === 'annotation' || child.type === 'marker_annotation');
353
+ }
354
+ function annotationHasRouteMember(annotation) {
355
+ const args = annotation.childForFieldName('arguments');
356
+ if (!args)
357
+ return false;
358
+ for (const child of args.namedChildren) {
359
+ if (child.type !== 'element_value_pair')
360
+ return true;
361
+ const key = child.childForFieldName('key');
362
+ if (isRouteMemberKey(key ?? undefined))
363
+ return true;
364
+ }
365
+ return false;
366
+ }
367
+ function typeRequestMethods(typeNode) {
368
+ const mappings = declarationAnnotations(typeNode).filter((annotation) => simpleName(annotation.childForFieldName('name')?.text ?? '') === 'RequestMapping');
369
+ if (mappings.length === 0)
370
+ return ['*'];
371
+ if (mappings.length !== 1)
372
+ return [];
373
+ return springAnnotationHttpMethods('RequestMapping', mappings[0].text);
374
+ }
348
375
  function hasAnnotation(node, names) {
349
376
  const modifiers = node.namedChildren.find((child) => child.type === 'modifiers');
350
377
  if (!modifiers)
@@ -385,6 +412,7 @@ function scanRouteAnnotations(tree) {
385
412
  const methodRoutes = [];
386
413
  const requestLines = [];
387
414
  const exchangeRoutes = [];
415
+ const httpMethodsByAnnotationId = new Map();
388
416
  // Interface `@RequestMapping` prefixes rank below `@FeignClient(path)`;
389
417
  // collect them and apply only after the FeignClient pass below.
390
418
  const interfaceRequestMappingPrefixes = [];
@@ -405,19 +433,30 @@ function scanRouteAnnotations(tree) {
405
433
  const ann = simpleName(annNode.text);
406
434
  const keyNode = captures.key; // undefined for the positional shape
407
435
  if (node.type === 'method_declaration') {
408
- // Method-level: a Spring `@(Get|...)Mapping` route, or native `@RequestLine`.
409
- const httpMethod = METHOD_ANNOTATION_TO_HTTP[ann];
410
- if (httpMethod) {
436
+ // Method-level: a Spring shortcut/`@RequestMapping` route, or native `@RequestLine`.
437
+ const annotationNode = annNode.parent;
438
+ if (!annotationNode)
439
+ continue;
440
+ let httpMethods = httpMethodsByAnnotationId.get(annotationNode.id);
441
+ if (!httpMethods) {
442
+ httpMethods = springAnnotationHttpMethods(ann, annotationNode.text);
443
+ httpMethodsByAnnotationId.set(annotationNode.id, httpMethods);
444
+ }
445
+ if (httpMethods.length > 0) {
446
+ const feignHttpMethod = httpMethods.length === 1 ? (httpMethods[0] === '*' ? 'GET' : httpMethods[0]) : null;
411
447
  if (!isRouteMemberKey(keyNode))
412
448
  continue;
413
449
  const rawPath = unquoteLiteral(valueNode.text);
414
450
  if (rawPath !== null) {
415
- methodRoutes.push({
416
- methodNode: node,
417
- methodName: captures.member?.text ?? null,
418
- httpMethod,
419
- rawPath,
420
- });
451
+ for (const httpMethod of httpMethods) {
452
+ methodRoutes.push({
453
+ methodNode: node,
454
+ methodName: captures.member?.text ?? null,
455
+ httpMethod,
456
+ rawPath,
457
+ feignHttpMethod,
458
+ });
459
+ }
421
460
  }
422
461
  }
423
462
  else if (ann === 'RequestLine') {
@@ -483,6 +522,42 @@ function scanRouteAnnotations(tree) {
483
522
  pushPrefix(httpExchangePrefixByTypeId, node.id, prefix);
484
523
  }
485
524
  }
525
+ const classHttpMethodsByTypeId = new Map();
526
+ for (const match of runCompiledPatterns(SPRING_TYPE_DECLARATION_PATTERNS, tree)) {
527
+ const typeNode = match.captures.type;
528
+ if (!typeNode)
529
+ continue;
530
+ const classMethods = typeRequestMethods(typeNode);
531
+ classHttpMethodsByTypeId.set(typeNode.id, classMethods);
532
+ for (const methodNode of collectDirectMethods(typeNode)) {
533
+ for (const annotationNode of declarationAnnotations(methodNode)) {
534
+ if (annotationHasRouteMember(annotationNode))
535
+ continue;
536
+ const ann = simpleName(annotationNode.childForFieldName('name')?.text ?? '');
537
+ const httpMethods = springAnnotationHttpMethods(ann, annotationNode.text);
538
+ if (httpMethods.length === 0)
539
+ continue;
540
+ const feignHttpMethod = httpMethods.length === 1 ? (httpMethods[0] === '*' ? 'GET' : httpMethods[0]) : null;
541
+ for (const httpMethod of httpMethods) {
542
+ methodRoutes.push({
543
+ methodNode,
544
+ methodName: getNodeName(methodNode),
545
+ httpMethod,
546
+ rawPath: '',
547
+ feignHttpMethod,
548
+ });
549
+ }
550
+ }
551
+ }
552
+ }
553
+ const constrainedMethodRoutes = methodRoutes.flatMap((route) => {
554
+ const typeNode = findEnclosingInterface(route.methodNode) ?? findEnclosingClass(route.methodNode);
555
+ const classMethods = typeNode ? (classHttpMethodsByTypeId.get(typeNode.id) ?? ['*']) : ['*'];
556
+ return intersectSpringHttpMethods(classMethods, [route.httpMethod]).map((httpMethod) => ({
557
+ ...route,
558
+ httpMethod,
559
+ }));
560
+ });
486
561
  // `@RequestMapping` on a Feign interface is the fallback prefix, but only when
487
562
  // the interface has no `@FeignClient(path)` of its own (path wins).
488
563
  for (const { id, prefix } of interfaceRequestMappingPrefixes) {
@@ -493,7 +568,7 @@ function scanRouteAnnotations(tree) {
493
568
  prefixByTypeId,
494
569
  feignPrefixByInterfaceId,
495
570
  httpExchangePrefixByTypeId,
496
- methodRoutes,
571
+ methodRoutes: constrainedMethodRoutes,
497
572
  requestLines,
498
573
  exchangeRoutes,
499
574
  };
@@ -600,7 +675,7 @@ export const JAVA_HTTP_PLUGIN = {
600
675
  const out = [];
601
676
  // ─── Spring providers + OpenFeign consumers (one query pass) ────
602
677
  // `scanRouteAnnotations` resolves every route-defining annotation —
603
- // class/interface prefixes, method `@(Get|...)Mapping`s and native
678
+ // class/interface prefixes, method shortcut/`@RequestMapping`s and native
604
679
  // `@RequestLine`s — from a single `matches()` pass over the tree.
605
680
  const { prefixByTypeId, feignPrefixByInterfaceId, httpExchangePrefixByTypeId, methodRoutes, requestLines, exchangeRoutes, } = scanRouteAnnotations(tree);
606
681
  // A `@(Get|...)Mapping` inside a `@FeignClient` interface is an OpenFeign
@@ -611,12 +686,14 @@ export const JAVA_HTTP_PLUGIN = {
611
686
  for (const route of methodRoutes) {
612
687
  const enclosingInterface = findEnclosingInterface(route.methodNode);
613
688
  if (enclosingInterface && hasAnnotation(enclosingInterface, 'FeignClient')) {
689
+ if (!route.feignHttpMethod)
690
+ continue;
614
691
  const prefixes = feignPrefixByInterfaceId.get(enclosingInterface.id) ?? [''];
615
692
  for (const prefix of prefixes) {
616
693
  out.push({
617
694
  role: 'consumer',
618
695
  framework: OPENFEIGN_FRAMEWORK,
619
- method: route.httpMethod,
696
+ method: route.feignHttpMethod,
620
697
  path: joinPath(prefix, route.rawPath),
621
698
  name: route.methodName,
622
699
  line: route.methodNode.startPosition.row + 1,
@@ -1,6 +1,7 @@
1
1
  import JavaScript from 'tree-sitter-javascript';
2
2
  import TypeScript from 'tree-sitter-typescript';
3
3
  import { compilePatterns, runCompiledPatterns, unquoteLiteral, } from '../tree-sitter-scanner.js';
4
+ import { DATA_ROUTE_TABLE_SOURCE, scanDataRouteTables, } from '../../../ingestion/route-extractors/data-route-table.js';
4
5
  /**
5
6
  * Node.js / TypeScript HTTP plugin family. Handles:
6
7
  * - NestJS `@Controller('prefix')` classes with `@Get(':id')` methods
@@ -530,6 +531,24 @@ function scanBundle(bundle, tree) {
530
531
  confidence: 0.7,
531
532
  });
532
533
  }
534
+ for (const route of scanDataRouteTables(tree)) {
535
+ const imported = route.handlerLocalName === undefined ? undefined : importMap.get(route.handlerLocalName);
536
+ out.push({
537
+ role: 'provider',
538
+ framework: DATA_ROUTE_TABLE_SOURCE,
539
+ method: route.method,
540
+ path: route.path,
541
+ // A source-only scan can prove a bare local/imported binding. Member
542
+ // ownership needs the semantic model, so leave it unattributed here;
543
+ // the graph-backed path consumes the exact handlerSymbolId later.
544
+ name: imported?.name ?? (route.handlerLocalName === undefined ? null : route.handlerName),
545
+ ...(imported === undefined ? {} : { handlerImport: imported }),
546
+ strictHandlerResolution: true,
547
+ ...(route.handlerLocalName === undefined ? { unresolvedHandler: true } : {}),
548
+ line: route.line,
549
+ confidence: 0.8,
550
+ });
551
+ }
533
552
  return out;
534
553
  }
535
554
  export const JAVASCRIPT_HTTP_PLUGIN = {
@@ -56,6 +56,14 @@ export interface HttpDetection {
56
56
  name: string;
57
57
  module: string;
58
58
  };
59
+ /** Resolve only from the registration file or exact import target; never guess repo-wide. */
60
+ strictHandlerResolution?: boolean;
61
+ /**
62
+ * The plugin saw a provider handler designator but could not prove its owner.
63
+ * Prevents the orchestrator from treating it as an anonymous inline handler
64
+ * and attributing it to the containing registrar function.
65
+ */
66
+ unresolvedHandler?: boolean;
59
67
  /** Confidence in (0, 1]. Source-scan plugins typically use 0.7–0.8. */
60
68
  confidence: number;
61
69
  }