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
@@ -0,0 +1,876 @@
1
+ export const DATA_ROUTE_TABLE_SOURCE = 'data-route-table';
2
+ const ROUTE_BINDING_HINT = /route/i;
3
+ const ROUTE_TOKEN_HINTS = ['path', 'method', 'handler'];
4
+ const HTTP_METHODS = new Set([
5
+ 'GET',
6
+ 'POST',
7
+ 'PUT',
8
+ 'PATCH',
9
+ 'DELETE',
10
+ 'HEAD',
11
+ 'OPTIONS',
12
+ ]);
13
+ const SIMPLE_STRING_ESCAPES = {
14
+ b: '\b',
15
+ f: '\f',
16
+ n: '\n',
17
+ r: '\r',
18
+ t: '\t',
19
+ v: '\v',
20
+ };
21
+ function decodeJavaScriptStringLiteral(raw) {
22
+ if (raw.length < 2)
23
+ return null;
24
+ const delimiter = raw[0];
25
+ if ((delimiter !== "'" && delimiter !== '"' && delimiter !== '`') ||
26
+ raw[raw.length - 1] !== delimiter) {
27
+ return null;
28
+ }
29
+ const body = raw.slice(1, -1);
30
+ let decoded = '';
31
+ for (let index = 0; index < body.length; index++) {
32
+ const char = body[index];
33
+ if (char !== '\\') {
34
+ if (delimiter !== '`' && (char === '\n' || char === '\r'))
35
+ return null;
36
+ decoded += char;
37
+ continue;
38
+ }
39
+ const escaped = body[++index];
40
+ if (escaped === undefined)
41
+ return null;
42
+ if (escaped === '\n' || escaped === '\u2028' || escaped === '\u2029')
43
+ continue;
44
+ if (escaped === '\r') {
45
+ if (body[index + 1] === '\n')
46
+ index++;
47
+ continue;
48
+ }
49
+ const simple = SIMPLE_STRING_ESCAPES[escaped];
50
+ if (simple !== undefined) {
51
+ decoded += simple;
52
+ continue;
53
+ }
54
+ if (escaped === '0') {
55
+ if (/\d/.test(body[index + 1] ?? ''))
56
+ return null;
57
+ decoded += '\0';
58
+ continue;
59
+ }
60
+ if (/[1-9]/.test(escaped))
61
+ return null;
62
+ if (escaped === 'x') {
63
+ const hex = body.slice(index + 1, index + 3);
64
+ if (!/^[0-9A-Fa-f]{2}$/.test(hex))
65
+ return null;
66
+ decoded += String.fromCharCode(Number.parseInt(hex, 16));
67
+ index += 2;
68
+ continue;
69
+ }
70
+ if (escaped === 'u') {
71
+ if (body[index + 1] === '{') {
72
+ const close = body.indexOf('}', index + 2);
73
+ if (close === -1)
74
+ return null;
75
+ const hex = body.slice(index + 2, close);
76
+ if (!/^[0-9A-Fa-f]{1,6}$/.test(hex))
77
+ return null;
78
+ const codePoint = Number.parseInt(hex, 16);
79
+ if (codePoint > 0x10ffff)
80
+ return null;
81
+ decoded += String.fromCodePoint(codePoint);
82
+ index = close;
83
+ continue;
84
+ }
85
+ const hex = body.slice(index + 1, index + 5);
86
+ if (!/^[0-9A-Fa-f]{4}$/.test(hex))
87
+ return null;
88
+ decoded += String.fromCharCode(Number.parseInt(hex, 16));
89
+ index += 4;
90
+ continue;
91
+ }
92
+ // JavaScript treats an escaped non-special character as that character.
93
+ decoded += escaped;
94
+ }
95
+ return decoded;
96
+ }
97
+ /**
98
+ * A `string`/`template_string` node's decoded value, or `null` when it is not a
99
+ * readable literal (an interpolated template, an unterminated escape). Shared
100
+ * with the NestJS extractor so both agree on what a readable literal is —
101
+ * notably that escapes must be DECODED, not dropped, because tree-sitter splits
102
+ * a literal around every `escape_sequence`.
103
+ */
104
+ export function plainString(node) {
105
+ if (node.type === 'string')
106
+ return decodeJavaScriptStringLiteral(node.text);
107
+ if (node.type === 'template_string' &&
108
+ node.namedChildren.every((child) => child.type === 'string_fragment' || child.type === 'escape_sequence')) {
109
+ return decodeJavaScriptStringLiteral(node.text);
110
+ }
111
+ return null;
112
+ }
113
+ /**
114
+ * A property key's name, for the spellings that carry one — `{ path: … }` and
115
+ * `{ 'path': … }`. A computed key (`{ [KEY]: … }`) has none. Shared with the
116
+ * NestJS extractor, which reads `@Controller({ path: … })` the same way.
117
+ */
118
+ export function propertyName(node) {
119
+ if (node.type === 'identifier' || node.type === 'property_identifier')
120
+ return node.text;
121
+ if (node.type === 'string')
122
+ return plainString(node);
123
+ return null;
124
+ }
125
+ function handlerName(node) {
126
+ if (node.type === 'identifier') {
127
+ return { designator: node.text, name: node.text, localName: node.text };
128
+ }
129
+ if (node.type !== 'member_expression')
130
+ return null;
131
+ const object = node.childForFieldName('object');
132
+ const property = node.childForFieldName('property');
133
+ if (object?.type !== 'identifier' ||
134
+ property === null ||
135
+ property.type !== 'property_identifier') {
136
+ return null;
137
+ }
138
+ return {
139
+ designator: `${object.text}.${property.text}`,
140
+ name: property.text,
141
+ };
142
+ }
143
+ const EXECUTING_VALUE_NODES = new Set([
144
+ 'assignment_expression',
145
+ 'augmented_assignment_expression',
146
+ 'await_expression',
147
+ 'call_expression',
148
+ 'new_expression',
149
+ 'spread_element',
150
+ 'update_expression',
151
+ 'yield_expression',
152
+ ]);
153
+ function containsExecutingExpression(node) {
154
+ if (EXECUTING_VALUE_NODES.has(node.type))
155
+ return true;
156
+ if (node.type === 'unary_expression' && node.text.trimStart().startsWith('delete '))
157
+ return true;
158
+ return node.namedChildren.some(containsExecutingExpression);
159
+ }
160
+ function routeFromObject(node) {
161
+ const values = new Map();
162
+ for (const child of node.namedChildren) {
163
+ if (child.type === 'comment')
164
+ continue;
165
+ // Spread properties, methods, computed keys, and other executable shapes
166
+ // make the entry non-declarative, so the whole entry is suppressed.
167
+ if (child.type !== 'pair')
168
+ return null;
169
+ const keyNode = child.childForFieldName('key');
170
+ const valueNode = child.childForFieldName('value');
171
+ if (keyNode === null || valueNode === null)
172
+ return null;
173
+ const key = propertyName(keyNode);
174
+ if (key === null)
175
+ return null;
176
+ if (!ROUTE_TOKEN_HINTS.includes(key)) {
177
+ if (containsExecutingExpression(valueNode))
178
+ return null;
179
+ continue;
180
+ }
181
+ if (values.has(key))
182
+ return null;
183
+ values.set(key, valueNode);
184
+ }
185
+ const pathNode = values.get('path');
186
+ const methodNode = values.get('method');
187
+ const handlerNode = values.get('handler');
188
+ if (pathNode === undefined || methodNode === undefined || handlerNode === undefined)
189
+ return null;
190
+ const path = plainString(pathNode);
191
+ const rawMethod = plainString(methodNode);
192
+ const handler = handlerName(handlerNode);
193
+ if (path === null || !path.startsWith('/') || rawMethod === null || handler === null)
194
+ return null;
195
+ const method = rawMethod.toUpperCase();
196
+ if (!HTTP_METHODS.has(method))
197
+ return null;
198
+ return {
199
+ path,
200
+ method,
201
+ handlerDesignator: handler.designator,
202
+ handlerName: handler.name,
203
+ ...(handler.localName === undefined ? {} : { handlerLocalName: handler.localName }),
204
+ line: node.startPosition.row + 1,
205
+ };
206
+ }
207
+ function staticRouteIdentity(node) {
208
+ const values = new Map();
209
+ let lastUnknownProperty = -1;
210
+ let lastPath = -1;
211
+ let lastMethod = -1;
212
+ for (const [index, child] of node.namedChildren.entries()) {
213
+ if (child.type === 'comment')
214
+ continue;
215
+ if (child.type !== 'pair') {
216
+ lastUnknownProperty = index;
217
+ continue;
218
+ }
219
+ const keyNode = child.childForFieldName('key');
220
+ const valueNode = child.childForFieldName('value');
221
+ if (keyNode === null || valueNode === null) {
222
+ lastUnknownProperty = index;
223
+ continue;
224
+ }
225
+ const key = propertyName(keyNode);
226
+ if (key === null) {
227
+ lastUnknownProperty = index;
228
+ continue;
229
+ }
230
+ if (!ROUTE_TOKEN_HINTS.includes(key))
231
+ continue;
232
+ values.set(key, valueNode);
233
+ if (key === 'path')
234
+ lastPath = index;
235
+ if (key === 'method')
236
+ lastMethod = index;
237
+ }
238
+ const pathNode = values.get('path');
239
+ const methodNode = values.get('method');
240
+ if (pathNode === undefined || methodNode === undefined || !values.has('handler'))
241
+ return null;
242
+ if (lastPath < lastUnknownProperty || lastMethod < lastUnknownProperty)
243
+ return null;
244
+ const path = plainString(pathNode);
245
+ const rawMethod = plainString(methodNode);
246
+ if (path === null || !path.startsWith('/') || rawMethod === null)
247
+ return null;
248
+ const method = rawMethod.toUpperCase();
249
+ return HTTP_METHODS.has(method) ? `${method}\0${path}` : null;
250
+ }
251
+ function lexicalContainer(node) {
252
+ let current = node;
253
+ while (current.parent !== null) {
254
+ current = current.parent;
255
+ if (current.type === 'program' || current.type === 'statement_block')
256
+ return current;
257
+ }
258
+ return current;
259
+ }
260
+ function loopBindingName(node) {
261
+ const left = node.childForFieldName('left');
262
+ if (left?.type === 'identifier')
263
+ return left.text;
264
+ if (left?.type !== 'lexical_declaration' && left?.type !== 'variable_declaration')
265
+ return null;
266
+ const declarator = left.namedChildren.find((child) => child.type === 'variable_declarator');
267
+ const name = declarator?.childForFieldName('name');
268
+ return name?.type === 'identifier' ? name.text : null;
269
+ }
270
+ function entryMemberField(node, entryName) {
271
+ if (node.type === 'parenthesized_expression') {
272
+ const nested = node.namedChildren[0];
273
+ return nested === undefined ? null : entryMemberField(nested, entryName);
274
+ }
275
+ if (node.type !== 'member_expression')
276
+ return null;
277
+ const object = node.childForFieldName('object');
278
+ const property = node.childForFieldName('property');
279
+ return object?.type === 'identifier' &&
280
+ object.text === entryName &&
281
+ property?.type === 'property_identifier'
282
+ ? property.text
283
+ : null;
284
+ }
285
+ const NESTED_EXECUTABLES = new Set([
286
+ 'function_declaration',
287
+ 'function_expression',
288
+ 'generator_function_declaration',
289
+ 'generator_function',
290
+ 'arrow_function',
291
+ 'method_definition',
292
+ 'class_declaration',
293
+ 'class',
294
+ ]);
295
+ function referencesEntry(node, entryName) {
296
+ if (node.type === 'identifier' && node.text === entryName)
297
+ return true;
298
+ return node.namedChildren.some((child) => referencesEntry(child, entryName));
299
+ }
300
+ const REQUEST_ROOTS = new Set(['req', 'request', 'event', 'ctx', 'context', 'url']);
301
+ const REQUEST_PATH_FIELDS = new Set(['path', 'pathname', 'url', 'rawpath']);
302
+ const REQUEST_METHOD_FIELDS = new Set(['method', 'httpmethod', 'verb']);
303
+ function isEnclosingParameter(node, name) {
304
+ let current = node.parent;
305
+ while (current !== null) {
306
+ if (NESTED_EXECUTABLES.has(current.type)) {
307
+ const names = new Set();
308
+ collectPatternNames(current.childForFieldName('parameters'), (value) => names.add(value));
309
+ collectPatternNames(current.childForFieldName('parameter'), (value) => names.add(value));
310
+ return names.has(name);
311
+ }
312
+ current = current.parent;
313
+ }
314
+ return false;
315
+ }
316
+ function isRequestField(node, field, bindingCounts) {
317
+ if (node.type === 'parenthesized_expression') {
318
+ const nested = node.namedChildren[0];
319
+ return nested !== undefined && isRequestField(nested, field, bindingCounts);
320
+ }
321
+ const accepted = field === 'path' ? REQUEST_PATH_FIELDS : REQUEST_METHOD_FIELDS;
322
+ if (node.type !== 'member_expression')
323
+ return false;
324
+ const object = node.childForFieldName('object');
325
+ const property = node.childForFieldName('property');
326
+ const root = object?.type === 'identifier' ? object.text : null;
327
+ const bindingCount = root === null ? 0 : (bindingCounts.get(root) ?? 0);
328
+ return (property?.type === 'property_identifier' &&
329
+ accepted.has(property.text.toLowerCase()) &&
330
+ root !== null &&
331
+ REQUEST_ROOTS.has(root.toLowerCase()) &&
332
+ (bindingCount === 0 || (bindingCount === 1 && isEnclosingParameter(node, root))));
333
+ }
334
+ function comparisonFields(condition, entryName, bindingCounts) {
335
+ const text = condition.text.trim();
336
+ if (text === 'false' || text === '0' || text === 'null' || text === 'undefined') {
337
+ return { valid: false, fields: new Set() };
338
+ }
339
+ if (condition.type === 'parenthesized_expression') {
340
+ const nested = condition.namedChildren[0];
341
+ return nested === undefined
342
+ ? { valid: true, fields: new Set() }
343
+ : comparisonFields(nested, entryName, bindingCounts);
344
+ }
345
+ if (condition.type === 'unary_expression')
346
+ return { valid: false, fields: new Set() };
347
+ if (condition.type !== 'binary_expression')
348
+ return { valid: false, fields: new Set() };
349
+ const operator = condition.children.find((child) => !child.isNamed)?.type;
350
+ const left = condition.childForFieldName('left');
351
+ const right = condition.childForFieldName('right');
352
+ if (left === null || right === null)
353
+ return { valid: false, fields: new Set() };
354
+ if (operator === '||')
355
+ return { valid: false, fields: new Set() };
356
+ if (operator === '&&') {
357
+ const leftEvidence = comparisonFields(left, entryName, bindingCounts);
358
+ const rightEvidence = comparisonFields(right, entryName, bindingCounts);
359
+ if (!leftEvidence.valid || !rightEvidence.valid)
360
+ return { valid: false, fields: new Set() };
361
+ return {
362
+ valid: true,
363
+ fields: new Set([...leftEvidence.fields, ...rightEvidence.fields]),
364
+ };
365
+ }
366
+ if (operator !== '===' && operator !== '==')
367
+ return { valid: false, fields: new Set() };
368
+ const leftField = entryMemberField(left, entryName);
369
+ const rightField = entryMemberField(right, entryName);
370
+ if ((leftField === null) === (rightField === null))
371
+ return { valid: false, fields: new Set() };
372
+ if ((leftField !== null && referencesEntry(right, entryName)) ||
373
+ (rightField !== null && referencesEntry(left, entryName))) {
374
+ return { valid: false, fields: new Set() };
375
+ }
376
+ const field = leftField ?? rightField;
377
+ const requestOperand = leftField !== null ? right : left;
378
+ const matchesRequest = (field === 'path' || field === 'method') &&
379
+ isRequestField(requestOperand, field, bindingCounts);
380
+ return {
381
+ valid: matchesRequest,
382
+ fields: matchesRequest ? new Set([field]) : new Set(),
383
+ };
384
+ }
385
+ function directlyCallsHandler(node, entryName) {
386
+ let found = false;
387
+ const visit = (child) => {
388
+ if (found || (child !== node && NESTED_EXECUTABLES.has(child.type)))
389
+ return;
390
+ if (child.type === 'statement_block') {
391
+ for (const statement of child.namedChildren) {
392
+ visit(statement);
393
+ if (found || definitelyTerminates(statement)) {
394
+ break;
395
+ }
396
+ }
397
+ return;
398
+ }
399
+ if (child.type === 'call_expression') {
400
+ const fn = child.childForFieldName('function');
401
+ if (fn !== null && entryMemberField(fn, entryName) === 'handler') {
402
+ let current = child;
403
+ let parent = current.parent;
404
+ while (parent !== null && current.id !== node.id) {
405
+ if (parent.type !== 'await_expression' &&
406
+ parent.type !== 'parenthesized_expression' &&
407
+ parent.type !== 'expression_statement' &&
408
+ parent.type !== 'return_statement' &&
409
+ parent.type !== 'statement_block') {
410
+ return;
411
+ }
412
+ current = parent;
413
+ parent = current.parent;
414
+ }
415
+ found = current.id === node.id;
416
+ return;
417
+ }
418
+ }
419
+ for (const nested of child.namedChildren)
420
+ visit(nested);
421
+ };
422
+ visit(node);
423
+ return found;
424
+ }
425
+ function isWriteTarget(node) {
426
+ let current = node;
427
+ let parent = current.parent;
428
+ while (parent !== null) {
429
+ if (parent.type === 'assignment_expression' ||
430
+ parent.type === 'augmented_assignment_expression') {
431
+ const left = parent.childForFieldName('left');
432
+ return left !== null && left.startIndex <= node.startIndex && left.endIndex >= node.endIndex;
433
+ }
434
+ if (parent.type === 'update_expression')
435
+ return true;
436
+ if (parent.type === 'unary_expression' && parent.text.trimStart().startsWith('delete ')) {
437
+ return true;
438
+ }
439
+ if (parent.type === 'expression_statement' ||
440
+ parent.type === 'variable_declarator' ||
441
+ parent.type === 'call_expression') {
442
+ return false;
443
+ }
444
+ current = parent;
445
+ parent = current.parent;
446
+ }
447
+ return false;
448
+ }
449
+ function hasOnlyIngressReferences(scope) {
450
+ let valid = true;
451
+ const visit = (node) => {
452
+ if (!valid)
453
+ return;
454
+ if (node.type === 'identifier' && REQUEST_ROOTS.has(node.text.toLowerCase())) {
455
+ const member = node.parent;
456
+ const property = member?.childForFieldName('property');
457
+ if (member?.type !== 'member_expression' ||
458
+ member.childForFieldName('object')?.id !== node.id ||
459
+ property?.type !== 'property_identifier' ||
460
+ (!REQUEST_PATH_FIELDS.has(property.text.toLowerCase()) &&
461
+ !REQUEST_METHOD_FIELDS.has(property.text.toLowerCase())) ||
462
+ isWriteTarget(member)) {
463
+ valid = false;
464
+ return;
465
+ }
466
+ }
467
+ for (const child of node.namedChildren)
468
+ visit(child);
469
+ };
470
+ visit(scope);
471
+ return valid;
472
+ }
473
+ function hasOnlyDispatchEntryReferences(node, entryName) {
474
+ let valid = true;
475
+ const visit = (child) => {
476
+ if (!valid)
477
+ return;
478
+ if (child.type === 'identifier' && child.text === entryName) {
479
+ const member = child.parent;
480
+ if (member?.type !== 'member_expression' ||
481
+ member.childForFieldName('object')?.id !== child.id) {
482
+ valid = false;
483
+ return;
484
+ }
485
+ const property = member.childForFieldName('property');
486
+ if (property?.type !== 'property_identifier' || isWriteTarget(member)) {
487
+ valid = false;
488
+ return;
489
+ }
490
+ if (property.text === 'handler') {
491
+ const call = member.parent;
492
+ if (call?.type !== 'call_expression' ||
493
+ call.childForFieldName('function')?.id !== member.id) {
494
+ valid = false;
495
+ return;
496
+ }
497
+ }
498
+ else if (property.text !== 'path' && property.text !== 'method') {
499
+ valid = false;
500
+ return;
501
+ }
502
+ }
503
+ for (const nested of child.namedChildren)
504
+ visit(nested);
505
+ };
506
+ visit(node);
507
+ return valid;
508
+ }
509
+ function hasProviderDispatch(body, entryName, bindingCounts) {
510
+ if (!hasOnlyDispatchEntryReferences(body, entryName))
511
+ return false;
512
+ let found = false;
513
+ const visit = (node) => {
514
+ if (found || (node !== body && NESTED_EXECUTABLES.has(node.type)))
515
+ return;
516
+ if (node.type === 'statement_block') {
517
+ for (const statement of node.namedChildren) {
518
+ visit(statement);
519
+ if (found || definitelyTerminates(statement)) {
520
+ break;
521
+ }
522
+ }
523
+ return;
524
+ }
525
+ if (node.type === 'if_statement') {
526
+ const condition = node.childForFieldName('condition');
527
+ const consequence = node.childForFieldName('consequence');
528
+ if (condition !== null && isStaticallyFalse(condition)) {
529
+ const alternative = node.childForFieldName('alternative');
530
+ if (alternative !== null)
531
+ visit(alternative);
532
+ return;
533
+ }
534
+ if (condition !== null && consequence !== null) {
535
+ const evidence = comparisonFields(condition, entryName, bindingCounts);
536
+ if (evidence.valid &&
537
+ evidence.fields.has('path') &&
538
+ evidence.fields.has('method') &&
539
+ directlyCallsHandler(consequence, entryName)) {
540
+ found = true;
541
+ return;
542
+ }
543
+ }
544
+ }
545
+ for (const child of node.namedChildren)
546
+ visit(child);
547
+ };
548
+ visit(body);
549
+ return found;
550
+ }
551
+ function isStaticallyFalse(node) {
552
+ if (node.type === 'parenthesized_expression') {
553
+ const nested = node.namedChildren[0];
554
+ return nested !== undefined && isStaticallyFalse(nested);
555
+ }
556
+ const text = node.text.trim();
557
+ return text === 'false' || text === '0' || text === 'null' || text === 'undefined';
558
+ }
559
+ function isStaticallyTrue(node) {
560
+ if (node.type === 'parenthesized_expression') {
561
+ const nested = node.namedChildren[0];
562
+ return nested !== undefined && isStaticallyTrue(nested);
563
+ }
564
+ return node.text.trim() === 'true';
565
+ }
566
+ function definitelyTerminates(node) {
567
+ if (node.type === 'return_statement' ||
568
+ node.type === 'throw_statement' ||
569
+ node.type === 'break_statement' ||
570
+ node.type === 'continue_statement') {
571
+ return true;
572
+ }
573
+ if (node.type === 'statement_block') {
574
+ return node.namedChildren.some((statement) => definitelyTerminates(statement));
575
+ }
576
+ if (node.type !== 'if_statement')
577
+ return false;
578
+ const condition = node.childForFieldName('condition');
579
+ const consequence = node.childForFieldName('consequence');
580
+ const alternative = node.childForFieldName('alternative');
581
+ if (condition === null)
582
+ return false;
583
+ if (isStaticallyTrue(condition)) {
584
+ return consequence !== null && definitelyTerminates(consequence);
585
+ }
586
+ if (isStaticallyFalse(condition)) {
587
+ return alternative !== null && definitelyTerminates(alternative);
588
+ }
589
+ return (consequence !== null &&
590
+ alternative !== null &&
591
+ definitelyTerminates(consequence) &&
592
+ definitelyTerminates(alternative));
593
+ }
594
+ function hasDispatchLoop(scope, tableName, bindingCounts) {
595
+ let found = false;
596
+ const visit = (node) => {
597
+ if (found)
598
+ return;
599
+ if (node !== scope && NESTED_EXECUTABLES.has(node.type))
600
+ return;
601
+ if (node.type === 'for_in_statement') {
602
+ const right = node.childForFieldName('right');
603
+ const isForOf = node.children.some((child) => child.type === 'of');
604
+ const hasConstBinding = node.children.some((child) => child.type === 'const');
605
+ if (isForOf && hasConstBinding && right?.type === 'identifier' && right.text === tableName) {
606
+ const entryName = loopBindingName(node);
607
+ const body = node.childForFieldName('body');
608
+ if (entryName !== null &&
609
+ bindingCounts.get(entryName) === 1 &&
610
+ body !== null &&
611
+ hasProviderDispatch(body, entryName, bindingCounts)) {
612
+ found = true;
613
+ return;
614
+ }
615
+ }
616
+ }
617
+ for (const child of node.namedChildren)
618
+ visit(child);
619
+ };
620
+ visit(scope);
621
+ return found;
622
+ }
623
+ function collectPatternNames(node, add) {
624
+ if (node === null)
625
+ return;
626
+ if (node.type === 'identifier') {
627
+ add(node.text);
628
+ return;
629
+ }
630
+ for (const child of node.namedChildren)
631
+ collectPatternNames(child, add);
632
+ }
633
+ function collectBindingCounts(root) {
634
+ const counts = new Map();
635
+ const add = (name) => {
636
+ counts.set(name, (counts.get(name) ?? 0) + 1);
637
+ };
638
+ const visit = (node) => {
639
+ if (node.type === 'import_statement') {
640
+ const clause = node.namedChildren.find((child) => child.type === 'import_clause');
641
+ collectPatternNames(clause ?? null, add);
642
+ return;
643
+ }
644
+ if (node.type === 'variable_declarator') {
645
+ collectPatternNames(node.childForFieldName('name'), add);
646
+ }
647
+ else if (node.type === 'for_in_statement') {
648
+ const left = node.childForFieldName('left');
649
+ if (left?.type === 'identifier')
650
+ add(left.text);
651
+ }
652
+ else if (node.type === 'function_declaration' ||
653
+ node.type === 'generator_function_declaration' ||
654
+ node.type === 'class_declaration') {
655
+ collectPatternNames(node.childForFieldName('name'), add);
656
+ }
657
+ if (node.type === 'function_declaration' ||
658
+ node.type === 'function_expression' ||
659
+ node.type === 'generator_function_declaration' ||
660
+ node.type === 'generator_function' ||
661
+ node.type === 'arrow_function' ||
662
+ node.type === 'method_definition') {
663
+ collectPatternNames(node.childForFieldName('parameters'), add);
664
+ collectPatternNames(node.childForFieldName('parameter'), add);
665
+ }
666
+ else if (node.type === 'catch_clause') {
667
+ collectPatternNames(node.childForFieldName('parameter'), add);
668
+ }
669
+ for (const child of node.namedChildren)
670
+ visit(child);
671
+ };
672
+ visit(root);
673
+ return counts;
674
+ }
675
+ function isConstDeclarator(node) {
676
+ const declaration = node.parent;
677
+ return (declaration?.type === 'lexical_declaration' &&
678
+ declaration.children.some((child) => child.type === 'const'));
679
+ }
680
+ function hasOnlyDispatchReferences(scope, declarator, tableName) {
681
+ const declarationName = declarator.childForFieldName('name');
682
+ let valid = true;
683
+ const visit = (node) => {
684
+ if (!valid)
685
+ return;
686
+ if (node.type === 'identifier' && node.text === tableName) {
687
+ if (declarationName?.id === node.id)
688
+ return;
689
+ const parent = node.parent;
690
+ const allowedForOf = parent?.type === 'for_in_statement' &&
691
+ parent.childForFieldName('right')?.id === node.id &&
692
+ parent.children.some((child) => child.type === 'of');
693
+ const lengthMember = parent?.type === 'member_expression' &&
694
+ parent.childForFieldName('object')?.id === node.id &&
695
+ parent.childForFieldName('property')?.text === 'length'
696
+ ? parent
697
+ : null;
698
+ const allowedLengthRead = lengthMember !== null && !isWriteTarget(lengthMember);
699
+ if (!allowedForOf && !allowedLengthRead) {
700
+ valid = false;
701
+ return;
702
+ }
703
+ }
704
+ for (const child of node.namedChildren)
705
+ visit(child);
706
+ };
707
+ visit(scope);
708
+ return valid;
709
+ }
710
+ function collectHandlerReferences(root) {
711
+ const references = new Map();
712
+ const visit = (node) => {
713
+ if (node.type === 'identifier' ||
714
+ node.type === 'shorthand_property_identifier' ||
715
+ node.type === 'shorthand_property_identifier_pattern') {
716
+ const matches = references.get(node.text);
717
+ if (matches === undefined)
718
+ references.set(node.text, [node]);
719
+ else
720
+ matches.push(node);
721
+ }
722
+ for (const child of node.namedChildren)
723
+ visit(child);
724
+ };
725
+ visit(root);
726
+ return references;
727
+ }
728
+ function containsNode(container, node) {
729
+ return (container !== null &&
730
+ container.startIndex <= node.startIndex &&
731
+ container.endIndex >= node.endIndex);
732
+ }
733
+ function isUnsafeHandlerReference(reference, handlerRoot, routeEntry) {
734
+ let current = reference;
735
+ let parent = current.parent;
736
+ while (parent !== null) {
737
+ if (parent.type === 'variable_declarator') {
738
+ const name = parent.childForFieldName('name');
739
+ const value = parent.childForFieldName('value');
740
+ if (name?.type === 'identifier' &&
741
+ name.text !== handlerRoot &&
742
+ containsNode(value, reference) &&
743
+ !isRouteHandlerDesignatorReference(reference, routeEntry)) {
744
+ return true;
745
+ }
746
+ }
747
+ // The remaining checks historically matched ordinary identifiers only.
748
+ if (reference.type === 'identifier') {
749
+ if (parent.type === 'assignment_expression' ||
750
+ parent.type === 'augmented_assignment_expression' ||
751
+ parent.type === 'update_expression' ||
752
+ (parent.type === 'unary_expression' && parent.text.trimStart().startsWith('delete ')) ||
753
+ parent.type === 'return_statement' ||
754
+ parent.type === 'yield_expression' ||
755
+ parent.type === 'throw_statement') {
756
+ return true;
757
+ }
758
+ if (parent.type === 'call_expression') {
759
+ const args = parent.childForFieldName('arguments');
760
+ const fn = parent.childForFieldName('function');
761
+ const owner = fn?.childForFieldName('object');
762
+ const callsOwnerMember = (fn?.type === 'member_expression' || fn?.type === 'subscript_expression') &&
763
+ identifierName(owner) === handlerRoot &&
764
+ containsNode(owner ?? null, reference);
765
+ if (containsNode(args, reference) || callsOwnerMember)
766
+ return true;
767
+ }
768
+ }
769
+ current = parent;
770
+ parent = current.parent;
771
+ }
772
+ return false;
773
+ }
774
+ function hasStableHandlerBinding(references, handlerRoot, routeEntry) {
775
+ return !(references.get(handlerRoot) ?? []).some((reference) => isUnsafeHandlerReference(reference, handlerRoot, routeEntry));
776
+ }
777
+ function identifierName(node) {
778
+ if (node?.type === 'identifier')
779
+ return node.text;
780
+ if (node?.type === 'parenthesized_expression') {
781
+ return identifierName(node.namedChildren[0]);
782
+ }
783
+ return null;
784
+ }
785
+ function isRouteHandlerDesignatorReference(node, routeEntry) {
786
+ let designator = node;
787
+ if (node.parent?.type === 'member_expression' &&
788
+ node.parent.childForFieldName('object')?.id === node.id) {
789
+ designator = node.parent;
790
+ }
791
+ const pair = designator.parent;
792
+ return (pair?.type === 'pair' &&
793
+ pair.parent?.id === routeEntry.id &&
794
+ pair.childForFieldName('value')?.id === designator.id &&
795
+ propertyName(pair.childForFieldName('key')) === 'handler');
796
+ }
797
+ /** Return static route facts shared by ingestion and group contract extraction. */
798
+ export function scanDataRouteTables(tree) {
799
+ const source = tree.rootNode.text;
800
+ if (!ROUTE_TOKEN_HINTS.every((token) => source.includes(token)))
801
+ return [];
802
+ const routes = [];
803
+ const blockedIdentities = new Set();
804
+ let hasUnknownTableEntries = false;
805
+ const bindingCounts = collectBindingCounts(tree.rootNode);
806
+ const handlerReferences = collectHandlerReferences(tree.rootNode);
807
+ const visit = (node) => {
808
+ if (node.type === 'variable_declarator') {
809
+ const name = node.childForFieldName('name');
810
+ const value = node.childForFieldName('value');
811
+ if (name?.type === 'identifier' &&
812
+ ROUTE_BINDING_HINT.test(name.text) &&
813
+ bindingCounts.get(name.text) === 1 &&
814
+ isConstDeclarator(node) &&
815
+ value?.type === 'array' &&
816
+ hasOnlyDispatchReferences(lexicalContainer(node), node, name.text) &&
817
+ hasOnlyIngressReferences(lexicalContainer(node)) &&
818
+ hasDispatchLoop(lexicalContainer(node), name.text, bindingCounts)) {
819
+ const parsedRoutes = [];
820
+ let blocksFollowingCandidates = false;
821
+ for (const entry of value.namedChildren) {
822
+ if (entry.type === 'comment')
823
+ continue;
824
+ if (entry.type !== 'object') {
825
+ hasUnknownTableEntries = true;
826
+ continue;
827
+ }
828
+ const route = routeFromObject(entry);
829
+ if (route === null) {
830
+ const identity = staticRouteIdentity(entry);
831
+ if (identity !== null)
832
+ blockedIdentities.add(identity);
833
+ if (identity === null) {
834
+ blocksFollowingCandidates = true;
835
+ }
836
+ continue;
837
+ }
838
+ const identity = `${route.method}\0${route.path}`;
839
+ if (blocksFollowingCandidates) {
840
+ blockedIdentities.add(identity);
841
+ continue;
842
+ }
843
+ const handlerRoot = route.handlerDesignator.split('.')[0];
844
+ if (handlerRoot === undefined ||
845
+ (bindingCounts.get(handlerRoot) ?? 0) > 1 ||
846
+ !hasStableHandlerBinding(handlerReferences, handlerRoot, entry)) {
847
+ blockedIdentities.add(identity);
848
+ continue;
849
+ }
850
+ parsedRoutes.push(route);
851
+ }
852
+ routes.push(...parsedRoutes);
853
+ }
854
+ }
855
+ for (const child of node.namedChildren)
856
+ visit(child);
857
+ };
858
+ visit(tree.rootNode);
859
+ if (hasUnknownTableEntries)
860
+ return [];
861
+ return routes.filter((route) => !blockedIdentities.has(`${route.method}\0${route.path}`));
862
+ }
863
+ export function extractDataRouteTableRoutes(tree, filePath, lineOffset = 0) {
864
+ return scanDataRouteTables(tree).map((route) => ({
865
+ filePath,
866
+ routePath: route.path,
867
+ httpMethod: route.method,
868
+ decoratorName: 'DataRouteTable',
869
+ lineNumber: route.line + lineOffset,
870
+ // This source preserves a static dotted designator in the existing field.
871
+ // Its resolver recognizes the source tag and proves the receiver owner;
872
+ // ordinary decorator routes continue to carry a simple handler name.
873
+ handlerName: route.handlerDesignator,
874
+ source: DATA_ROUTE_TABLE_SOURCE,
875
+ }));
876
+ }