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
@@ -5,6 +5,7 @@
5
5
  * Strategy lives in configs/python.ts.
6
6
  * This file contains the shared internal helper used by the strategy and tests.
7
7
  */
8
+ import { getPythonFileIndex, importerBarePrefixes, importerDirOf, pythonSegmentAbsent, } from './python-file-index.js';
8
9
  import { tryResolveWithExtensions } from './utils.js';
9
10
  /**
10
11
  * Resolve a Python import to a file path (low-level helper).
@@ -43,8 +44,24 @@ export function resolvePythonImportInternal(currentFile, importPath, allFiles) {
43
44
  const pathLike = importPath.replace(/\./g, '/');
44
45
  if (pathLike.includes('/'))
45
46
  return null;
46
- // Normalize for Windows backslashes
47
- const importerDir = currentFile.replace(/\\/g, '/').split('/').slice(0, -1).join('/');
47
+ // O(1) proof of absence, before any probing. Every probe below — the two
48
+ // proximity probes and the two per ancestor step — has the shape
49
+ // `<X>/<pathLike>.py` or `<X>/<pathLike>/__init__.py`, and
50
+ // `pythonSegmentAbsent` answers "no file in the workspace has EITHER shape,
51
+ // for any prefix" in two Map lookups on the index the dotted tiers already
52
+ // build. That is `true` for `os`, `sys`, `django` and every other
53
+ // distribution the repo does not vendor — i.e. for most imports in most
54
+ // Python repos — and it retires the whole walk for them instead of running
55
+ // it to the workspace root. It is exact, not a filter: a miss here means
56
+ // every probe the walk would have issued was guaranteed to miss.
57
+ const index = getPythonFileIndex(allFiles);
58
+ if (pythonSegmentAbsent(index, pathLike))
59
+ return null;
60
+ // One derivation, shared with the index's other per-directory memo — see
61
+ // `importerDirOf`. It replaced `split('/').slice(0, -1).join('/')`: identical
62
+ // for every input (a path with no separator has no directory, which is `''`
63
+ // both ways) without the per-import array of one element per path component.
64
+ const importerDir = importerDirOf(currentFile);
48
65
  // Proximity check — only applies when the importer lives in a subdirectory.
49
66
  // Root-level importers (importerDir === '') skip straight to the ancestor
50
67
  // walk below, which handles the root case correctly (prefix becomes '').
@@ -59,10 +76,12 @@ export function resolvePythonImportInternal(currentFile, importPath, allFiles) {
59
76
  // importer's directory to find the module in an ancestor, preferring the closest match.
60
77
  // This prevents cross-language misresolution (e.g., Python `from middleware import X`
61
78
  // resolving to a TypeScript middleware.ts via suffix matching). Issue #417.
62
- const dirParts = importerDir.split('/');
63
- for (let i = dirParts.length - 1; i >= 0; i--) {
64
- const ancestorDir = dirParts.slice(0, i).join('/');
65
- const prefix = ancestorDir ? `${ancestorDir}/` : '';
79
+ //
80
+ // The prefixes come from `importerBarePrefixes`, built ONCE per importer
81
+ // directory per pass and stored in the same index consulted above. Rebuilding
82
+ // them here — `dirParts.slice(0, i).join('/')`, one array and one string per
83
+ // path component — was the last per-import ancestor walk left after #2913.
84
+ for (const prefix of importerBarePrefixes(index, importerDir)) {
66
85
  if (allFiles.has(`${prefix}${pathLike}/__init__.py`))
67
86
  return `${prefix}${pathLike}/__init__.py`;
68
87
  if (allFiles.has(`${prefix}${pathLike}.py`))
@@ -11,4 +11,4 @@ import type { SuffixIndex } from './utils.js';
11
11
  * require_relative paths are pre-normalized to './' prefix by the caller.
12
12
  * require paths use suffix matching (gem-style paths like 'json', 'net/http').
13
13
  */
14
- export declare function resolveRubyImportInternal(importPath: string, normalizedFileList: string[], allFileList: string[], index?: SuffixIndex): string | null;
14
+ export declare function resolveRubyImportInternal(importPath: string, normalizedFileList: readonly string[], allFileList: readonly string[], index?: SuffixIndex): string | null;
@@ -8,10 +8,10 @@
8
8
  * Resolve Rust use-path to a file (low-level helper).
9
9
  * Handles crate::, super::, self:: prefixes and :: path separators.
10
10
  */
11
- export declare function resolveRustImportInternal(currentFile: string, importPath: string, allFiles: Set<string>): string | null;
11
+ export declare function resolveRustImportInternal(currentFile: string, importPath: string, allFiles: ReadonlySet<string>): string | null;
12
12
  /**
13
13
  * Try to resolve a Rust module path to a file.
14
14
  * Tries: path.rs, path/mod.rs, and with the last segment stripped
15
15
  * (last segment might be a symbol name, not a module).
16
16
  */
17
- export declare function tryRustModulePath(modulePath: string, allFiles: Set<string>): string | null;
17
+ export declare function tryRustModulePath(modulePath: string, allFiles: ReadonlySet<string>): string | null;
@@ -20,7 +20,7 @@ export declare const RESOLVE_CACHE_CAP = 100000;
20
20
  * Java wildcards and Go package imports are handled by the scope-resolution
21
21
  * phase because they resolve to multiple files.
22
22
  */
23
- export declare const resolveImportPath: (currentFile: string, importPath: string, allFiles: Set<string>, allFileList: string[], normalizedFileList: string[], resolveCache: Map<string, string | null>, language: SupportedLanguages, tsconfigPaths: TsconfigPaths | null, index?: SuffixIndex) => string | null;
23
+ export declare const resolveImportPath: (currentFile: string, importPath: string, allFiles: Set<string>, allFileList: readonly string[], normalizedFileList: readonly string[], resolveCache: Map<string, string | null>, language: SupportedLanguages, tsconfigPaths: TsconfigPaths | null, index?: SuffixIndex) => string | null;
24
24
  /**
25
25
  * Standard single-file resolution (TS/JS/C/C++ and fallback for other languages).
26
26
  * Handles relative imports, tsconfig path aliases, and suffix matching.
@@ -3,8 +3,7 @@
3
3
  *
4
4
  * Extracted from import-resolution.ts to co-locate types with their consumers.
5
5
  */
6
- import type { TsconfigPaths, GoModuleConfig, CSharpProjectConfig, CSharpNamespaceEvidence, ComposerConfig } from '../language-config.js';
7
- import type { SwiftPackageConfig } from '../language-config.js';
6
+ import type { ImportConfigs } from '../language-config.js';
8
7
  import type { SuffixIndex } from './utils.js';
9
8
  import type { SupportedLanguages } from '../../../_shared/index.js';
10
9
  /**
@@ -21,16 +20,6 @@ export type ImportResult = {
21
20
  files: string[];
22
21
  dirSuffix: string;
23
22
  } | null;
24
- /** Bundled language-specific configs loaded once per ingestion run. */
25
- export interface ImportConfigs {
26
- tsconfigPaths: TsconfigPaths | null;
27
- goModule: GoModuleConfig | null;
28
- composerConfig: ComposerConfig | null;
29
- swiftPackageConfig: SwiftPackageConfig | null;
30
- csharpConfigs: CSharpProjectConfig[];
31
- /** In-repo namespace evidence gating C# suffix-fallback resolution (#1881). */
32
- csharpNamespaces?: CSharpNamespaceEvidence;
33
- }
34
23
  /** Pre-built lookup structures for import resolution. Build once, reuse across chunks. */
35
24
  export interface ImportResolutionContext {
36
25
  allFilePaths: Set<string>;
@@ -18,15 +18,74 @@ export declare function tryResolveWithExtensions(basePath: string, allFiles: Rea
18
18
  * etc.
19
19
  */
20
20
  export interface SuffixIndex {
21
- /** Exact suffix lookup (case-sensitive) */
21
+ /**
22
+ * Exact suffix lookup (case-sensitive).
23
+ *
24
+ * The map behind this is built on the FIRST call and memoized — see
25
+ * `buildSuffixIndex`. All three maps are deferred; a consumer pays only for
26
+ * the questions it actually asks.
27
+ */
22
28
  get(suffix: string): string | undefined;
23
- /** Case-insensitive suffix lookup */
29
+ /**
30
+ * Case-insensitive suffix lookup.
31
+ *
32
+ * Deferred like `get`, and — when `get` was asked first — DERIVED from that
33
+ * map rather than traversed for a second time. See `buildSuffixIndex`.
34
+ */
24
35
  getInsensitive(suffix: string): string | undefined;
25
- /** Get all files in a directory suffix */
26
- getFilesInDir(dirSuffix: string, extension: string): string[];
36
+ /**
37
+ * Get all files in a directory suffix.
38
+ *
39
+ * `dirSuffix` is matched as a SEGMENT-aligned directory suffix — every
40
+ * returned file is a direct child of a directory `D` with
41
+ * `D === dirSuffix || D.endsWith('/' + dirSuffix)`. Callers may rely on this
42
+ * and skip a direct-child re-check; `import-resolvers/csharp.ts` step 2 does
43
+ * exactly that. It bounds what may be RETURNED, not what must be found: an
44
+ * implementation is free to answer with fewer files, and the root-anchored
45
+ * index in `languages/php/import-target.ts` answers only the `D === dirSuffix`
46
+ * arm.
47
+ *
48
+ * `readonly` is the CONTRACT, and it is the contract for every implementation
49
+ * of this interface, not a description of any one of them: an implementation
50
+ * is free to return its own bucket by reference, so callers must treat the
51
+ * result as shared and never `sort`/`splice` it in place. The compiler now
52
+ * refuses that at the call site. Whether a given implementation shares or
53
+ * copies is its own business and documented where it is built —
54
+ * `buildSuffixIndex` shares, the root-anchored parity index in
55
+ * `languages/php/import-target.ts` returns a filtered copy.
56
+ *
57
+ * Implementations that memoize should note the directory map behind this may
58
+ * be built on the FIRST call rather than up front, so a caller that never
59
+ * asks a directory question never pays for it — see `buildSuffixIndex`.
60
+ */
61
+ getFilesInDir(dirSuffix: string, extension: string): readonly string[];
27
62
  }
28
- export declare function buildSuffixIndex(normalizedFileList: string[], allFileList: string[]): SuffixIndex;
63
+ export interface SuffixIndexOptions {
64
+ /**
65
+ * Promise from the caller that `normalizedFileList[i] === normalizedFileList[i].toLowerCase()`
66
+ * for every `i` — i.e. the "normalized" list is a LOWERCASED file list, not
67
+ * merely a slash-normalized one.
68
+ *
69
+ * `import-resolvers/pass-cache.ts` is the one caller that can make it: it
70
+ * builds `normalizedFileList` as `allFileList.map((f) => f.toLowerCase())`.
71
+ * Every suffix of an all-lowercase path is itself lowercase, so
72
+ * `suffix.toLowerCase() === suffix` and the case-folded map came out a
73
+ * byte-identical copy of the exact one — same keys, same values, same
74
+ * insertion order. Measured 14.00 MiB at 32 000 paths, 29.8% of the retained
75
+ * `ImportPassCache` — and one `ImportPassCache` is built per ts-family
76
+ * adapter per pass, so the waste was carried once for each of them.
77
+ *
78
+ * With this set, `getInsensitive` reads the exact map directly instead. It is
79
+ * the same map the derivation below would have produced, so this is a skipped
80
+ * copy and not a second lookup rule — see `getLowerMap`.
81
+ *
82
+ * Setting it over a list that is NOT all-lowercase is a behaviour change, not
83
+ * an optimization: `getInsensitive` would then answer case-sensitively.
84
+ */
85
+ readonly alreadyLowercased?: boolean;
86
+ }
87
+ export declare function buildSuffixIndex(normalizedFileList: readonly string[], allFileList: readonly string[], options?: SuffixIndexOptions): SuffixIndex;
29
88
  /**
30
89
  * Suffix-based resolution using index. O(1) per lookup instead of O(files).
31
90
  */
32
- export declare function suffixResolve(pathParts: string[], normalizedFileList: string[], allFileList: string[], index?: SuffixIndex): string | null;
91
+ export declare function suffixResolve(pathParts: string[], normalizedFileList: readonly string[], allFileList: readonly string[], index?: SuffixIndex): string | null;
@@ -64,53 +64,232 @@ export function tryResolveWithExtensions(basePath, allFiles) {
64
64
  }
65
65
  return null;
66
66
  }
67
- export function buildSuffixIndex(normalizedFileList, allFileList) {
68
- // Map: normalized suffix -> original file path
69
- const exactMap = new Map();
70
- // Map: lowercase suffix -> original file path
71
- const lowerMap = new Map();
72
- // Map: directory suffix -> list of file paths in that directory
73
- const dirMap = new Map();
74
- for (let i = 0; i < normalizedFileList.length; i++) {
75
- const normalized = normalizedFileList[i];
76
- const original = allFileList[i];
77
- const parts = normalized.split('/');
78
- // Index all suffixes: "a/b/c.java" -> ["c.java", "b/c.java", "a/b/c.java"]
79
- for (let j = parts.length - 1; j >= 0; j--) {
80
- const suffix = parts.slice(j).join('/');
81
- // Only store first match (longest path wins for ambiguous suffixes)
82
- if (!exactMap.has(suffix)) {
83
- exactMap.set(suffix, original);
67
+ export function buildSuffixIndex(normalizedFileList, allFileList, options) {
68
+ const alreadyLowercased = options?.alreadyLowercased === true;
69
+ /**
70
+ * Map: normalized suffix -> original file path.
71
+ *
72
+ * DEFERRED, like `dirMap` below and for the same reason (#2903 extended to
73
+ * the two suffix maps). Several consumers on the ScopeResolver path ask only
74
+ * ONE of the two suffix questions and were paying for both:
75
+ *
76
+ * - `languages/java/import-target.ts` and the no-csproj leg of
77
+ * `languages/csharp/import-target.ts` call `get` and never
78
+ * `getInsensitive` — measured 49.98 MiB dead of a 100.82 MiB Java index
79
+ * at 32 000 paths (49.6%), against a gated ceiling of 146.9 MiB;
80
+ * - `languages/php/import-target.ts` calls `getInsensitive` and never `get`
81
+ * — 34.49 MiB of 69.85 MiB (49.4%).
82
+ *
83
+ * Ruby, the csproj leg of C#, `group/extractors/include-extractor.ts` and
84
+ * `suffixResolve` below read both, and all four read `get` FIRST (they are
85
+ * written `get(s) || getInsensitive(s)`), which is what makes the derivation
86
+ * in `getLowerMap` the cheap order rather than the expensive one.
87
+ */
88
+ let exactMap = null;
89
+ const getExactMap = () => {
90
+ if (exactMap !== null)
91
+ return exactMap;
92
+ const built = new Map();
93
+ for (let i = 0; i < normalizedFileList.length; i++) {
94
+ const normalized = normalizedFileList[i];
95
+ const original = allFileList[i];
96
+ // Index all suffixes: "a/b/c.java" -> ["c.java", "b/c.java", "a/b/c.java"].
97
+ //
98
+ // Walked as slash offsets into `normalized` rather than as
99
+ // `normalized.split('/')` + `parts.slice(j).join('/')`: the slice of the
100
+ // ORIGINAL string is byte-identical to the re-joined parts (no separator
101
+ // is invented or dropped — verified over 361 865 suffix strings including
102
+ // leading, doubled and trailing slashes), and it allocates one string
103
+ // instead of a parts array, a slice array and a joined string per suffix.
104
+ // Measured 357.4 ms -> 264.5 ms at 32 000 paths.
105
+ let slash = normalized.lastIndexOf('/');
106
+ while (slash >= 0) {
107
+ const suffix = normalized.slice(slash + 1);
108
+ // Only store first match (longest path wins for ambiguous suffixes)
109
+ if (!built.has(suffix))
110
+ built.set(suffix, original);
111
+ // A path may begin with '/', whose suffix is the whole string below.
112
+ if (slash === 0)
113
+ break;
114
+ slash = normalized.lastIndexOf('/', slash - 1);
84
115
  }
85
- const lower = suffix.toLowerCase();
86
- if (!lowerMap.has(lower)) {
87
- lowerMap.set(lower, original);
116
+ // j = 0 — the whole path, which the slash walk cannot emit.
117
+ if (!built.has(normalized))
118
+ built.set(normalized, original);
119
+ }
120
+ exactMap = built;
121
+ return built;
122
+ };
123
+ /**
124
+ * Map: lowercase suffix -> original file path.
125
+ *
126
+ * Deferred, and when the exact map already exists DERIVED from it instead of
127
+ * traversed for: one pass over that map's DISTINCT keys rather than a second
128
+ * pass over every (file × depth) suffix. Measured 330.3 ms total (200.6 build
129
+ * + 129.7 derive) against 388.8 ms for the single fused traversal that built
130
+ * both eagerly — so the two-map consumers get cheaper too, which per-map
131
+ * laziness on its own does not (407.1 ms, a second full traversal).
132
+ *
133
+ * The derivation is EQUAL, not approximate, and the argument is short. Let
134
+ * the fused loop's global order be the pairs (suffix, file) it visited. For a
135
+ * lowercase key L, let p be the first position whose suffix lowercases to L —
136
+ * the entry today's `lowerMap` keeps. Nothing before p carries that suffix
137
+ * spelled ANY way, so p is also the first occurrence of its exact spelling
138
+ * and is therefore in the exact map, holding that same file. Exact-map
139
+ * insertion order is by first-occurrence position, so among the exact keys
140
+ * folding to L, p's is reached first and first-wins keeps it. Insertion order
141
+ * of the derived map is the order of those p's, which is the order today's
142
+ * `lowerMap` inserts L. Verified rather than only argued: byte-equal keys,
143
+ * values and order over 968 418 entries across bench-shaped, PascalCase,
144
+ * case-colliding, deep-monorepo, Unicode-adversarial and 400 seeded-fuzz
145
+ * corpora.
146
+ *
147
+ * When `getInsensitive` is asked FIRST (PHP), there is nothing to derive
148
+ * from, so it is built straight — one traversal, one map, which is the point.
149
+ * Asking `get` afterwards would then cost the second traversal; no consumer
150
+ * does, and the fallback stays correct if one ever starts.
151
+ */
152
+ let lowerMap = null;
153
+ const getLowerMap = () => {
154
+ // Over an already-lowercased file list the derivation is the identity, so
155
+ // the exact map IS the case-folded map. Skip the copy.
156
+ if (alreadyLowercased)
157
+ return getExactMap();
158
+ if (lowerMap !== null)
159
+ return lowerMap;
160
+ const built = new Map();
161
+ if (exactMap !== null) {
162
+ for (const [suffix, original] of exactMap) {
163
+ const lower = suffix.toLowerCase();
164
+ if (!built.has(lower))
165
+ built.set(lower, original);
166
+ }
167
+ lowerMap = built;
168
+ return built;
169
+ }
170
+ for (let i = 0; i < normalizedFileList.length; i++) {
171
+ const normalized = normalizedFileList[i];
172
+ const original = allFileList[i];
173
+ let slash = normalized.lastIndexOf('/');
174
+ while (slash >= 0) {
175
+ const lower = normalized.slice(slash + 1).toLowerCase();
176
+ if (!built.has(lower))
177
+ built.set(lower, original);
178
+ if (slash === 0)
179
+ break;
180
+ slash = normalized.lastIndexOf('/', slash - 1);
88
181
  }
182
+ const whole = normalized.toLowerCase();
183
+ if (!built.has(whole))
184
+ built.set(whole, original);
89
185
  }
90
- // Index directory membership
91
- const lastSlash = normalized.lastIndexOf('/');
92
- if (lastSlash >= 0) {
93
- // Build all directory suffixes
94
- const dirParts = parts.slice(0, -1);
95
- const fileName = parts[parts.length - 1];
96
- const ext = fileName.substring(fileName.lastIndexOf('.'));
97
- for (let j = dirParts.length - 1; j >= 0; j--) {
98
- const dirSuffix = dirParts.slice(j).join('/');
99
- const key = `${dirSuffix}:${ext}`;
100
- let list = dirMap.get(key);
186
+ lowerMap = built;
187
+ return built;
188
+ };
189
+ /**
190
+ * Map: `${directory suffix}:${extension}` -> file paths in that directory.
191
+ *
192
+ * DEFERRED, not dropped (#2903). This is the array-valued map of the three
193
+ * and by far the most expensive: one entry — and one array push — per file
194
+ * per directory component, so O(files × depth) in entries AND in array
195
+ * churn. Measured on the 32k-path arms of `bench/import-target/`, it is
196
+ * ~15% of the retained C# index and ~19% of the retained Ruby one.
197
+ *
198
+ * Only `getFilesInDir` reads it, and only four call sites reach that:
199
+ * `import-resolvers/{php,csharp,jvm}.ts` and `import-resolvers/configs/
200
+ * python.ts`. Every other consumer of this index — `workspace-file-index.ts`
201
+ * serving Ruby, `languages/typescript/scope-resolver.ts`,
202
+ * `languages/vue/import-target.ts`, `group/extractors/include-extractor.ts`
203
+ * — asks only suffix questions and was paying the whole footprint for a map
204
+ * it never touched. Since these indexes are now retained for a whole
205
+ * resolution pass rather than rebuilt per import (#2877-#2880), that is
206
+ * retained memory against the #2649 kernel-scale OOM constraint.
207
+ *
208
+ * `null` until the first `getFilesInDir`; the MAP is memoized, not the
209
+ * decision to build it, so a repeated miss cannot rebuild it. Building it
210
+ * later is behaviour-identical because it is a pure function of
211
+ * `normalizedFileList` / `allFileList`, and it retains nothing new: every
212
+ * production caller already holds both arrays alive alongside the index
213
+ * (`WorkspaceFileIndex.normalized`/`.all`, the TS and Vue `PassCache`s,
214
+ * `IncludeExtractor.extract`'s locals).
215
+ */
216
+ let dirMap = null;
217
+ const getDirMap = () => {
218
+ if (dirMap !== null)
219
+ return dirMap;
220
+ const built = new Map();
221
+ for (let i = 0; i < normalizedFileList.length; i++) {
222
+ const normalized = normalizedFileList[i];
223
+ const original = allFileList[i];
224
+ const lastSlash = normalized.lastIndexOf('/');
225
+ // A file at the repo root is in no directory suffix.
226
+ if (lastSlash < 0)
227
+ continue;
228
+ // The file name from its last '.', or the WHOLE file name when it carries
229
+ // none — `substring(-1)` clamps to 0, which is what the `parts` form
230
+ // (`fileName.substring(fileName.lastIndexOf('.'))`) spelled. A '.' in a
231
+ // DIRECTORY is not an extension, hence `dot > lastSlash` rather than
232
+ // `dot >= 0`.
233
+ const dot = normalized.lastIndexOf('.');
234
+ const ext = dot > lastSlash ? normalized.slice(dot) : normalized.slice(lastSlash + 1);
235
+ // Every directory suffix of `normalized.slice(0, lastSlash)`, shortest
236
+ // first — the order `for (j = dirParts.length - 1; j >= 0; j--)` emitted,
237
+ // and load-bearing: `php.ts` returns `candidates[0]` of a bucket, so a
238
+ // reordered bucket is a behaviour change, not a wash.
239
+ //
240
+ // Walked as slash offsets into `normalized`, the same rewrite `getExactMap`
241
+ // above documents and for the same reason — a slice of the ORIGINAL string
242
+ // is byte-identical to the re-joined parts, and it allocates one string per
243
+ // suffix instead of a parts array, a slice array and a joined string per
244
+ // suffix. This is the map where it pays most: one entry, one array push AND
245
+ // one key per file per directory component, the "by far the most expensive"
246
+ // of the three. Measured 226.9 ms -> 173.1 ms at 32 000 paths averaging
247
+ // ~10 directory components (min of 9, both loops alternating in one
248
+ // process). Verified rather than argued, over a 32 000-path corpus
249
+ // carrying absolute paths, doubled separators (`a//b`), backslash paths,
250
+ // root-level and extensionless files, dotted directories and trailing
251
+ // separators: 272 956 keys and 329 361 bucket entries came out with
252
+ // identical key sets in identical INSERTION order and identical buckets
253
+ // element-for-element, and 767 732 probes of the built index — every
254
+ // emitted (directory, extension) pair plus a wrong-extension and a
255
+ // one-level-deeper miss for each — answered exactly as the `parts` form's
256
+ // map did. 0 differences.
257
+ //
258
+ // `slash < 0` is the whole directory, which no slash search can emit and
259
+ // the only suffix a one-component directory has.
260
+ let start = lastSlash;
261
+ while (start >= 0) {
262
+ const slash = start > 0 ? normalized.lastIndexOf('/', start - 1) : -1;
263
+ const key = `${normalized.slice(slash + 1, lastSlash)}:${ext}`;
264
+ let list = built.get(key);
101
265
  if (!list) {
102
266
  list = [];
103
- dirMap.set(key, list);
267
+ built.set(key, list);
104
268
  }
105
269
  list.push(original);
270
+ start = slash;
106
271
  }
107
272
  }
108
- }
273
+ dirMap = built;
274
+ return built;
275
+ };
109
276
  return {
110
- get: (suffix) => exactMap.get(suffix),
111
- getInsensitive: (suffix) => lowerMap.get(suffix.toLowerCase()),
277
+ get: (suffix) => getExactMap().get(suffix),
278
+ getInsensitive: (suffix) => getLowerMap().get(suffix.toLowerCase()),
279
+ // THIS implementation shares: it hands back `dirMap`'s own bucket rather
280
+ // than a copy. The map is built on first query and then held for the whole
281
+ // pass, so the window in which a mutating caller could corrupt later
282
+ // imports is the whole pass — which is why the interface makes the result
283
+ // `readonly` and the compiler refuses the mutation at the call site.
284
+ //
285
+ // Sharing beats copying because no caller keeps the array: two only measure
286
+ // it and two build a fresh array from it, so a defensive copy would
287
+ // allocate a whole bucket per import on the path this index exists to keep
288
+ // flat. `package-dir-index.ts` reached the same conclusion the same way —
289
+ // read-only containers, plus one copy where a bucket genuinely LEAVES
290
+ // (`sortedRootFiles`), which is the case `configs/swift.ts` is in.
112
291
  getFilesInDir: (dirSuffix, extension) => {
113
- return dirMap.get(`${dirSuffix}:${extension}`) || [];
292
+ return getDirMap().get(`${dirSuffix}:${extension}`) || [];
114
293
  },
115
294
  };
116
295
  }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Per-file-set workspace index for the import-target resolvers that need the
3
+ * shared `SuffixIndex` (C#, Java, PHP, Ruby).
4
+ *
5
+ * The scope-resolution orchestrator passes the SAME `allFilePaths` Set object to
6
+ * every `resolveImportTarget` call in a pass (`pipeline/run.ts` builds it once),
7
+ * so memoizing on the Set's identity in a `WeakMap` turns the per-import
8
+ * "materialize two arrays + build a suffix index" cost into a one-time build.
9
+ *
10
+ * IMPORTANT for callers: the Set must be passed THROUGH, never copied. A
11
+ * defensive `new Set(allFilePaths)` in an adapter hands a fresh `WeakMap` key
12
+ * per call and silently restores the O(imports × files) behaviour — the exact
13
+ * bug PR #1918 shipped and had to fix in review (P1).
14
+ *
15
+ * Three layers guard that, and they guard different things:
16
+ * - ADAPTER BOUNDARY, where the defensive-copy hazard actually lives:
17
+ * `test/integration/*-import-index-reuse.test.ts` resolves through
18
+ * `<lang>ScopeResolver.resolveImportTarget` — the orchestrator adapter — and
19
+ * pins the EXACT number of times a run traverses the file set, one file per
20
+ * covered language over that language's own corpus. (The expected count is
21
+ * per language and legitimately differs: it is however many times the
22
+ * adapter derives something from the Set — two indexes, or an index plus the
23
+ * mutable copy the ts-family context wants.) All of them count traversals
24
+ * of a `CountingSet` (`test/helpers/counting-file-set.ts`): one instrument,
25
+ * no production surface, and it catches both the per-import rebuild and a
26
+ * scan reintroduced beside a reused index (#2909).
27
+ * - EVERY REGISTERED LANGUAGE, at the same boundary but as one property rather
28
+ * than one corpus per language: `test/unit/scope-resolution/import-target-index-reuse.contract.test.ts`
29
+ * drives each entry of `SCOPE_RESOLVERS` and asserts the traversal count for
30
+ * many imports equals the count for two. A new language cannot skip it, and
31
+ * the enforcement is a test rather than a roster anyone maintains: that
32
+ * file's inventory arm compares `SCOPE_RESOLVERS`' keys against its own
33
+ * fixture table and fails on a registered resolver that has neither a
34
+ * fixture nor an exemption, and its next arm pins the exemption map empty.
35
+ * - RESOLVER LEVEL: `test/unit/scope-resolution/import-target-index-parity.test.ts`
36
+ * calls the resolvers directly, so it never crosses the adapter boundary and
37
+ * a copy there leaves it green. What it catches is a rescan reintroduced
38
+ * INSIDE a resolver, by counting how many times the Set is iterated.
39
+ */
40
+ import { type SuffixIndex } from './utils.js';
41
+ /**
42
+ * `normalized` and `all` are `readonly string[]`, and — like
43
+ * `SuffixIndex.getFilesInDir` — that is the CONTRACT rather than a description
44
+ * of the arrays: they are built once and then held for the whole pass, so an
45
+ * in-place `sort`/`splice`/`reverse` would corrupt every later import in that
46
+ * pass, and these two are the largest shared arrays here (one element per file,
47
+ * read by C#, Java, PHP and Ruby). `readonly` on the field is what makes the
48
+ * compiler refuse the mutation at the call site instead of leaving it to a
49
+ * comment. `ImportPassCache` (`pass-cache.ts`) states the same contract the
50
+ * same way for the ts-family lists.
51
+ *
52
+ * The positional pairing is load-bearing too and depends on it: `csharp.ts`
53
+ * caches POSITIONS into `normalized` and reads the answer out of `all`, so a
54
+ * reordering of either array alone silently re-points every cached position.
55
+ */
56
+ export interface WorkspaceFileIndex {
57
+ /** Every path, backslashes normalized to `/`. Parallel to `all`. */
58
+ readonly normalized: readonly string[];
59
+ /** Every path, exactly as it appears in the Set. Parallel to `normalized`. */
60
+ readonly all: readonly string[];
61
+ /** Segment-suffix → first file (in Set iteration order) carrying that suffix. */
62
+ readonly index: SuffixIndex;
63
+ /**
64
+ * Normalized path → first raw path that normalizes to it. Answers "is there a
65
+ * file whose WHOLE path is X", which `index.get(X)` cannot: the suffix map
66
+ * conflates a whole-path hit with a `…/X` suffix hit, and C#'s
67
+ * `resolveDirectMatch` lets a whole-path match win over an earlier suffix
68
+ * match.
69
+ */
70
+ readonly normToRaw: Map<string, string>;
71
+ }
72
+ export declare const getWorkspaceFileIndex: (key: ReadonlySet<string>) => WorkspaceFileIndex;
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Per-file-set workspace index for the import-target resolvers that need the
3
+ * shared `SuffixIndex` (C#, Java, PHP, Ruby).
4
+ *
5
+ * The scope-resolution orchestrator passes the SAME `allFilePaths` Set object to
6
+ * every `resolveImportTarget` call in a pass (`pipeline/run.ts` builds it once),
7
+ * so memoizing on the Set's identity in a `WeakMap` turns the per-import
8
+ * "materialize two arrays + build a suffix index" cost into a one-time build.
9
+ *
10
+ * IMPORTANT for callers: the Set must be passed THROUGH, never copied. A
11
+ * defensive `new Set(allFilePaths)` in an adapter hands a fresh `WeakMap` key
12
+ * per call and silently restores the O(imports × files) behaviour — the exact
13
+ * bug PR #1918 shipped and had to fix in review (P1).
14
+ *
15
+ * Three layers guard that, and they guard different things:
16
+ * - ADAPTER BOUNDARY, where the defensive-copy hazard actually lives:
17
+ * `test/integration/*-import-index-reuse.test.ts` resolves through
18
+ * `<lang>ScopeResolver.resolveImportTarget` — the orchestrator adapter — and
19
+ * pins the EXACT number of times a run traverses the file set, one file per
20
+ * covered language over that language's own corpus. (The expected count is
21
+ * per language and legitimately differs: it is however many times the
22
+ * adapter derives something from the Set — two indexes, or an index plus the
23
+ * mutable copy the ts-family context wants.) All of them count traversals
24
+ * of a `CountingSet` (`test/helpers/counting-file-set.ts`): one instrument,
25
+ * no production surface, and it catches both the per-import rebuild and a
26
+ * scan reintroduced beside a reused index (#2909).
27
+ * - EVERY REGISTERED LANGUAGE, at the same boundary but as one property rather
28
+ * than one corpus per language: `test/unit/scope-resolution/import-target-index-reuse.contract.test.ts`
29
+ * drives each entry of `SCOPE_RESOLVERS` and asserts the traversal count for
30
+ * many imports equals the count for two. A new language cannot skip it, and
31
+ * the enforcement is a test rather than a roster anyone maintains: that
32
+ * file's inventory arm compares `SCOPE_RESOLVERS`' keys against its own
33
+ * fixture table and fails on a registered resolver that has neither a
34
+ * fixture nor an exemption, and its next arm pins the exemption map empty.
35
+ * - RESOLVER LEVEL: `test/unit/scope-resolution/import-target-index-parity.test.ts`
36
+ * calls the resolvers directly, so it never crosses the adapter boundary and
37
+ * a copy there leaves it green. What it catches is a rescan reintroduced
38
+ * INSIDE a resolver, by counting how many times the Set is iterated.
39
+ */
40
+ import { perFileSet } from './per-file-set.js';
41
+ import { buildSuffixIndex } from './utils.js';
42
+ export const getWorkspaceFileIndex = perFileSet((allFilePaths) => {
43
+ const all = [...allFilePaths];
44
+ const normalized = all.map((f) => f.replace(/\\/g, '/'));
45
+ const normToRaw = new Map();
46
+ for (let i = 0; i < normalized.length; i++) {
47
+ // First wins, mirroring the `for (const raw of allFilePaths)` scans this
48
+ // replaces: they returned on the first match in iteration order.
49
+ if (!normToRaw.has(normalized[i]))
50
+ normToRaw.set(normalized[i], all[i]);
51
+ }
52
+ return {
53
+ normalized,
54
+ all,
55
+ index: buildSuffixIndex(normalized, all),
56
+ normToRaw,
57
+ };
58
+ });