gitnexus 1.6.10-rc.98 → 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 (777) 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/class-extractors/configs/jvm.js +6 -6
  126. package/dist/core/ingestion/cluster-enricher.js +8 -4
  127. package/dist/core/ingestion/community-processor.d.ts +21 -3
  128. package/dist/core/ingestion/community-processor.js +81 -82
  129. package/dist/core/ingestion/di-extractors/index.d.ts +9 -33
  130. package/dist/core/ingestion/di-extractors/spring.d.ts +1 -1
  131. package/dist/core/ingestion/di-extractors/spring.js +8 -1
  132. package/dist/core/ingestion/di-extractors/types.d.ts +60 -0
  133. package/dist/core/ingestion/di-extractors/types.js +15 -0
  134. package/dist/core/ingestion/filesystem-walker.js +30 -14
  135. package/dist/core/ingestion/finalize-orchestrator.js +1 -0
  136. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +6 -0
  137. package/dist/core/ingestion/frameworks/spring/analysis-features.js +35 -1
  138. package/dist/core/ingestion/frameworks/spring/annotation-arguments.d.ts +13 -0
  139. package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +227 -0
  140. package/dist/core/ingestion/frameworks/spring/aop-candidates.d.ts +15 -0
  141. package/dist/core/ingestion/frameworks/spring/aop-candidates.js +85 -0
  142. package/dist/core/ingestion/frameworks/spring/aop.d.ts +118 -0
  143. package/dist/core/ingestion/frameworks/spring/aop.js +476 -0
  144. package/dist/core/ingestion/frameworks/spring/auto-configuration.d.ts +8 -0
  145. package/dist/core/ingestion/frameworks/spring/auto-configuration.js +16 -0
  146. package/dist/core/ingestion/frameworks/spring/bean-catalog.js +1 -0
  147. package/dist/core/ingestion/frameworks/spring/bean-factories.d.ts +33 -0
  148. package/dist/core/ingestion/frameworks/spring/bean-factories.js +65 -0
  149. package/dist/core/ingestion/frameworks/spring/conditionals.d.ts +25 -0
  150. package/dist/core/ingestion/frameworks/spring/conditionals.js +319 -0
  151. package/dist/core/ingestion/frameworks/spring/di-metadata.d.ts +3 -0
  152. package/dist/core/ingestion/frameworks/spring/di-metadata.js +162 -13
  153. package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +28 -0
  154. package/dist/core/ingestion/frameworks/spring/non-http-handlers.js +152 -0
  155. package/dist/core/ingestion/frameworks/spring/resource-injection.d.ts +5 -0
  156. package/dist/core/ingestion/frameworks/spring/resource-injection.js +91 -0
  157. package/dist/core/ingestion/import-resolvers/configs/csharp.js +5 -1
  158. package/dist/core/ingestion/import-resolvers/configs/swift.js +13 -0
  159. package/dist/core/ingestion/import-resolvers/csharp.d.ts +9 -1
  160. package/dist/core/ingestion/import-resolvers/csharp.js +234 -27
  161. package/dist/core/ingestion/import-resolvers/go.d.ts +11 -1
  162. package/dist/core/ingestion/import-resolvers/go.js +44 -17
  163. package/dist/core/ingestion/import-resolvers/jvm.d.ts +2 -2
  164. package/dist/core/ingestion/import-resolvers/node-workspace-packages.d.ts +90 -0
  165. package/dist/core/ingestion/import-resolvers/node-workspace-packages.js +429 -0
  166. package/dist/core/ingestion/import-resolvers/package-dir-index.d.ts +124 -0
  167. package/dist/core/ingestion/import-resolvers/package-dir-index.js +223 -0
  168. package/dist/core/ingestion/import-resolvers/pass-cache.d.ts +50 -0
  169. package/dist/core/ingestion/import-resolvers/pass-cache.js +60 -0
  170. package/dist/core/ingestion/import-resolvers/per-file-set.d.ts +71 -0
  171. package/dist/core/ingestion/import-resolvers/per-file-set.js +11 -0
  172. package/dist/core/ingestion/import-resolvers/php.d.ts +1 -1
  173. package/dist/core/ingestion/import-resolvers/php.js +65 -19
  174. package/dist/core/ingestion/import-resolvers/python-file-index.d.ts +201 -0
  175. package/dist/core/ingestion/import-resolvers/python-file-index.js +302 -0
  176. package/dist/core/ingestion/import-resolvers/python.js +25 -6
  177. package/dist/core/ingestion/import-resolvers/ruby.d.ts +1 -1
  178. package/dist/core/ingestion/import-resolvers/rust.d.ts +2 -2
  179. package/dist/core/ingestion/import-resolvers/standard.d.ts +1 -1
  180. package/dist/core/ingestion/import-resolvers/types.d.ts +1 -12
  181. package/dist/core/ingestion/import-resolvers/utils.d.ts +65 -6
  182. package/dist/core/ingestion/import-resolvers/utils.js +215 -36
  183. package/dist/core/ingestion/import-resolvers/workspace-file-index.d.ts +72 -0
  184. package/dist/core/ingestion/import-resolvers/workspace-file-index.js +58 -0
  185. package/dist/core/ingestion/language-config.d.ts +29 -1
  186. package/dist/core/ingestion/language-config.js +110 -35
  187. package/dist/core/ingestion/language-provider.d.ts +209 -7
  188. package/dist/core/ingestion/language-provider.js +37 -0
  189. package/dist/core/ingestion/languages/c/captures.js +7 -0
  190. package/dist/core/ingestion/languages/c/import-target.js +12 -16
  191. package/dist/core/ingestion/languages/c/scope-resolver.js +20 -19
  192. package/dist/core/ingestion/languages/c/static-linkage.js +12 -16
  193. package/dist/core/ingestion/languages/c-cpp.js +13 -0
  194. package/dist/core/ingestion/languages/cobol/scope-resolver.js +27 -20
  195. package/dist/core/ingestion/languages/cobol.js +13 -0
  196. package/dist/core/ingestion/languages/cpp/adl.d.ts +2 -2
  197. package/dist/core/ingestion/languages/cpp/adl.js +67 -44
  198. package/dist/core/ingestion/languages/cpp/captures.js +14 -2
  199. package/dist/core/ingestion/languages/cpp/file-local-linkage.js +11 -15
  200. package/dist/core/ingestion/languages/cpp/inline-namespaces.d.ts +28 -8
  201. package/dist/core/ingestion/languages/cpp/inline-namespaces.js +242 -68
  202. package/dist/core/ingestion/languages/cpp/interpret.d.ts +2 -0
  203. package/dist/core/ingestion/languages/cpp/interpret.js +126 -6
  204. package/dist/core/ingestion/languages/cpp/query.js +106 -0
  205. package/dist/core/ingestion/languages/cpp/scope-resolver.js +48 -20
  206. package/dist/core/ingestion/languages/csharp/accessor-unwrap.d.ts +2 -15
  207. package/dist/core/ingestion/languages/csharp/accessor-unwrap.js +18 -10
  208. package/dist/core/ingestion/languages/csharp/captures.js +19 -0
  209. package/dist/core/ingestion/languages/csharp/import-target.js +46 -72
  210. package/dist/core/ingestion/languages/csharp/namespace-siblings.js +5 -1
  211. package/dist/core/ingestion/languages/csharp/query.js +25 -5
  212. package/dist/core/ingestion/languages/csharp/scope-resolver.js +75 -2
  213. package/dist/core/ingestion/languages/dart/captures.d.ts +10 -0
  214. package/dist/core/ingestion/languages/dart/captures.js +598 -16
  215. package/dist/core/ingestion/languages/dart/import-target.js +32 -9
  216. package/dist/core/ingestion/languages/dart/index.d.ts +1 -1
  217. package/dist/core/ingestion/languages/dart/index.js +1 -1
  218. package/dist/core/ingestion/languages/dart/query.js +98 -1
  219. package/dist/core/ingestion/languages/dart/scope-resolver.js +14 -3
  220. package/dist/core/ingestion/languages/dart/simple-hooks.js +9 -0
  221. package/dist/core/ingestion/languages/dart.js +6 -1
  222. package/dist/core/ingestion/languages/go/captures.js +108 -3
  223. package/dist/core/ingestion/languages/go/generic-type-parameters.d.ts +31 -0
  224. package/dist/core/ingestion/languages/go/generic-type-parameters.js +140 -0
  225. package/dist/core/ingestion/languages/go/import-target.d.ts +3 -10
  226. package/dist/core/ingestion/languages/go/import-target.js +34 -30
  227. package/dist/core/ingestion/languages/go/index.d.ts +1 -1
  228. package/dist/core/ingestion/languages/go/interface-impls.d.ts +9 -1
  229. package/dist/core/ingestion/languages/go/interface-impls.js +693 -87
  230. package/dist/core/ingestion/languages/go/interpret.d.ts +2 -0
  231. package/dist/core/ingestion/languages/go/interpret.js +22 -8
  232. package/dist/core/ingestion/languages/go/method-owners.js +31 -12
  233. package/dist/core/ingestion/languages/go/package-clause.d.ts +46 -0
  234. package/dist/core/ingestion/languages/go/package-clause.js +75 -0
  235. package/dist/core/ingestion/languages/go/package-siblings.js +7 -11
  236. package/dist/core/ingestion/languages/go/query.js +56 -3
  237. package/dist/core/ingestion/languages/go/scope-resolver.js +39 -0
  238. package/dist/core/ingestion/languages/go.js +9 -0
  239. package/dist/core/ingestion/languages/java/analysis-features.d.ts +4 -0
  240. package/dist/core/ingestion/languages/java/analysis-features.js +12 -0
  241. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +12 -0
  242. package/dist/core/ingestion/languages/java/capture-side-channel.js +48 -0
  243. package/dist/core/ingestion/languages/java/captures.js +129 -44
  244. package/dist/core/ingestion/languages/java/import-target.d.ts +49 -9
  245. package/dist/core/ingestion/languages/java/import-target.js +68 -88
  246. package/dist/core/ingestion/languages/java/interpret.js +3 -2
  247. package/dist/core/ingestion/languages/java/module-resolution.d.ts +62 -0
  248. package/dist/core/ingestion/languages/java/module-resolution.js +142 -0
  249. package/dist/core/ingestion/languages/java/query.js +16 -3
  250. package/dist/core/ingestion/languages/java/record-components.d.ts +14 -0
  251. package/dist/core/ingestion/languages/java/record-components.js +185 -0
  252. package/dist/core/ingestion/languages/java/scope-resolver.js +10 -2
  253. package/dist/core/ingestion/languages/java/spring-aop.d.ts +12 -0
  254. package/dist/core/ingestion/languages/java/spring-aop.js +49 -0
  255. package/dist/core/ingestion/languages/java/spring-conditionals.d.ts +11 -0
  256. package/dist/core/ingestion/languages/java/spring-conditionals.js +48 -0
  257. package/dist/core/ingestion/languages/java/spring-di.d.ts +4 -1
  258. package/dist/core/ingestion/languages/java/spring-di.js +41 -9
  259. package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +7 -0
  260. package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +32 -0
  261. package/dist/core/ingestion/languages/java.js +94 -3
  262. package/dist/core/ingestion/languages/javascript/captures.d.ts +6 -1
  263. package/dist/core/ingestion/languages/javascript/captures.js +262 -4
  264. package/dist/core/ingestion/languages/javascript/import-target.d.ts +17 -21
  265. package/dist/core/ingestion/languages/javascript/import-target.js +24 -41
  266. package/dist/core/ingestion/languages/javascript/index.d.ts +54 -5
  267. package/dist/core/ingestion/languages/javascript/index.js +54 -5
  268. package/dist/core/ingestion/languages/javascript/query.d.ts +1 -0
  269. package/dist/core/ingestion/languages/javascript/query.js +211 -5
  270. package/dist/core/ingestion/languages/javascript/scope-resolver.js +12 -0
  271. package/dist/core/ingestion/languages/javascript/simple-hooks.js +2 -1
  272. package/dist/core/ingestion/languages/jvm/package-siblings.js +77 -9
  273. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
  274. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +48 -0
  275. package/dist/core/ingestion/languages/kotlin/captures.js +43 -1
  276. package/dist/core/ingestion/languages/kotlin/import-target.d.ts +8 -1
  277. package/dist/core/ingestion/languages/kotlin/import-target.js +20 -123
  278. package/dist/core/ingestion/languages/kotlin/index.d.ts +1 -0
  279. package/dist/core/ingestion/languages/kotlin/index.js +1 -0
  280. package/dist/core/ingestion/languages/kotlin/module-resolution.d.ts +22 -0
  281. package/dist/core/ingestion/languages/kotlin/module-resolution.js +108 -0
  282. package/dist/core/ingestion/languages/kotlin/query.js +28 -2
  283. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +23 -2
  284. package/dist/core/ingestion/languages/kotlin/spring-aop.d.ts +12 -0
  285. package/dist/core/ingestion/languages/kotlin/spring-aop.js +64 -0
  286. package/dist/core/ingestion/languages/kotlin/spring-conditionals.d.ts +12 -0
  287. package/dist/core/ingestion/languages/kotlin/spring-conditionals.js +49 -0
  288. package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +2 -0
  289. package/dist/core/ingestion/languages/kotlin/spring-di.js +60 -11
  290. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +10 -0
  291. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +41 -0
  292. package/dist/core/ingestion/languages/php/captures.d.ts +5 -0
  293. package/dist/core/ingestion/languages/php/captures.js +319 -51
  294. package/dist/core/ingestion/languages/php/import-target.d.ts +3 -4
  295. package/dist/core/ingestion/languages/php/import-target.js +192 -62
  296. package/dist/core/ingestion/languages/php/query.js +31 -0
  297. package/dist/core/ingestion/languages/python/arity-metadata.d.ts +1 -0
  298. package/dist/core/ingestion/languages/python/arity-metadata.js +1 -0
  299. package/dist/core/ingestion/languages/python/captures.js +29 -0
  300. package/dist/core/ingestion/languages/python/import-decomposer.js +22 -1
  301. package/dist/core/ingestion/languages/python/import-target.d.ts +42 -1
  302. package/dist/core/ingestion/languages/python/import-target.js +277 -91
  303. package/dist/core/ingestion/languages/python/index.d.ts +1 -1
  304. package/dist/core/ingestion/languages/python/index.js +1 -1
  305. package/dist/core/ingestion/languages/python/interpret.d.ts +52 -0
  306. package/dist/core/ingestion/languages/python/interpret.js +249 -7
  307. package/dist/core/ingestion/languages/python/query.js +9 -0
  308. package/dist/core/ingestion/languages/python/receiver-binding.d.ts +8 -6
  309. package/dist/core/ingestion/languages/python/receiver-binding.js +108 -12
  310. package/dist/core/ingestion/languages/python/scope-resolver.js +27 -4
  311. package/dist/core/ingestion/languages/python/simple-hooks.js +2 -8
  312. package/dist/core/ingestion/languages/python.js +13 -0
  313. package/dist/core/ingestion/languages/ruby/captures.js +158 -0
  314. package/dist/core/ingestion/languages/ruby/import-target.js +7 -5
  315. package/dist/core/ingestion/languages/ruby/query.js +93 -0
  316. package/dist/core/ingestion/languages/ruby/scope-resolver.js +2 -0
  317. package/dist/core/ingestion/languages/ruby/simple-hooks.d.ts +1 -1
  318. package/dist/core/ingestion/languages/ruby/simple-hooks.js +22 -1
  319. package/dist/core/ingestion/languages/rust/captures.js +39 -1
  320. package/dist/core/ingestion/languages/rust/method-owners.js +11 -1
  321. package/dist/core/ingestion/languages/rust/module-path.d.ts +126 -0
  322. package/dist/core/ingestion/languages/rust/module-path.js +214 -0
  323. package/dist/core/ingestion/languages/rust/qualified-call.d.ts +41 -0
  324. package/dist/core/ingestion/languages/rust/qualified-call.js +481 -0
  325. package/dist/core/ingestion/languages/rust/query.js +39 -6
  326. package/dist/core/ingestion/languages/rust/scope-resolver.js +21 -2
  327. package/dist/core/ingestion/languages/rust.js +17 -0
  328. package/dist/core/ingestion/languages/swift/captures.js +87 -3
  329. package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.d.ts +48 -0
  330. package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.js +253 -0
  331. package/dist/core/ingestion/languages/swift/import-target.js +4 -9
  332. package/dist/core/ingestion/languages/swift/query.js +17 -0
  333. package/dist/core/ingestion/languages/swift/receiver-binding.d.ts +8 -0
  334. package/dist/core/ingestion/languages/swift/receiver-binding.js +6 -2
  335. package/dist/core/ingestion/languages/swift.js +2 -0
  336. package/dist/core/ingestion/languages/typescript/captures.d.ts +90 -1
  337. package/dist/core/ingestion/languages/typescript/captures.js +267 -5
  338. package/dist/core/ingestion/languages/typescript/cjs-export-assignment.d.ts +134 -0
  339. package/dist/core/ingestion/languages/typescript/cjs-export-assignment.js +523 -0
  340. package/dist/core/ingestion/languages/typescript/cjs-module-exports.d.ts +54 -0
  341. package/dist/core/ingestion/languages/typescript/cjs-module-exports.js +191 -0
  342. package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.d.ts +7 -0
  343. package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.js +92 -0
  344. package/dist/core/ingestion/languages/typescript/file-candidates.d.ts +29 -0
  345. package/dist/core/ingestion/languages/typescript/file-candidates.js +70 -0
  346. package/dist/core/ingestion/languages/typescript/import-decomposer.d.ts +28 -1
  347. package/dist/core/ingestion/languages/typescript/import-decomposer.js +125 -10
  348. package/dist/core/ingestion/languages/typescript/import-target.d.ts +25 -37
  349. package/dist/core/ingestion/languages/typescript/import-target.js +24 -26
  350. package/dist/core/ingestion/languages/typescript/interpret.d.ts +21 -1
  351. package/dist/core/ingestion/languages/typescript/interpret.js +45 -5
  352. package/dist/core/ingestion/languages/typescript/module-resolution.d.ts +48 -0
  353. package/dist/core/ingestion/languages/typescript/module-resolution.js +171 -0
  354. package/dist/core/ingestion/languages/typescript/query.d.ts +1 -0
  355. package/dist/core/ingestion/languages/typescript/query.js +303 -14
  356. package/dist/core/ingestion/languages/typescript/receiver-binding.d.ts +17 -0
  357. package/dist/core/ingestion/languages/typescript/receiver-binding.js +27 -0
  358. package/dist/core/ingestion/languages/typescript/scope-resolver.js +27 -40
  359. package/dist/core/ingestion/languages/typescript/simple-hooks.d.ts +0 -10
  360. package/dist/core/ingestion/languages/typescript/simple-hooks.js +22 -22
  361. package/dist/core/ingestion/languages/typescript/tsconfig.d.ts +59 -0
  362. package/dist/core/ingestion/languages/typescript/tsconfig.js +292 -0
  363. package/dist/core/ingestion/languages/typescript.js +93 -2
  364. package/dist/core/ingestion/languages/vue/import-target.d.ts +6 -22
  365. package/dist/core/ingestion/languages/vue/import-target.js +11 -47
  366. package/dist/core/ingestion/languages/vue/scope-resolver.js +4 -2
  367. package/dist/core/ingestion/local-symbol-pruner.js +11 -11
  368. package/dist/core/ingestion/method-extractors/configs/csharp.js +1 -0
  369. package/dist/core/ingestion/method-extractors/generic.js +1 -0
  370. package/dist/core/ingestion/method-types.d.ts +16 -0
  371. package/dist/core/ingestion/pipeline-phases/di.d.ts +1 -1
  372. package/dist/core/ingestion/pipeline-phases/di.js +136 -21
  373. package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
  374. package/dist/core/ingestion/pipeline-phases/index.js +2 -0
  375. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +15 -0
  376. package/dist/core/ingestion/pipeline-phases/parse-impl.js +154 -4
  377. package/dist/core/ingestion/pipeline-phases/parse.js +5 -0
  378. package/dist/core/ingestion/pipeline-phases/processes.d.ts +3 -2
  379. package/dist/core/ingestion/pipeline-phases/processes.js +91 -6
  380. package/dist/core/ingestion/pipeline-phases/routes.js +116 -25
  381. package/dist/core/ingestion/pipeline-phases/spring-aop.d.ts +34 -0
  382. package/dist/core/ingestion/pipeline-phases/spring-aop.js +439 -0
  383. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +34 -0
  384. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +255 -0
  385. package/dist/core/ingestion/pipeline-phases/types.d.ts +7 -0
  386. package/dist/core/ingestion/pipeline.d.ts +26 -2
  387. package/dist/core/ingestion/pipeline.js +60 -11
  388. package/dist/core/ingestion/process-processor.d.ts +109 -2
  389. package/dist/core/ingestion/process-processor.js +464 -52
  390. package/dist/core/ingestion/resolve-references.d.ts +6 -1
  391. package/dist/core/ingestion/resolve-references.js +66 -6
  392. package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +8 -2
  393. package/dist/core/ingestion/route-extractors/constant-resolver.js +11 -7
  394. package/dist/core/ingestion/route-extractors/data-route-table.d.ts +40 -0
  395. package/dist/core/ingestion/route-extractors/data-route-table.js +876 -0
  396. package/dist/core/ingestion/route-extractors/dispatch-guard.d.ts +96 -0
  397. package/dist/core/ingestion/route-extractors/dispatch-guard.js +1184 -0
  398. package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +114 -0
  399. package/dist/core/ingestion/route-extractors/java-const-resolver.js +569 -0
  400. package/dist/core/ingestion/route-extractors/js-const-resolver.d.ts +192 -0
  401. package/dist/core/ingestion/route-extractors/js-const-resolver.js +1033 -0
  402. package/dist/core/ingestion/route-extractors/nest.d.ts +53 -0
  403. package/dist/core/ingestion/route-extractors/nest.js +523 -0
  404. package/dist/core/ingestion/route-extractors/spring-shared.d.ts +11 -0
  405. package/dist/core/ingestion/route-extractors/spring-shared.js +89 -0
  406. package/dist/core/ingestion/route-extractors/spring.js +214 -29
  407. package/dist/core/ingestion/scope-extractor-bridge.js +9 -1
  408. package/dist/core/ingestion/scope-extractor.d.ts +22 -7
  409. package/dist/core/ingestion/scope-extractor.js +311 -16
  410. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +311 -21
  411. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +16 -5
  412. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +12 -0
  413. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +47 -0
  414. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +20 -15
  415. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +280 -42
  416. package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.d.ts +123 -0
  417. package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +171 -17
  418. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.d.ts +58 -1
  419. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +137 -34
  420. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +30 -1
  421. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +39 -1
  422. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +18 -1
  423. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +113 -18
  424. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +107 -5
  425. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +590 -33
  426. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +3 -0
  427. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +101 -41
  428. package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.d.ts +34 -0
  429. package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.js +62 -0
  430. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +5 -1
  431. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +8 -1
  432. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +105 -5
  433. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +931 -92
  434. package/dist/core/ingestion/scope-resolution/passes/return-shape-members.d.ts +58 -0
  435. package/dist/core/ingestion/scope-resolution/passes/return-shape-members.js +458 -0
  436. package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.d.ts +180 -0
  437. package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.js +418 -0
  438. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +29 -0
  439. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +57 -0
  440. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +55 -1
  441. package/dist/core/ingestion/scope-resolution/pipeline/run.js +241 -19
  442. package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +112 -2
  443. package/dist/core/ingestion/scope-resolution/resolution-outcome.js +38 -1
  444. package/dist/core/ingestion/scope-resolution/scope/namespace-targets.d.ts +25 -3
  445. package/dist/core/ingestion/scope-resolution/scope/namespace-targets.js +36 -16
  446. package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +210 -9
  447. package/dist/core/ingestion/scope-resolution/scope/walkers.js +905 -22
  448. package/dist/core/ingestion/scope-resolution/summary-maps.d.ts +28 -0
  449. package/dist/core/ingestion/scope-resolution/summary-maps.js +50 -0
  450. package/dist/core/ingestion/scope-resolution/undecided-satisfaction.d.ts +55 -0
  451. package/dist/core/ingestion/scope-resolution/undecided-satisfaction.js +37 -0
  452. package/dist/core/ingestion/scope-resolution/unresolved-receivers.d.ts +109 -0
  453. package/dist/core/ingestion/scope-resolution/unresolved-receivers.js +204 -0
  454. package/dist/core/ingestion/scope-resolution/utils/definition-id.d.ts +13 -0
  455. package/dist/core/ingestion/scope-resolution/utils/definition-id.js +19 -0
  456. package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.d.ts +171 -0
  457. package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.js +218 -0
  458. package/dist/core/ingestion/scope-resolution/workspace-index-types.d.ts +34 -0
  459. package/dist/core/ingestion/scope-resolution/workspace-index-types.js +15 -0
  460. package/dist/core/ingestion/scope-resolution/workspace-index.d.ts +7 -20
  461. package/dist/core/ingestion/tree-sitter-queries.d.ts +11 -11
  462. package/dist/core/ingestion/tree-sitter-queries.js +678 -4
  463. package/dist/core/ingestion/type-env.js +11 -7
  464. package/dist/core/ingestion/type-extractors/jvm.js +2 -2
  465. package/dist/core/ingestion/type-extractors/shared.d.ts +17 -0
  466. package/dist/core/ingestion/type-extractors/shared.js +16 -0
  467. package/dist/core/ingestion/type-extractors/types.d.ts +12 -0
  468. package/dist/core/ingestion/type-extractors/typescript.d.ts +20 -0
  469. package/dist/core/ingestion/type-extractors/typescript.js +26 -0
  470. package/dist/core/ingestion/utils/ast-helpers.d.ts +322 -16
  471. package/dist/core/ingestion/utils/ast-helpers.js +727 -150
  472. package/dist/core/ingestion/utils/call-analysis.d.ts +27 -22
  473. package/dist/core/ingestion/utils/call-analysis.js +202 -7
  474. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +59 -0
  475. package/dist/core/ingestion/utils/callable-flow-captures.js +51 -1
  476. package/dist/core/ingestion/utils/callable-labels.d.ts +25 -0
  477. package/dist/core/ingestion/utils/callable-labels.js +31 -0
  478. package/dist/core/ingestion/utils/effective-ram.d.ts +40 -0
  479. package/dist/core/ingestion/utils/effective-ram.js +58 -0
  480. package/dist/core/ingestion/utils/line-base.d.ts +14 -0
  481. package/dist/core/ingestion/utils/line-base.js +14 -0
  482. package/dist/core/ingestion/utils/method-props.d.ts +27 -4
  483. package/dist/core/ingestion/utils/method-props.js +29 -4
  484. package/dist/core/ingestion/utils/receiver-chain-captures.d.ts +31 -0
  485. package/dist/core/ingestion/utils/receiver-chain-captures.js +57 -0
  486. package/dist/core/ingestion/utils/receiver-chain-codec.d.ts +89 -0
  487. package/dist/core/ingestion/utils/receiver-chain-codec.js +182 -0
  488. package/dist/core/ingestion/utils/scope-tree-walk.d.ts +22 -0
  489. package/dist/core/ingestion/utils/scope-tree-walk.js +33 -0
  490. package/dist/core/ingestion/utils/template-arguments.d.ts +96 -0
  491. package/dist/core/ingestion/utils/template-arguments.js +196 -0
  492. package/dist/core/ingestion/utils/type-parameters.d.ts +49 -0
  493. package/dist/core/ingestion/utils/type-parameters.js +206 -0
  494. package/dist/core/ingestion/workers/callable-id.d.ts +80 -0
  495. package/dist/core/ingestion/workers/callable-id.js +125 -0
  496. package/dist/core/ingestion/workers/parse-worker.d.ts +14 -1
  497. package/dist/core/ingestion/workers/parse-worker.js +493 -54
  498. package/dist/core/ingestion/workers/worker-pool.d.ts +20 -27
  499. package/dist/core/ingestion/workers/worker-pool.js +91 -3
  500. package/dist/core/lbug/csv-generator.d.ts +27 -0
  501. package/dist/core/lbug/csv-generator.js +72 -17
  502. package/dist/core/lbug/extension-load-error.js +13 -2
  503. package/dist/core/lbug/extension-loader.d.ts +29 -0
  504. package/dist/core/lbug/extension-loader.js +31 -6
  505. package/dist/core/lbug/graph-emit-sink.d.ts +264 -0
  506. package/dist/core/lbug/graph-emit-sink.js +581 -0
  507. package/dist/core/lbug/lbug-adapter.d.ts +290 -11
  508. package/dist/core/lbug/lbug-adapter.js +652 -69
  509. package/dist/core/lbug/native-check.d.ts +21 -0
  510. package/dist/core/lbug/native-check.js +248 -32
  511. package/dist/core/lbug/pdg-emit-sink.d.ts +13 -4
  512. package/dist/core/lbug/pdg-emit-sink.js +21 -111
  513. package/dist/core/lbug/pool-adapter.d.ts +9 -0
  514. package/dist/core/lbug/pool-adapter.js +164 -14
  515. package/dist/core/lbug/query-batch.d.ts +75 -0
  516. package/dist/core/lbug/query-batch.js +102 -0
  517. package/dist/core/lbug/rel-pair-routing.d.ts +160 -2
  518. package/dist/core/lbug/rel-pair-routing.js +228 -10
  519. package/dist/core/lbug/schema.d.ts +163 -4
  520. package/dist/core/lbug/schema.js +404 -159
  521. package/dist/core/lbug/sync-csv-writer.d.ts +47 -0
  522. package/dist/core/lbug/sync-csv-writer.js +108 -0
  523. package/dist/core/run-analyze.d.ts +147 -0
  524. package/dist/core/run-analyze.js +1215 -179
  525. package/dist/core/search/bm25-index.d.ts +11 -0
  526. package/dist/core/search/bm25-index.js +60 -26
  527. package/dist/core/search/fts-indexes.d.ts +150 -9
  528. package/dist/core/search/fts-indexes.js +241 -23
  529. package/dist/core/wiki/graph-queries.js +145 -112
  530. package/dist/core/wiki/llm-client.d.ts +29 -3
  531. package/dist/core/wiki/llm-client.js +47 -12
  532. package/dist/core/wiki/prompts.d.ts +19 -0
  533. package/dist/core/wiki/prompts.js +20 -1
  534. package/dist/lib/utils.d.ts +113 -0
  535. package/dist/lib/utils.js +185 -0
  536. package/dist/mcp/local/aop-metadata.d.ts +77 -0
  537. package/dist/mcp/local/aop-metadata.js +227 -0
  538. package/dist/mcp/local/bean-metadata.d.ts +2 -1
  539. package/dist/mcp/local/bean-metadata.js +22 -1
  540. package/dist/mcp/local/convex-metadata.d.ts +8 -0
  541. package/dist/mcp/local/convex-metadata.js +45 -0
  542. package/dist/mcp/local/local-backend.d.ts +174 -11
  543. package/dist/mcp/local/local-backend.js +1678 -331
  544. package/dist/mcp/local/path-predicate.d.ts +19 -0
  545. package/dist/mcp/local/path-predicate.js +21 -0
  546. package/dist/mcp/local/pdg-impact.d.ts +132 -10
  547. package/dist/mcp/local/pdg-impact.js +391 -98
  548. package/dist/mcp/repository-policy.d.ts +1 -0
  549. package/dist/mcp/repository-policy.js +5 -0
  550. package/dist/mcp/resources.js +26 -4
  551. package/dist/mcp/server.js +23 -13
  552. package/dist/mcp/tools.d.ts +8 -0
  553. package/dist/mcp/tools.js +76 -23
  554. package/dist/server/analyze-job.d.ts +37 -2
  555. package/dist/server/analyze-job.js +13 -2
  556. package/dist/server/analyze-launch.d.ts +1 -1
  557. package/dist/server/analyze-launch.js +79 -10
  558. package/dist/server/analyze-worker-core.d.ts +1 -1
  559. package/dist/server/analyze-worker-core.js +10 -1
  560. package/dist/server/analyze-worker-ipc.d.ts +1 -1
  561. package/dist/server/analyze-worker-ipc.js +4 -0
  562. package/dist/server/analyze-worker-protocol.d.ts +59 -0
  563. package/dist/server/analyze-worker-protocol.js +1 -0
  564. package/dist/server/analyze-worker.d.ts +1 -17
  565. package/dist/server/api.d.ts +2 -11
  566. package/dist/server/api.js +164 -163
  567. package/dist/server/embed-run-outcome.d.ts +89 -0
  568. package/dist/server/embed-run-outcome.js +88 -0
  569. package/dist/server/git-clone.js +6 -2
  570. package/dist/server/middleware.d.ts +116 -9
  571. package/dist/server/middleware.js +291 -22
  572. package/dist/server/sse-progress.d.ts +41 -0
  573. package/dist/server/sse-progress.js +125 -0
  574. package/dist/storage/branch-index.d.ts +11 -6
  575. package/dist/storage/branch-index.js +15 -7
  576. package/dist/storage/file-hash.js +2 -2
  577. package/dist/storage/fs-atomic.d.ts +25 -0
  578. package/dist/storage/fs-atomic.js +42 -0
  579. package/dist/storage/git.d.ts +131 -0
  580. package/dist/storage/git.js +236 -2
  581. package/dist/storage/index-lock.d.ts +102 -0
  582. package/dist/storage/index-lock.js +660 -0
  583. package/dist/storage/parse-cache.js +588 -3
  584. package/dist/storage/parsedfile-store.js +76 -6
  585. package/dist/storage/repo-manager.d.ts +54 -435
  586. package/dist/storage/repo-manager.js +312 -215
  587. package/dist/storage/repo-meta.d.ts +530 -0
  588. package/dist/storage/repo-meta.js +100 -0
  589. package/dist/types/pipeline.d.ts +37 -0
  590. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +1 -1
  591. package/hooks/claude/gitnexus-hook.cjs +1 -1
  592. package/hooks/claude/resolve-analyze-cmd.cjs +80 -13
  593. package/package.json +11 -2
  594. package/scripts/cross-platform-shard.ts +153 -0
  595. package/scripts/cross-platform-tests.ts +122 -0
  596. package/scripts/run-cross-platform.ts +16 -5
  597. package/skills/gitnexus-cli.md +3 -3
  598. package/skills/gitnexus-debugging.md +37 -7
  599. package/skills/gitnexus-exploring.md +26 -4
  600. package/skills/gitnexus-impact-analysis.md +71 -10
  601. package/skills/gitnexus-plan/README.md +11 -6
  602. package/skills/gitnexus-plan/references/evidence-provenance.md +49 -12
  603. package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +654 -372
  604. package/skills/gitnexus-refactoring.md +48 -5
  605. package/skills/gitnexus-review/SKILL.md +12 -6
  606. package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +1 -1
  607. package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +1 -1
  608. package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +1 -1
  609. package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +1 -1
  610. package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +1 -1
  611. package/skills/gitnexus-review/ci-personas/ci-security-lens.md +1 -1
  612. package/skills/gitnexus-taint-analysis.md +13 -7
  613. package/skills/gitnexus-work/SKILL.md +4 -1
  614. package/skills/gitnexus-work/references/evidence-provenance.md +49 -12
  615. package/skills/gitnexus-work/scripts/evidence-provenance.mjs +654 -372
  616. package/vendor/leiden/utils.cjs +28 -1
  617. package/web/assets/ProcessFlowModal-Badh2Pbg.js +24 -0
  618. package/web/assets/{__vite-browser-external-bMKyYQkO.js → __vite-browser-external-COxE8F0G.js} +1 -1
  619. package/web/assets/abnfDiagram-QNN2D4NM-Cq2djWWe.js +1 -0
  620. package/web/assets/agent-Dr4l5EOp.js +662 -0
  621. package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +1 -0
  622. package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +36 -0
  623. package/web/assets/{blockDiagram-7IZFK4PR-DBefcjof.js → blockDiagram-54WLDVWM-Dg_hrRWE.js} +4 -4
  624. package/web/assets/{c4Diagram-Y2BXMSZH-EjWnjEJl.js → c4Diagram-X2LASM7V-CnhoT4aV.js} +2 -2
  625. package/web/assets/chunk-224SPVON-B8gxtXpy.js +1 -0
  626. package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +127 -0
  627. package/web/assets/chunk-2SREHG4O-Dip42xOq.js +1 -0
  628. package/web/assets/chunk-4RFN2BYJ-DHHWuC-n.js +1 -0
  629. package/web/assets/chunk-66DQ2XMT-CM0xjFAN.js +1 -0
  630. package/web/assets/chunk-6BELYETK-ChsYtfHW.js +1 -0
  631. package/web/assets/{chunk-LII3EMHJ-BL6lKJ_P.js → chunk-6L755F7B-CMhLBxi2.js} +1 -1
  632. package/web/assets/{chunk-QA3QBVWF-DVXPOIxe.js → chunk-7CWYLC5S-DRgGkkpF.js} +1 -1
  633. package/web/assets/{chunk-ZXARS5L4-C3v-4Fsw.js → chunk-A7VWPJGB-B4O3oQdQ.js} +1 -1
  634. package/web/assets/chunk-BI6VK774-D0oaWk8V.js +1 -0
  635. package/web/assets/chunk-D6VWDJW2-BxcBdZ9c.js +2 -0
  636. package/web/assets/chunk-DMV4VAQV-Bn6WXDSX.js +4 -0
  637. package/web/assets/chunk-E5QJAATJ-dh-5CtIV.js +2 -0
  638. package/web/assets/chunk-EQFTRU2I-1ix7TzW9.js +2 -0
  639. package/web/assets/chunk-FWYVLQTC-BgDItRzJ.js +1 -0
  640. package/web/assets/chunk-HNC4WDU7-DoU3KnA7.js +1 -0
  641. package/web/assets/chunk-L5GCOVLC-CE2w8Nm_.js +161 -0
  642. package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +321 -0
  643. package/web/assets/chunk-LORZLZWG-B57uGw2N.js +88 -0
  644. package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +62 -0
  645. package/web/assets/chunk-NV3KIAZN-5yvcpMiu.js +1 -0
  646. package/web/assets/chunk-OIYT25JQ-CQ6KOZGX.js +1 -0
  647. package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +10 -0
  648. package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +156 -0
  649. package/web/assets/chunk-RRFMTAIC-CMN0wcYA.js +1 -0
  650. package/web/assets/{chunk-RLI5ZMPA-CkXZ0y0U.js → chunk-SATU7PGQ-B1zhgOvc.js} +1 -1
  651. package/web/assets/chunk-STOV2HOB-GnExfzIX.js +1 -0
  652. package/web/assets/{chunk-INKRHTLW-Ckl3_KkO.js → chunk-SZD42YQK-ijyKKVr1.js} +21 -21
  653. package/web/assets/{chunk-LCXTWHL2-C162wE5z.js → chunk-TFPGFQPA-Dj6a-0pC.js} +3 -3
  654. package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +2 -0
  655. package/web/assets/chunk-TZUXEDM2-B7p9AcTw.js +1 -0
  656. package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +1 -0
  657. package/web/assets/{chunk-6764PJDD-C7xxk063.js → chunk-VE5CLXGZ-C1vB7wpY.js} +1 -1
  658. package/web/assets/{chunk-RG4AUYOV-ZNgyLFq6.js → chunk-VJFVEZTB-CX66F2ep.js} +3 -3
  659. package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +1 -0
  660. package/web/assets/chunk-WJBAP47W-BckNkuEN.js +1 -0
  661. package/web/assets/chunk-XNMVGMAZ-Cg_LnPtj.js +1 -0
  662. package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +1 -0
  663. package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +1 -0
  664. package/web/assets/{cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js → cose-bilkent-RZA4XIPR-BHpK4Crp.js} +1 -1
  665. package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +1 -0
  666. package/web/assets/cynefinDiagram-TR7LZUCG-C3Iar9lZ.js +62 -0
  667. package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +4 -0
  668. package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +30 -0
  669. package/web/assets/diagram-JCD7PQ7C-DC5-9FRr.js +24 -0
  670. package/web/assets/{diagram-HNR7UZ2L-DVRltWbL.js → diagram-KFBZAVDW-Dfmf_4ti.js} +3 -3
  671. package/web/assets/diagram-L7DVE3PN-GIRyVUtt.js +41 -0
  672. package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +24 -0
  673. package/web/assets/ebnfDiagram-DRHRQJWO-D8_CI4ZF.js +1 -0
  674. package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +85 -0
  675. package/web/assets/error-D9MtuG9s.js +1 -0
  676. package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +1 -0
  677. package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +1 -0
  678. package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +292 -0
  679. package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +1 -0
  680. package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +106 -0
  681. package/web/assets/{index-D7mTFcvQ.js → index-2zdvEdzg.js} +51 -51
  682. package/web/assets/index-CJDpyH-n.css +2 -0
  683. package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +1 -0
  684. package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +2 -0
  685. package/web/assets/{ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js → ishikawaDiagram-4JDSWWDM-DmqWtjkl.js} +2 -2
  686. package/web/assets/{journeyDiagram-M6C3CM3L-C6wjooas.js → journeyDiagram-QUS3FAKT-XAzVzrQW.js} +3 -3
  687. package/web/assets/{kanban-definition-75IXJCU3-5_UVY79g.js → kanban-definition-D4L7SQKK-YurRnmYn.js} +6 -6
  688. package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +257 -0
  689. package/web/assets/{mindmap-definition-2TDM6QVE-8xDLzk2e.js → mindmap-definition-66QP5TD6-ChrWWnil.js} +5 -5
  690. package/web/assets/node.browser-U-KyT5AW.js +1 -0
  691. package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +1 -0
  692. package/web/assets/pegDiagram-YKIO5C6U-QGeQLEq2.js +1 -0
  693. package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +1 -0
  694. package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +39 -0
  695. package/web/assets/{quadrantDiagram-VICAPDV7-DR54jOeR.js → quadrantDiagram-VO5QLCXA-B7098wSc.js} +3 -3
  696. package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +1 -0
  697. package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +1 -0
  698. package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +1 -0
  699. package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +1 -0
  700. package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +1 -0
  701. package/web/assets/railroadDiagram-M77LTMSB-AXu4vxk_.js +1 -0
  702. package/web/assets/{requirementDiagram-JXO7QTGE-PEkg7sKC.js → requirementDiagram-RASO5HTO-B-l8InpK.js} +4 -4
  703. package/web/assets/{sankeyDiagram-URQDO5SZ-DDWEtjcs.js → sankeyDiagram-F32LOJ6L-Kd7zjJgX.js} +3 -3
  704. package/web/assets/{sequenceDiagram-VS2MUI6T-Bv-uwANx.js → sequenceDiagram-URATNSBD-BlcdY9DS.js} +7 -7
  705. package/web/assets/sizeCapture-5GORAGP4-BEqQzsxs.js +1 -0
  706. package/web/assets/src-C5sx_gMp.js +1 -0
  707. package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +1 -0
  708. package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +1 -0
  709. package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +2 -0
  710. package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +8 -0
  711. package/web/assets/{timeline-definition-O6YCAMPW-Qmsuo7qS.js → timeline-definition-WJXWRH4I-DUfp1R3E.js} +3 -3
  712. package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +1 -0
  713. package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +1 -0
  714. package/web/assets/vennDiagram-K3VCMQLI-Bj-FN-XS.js +34 -0
  715. package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +1 -0
  716. package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +78 -0
  717. package/web/assets/xychartDiagram-5VRUVLCW-CK_rbSWE.js +7 -0
  718. package/web/index.html +16 -15
  719. package/dist/core/ingestion/languages/python/index-stats.d.ts +0 -18
  720. package/dist/core/ingestion/languages/python/index-stats.js +0 -25
  721. package/web/assets/ProcessFlowModal-CwkpVkv-.js +0 -22
  722. package/web/assets/agent-Ds-lkZjX.js +0 -626
  723. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +0 -1
  724. package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +0 -36
  725. package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +0 -4
  726. package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +0 -1
  727. package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +0 -321
  728. package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +0 -159
  729. package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +0 -124
  730. package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +0 -10
  731. package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +0 -1
  732. package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +0 -1
  733. package/web/assets/chunk-J5EP6P6S-L19oz55R.js +0 -1
  734. package/web/assets/chunk-KGFNY3KK-BZeP-55u.js +0 -62
  735. package/web/assets/chunk-KGYTTC2M-zm6n242I.js +0 -1
  736. package/web/assets/chunk-KNLZD3CH-BGlP6X9R.js +0 -1
  737. package/web/assets/chunk-LRIF4GLE-n59lhprL.js +0 -1
  738. package/web/assets/chunk-RERM46MO-B5dAdWpP.js +0 -1
  739. package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +0 -1
  740. package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +0 -1
  741. package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +0 -1
  742. package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +0 -1
  743. package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +0 -1
  744. package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +0 -2
  745. package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +0 -1
  746. package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +0 -1
  747. package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +0 -4
  748. package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +0 -43
  749. package/web/assets/diagram-GF46GFSD-B2atbzmU.js +0 -24
  750. package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +0 -24
  751. package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +0 -10
  752. package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +0 -85
  753. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +0 -1
  754. package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +0 -162
  755. package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +0 -292
  756. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +0 -1
  757. package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +0 -106
  758. package/web/assets/index-CX_fADmQ.css +0 -2
  759. package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +0 -1
  760. package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +0 -2
  761. package/web/assets/katex-K3KEBU37-qRQBy-EZ.js +0 -261
  762. package/web/assets/node-Ct_zna8U.js +0 -8
  763. package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +0 -1
  764. package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +0 -1
  765. package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +0 -30
  766. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +0 -1
  767. package/web/assets/sdk-CzHHH8tD.js +0 -37
  768. package/web/assets/src-Cv1eWg0o.js +0 -1
  769. package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +0 -1
  770. package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +0 -1
  771. package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +0 -1
  772. package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +0 -1
  773. package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +0 -34
  774. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +0 -1
  775. package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +0 -78
  776. package/web/assets/xychartDiagram-N2JHSOCM-CoZ_Tits.js +0 -7
  777. /package/web/assets/{chunk-7W6UQGC5-pyKGssV3.js → chunk-LIEV3EAG-pyKGssV3.js} +0 -0
@@ -0,0 +1,1033 @@
1
+ /**
2
+ * JavaScript/TypeScript binding for the language-agnostic constant resolver.
3
+ *
4
+ * Supplies the two JS-specific pieces the shared fold in `constant-resolver.ts`
5
+ * needs — {@link resolveJsImport} (import specifier → file key, honoring
6
+ * relative paths, extensionless imports, directory `index` files and bare
7
+ * alias-style specifiers) and {@link extractJsModuleFacts} (tree →
8
+ * {@link ModuleConstants} plus the export/HTTP-client facts below) — mirroring
9
+ * how `python-const-resolver.ts` binds the same core for Python (#2391).
10
+ *
11
+ * Two JS-shaped facts the Python binding has no analogue for:
12
+ *
13
+ * 1. **Object-literal path tables.** Python route constants are module-level
14
+ * scalars (`API_V1 = "/v1"`); the JS convention is one frozen table —
15
+ * `export const API_ROUTE_PATH = { LINKS: "/links", … } as const` — read at
16
+ * the call site as `API_ROUTE_PATH.LINKS`. The extractor flattens such a
17
+ * table into DOTTED literal keys (`API_ROUTE_PATH.LINKS` → `/links`) so the
18
+ * agnostic fold, which does a plain `literals.get(name)`, resolves a member
19
+ * reference with no changes to the core.
20
+ *
21
+ * 2. **Export aliasing.** `export default routeApiClient` and
22
+ * `export { a as b }` mean the name an importer writes is often not the
23
+ * name the defining file bound. {@link JsModuleFacts.exports} maps the
24
+ * EXPORTED name (including `default`) to the local one so a cross-file
25
+ * chase lands on the right binding.
26
+ *
27
+ * Both stay in this binding — the shared core keeps knowing nothing about any
28
+ * language.
29
+ *
30
+ * Keying matches the Python binding: the repo map is keyed by unique POSIX file
31
+ * path, and an import that cannot be pinned to exactly one file resolves to
32
+ * `null` (skip) rather than an arbitrary winner. An unresolved path is a
33
+ * missing contract; a wrongly-resolved one is a false cross-repo link, which is
34
+ * strictly worse.
35
+ */
36
+ import { MAX_FOLD_LENGTH, resolveConstant as foldConstant, } from './constant-resolver.js';
37
+ /** Extensions an extensionless JS/TS import may resolve to, in resolution order. */
38
+ const JS_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.mts', '.cts'];
39
+ /**
40
+ * Bound on the re-export chase in {@link resolveJsMemberPath}. Mirrors the
41
+ * fold's own `MAX_RESOLVE_DEPTH`: a barrel that re-exports through more hops
42
+ * than this floors to `null` (skip), never to a guess.
43
+ */
44
+ const MAX_REEXPORT_HOPS = 8;
45
+ /** The synthetic local name a bare `export default <expr>` binds to. */
46
+ const DEFAULT_LOCAL = '__default__';
47
+ function buildBasenameIndex(repoKeys) {
48
+ const index = new Map();
49
+ for (const key of repoKeys) {
50
+ const base = key.slice(key.lastIndexOf('/') + 1);
51
+ const bucket = index.get(base);
52
+ if (bucket)
53
+ bucket.push(key);
54
+ else
55
+ index.set(base, [key]);
56
+ }
57
+ return index;
58
+ }
59
+ /** Build the {@link JsRepoFacts} projections from per-file facts. */
60
+ export function buildJsRepoFacts(byFile) {
61
+ const constants = new Map();
62
+ for (const [key, value] of byFile)
63
+ constants.set(key, value.constants);
64
+ const keys = new Set(byFile.keys());
65
+ const index = buildBasenameIndex(keys);
66
+ const memo = new Map();
67
+ const resolveImport = (importingFileKey, moduleSpec, repoKeys) => {
68
+ // Only the relative arm reads `importingFileKey`, but keying on both is a
69
+ // string concat and keeps the memo correct if that ever stops being true.
70
+ //
71
+ // `repoKeys` is deliberately NOT part of the key: every caller inside this
72
+ // module passes `facts.keys`, which is fixed for the lifetime of these
73
+ // facts and is the set `index` was built from. A caller passing a different
74
+ // set would get an answer computed against `facts.keys` — so don't.
75
+ const memoKey = `${importingFileKey}\u0000${moduleSpec}`;
76
+ const cached = memo.get(memoKey);
77
+ if (cached !== undefined)
78
+ return cached;
79
+ const resolved = resolveImportWith(index, importingFileKey, moduleSpec, repoKeys);
80
+ memo.set(memoKey, resolved);
81
+ return resolved;
82
+ };
83
+ return { byFile, constants, keys, resolveImport };
84
+ }
85
+ function dirOf(fileKey) {
86
+ const slash = fileKey.lastIndexOf('/');
87
+ return slash >= 0 ? fileKey.slice(0, slash) : '';
88
+ }
89
+ /** Collapse `a/b/../c` and `./` segments in a POSIX-ish path. */
90
+ function normalizePosix(path) {
91
+ const out = [];
92
+ for (const seg of path.split('/')) {
93
+ if (seg === '' || seg === '.')
94
+ continue;
95
+ if (seg === '..') {
96
+ if (out.length > 0 && out[out.length - 1] !== '..')
97
+ out.pop();
98
+ else
99
+ out.push('..');
100
+ }
101
+ else {
102
+ out.push(seg);
103
+ }
104
+ }
105
+ return out.join('/');
106
+ }
107
+ /**
108
+ * Candidate file keys for a module path with no extension: the path itself
109
+ * (already-suffixed imports), each known extension, and the directory-`index`
110
+ * forms. Order matters only for the relative case, where the first existing
111
+ * candidate wins — matching bundler/`tsc` resolution order closely enough that
112
+ * a repo with both `x.ts` and `x.js` picks the TypeScript source.
113
+ */
114
+ function candidatesFor(modPath) {
115
+ const out = [modPath];
116
+ for (const ext of JS_EXTENSIONS)
117
+ out.push(`${modPath}${ext}`);
118
+ for (const ext of JS_EXTENSIONS)
119
+ out.push(`${modPath}/index${ext}`);
120
+ return out;
121
+ }
122
+ /**
123
+ * The MODULE a repo key denotes: the key without its extension, and without a
124
+ * trailing `/index`.
125
+ *
126
+ * `x/routes.ts` and `x/routes/index.ts` are two spellings of the same module
127
+ * `x/routes` — Node and `tsc` both pick the file over the directory, so a tail
128
+ * matching both is not ambiguous, it just has a precedence order. Two
129
+ * DIFFERENT identities sharing one tail is the real ambiguity, and that is what
130
+ * {@link resolveImportWith} refuses.
131
+ */
132
+ function moduleIdentityOf(key) {
133
+ for (const ext of JS_EXTENSIONS) {
134
+ if (!key.endsWith(ext))
135
+ continue;
136
+ const withoutExt = key.slice(0, -ext.length);
137
+ return withoutExt.endsWith('/index') ? withoutExt.slice(0, -'/index'.length) : withoutExt;
138
+ }
139
+ return key;
140
+ }
141
+ /**
142
+ * The JS/TS {@link ImportResolver}.
143
+ *
144
+ * Relative specifiers (`./api-routes`, `../shared/api-routes`) resolve against
145
+ * the importing file's directory and must hit an existing key exactly.
146
+ *
147
+ * An alias-style specifier (`@/api-modules/shared/api-routes`, `~/x/y`) or a
148
+ * multi-segment bare one is matched by UNIQUE PATH SUFFIX, the same strategy
149
+ * the Python binding uses for absolute imports. This deliberately resolves
150
+ * aliases without reading `tsconfig.json`: an alias prefix is arbitrary (`@/`,
151
+ * `~/`, `#app/`, any `paths` key), but the segments AFTER it are a real path
152
+ * tail, and matching that tail against the indexed file set answers the
153
+ * question directly.
154
+ *
155
+ * Two rules keep that from inventing resolutions:
156
+ *
157
+ * - **A tail claimed by two distinct modules returns `null`**, checked across
158
+ * EVERY candidate extension rather than within one. Returning on the first
159
+ * extension that matched let precedence pre-empt the guard, so a `.ts`/`.tsx`
160
+ * or `.ts`/`.js` collision — every Next.js repo — picked an arbitrary winner
161
+ * while this docstring promised a skip.
162
+ * - **A single-segment bare specifier never matches a repo file.** `axios`,
163
+ * `lodash` and the Node builtin `http` are npm/runtime modules, not ours to
164
+ * resolve; without this, a repo holding `src/lib/http.ts` "proved" that
165
+ * `import http from 'http'` was an axios client. An alias tail always has a
166
+ * sigil or a `/`, so this costs the feature nothing.
167
+ */
168
+ function resolveImportWith(index, importingFileKey, moduleSpec, repoKeys) {
169
+ if (moduleSpec === '')
170
+ return null;
171
+ if (moduleSpec.startsWith('./') || moduleSpec.startsWith('../')) {
172
+ const base = dirOf(importingFileKey);
173
+ const joined = normalizePosix(`${base}/${moduleSpec}`);
174
+ // A `../` chain that climbs above the repo root leaves a leading `..`
175
+ // segment; that import escapes the indexed tree and cannot be pinned.
176
+ if (joined === '' || joined.startsWith('..'))
177
+ return null;
178
+ for (const candidate of candidatesFor(joined)) {
179
+ if (repoKeys.has(candidate))
180
+ return candidate;
181
+ }
182
+ return null;
183
+ }
184
+ // Strip a leading alias sigil so `@/a/b` and `~/a/b` reduce to the tail
185
+ // `a/b`. A scoped package (`@scope/pkg`) keeps its `@` and simply fails to
186
+ // match any repo file below, which is the desired outcome.
187
+ const aliased = /^[@~#]\//.test(moduleSpec);
188
+ const tail = aliased ? moduleSpec.slice(2) : moduleSpec;
189
+ if (tail === '' || tail.startsWith('.'))
190
+ return null;
191
+ if (!aliased && !tail.includes('/'))
192
+ return null; // bare npm package / Node builtin
193
+ let winner = null;
194
+ let winnerRank = Number.POSITIVE_INFINITY;
195
+ let identity = null;
196
+ const candidates = candidatesFor(tail);
197
+ for (let rank = 0; rank < candidates.length; rank++) {
198
+ const candidate = candidates[rank];
199
+ const bucket = index.get(candidate.slice(candidate.lastIndexOf('/') + 1));
200
+ if (bucket === undefined)
201
+ continue;
202
+ for (const key of bucket) {
203
+ if (key !== candidate && !key.endsWith(`/${candidate}`))
204
+ continue;
205
+ const keyIdentity = moduleIdentityOf(key);
206
+ if (identity === null)
207
+ identity = keyIdentity;
208
+ else if (identity !== keyIdentity)
209
+ return null; // two modules share this tail
210
+ if (rank < winnerRank) {
211
+ winner = key;
212
+ winnerRank = rank;
213
+ }
214
+ }
215
+ }
216
+ return winner;
217
+ }
218
+ /**
219
+ * Standalone {@link ImportResolver} — the same rules as {@link resolveImportWith}
220
+ * with the basename index built on the spot.
221
+ *
222
+ * Production goes through `JsRepoFacts.resolveImport`, which holds one index
223
+ * for the whole repo and memoizes; this export exists so the resolution rules
224
+ * can be exercised directly against a key set.
225
+ */
226
+ export const resolveJsImport = (importingFileKey, moduleSpec, repoKeys) => resolveImportWith(buildBasenameIndex(repoKeys), importingFileKey, moduleSpec, repoKeys);
227
+ /** Unwrap TS `x as const` / `x satisfies T` to the underlying expression. */
228
+ function unwrapTsExpression(node) {
229
+ let cur = node;
230
+ while (cur.type === 'as_expression' || cur.type === 'satisfies_expression') {
231
+ const inner = cur.namedChild(0);
232
+ if (!inner)
233
+ break;
234
+ cur = inner;
235
+ }
236
+ return cur;
237
+ }
238
+ /**
239
+ * The literal string a node denotes, or `null` when it is not a plain literal.
240
+ * A template string counts only when it has no `${…}` substitution — an
241
+ * interpolated one is an expression, handled by {@link parseJsConstOperands}.
242
+ */
243
+ function literalStringOf(node) {
244
+ const n = unwrapTsExpression(node);
245
+ if (n.type === 'string') {
246
+ const fragments = n.namedChildren.filter((c) => c.type === 'string_fragment');
247
+ if (fragments.length === 0)
248
+ return n.namedChildren.length === 0 ? '' : null;
249
+ return fragments.map((f) => f.text).join('');
250
+ }
251
+ if (n.type === 'template_string') {
252
+ if (n.namedChildren.some((c) => c.type === 'template_substitution'))
253
+ return null;
254
+ const fragments = n.namedChildren.filter((c) => c.type === 'string_fragment');
255
+ return fragments.map((f) => f.text).join('');
256
+ }
257
+ return null;
258
+ }
259
+ /** The static key a property name node denotes (`FOO`, `'foo'`, `"foo"`). */
260
+ function staticKeyOf(node) {
261
+ if (node.type === 'property_identifier' || node.type === 'identifier')
262
+ return node.text;
263
+ if (node.type === 'string')
264
+ return literalStringOf(node);
265
+ return null;
266
+ }
267
+ /**
268
+ * Flatten an object literal into dotted `prefix.KEY` → literal entries.
269
+ * Nested objects recurse (`API.USERS.ME`); a computed key, a spread, or a
270
+ * non-string value is skipped — the table's other entries stay usable.
271
+ */
272
+ function flattenObjectLiteral(obj, prefix, into, depth = 0) {
273
+ if (depth > MAX_REEXPORT_HOPS)
274
+ return;
275
+ for (const pair of obj.namedChildren) {
276
+ if (pair.type !== 'pair')
277
+ continue;
278
+ const keyNode = pair.childForFieldName('key');
279
+ const valueNode = pair.childForFieldName('value');
280
+ if (!keyNode || !valueNode)
281
+ continue;
282
+ const key = staticKeyOf(keyNode);
283
+ if (key === null)
284
+ continue;
285
+ const value = unwrapTsExpression(valueNode);
286
+ const literal = literalStringOf(value);
287
+ if (literal !== null) {
288
+ into.set(`${prefix}.${key}`, literal);
289
+ }
290
+ else if (value.type === 'object') {
291
+ flattenObjectLiteral(value, `${prefix}.${key}`, into, depth + 1);
292
+ }
293
+ }
294
+ }
295
+ /**
296
+ * Parse a `+`-concatenation / template string into an operand list the shared
297
+ * fold can resolve, or `null` when a term is not a string literal or a
298
+ * resolvable name reference.
299
+ *
300
+ * Handles the two shapes a JS route path is built with:
301
+ * `BASE + "/users"` → [ref BASE, literal /users]
302
+ * `` `${BASE}/users/${id}` `` → [ref BASE, literal /users/, ref id]
303
+ *
304
+ * A member reference inside either (`${API_ROUTE_PATH.LISTS}`) becomes a
305
+ * dotted `ref`, which the flattened table above resolves directly.
306
+ */
307
+ export function parseJsConstOperands(node, depth = 0) {
308
+ if (depth > MAX_EXPR_DEPTH)
309
+ return null;
310
+ const n = unwrapTsExpression(node);
311
+ const literal = literalStringOf(n);
312
+ if (literal !== null)
313
+ return [{ kind: 'literal', value: literal }];
314
+ if (n.type === 'identifier')
315
+ return [{ kind: 'ref', name: n.text }];
316
+ if (n.type === 'member_expression') {
317
+ const dotted = dottedNameOf(n);
318
+ return dotted === null ? null : [{ kind: 'ref', name: dotted }];
319
+ }
320
+ if (n.type === 'binary_expression') {
321
+ const operator = n.childForFieldName('operator');
322
+ if (operator?.text !== '+')
323
+ return null;
324
+ const left = n.childForFieldName('left');
325
+ const right = n.childForFieldName('right');
326
+ if (!left || !right)
327
+ return null;
328
+ const l = parseJsConstOperands(left, depth + 1);
329
+ const r = parseJsConstOperands(right, depth + 1);
330
+ return l === null || r === null ? null : [...l, ...r];
331
+ }
332
+ if (n.type === 'template_string') {
333
+ const out = [];
334
+ for (const child of n.namedChildren) {
335
+ if (child.type === 'string_fragment') {
336
+ out.push({ kind: 'literal', value: child.text });
337
+ }
338
+ else if (child.type === 'template_substitution') {
339
+ const inner = child.namedChild(0);
340
+ if (!inner)
341
+ return null;
342
+ const parsed = parseJsConstOperands(inner, depth + 1);
343
+ if (parsed === null)
344
+ return null;
345
+ out.push(...parsed);
346
+ }
347
+ }
348
+ return out;
349
+ }
350
+ return null;
351
+ }
352
+ /**
353
+ * The dotted name a member expression denotes (`A.B.C`), or `null` for a
354
+ * computed / non-identifier chain (`A[key]`, `fn().B`) that has no stable
355
+ * textual key.
356
+ */
357
+ export function dottedNameOf(node) {
358
+ const parts = [];
359
+ let cur = node;
360
+ while (cur && cur.type === 'member_expression') {
361
+ const property = cur.childForFieldName('property');
362
+ if (!property || property.type !== 'property_identifier')
363
+ return null;
364
+ parts.unshift(property.text);
365
+ cur = cur.childForFieldName('object');
366
+ }
367
+ if (!cur || cur.type !== 'identifier')
368
+ return null;
369
+ parts.unshift(cur.text);
370
+ return parts.join('.');
371
+ }
372
+ /**
373
+ * How many wrapping calls {@link bindsAxiosClient} will look through. A factory
374
+ * is one hop (`setupInterceptors(axios.create())`); a couple more costs nothing
375
+ * and bounds the walk.
376
+ */
377
+ const MAX_CLIENT_WRAP_DEPTH = 4;
378
+ /** True when a node is `axios.create(...)`, allowing an aliased axios import. */
379
+ function isAxiosCreateCall(node, imports, axiosShadowed) {
380
+ if (node.type !== 'call_expression')
381
+ return false;
382
+ const fn = node.childForFieldName('function');
383
+ if (!fn || fn.type !== 'member_expression')
384
+ return false;
385
+ if (fn.childForFieldName('property')?.text !== 'create')
386
+ return false;
387
+ const object = fn.childForFieldName('object');
388
+ if (!object || object.type !== 'identifier')
389
+ return false;
390
+ // `import axios from 'axios'` is the overwhelming convention, but the local
391
+ // name is the importer's choice (`import ax from 'axios'`), so trust the
392
+ // module specifier over the spelling whenever the file declares one. The
393
+ // bare spelling is the fallback, and it is only evidence while the file has
394
+ // not bound that name to something else.
395
+ if (imports.get(object.text)?.module === 'axios')
396
+ return true;
397
+ return object.text === 'axios' && !axiosShadowed;
398
+ }
399
+ /** The module a `require('…')` initializer names, or `null` if it is not one. */
400
+ function requireSpecifierOf(node) {
401
+ const n = unwrapTsExpression(node);
402
+ if (n.type !== 'call_expression')
403
+ return null;
404
+ if (n.childForFieldName('function')?.text !== 'require')
405
+ return null;
406
+ const args = n.childForFieldName('arguments');
407
+ const first = args?.namedChild(0);
408
+ return first ? literalStringOf(first) : null;
409
+ }
410
+ /**
411
+ * Whether an initializer BINDS an axios instance — i.e. the instance is the
412
+ * VALUE of the binding, not merely present somewhere inside it.
413
+ *
414
+ * A direct `const api = axios.create(...)` is the textbook form, but the shape
415
+ * real applications ship is a factory that decorates the instance and hands it
416
+ * back:
417
+ *
418
+ * const routeApiClient = setupClientInterceptors({
419
+ * axiosInstance: axios.create({ baseURL: API_URL }),
420
+ * });
421
+ *
422
+ * Requiring the call to be the whole initializer would reject that — and it is
423
+ * the single binding every call site in such an app goes through. So a wrapping
424
+ * CALL whose result is bound counts, and the instance may be one of its
425
+ * arguments or a property of a directly-passed object literal.
426
+ *
427
+ * What does NOT count is the instance being an INGREDIENT of the bound value.
428
+ * The premise "an expression that builds an axios instance and binds the result
429
+ * is an HTTP client" is only true when the instance is the result; a plain
430
+ * subtree scan also admitted
431
+ *
432
+ * const registry = { http: axios.create(), version: 'v1' }; // object literal
433
+ * const client = MOCK ? memoryStore : axios.create(); // ternary branch
434
+ * new Map([['api', axios.create()]]); // constructor arg
435
+ * new LRUCache({ fetchMethod: axios.create().get }); // constructor arg
436
+ *
437
+ * and `.get`/`.delete` are the two most common non-HTTP method names in JS, so
438
+ * every one of those made an ordinary cache or registry an HTTP consumer. Those
439
+ * node types are simply not walked here.
440
+ *
441
+ * A nested function body is still skipped wherever it appears — a callback that
442
+ * builds its own client does not vouch for the outer name.
443
+ */
444
+ function bindsAxiosClient(node, imports, axiosShadowed, depth = 0) {
445
+ if (depth > MAX_CLIENT_WRAP_DEPTH)
446
+ return false;
447
+ const n = unwrapTsExpression(node);
448
+ if (isAxiosCreateCall(n, imports, axiosShadowed))
449
+ return true;
450
+ // Transparent wrappers around the value itself.
451
+ if (n.type === 'await_expression' ||
452
+ n.type === 'parenthesized_expression' ||
453
+ n.type === 'non_null_expression') {
454
+ const inner = n.namedChild(0);
455
+ return inner !== null && bindsAxiosClient(inner, imports, axiosShadowed, depth + 1);
456
+ }
457
+ if (n.type !== 'call_expression')
458
+ return false;
459
+ const args = n.childForFieldName('arguments');
460
+ if (!args)
461
+ return false;
462
+ for (const arg of args.namedChildren) {
463
+ if (argumentHoldsAxiosClient(arg, imports, axiosShadowed, depth + 1))
464
+ return true;
465
+ }
466
+ return false;
467
+ }
468
+ /**
469
+ * Whether a wrapping call's ARGUMENT carries the instance.
470
+ *
471
+ * Inside an argument the instance may sit in an options object at any nesting
472
+ * (`createClient({ transport: { instance: axios.create() } })`) or in a list of
473
+ * decorators (`compose([axios.create(), withAuth])`). That is safe because the
474
+ * bound value is still the call's RESULT. It is the mirror of what
475
+ * {@link bindsAxiosClient} refuses: an object, array, ternary or `new` as the
476
+ * bound value itself never reaches here.
477
+ */
478
+ function argumentHoldsAxiosClient(node, imports, axiosShadowed, depth) {
479
+ if (depth > MAX_CLIENT_WRAP_DEPTH)
480
+ return false;
481
+ const n = unwrapTsExpression(node);
482
+ if (bindsAxiosClient(n, imports, axiosShadowed, depth))
483
+ return true;
484
+ if (n.type === 'object') {
485
+ for (const pair of n.namedChildren) {
486
+ if (pair.type !== 'pair')
487
+ continue;
488
+ const value = pair.childForFieldName('value');
489
+ if (value && argumentHoldsAxiosClient(value, imports, axiosShadowed, depth + 1))
490
+ return true;
491
+ }
492
+ return false;
493
+ }
494
+ if (n.type === 'array') {
495
+ for (const element of n.namedChildren) {
496
+ if (argumentHoldsAxiosClient(element, imports, axiosShadowed, depth + 1))
497
+ return true;
498
+ }
499
+ }
500
+ return false;
501
+ }
502
+ /**
503
+ * Record one `name = value` binding into the accumulating facts.
504
+ * Shared by plain declarations and their `export const` form.
505
+ */
506
+ function recordBinding(name, valueNode, literals, exprs, clients, imports, axiosShadowed) {
507
+ const value = unwrapTsExpression(valueNode);
508
+ if (bindsAxiosClient(value, imports, axiosShadowed)) {
509
+ clients.add(name);
510
+ return;
511
+ }
512
+ // `const client = someOtherClient` — an alias. Recorded as a client-chase
513
+ // edge (below) and as a constant ref, since one of the two will resolve.
514
+ if (value.type === 'identifier') {
515
+ exprs.set(name, [{ kind: 'ref', name: value.text }]);
516
+ return;
517
+ }
518
+ if (value.type === 'object') {
519
+ flattenObjectLiteral(value, name, literals);
520
+ return;
521
+ }
522
+ const literal = literalStringOf(value);
523
+ if (literal !== null) {
524
+ literals.set(name, literal);
525
+ return;
526
+ }
527
+ const operands = parseJsConstOperands(value);
528
+ if (operands !== null)
529
+ exprs.set(name, operands);
530
+ }
531
+ /** Record every `variable_declarator` in a declaration node. */
532
+ function recordDeclaration(decl, literals, exprs, clients, imports, axiosShadowed, exports) {
533
+ for (const declarator of decl.namedChildren) {
534
+ if (declarator.type !== 'variable_declarator')
535
+ continue;
536
+ const nameNode = declarator.childForFieldName('name');
537
+ const valueNode = declarator.childForFieldName('value');
538
+ if (!nameNode || nameNode.type !== 'identifier' || !valueNode)
539
+ continue;
540
+ recordBinding(nameNode.text, valueNode, literals, exprs, clients, imports, axiosShadowed);
541
+ exports?.set(nameNode.text, nameNode.text);
542
+ }
543
+ }
544
+ /** Record one `import … from 'm'` statement's local bindings. */
545
+ function recordImportStatement(stmt, imports) {
546
+ const source = stmt.childForFieldName('source');
547
+ const moduleSpec = source ? literalStringOf(source) : null;
548
+ if (moduleSpec === null)
549
+ return;
550
+ for (const clause of stmt.namedChildren) {
551
+ if (clause.type !== 'import_clause')
552
+ continue;
553
+ for (const spec of clause.namedChildren) {
554
+ // `import Default from 'm'`
555
+ if (spec.type === 'identifier') {
556
+ imports.set(spec.text, { module: moduleSpec, originalName: 'default' });
557
+ }
558
+ else if (spec.type === 'namespace_import') {
559
+ const alias = spec.namedChild(0);
560
+ // `import * as NS from 'm'` — `NS.X` resolves to the target's `X`.
561
+ if (alias)
562
+ imports.set(alias.text, { module: moduleSpec, originalName: '*' });
563
+ }
564
+ else if (spec.type === 'named_imports') {
565
+ for (const named of spec.namedChildren) {
566
+ if (named.type !== 'import_specifier')
567
+ continue;
568
+ const nameNode = named.childForFieldName('name');
569
+ const aliasNode = named.childForFieldName('alias');
570
+ if (!nameNode)
571
+ continue;
572
+ const local = (aliasNode ?? nameNode).text;
573
+ imports.set(local, { module: moduleSpec, originalName: nameNode.text });
574
+ }
575
+ }
576
+ }
577
+ }
578
+ }
579
+ /**
580
+ * Extract one file's {@link JsModuleFacts} from its parsed tree.
581
+ *
582
+ * Only TOP-LEVEL declarations are collected. A route table or an API client
583
+ * defined inside a function body is not a module constant, and treating it as
584
+ * one would let an unrelated same-named local shadow the real export.
585
+ */
586
+ export function extractJsModuleFacts(tree) {
587
+ const literals = new Map();
588
+ const exprs = new Map();
589
+ const imports = new Map();
590
+ const exports = new Map();
591
+ const starExports = [];
592
+ const clients = new Set();
593
+ // Imports first. ES module bindings are hoisted — `const c = ax.create(…)`
594
+ // above `import ax from 'axios'` is legal and binds the same `ax` — but
595
+ // `bindsAxiosClient` consults `imports` as each declaration is recorded, so
596
+ // in source order an import declared later was simply not there yet and the
597
+ // client went unproven.
598
+ //
599
+ // CommonJS `const ax = require('axios')` is collected here too. It is the
600
+ // same binding by another spelling, and without it an aliased require
601
+ // resolved to nothing at all while the un-aliased one worked only because
602
+ // `axios` happens to be the name the spelling shortcut trusts.
603
+ let axiosShadowed = false;
604
+ for (const stmt of tree.rootNode.namedChildren) {
605
+ if (stmt.type === 'import_statement') {
606
+ recordImportStatement(stmt, imports);
607
+ continue;
608
+ }
609
+ const decl = stmt.type === 'export_statement' ? stmt.childForFieldName('declaration') : stmt;
610
+ if (decl === null ||
611
+ (decl.type !== 'lexical_declaration' && decl.type !== 'variable_declaration')) {
612
+ continue;
613
+ }
614
+ for (const declarator of decl.namedChildren) {
615
+ if (declarator.type !== 'variable_declarator')
616
+ continue;
617
+ const nameNode = declarator.childForFieldName('name');
618
+ const valueNode = declarator.childForFieldName('value');
619
+ if (!nameNode || nameNode.type !== 'identifier')
620
+ continue;
621
+ const required = valueNode === null ? null : requireSpecifierOf(valueNode);
622
+ if (required !== null) {
623
+ imports.set(nameNode.text, { module: required, originalName: 'default' });
624
+ }
625
+ else if (nameNode.text === 'axios') {
626
+ axiosShadowed = true;
627
+ }
628
+ }
629
+ }
630
+ for (const stmt of tree.rootNode.namedChildren) {
631
+ if (stmt.type === 'lexical_declaration' || stmt.type === 'variable_declaration') {
632
+ recordDeclaration(stmt, literals, exprs, clients, imports, axiosShadowed, null);
633
+ continue;
634
+ }
635
+ if (stmt.type === 'import_statement')
636
+ continue; // hoisted above
637
+ if (stmt.type !== 'export_statement')
638
+ continue;
639
+ const source = stmt.childForFieldName('source');
640
+ const reexportFrom = source ? literalStringOf(source) : null;
641
+ const declaration = stmt.childForFieldName('declaration');
642
+ const value = stmt.childForFieldName('value');
643
+ // `export const X = …` / `export default <expr>`
644
+ if (declaration) {
645
+ if (declaration.type === 'lexical_declaration' ||
646
+ declaration.type === 'variable_declaration') {
647
+ recordDeclaration(declaration, literals, exprs, clients, imports, axiosShadowed, exports);
648
+ }
649
+ continue;
650
+ }
651
+ if (value) {
652
+ // `export default routeApiClient` / `export default axios.create(...)`
653
+ if (value.type === 'identifier') {
654
+ exports.set('default', value.text);
655
+ }
656
+ else {
657
+ recordBinding(DEFAULT_LOCAL, value, literals, exprs, clients, imports, axiosShadowed);
658
+ exports.set('default', DEFAULT_LOCAL);
659
+ }
660
+ continue;
661
+ }
662
+ // `export * from './m'` / `export * as NS from './m'`. Neither has an
663
+ // export_clause; the namespace form additionally binds a local alias.
664
+ if (reexportFrom !== null && !stmt.namedChildren.some((c) => c.type === 'export_clause')) {
665
+ const namespaceAlias = stmt.namedChildren.find((c) => c.type === 'namespace_export');
666
+ const alias = namespaceAlias?.namedChild(0)?.text;
667
+ if (alias !== undefined) {
668
+ imports.set(alias, { module: reexportFrom, originalName: '*' });
669
+ exports.set(alias, alias);
670
+ }
671
+ else {
672
+ starExports.push(reexportFrom);
673
+ }
674
+ continue;
675
+ }
676
+ // `export { a, b as c }` and `export { a } from './m'`
677
+ for (const clause of stmt.namedChildren) {
678
+ if (clause.type !== 'export_clause')
679
+ continue;
680
+ for (const spec of clause.namedChildren) {
681
+ if (spec.type !== 'export_specifier')
682
+ continue;
683
+ const nameNode = spec.childForFieldName('name');
684
+ const aliasNode = spec.childForFieldName('alias');
685
+ if (!nameNode)
686
+ continue;
687
+ const exported = (aliasNode ?? nameNode).text;
688
+ if (reexportFrom !== null) {
689
+ imports.set(exported, { module: reexportFrom, originalName: nameNode.text });
690
+ exports.set(exported, exported);
691
+ }
692
+ else {
693
+ exports.set(exported, nameNode.text);
694
+ }
695
+ }
696
+ }
697
+ }
698
+ return { constants: { literals, exprs, imports }, exports, starExports, clients, axiosShadowed };
699
+ }
700
+ /**
701
+ * Resolve a path reference at a call site to its literal string, or `null`.
702
+ *
703
+ * `ref` is the dotted name as written (`API_ROUTE_PATH.LINKS`, or a bare
704
+ * `BASE_PATH`). Resolution order:
705
+ *
706
+ * 1. The dotted name as a constant of the CURRENT file — hits when the table
707
+ * is declared in the same file (flattened to dotted literal keys).
708
+ * 2. The base name as an IMPORT of the current file — hop to the defining
709
+ * file and look the dotted name up there, re-hopping through barrels that
710
+ * re-export it, bounded by {@link MAX_REEXPORT_HOPS}.
711
+ *
712
+ * Returns `null` on anything it cannot fully fold, which leaves the call site
713
+ * exactly as unmatched as it is today — never a guessed path.
714
+ */
715
+ export function resolveJsMemberPath(fileKey, ref, facts) {
716
+ const direct = foldConstant(fileKey, ref, facts.constants, facts.resolveImport, facts.keys);
717
+ if (direct !== null)
718
+ return direct;
719
+ const dot = ref.indexOf('.');
720
+ if (dot < 0)
721
+ return null;
722
+ const base = ref.slice(0, dot);
723
+ const member = ref.slice(dot + 1);
724
+ const binding = facts.byFile.get(fileKey)?.constants.imports.get(base);
725
+ if (!binding)
726
+ return null;
727
+ const targetKey = facts.resolveImport(fileKey, binding.module, facts.keys);
728
+ if (targetKey === null)
729
+ return null;
730
+ // `import * as NS from 'm'` — `NS.TABLE.KEY` addresses the target's own
731
+ // `TABLE.KEY`, so the namespace alias drops out of the reference entirely.
732
+ if (binding.originalName === '*') {
733
+ const nextDot = member.indexOf('.');
734
+ if (nextDot < 0)
735
+ return null;
736
+ return resolveExportedMember(targetKey, member.slice(0, nextDot), member.slice(nextDot + 1), facts, 0, new Set());
737
+ }
738
+ return resolveExportedMember(targetKey, binding.originalName, member, facts, 0, new Set());
739
+ }
740
+ /**
741
+ * Resolve `<exported>.<member>` against a module's PUBLIC surface, following
742
+ * whatever indirection stands between the name and its definition.
743
+ *
744
+ * Three ways a module can expose a name, tried in order:
745
+ * 1. it defines it (possibly under a different local name — `export { a as b }`)
746
+ * 2. it re-exports it explicitly (`export { a } from './m'`)
747
+ * 3. it re-exports a whole module (`export * from './m'`)
748
+ *
749
+ * The third is the one that matters in practice: application code imports a
750
+ * DIRECTORY (`@/api-modules/shared`), whose `index.ts` is nothing but
751
+ * `export * from './api-routes'`. Stopping at the barrel resolves nothing at
752
+ * all, so the star edges have to be walked. `seen` makes mutually-importing
753
+ * barrels terminate instead of recursing forever.
754
+ */
755
+ function resolveExportedMember(fileKey, exported, member, facts, depth, seen) {
756
+ if (depth > MAX_REEXPORT_HOPS)
757
+ return null;
758
+ const guard = `${fileKey}::${exported}.${member}`;
759
+ if (seen.has(guard))
760
+ return null;
761
+ seen.add(guard);
762
+ const file = facts.byFile.get(fileKey);
763
+ if (!file)
764
+ return null;
765
+ const local = file.exports.get(exported) ?? exported;
766
+ const here = foldConstant(fileKey, `${local}.${member}`, facts.constants, facts.resolveImport, facts.keys);
767
+ if (here !== null)
768
+ return here;
769
+ const binding = file.constants.imports.get(exported);
770
+ if (binding) {
771
+ const targetKey = facts.resolveImport(fileKey, binding.module, facts.keys);
772
+ if (targetKey !== null) {
773
+ const viaImport = resolveExportedMember(targetKey, binding.originalName === '*' ? exported : binding.originalName, member, facts, depth + 1, seen);
774
+ if (viaImport !== null)
775
+ return viaImport;
776
+ }
777
+ }
778
+ // Every star edge is walked, not just up to the first hit: two barrels
779
+ // re-exporting the same name is ambiguous in JS itself, so answering with
780
+ // whichever module happens to come first in `starExports` would be a guess
781
+ // dressed as a resolution.
782
+ let viaStar = null;
783
+ for (const spec of file.starExports) {
784
+ const targetKey = facts.resolveImport(fileKey, spec, facts.keys);
785
+ if (targetKey === null)
786
+ continue;
787
+ const found = resolveExportedMember(targetKey, exported, member, facts, depth + 1, seen);
788
+ if (found === null)
789
+ continue;
790
+ if (viaStar !== null && viaStar !== found)
791
+ return null;
792
+ viaStar = found;
793
+ }
794
+ return viaStar;
795
+ }
796
+ /** The local binding an exported name refers to in `fileKey` (identity if unaliased). */
797
+ function resolveExportLocal(facts, fileKey, exported) {
798
+ return facts.byFile.get(fileKey)?.exports.get(exported) ?? exported;
799
+ }
800
+ /**
801
+ * Recursion ceiling for the path-expression fold, and the matching term cap for
802
+ * a `+` chain.
803
+ *
804
+ * Nothing on this path was bounded before: `flattenConcat` recursed once per
805
+ * term, mutually with {@link foldTermOrPlaceholder}, on the SCAN side — which
806
+ * `prepareRepo`'s `try/catch` does not cover and which `HttpLanguagePlugin.scan`
807
+ * contractually may not throw from. ~6 400 concat terms (38 KB of source) threw
808
+ * `RangeError: Maximum call stack size exceeded` out of `extract()`, and
809
+ * `sync.ts` turns that into an unexplained "missing repo" with every contract of
810
+ * every kind — HTTP, gRPC, topics, includes — dropped for that repo and nothing
811
+ * logged. A hand-written route path is a handful of terms.
812
+ */
813
+ const MAX_EXPR_DEPTH = 64;
814
+ const MAX_CONCAT_TERMS = 256;
815
+ /**
816
+ * Resolve one term of a partially-foldable path, re-emitting it as a
817
+ * `${…}` placeholder when it cannot be folded.
818
+ *
819
+ * The placeholder is deliberate, not a fallback wart: consumer-side path
820
+ * normalization rewrites `${…}` to `{param}`, which is exactly the right
821
+ * reading for a term that IS a runtime value (`${eventId}`). Re-emitting keeps
822
+ * a mixed path like `` `${API_ROUTE_PATH.LISTS}/${eventId}/add` `` resolvable to
823
+ * `/curator-lists/{param}/add` instead of collapsing its known prefix to
824
+ * `{param}/{param}/add`.
825
+ */
826
+ function foldTermOrPlaceholder(fileKey, node, facts, depth) {
827
+ if (depth > MAX_EXPR_DEPTH)
828
+ return null;
829
+ const n = unwrapTsExpression(node);
830
+ const literal = literalStringOf(n);
831
+ if (literal !== null)
832
+ return { text: literal, concrete: true };
833
+ // A template nested inside a substitution — `` `${BASE}${`/${id}/unlike`}` ``
834
+ // is a real shape. Recursing keeps its literal segments; emitting it verbatim
835
+ // would collapse the whole inner template to one `{param}` and lose them.
836
+ if (n.type === 'template_string' || n.type === 'binary_expression') {
837
+ const nested = foldPathExpression(fileKey, n, facts, depth + 1);
838
+ if (nested !== null)
839
+ return { text: nested.text, concrete: nested.anchored };
840
+ }
841
+ const dotted = n.type === 'identifier' ? n.text : dottedNameOf(n);
842
+ if (dotted !== null) {
843
+ const resolved = resolveJsMemberPath(fileKey, dotted, facts);
844
+ if (resolved !== null)
845
+ return { text: resolved, concrete: true };
846
+ return { text: `\${${dotted}}`, concrete: false };
847
+ }
848
+ return { text: `\${${n.text}}`, concrete: false };
849
+ }
850
+ /** Flatten a left-nested `a + b + c` chain into its terms, or `null` if not all `+`. */
851
+ function flattenConcat(node, depth) {
852
+ if (depth > MAX_EXPR_DEPTH)
853
+ return null;
854
+ const n = unwrapTsExpression(node);
855
+ if (n.type !== 'binary_expression')
856
+ return [n];
857
+ // The LEFT spine is walked iteratively: `a + b + c + …` parses left-nested,
858
+ // so recursing once per term is one stack frame per term. Only a `+` on the
859
+ // right can still nest, and that recursion is depth-capped.
860
+ const reversed = [];
861
+ let cur = n;
862
+ for (;;) {
863
+ if (reversed.length > MAX_CONCAT_TERMS)
864
+ return null;
865
+ if (cur.childForFieldName('operator')?.text !== '+')
866
+ return null;
867
+ const left = cur.childForFieldName('left');
868
+ const right = cur.childForFieldName('right');
869
+ if (!left || !right)
870
+ return null;
871
+ reversed.push(right);
872
+ const nextLeft = unwrapTsExpression(left);
873
+ if (nextLeft.type !== 'binary_expression') {
874
+ reversed.push(nextLeft);
875
+ break;
876
+ }
877
+ cur = nextLeft;
878
+ }
879
+ const out = [];
880
+ for (let i = reversed.length - 1; i >= 0; i--) {
881
+ const term = reversed[i];
882
+ if (unwrapTsExpression(term).type !== 'binary_expression') {
883
+ out.push(term);
884
+ continue;
885
+ }
886
+ const nested = flattenConcat(term, depth + 1);
887
+ if (nested === null)
888
+ return null;
889
+ out.push(...nested);
890
+ if (out.length > MAX_CONCAT_TERMS)
891
+ return null;
892
+ }
893
+ return out;
894
+ }
895
+ /**
896
+ * The fold behind {@link resolveJsPathExpression}, carrying the recursion depth
897
+ * and reporting whether the result is anchored.
898
+ *
899
+ * `MAX_FOLD_LENGTH` is checked on the ACCUMULATED text, not per term. The
900
+ * shared core caps each folded constant at that length; joining an unbounded
901
+ * number of them made the cap a ~2048x amplifier instead of a ceiling (each
902
+ * `${A}` costs 4 source characters and can yield 8 192), and the result is not
903
+ * transient — it becomes `contractId` and `meta.path` in `contracts.json` and
904
+ * `bridge.lbug`. Measured 200 KB of source to 941 MB of heap before this.
905
+ */
906
+ function foldPathExpression(fileKey, node, facts, depth) {
907
+ if (depth > MAX_EXPR_DEPTH)
908
+ return null;
909
+ const n = unwrapTsExpression(node);
910
+ const literal = literalStringOf(n);
911
+ if (literal !== null)
912
+ return { text: literal, anchored: true };
913
+ if (n.type === 'identifier' || n.type === 'member_expression') {
914
+ const dotted = n.type === 'identifier' ? n.text : dottedNameOf(n);
915
+ if (dotted === null)
916
+ return null;
917
+ const resolved = resolveJsMemberPath(fileKey, dotted, facts);
918
+ return resolved === null ? null : { text: resolved, anchored: true };
919
+ }
920
+ const terms = [];
921
+ if (n.type === 'template_string') {
922
+ for (const child of n.namedChildren) {
923
+ if (child.type === 'string_fragment') {
924
+ terms.push(child);
925
+ }
926
+ else if (child.type === 'template_substitution') {
927
+ const inner = child.namedChild(0);
928
+ if (inner === null)
929
+ return null;
930
+ terms.push(inner);
931
+ }
932
+ }
933
+ }
934
+ else if (n.type === 'binary_expression') {
935
+ const flattened = flattenConcat(n, depth);
936
+ if (flattened === null)
937
+ return null;
938
+ terms.push(...flattened);
939
+ }
940
+ else {
941
+ return null;
942
+ }
943
+ let out = '';
944
+ let anchored = null;
945
+ for (const term of terms) {
946
+ const folded = term.type === 'string_fragment'
947
+ ? { text: term.text, concrete: true }
948
+ : foldTermOrPlaceholder(fileKey, term, facts, depth + 1);
949
+ if (folded === null)
950
+ return null;
951
+ if (anchored === null)
952
+ anchored = folded.concrete;
953
+ out += folded.text;
954
+ if (out.length > MAX_FOLD_LENGTH)
955
+ return null;
956
+ }
957
+ return anchored === null ? null : { text: out, anchored };
958
+ }
959
+ /**
960
+ * Resolve the first argument of an HTTP call to a path string, or `null` when
961
+ * the expression is not a path shape this binding understands.
962
+ *
963
+ * Accepts a plain literal, a constant reference (`BASE_PATH`), a table member
964
+ * (`API_ROUTE_PATH.LINKS`), a template string, and a `+`-concatenation of any
965
+ * of those. Template and concat forms fold PARTIALLY — see
966
+ * {@link foldTermOrPlaceholder}.
967
+ *
968
+ * A reference that resolves to nothing returns `null` (skip), and so does a
969
+ * mixed expression whose leading term is unresolved — see {@link FoldedPath}.
970
+ */
971
+ export function resolveJsPathExpression(fileKey, node, facts) {
972
+ const folded = foldPathExpression(fileKey, node, facts, 0);
973
+ return folded !== null && folded.anchored ? folded.text : null;
974
+ }
975
+ /**
976
+ * Whether `name`, as referenced in `fileKey`, holds an HTTP client instance.
977
+ *
978
+ * Chases local aliases and import/export hops so the common app shape —
979
+ * `axios.create()` in `lib/axios.config.ts`, `export default apiClient`,
980
+ * `import apiClient from '@/lib/axios.config'` at the call site — is proven
981
+ * rather than pattern-matched on the receiver's spelling.
982
+ *
983
+ * Deliberately conservative: an unproven receiver returns `false`, which keeps
984
+ * today's behavior for it. The alternative — trusting any identifier with an
985
+ * HTTP-verb method — would classify every Express `router.get('/x', handler)`
986
+ * provider as a consumer of itself.
987
+ */
988
+ /**
989
+ * Whether `name`, as a receiver in `fileKey`, IS the axios module — as opposed
990
+ * to an instance built from it, which is {@link isHttpClientRef}'s question.
991
+ *
992
+ * Two ways to be it. The bare spelling `axios` predates the widened query — it
993
+ * is what the original `(#eq? @obj "axios")` pattern matched — so it stays
994
+ * trusted by default, and a file with no facts keeps exactly that behavior; it
995
+ * is withdrawn only where the file itself binds that name to something else.
996
+ * The other way is a declared import or `require` of `'axios'` under any local
997
+ * name, which is proof rather than convention and covers the aliased form the
998
+ * spelling rule cannot see.
999
+ */
1000
+ export function isAxiosNamespace(fileKey, name, facts) {
1001
+ const file = facts.byFile.get(fileKey);
1002
+ if (file === undefined)
1003
+ return name === 'axios';
1004
+ if (file.constants.imports.get(name)?.module === 'axios')
1005
+ return true;
1006
+ return name === 'axios' && !file.axiosShadowed;
1007
+ }
1008
+ export function isHttpClientRef(fileKey, name, facts) {
1009
+ let currentKey = fileKey;
1010
+ let currentName = name;
1011
+ for (let hop = 0; hop < MAX_REEXPORT_HOPS; hop++) {
1012
+ const file = facts.byFile.get(currentKey);
1013
+ if (!file)
1014
+ return false;
1015
+ if (file.clients.has(currentName))
1016
+ return true;
1017
+ // Local alias: `const client = configuredClient`.
1018
+ const expr = file.constants.exprs.get(currentName);
1019
+ if (expr && expr.length === 1 && expr[0].kind === 'ref') {
1020
+ currentName = expr[0].name;
1021
+ continue;
1022
+ }
1023
+ const binding = file.constants.imports.get(currentName);
1024
+ if (!binding)
1025
+ return false;
1026
+ const targetKey = facts.resolveImport(currentKey, binding.module, facts.keys);
1027
+ if (targetKey === null)
1028
+ return false;
1029
+ currentKey = targetKey;
1030
+ currentName = resolveExportLocal(facts, targetKey, binding.originalName);
1031
+ }
1032
+ return false;
1033
+ }