gitnexus 1.6.10-rc.99 → 1.6.10

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 (775) hide show
  1. package/README.md +177 -18
  2. package/dist/_shared/graph/types.d.ts +21 -2
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/index.d.ts +3 -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 +16 -0
  11. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  12. package/dist/_shared/integrations/resilient-fetch.js +19 -7
  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/evidence-weights.d.ts.map +1 -1
  20. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +5 -0
  21. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
  22. package/dist/_shared/scope-resolution/finalize-algorithm.js +315 -36
  23. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  24. package/dist/_shared/scope-resolution/reference-site.d.ts +115 -0
  25. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  26. package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
  27. package/dist/_shared/scope-resolution/registries/lookup-core.d.ts.map +1 -1
  28. package/dist/_shared/scope-resolution/registries/lookup-core.js +58 -2
  29. package/dist/_shared/scope-resolution/registries/lookup-core.js.map +1 -1
  30. package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
  31. package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
  32. package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
  33. package/dist/_shared/scope-resolution/symbol-definition.d.ts +47 -0
  34. package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
  35. package/dist/_shared/scope-resolution/types.d.ts +278 -3
  36. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  37. package/dist/cli/ai-context.d.ts +3 -2
  38. package/dist/cli/ai-context.js +71 -16
  39. package/dist/cli/analyze-config.d.ts +1 -1
  40. package/dist/cli/analyze-options.d.ts +131 -0
  41. package/dist/cli/analyze-options.js +1 -0
  42. package/dist/cli/analyze.d.ts +21 -113
  43. package/dist/cli/analyze.js +172 -29
  44. package/dist/cli/cli-message.d.ts +1 -1
  45. package/dist/cli/detect-changes-format.js +19 -2
  46. package/dist/cli/doctor.d.ts +12 -0
  47. package/dist/cli/doctor.js +32 -5
  48. package/dist/cli/editor-targets.js +6 -0
  49. package/dist/cli/eval-server.js +2 -1
  50. package/dist/cli/format-symbol.d.ts +15 -0
  51. package/dist/cli/format-symbol.js +17 -0
  52. package/dist/cli/generated-skill.d.ts +17 -0
  53. package/dist/cli/generated-skill.js +1 -0
  54. package/dist/cli/group.js +229 -21
  55. package/dist/cli/help-i18n.js +1 -2
  56. package/dist/cli/i18n/en.d.ts +11 -9
  57. package/dist/cli/i18n/en.js +13 -9
  58. package/dist/cli/i18n/resources.d.ts +15 -11
  59. package/dist/cli/i18n/zh-CN.d.ts +4 -2
  60. package/dist/cli/i18n/zh-CN.js +11 -9
  61. package/dist/cli/index.js +8 -4
  62. package/dist/cli/resolve-invocation.d.ts +7 -3
  63. package/dist/cli/resolve-invocation.js +7 -3
  64. package/dist/cli/setup.js +4 -3
  65. package/dist/cli/skill-gen.d.ts +1 -6
  66. package/dist/cli/tool.d.ts +1 -0
  67. package/dist/cli/tool.js +74 -17
  68. package/dist/cli/wiki.js +53 -10
  69. package/dist/config/ignore-service.d.ts +2 -0
  70. package/dist/config/ignore-service.js +54 -13
  71. package/dist/core/analyzer-identity.d.ts +80 -0
  72. package/dist/core/analyzer-identity.js +364 -26
  73. package/dist/core/augmentation/engine.js +86 -71
  74. package/dist/core/embedding-checkpoint.d.ts +143 -0
  75. package/dist/core/embedding-checkpoint.js +221 -0
  76. package/dist/core/embedding-count.d.ts +61 -0
  77. package/dist/core/embedding-count.js +69 -0
  78. package/dist/core/embeddings/ast-utils.js +9 -1
  79. package/dist/core/embeddings/embedding-pipeline.d.ts +8 -0
  80. package/dist/core/embeddings/embedding-pipeline.js +253 -14
  81. package/dist/core/embeddings/http-client.d.ts +5 -0
  82. package/dist/core/embeddings/http-client.js +142 -27
  83. package/dist/core/graph/graph.js +3 -0
  84. package/dist/core/graph/import-cycles.d.ts +194 -3
  85. package/dist/core/graph/import-cycles.js +522 -73
  86. package/dist/core/graph/types.d.ts +18 -0
  87. package/dist/core/group/bridge-db.d.ts +204 -1
  88. package/dist/core/group/bridge-db.js +401 -28
  89. package/dist/core/group/completeness.d.ts +130 -0
  90. package/dist/core/group/completeness.js +83 -0
  91. package/dist/core/group/config-parser.js +0 -5
  92. package/dist/core/group/cross-impact.d.ts +46 -1
  93. package/dist/core/group/cross-impact.js +220 -19
  94. package/dist/core/group/cross-trace.d.ts +32 -11
  95. package/dist/core/group/cross-trace.js +114 -20
  96. package/dist/core/group/extractors/http-patterns/java.js +278 -22
  97. package/dist/core/group/extractors/http-patterns/node.js +332 -216
  98. package/dist/core/group/extractors/http-patterns/types.d.ts +8 -0
  99. package/dist/core/group/extractors/http-route-extractor.d.ts +1 -0
  100. package/dist/core/group/extractors/http-route-extractor.js +122 -48
  101. package/dist/core/group/extractors/include-extractor.js +20 -2
  102. package/dist/core/group/extractors/manifest-extractor.d.ts +1 -1
  103. package/dist/core/group/extractors/manifest-extractor.js +7 -7
  104. package/dist/core/group/extractors/python-workspace-extractor.js +5 -2
  105. package/dist/core/group/group-lock.d.ts +31 -0
  106. package/dist/core/group/group-lock.js +166 -0
  107. package/dist/core/group/service.js +297 -16
  108. package/dist/core/group/storage.d.ts +3 -0
  109. package/dist/core/group/storage.js +7 -39
  110. package/dist/core/group/sync.d.ts +49 -3
  111. package/dist/core/group/sync.js +0 -0
  112. package/dist/core/group/types.d.ts +183 -8
  113. package/dist/core/group/types.js +28 -1
  114. package/dist/core/incremental/subgraph-extract.d.ts +9 -6
  115. package/dist/core/incremental/subgraph-extract.js +33 -10
  116. package/dist/core/index-freshness.d.ts +77 -2
  117. package/dist/core/index-freshness.js +109 -2
  118. package/dist/core/ingestion/call-processor.d.ts +13 -1
  119. package/dist/core/ingestion/call-processor.js +110 -3
  120. package/dist/core/ingestion/cfg/callee-cell-format.d.ts +42 -0
  121. package/dist/core/ingestion/cfg/callee-cell-format.js +42 -0
  122. package/dist/core/ingestion/cfg/emit.d.ts +8 -23
  123. package/dist/core/ingestion/cfg/emit.js +9 -23
  124. package/dist/core/ingestion/class-extractors/configs/go.js +10 -5
  125. package/dist/core/ingestion/cluster-enricher.js +8 -4
  126. package/dist/core/ingestion/community-processor.d.ts +21 -3
  127. package/dist/core/ingestion/community-processor.js +81 -82
  128. package/dist/core/ingestion/di-extractors/index.d.ts +9 -33
  129. package/dist/core/ingestion/di-extractors/spring.d.ts +1 -1
  130. package/dist/core/ingestion/di-extractors/spring.js +8 -1
  131. package/dist/core/ingestion/di-extractors/types.d.ts +60 -0
  132. package/dist/core/ingestion/di-extractors/types.js +15 -0
  133. package/dist/core/ingestion/filesystem-walker.js +30 -14
  134. package/dist/core/ingestion/finalize-orchestrator.js +1 -0
  135. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +6 -0
  136. package/dist/core/ingestion/frameworks/spring/analysis-features.js +35 -1
  137. package/dist/core/ingestion/frameworks/spring/annotation-arguments.d.ts +13 -0
  138. package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +227 -0
  139. package/dist/core/ingestion/frameworks/spring/aop-candidates.d.ts +15 -0
  140. package/dist/core/ingestion/frameworks/spring/aop-candidates.js +85 -0
  141. package/dist/core/ingestion/frameworks/spring/aop.d.ts +118 -0
  142. package/dist/core/ingestion/frameworks/spring/aop.js +476 -0
  143. package/dist/core/ingestion/frameworks/spring/auto-configuration.d.ts +8 -0
  144. package/dist/core/ingestion/frameworks/spring/auto-configuration.js +16 -0
  145. package/dist/core/ingestion/frameworks/spring/bean-catalog.js +1 -0
  146. package/dist/core/ingestion/frameworks/spring/bean-factories.d.ts +33 -0
  147. package/dist/core/ingestion/frameworks/spring/bean-factories.js +65 -0
  148. package/dist/core/ingestion/frameworks/spring/conditionals.d.ts +25 -0
  149. package/dist/core/ingestion/frameworks/spring/conditionals.js +319 -0
  150. package/dist/core/ingestion/frameworks/spring/di-metadata.d.ts +3 -0
  151. package/dist/core/ingestion/frameworks/spring/di-metadata.js +162 -13
  152. package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +28 -0
  153. package/dist/core/ingestion/frameworks/spring/non-http-handlers.js +152 -0
  154. package/dist/core/ingestion/frameworks/spring/resource-injection.d.ts +5 -0
  155. package/dist/core/ingestion/frameworks/spring/resource-injection.js +91 -0
  156. package/dist/core/ingestion/import-resolvers/configs/csharp.js +5 -1
  157. package/dist/core/ingestion/import-resolvers/configs/swift.js +13 -0
  158. package/dist/core/ingestion/import-resolvers/csharp.d.ts +9 -1
  159. package/dist/core/ingestion/import-resolvers/csharp.js +234 -27
  160. package/dist/core/ingestion/import-resolvers/go.d.ts +11 -1
  161. package/dist/core/ingestion/import-resolvers/go.js +44 -17
  162. package/dist/core/ingestion/import-resolvers/jvm.d.ts +2 -2
  163. package/dist/core/ingestion/import-resolvers/node-workspace-packages.d.ts +90 -0
  164. package/dist/core/ingestion/import-resolvers/node-workspace-packages.js +429 -0
  165. package/dist/core/ingestion/import-resolvers/package-dir-index.d.ts +124 -0
  166. package/dist/core/ingestion/import-resolvers/package-dir-index.js +223 -0
  167. package/dist/core/ingestion/import-resolvers/pass-cache.d.ts +50 -0
  168. package/dist/core/ingestion/import-resolvers/pass-cache.js +60 -0
  169. package/dist/core/ingestion/import-resolvers/per-file-set.d.ts +71 -0
  170. package/dist/core/ingestion/import-resolvers/per-file-set.js +11 -0
  171. package/dist/core/ingestion/import-resolvers/php.d.ts +1 -1
  172. package/dist/core/ingestion/import-resolvers/php.js +65 -19
  173. package/dist/core/ingestion/import-resolvers/python-file-index.d.ts +201 -0
  174. package/dist/core/ingestion/import-resolvers/python-file-index.js +302 -0
  175. package/dist/core/ingestion/import-resolvers/python.js +25 -6
  176. package/dist/core/ingestion/import-resolvers/ruby.d.ts +1 -1
  177. package/dist/core/ingestion/import-resolvers/rust.d.ts +2 -2
  178. package/dist/core/ingestion/import-resolvers/standard.d.ts +1 -1
  179. package/dist/core/ingestion/import-resolvers/types.d.ts +1 -12
  180. package/dist/core/ingestion/import-resolvers/utils.d.ts +65 -6
  181. package/dist/core/ingestion/import-resolvers/utils.js +215 -36
  182. package/dist/core/ingestion/import-resolvers/workspace-file-index.d.ts +72 -0
  183. package/dist/core/ingestion/import-resolvers/workspace-file-index.js +58 -0
  184. package/dist/core/ingestion/language-config.d.ts +29 -1
  185. package/dist/core/ingestion/language-config.js +110 -35
  186. package/dist/core/ingestion/language-provider.d.ts +209 -7
  187. package/dist/core/ingestion/language-provider.js +37 -0
  188. package/dist/core/ingestion/languages/c/captures.js +7 -0
  189. package/dist/core/ingestion/languages/c/import-target.js +12 -16
  190. package/dist/core/ingestion/languages/c/scope-resolver.js +20 -19
  191. package/dist/core/ingestion/languages/c/static-linkage.js +12 -16
  192. package/dist/core/ingestion/languages/c-cpp.js +13 -0
  193. package/dist/core/ingestion/languages/cobol/scope-resolver.js +27 -20
  194. package/dist/core/ingestion/languages/cobol.js +13 -0
  195. package/dist/core/ingestion/languages/cpp/adl.d.ts +2 -2
  196. package/dist/core/ingestion/languages/cpp/adl.js +67 -44
  197. package/dist/core/ingestion/languages/cpp/captures.js +14 -2
  198. package/dist/core/ingestion/languages/cpp/file-local-linkage.js +11 -15
  199. package/dist/core/ingestion/languages/cpp/inline-namespaces.d.ts +28 -8
  200. package/dist/core/ingestion/languages/cpp/inline-namespaces.js +242 -68
  201. package/dist/core/ingestion/languages/cpp/interpret.d.ts +2 -0
  202. package/dist/core/ingestion/languages/cpp/interpret.js +126 -6
  203. package/dist/core/ingestion/languages/cpp/query.js +106 -0
  204. package/dist/core/ingestion/languages/cpp/scope-resolver.js +48 -20
  205. package/dist/core/ingestion/languages/csharp/accessor-unwrap.d.ts +2 -15
  206. package/dist/core/ingestion/languages/csharp/accessor-unwrap.js +18 -10
  207. package/dist/core/ingestion/languages/csharp/captures.js +19 -0
  208. package/dist/core/ingestion/languages/csharp/import-target.js +46 -72
  209. package/dist/core/ingestion/languages/csharp/namespace-siblings.js +5 -1
  210. package/dist/core/ingestion/languages/csharp/query.js +25 -5
  211. package/dist/core/ingestion/languages/csharp/scope-resolver.js +75 -2
  212. package/dist/core/ingestion/languages/dart/captures.d.ts +10 -0
  213. package/dist/core/ingestion/languages/dart/captures.js +598 -16
  214. package/dist/core/ingestion/languages/dart/import-target.js +32 -9
  215. package/dist/core/ingestion/languages/dart/index.d.ts +1 -1
  216. package/dist/core/ingestion/languages/dart/index.js +1 -1
  217. package/dist/core/ingestion/languages/dart/query.js +98 -1
  218. package/dist/core/ingestion/languages/dart/scope-resolver.js +14 -3
  219. package/dist/core/ingestion/languages/dart/simple-hooks.js +9 -0
  220. package/dist/core/ingestion/languages/dart.js +6 -1
  221. package/dist/core/ingestion/languages/go/captures.js +108 -3
  222. package/dist/core/ingestion/languages/go/generic-type-parameters.d.ts +31 -0
  223. package/dist/core/ingestion/languages/go/generic-type-parameters.js +140 -0
  224. package/dist/core/ingestion/languages/go/import-target.d.ts +3 -10
  225. package/dist/core/ingestion/languages/go/import-target.js +34 -30
  226. package/dist/core/ingestion/languages/go/index.d.ts +1 -1
  227. package/dist/core/ingestion/languages/go/interface-impls.d.ts +9 -1
  228. package/dist/core/ingestion/languages/go/interface-impls.js +693 -87
  229. package/dist/core/ingestion/languages/go/interpret.d.ts +2 -0
  230. package/dist/core/ingestion/languages/go/interpret.js +22 -8
  231. package/dist/core/ingestion/languages/go/method-owners.js +31 -12
  232. package/dist/core/ingestion/languages/go/package-clause.d.ts +46 -0
  233. package/dist/core/ingestion/languages/go/package-clause.js +75 -0
  234. package/dist/core/ingestion/languages/go/package-siblings.js +7 -11
  235. package/dist/core/ingestion/languages/go/query.js +56 -3
  236. package/dist/core/ingestion/languages/go/scope-resolver.js +39 -0
  237. package/dist/core/ingestion/languages/go.js +9 -0
  238. package/dist/core/ingestion/languages/java/analysis-features.d.ts +4 -0
  239. package/dist/core/ingestion/languages/java/analysis-features.js +12 -0
  240. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +12 -0
  241. package/dist/core/ingestion/languages/java/capture-side-channel.js +48 -0
  242. package/dist/core/ingestion/languages/java/captures.js +77 -32
  243. package/dist/core/ingestion/languages/java/import-target.d.ts +49 -9
  244. package/dist/core/ingestion/languages/java/import-target.js +68 -88
  245. package/dist/core/ingestion/languages/java/interpret.js +3 -2
  246. package/dist/core/ingestion/languages/java/module-resolution.d.ts +62 -0
  247. package/dist/core/ingestion/languages/java/module-resolution.js +142 -0
  248. package/dist/core/ingestion/languages/java/query.js +15 -3
  249. package/dist/core/ingestion/languages/java/record-components.d.ts +14 -0
  250. package/dist/core/ingestion/languages/java/record-components.js +185 -0
  251. package/dist/core/ingestion/languages/java/scope-resolver.js +10 -2
  252. package/dist/core/ingestion/languages/java/spring-aop.d.ts +12 -0
  253. package/dist/core/ingestion/languages/java/spring-aop.js +49 -0
  254. package/dist/core/ingestion/languages/java/spring-conditionals.d.ts +11 -0
  255. package/dist/core/ingestion/languages/java/spring-conditionals.js +48 -0
  256. package/dist/core/ingestion/languages/java/spring-di.d.ts +4 -1
  257. package/dist/core/ingestion/languages/java/spring-di.js +41 -9
  258. package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +7 -0
  259. package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +32 -0
  260. package/dist/core/ingestion/languages/java.js +94 -3
  261. package/dist/core/ingestion/languages/javascript/captures.d.ts +6 -1
  262. package/dist/core/ingestion/languages/javascript/captures.js +262 -4
  263. package/dist/core/ingestion/languages/javascript/import-target.d.ts +17 -21
  264. package/dist/core/ingestion/languages/javascript/import-target.js +24 -41
  265. package/dist/core/ingestion/languages/javascript/index.d.ts +54 -5
  266. package/dist/core/ingestion/languages/javascript/index.js +54 -5
  267. package/dist/core/ingestion/languages/javascript/query.d.ts +1 -0
  268. package/dist/core/ingestion/languages/javascript/query.js +211 -5
  269. package/dist/core/ingestion/languages/javascript/scope-resolver.js +12 -0
  270. package/dist/core/ingestion/languages/javascript/simple-hooks.js +2 -1
  271. package/dist/core/ingestion/languages/jvm/package-siblings.js +77 -9
  272. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
  273. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +48 -0
  274. package/dist/core/ingestion/languages/kotlin/captures.js +43 -1
  275. package/dist/core/ingestion/languages/kotlin/import-target.d.ts +8 -1
  276. package/dist/core/ingestion/languages/kotlin/import-target.js +20 -123
  277. package/dist/core/ingestion/languages/kotlin/index.d.ts +1 -0
  278. package/dist/core/ingestion/languages/kotlin/index.js +1 -0
  279. package/dist/core/ingestion/languages/kotlin/module-resolution.d.ts +22 -0
  280. package/dist/core/ingestion/languages/kotlin/module-resolution.js +108 -0
  281. package/dist/core/ingestion/languages/kotlin/query.js +28 -2
  282. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +23 -2
  283. package/dist/core/ingestion/languages/kotlin/spring-aop.d.ts +12 -0
  284. package/dist/core/ingestion/languages/kotlin/spring-aop.js +64 -0
  285. package/dist/core/ingestion/languages/kotlin/spring-conditionals.d.ts +12 -0
  286. package/dist/core/ingestion/languages/kotlin/spring-conditionals.js +49 -0
  287. package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +2 -0
  288. package/dist/core/ingestion/languages/kotlin/spring-di.js +60 -11
  289. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +10 -0
  290. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +41 -0
  291. package/dist/core/ingestion/languages/php/captures.d.ts +5 -0
  292. package/dist/core/ingestion/languages/php/captures.js +319 -51
  293. package/dist/core/ingestion/languages/php/import-target.d.ts +3 -4
  294. package/dist/core/ingestion/languages/php/import-target.js +192 -62
  295. package/dist/core/ingestion/languages/php/query.js +31 -0
  296. package/dist/core/ingestion/languages/python/arity-metadata.d.ts +1 -0
  297. package/dist/core/ingestion/languages/python/arity-metadata.js +1 -0
  298. package/dist/core/ingestion/languages/python/captures.js +29 -0
  299. package/dist/core/ingestion/languages/python/import-decomposer.js +22 -1
  300. package/dist/core/ingestion/languages/python/import-target.d.ts +42 -1
  301. package/dist/core/ingestion/languages/python/import-target.js +277 -91
  302. package/dist/core/ingestion/languages/python/index.d.ts +1 -1
  303. package/dist/core/ingestion/languages/python/index.js +1 -1
  304. package/dist/core/ingestion/languages/python/interpret.d.ts +52 -0
  305. package/dist/core/ingestion/languages/python/interpret.js +249 -7
  306. package/dist/core/ingestion/languages/python/query.js +9 -0
  307. package/dist/core/ingestion/languages/python/receiver-binding.d.ts +8 -6
  308. package/dist/core/ingestion/languages/python/receiver-binding.js +108 -12
  309. package/dist/core/ingestion/languages/python/scope-resolver.js +27 -4
  310. package/dist/core/ingestion/languages/python/simple-hooks.js +2 -8
  311. package/dist/core/ingestion/languages/python.js +13 -0
  312. package/dist/core/ingestion/languages/ruby/captures.js +158 -0
  313. package/dist/core/ingestion/languages/ruby/import-target.js +7 -5
  314. package/dist/core/ingestion/languages/ruby/query.js +93 -0
  315. package/dist/core/ingestion/languages/ruby/scope-resolver.js +2 -0
  316. package/dist/core/ingestion/languages/ruby/simple-hooks.d.ts +1 -1
  317. package/dist/core/ingestion/languages/ruby/simple-hooks.js +22 -1
  318. package/dist/core/ingestion/languages/rust/captures.js +39 -1
  319. package/dist/core/ingestion/languages/rust/method-owners.js +11 -1
  320. package/dist/core/ingestion/languages/rust/module-path.d.ts +126 -0
  321. package/dist/core/ingestion/languages/rust/module-path.js +214 -0
  322. package/dist/core/ingestion/languages/rust/qualified-call.d.ts +41 -0
  323. package/dist/core/ingestion/languages/rust/qualified-call.js +481 -0
  324. package/dist/core/ingestion/languages/rust/query.js +39 -6
  325. package/dist/core/ingestion/languages/rust/scope-resolver.js +21 -2
  326. package/dist/core/ingestion/languages/rust.js +17 -0
  327. package/dist/core/ingestion/languages/swift/captures.js +87 -3
  328. package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.d.ts +48 -0
  329. package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.js +253 -0
  330. package/dist/core/ingestion/languages/swift/import-target.js +4 -9
  331. package/dist/core/ingestion/languages/swift/query.js +17 -0
  332. package/dist/core/ingestion/languages/swift/receiver-binding.d.ts +8 -0
  333. package/dist/core/ingestion/languages/swift/receiver-binding.js +6 -2
  334. package/dist/core/ingestion/languages/swift.js +2 -0
  335. package/dist/core/ingestion/languages/typescript/captures.d.ts +90 -1
  336. package/dist/core/ingestion/languages/typescript/captures.js +267 -5
  337. package/dist/core/ingestion/languages/typescript/cjs-export-assignment.d.ts +134 -0
  338. package/dist/core/ingestion/languages/typescript/cjs-export-assignment.js +523 -0
  339. package/dist/core/ingestion/languages/typescript/cjs-module-exports.d.ts +54 -0
  340. package/dist/core/ingestion/languages/typescript/cjs-module-exports.js +191 -0
  341. package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.d.ts +7 -0
  342. package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.js +92 -0
  343. package/dist/core/ingestion/languages/typescript/file-candidates.d.ts +29 -0
  344. package/dist/core/ingestion/languages/typescript/file-candidates.js +70 -0
  345. package/dist/core/ingestion/languages/typescript/import-decomposer.d.ts +28 -1
  346. package/dist/core/ingestion/languages/typescript/import-decomposer.js +125 -10
  347. package/dist/core/ingestion/languages/typescript/import-target.d.ts +25 -37
  348. package/dist/core/ingestion/languages/typescript/import-target.js +24 -26
  349. package/dist/core/ingestion/languages/typescript/interpret.d.ts +21 -1
  350. package/dist/core/ingestion/languages/typescript/interpret.js +45 -5
  351. package/dist/core/ingestion/languages/typescript/module-resolution.d.ts +48 -0
  352. package/dist/core/ingestion/languages/typescript/module-resolution.js +171 -0
  353. package/dist/core/ingestion/languages/typescript/query.d.ts +1 -0
  354. package/dist/core/ingestion/languages/typescript/query.js +303 -14
  355. package/dist/core/ingestion/languages/typescript/receiver-binding.d.ts +17 -0
  356. package/dist/core/ingestion/languages/typescript/receiver-binding.js +27 -0
  357. package/dist/core/ingestion/languages/typescript/scope-resolver.js +27 -40
  358. package/dist/core/ingestion/languages/typescript/simple-hooks.d.ts +0 -10
  359. package/dist/core/ingestion/languages/typescript/simple-hooks.js +22 -22
  360. package/dist/core/ingestion/languages/typescript/tsconfig.d.ts +59 -0
  361. package/dist/core/ingestion/languages/typescript/tsconfig.js +292 -0
  362. package/dist/core/ingestion/languages/typescript.js +93 -2
  363. package/dist/core/ingestion/languages/vue/import-target.d.ts +6 -22
  364. package/dist/core/ingestion/languages/vue/import-target.js +11 -47
  365. package/dist/core/ingestion/languages/vue/scope-resolver.js +4 -2
  366. package/dist/core/ingestion/local-symbol-pruner.js +11 -11
  367. package/dist/core/ingestion/method-extractors/configs/csharp.js +1 -0
  368. package/dist/core/ingestion/method-extractors/generic.js +1 -0
  369. package/dist/core/ingestion/method-types.d.ts +16 -0
  370. package/dist/core/ingestion/pipeline-phases/di.d.ts +1 -1
  371. package/dist/core/ingestion/pipeline-phases/di.js +136 -21
  372. package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
  373. package/dist/core/ingestion/pipeline-phases/index.js +2 -0
  374. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +15 -0
  375. package/dist/core/ingestion/pipeline-phases/parse-impl.js +154 -4
  376. package/dist/core/ingestion/pipeline-phases/parse.js +5 -0
  377. package/dist/core/ingestion/pipeline-phases/processes.d.ts +3 -2
  378. package/dist/core/ingestion/pipeline-phases/processes.js +91 -6
  379. package/dist/core/ingestion/pipeline-phases/routes.js +116 -25
  380. package/dist/core/ingestion/pipeline-phases/spring-aop.d.ts +34 -0
  381. package/dist/core/ingestion/pipeline-phases/spring-aop.js +439 -0
  382. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +34 -0
  383. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +255 -0
  384. package/dist/core/ingestion/pipeline-phases/types.d.ts +7 -0
  385. package/dist/core/ingestion/pipeline.d.ts +26 -2
  386. package/dist/core/ingestion/pipeline.js +60 -11
  387. package/dist/core/ingestion/process-processor.d.ts +109 -2
  388. package/dist/core/ingestion/process-processor.js +464 -52
  389. package/dist/core/ingestion/resolve-references.d.ts +6 -1
  390. package/dist/core/ingestion/resolve-references.js +66 -6
  391. package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +8 -2
  392. package/dist/core/ingestion/route-extractors/constant-resolver.js +11 -7
  393. package/dist/core/ingestion/route-extractors/data-route-table.d.ts +40 -0
  394. package/dist/core/ingestion/route-extractors/data-route-table.js +876 -0
  395. package/dist/core/ingestion/route-extractors/dispatch-guard.d.ts +96 -0
  396. package/dist/core/ingestion/route-extractors/dispatch-guard.js +1184 -0
  397. package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +114 -0
  398. package/dist/core/ingestion/route-extractors/java-const-resolver.js +569 -0
  399. package/dist/core/ingestion/route-extractors/js-const-resolver.d.ts +192 -0
  400. package/dist/core/ingestion/route-extractors/js-const-resolver.js +1033 -0
  401. package/dist/core/ingestion/route-extractors/nest.d.ts +53 -0
  402. package/dist/core/ingestion/route-extractors/nest.js +523 -0
  403. package/dist/core/ingestion/route-extractors/spring-shared.d.ts +11 -0
  404. package/dist/core/ingestion/route-extractors/spring-shared.js +89 -0
  405. package/dist/core/ingestion/route-extractors/spring.js +214 -29
  406. package/dist/core/ingestion/scope-extractor-bridge.js +9 -1
  407. package/dist/core/ingestion/scope-extractor.d.ts +22 -7
  408. package/dist/core/ingestion/scope-extractor.js +309 -15
  409. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +311 -21
  410. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +16 -5
  411. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +12 -0
  412. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +47 -0
  413. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +20 -15
  414. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +280 -42
  415. package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.d.ts +123 -0
  416. package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +171 -17
  417. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.d.ts +58 -1
  418. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +137 -34
  419. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +30 -1
  420. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +39 -1
  421. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +18 -1
  422. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +113 -18
  423. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +107 -5
  424. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +590 -33
  425. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +3 -0
  426. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +101 -41
  427. package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.d.ts +34 -0
  428. package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.js +62 -0
  429. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +5 -1
  430. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +8 -1
  431. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +105 -5
  432. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +931 -92
  433. package/dist/core/ingestion/scope-resolution/passes/return-shape-members.d.ts +58 -0
  434. package/dist/core/ingestion/scope-resolution/passes/return-shape-members.js +458 -0
  435. package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.d.ts +180 -0
  436. package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.js +418 -0
  437. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +29 -0
  438. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +57 -0
  439. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +55 -1
  440. package/dist/core/ingestion/scope-resolution/pipeline/run.js +241 -19
  441. package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +112 -2
  442. package/dist/core/ingestion/scope-resolution/resolution-outcome.js +38 -1
  443. package/dist/core/ingestion/scope-resolution/scope/namespace-targets.d.ts +25 -3
  444. package/dist/core/ingestion/scope-resolution/scope/namespace-targets.js +36 -16
  445. package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +210 -9
  446. package/dist/core/ingestion/scope-resolution/scope/walkers.js +905 -22
  447. package/dist/core/ingestion/scope-resolution/summary-maps.d.ts +28 -0
  448. package/dist/core/ingestion/scope-resolution/summary-maps.js +50 -0
  449. package/dist/core/ingestion/scope-resolution/undecided-satisfaction.d.ts +55 -0
  450. package/dist/core/ingestion/scope-resolution/undecided-satisfaction.js +37 -0
  451. package/dist/core/ingestion/scope-resolution/unresolved-receivers.d.ts +109 -0
  452. package/dist/core/ingestion/scope-resolution/unresolved-receivers.js +204 -0
  453. package/dist/core/ingestion/scope-resolution/utils/definition-id.d.ts +13 -0
  454. package/dist/core/ingestion/scope-resolution/utils/definition-id.js +19 -0
  455. package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.d.ts +171 -0
  456. package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.js +218 -0
  457. package/dist/core/ingestion/scope-resolution/workspace-index-types.d.ts +34 -0
  458. package/dist/core/ingestion/scope-resolution/workspace-index-types.js +15 -0
  459. package/dist/core/ingestion/scope-resolution/workspace-index.d.ts +7 -20
  460. package/dist/core/ingestion/tree-sitter-queries.d.ts +11 -11
  461. package/dist/core/ingestion/tree-sitter-queries.js +678 -4
  462. package/dist/core/ingestion/type-env.js +11 -7
  463. package/dist/core/ingestion/type-extractors/shared.d.ts +17 -0
  464. package/dist/core/ingestion/type-extractors/shared.js +16 -0
  465. package/dist/core/ingestion/type-extractors/types.d.ts +12 -0
  466. package/dist/core/ingestion/type-extractors/typescript.d.ts +20 -0
  467. package/dist/core/ingestion/type-extractors/typescript.js +26 -0
  468. package/dist/core/ingestion/utils/ast-helpers.d.ts +297 -15
  469. package/dist/core/ingestion/utils/ast-helpers.js +578 -46
  470. package/dist/core/ingestion/utils/call-analysis.d.ts +27 -22
  471. package/dist/core/ingestion/utils/call-analysis.js +202 -7
  472. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +59 -0
  473. package/dist/core/ingestion/utils/callable-flow-captures.js +51 -1
  474. package/dist/core/ingestion/utils/callable-labels.d.ts +25 -0
  475. package/dist/core/ingestion/utils/callable-labels.js +31 -0
  476. package/dist/core/ingestion/utils/effective-ram.d.ts +40 -0
  477. package/dist/core/ingestion/utils/effective-ram.js +58 -0
  478. package/dist/core/ingestion/utils/line-base.d.ts +14 -0
  479. package/dist/core/ingestion/utils/line-base.js +14 -0
  480. package/dist/core/ingestion/utils/method-props.d.ts +27 -4
  481. package/dist/core/ingestion/utils/method-props.js +29 -4
  482. package/dist/core/ingestion/utils/receiver-chain-captures.d.ts +31 -0
  483. package/dist/core/ingestion/utils/receiver-chain-captures.js +57 -0
  484. package/dist/core/ingestion/utils/receiver-chain-codec.d.ts +89 -0
  485. package/dist/core/ingestion/utils/receiver-chain-codec.js +182 -0
  486. package/dist/core/ingestion/utils/scope-tree-walk.d.ts +22 -0
  487. package/dist/core/ingestion/utils/scope-tree-walk.js +33 -0
  488. package/dist/core/ingestion/utils/template-arguments.d.ts +96 -0
  489. package/dist/core/ingestion/utils/template-arguments.js +196 -0
  490. package/dist/core/ingestion/utils/type-parameters.d.ts +49 -0
  491. package/dist/core/ingestion/utils/type-parameters.js +206 -0
  492. package/dist/core/ingestion/workers/callable-id.d.ts +80 -0
  493. package/dist/core/ingestion/workers/callable-id.js +125 -0
  494. package/dist/core/ingestion/workers/parse-worker.d.ts +14 -1
  495. package/dist/core/ingestion/workers/parse-worker.js +493 -54
  496. package/dist/core/ingestion/workers/worker-pool.d.ts +20 -27
  497. package/dist/core/ingestion/workers/worker-pool.js +91 -3
  498. package/dist/core/lbug/csv-generator.d.ts +27 -0
  499. package/dist/core/lbug/csv-generator.js +72 -17
  500. package/dist/core/lbug/extension-load-error.js +13 -2
  501. package/dist/core/lbug/extension-loader.d.ts +29 -0
  502. package/dist/core/lbug/extension-loader.js +31 -6
  503. package/dist/core/lbug/graph-emit-sink.d.ts +264 -0
  504. package/dist/core/lbug/graph-emit-sink.js +581 -0
  505. package/dist/core/lbug/lbug-adapter.d.ts +290 -11
  506. package/dist/core/lbug/lbug-adapter.js +652 -69
  507. package/dist/core/lbug/native-check.d.ts +21 -0
  508. package/dist/core/lbug/native-check.js +248 -32
  509. package/dist/core/lbug/pdg-emit-sink.d.ts +13 -4
  510. package/dist/core/lbug/pdg-emit-sink.js +21 -111
  511. package/dist/core/lbug/pool-adapter.d.ts +9 -0
  512. package/dist/core/lbug/pool-adapter.js +164 -14
  513. package/dist/core/lbug/query-batch.d.ts +75 -0
  514. package/dist/core/lbug/query-batch.js +102 -0
  515. package/dist/core/lbug/rel-pair-routing.d.ts +160 -2
  516. package/dist/core/lbug/rel-pair-routing.js +228 -10
  517. package/dist/core/lbug/schema.d.ts +163 -4
  518. package/dist/core/lbug/schema.js +404 -159
  519. package/dist/core/lbug/sync-csv-writer.d.ts +47 -0
  520. package/dist/core/lbug/sync-csv-writer.js +108 -0
  521. package/dist/core/run-analyze.d.ts +147 -0
  522. package/dist/core/run-analyze.js +1215 -179
  523. package/dist/core/search/bm25-index.d.ts +11 -0
  524. package/dist/core/search/bm25-index.js +60 -26
  525. package/dist/core/search/fts-indexes.d.ts +150 -9
  526. package/dist/core/search/fts-indexes.js +241 -23
  527. package/dist/core/wiki/graph-queries.js +145 -112
  528. package/dist/core/wiki/llm-client.d.ts +29 -3
  529. package/dist/core/wiki/llm-client.js +47 -12
  530. package/dist/core/wiki/prompts.d.ts +19 -0
  531. package/dist/core/wiki/prompts.js +20 -1
  532. package/dist/lib/utils.d.ts +113 -0
  533. package/dist/lib/utils.js +185 -0
  534. package/dist/mcp/local/aop-metadata.d.ts +77 -0
  535. package/dist/mcp/local/aop-metadata.js +227 -0
  536. package/dist/mcp/local/bean-metadata.d.ts +2 -1
  537. package/dist/mcp/local/bean-metadata.js +22 -1
  538. package/dist/mcp/local/convex-metadata.d.ts +8 -0
  539. package/dist/mcp/local/convex-metadata.js +45 -0
  540. package/dist/mcp/local/local-backend.d.ts +174 -11
  541. package/dist/mcp/local/local-backend.js +1678 -331
  542. package/dist/mcp/local/path-predicate.d.ts +19 -0
  543. package/dist/mcp/local/path-predicate.js +21 -0
  544. package/dist/mcp/local/pdg-impact.d.ts +132 -10
  545. package/dist/mcp/local/pdg-impact.js +391 -98
  546. package/dist/mcp/repository-policy.d.ts +1 -0
  547. package/dist/mcp/repository-policy.js +5 -0
  548. package/dist/mcp/resources.js +26 -4
  549. package/dist/mcp/server.js +23 -13
  550. package/dist/mcp/tools.d.ts +8 -0
  551. package/dist/mcp/tools.js +76 -23
  552. package/dist/server/analyze-job.d.ts +37 -2
  553. package/dist/server/analyze-job.js +13 -2
  554. package/dist/server/analyze-launch.d.ts +1 -1
  555. package/dist/server/analyze-launch.js +79 -10
  556. package/dist/server/analyze-worker-core.d.ts +1 -1
  557. package/dist/server/analyze-worker-core.js +10 -1
  558. package/dist/server/analyze-worker-ipc.d.ts +1 -1
  559. package/dist/server/analyze-worker-ipc.js +4 -0
  560. package/dist/server/analyze-worker-protocol.d.ts +59 -0
  561. package/dist/server/analyze-worker-protocol.js +1 -0
  562. package/dist/server/analyze-worker.d.ts +1 -17
  563. package/dist/server/api.d.ts +2 -11
  564. package/dist/server/api.js +164 -163
  565. package/dist/server/embed-run-outcome.d.ts +89 -0
  566. package/dist/server/embed-run-outcome.js +88 -0
  567. package/dist/server/git-clone.js +6 -2
  568. package/dist/server/middleware.d.ts +116 -9
  569. package/dist/server/middleware.js +291 -22
  570. package/dist/server/sse-progress.d.ts +41 -0
  571. package/dist/server/sse-progress.js +125 -0
  572. package/dist/storage/branch-index.d.ts +11 -6
  573. package/dist/storage/branch-index.js +15 -7
  574. package/dist/storage/file-hash.js +2 -2
  575. package/dist/storage/fs-atomic.d.ts +25 -0
  576. package/dist/storage/fs-atomic.js +42 -0
  577. package/dist/storage/git.d.ts +131 -0
  578. package/dist/storage/git.js +236 -2
  579. package/dist/storage/index-lock.d.ts +102 -0
  580. package/dist/storage/index-lock.js +660 -0
  581. package/dist/storage/parse-cache.js +588 -6
  582. package/dist/storage/parsedfile-store.js +76 -6
  583. package/dist/storage/repo-manager.d.ts +54 -441
  584. package/dist/storage/repo-manager.js +312 -221
  585. package/dist/storage/repo-meta.d.ts +530 -0
  586. package/dist/storage/repo-meta.js +100 -0
  587. package/dist/types/pipeline.d.ts +37 -0
  588. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +1 -1
  589. package/hooks/claude/gitnexus-hook.cjs +1 -1
  590. package/hooks/claude/resolve-analyze-cmd.cjs +80 -13
  591. package/package.json +11 -2
  592. package/scripts/cross-platform-shard.ts +153 -0
  593. package/scripts/cross-platform-tests.ts +122 -0
  594. package/scripts/run-cross-platform.ts +16 -5
  595. package/skills/gitnexus-cli.md +3 -3
  596. package/skills/gitnexus-debugging.md +37 -7
  597. package/skills/gitnexus-exploring.md +26 -4
  598. package/skills/gitnexus-impact-analysis.md +71 -10
  599. package/skills/gitnexus-plan/README.md +11 -6
  600. package/skills/gitnexus-plan/references/evidence-provenance.md +49 -12
  601. package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +654 -372
  602. package/skills/gitnexus-refactoring.md +48 -5
  603. package/skills/gitnexus-review/SKILL.md +12 -6
  604. package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +1 -1
  605. package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +1 -1
  606. package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +1 -1
  607. package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +1 -1
  608. package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +1 -1
  609. package/skills/gitnexus-review/ci-personas/ci-security-lens.md +1 -1
  610. package/skills/gitnexus-taint-analysis.md +13 -7
  611. package/skills/gitnexus-work/SKILL.md +4 -1
  612. package/skills/gitnexus-work/references/evidence-provenance.md +49 -12
  613. package/skills/gitnexus-work/scripts/evidence-provenance.mjs +654 -372
  614. package/vendor/leiden/utils.cjs +28 -1
  615. package/web/assets/ProcessFlowModal-Badh2Pbg.js +24 -0
  616. package/web/assets/{__vite-browser-external-bMKyYQkO.js → __vite-browser-external-COxE8F0G.js} +1 -1
  617. package/web/assets/abnfDiagram-QNN2D4NM-Cq2djWWe.js +1 -0
  618. package/web/assets/agent-Dr4l5EOp.js +662 -0
  619. package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +1 -0
  620. package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +36 -0
  621. package/web/assets/{blockDiagram-7IZFK4PR-DBefcjof.js → blockDiagram-54WLDVWM-Dg_hrRWE.js} +4 -4
  622. package/web/assets/{c4Diagram-Y2BXMSZH-EjWnjEJl.js → c4Diagram-X2LASM7V-CnhoT4aV.js} +2 -2
  623. package/web/assets/chunk-224SPVON-B8gxtXpy.js +1 -0
  624. package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +127 -0
  625. package/web/assets/chunk-2SREHG4O-Dip42xOq.js +1 -0
  626. package/web/assets/chunk-4RFN2BYJ-DHHWuC-n.js +1 -0
  627. package/web/assets/chunk-66DQ2XMT-CM0xjFAN.js +1 -0
  628. package/web/assets/chunk-6BELYETK-ChsYtfHW.js +1 -0
  629. package/web/assets/{chunk-LII3EMHJ-BL6lKJ_P.js → chunk-6L755F7B-CMhLBxi2.js} +1 -1
  630. package/web/assets/{chunk-QA3QBVWF-DVXPOIxe.js → chunk-7CWYLC5S-DRgGkkpF.js} +1 -1
  631. package/web/assets/{chunk-ZXARS5L4-C3v-4Fsw.js → chunk-A7VWPJGB-B4O3oQdQ.js} +1 -1
  632. package/web/assets/chunk-BI6VK774-D0oaWk8V.js +1 -0
  633. package/web/assets/chunk-D6VWDJW2-BxcBdZ9c.js +2 -0
  634. package/web/assets/chunk-DMV4VAQV-Bn6WXDSX.js +4 -0
  635. package/web/assets/chunk-E5QJAATJ-dh-5CtIV.js +2 -0
  636. package/web/assets/chunk-EQFTRU2I-1ix7TzW9.js +2 -0
  637. package/web/assets/chunk-FWYVLQTC-BgDItRzJ.js +1 -0
  638. package/web/assets/chunk-HNC4WDU7-DoU3KnA7.js +1 -0
  639. package/web/assets/chunk-L5GCOVLC-CE2w8Nm_.js +161 -0
  640. package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +321 -0
  641. package/web/assets/chunk-LORZLZWG-B57uGw2N.js +88 -0
  642. package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +62 -0
  643. package/web/assets/chunk-NV3KIAZN-5yvcpMiu.js +1 -0
  644. package/web/assets/chunk-OIYT25JQ-CQ6KOZGX.js +1 -0
  645. package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +10 -0
  646. package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +156 -0
  647. package/web/assets/chunk-RRFMTAIC-CMN0wcYA.js +1 -0
  648. package/web/assets/{chunk-RLI5ZMPA-CkXZ0y0U.js → chunk-SATU7PGQ-B1zhgOvc.js} +1 -1
  649. package/web/assets/chunk-STOV2HOB-GnExfzIX.js +1 -0
  650. package/web/assets/{chunk-INKRHTLW-Ckl3_KkO.js → chunk-SZD42YQK-ijyKKVr1.js} +21 -21
  651. package/web/assets/{chunk-LCXTWHL2-C162wE5z.js → chunk-TFPGFQPA-Dj6a-0pC.js} +3 -3
  652. package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +2 -0
  653. package/web/assets/chunk-TZUXEDM2-B7p9AcTw.js +1 -0
  654. package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +1 -0
  655. package/web/assets/{chunk-6764PJDD-C7xxk063.js → chunk-VE5CLXGZ-C1vB7wpY.js} +1 -1
  656. package/web/assets/{chunk-RG4AUYOV-ZNgyLFq6.js → chunk-VJFVEZTB-CX66F2ep.js} +3 -3
  657. package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +1 -0
  658. package/web/assets/chunk-WJBAP47W-BckNkuEN.js +1 -0
  659. package/web/assets/chunk-XNMVGMAZ-Cg_LnPtj.js +1 -0
  660. package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +1 -0
  661. package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +1 -0
  662. package/web/assets/{cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js → cose-bilkent-RZA4XIPR-BHpK4Crp.js} +1 -1
  663. package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +1 -0
  664. package/web/assets/cynefinDiagram-TR7LZUCG-C3Iar9lZ.js +62 -0
  665. package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +4 -0
  666. package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +30 -0
  667. package/web/assets/diagram-JCD7PQ7C-DC5-9FRr.js +24 -0
  668. package/web/assets/{diagram-HNR7UZ2L-DVRltWbL.js → diagram-KFBZAVDW-Dfmf_4ti.js} +3 -3
  669. package/web/assets/diagram-L7DVE3PN-GIRyVUtt.js +41 -0
  670. package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +24 -0
  671. package/web/assets/ebnfDiagram-DRHRQJWO-D8_CI4ZF.js +1 -0
  672. package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +85 -0
  673. package/web/assets/error-D9MtuG9s.js +1 -0
  674. package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +1 -0
  675. package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +1 -0
  676. package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +292 -0
  677. package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +1 -0
  678. package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +106 -0
  679. package/web/assets/{index-D7mTFcvQ.js → index-2zdvEdzg.js} +51 -51
  680. package/web/assets/index-CJDpyH-n.css +2 -0
  681. package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +1 -0
  682. package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +2 -0
  683. package/web/assets/{ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js → ishikawaDiagram-4JDSWWDM-DmqWtjkl.js} +2 -2
  684. package/web/assets/{journeyDiagram-M6C3CM3L-C6wjooas.js → journeyDiagram-QUS3FAKT-XAzVzrQW.js} +3 -3
  685. package/web/assets/{kanban-definition-75IXJCU3-5_UVY79g.js → kanban-definition-D4L7SQKK-YurRnmYn.js} +6 -6
  686. package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +257 -0
  687. package/web/assets/{mindmap-definition-2TDM6QVE-8xDLzk2e.js → mindmap-definition-66QP5TD6-ChrWWnil.js} +5 -5
  688. package/web/assets/node.browser-U-KyT5AW.js +1 -0
  689. package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +1 -0
  690. package/web/assets/pegDiagram-YKIO5C6U-QGeQLEq2.js +1 -0
  691. package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +1 -0
  692. package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +39 -0
  693. package/web/assets/{quadrantDiagram-VICAPDV7-DR54jOeR.js → quadrantDiagram-VO5QLCXA-B7098wSc.js} +3 -3
  694. package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +1 -0
  695. package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +1 -0
  696. package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +1 -0
  697. package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +1 -0
  698. package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +1 -0
  699. package/web/assets/railroadDiagram-M77LTMSB-AXu4vxk_.js +1 -0
  700. package/web/assets/{requirementDiagram-JXO7QTGE-PEkg7sKC.js → requirementDiagram-RASO5HTO-B-l8InpK.js} +4 -4
  701. package/web/assets/{sankeyDiagram-URQDO5SZ-DDWEtjcs.js → sankeyDiagram-F32LOJ6L-Kd7zjJgX.js} +3 -3
  702. package/web/assets/{sequenceDiagram-VS2MUI6T-Bv-uwANx.js → sequenceDiagram-URATNSBD-BlcdY9DS.js} +7 -7
  703. package/web/assets/sizeCapture-5GORAGP4-BEqQzsxs.js +1 -0
  704. package/web/assets/src-C5sx_gMp.js +1 -0
  705. package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +1 -0
  706. package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +1 -0
  707. package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +2 -0
  708. package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +8 -0
  709. package/web/assets/{timeline-definition-O6YCAMPW-Qmsuo7qS.js → timeline-definition-WJXWRH4I-DUfp1R3E.js} +3 -3
  710. package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +1 -0
  711. package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +1 -0
  712. package/web/assets/vennDiagram-K3VCMQLI-Bj-FN-XS.js +34 -0
  713. package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +1 -0
  714. package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +78 -0
  715. package/web/assets/xychartDiagram-5VRUVLCW-CK_rbSWE.js +7 -0
  716. package/web/index.html +16 -15
  717. package/dist/core/ingestion/languages/python/index-stats.d.ts +0 -18
  718. package/dist/core/ingestion/languages/python/index-stats.js +0 -25
  719. package/web/assets/ProcessFlowModal-CwkpVkv-.js +0 -22
  720. package/web/assets/agent-Ds-lkZjX.js +0 -626
  721. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +0 -1
  722. package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +0 -36
  723. package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +0 -4
  724. package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +0 -1
  725. package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +0 -321
  726. package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +0 -159
  727. package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +0 -124
  728. package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +0 -10
  729. package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +0 -1
  730. package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +0 -1
  731. package/web/assets/chunk-J5EP6P6S-L19oz55R.js +0 -1
  732. package/web/assets/chunk-KGFNY3KK-BZeP-55u.js +0 -62
  733. package/web/assets/chunk-KGYTTC2M-zm6n242I.js +0 -1
  734. package/web/assets/chunk-KNLZD3CH-BGlP6X9R.js +0 -1
  735. package/web/assets/chunk-LRIF4GLE-n59lhprL.js +0 -1
  736. package/web/assets/chunk-RERM46MO-B5dAdWpP.js +0 -1
  737. package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +0 -1
  738. package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +0 -1
  739. package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +0 -1
  740. package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +0 -1
  741. package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +0 -1
  742. package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +0 -2
  743. package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +0 -1
  744. package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +0 -1
  745. package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +0 -4
  746. package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +0 -43
  747. package/web/assets/diagram-GF46GFSD-B2atbzmU.js +0 -24
  748. package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +0 -24
  749. package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +0 -10
  750. package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +0 -85
  751. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +0 -1
  752. package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +0 -162
  753. package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +0 -292
  754. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +0 -1
  755. package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +0 -106
  756. package/web/assets/index-CX_fADmQ.css +0 -2
  757. package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +0 -1
  758. package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +0 -2
  759. package/web/assets/katex-K3KEBU37-qRQBy-EZ.js +0 -261
  760. package/web/assets/node-Ct_zna8U.js +0 -8
  761. package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +0 -1
  762. package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +0 -1
  763. package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +0 -30
  764. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +0 -1
  765. package/web/assets/sdk-CzHHH8tD.js +0 -37
  766. package/web/assets/src-Cv1eWg0o.js +0 -1
  767. package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +0 -1
  768. package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +0 -1
  769. package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +0 -1
  770. package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +0 -1
  771. package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +0 -34
  772. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +0 -1
  773. package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +0 -78
  774. package/web/assets/xychartDiagram-N2JHSOCM-CoZ_Tits.js +0 -7
  775. /package/web/assets/{chunk-7W6UQGC5-pyKGssV3.js → chunk-LIEV3EAG-pyKGssV3.js} +0 -0
@@ -15,6 +15,8 @@ export { ormPhase, type ORMOutput } from './orm.js';
15
15
  export { crossFilePhase, type CrossFileOutput } from './cross-file.js';
16
16
  export { scopeResolutionPhase, type ScopeResolutionOutput, } from '../scope-resolution/pipeline/phase.js';
17
17
  export { springConfigPhase, type SpringConfigOutput } from './spring-config.js';
18
+ export { springAutoConfigurationPhase, type SpringAutoConfigurationOutput, } from './spring-auto-configuration.js';
19
+ export { springAopPhase, springAopInheritancePhase, type SpringAopOutput, type SpringAopInheritanceOutput, } from './spring-aop.js';
18
20
  export { pruneLocalSymbolsPhase, type PruneLocalSymbolsOutput } from './prune-local-symbols.js';
19
21
  export { taintSummariesPhase, type TaintSummariesOutput } from './taint-summaries.js';
20
22
  export { callSummariesPhase, type CallSummariesOutput } from './call-summaries.js';
@@ -16,6 +16,8 @@ export { ormPhase } from './orm.js';
16
16
  export { crossFilePhase } from './cross-file.js';
17
17
  export { scopeResolutionPhase, } from '../scope-resolution/pipeline/phase.js';
18
18
  export { springConfigPhase } from './spring-config.js';
19
+ export { springAutoConfigurationPhase, } from './spring-auto-configuration.js';
20
+ export { springAopPhase, springAopInheritancePhase, } from './spring-aop.js';
19
21
  export { pruneLocalSymbolsPhase } from './prune-local-symbols.js';
20
22
  export { taintSummariesPhase } from './taint-summaries.js';
21
23
  export { callSummariesPhase } from './call-summaries.js';
@@ -21,6 +21,21 @@ import { type PipelineProgress } from '../../../_shared/index.js';
21
21
  import type { ExtractedDecoratorRoute, ExtractedFetchCall, ExtractedORMQuery, ExtractedRoute, ExtractedToolDef, FetchWrapperDef } from '../workers/parse-worker.js';
22
22
  import type { KnowledgeGraph } from '../../graph/types.js';
23
23
  import type { PipelineOptions } from '../pipeline.js';
24
+ /** Projected main-thread heap need for the parse phase (#2649). */
25
+ export declare function projectParseHeapNeedBytes(parseableFileCount: number): number;
26
+ /** True when the mid-loop heap guard should abort the parse (#2649). */
27
+ export declare function shouldAbortForHeapPressure(heapUsedBytes: number, heapLimitBytes: number): boolean;
28
+ /**
29
+ * The ONE action a user should take when this repository doesn't fit the
30
+ * current heap (#2649). Users hitting memory limits are already frustrated —
31
+ * a menu of env knobs at that moment is noise. Branch on whether the machine
32
+ * itself has more memory to give: if this process's limit sits well below
33
+ * what the RAM-aware auto-sizer would grant (an inherited NODE_OPTIONS pin or
34
+ * explicit flag), the fix is to drop the pin — gitnexus sizes itself.
35
+ * Otherwise the machine is the ceiling and only scope or hardware helps.
36
+ * Escape hatches (GITNEXUS_MEMORY etc.) stay in the README env table.
37
+ */
38
+ export declare function heapPressureRemedy(heapLimitBytes: number): string;
24
39
  type ScannedFile = {
25
40
  path: string;
26
41
  size: number;
@@ -17,7 +17,7 @@
17
17
  import { BindingAccumulator, enrichExportedTypeMap, } from '../binding-accumulator.js';
18
18
  import { mergeChunkResults, dispatchChunkParse } from '../parsing-processor.js';
19
19
  import { fileContentHash, computeChunkHash, loadParseCacheChunk, persistParseCacheChunk, PARSE_CACHE_VERSION, } from '../../../storage/parse-cache.js';
20
- import { clearParsedFileStore, persistParsedFileChunk, getDurableParsedFileDir, loadDurableParsedFileIndex, prepareDurableParsedFileChunk, restoreDurableParsedFileShard, } from '../../../storage/parsedfile-store.js';
20
+ import { clearParsedFileStore, persistParsedFileChunk, loadParsedFilesForPaths, getDurableParsedFileDir, loadDurableParsedFileIndex, prepareDurableParsedFileChunk, restoreDurableParsedFileShard, } from '../../../storage/parsedfile-store.js';
21
21
  import { DEFAULT_PDG_MAX_FUNCTION_LINES } from '../cfg/collect.js';
22
22
  import { processRoutesFromExtracted, resolveRouteHandlerSymbols, buildExportedTypeMapFromGraph, } from '../call-processor.js';
23
23
  import { createSemanticModel } from '../model/index.js';
@@ -25,13 +25,17 @@ import { getLanguageFromFilename, } from '../../../_shared/index.js';
25
25
  import { readFileContents } from '../filesystem-walker.js';
26
26
  import { isLanguageAvailable, isGrammarRuntimeSkipped, createParserForLanguage, } from '../../tree-sitter/parser-loader.js';
27
27
  import { parseSourceSafe } from '../../tree-sitter/safe-parse.js';
28
- import { getProvider, providers } from '../languages/index.js';
28
+ import { getProvider, getProviderForFile, providers } from '../languages/index.js';
29
+ import { SCOPE_RESOLVERS } from '../scope-resolution/pipeline/registry.js';
30
+ import { DATA_ROUTE_TABLE_SOURCE } from '../route-extractors/data-route-table.js';
29
31
  import { createWorkerPool, workerPoolDisabledByEnv, resolveAutoPoolSize, WorkerPoolInitializationError, WorkerPoolDisabledError, } from '../workers/worker-pool.js';
30
32
  import { normalizeExtractedRoutePath } from '../route-extractors/route-path.js';
31
33
  import { resolveOperands, } from '../route-extractors/python-const-resolver.js';
32
34
  import { resolveInheritedSpringRoutes, } from '../route-extractors/spring-shared.js';
33
35
  import fs from 'node:fs';
36
+ import { effectiveRamBytes, memoryAutopilotDisabled } from '../utils/effective-ram.js';
34
37
  import path from 'node:path';
38
+ import v8 from 'node:v8';
35
39
  import { fileURLToPath, pathToFileURL } from 'node:url';
36
40
  import { isDev } from '../utils/env.js';
37
41
  import { isVerboseIngestionEnabled } from '../utils/verbose.js';
@@ -39,6 +43,74 @@ import { endTimer, isDeferredResolutionProfileEnabled, logDeferredProfile, start
39
43
  import { isDebugHeapEnabled, logHeapProbe } from '../utils/heap-probe.js';
40
44
  import { logger } from '../../logger.js';
41
45
  // ── Constants ──────────────────────────────────────────────────────────────
46
+ /**
47
+ * Heap-scale guardrail constants (#2649). Measured on a Linux-kernel analyze:
48
+ * ~75 graph nodes per PARSEABLE file (~5M nodes / ~65k parseable files;
49
+ * validated against heap probes at chunks 25/50/75 of 113 — the first
50
+ * calibration divided by total scanned files and under-projected by ~30%),
51
+ * main-thread heap per node. C-heavy corpus; other language mixes vary — these
52
+ * feed a WARNING and an emergency abort, never a hard admission gate, so
53
+ * estimate error only shifts when the operator hears about the problem, not
54
+ * whether analyze runs.
55
+ *
56
+ * RECALIBRATED for streamed structural emit (#2680), which is on by default for
57
+ * full rebuilds and holds relationships out of the JS heap. The original 2250
58
+ * was measured against the object-based graph; an A/B at 400k nodes / 1.08M
59
+ * edges put streaming at 1.40x smaller (819 MB -> 584 MB), so the corpus-
60
+ * calibrated figure is divided by that ratio: 2250 / 1.40 ~= 1600. Scaling the
61
+ * measured constant rather than substituting a synthetic one keeps #2649's
62
+ * kernel calibration intact and changes only the one thing that actually moved.
63
+ *
64
+ * If streaming is disabled (GITNEXUS_STREAM_GRAPH_EMIT=0, or any non-force run)
65
+ * this UNDER-projects by ~40%, so the preflight warning may stay quiet on a repo
66
+ * that then struggles. That is the safe direction to be wrong in: the abort
67
+ * below reads LIVE heap use, not this projection, so it still catches the real
68
+ * condition — only the early warning is affected.
69
+ */
70
+ const PROJECTED_NODES_PER_FILE = 75;
71
+ const PROJECTED_HEAP_BYTES_PER_NODE = 1600;
72
+ /** Warn at scan end when the projection crosses this share of the heap limit. */
73
+ const PREFLIGHT_WARN_FRACTION = 0.85;
74
+ /**
75
+ * Abort the chunk loop when live heap use crosses this share of the limit.
76
+ * Above ~0.95 V8 enters the ineffective-mark-compact death spiral (2s+ GC
77
+ * pauses that also falsely idle-timeout healthy workers, #2649); 0.92 leaves
78
+ * one chunk's worth of headroom to fail with an actionable message instead.
79
+ * `GITNEXUS_MEMORY=off` declines the abort (proceed-at-own-risk).
80
+ */
81
+ const HEAP_ABORT_FRACTION = 0.92;
82
+ /** Projected main-thread heap need for the parse phase (#2649). */
83
+ export function projectParseHeapNeedBytes(parseableFileCount) {
84
+ return parseableFileCount * PROJECTED_NODES_PER_FILE * PROJECTED_HEAP_BYTES_PER_NODE;
85
+ }
86
+ /** True when the mid-loop heap guard should abort the parse (#2649). */
87
+ export function shouldAbortForHeapPressure(heapUsedBytes, heapLimitBytes) {
88
+ if (memoryAutopilotDisabled())
89
+ return false;
90
+ return heapUsedBytes > heapLimitBytes * HEAP_ABORT_FRACTION;
91
+ }
92
+ /**
93
+ * The ONE action a user should take when this repository doesn't fit the
94
+ * current heap (#2649). Users hitting memory limits are already frustrated —
95
+ * a menu of env knobs at that moment is noise. Branch on whether the machine
96
+ * itself has more memory to give: if this process's limit sits well below
97
+ * what the RAM-aware auto-sizer would grant (an inherited NODE_OPTIONS pin or
98
+ * explicit flag), the fix is to drop the pin — gitnexus sizes itself.
99
+ * Otherwise the machine is the ceiling and only scope or hardware helps.
100
+ * Escape hatches (GITNEXUS_MEMORY etc.) stay in the README env table.
101
+ */
102
+ export function heapPressureRemedy(heapLimitBytes) {
103
+ // Effective RAM honors a real cgroup limit — raw os.totalmem() told users
104
+ // inside an 8GB-limited container on a 64GB host that "this machine has
105
+ // more memory available", an advice loop with no exit (#2649 review).
106
+ const autoCapBytes = effectiveRamBytes() * 0.75;
107
+ if (heapLimitBytes < autoCapBytes * 0.9) {
108
+ return (`This machine has more memory available: re-run without the --max-old-space-size ` +
109
+ `pin (NODE_OPTIONS or node flag) — gitnexus sizes its heap to the machine automatically.`);
110
+ }
111
+ return (`This machine is at its memory ceiling: exclude generated or vendored directories ` +
112
+ `via .gitnexusignore, or analyze on a machine with more memory.`);
113
+ }
42
114
  /** Max bytes of source content to load per parse chunk.
43
115
  *
44
116
  * Memory bound for the worker pool dispatch + a granularity knob for
@@ -365,6 +437,19 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
365
437
  const dispatchSubBatchMaxBytes = Number.isFinite(subBatchEnv) && subBatchEnv > 0
366
438
  ? subBatchEnv
367
439
  : Math.max(MIN_SUB_BATCH_BYTES, Math.ceil(chunkByteBudget / (effectivePoolSize * TARGET_JOBS_PER_WORKER)));
440
+ // Heap-scale guardrails (#2649), measured on a Linux-kernel analyze
441
+ // (94,773 files): ~55 graph nodes per parseable file and ~2.2KB of
442
+ // main-thread heap per node, linear across 113 chunks (see
443
+ // docs/plans/2026-07-23-gitnexus-plan-large-repo-analyze-oom.md §2).
444
+ // Estimates, not contracts — used only to warn early (preflight) and to
445
+ // convert a certain multi-minute GC death spiral into an immediate
446
+ // actionable error (mid-loop guard).
447
+ const projectedHeapNeedBytes = projectParseHeapNeedBytes(parseableScanned.length);
448
+ const heapLimitBytes = v8.getHeapStatistics().heap_size_limit;
449
+ if (projectedHeapNeedBytes > heapLimitBytes * PREFLIGHT_WARN_FRACTION) {
450
+ logger.warn(`Large repository: analyzing ${parseableScanned.length} files needs roughly ${Math.round(projectedHeapNeedBytes / 1024 / 1024 / 1024)}GB of memory, ` +
451
+ `but Node is limited to ${Math.round(heapLimitBytes / 1024 / 1024 / 1024)}GB — analyze may stop early. ${heapPressureRemedy(heapLimitBytes)}`);
452
+ }
368
453
  const chunks = [];
369
454
  let currentChunk = [];
370
455
  let currentBytes = 0;
@@ -676,6 +761,16 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
676
761
  if (heapProbeEveryN > 0 && chunkIdx > 0 && chunkIdx % heapProbeEveryN === 0) {
677
762
  logHeapProbe(`parse-chunk-${chunkIdx}`, `nodes=${graph.nodeCount} parsedFiles=${allParsedFiles.length}`);
678
763
  }
764
+ // #2649 mid-loop heap guard: fail actionably BEFORE V8 enters the
765
+ // ineffective-mark-compact death spiral (which also falsely times out
766
+ // healthy workers). The pool is torn down by this function's finally.
767
+ const heapUsedNow = process.memoryUsage().heapUsed;
768
+ const heapLimitNow = v8.getHeapStatistics().heap_size_limit;
769
+ if (shouldAbortForHeapPressure(heapUsedNow, heapLimitNow)) {
770
+ throw new Error(`Analyze stopped before running out of memory: ${Math.round(heapUsedNow / 1024 / 1024)}MB of the ` +
771
+ `${Math.round(heapLimitNow / 1024 / 1024)}MB Node heap in use at parse chunk ${chunkIdx + 1}/${numChunks} (#2649). ` +
772
+ heapPressureRemedy(heapLimitNow));
773
+ }
679
774
  const chunkPaths = chunks[chunkIdx];
680
775
  // Start wall-clock for the per-chunk throughput log emitted at end
681
776
  // of this iteration. The gate is computed once above; here we just
@@ -963,8 +1058,15 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
963
1058
  resolvedRoutes.push(dr);
964
1059
  continue;
965
1060
  }
1061
+ // Provider-driven fold (#2980): languages with qualified-ref semantics
1062
+ // (Java `ApiPaths.X` / `com.example.ApiPaths.X`) fold through their
1063
+ // provider hook; everything else uses the shared language-agnostic
1064
+ // operand fold. No language names in the shared layer.
1065
+ const fold = getProviderForFile(dr.filePath)?.foldRoutePathOperands;
966
1066
  const value = dr.routePathOperands
967
- ? resolveOperands(dr.filePath, dr.routePathOperands, repoConstants)
1067
+ ? fold
1068
+ ? fold(dr.filePath, dr.routePathOperands, repoConstants)
1069
+ : resolveOperands(dr.filePath, dr.routePathOperands, repoConstants)
968
1070
  : null;
969
1071
  if (value === null) {
970
1072
  skipped++;
@@ -1163,9 +1265,57 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
1163
1265
  }
1164
1266
  }
1165
1267
  logHeapProbe('parse-impl-return', `exportedTypeMap=${exportedTypeMap.size} parsedFiles=${allParsedFiles.length} nodes=${graph.nodeCount}`);
1268
+ const routeFilePaths = new Set(allPaths);
1269
+ const dataRouteFilePaths = new Set(allDecoratorRoutes
1270
+ .filter((route) => route.source === DATA_ROUTE_TABLE_SOURCE)
1271
+ .map((route) => route.filePath));
1272
+ const routeResolutionConfigs = new Map();
1273
+ for (const filePath of dataRouteFilePaths) {
1274
+ const language = getLanguageFromFilename(filePath);
1275
+ if (language === null || routeResolutionConfigs.has(language))
1276
+ continue;
1277
+ const resolver = SCOPE_RESOLVERS.get(language);
1278
+ routeResolutionConfigs.set(language, resolver?.loadResolutionConfig === undefined
1279
+ ? undefined
1280
+ : await resolver.loadResolutionConfig(repoPath));
1281
+ }
1282
+ let routeResolutionFiles = allParsedFiles;
1283
+ const resolveRouteImportTarget = (parsedImport, fromFile) => {
1284
+ const language = getLanguageFromFilename(fromFile);
1285
+ if (language === null)
1286
+ return null;
1287
+ const target = SCOPE_RESOLVERS.get(language)?.resolveImportTarget(parsedImport.targetRaw ?? '', fromFile, routeFilePaths, routeResolutionConfigs.get(language), { parsedFiles: routeResolutionFiles, parsedImport });
1288
+ if (typeof target === 'string')
1289
+ return target;
1290
+ return target?.length === 1 ? target[0] : null;
1291
+ };
1292
+ if (parsedFileStorePath !== undefined && dataRouteFilePaths.size > 0) {
1293
+ const byPath = await loadParsedFilesForPaths(parsedFileStorePath, dataRouteFilePaths);
1294
+ for (const parsed of allParsedFiles) {
1295
+ if (dataRouteFilePaths.has(parsed.filePath))
1296
+ byPath.set(parsed.filePath, parsed);
1297
+ }
1298
+ routeResolutionFiles = [...byPath.values()];
1299
+ const directTargets = new Set();
1300
+ for (const parsed of routeResolutionFiles) {
1301
+ for (const parsedImport of parsed.parsedImports) {
1302
+ const target = resolveRouteImportTarget(parsedImport, parsed.filePath);
1303
+ if (target !== null)
1304
+ directTargets.add(target);
1305
+ }
1306
+ }
1307
+ const importedFiles = await loadParsedFilesForPaths(parsedFileStorePath, directTargets);
1308
+ for (const parsed of importedFiles.values())
1309
+ byPath.set(parsed.filePath, parsed);
1310
+ routeResolutionFiles = [...byPath.values()];
1311
+ }
1166
1312
  // Part 2 (#2138): resolve each route's handler to a real symbol UID now that
1167
1313
  // the model is fully populated and decorator-route prefixes are finalized.
1168
- const routeHandlerSymbols = resolveRouteHandlerSymbols(model, allExtractedRoutes, allDecoratorRoutes);
1314
+ const routeHandlerSymbols = resolveRouteHandlerSymbols(model, allExtractedRoutes, allDecoratorRoutes, {
1315
+ files: routeResolutionFiles,
1316
+ resolveImportTarget: resolveRouteImportTarget,
1317
+ isExportedSymbol: (nodeId) => graph.getNode(nodeId)?.properties.isExported === true,
1318
+ });
1169
1319
  return {
1170
1320
  exportedTypeMap,
1171
1321
  allFetchCalls,
@@ -21,6 +21,11 @@ export const parsePhase = {
21
21
  name: 'parse',
22
22
  deps: ['structure', 'markdown', 'cobol'],
23
23
  async execute(ctx, deps) {
24
+ // Begin streamed structural emit (#2680), if enabled. Deliberately here and
25
+ // not at graph construction: the pre-parse phases are not all write-only —
26
+ // `mapCobolToGraph` scans CALLS edges and removes the unresolved ones — and
27
+ // nothing before parse produces bulk edge volume anyway.
28
+ ctx.graphEmit?.beginStreaming();
24
29
  const { scannedFiles, allPaths, allPathSet, totalFiles } = getPhaseOutput(deps, 'structure');
25
30
  const result = await runChunkedParseAndResolve(ctx.graph, scannedFiles, allPaths, totalFiles, ctx.repoPath, ctx.pipelineStart, ctx.onProgress, ctx.options);
26
31
  return {
@@ -4,8 +4,9 @@
4
4
  * Detects execution flows (processes) and creates Process nodes +
5
5
  * STEP_IN_PROCESS edges. Also links Route/Tool nodes to processes.
6
6
  *
7
- * @deps communities, routes, tools, pruneLocalSymbols
8
- * @reads graph (all nodes and relationships), communityResult, routeRegistry, toolDefs
7
+ * @deps communities, routes, tools, pruneLocalSymbols, structure, parse
8
+ * @reads graph (all nodes and relationships), communityResult, routeRegistry,
9
+ * toolDefs, parse's allFetchCalls + allORMQueries (R3-6 sink sites)
9
10
  * @writes graph (Process nodes, STEP_IN_PROCESS edges, ENTRY_POINT_OF edges)
10
11
  */
11
12
  import type { PipelinePhase } from './types.js';
@@ -4,8 +4,9 @@
4
4
  * Detects execution flows (processes) and creates Process nodes +
5
5
  * STEP_IN_PROCESS edges. Also links Route/Tool nodes to processes.
6
6
  *
7
- * @deps communities, routes, tools, pruneLocalSymbols
8
- * @reads graph (all nodes and relationships), communityResult, routeRegistry, toolDefs
7
+ * @deps communities, routes, tools, pruneLocalSymbols, structure, parse
8
+ * @reads graph (all nodes and relationships), communityResult, routeRegistry,
9
+ * toolDefs, parse's allFetchCalls + allORMQueries (R3-6 sink sites)
9
10
  * @writes graph (Process nodes, STEP_IN_PROCESS edges, ENTRY_POINT_OF edges)
10
11
  */
11
12
  import { getPhaseOutput } from './types.js';
@@ -26,11 +27,19 @@ export function computeDynamicMaxProcesses(symbolCount) {
26
27
  }
27
28
  export const processesPhase = {
28
29
  name: 'processes',
29
- // `structure` supplies `totalFiles` (progress counter) without the spurious
30
- // structural data dependency on `parse`. `pruneLocalSymbols` is declared
30
+ // `structure` supplies `totalFiles` (progress counter), which is why this
31
+ // phase historically avoided depending on `parse` at all — that dependency
32
+ // was spurious for a progress number.
33
+ //
34
+ // It is no longer spurious. R3-6 reads `allFetchCalls` / `allORMQueries` from
35
+ // the parse output to learn WHERE the program reaches outward, which is what
36
+ // lets a trace end at a sink instead of only at a leaf. That is a real data
37
+ // dependency, so it is declared rather than reached for implicitly — and the
38
+ // read below still fails open, so a pipeline without that output detects no
39
+ // sinks rather than failing the phase. `pruneLocalSymbols` is declared
31
40
  // explicitly so process extraction always reads the trimmed graph even if a
32
41
  // future option drops the intervening `mro`/`communities` phases.
33
- deps: ['communities', 'routes', 'tools', 'pruneLocalSymbols', 'structure'],
42
+ deps: ['communities', 'routes', 'tools', 'pruneLocalSymbols', 'structure', 'parse'],
34
43
  async execute(ctx, deps) {
35
44
  const { totalFiles } = getPhaseOutput(deps, 'structure');
36
45
  const { communityResult } = getPhaseOutput(deps, 'communities');
@@ -48,6 +57,32 @@ export const processesPhase = {
48
57
  symbolCount++;
49
58
  });
50
59
  const dynamicMaxProcesses = computeDynamicMaxProcesses(symbolCount);
60
+ // R3-6: where the program reaches outward. Already collected by the parse
61
+ // phase for FILE-level FETCHES/QUERIES edges; reused here at function
62
+ // granularity so a trace can end somewhere meaningful instead of only at a
63
+ // leaf. Absent (or an older parse output) simply yields no sinks and the
64
+ // previous behaviour.
65
+ //
66
+ // Typed as `ParseOutput` rather than a locally re-declared structural shape,
67
+ // the way every other parse consumer does it (cross-file.ts, orm.ts,
68
+ // routes.ts, tools.ts). `getPhaseOutput` is a raw `as T` cast, so a local
69
+ // shape does not check anything — it only severs the compile-time link, and
70
+ // renaming `allFetchCalls` on `ParseOutput` would then still compile here and
71
+ // silently detect zero sinks. The runtime `.filter` below is the actual
72
+ // guard, and it stays.
73
+ let parseOutput;
74
+ try {
75
+ parseOutput = getPhaseOutput(deps, 'parse');
76
+ }
77
+ catch {
78
+ // Fail open: no sinks, previous behaviour. A missing parse output is a
79
+ // pipeline-composition question, not a reason to lose every process.
80
+ parseOutput = undefined;
81
+ }
82
+ const outwardActionSites = [
83
+ ...(parseOutput?.allFetchCalls ?? []),
84
+ ...(parseOutput?.allORMQueries ?? []),
85
+ ].filter((s) => typeof s?.filePath === 'string' && typeof s?.lineNumber === 'number');
51
86
  const processResult = await processProcesses(ctx.graph, communityResult.memberships, (message, progress) => {
52
87
  const processProgress = 99 + progress * 0.01;
53
88
  ctx.onProgress({
@@ -56,10 +91,60 @@ export const processesPhase = {
56
91
  message,
57
92
  stats: { filesProcessed: totalFiles, totalFiles, nodesCreated: ctx.graph.nodeCount },
58
93
  });
59
- }, { maxProcesses: dynamicMaxProcesses, minSteps: 3 });
94
+ }, { maxProcesses: dynamicMaxProcesses, minSteps: 3 }, outwardActionSites);
60
95
  if (isDev) {
61
96
  logger.info(`🔄 Process detection: ${processResult.stats.totalProcesses} processes found (${processResult.stats.crossCommunityCount} cross-community)`);
62
97
  }
98
+ // Not gated on `isDev`: this is the one line that tells a reader the process
99
+ // list is a SAMPLE. "823 flows" presented without it reads as the complete
100
+ // set, which is the confident-empty failure in its other direction — a
101
+ // confident-COMPLETE one.
102
+ //
103
+ // But it is only a `warn` when a ceiling removed WHOLE FLOWS from the
104
+ // report. That split is the one `ProcessTruncationStats` already documents —
105
+ // "unexplored entry points mean whole flows are missing, while a
106
+ // depth-capped trace means a flow is present but shorter than it really is"
107
+ // — and it is what keeps the line worth reading. Warning on every counter
108
+ // meant warning on every run: this phase overrides only `maxProcesses`, so
109
+ // at the shipped defaults (`maxBranching: 4`, `maxTraceDepth: 10`,
110
+ // per-entry trace budget 12) `calleesDropped` fires for any function with
111
+ // five callees, `tracesDepthCapped` for any chain deeper than ten, and
112
+ // `walksCutByBudget` for any entry point with twelve paths under it. All
113
+ // three are true of every non-trivial repository — and none of them removes
114
+ // an entry point or a completed flow from the list, they only bound how far
115
+ // an already-represented region was walked. A warning that always fires is a
116
+ // warning nobody reads, so those three go to `debug`.
117
+ //
118
+ // `entryPointCandidatesDropped` IS in the loud set even though it fires on
119
+ // any repository with more than 200 candidates, because it is the only
120
+ // ceiling that grows with the repository: `entryPointsUnexplored` and
121
+ // `processesDropped` can only fire while `maxProcesses` (symbols / 10) is
122
+ // small enough to bind, so gating on those two alone would go quiet on
123
+ // exactly the large repositories where 200 of several thousand entry points
124
+ // is the thinnest sample. The message leads with that ratio so the line
125
+ // carries a fact rather than an alarm.
126
+ //
127
+ // `stats.truncation` on the RESULT is untouched and still reports all six
128
+ // counters; this only decides which of them are loud.
129
+ const { truncation } = processResult.stats;
130
+ const entryPointCandidates = processResult.stats.entryPointsFound + truncation.entryPointCandidatesDropped;
131
+ const flowsMissing = truncation.entryPointCandidatesDropped > 0 ||
132
+ truncation.entryPointsUnexplored > 0 ||
133
+ truncation.processesDropped > 0;
134
+ const shape = `${truncation.entryPointCandidatesDropped} of ${entryPointCandidates} candidate entry point(s) never ranked in, ` +
135
+ `${truncation.entryPointsUnexplored} ranked entry point(s) never traced, ` +
136
+ `${truncation.processesDropped} deduplicated flow(s) dropped at maxProcesses, ` +
137
+ `${truncation.tracesDepthCapped} trace(s) cut at maxTraceDepth, ` +
138
+ `${truncation.calleesDropped} callee(s) skipped at maxBranching, ` +
139
+ `${truncation.walksCutByBudget} walk(s) cut by the per-entry trace budget.`;
140
+ if (flowsMissing) {
141
+ logger.warn({ truncation }, `[processes] ${processResult.stats.totalProcesses} flows reported, but whole flows are MISSING: ` +
142
+ `${shape} An absent flow does NOT mean the code path does not exist.`);
143
+ }
144
+ else if (truncation.truncated) {
145
+ logger.debug({ truncation }, `[processes] ${processResult.stats.totalProcesses} flows reported; every flow found is present, ` +
146
+ `but some are shorter than the code path they describe: ${shape}`);
147
+ }
63
148
  processResult.processes.forEach((proc) => {
64
149
  ctx.graph.addNode({
65
150
  id: proc.id,
@@ -18,6 +18,8 @@ import { phpFileToRouteURL } from '../route-extractors/php.js';
18
18
  import { extractResponseShapes, extractPHPResponseShapes, } from '../route-extractors/response-shapes.js';
19
19
  import { extractMiddlewareChain, extractNextjsMiddlewareConfig, compileMatcher, compiledMatcherMatchesRoute, } from '../route-extractors/middleware.js';
20
20
  import { processNextjsFetchRoutes } from '../call-processor.js';
21
+ import { reconcileDispatchGuardRoutes } from '../route-extractors/dispatch-guard.js';
22
+ import { DATA_ROUTE_TABLE_SOURCE } from '../route-extractors/data-route-table.js';
21
23
  import { normalizeExtractedRoutePath, normalizeRouteMethod, routeNodeKey, } from '../route-extractors/route-path.js';
22
24
  import { generateId } from '../../../lib/utils.js';
23
25
  import { readFileContents } from '../filesystem-walker.js';
@@ -27,6 +29,24 @@ const EXPO_NAV_PATTERNS = [
27
29
  /router\.(push|replace|navigate)\(\s*['"`]([^'"`]+)['"`]/g,
28
30
  /<Link\s+[^>]*href=\s*['"`]([^'"`]+)['"`]/g,
29
31
  ];
32
+ function handlerSymbolContent(content, handlerNode) {
33
+ if (handlerNode === undefined)
34
+ return undefined;
35
+ const startLine = handlerNode.properties.startLine;
36
+ const endLine = handlerNode.properties.endLine;
37
+ if (typeof startLine !== 'number' ||
38
+ typeof endLine !== 'number' ||
39
+ !Number.isInteger(startLine) ||
40
+ !Number.isInteger(endLine) ||
41
+ startLine < 0 ||
42
+ endLine < startLine) {
43
+ return undefined;
44
+ }
45
+ return content
46
+ .split(/\r?\n/)
47
+ .slice(startLine, endLine + 1)
48
+ .join('\n');
49
+ }
30
50
  const TEMPLATE_URL_PATTERNS = [
31
51
  /\b(?:action|href)\s*=\s*["']([^"']+)["']/gi,
32
52
  /\burl\s*:\s*["']([^"']+)["'](?!\s*\+)/g,
@@ -100,6 +120,45 @@ export const routesPhase = {
100
120
  // Local copy — routes phase must not mutate upstream ParseOutput
101
121
  const allFetchCalls = [...parseFetchCalls];
102
122
  const routeRegistry = new Map();
123
+ /**
124
+ * Registry keys written straight from the file list below, never through
125
+ * `addRoute`. `resolveRouteHandlerSymbols` walks only `extractedRoutes` and
126
+ * `decoratorRoutes`, so it never sees these URLs and its `claimed` set never
127
+ * contains them — which means a handler stamped on one of these keys was
128
+ * resolved for a DIFFERENT route.
129
+ *
130
+ * That is reachable, and it fabricates rather than omits (#3049). A
131
+ * method-agnostic route (`@All`, a Django function view, a verb-less
132
+ * dispatch guard) keys by URL alone via `routeNodeKey`, so it collides with
133
+ * a file-convention route at the same URL. It claims the key unopposed in
134
+ * `claim()`, then loses first-writer-wins here in `addRoute` and is dropped
135
+ * as a duplicate — and without this guard the surviving file-convention node
136
+ * would read that handler and present another application's controller
137
+ * method as its own. `api_impact` is documented to be run BEFORE editing a
138
+ * route handler, so it would answer with a handler from the wrong app.
139
+ *
140
+ * Dropping the losing route is a separate and deliberate consequence of
141
+ * URL-only identity; this only stops the false attribution.
142
+ *
143
+ * Membership is recorded AT the pre-seeding `set`, mirroring `claim()` in
144
+ * call-processor.ts, which writes `claimed` and its result map together
145
+ * rather than re-deriving either by rescanning. Identifying pre-seeded
146
+ * entries by matching `entry.source` against a list of source strings would
147
+ * spell them a second time, away from the sites that produce them — and a
148
+ * fourth pre-seeded source added later would then reopen #3049 in silence.
149
+ * `addRoute` deliberately does NOT record here: its routes ARE
150
+ * handler-resolved, so suppressing them would widen the guard into a bug of
151
+ * its own.
152
+ *
153
+ * Each `add` below sits inside its own `!routeRegistry.has(key)` gate, as
154
+ * every `routeRegistry.set` in this phase does: the map is write-once per
155
+ * key, so a losing candidate cannot record a key it did not claim and no
156
+ * later writer can take a recorded key away. Key-membership is therefore
157
+ * equivalent to source-matching by construction — pre-seeded routes carry no
158
+ * verb and `routeNodeKey(undefined, url) === url` — which is why the
159
+ * two-candidates-one-URL case needs no fixture to settle it.
160
+ */
161
+ const preSeededKeys = new Set();
103
162
  // Detect Expo Router app/ roots vs Next.js app/ roots (monorepo-safe)
104
163
  const expoAppRoots = new Set();
105
164
  const nextjsAppRoots = new Set();
@@ -125,32 +184,34 @@ export const routesPhase = {
125
184
  expoAppPaths.add(p);
126
185
  }
127
186
  }
187
+ // One writer for every pre-seeded route, so recording membership cannot be
188
+ // forgotten. Inlining `has` / `set` / `add` at each site made the invariant
189
+ // a convention three call sites had to remember — and a fourth source that
190
+ // forgot the `add` would reopen #3049 exactly as silently as the source-set
191
+ // it replaced. This is the shape `claim()` in call-processor.ts uses for the
192
+ // same reason: one helper writes the collection and its key set together.
193
+ const preSeed = (url, entry) => {
194
+ if (routeRegistry.has(url))
195
+ return false;
196
+ routeRegistry.set(url, { ...entry, url });
197
+ preSeededKeys.add(url);
198
+ return true;
199
+ };
128
200
  for (const p of allPaths) {
129
201
  if (expoAppPaths.has(p)) {
130
202
  const expoURL = expoFileToRouteURL(p);
131
- if (expoURL && !routeRegistry.has(expoURL)) {
132
- routeRegistry.set(expoURL, {
133
- filePath: p,
134
- source: 'expo-filesystem-route',
135
- url: expoURL,
136
- });
203
+ if (expoURL && preSeed(expoURL, { filePath: p, source: 'expo-filesystem-route' })) {
137
204
  continue;
138
205
  }
139
206
  }
140
207
  const nextjsURL = nextjsFileToRouteURL(p);
141
- if (nextjsURL && !routeRegistry.has(nextjsURL)) {
142
- routeRegistry.set(nextjsURL, {
143
- filePath: p,
144
- source: 'nextjs-filesystem-route',
145
- url: nextjsURL,
146
- });
208
+ if (nextjsURL && preSeed(nextjsURL, { filePath: p, source: 'nextjs-filesystem-route' })) {
147
209
  continue;
148
210
  }
149
211
  if (p.endsWith('.php')) {
150
212
  const phpURL = phpFileToRouteURL(p);
151
- if (phpURL && !routeRegistry.has(phpURL)) {
152
- routeRegistry.set(phpURL, { filePath: p, source: 'php-file-route', url: phpURL });
153
- }
213
+ if (phpURL)
214
+ preSeed(phpURL, { filePath: p, source: 'php-file-route' });
154
215
  }
155
216
  }
156
217
  let duplicateRoutes = 0;
@@ -181,30 +242,60 @@ export const routesPhase = {
181
242
  namedRouteRegistry.set(route.routeName, routeUrl);
182
243
  }
183
244
  }
184
- for (const dr of allDecoratorRoutes) {
245
+ // A dispatch-guard route observed WITHOUT a verb is dropped when the same
246
+ // URL is claimed WITH one anywhere in the repo — the split route-table
247
+ // idiom, which no single file can reconcile. Framework routes are untouched;
248
+ // their verb-less form is a declaration, not a weaker observation.
249
+ for (const dr of reconcileDispatchGuardRoutes(allDecoratorRoutes)) {
185
250
  const url = normalizeExtractedRoutePath(dr.routePath, dr.prefix ?? null);
251
+ const method = normalizeRouteMethod(dr.httpMethod);
252
+ const routeKey = routeNodeKey(method, url);
253
+ // A data-table entry is only a provider route once its static handler has
254
+ // been proven. Other route sources retain their historical fallback.
255
+ if (dr.source === DATA_ROUTE_TABLE_SOURCE && !routeHandlerSymbols.has(routeKey))
256
+ continue;
186
257
  addRoute(url, {
187
258
  filePath: dr.filePath,
188
- source: `decorator-${dr.decoratorName}`,
189
- method: normalizeRouteMethod(dr.httpMethod),
259
+ // A route extracted from a file's own AST is usually a decorator; a
260
+ // dispatch guard is the same transport with different provenance, and
261
+ // says so (`ExtractedDecoratorRoute.source`).
262
+ source: dr.source ?? `decorator-${dr.decoratorName}`,
263
+ method,
190
264
  });
191
265
  }
192
266
  let handlerContents;
193
267
  if (routeRegistry.size > 0) {
194
- const handlerPaths = [...routeRegistry.values()].map((e) => e.filePath);
268
+ const handlerPathFor = (routeKey, entry) => {
269
+ if (entry.source !== DATA_ROUTE_TABLE_SOURCE)
270
+ return entry.filePath;
271
+ const handlerSymbolId = routeHandlerSymbols.get(routeKey);
272
+ const resolvedPath = handlerSymbolId
273
+ ? ctx.graph.getNode(handlerSymbolId)?.properties.filePath
274
+ : undefined;
275
+ return typeof resolvedPath === 'string' ? resolvedPath : entry.filePath;
276
+ };
277
+ const handlerPaths = [...routeRegistry].map(([key, entry]) => handlerPathFor(key, entry));
195
278
  handlerContents = await readFileContents(ctx.repoPath, handlerPaths);
196
279
  for (const [routeKey, entry] of routeRegistry) {
197
- const { filePath: handlerPath, source: routeSource, method: routeMethod, url } = entry;
280
+ const { source: routeSource, method: routeMethod, url } = entry;
281
+ const handlerPath = handlerPathFor(routeKey, entry);
198
282
  const content = handlerContents.get(handlerPath);
199
- const { responseKeys, errorKeys } = content
283
+ // A pre-seeded route can never legitimately appear in
284
+ // `routeHandlerSymbols`, so a key that does is a route that LOST (#3049).
285
+ const handlerSymbolId = preSeededKeys.has(routeKey)
286
+ ? undefined
287
+ : routeHandlerSymbols.get(routeKey);
288
+ const analysisContent = entry.source === DATA_ROUTE_TABLE_SOURCE && content
289
+ ? handlerSymbolContent(content, handlerSymbolId ? ctx.graph.getNode(handlerSymbolId) : undefined)
290
+ : content;
291
+ const { responseKeys, errorKeys } = analysisContent
200
292
  ? handlerPath.endsWith('.php')
201
- ? extractPHPResponseShapes(content)
202
- : extractResponseShapes(content)
293
+ ? extractPHPResponseShapes(analysisContent)
294
+ : extractResponseShapes(analysisContent)
203
295
  : { responseKeys: undefined, errorKeys: undefined };
204
- const mwResult = content ? extractMiddlewareChain(content) : undefined;
296
+ const mwResult = analysisContent ? extractMiddlewareChain(analysisContent) : undefined;
205
297
  const middleware = mwResult?.chain;
206
298
  const routeNodeId = generateId('Route', routeKey);
207
- const handlerSymbolId = routeHandlerSymbols.get(routeKey);
208
299
  ctx.graph.addNode({
209
300
  id: routeNodeId,
210
301
  label: 'Route',