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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (870) hide show
  1. package/README.md +212 -22
  2. package/dist/_shared/graph/types.d.ts +27 -8
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/index.d.ts +4 -3
  5. package/dist/_shared/index.d.ts.map +1 -1
  6. package/dist/_shared/index.js +1 -1
  7. package/dist/_shared/index.js.map +1 -1
  8. package/dist/_shared/integrations/circuit-breaker.d.ts.map +1 -1
  9. package/dist/_shared/integrations/circuit-breaker.js.map +1 -1
  10. package/dist/_shared/integrations/resilient-fetch.d.ts +19 -1
  11. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  12. package/dist/_shared/integrations/resilient-fetch.js +23 -10
  13. package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
  14. package/dist/_shared/language-detection.d.ts.map +1 -1
  15. package/dist/_shared/lbug/schema-constants.d.ts +2 -2
  16. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  17. package/dist/_shared/lbug/schema-constants.js +3 -0
  18. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  19. package/dist/_shared/scope-resolution/callable-flow-site.d.ts +110 -0
  20. package/dist/_shared/scope-resolution/callable-flow-site.d.ts.map +1 -0
  21. package/dist/_shared/scope-resolution/callable-flow-site.js +11 -0
  22. package/dist/_shared/scope-resolution/callable-flow-site.js.map +1 -0
  23. package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
  24. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +6 -1
  25. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
  26. package/dist/_shared/scope-resolution/finalize-algorithm.js +316 -37
  27. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  28. package/dist/_shared/scope-resolution/parsed-file.d.ts +7 -0
  29. package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
  30. package/dist/_shared/scope-resolution/reference-site.d.ts +124 -1
  31. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  32. package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
  33. package/dist/_shared/scope-resolution/registries/lookup-core.d.ts.map +1 -1
  34. package/dist/_shared/scope-resolution/registries/lookup-core.js +58 -2
  35. package/dist/_shared/scope-resolution/registries/lookup-core.js.map +1 -1
  36. package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
  37. package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
  38. package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
  39. package/dist/_shared/scope-resolution/symbol-definition.d.ts +47 -0
  40. package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
  41. package/dist/_shared/scope-resolution/types.d.ts +297 -5
  42. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  43. package/dist/cli/ai-context.d.ts +10 -2
  44. package/dist/cli/ai-context.js +128 -61
  45. package/dist/cli/analyze-config.d.ts +1 -1
  46. package/dist/cli/analyze-options.d.ts +131 -0
  47. package/dist/cli/analyze-options.js +1 -0
  48. package/dist/cli/analyze.d.ts +25 -114
  49. package/dist/cli/analyze.js +194 -36
  50. package/dist/cli/cli-message.d.ts +1 -1
  51. package/dist/cli/detect-changes-format.js +19 -2
  52. package/dist/cli/doctor.d.ts +23 -0
  53. package/dist/cli/doctor.js +72 -9
  54. package/dist/cli/editor-targets.js +6 -0
  55. package/dist/cli/eval-server.d.ts +23 -1
  56. package/dist/cli/eval-server.js +128 -9
  57. package/dist/cli/format-symbol.d.ts +15 -0
  58. package/dist/cli/format-symbol.js +17 -0
  59. package/dist/cli/generated-skill.d.ts +17 -0
  60. package/dist/cli/generated-skill.js +1 -0
  61. package/dist/cli/group.js +23 -2
  62. package/dist/cli/help-i18n.js +3 -0
  63. package/dist/cli/i18n/en.d.ts +17 -8
  64. package/dist/cli/i18n/en.js +19 -8
  65. package/dist/cli/i18n/resources.d.ts +26 -8
  66. package/dist/cli/i18n/zh-CN.d.ts +9 -0
  67. package/dist/cli/i18n/zh-CN.js +17 -8
  68. package/dist/cli/index.js +16 -9
  69. package/dist/cli/lazy-action.d.ts +7 -0
  70. package/dist/cli/lazy-action.js +27 -0
  71. package/dist/cli/mcp.js +6 -3
  72. package/dist/cli/resolve-invocation.d.ts +7 -3
  73. package/dist/cli/resolve-invocation.js +7 -3
  74. package/dist/cli/setup.d.ts +8 -0
  75. package/dist/cli/setup.js +30 -7
  76. package/dist/cli/skill-gen.d.ts +1 -6
  77. package/dist/cli/skill-gen.js +88 -18
  78. package/dist/cli/standard-skills.d.ts +76 -0
  79. package/dist/cli/standard-skills.js +45 -0
  80. package/dist/cli/status.d.ts +4 -1
  81. package/dist/cli/status.js +57 -4
  82. package/dist/cli/tool.d.ts +1 -0
  83. package/dist/cli/tool.js +75 -7
  84. package/dist/cli/uninstall.js +7 -2
  85. package/dist/cli/wiki.d.ts +1 -0
  86. package/dist/cli/wiki.js +59 -10
  87. package/dist/config/ignore-service.d.ts +2 -0
  88. package/dist/config/ignore-service.js +31 -4
  89. package/dist/core/analysis-features.d.ts +21 -0
  90. package/dist/core/analysis-features.js +59 -0
  91. package/dist/core/analyzer-identity.d.ts +154 -0
  92. package/dist/core/analyzer-identity.js +2158 -0
  93. package/dist/core/augmentation/engine.js +95 -76
  94. package/dist/core/embedding-checkpoint.d.ts +143 -0
  95. package/dist/core/embedding-checkpoint.js +221 -0
  96. package/dist/core/embedding-count.d.ts +61 -0
  97. package/dist/core/embedding-count.js +69 -0
  98. package/dist/core/embeddings/ast-utils.js +9 -1
  99. package/dist/core/embeddings/embedder.d.ts +3 -2
  100. package/dist/core/embeddings/embedder.js +8 -5
  101. package/dist/core/embeddings/embedding-identity.d.ts +11 -0
  102. package/dist/core/embeddings/embedding-identity.js +24 -0
  103. package/dist/core/embeddings/embedding-pipeline.d.ts +24 -1
  104. package/dist/core/embeddings/embedding-pipeline.js +341 -19
  105. package/dist/core/embeddings/http-client.d.ts +10 -2
  106. package/dist/core/embeddings/http-client.js +282 -47
  107. package/dist/core/embeddings/node-module-compat.d.ts +4 -2
  108. package/dist/core/embeddings/node-module-compat.js +4 -2
  109. package/dist/core/embeddings/onnxruntime-common-resolver.js +5 -5
  110. package/dist/core/embeddings/onnxruntime-node-resolver.js +2 -2
  111. package/dist/core/embeddings/runtime-install.js +1 -1
  112. package/dist/core/git-staleness.js +1 -1
  113. package/dist/core/graph/graph.js +3 -0
  114. package/dist/core/graph/import-cycles.d.ts +194 -3
  115. package/dist/core/graph/import-cycles.js +522 -73
  116. package/dist/core/graph/types.d.ts +18 -0
  117. package/dist/core/group/bridge-db.js +5 -27
  118. package/dist/core/group/cross-impact.d.ts +21 -0
  119. package/dist/core/group/cross-impact.js +128 -15
  120. package/dist/core/group/cross-trace.js +27 -16
  121. package/dist/core/group/extractors/http-patterns/java.js +91 -14
  122. package/dist/core/group/extractors/http-patterns/node.js +19 -0
  123. package/dist/core/group/extractors/http-patterns/types.d.ts +8 -0
  124. package/dist/core/group/extractors/http-route-extractor.d.ts +1 -0
  125. package/dist/core/group/extractors/http-route-extractor.js +122 -48
  126. package/dist/core/group/extractors/include-extractor.js +20 -2
  127. package/dist/core/group/extractors/manifest-extractor.d.ts +1 -1
  128. package/dist/core/group/extractors/manifest-extractor.js +7 -7
  129. package/dist/core/group/service.js +10 -1
  130. package/dist/core/group/storage.js +2 -33
  131. package/dist/core/group/types.d.ts +18 -0
  132. package/dist/core/incremental/subgraph-extract.d.ts +9 -6
  133. package/dist/core/incremental/subgraph-extract.js +33 -10
  134. package/dist/core/index-freshness.d.ts +80 -0
  135. package/dist/core/index-freshness.js +120 -0
  136. package/dist/core/ingestion/call-processor.d.ts +13 -1
  137. package/dist/core/ingestion/call-processor.js +110 -3
  138. package/dist/core/ingestion/cfg/callee-cell-format.d.ts +42 -0
  139. package/dist/core/ingestion/cfg/callee-cell-format.js +42 -0
  140. package/dist/core/ingestion/cfg/emit.d.ts +8 -23
  141. package/dist/core/ingestion/cfg/emit.js +9 -23
  142. package/dist/core/ingestion/class-extractors/configs/go.js +10 -5
  143. package/dist/core/ingestion/class-extractors/configs/jvm.js +29 -0
  144. package/dist/core/ingestion/cluster-enricher.js +8 -4
  145. package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
  146. package/dist/core/ingestion/community-processor.d.ts +21 -3
  147. package/dist/core/ingestion/community-processor.js +88 -83
  148. package/dist/core/ingestion/di-extractors/index.d.ts +22 -34
  149. package/dist/core/ingestion/di-extractors/index.js +17 -18
  150. package/dist/core/ingestion/di-extractors/spring.d.ts +27 -5
  151. package/dist/core/ingestion/di-extractors/spring.js +87 -3
  152. package/dist/core/ingestion/di-extractors/types.d.ts +60 -0
  153. package/dist/core/ingestion/di-extractors/types.js +15 -0
  154. package/dist/core/ingestion/emit-references.js +4 -0
  155. package/dist/core/ingestion/filesystem-walker.js +16 -12
  156. package/dist/core/ingestion/finalize-orchestrator.js +1 -0
  157. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +9 -0
  158. package/dist/core/ingestion/frameworks/spring/analysis-features.js +41 -0
  159. package/dist/core/ingestion/frameworks/spring/annotation-arguments.d.ts +13 -0
  160. package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +227 -0
  161. package/dist/core/ingestion/frameworks/spring/aop-candidates.d.ts +15 -0
  162. package/dist/core/ingestion/frameworks/spring/aop-candidates.js +85 -0
  163. package/dist/core/ingestion/frameworks/spring/aop.d.ts +118 -0
  164. package/dist/core/ingestion/frameworks/spring/aop.js +476 -0
  165. package/dist/core/ingestion/frameworks/spring/auto-configuration.d.ts +8 -0
  166. package/dist/core/ingestion/frameworks/spring/auto-configuration.js +16 -0
  167. package/dist/core/ingestion/frameworks/spring/bean-candidates.d.ts +30 -0
  168. package/dist/core/ingestion/frameworks/spring/bean-candidates.js +182 -0
  169. package/dist/core/ingestion/frameworks/spring/bean-catalog.d.ts +12 -0
  170. package/dist/core/ingestion/frameworks/spring/bean-catalog.js +27 -0
  171. package/dist/core/ingestion/frameworks/spring/bean-factories.d.ts +33 -0
  172. package/dist/core/ingestion/frameworks/spring/bean-factories.js +65 -0
  173. package/dist/core/ingestion/frameworks/spring/conditionals.d.ts +25 -0
  174. package/dist/core/ingestion/frameworks/spring/conditionals.js +319 -0
  175. package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +24 -0
  176. package/dist/core/ingestion/frameworks/spring/config-bindings.js +115 -0
  177. package/dist/core/ingestion/frameworks/spring/di-metadata.d.ts +48 -0
  178. package/dist/core/ingestion/frameworks/spring/di-metadata.js +379 -0
  179. package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +28 -0
  180. package/dist/core/ingestion/frameworks/spring/non-http-handlers.js +152 -0
  181. package/dist/core/ingestion/frameworks/spring/resource-injection.d.ts +5 -0
  182. package/dist/core/ingestion/frameworks/spring/resource-injection.js +91 -0
  183. package/dist/core/ingestion/import-resolvers/configs/csharp.js +5 -1
  184. package/dist/core/ingestion/import-resolvers/configs/swift.js +13 -0
  185. package/dist/core/ingestion/import-resolvers/csharp.d.ts +9 -1
  186. package/dist/core/ingestion/import-resolvers/csharp.js +234 -27
  187. package/dist/core/ingestion/import-resolvers/go.d.ts +11 -1
  188. package/dist/core/ingestion/import-resolvers/go.js +44 -17
  189. package/dist/core/ingestion/import-resolvers/jvm.d.ts +2 -2
  190. package/dist/core/ingestion/import-resolvers/node-workspace-packages.d.ts +90 -0
  191. package/dist/core/ingestion/import-resolvers/node-workspace-packages.js +428 -0
  192. package/dist/core/ingestion/import-resolvers/package-dir-index.d.ts +124 -0
  193. package/dist/core/ingestion/import-resolvers/package-dir-index.js +223 -0
  194. package/dist/core/ingestion/import-resolvers/pass-cache.d.ts +50 -0
  195. package/dist/core/ingestion/import-resolvers/pass-cache.js +60 -0
  196. package/dist/core/ingestion/import-resolvers/per-file-set.d.ts +71 -0
  197. package/dist/core/ingestion/import-resolvers/per-file-set.js +11 -0
  198. package/dist/core/ingestion/import-resolvers/php.d.ts +1 -1
  199. package/dist/core/ingestion/import-resolvers/php.js +27 -8
  200. package/dist/core/ingestion/import-resolvers/python-file-index.d.ts +201 -0
  201. package/dist/core/ingestion/import-resolvers/python-file-index.js +302 -0
  202. package/dist/core/ingestion/import-resolvers/python.js +25 -6
  203. package/dist/core/ingestion/import-resolvers/ruby.d.ts +1 -1
  204. package/dist/core/ingestion/import-resolvers/rust.d.ts +2 -2
  205. package/dist/core/ingestion/import-resolvers/standard.d.ts +1 -1
  206. package/dist/core/ingestion/import-resolvers/types.d.ts +1 -12
  207. package/dist/core/ingestion/import-resolvers/utils.d.ts +65 -6
  208. package/dist/core/ingestion/import-resolvers/utils.js +215 -36
  209. package/dist/core/ingestion/import-resolvers/workspace-file-index.d.ts +72 -0
  210. package/dist/core/ingestion/import-resolvers/workspace-file-index.js +58 -0
  211. package/dist/core/ingestion/language-config.d.ts +20 -1
  212. package/dist/core/ingestion/language-config.js +18 -23
  213. package/dist/core/ingestion/language-provider.d.ts +133 -7
  214. package/dist/core/ingestion/languages/c/captures.js +63 -0
  215. package/dist/core/ingestion/languages/c/import-target.js +12 -16
  216. package/dist/core/ingestion/languages/c/query.js +17 -0
  217. package/dist/core/ingestion/languages/c/scope-resolver.js +26 -19
  218. package/dist/core/ingestion/languages/c/static-linkage.js +12 -16
  219. package/dist/core/ingestion/languages/c-cpp.js +13 -0
  220. package/dist/core/ingestion/languages/cobol/captures.js +93 -0
  221. package/dist/core/ingestion/languages/cobol/scope-resolver.js +34 -20
  222. package/dist/core/ingestion/languages/cobol.js +13 -0
  223. package/dist/core/ingestion/languages/cpp/adl.d.ts +2 -2
  224. package/dist/core/ingestion/languages/cpp/adl.js +67 -44
  225. package/dist/core/ingestion/languages/cpp/captures.js +222 -3
  226. package/dist/core/ingestion/languages/cpp/file-local-linkage.js +11 -15
  227. package/dist/core/ingestion/languages/cpp/inline-namespaces.d.ts +28 -8
  228. package/dist/core/ingestion/languages/cpp/inline-namespaces.js +242 -68
  229. package/dist/core/ingestion/languages/cpp/interpret.d.ts +2 -0
  230. package/dist/core/ingestion/languages/cpp/interpret.js +126 -6
  231. package/dist/core/ingestion/languages/cpp/query.js +106 -0
  232. package/dist/core/ingestion/languages/cpp/scope-resolver.js +62 -20
  233. package/dist/core/ingestion/languages/csharp/accessor-unwrap.d.ts +2 -15
  234. package/dist/core/ingestion/languages/csharp/accessor-unwrap.js +18 -10
  235. package/dist/core/ingestion/languages/csharp/captures.js +44 -0
  236. package/dist/core/ingestion/languages/csharp/import-target.js +46 -72
  237. package/dist/core/ingestion/languages/csharp/namespace-siblings.js +5 -1
  238. package/dist/core/ingestion/languages/csharp/query.js +25 -5
  239. package/dist/core/ingestion/languages/csharp/scope-resolver.js +75 -2
  240. package/dist/core/ingestion/languages/dart/captures.d.ts +10 -0
  241. package/dist/core/ingestion/languages/dart/captures.js +686 -16
  242. package/dist/core/ingestion/languages/dart/extension-type-preprocess.d.ts +7 -0
  243. package/dist/core/ingestion/languages/dart/extension-type-preprocess.js +30 -0
  244. package/dist/core/ingestion/languages/dart/import-target.js +32 -9
  245. package/dist/core/ingestion/languages/dart/index.d.ts +1 -1
  246. package/dist/core/ingestion/languages/dart/index.js +1 -1
  247. package/dist/core/ingestion/languages/dart/query.js +98 -1
  248. package/dist/core/ingestion/languages/dart/scope-resolver.js +14 -3
  249. package/dist/core/ingestion/languages/dart/simple-hooks.js +9 -0
  250. package/dist/core/ingestion/languages/dart.js +8 -1
  251. package/dist/core/ingestion/languages/go/captures.js +142 -3
  252. package/dist/core/ingestion/languages/go/generic-type-parameters.d.ts +31 -0
  253. package/dist/core/ingestion/languages/go/generic-type-parameters.js +140 -0
  254. package/dist/core/ingestion/languages/go/import-target.d.ts +3 -10
  255. package/dist/core/ingestion/languages/go/import-target.js +34 -30
  256. package/dist/core/ingestion/languages/go/index.d.ts +1 -1
  257. package/dist/core/ingestion/languages/go/interface-impls.d.ts +9 -1
  258. package/dist/core/ingestion/languages/go/interface-impls.js +693 -87
  259. package/dist/core/ingestion/languages/go/interpret.d.ts +2 -0
  260. package/dist/core/ingestion/languages/go/interpret.js +22 -8
  261. package/dist/core/ingestion/languages/go/method-owners.js +31 -12
  262. package/dist/core/ingestion/languages/go/package-clause.d.ts +46 -0
  263. package/dist/core/ingestion/languages/go/package-clause.js +75 -0
  264. package/dist/core/ingestion/languages/go/package-siblings.js +7 -11
  265. package/dist/core/ingestion/languages/go/query.js +56 -3
  266. package/dist/core/ingestion/languages/go/scope-resolver.js +39 -0
  267. package/dist/core/ingestion/languages/go.js +9 -0
  268. package/dist/core/ingestion/languages/java/analysis-features.d.ts +7 -0
  269. package/dist/core/ingestion/languages/java/analysis-features.js +25 -0
  270. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +38 -0
  271. package/dist/core/ingestion/languages/java/capture-side-channel.js +124 -0
  272. package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
  273. package/dist/core/ingestion/languages/java/captures.js +321 -49
  274. package/dist/core/ingestion/languages/java/import-target.d.ts +49 -9
  275. package/dist/core/ingestion/languages/java/import-target.js +68 -88
  276. package/dist/core/ingestion/languages/java/interpret.js +3 -2
  277. package/dist/core/ingestion/languages/java/module-resolution.d.ts +62 -0
  278. package/dist/core/ingestion/languages/java/module-resolution.js +142 -0
  279. package/dist/core/ingestion/languages/java/package-facts.d.ts +5 -0
  280. package/dist/core/ingestion/languages/java/package-facts.js +9 -0
  281. package/dist/core/ingestion/languages/java/package-siblings.d.ts +3 -16
  282. package/dist/core/ingestion/languages/java/package-siblings.js +8 -147
  283. package/dist/core/ingestion/languages/java/query.js +39 -3
  284. package/dist/core/ingestion/languages/java/record-components.d.ts +14 -0
  285. package/dist/core/ingestion/languages/java/record-components.js +185 -0
  286. package/dist/core/ingestion/languages/java/scope-resolver.js +35 -2
  287. package/dist/core/ingestion/languages/java/spring-aop.d.ts +12 -0
  288. package/dist/core/ingestion/languages/java/spring-aop.js +49 -0
  289. package/dist/core/ingestion/languages/java/spring-bean-metadata.d.ts +2 -0
  290. package/dist/core/ingestion/languages/java/spring-bean-metadata.js +8 -0
  291. package/dist/core/ingestion/languages/java/spring-conditionals.d.ts +11 -0
  292. package/dist/core/ingestion/languages/java/spring-conditionals.js +48 -0
  293. package/dist/core/ingestion/languages/java/spring-config-bindings.d.ts +23 -0
  294. package/dist/core/ingestion/languages/java/spring-config-bindings.js +215 -0
  295. package/dist/core/ingestion/languages/java/spring-di.d.ts +20 -0
  296. package/dist/core/ingestion/languages/java/spring-di.js +160 -0
  297. package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +7 -0
  298. package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +32 -0
  299. package/dist/core/ingestion/languages/java.js +76 -3
  300. package/dist/core/ingestion/languages/javascript/captures.d.ts +6 -1
  301. package/dist/core/ingestion/languages/javascript/captures.js +278 -4
  302. package/dist/core/ingestion/languages/javascript/import-target.d.ts +17 -21
  303. package/dist/core/ingestion/languages/javascript/import-target.js +24 -41
  304. package/dist/core/ingestion/languages/javascript/index.d.ts +54 -5
  305. package/dist/core/ingestion/languages/javascript/index.js +54 -5
  306. package/dist/core/ingestion/languages/javascript/query.d.ts +1 -0
  307. package/dist/core/ingestion/languages/javascript/query.js +232 -5
  308. package/dist/core/ingestion/languages/javascript/scope-resolver.js +12 -0
  309. package/dist/core/ingestion/languages/javascript/simple-hooks.js +2 -1
  310. package/dist/core/ingestion/languages/jvm/package-facts.d.ts +35 -0
  311. package/dist/core/ingestion/languages/jvm/package-facts.js +40 -0
  312. package/dist/core/ingestion/languages/jvm/package-siblings.d.ts +14 -0
  313. package/dist/core/ingestion/languages/jvm/package-siblings.js +197 -0
  314. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +40 -3
  315. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +111 -8
  316. package/dist/core/ingestion/languages/kotlin/captures.js +112 -0
  317. package/dist/core/ingestion/languages/kotlin/import-target.d.ts +8 -1
  318. package/dist/core/ingestion/languages/kotlin/import-target.js +20 -123
  319. package/dist/core/ingestion/languages/kotlin/index.d.ts +1 -0
  320. package/dist/core/ingestion/languages/kotlin/index.js +1 -0
  321. package/dist/core/ingestion/languages/kotlin/module-resolution.d.ts +22 -0
  322. package/dist/core/ingestion/languages/kotlin/module-resolution.js +108 -0
  323. package/dist/core/ingestion/languages/kotlin/package-facts.d.ts +5 -0
  324. package/dist/core/ingestion/languages/kotlin/package-facts.js +9 -0
  325. package/dist/core/ingestion/languages/kotlin/package-siblings.d.ts +4 -0
  326. package/dist/core/ingestion/languages/kotlin/package-siblings.js +8 -0
  327. package/dist/core/ingestion/languages/kotlin/query.js +47 -2
  328. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +36 -3
  329. package/dist/core/ingestion/languages/kotlin/spring-aop.d.ts +12 -0
  330. package/dist/core/ingestion/languages/kotlin/spring-aop.js +64 -0
  331. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.d.ts +2 -0
  332. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.js +8 -0
  333. package/dist/core/ingestion/languages/kotlin/spring-conditionals.d.ts +12 -0
  334. package/dist/core/ingestion/languages/kotlin/spring-conditionals.js +49 -0
  335. package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +20 -0
  336. package/dist/core/ingestion/languages/kotlin/spring-di.js +299 -0
  337. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +10 -0
  338. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +41 -0
  339. package/dist/core/ingestion/languages/kotlin.js +5 -6
  340. package/dist/core/ingestion/languages/php/captures.d.ts +5 -0
  341. package/dist/core/ingestion/languages/php/captures.js +359 -51
  342. package/dist/core/ingestion/languages/php/import-decomposer.js +12 -0
  343. package/dist/core/ingestion/languages/php/import-target.d.ts +2 -1
  344. package/dist/core/ingestion/languages/php/import-target.js +229 -7
  345. package/dist/core/ingestion/languages/php/interpret.js +10 -0
  346. package/dist/core/ingestion/languages/php/query.js +31 -0
  347. package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
  348. package/dist/core/ingestion/languages/python/arity-metadata.d.ts +1 -0
  349. package/dist/core/ingestion/languages/python/arity-metadata.js +1 -0
  350. package/dist/core/ingestion/languages/python/captures.d.ts +3 -4
  351. package/dist/core/ingestion/languages/python/captures.js +53 -5
  352. package/dist/core/ingestion/languages/python/import-decomposer.js +22 -1
  353. package/dist/core/ingestion/languages/python/import-target.d.ts +42 -1
  354. package/dist/core/ingestion/languages/python/import-target.js +277 -91
  355. package/dist/core/ingestion/languages/python/index.d.ts +1 -1
  356. package/dist/core/ingestion/languages/python/index.js +1 -1
  357. package/dist/core/ingestion/languages/python/interpret.d.ts +52 -0
  358. package/dist/core/ingestion/languages/python/interpret.js +249 -3
  359. package/dist/core/ingestion/languages/python/query.js +9 -0
  360. package/dist/core/ingestion/languages/python/receiver-binding.d.ts +17 -2
  361. package/dist/core/ingestion/languages/python/receiver-binding.js +192 -2
  362. package/dist/core/ingestion/languages/python/scope-resolver.js +27 -4
  363. package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
  364. package/dist/core/ingestion/languages/python/simple-hooks.js +9 -5
  365. package/dist/core/ingestion/languages/ruby/captures.js +200 -0
  366. package/dist/core/ingestion/languages/ruby/import-target.js +7 -5
  367. package/dist/core/ingestion/languages/ruby/query.js +93 -0
  368. package/dist/core/ingestion/languages/ruby/scope-resolver.js +2 -0
  369. package/dist/core/ingestion/languages/ruby/simple-hooks.d.ts +1 -1
  370. package/dist/core/ingestion/languages/ruby/simple-hooks.js +22 -1
  371. package/dist/core/ingestion/languages/rust/captures.js +52 -1
  372. package/dist/core/ingestion/languages/rust/interpret.js +18 -0
  373. package/dist/core/ingestion/languages/rust/method-owners.js +11 -1
  374. package/dist/core/ingestion/languages/rust/module-path.d.ts +126 -0
  375. package/dist/core/ingestion/languages/rust/module-path.js +214 -0
  376. package/dist/core/ingestion/languages/rust/qualified-call.d.ts +41 -0
  377. package/dist/core/ingestion/languages/rust/qualified-call.js +481 -0
  378. package/dist/core/ingestion/languages/rust/query.js +48 -6
  379. package/dist/core/ingestion/languages/rust/range-binding.d.ts +1 -11
  380. package/dist/core/ingestion/languages/rust/range-binding.js +149 -63
  381. package/dist/core/ingestion/languages/rust/scope-resolver.js +21 -2
  382. package/dist/core/ingestion/languages/rust.js +17 -0
  383. package/dist/core/ingestion/languages/swift/captures.js +99 -3
  384. package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.d.ts +48 -0
  385. package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.js +253 -0
  386. package/dist/core/ingestion/languages/swift/import-target.js +4 -9
  387. package/dist/core/ingestion/languages/swift/query.js +17 -0
  388. package/dist/core/ingestion/languages/swift/receiver-binding.d.ts +8 -0
  389. package/dist/core/ingestion/languages/swift/receiver-binding.js +6 -2
  390. package/dist/core/ingestion/languages/swift.js +2 -0
  391. package/dist/core/ingestion/languages/typescript/captures.d.ts +90 -1
  392. package/dist/core/ingestion/languages/typescript/captures.js +288 -5
  393. package/dist/core/ingestion/languages/typescript/cjs-export-assignment.d.ts +134 -0
  394. package/dist/core/ingestion/languages/typescript/cjs-export-assignment.js +523 -0
  395. package/dist/core/ingestion/languages/typescript/cjs-module-exports.d.ts +54 -0
  396. package/dist/core/ingestion/languages/typescript/cjs-module-exports.js +191 -0
  397. package/dist/core/ingestion/languages/typescript/file-candidates.d.ts +29 -0
  398. package/dist/core/ingestion/languages/typescript/file-candidates.js +70 -0
  399. package/dist/core/ingestion/languages/typescript/import-decomposer.d.ts +28 -1
  400. package/dist/core/ingestion/languages/typescript/import-decomposer.js +125 -10
  401. package/dist/core/ingestion/languages/typescript/import-target.d.ts +25 -37
  402. package/dist/core/ingestion/languages/typescript/import-target.js +24 -26
  403. package/dist/core/ingestion/languages/typescript/interpret.d.ts +21 -1
  404. package/dist/core/ingestion/languages/typescript/interpret.js +45 -5
  405. package/dist/core/ingestion/languages/typescript/module-resolution.d.ts +48 -0
  406. package/dist/core/ingestion/languages/typescript/module-resolution.js +171 -0
  407. package/dist/core/ingestion/languages/typescript/nuxt-auto-imports.js +2 -1
  408. package/dist/core/ingestion/languages/typescript/query.d.ts +1 -0
  409. package/dist/core/ingestion/languages/typescript/query.js +340 -14
  410. package/dist/core/ingestion/languages/typescript/receiver-binding.d.ts +17 -0
  411. package/dist/core/ingestion/languages/typescript/receiver-binding.js +27 -0
  412. package/dist/core/ingestion/languages/typescript/scope-resolver.js +27 -40
  413. package/dist/core/ingestion/languages/typescript/simple-hooks.d.ts +0 -10
  414. package/dist/core/ingestion/languages/typescript/simple-hooks.js +22 -22
  415. package/dist/core/ingestion/languages/typescript/tsconfig.d.ts +59 -0
  416. package/dist/core/ingestion/languages/typescript/tsconfig.js +291 -0
  417. package/dist/core/ingestion/languages/typescript.js +87 -1
  418. package/dist/core/ingestion/languages/vue/import-target.d.ts +6 -22
  419. package/dist/core/ingestion/languages/vue/import-target.js +11 -47
  420. package/dist/core/ingestion/languages/vue/scope-resolver.js +4 -2
  421. package/dist/core/ingestion/local-symbol-pruner.js +11 -11
  422. package/dist/core/ingestion/method-extractors/configs/csharp.js +1 -0
  423. package/dist/core/ingestion/method-extractors/generic.js +1 -0
  424. package/dist/core/ingestion/method-types.d.ts +16 -0
  425. package/dist/core/ingestion/parsing-processor.js +32 -1
  426. package/dist/core/ingestion/pipeline-phases/di.d.ts +8 -33
  427. package/dist/core/ingestion/pipeline-phases/di.js +275 -157
  428. package/dist/core/ingestion/pipeline-phases/index.d.ts +3 -0
  429. package/dist/core/ingestion/pipeline-phases/index.js +3 -0
  430. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +15 -0
  431. package/dist/core/ingestion/pipeline-phases/parse-impl.js +158 -3
  432. package/dist/core/ingestion/pipeline-phases/parse.js +5 -0
  433. package/dist/core/ingestion/pipeline-phases/processes.d.ts +11 -2
  434. package/dist/core/ingestion/pipeline-phases/processes.js +102 -7
  435. package/dist/core/ingestion/pipeline-phases/routes.js +56 -10
  436. package/dist/core/ingestion/pipeline-phases/spring-aop.d.ts +34 -0
  437. package/dist/core/ingestion/pipeline-phases/spring-aop.js +439 -0
  438. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +34 -0
  439. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +255 -0
  440. package/dist/core/ingestion/pipeline-phases/spring-config.d.ts +37 -0
  441. package/dist/core/ingestion/pipeline-phases/spring-config.js +433 -0
  442. package/dist/core/ingestion/pipeline-phases/types.d.ts +7 -0
  443. package/dist/core/ingestion/pipeline.d.ts +27 -3
  444. package/dist/core/ingestion/pipeline.js +62 -12
  445. package/dist/core/ingestion/process-processor.d.ts +109 -2
  446. package/dist/core/ingestion/process-processor.js +464 -52
  447. package/dist/core/ingestion/resolve-references.d.ts +6 -1
  448. package/dist/core/ingestion/resolve-references.js +78 -6
  449. package/dist/core/ingestion/route-extractors/data-route-table.d.ts +25 -0
  450. package/dist/core/ingestion/route-extractors/data-route-table.js +864 -0
  451. package/dist/core/ingestion/route-extractors/dispatch-guard.d.ts +96 -0
  452. package/dist/core/ingestion/route-extractors/dispatch-guard.js +1184 -0
  453. package/dist/core/ingestion/route-extractors/spring-shared.d.ts +11 -0
  454. package/dist/core/ingestion/route-extractors/spring-shared.js +89 -0
  455. package/dist/core/ingestion/route-extractors/spring.js +109 -24
  456. package/dist/core/ingestion/scope-extractor-bridge.js +9 -1
  457. package/dist/core/ingestion/scope-extractor.d.ts +22 -7
  458. package/dist/core/ingestion/scope-extractor.js +617 -59
  459. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +381 -22
  460. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +16 -5
  461. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +7 -7
  462. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +8 -7
  463. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +15 -1
  464. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +53 -0
  465. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +20 -15
  466. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +275 -41
  467. package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.d.ts +123 -0
  468. package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +171 -17
  469. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.d.ts +56 -1
  470. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +130 -32
  471. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +30 -1
  472. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +46 -3
  473. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +64 -0
  474. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1233 -0
  475. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +107 -5
  476. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +590 -33
  477. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +19 -4
  478. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +160 -4
  479. package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.d.ts +34 -0
  480. package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.js +62 -0
  481. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +64 -0
  482. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +118 -0
  483. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +109 -8
  484. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +931 -92
  485. package/dist/core/ingestion/scope-resolution/passes/return-shape-members.d.ts +58 -0
  486. package/dist/core/ingestion/scope-resolution/passes/return-shape-members.js +458 -0
  487. package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.d.ts +180 -0
  488. package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.js +418 -0
  489. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +34 -0
  490. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +82 -38
  491. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +61 -1
  492. package/dist/core/ingestion/scope-resolution/pipeline/run.js +384 -48
  493. package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +112 -2
  494. package/dist/core/ingestion/scope-resolution/resolution-outcome.js +38 -1
  495. package/dist/core/ingestion/scope-resolution/scope/namespace-targets.d.ts +25 -3
  496. package/dist/core/ingestion/scope-resolution/scope/namespace-targets.js +36 -16
  497. package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +210 -9
  498. package/dist/core/ingestion/scope-resolution/scope/walkers.js +968 -56
  499. package/dist/core/ingestion/scope-resolution/summary-maps.d.ts +28 -0
  500. package/dist/core/ingestion/scope-resolution/summary-maps.js +50 -0
  501. package/dist/core/ingestion/scope-resolution/undecided-satisfaction.d.ts +55 -0
  502. package/dist/core/ingestion/scope-resolution/undecided-satisfaction.js +37 -0
  503. package/dist/core/ingestion/scope-resolution/unresolved-receivers.d.ts +109 -0
  504. package/dist/core/ingestion/scope-resolution/unresolved-receivers.js +204 -0
  505. package/dist/core/ingestion/scope-resolution/utils/definition-id.d.ts +13 -0
  506. package/dist/core/ingestion/scope-resolution/utils/definition-id.js +19 -0
  507. package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.d.ts +171 -0
  508. package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.js +218 -0
  509. package/dist/core/ingestion/scope-resolution/workspace-index-types.d.ts +34 -0
  510. package/dist/core/ingestion/scope-resolution/workspace-index-types.js +15 -0
  511. package/dist/core/ingestion/scope-resolution/workspace-index.d.ts +7 -20
  512. package/dist/core/ingestion/taint/typescript-model.js +34 -2
  513. package/dist/core/ingestion/tree-sitter-queries.d.ts +11 -11
  514. package/dist/core/ingestion/tree-sitter-queries.js +688 -5
  515. package/dist/core/ingestion/type-env.js +11 -7
  516. package/dist/core/ingestion/type-extractors/jvm.js +17 -2
  517. package/dist/core/ingestion/type-extractors/shared.d.ts +17 -0
  518. package/dist/core/ingestion/type-extractors/shared.js +16 -0
  519. package/dist/core/ingestion/type-extractors/types.d.ts +12 -0
  520. package/dist/core/ingestion/type-extractors/typescript.d.ts +20 -0
  521. package/dist/core/ingestion/type-extractors/typescript.js +26 -0
  522. package/dist/core/ingestion/utils/ast-helpers.d.ts +311 -14
  523. package/dist/core/ingestion/utils/ast-helpers.js +745 -48
  524. package/dist/core/ingestion/utils/call-analysis.d.ts +27 -22
  525. package/dist/core/ingestion/utils/call-analysis.js +202 -7
  526. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +153 -0
  527. package/dist/core/ingestion/utils/callable-flow-captures.js +928 -0
  528. package/dist/core/ingestion/utils/callable-labels.d.ts +25 -0
  529. package/dist/core/ingestion/utils/callable-labels.js +31 -0
  530. package/dist/core/ingestion/utils/effective-ram.d.ts +40 -0
  531. package/dist/core/ingestion/utils/effective-ram.js +58 -0
  532. package/dist/core/ingestion/utils/line-base.d.ts +14 -0
  533. package/dist/core/ingestion/utils/line-base.js +14 -0
  534. package/dist/core/ingestion/utils/method-props.d.ts +27 -4
  535. package/dist/core/ingestion/utils/method-props.js +29 -4
  536. package/dist/core/ingestion/utils/receiver-chain-captures.d.ts +31 -0
  537. package/dist/core/ingestion/utils/receiver-chain-captures.js +57 -0
  538. package/dist/core/ingestion/utils/receiver-chain-codec.d.ts +89 -0
  539. package/dist/core/ingestion/utils/receiver-chain-codec.js +182 -0
  540. package/dist/core/ingestion/utils/scope-tree-walk.d.ts +22 -0
  541. package/dist/core/ingestion/utils/scope-tree-walk.js +33 -0
  542. package/dist/core/ingestion/utils/template-arguments.d.ts +96 -0
  543. package/dist/core/ingestion/utils/template-arguments.js +196 -0
  544. package/dist/core/ingestion/utils/type-parameters.d.ts +49 -0
  545. package/dist/core/ingestion/utils/type-parameters.js +206 -0
  546. package/dist/core/ingestion/workers/callable-id.d.ts +72 -0
  547. package/dist/core/ingestion/workers/callable-id.js +116 -0
  548. package/dist/core/ingestion/workers/parse-worker.d.ts +14 -1
  549. package/dist/core/ingestion/workers/parse-worker.js +409 -39
  550. package/dist/core/ingestion/workers/worker-pool.d.ts +34 -27
  551. package/dist/core/ingestion/workers/worker-pool.js +133 -25
  552. package/dist/core/lbug/csv-generator.d.ts +27 -0
  553. package/dist/core/lbug/csv-generator.js +80 -17
  554. package/dist/core/lbug/extension-load-error.d.ts +2 -2
  555. package/dist/core/lbug/extension-load-error.js +44 -27
  556. package/dist/core/lbug/extension-loader.d.ts +29 -0
  557. package/dist/core/lbug/extension-loader.js +32 -7
  558. package/dist/core/lbug/graph-emit-sink.d.ts +264 -0
  559. package/dist/core/lbug/graph-emit-sink.js +581 -0
  560. package/dist/core/lbug/lbug-adapter.d.ts +337 -3
  561. package/dist/core/lbug/lbug-adapter.js +772 -67
  562. package/dist/core/lbug/lbug-config.d.ts +93 -6
  563. package/dist/core/lbug/lbug-config.js +269 -9
  564. package/dist/core/lbug/native-check.d.ts +39 -0
  565. package/dist/core/lbug/native-check.js +323 -46
  566. package/dist/core/lbug/pdg-emit-sink.d.ts +13 -4
  567. package/dist/core/lbug/pdg-emit-sink.js +21 -111
  568. package/dist/core/lbug/pool-adapter.d.ts +23 -1
  569. package/dist/core/lbug/pool-adapter.js +115 -7
  570. package/dist/core/lbug/query-batch.d.ts +75 -0
  571. package/dist/core/lbug/query-batch.js +102 -0
  572. package/dist/core/lbug/rel-pair-routing.d.ts +160 -2
  573. package/dist/core/lbug/rel-pair-routing.js +228 -10
  574. package/dist/core/lbug/schema.d.ts +162 -3
  575. package/dist/core/lbug/schema.js +392 -157
  576. package/dist/core/lbug/sidecar-recovery.d.ts +1 -0
  577. package/dist/core/lbug/sidecar-recovery.js +1 -1
  578. package/dist/core/lbug/sync-csv-writer.d.ts +47 -0
  579. package/dist/core/lbug/sync-csv-writer.js +108 -0
  580. package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
  581. package/dist/core/platform/capabilities.d.ts +0 -1
  582. package/dist/core/platform/capabilities.js +12 -7
  583. package/dist/core/run-analyze.d.ts +150 -3
  584. package/dist/core/run-analyze.js +1562 -151
  585. package/dist/core/search/bm25-index.d.ts +11 -0
  586. package/dist/core/search/bm25-index.js +60 -26
  587. package/dist/core/search/fts-indexes.d.ts +167 -2
  588. package/dist/core/search/fts-indexes.js +264 -10
  589. package/dist/core/wiki/graph-queries.js +145 -112
  590. package/dist/core/wiki/llm-client.d.ts +37 -5
  591. package/dist/core/wiki/llm-client.js +88 -17
  592. package/dist/core/wiki/prompts.d.ts +19 -0
  593. package/dist/core/wiki/prompts.js +20 -1
  594. package/dist/lib/utils.d.ts +113 -0
  595. package/dist/lib/utils.js +185 -0
  596. package/dist/mcp/http-transport.d.ts +5 -0
  597. package/dist/mcp/http-transport.js +19 -5
  598. package/dist/mcp/local/aop-metadata.d.ts +77 -0
  599. package/dist/mcp/local/aop-metadata.js +227 -0
  600. package/dist/mcp/local/bean-metadata.d.ts +3 -0
  601. package/dist/mcp/local/bean-metadata.js +46 -0
  602. package/dist/mcp/local/local-backend.d.ts +167 -6
  603. package/dist/mcp/local/local-backend.js +1756 -405
  604. package/dist/mcp/local/path-predicate.d.ts +19 -0
  605. package/dist/mcp/local/path-predicate.js +21 -0
  606. package/dist/mcp/local/pdg-impact.d.ts +132 -10
  607. package/dist/mcp/local/pdg-impact.js +391 -98
  608. package/dist/mcp/output-budget.d.ts +5 -0
  609. package/dist/mcp/output-budget.js +52 -0
  610. package/dist/mcp/read-only-policy.d.ts +12 -0
  611. package/dist/mcp/read-only-policy.js +102 -0
  612. package/dist/mcp/repository-policy.d.ts +35 -0
  613. package/dist/mcp/repository-policy.js +333 -0
  614. package/dist/mcp/resources.js +34 -7
  615. package/dist/mcp/server.d.ts +5 -2
  616. package/dist/mcp/server.js +48 -18
  617. package/dist/mcp/tools.d.ts +8 -8
  618. package/dist/mcp/tools.js +91 -20
  619. package/dist/server/analyze-job.d.ts +40 -2
  620. package/dist/server/analyze-job.js +30 -2
  621. package/dist/server/analyze-launch.d.ts +1 -1
  622. package/dist/server/analyze-launch.js +79 -10
  623. package/dist/server/analyze-worker-core.d.ts +3 -2
  624. package/dist/server/analyze-worker-core.js +15 -3
  625. package/dist/server/analyze-worker-ipc.d.ts +1 -1
  626. package/dist/server/analyze-worker-ipc.js +4 -0
  627. package/dist/server/analyze-worker-protocol.d.ts +59 -0
  628. package/dist/server/analyze-worker-protocol.js +1 -0
  629. package/dist/server/analyze-worker.d.ts +1 -17
  630. package/dist/server/analyze-worker.js +29 -6
  631. package/dist/server/api.d.ts +2 -11
  632. package/dist/server/api.js +200 -155
  633. package/dist/server/embed-run-outcome.d.ts +89 -0
  634. package/dist/server/embed-run-outcome.js +88 -0
  635. package/dist/server/git-clone.js +6 -2
  636. package/dist/server/mcp-http.d.ts +1 -1
  637. package/dist/server/mcp-http.js +4 -2
  638. package/dist/server/middleware.d.ts +116 -9
  639. package/dist/server/middleware.js +291 -22
  640. package/dist/server/sse-progress.d.ts +41 -0
  641. package/dist/server/sse-progress.js +125 -0
  642. package/dist/server/upload-ingest.js +2 -1
  643. package/dist/server/validation.js +2 -1
  644. package/dist/storage/branch-index.d.ts +11 -6
  645. package/dist/storage/branch-index.js +15 -7
  646. package/dist/storage/file-hash.js +2 -2
  647. package/dist/storage/fs-atomic.d.ts +25 -0
  648. package/dist/storage/fs-atomic.js +42 -0
  649. package/dist/storage/git.d.ts +165 -0
  650. package/dist/storage/git.js +352 -3
  651. package/dist/storage/index-lock.d.ts +83 -0
  652. package/dist/storage/index-lock.js +654 -0
  653. package/dist/storage/parse-cache.js +482 -1
  654. package/dist/storage/parsedfile-store.d.ts +8 -0
  655. package/dist/storage/parsedfile-store.js +235 -1
  656. package/dist/storage/repo-manager.d.ts +29 -309
  657. package/dist/storage/repo-manager.js +187 -165
  658. package/dist/storage/repo-meta.d.ts +530 -0
  659. package/dist/storage/repo-meta.js +100 -0
  660. package/dist/types/pipeline.d.ts +37 -0
  661. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +1 -1
  662. package/hooks/claude/gitnexus-hook.cjs +1 -1
  663. package/hooks/claude/resolve-analyze-cmd.cjs +80 -13
  664. package/package.json +20 -12
  665. package/scripts/cross-platform-shard.ts +143 -0
  666. package/scripts/cross-platform-tests.ts +94 -0
  667. package/scripts/ensure-fts.ts +14 -3
  668. package/scripts/run-cross-platform.ts +36 -10
  669. package/scripts/sync-plugin-manifests.mjs +192 -0
  670. package/skills/gitnexus-cli.md +3 -3
  671. package/skills/gitnexus-debugging.md +37 -7
  672. package/skills/gitnexus-exploring.md +26 -4
  673. package/skills/gitnexus-impact-analysis.md +71 -10
  674. package/skills/gitnexus-lfg/README.md +55 -0
  675. package/skills/gitnexus-lfg/SKILL.md +86 -0
  676. package/skills/gitnexus-plan/README.md +147 -0
  677. package/skills/gitnexus-plan/SKILL.md +348 -0
  678. package/skills/gitnexus-plan/references/context-ledger.md +137 -0
  679. package/skills/gitnexus-plan/references/context-pack.md +126 -0
  680. package/skills/gitnexus-plan/references/evidence-provenance.md +309 -0
  681. package/skills/gitnexus-plan/references/pdg-slice.md +109 -0
  682. package/skills/gitnexus-plan/references/plan-template.md +201 -0
  683. package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +2366 -0
  684. package/skills/gitnexus-refactoring.md +48 -5
  685. package/skills/gitnexus-review/SKILL.md +279 -0
  686. package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +42 -0
  687. package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +39 -0
  688. package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +37 -0
  689. package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +40 -0
  690. package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +42 -0
  691. package/skills/gitnexus-review/ci-personas/ci-security-lens.md +39 -0
  692. package/skills/gitnexus-taint-analysis.md +13 -7
  693. package/skills/gitnexus-work/README.md +71 -0
  694. package/skills/gitnexus-work/SKILL.md +272 -0
  695. package/skills/gitnexus-work/references/evidence-provenance.md +309 -0
  696. package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2366 -0
  697. package/vendor/leiden/utils.cjs +28 -1
  698. package/web/assets/ProcessFlowModal-Badh2Pbg.js +24 -0
  699. package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
  700. package/web/assets/abnfDiagram-QNN2D4NM-Cq2djWWe.js +1 -0
  701. package/web/assets/agent-DIzEQ1JJ.js +626 -0
  702. package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +1 -0
  703. package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +36 -0
  704. package/web/assets/blockDiagram-54WLDVWM-Dg_hrRWE.js +132 -0
  705. package/web/assets/{c4Diagram-Y2BXMSZH-DOXVs7-C.js → c4Diagram-X2LASM7V-CnhoT4aV.js} +6 -6
  706. package/web/assets/chunk-224SPVON-B8gxtXpy.js +1 -0
  707. package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +127 -0
  708. package/web/assets/chunk-2SREHG4O-Dip42xOq.js +1 -0
  709. package/web/assets/chunk-4RFN2BYJ-DHHWuC-n.js +1 -0
  710. package/web/assets/chunk-66DQ2XMT-CM0xjFAN.js +1 -0
  711. package/web/assets/chunk-6BELYETK-ChsYtfHW.js +1 -0
  712. package/web/assets/chunk-6L755F7B-CMhLBxi2.js +1 -0
  713. package/web/assets/chunk-7CWYLC5S-DRgGkkpF.js +2 -0
  714. package/web/assets/chunk-A7VWPJGB-B4O3oQdQ.js +1 -0
  715. package/web/assets/chunk-BI6VK774-D0oaWk8V.js +1 -0
  716. package/web/assets/chunk-D6VWDJW2-BxcBdZ9c.js +2 -0
  717. package/web/assets/chunk-DMV4VAQV-Bn6WXDSX.js +4 -0
  718. package/web/assets/chunk-E5QJAATJ-dh-5CtIV.js +2 -0
  719. package/web/assets/chunk-EQFTRU2I-1ix7TzW9.js +2 -0
  720. package/web/assets/chunk-FWYVLQTC-BgDItRzJ.js +1 -0
  721. package/web/assets/chunk-HNC4WDU7-DoU3KnA7.js +1 -0
  722. package/web/assets/chunk-L5GCOVLC-CE2w8Nm_.js +161 -0
  723. package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +321 -0
  724. package/web/assets/chunk-LORZLZWG-B57uGw2N.js +88 -0
  725. package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +62 -0
  726. package/web/assets/chunk-NV3KIAZN-5yvcpMiu.js +1 -0
  727. package/web/assets/chunk-OIYT25JQ-CQ6KOZGX.js +1 -0
  728. package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +10 -0
  729. package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +156 -0
  730. package/web/assets/chunk-RRFMTAIC-CMN0wcYA.js +1 -0
  731. package/web/assets/{chunk-RLI5ZMPA-CkXZ0y0U.js → chunk-SATU7PGQ-B1zhgOvc.js} +1 -1
  732. package/web/assets/chunk-STOV2HOB-GnExfzIX.js +1 -0
  733. package/web/assets/chunk-SZD42YQK-ijyKKVr1.js +70 -0
  734. package/web/assets/chunk-TFPGFQPA-Dj6a-0pC.js +231 -0
  735. package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +2 -0
  736. package/web/assets/chunk-TZUXEDM2-B7p9AcTw.js +1 -0
  737. package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +1 -0
  738. package/web/assets/{chunk-6764PJDD-C7xxk063.js → chunk-VE5CLXGZ-C1vB7wpY.js} +1 -1
  739. package/web/assets/chunk-VJFVEZTB-CX66F2ep.js +206 -0
  740. package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +1 -0
  741. package/web/assets/chunk-WJBAP47W-BckNkuEN.js +1 -0
  742. package/web/assets/chunk-XNMVGMAZ-Cg_LnPtj.js +1 -0
  743. package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +1 -0
  744. package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +1 -0
  745. package/web/assets/{cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js → cose-bilkent-RZA4XIPR-BHpK4Crp.js} +1 -1
  746. package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +1 -0
  747. package/web/assets/cynefinDiagram-TR7LZUCG-C3Iar9lZ.js +62 -0
  748. package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +4 -0
  749. package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +30 -0
  750. package/web/assets/diagram-JCD7PQ7C-DC5-9FRr.js +24 -0
  751. package/web/assets/diagram-KFBZAVDW-Dfmf_4ti.js +3 -0
  752. package/web/assets/diagram-L7DVE3PN-GIRyVUtt.js +41 -0
  753. package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +24 -0
  754. package/web/assets/ebnfDiagram-DRHRQJWO-D8_CI4ZF.js +1 -0
  755. package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +85 -0
  756. package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +1 -0
  757. package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +1 -0
  758. package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +292 -0
  759. package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +1 -0
  760. package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +106 -0
  761. package/web/assets/{index-B4eB4dNZ.js → index-BBNl0qfX.js} +51 -51
  762. package/web/assets/index-CJDpyH-n.css +2 -0
  763. package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +1 -0
  764. package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +2 -0
  765. package/web/assets/{ishikawaDiagram-BNXS4ZKH-BLjivjXL.js → ishikawaDiagram-4JDSWWDM-DmqWtjkl.js} +6 -6
  766. package/web/assets/{journeyDiagram-M6C3CM3L-Cetgs3NH.js → journeyDiagram-QUS3FAKT-XAzVzrQW.js} +6 -6
  767. package/web/assets/{kanban-definition-75IXJCU3-DMlCaIpf.js → kanban-definition-D4L7SQKK-YurRnmYn.js} +27 -27
  768. package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +257 -0
  769. package/web/assets/{mindmap-definition-2TDM6QVE-B4GbXQBc.js → mindmap-definition-66QP5TD6-ChrWWnil.js} +29 -29
  770. package/web/assets/node-Ct_zna8U.js +8 -0
  771. package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +1 -0
  772. package/web/assets/pegDiagram-YKIO5C6U-QGeQLEq2.js +1 -0
  773. package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +1 -0
  774. package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +39 -0
  775. package/web/assets/preload-helper-Czpn1I53.js +1 -0
  776. package/web/assets/{quadrantDiagram-VICAPDV7-B1TQnlm0.js → quadrantDiagram-VO5QLCXA-B7098wSc.js} +6 -6
  777. package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +1 -0
  778. package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +1 -0
  779. package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +1 -0
  780. package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +1 -0
  781. package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +1 -0
  782. package/web/assets/railroadDiagram-M77LTMSB-AXu4vxk_.js +1 -0
  783. package/web/assets/requirementDiagram-RASO5HTO-B-l8InpK.js +84 -0
  784. package/web/assets/sankeyDiagram-F32LOJ6L-Kd7zjJgX.js +40 -0
  785. package/web/assets/sdk-CzHHH8tD.js +37 -0
  786. package/web/assets/sequenceDiagram-URATNSBD-BlcdY9DS.js +162 -0
  787. package/web/assets/sizeCapture-5GORAGP4-BEqQzsxs.js +1 -0
  788. package/web/assets/src-C5sx_gMp.js +1 -0
  789. package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +1 -0
  790. package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +1 -0
  791. package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +2 -0
  792. package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +8 -0
  793. package/web/assets/timeline-definition-WJXWRH4I-DUfp1R3E.js +120 -0
  794. package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +1 -0
  795. package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +1 -0
  796. package/web/assets/vennDiagram-K3VCMQLI-Bj-FN-XS.js +34 -0
  797. package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +1 -0
  798. package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +78 -0
  799. package/web/assets/xychartDiagram-5VRUVLCW-CK_rbSWE.js +7 -0
  800. package/web/index.html +17 -15
  801. package/dist/core/ingestion/languages/python/index-stats.d.ts +0 -18
  802. package/dist/core/ingestion/languages/python/index-stats.js +0 -25
  803. package/skills/gitnexus-pr-review.md +0 -163
  804. package/web/assets/ProcessFlowModal-Dna7GkwO.js +0 -22
  805. package/web/assets/agent-DNYDy-KA.js +0 -660
  806. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +0 -1
  807. package/web/assets/architectureDiagram-UL44E2DR-BU5ZRITg.js +0 -36
  808. package/web/assets/blockDiagram-7IZFK4PR-Dut1BpTV.js +0 -132
  809. package/web/assets/chunk-2T2R6R2M-pkw2oXHH.js +0 -4
  810. package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +0 -1
  811. package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +0 -321
  812. package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +0 -159
  813. package/web/assets/chunk-67TQ5CYL-zxhDWgyF.js +0 -124
  814. package/web/assets/chunk-7J6CGLKN-AmkN8jJN.js +0 -10
  815. package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +0 -1
  816. package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +0 -1
  817. package/web/assets/chunk-INKRHTLW-D9BM9HWZ.js +0 -70
  818. package/web/assets/chunk-J5EP6P6S-L19oz55R.js +0 -1
  819. package/web/assets/chunk-KGFNY3KK-tD2F6wxK.js +0 -62
  820. package/web/assets/chunk-KGYTTC2M-zm6n242I.js +0 -1
  821. package/web/assets/chunk-KNLZD3CH-BGlP6X9R.js +0 -1
  822. package/web/assets/chunk-LCXTWHL2-Ba9JK-6F.js +0 -231
  823. package/web/assets/chunk-LII3EMHJ-EGx-eBIu.js +0 -1
  824. package/web/assets/chunk-LRIF4GLE-C3_PqUBq.js +0 -1
  825. package/web/assets/chunk-QA3QBVWF-D4cSJBf6.js +0 -2
  826. package/web/assets/chunk-RERM46MO-B5dAdWpP.js +0 -1
  827. package/web/assets/chunk-RG4AUYOV-OqBBMwuQ.js +0 -206
  828. package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +0 -1
  829. package/web/assets/chunk-T2UQINTJ-BJusEiGe.js +0 -1
  830. package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +0 -1
  831. package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +0 -1
  832. package/web/assets/chunk-UY5QBCOK-BCpUlARQ.js +0 -1
  833. package/web/assets/chunk-VU6ZFW4Y-BeXVk45_.js +0 -2
  834. package/web/assets/chunk-ZXARS5L4-BI_qR2Nm.js +0 -1
  835. package/web/assets/classDiagram-KGZ6W3CR-D9zSIg0x.js +0 -1
  836. package/web/assets/classDiagram-v2-72OJOZXJ-D9zSIg0x.js +0 -1
  837. package/web/assets/dagre-ND4H6XIP-CpcV5kbl.js +0 -4
  838. package/web/assets/diagram-3NCE3AQN-6SMxBRpj.js +0 -43
  839. package/web/assets/diagram-GF46GFSD-BZEdNcRZ.js +0 -24
  840. package/web/assets/diagram-HNR7UZ2L-DxKW2a2Y.js +0 -3
  841. package/web/assets/diagram-QXG6HAR7-HfTHcXX_.js +0 -24
  842. package/web/assets/diagram-WEQXMOUZ-CyijUS8r.js +0 -10
  843. package/web/assets/erDiagram-L5TCEMPS-D0fvpWEX.js +0 -85
  844. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +0 -1
  845. package/web/assets/flowDiagram-H6V6AXG4-Bvr9bbhk.js +0 -162
  846. package/web/assets/ganttDiagram-JCBTUEKG-TzODrLzv.js +0 -292
  847. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +0 -1
  848. package/web/assets/gitGraphDiagram-S2ZK5IYY-ONQSwJIY.js +0 -106
  849. package/web/assets/index-CX_fADmQ.css +0 -2
  850. package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +0 -1
  851. package/web/assets/infoDiagram-3YFTVSEB-DIPVUIQ6.js +0 -2
  852. package/web/assets/katex-K3KEBU37-qRQBy-EZ.js +0 -261
  853. package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +0 -1
  854. package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +0 -1
  855. package/web/assets/pieDiagram-CU6KROY3-D3YC_xyg.js +0 -30
  856. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +0 -1
  857. package/web/assets/requirementDiagram-JXO7QTGE-f8wczLQf.js +0 -84
  858. package/web/assets/sankeyDiagram-URQDO5SZ-BTxzG5j0.js +0 -40
  859. package/web/assets/sequenceDiagram-VS2MUI6T-DuamM-IR.js +0 -162
  860. package/web/assets/src-BNCXICdA.js +0 -1
  861. package/web/assets/stateDiagram-7D4R322I-Ch2pEUcw.js +0 -1
  862. package/web/assets/stateDiagram-v2-36443NZ5-7ANuoZLL.js +0 -1
  863. package/web/assets/timeline-definition-O6YCAMPW-07BR8R8G.js +0 -120
  864. package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +0 -1
  865. package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +0 -1
  866. package/web/assets/vennDiagram-MWXL3ELB-BQX2ossk.js +0 -34
  867. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +0 -1
  868. package/web/assets/wardleyDiagram-CUQ6CDDI-CGIJBBiK.js +0 -78
  869. package/web/assets/xychartDiagram-N2JHSOCM-B3HNMuWp.js +0 -7
  870. /package/web/assets/{chunk-7W6UQGC5-pyKGssV3.js → chunk-LIEV3EAG-pyKGssV3.js} +0 -0
@@ -0,0 +1,201 @@
1
+ /**
2
+ * The one per-file-set index behind Python import resolution, plus the two
3
+ * importer-chain memos that ride inside it.
4
+ *
5
+ * ## Why this is its own module
6
+ *
7
+ * Everything here is derived from `allFilePaths` and nothing here is specific
8
+ * to either CALLER, and there are two of them on opposite sides of a layer
9
+ * boundary: `import-resolvers/python.ts` resolves the single-segment bare tier
10
+ * and `languages/python/import-target.ts` resolves the dotted tiers. The second
11
+ * imports the first, so the index could not live in either without the other
12
+ * reaching back through a cycle — it used to live in `import-target.ts`, which
13
+ * is why the bare tier had no O(1) proof of absence and probed the whole
14
+ * ancestor chain for every `import os`.
15
+ *
16
+ * The shape is the one `workspace-file-index.ts` and `package-dir-index.ts`
17
+ * already use in this directory: an interface, one `perFileSet` builder, and
18
+ * query functions taking the index.
19
+ */
20
+ /**
21
+ * The importer's ancestor directories, CLOSEST FIRST and excluding the
22
+ * workspace root — `["backend/routers", "backend"]` for `backend/routers/x.py`
23
+ * — memoized per importer DIRECTORY for the lifetime of the pass.
24
+ *
25
+ * This is the #2913 fix. Both consumers used to rebuild the chain inline, one
26
+ * `dirParts.slice(0, i).join('/')` per component, on EVERY import: a per-import
27
+ * cost proportional to the importer's path depth, and quadratic in characters,
28
+ * on a file index that is itself depth-free. Real Python layouts are deep
29
+ * (`src/pkg/sub/feature/impl/mod.py` is ordinary), so the resolver was 6.8x
30
+ * slower on a deep corpus than on a shallow one holding the file count fixed,
31
+ * where every other language sat between 1.0x and 3.4x.
32
+ *
33
+ * A directory's ancestors are a pure function of the directory, and a pass
34
+ * resolves many imports per file, so one entry serves every import issued from
35
+ * anywhere in that directory.
36
+ *
37
+ * ## Lifetime and memory
38
+ *
39
+ * The Map lives INSIDE the per-file-set index, so it is reclaimed with the file
40
+ * set it was reached through (`perFileSet` is a `WeakMap`): it cannot leak
41
+ * across passes or repos, and there is no invalidation rule to get wrong. It is
42
+ * filled lazily, so it holds one entry per directory that actually ISSUES a
43
+ * Python import, never one per file and never one per directory in the repo —
44
+ * the bound #2649 (kernel-scale OOM) asks for. Each entry's strings are
45
+ * `slice`s of the longest one, so a chain costs pointers rather than a copy of
46
+ * the path per component.
47
+ *
48
+ * The derived key is the importer's directory exactly as the old inline code
49
+ * computed it — `norm.split('/').slice(0, -1).join('/')`, which for a path
50
+ * without a separator is `''` (a root-level importer, whose chain is empty).
51
+ */
52
+ /**
53
+ * The importer's own directory, normalized — the key BOTH per-directory memos
54
+ * below are stored under.
55
+ *
56
+ * One exported derivation rather than one per accessor: the two memos live in
57
+ * the same index and must agree on what "the importer's directory" is, and a
58
+ * caller that already holds the directory (the bare-import tier computes it for
59
+ * its own proximity check) should not pay for it twice. It was three copies of
60
+ * `replace / lastIndexOf / slice` across two modules before, byte-identical by
61
+ * inspection and by nothing else.
62
+ */
63
+ export declare function importerDirOf(fromFile: string): string;
64
+ export declare function importerAncestors(index: PythonFileIndex, importerDir: string): readonly string[];
65
+ /**
66
+ * Per-file-set index for Python import resolution, memoized on the
67
+ * `allFilePaths` Set object (the same Set is passed for every import in a run,
68
+ * so the index is built once and reused). Replaces the per-import O(files)
69
+ * scans in `resolveAbsoluteFromFiles` (suffix match) and `hasRepoCandidate`
70
+ * (package-existence gate) with O(1)/O(bucket) lookups.
71
+ *
72
+ * - `normSet`: every file path, normalized to forward slashes (for the exact
73
+ * `f === rootFile|initFile` membership checks). It IS derivable from the two
74
+ * buckets below — both probes could be a `.some(c => c.norm === …)` over
75
+ * `byBasename.get(rootFile)` / `byInitParent.get(initFile)` — and it is kept
76
+ * anyway, deliberately. `byBasename` is keyed on the BASENAME, so its bucket
77
+ * for a common Python file name is not small and grows with the repo: on a
78
+ * 9 000-file service tree, `utils.py`, `models.py` and `views.py` hold 1 000
79
+ * entries each. `import utils` would then scan every `utils.py` in the
80
+ * workspace on every import — a per-import cost proportional to corpus size,
81
+ * which is the exact defect class #2901/#2902/#2908 removed. The Set trades
82
+ * ~1.6 MB at 32 000 files, against a 6.4 MB reading, to keep both probes
83
+ * O(1). Do not "simplify" it away without re-measuring that bucket.
84
+ * - `byBasename`: last path component (e.g. `models.py`, `__init__.py`) ->
85
+ * all `{ raw, norm }` candidates, so suffix matches can be gathered from the
86
+ * relevant bucket and the exact tie-break applied across ALL of them.
87
+ * - `byInitParent`: `__init__.py` files keyed by their last TWO components
88
+ * (`<parentDir>/__init__.py`). The package suffix lookup (`pkg.sub` ->
89
+ * `…/sub/__init__.py`) targets only same-named package dirs via this map
90
+ * instead of scanning every `__init__.py` in the repo — the common
91
+ * multi-segment import path no longer scales with package count
92
+ * (PR #1918 review P2b). `__init__.py` files stay in `byBasename` too, for
93
+ * the rarer explicit `pkg.__init__` import that resolves via the module
94
+ * (`…<lastSeg>.py`) lookup.
95
+ * - `dirPrefixes`: every directory prefix of a `.py` file, trailing-slashed
96
+ * (`a/b/c.py` -> `a/`, `a/b/`), for "is there a .py file under `<dir>/`".
97
+ * - `nestedDirNames`: the NAME of every such directory that has a non-empty
98
+ * parent (`a/b/c.py` -> `b`, not `a`), which is exactly the set of segments
99
+ * `hasRepoCandidate`'s ancestor walk can ever match — so a segment absent
100
+ * from it settles the walk in one lookup (#2913).
101
+ * - `ancestorsByDir`: the per-importer-directory ancestor-chain memo behind
102
+ * `importerAncestors`. The one structure here that is NOT derived from the
103
+ * file set: it is filled lazily, from the importer paths the pass actually
104
+ * resolves against, and lives here so it dies with the pass.
105
+ * - `bareImportPrefixesByDir`: the same idea for the OTHER chain — the
106
+ * sys.path-style prefixes `resolvePythonImportInternal`'s single-segment
107
+ * walk probes. A different sequence, not a different spelling: see
108
+ * `importerBarePrefixes`. Two memos in one index rather than two indexes,
109
+ * because they are keyed on the same thing and must die together.
110
+ *
111
+ * Exported for `test/unit/scope-resolution/python/python-importer-ancestors.test.ts`
112
+ * and `test/unit/import-resolvers/python-importer-prefixes.test.ts`, which read
113
+ * the two memos after driving the production adapters. No counter ships for
114
+ * either — the Map IS the memo, and its SIZE is the assertion: one entry per
115
+ * importer directory, however many imports were resolved. Everything else about
116
+ * the index stays internal.
117
+ */
118
+ export interface PythonFileIndex {
119
+ readonly normSet: Set<string>;
120
+ readonly byBasename: Map<string, {
121
+ raw: string;
122
+ norm: string;
123
+ }[]>;
124
+ readonly byInitParent: Map<string, {
125
+ raw: string;
126
+ norm: string;
127
+ }[]>;
128
+ readonly dirPrefixes: Set<string>;
129
+ readonly nestedDirNames: Set<string>;
130
+ readonly ancestorsByDir: Map<string, readonly string[]>;
131
+ readonly bareImportPrefixesByDir: Map<string, readonly string[]>;
132
+ }
133
+ export declare const getPythonFileIndex: (key: ReadonlySet<string>) => PythonFileIndex;
134
+ /**
135
+ * The sys.path-style prefixes `resolvePythonImportInternal`'s single-segment
136
+ * bare-import walk probes, in order, for an importer sitting in `importerDir` —
137
+ * memoized per DIRECTORY for the lifetime of the pass, in the same index and
138
+ * for the same reasons as `importerAncestors`.
139
+ *
140
+ * ## Why this is not `ancestorsByDir`
141
+ *
142
+ * A DIFFERENT SEQUENCE, not a different spelling. For `backend/routers/cron.py`:
143
+ *
144
+ * importerAncestors ["backend/routers", "backend"]
145
+ * importerBarePrefixes ["backend/", ""]
146
+ *
147
+ * Three differences, each load-bearing:
148
+ *
149
+ * 1. `importerAncestors` opens with the importer's OWN directory; this walk
150
+ * does not, because its proximity check has already probed that directory.
151
+ * 2. This walk ENDS at the workspace root (`""`, which probes `<module>.py`
152
+ * unprefixed); `importerAncestors` stops short of it, because
153
+ * `resolveAbsoluteFromFiles` probes the root before its walk instead.
154
+ * 3. `importerAncestors` drops empty components (`filter(Boolean)`); this walk
155
+ * keeps them, and the difference decides real resolutions — for
156
+ * `/abs/a/b/mod.py` this walk probes `/abs/a/`, `/abs/`, `""`, `""` where a
157
+ * filtered chain would probe `abs/a/b/`, `abs/a/`, `abs/`, none of which is
158
+ * a prefix of any file in an absolute-path workspace.
159
+ *
160
+ * So the two cannot share one chain without changing which files resolve. They
161
+ * do share the index, the key and the lifetime, which is what actually matters
162
+ * for #2649: both are filled lazily, hold one entry per directory that ISSUES
163
+ * an import, and die with the pass because the index does.
164
+ */
165
+ export declare function importerBarePrefixes(index: PythonFileIndex, importerDir: string): readonly string[];
166
+ /**
167
+ * "No file anywhere in the workspace can be `<X>/<segment>.py` or
168
+ * `<X>/<segment>/__init__.py`, for ANY prefix `<X>`" — in two Map lookups.
169
+ *
170
+ * This is a PROOF OF ABSENCE, not a heuristic filter, and it is what lets the
171
+ * single-segment bare walk skip itself entirely. Both shapes it rules out are
172
+ * the only two shapes that walk probes: a probe `${prefix}${segment}.py` that
173
+ * is a member of the file set is a path with no backslash (the prefix comes
174
+ * from a normalized importer and the guard below rejects a segment carrying
175
+ * one), so it equals its own normalized form and its basename is exactly
176
+ * `${segment}.py` — which puts it in `byBasename`. A probe
177
+ * `${prefix}${segment}/__init__.py` that is a member likewise has parent
178
+ * directory name exactly `segment`, non-empty, which puts it in `byInitParent`
179
+ * whether or not `prefix` is empty. So a miss in both buckets means every probe
180
+ * the walk would issue is guaranteed to miss.
181
+ *
182
+ * Two inputs cannot be proven absent and get `false` — walk as before:
183
+ *
184
+ * - the EMPTY segment (a target spelled with a trailing dot).
185
+ * `byInitParent` skips `__init__.py` files whose parent directory name is
186
+ * empty, so its absence proves nothing. Same carve-out
187
+ * `resolveAbsoluteFromFiles` makes for `lastSeg === ''`.
188
+ * - a segment containing a BACKSLASH. The buckets are keyed on normalized
189
+ * paths, so a raw `a\b.py` is filed under basename `b.py`; a probe for the
190
+ * segment `a\b` would look up `a\b.py`, miss, and wrongly conclude absence
191
+ * while `allFilePaths.has('a\\b.py')` is true. Not reachable from a Python
192
+ * import statement, but this function is a proof and a proof has no
193
+ * unstated preconditions.
194
+ *
195
+ * The dotted tier in `languages/python/import-target.ts` asks the same question
196
+ * of the same two buckets and is deliberately NOT routed through here: it needs
197
+ * the candidate ARRAYS for its suffix fallback, so it does the two `get`s it
198
+ * already needs and derives the answer, rather than paying two extra `has`
199
+ * lookups per import to share four lines.
200
+ */
201
+ export declare function pythonSegmentAbsent(index: PythonFileIndex, segment: string): boolean;
@@ -0,0 +1,302 @@
1
+ /**
2
+ * The one per-file-set index behind Python import resolution, plus the two
3
+ * importer-chain memos that ride inside it.
4
+ *
5
+ * ## Why this is its own module
6
+ *
7
+ * Everything here is derived from `allFilePaths` and nothing here is specific
8
+ * to either CALLER, and there are two of them on opposite sides of a layer
9
+ * boundary: `import-resolvers/python.ts` resolves the single-segment bare tier
10
+ * and `languages/python/import-target.ts` resolves the dotted tiers. The second
11
+ * imports the first, so the index could not live in either without the other
12
+ * reaching back through a cycle — it used to live in `import-target.ts`, which
13
+ * is why the bare tier had no O(1) proof of absence and probed the whole
14
+ * ancestor chain for every `import os`.
15
+ *
16
+ * The shape is the one `workspace-file-index.ts` and `package-dir-index.ts`
17
+ * already use in this directory: an interface, one `perFileSet` builder, and
18
+ * query functions taking the index.
19
+ */
20
+ import { perFileSet } from './per-file-set.js';
21
+ /**
22
+ * The importer's ancestor directories, CLOSEST FIRST and excluding the
23
+ * workspace root — `["backend/routers", "backend"]` for `backend/routers/x.py`
24
+ * — memoized per importer DIRECTORY for the lifetime of the pass.
25
+ *
26
+ * This is the #2913 fix. Both consumers used to rebuild the chain inline, one
27
+ * `dirParts.slice(0, i).join('/')` per component, on EVERY import: a per-import
28
+ * cost proportional to the importer's path depth, and quadratic in characters,
29
+ * on a file index that is itself depth-free. Real Python layouts are deep
30
+ * (`src/pkg/sub/feature/impl/mod.py` is ordinary), so the resolver was 6.8x
31
+ * slower on a deep corpus than on a shallow one holding the file count fixed,
32
+ * where every other language sat between 1.0x and 3.4x.
33
+ *
34
+ * A directory's ancestors are a pure function of the directory, and a pass
35
+ * resolves many imports per file, so one entry serves every import issued from
36
+ * anywhere in that directory.
37
+ *
38
+ * ## Lifetime and memory
39
+ *
40
+ * The Map lives INSIDE the per-file-set index, so it is reclaimed with the file
41
+ * set it was reached through (`perFileSet` is a `WeakMap`): it cannot leak
42
+ * across passes or repos, and there is no invalidation rule to get wrong. It is
43
+ * filled lazily, so it holds one entry per directory that actually ISSUES a
44
+ * Python import, never one per file and never one per directory in the repo —
45
+ * the bound #2649 (kernel-scale OOM) asks for. Each entry's strings are
46
+ * `slice`s of the longest one, so a chain costs pointers rather than a copy of
47
+ * the path per component.
48
+ *
49
+ * The derived key is the importer's directory exactly as the old inline code
50
+ * computed it — `norm.split('/').slice(0, -1).join('/')`, which for a path
51
+ * without a separator is `''` (a root-level importer, whose chain is empty).
52
+ */
53
+ /**
54
+ * The importer's own directory, normalized — the key BOTH per-directory memos
55
+ * below are stored under.
56
+ *
57
+ * One exported derivation rather than one per accessor: the two memos live in
58
+ * the same index and must agree on what "the importer's directory" is, and a
59
+ * caller that already holds the directory (the bare-import tier computes it for
60
+ * its own proximity check) should not pay for it twice. It was three copies of
61
+ * `replace / lastIndexOf / slice` across two modules before, byte-identical by
62
+ * inspection and by nothing else.
63
+ */
64
+ export function importerDirOf(fromFile) {
65
+ const norm = fromFile.replace(/\\/g, '/');
66
+ const lastSlash = norm.lastIndexOf('/');
67
+ return lastSlash === -1 ? '' : norm.slice(0, lastSlash);
68
+ }
69
+ export function importerAncestors(index, importerDir) {
70
+ const memoized = index.ancestorsByDir.get(importerDir);
71
+ if (memoized !== undefined)
72
+ return memoized;
73
+ const built = buildImporterAncestors(importerDir);
74
+ index.ancestorsByDir.set(importerDir, built);
75
+ return built;
76
+ }
77
+ /**
78
+ * `["a/b/c", "a/b", "a"]` for `a/b/c`. Empty components are dropped first, so
79
+ * an absolute `/a/b` yields `["a/b", "a"]` — matching the `filter(Boolean)` the
80
+ * two inline walks did, and with it the absolute-path gating pinned by
81
+ * `python-import-target-parity.test.ts` (PR #1918 review P3a).
82
+ */
83
+ function buildImporterAncestors(importerDir) {
84
+ const chain = [];
85
+ const parts = importerDir.split('/').filter(Boolean);
86
+ if (parts.length === 0)
87
+ return chain;
88
+ chain.push(parts.join('/'));
89
+ for (let i = 1; i < parts.length; i++) {
90
+ const child = chain[i - 1];
91
+ chain.push(child.slice(0, child.lastIndexOf('/')));
92
+ }
93
+ return chain;
94
+ }
95
+ export const getPythonFileIndex = perFileSet((allFilePaths) => {
96
+ // Runs on a cache miss only. That it happens once per run and not once per
97
+ // import is asserted by counting traversals of the Set itself, in
98
+ // `test/integration/python-import-index-reuse.test.ts` — the PR #1918 review
99
+ // P1 guard (#2909).
100
+ const normSet = new Set();
101
+ const byBasename = new Map();
102
+ const byInitParent = new Map();
103
+ const dirPrefixes = new Set();
104
+ const nestedDirNames = new Set();
105
+ for (const raw of allFilePaths) {
106
+ const norm = raw.replace(/\\/g, '/');
107
+ // Python import resolution only ever queries `.py` paths: module `<seg>.py`
108
+ // and package `<seg>/__init__.py` membership (normSet), `<lastSeg>.py` /
109
+ // `__init__.py` basename buckets (byBasename), and `.py` directory prefixes
110
+ // (dirPrefixes). Non-`.py` files can never match any of those, so skip them
111
+ // — they were dead weight in every structure on polyglot monorepos
112
+ // (PR #1918 review P3b; dirPrefixes was already `.py`-gated).
113
+ if (!norm.endsWith('.py'))
114
+ continue;
115
+ normSet.add(norm);
116
+ // ONE entry object per file, shared by both buckets below: a package file
117
+ // lands in `byBasename` and `byInitParent`, and two literals for the same
118
+ // `(raw, norm)` pair cost ~40 B each on every `__init__.py`.
119
+ const entry = { raw, norm };
120
+ const lastSlash = norm.lastIndexOf('/');
121
+ const base = lastSlash >= 0 ? norm.slice(lastSlash + 1) : norm;
122
+ // `set(base, [entry])` rather than `set(base, [])` then `push`: an empty
123
+ // array literal that is immediately pushed to makes V8 grow the backing
124
+ // store to its 16-slot minimum, so every bucket holding ONE file retains
125
+ // 15 empty pointer slots — 128 B — for the whole pass. `byBasename` has
126
+ // roughly one bucket per file, which made that the dominant term in this
127
+ // index: measured 5.50 MiB against 1.60 MiB for the one-element form at
128
+ // 32 000 `.py` paths, byte-identical contents. Same shape as
129
+ // `languages/php/import-target.ts`'s directory buckets.
130
+ const bucket = byBasename.get(base);
131
+ if (bucket === undefined)
132
+ byBasename.set(base, [entry]);
133
+ else
134
+ bucket.push(entry);
135
+ // Package files also get a parent-keyed bucket so a `pkg.sub` lookup hits
136
+ // only `…/sub/__init__.py` candidates, not every `__init__.py` (P2b).
137
+ if (base === '__init__.py' && lastSlash >= 0) {
138
+ const dir = norm.slice(0, lastSlash);
139
+ const parentSlash = dir.lastIndexOf('/');
140
+ const parentName = parentSlash >= 0 ? dir.slice(parentSlash + 1) : dir;
141
+ if (parentName) {
142
+ const initKey = `${parentName}/__init__.py`;
143
+ const ib = byInitParent.get(initKey);
144
+ if (ib === undefined)
145
+ byInitParent.set(initKey, [entry]);
146
+ else
147
+ ib.push(entry);
148
+ }
149
+ }
150
+ // Directory prefixes: every slash-terminated prefix of the path (every
151
+ // index just past a '/', up to and including the file's own directory).
152
+ // Scanning the FULL normalized path — including any leading '/' for
153
+ // absolute paths — makes `dirPrefixes.has(X)` match exactly when the old
154
+ // gate's `f.startsWith(X)` (X always ends in '/') matched. The previous
155
+ // split+`filter(Boolean)` dropped the leading empty component, so an
156
+ // absolute file `/repo/svc/x.py` yielded `repo/svc/` (no leading slash) and
157
+ // gate-passed where `"/repo/svc/x.py".startsWith("repo/svc/")` is false
158
+ // (PR #1918 review P3a). For relative paths the set is identical.
159
+ //
160
+ // The walk runs from the DEEPEST prefix outward and stops at the first
161
+ // one already recorded. Every prefix is added together with all of its
162
+ // own ancestors, so a hit proves the rest of the chain is already there —
163
+ // which makes the second and later files of a directory cost ONE lookup
164
+ // instead of one insert per path component. This build was the last part
165
+ // of Python's resolution that still scaled with path depth (#2913): the
166
+ // same 400-file corpus moved sixteen directories down went from 800
167
+ // inserts to 7200, for the same ~120 distinct prefixes.
168
+ //
169
+ // `nestedDirNames` rides the same walk. A directory prefix has the shape
170
+ // `<parent>/<name>/` — the only shape `hasRepoCandidate`'s check (3)
171
+ // probes — exactly when another slash precedes it at index > 0. Index 0
172
+ // is excluded on purpose: `a/` and `/` name a directory whose parent is
173
+ // empty, which check (2) already answers and which the ancestor walk
174
+ // (non-empty ancestors only) never probes.
175
+ for (let i = lastSlash; i >= 0; i--) {
176
+ if (norm[i] !== '/')
177
+ continue;
178
+ const dirPrefix = norm.slice(0, i + 1);
179
+ if (dirPrefixes.has(dirPrefix))
180
+ break;
181
+ dirPrefixes.add(dirPrefix);
182
+ const parentSlash = i > 0 ? norm.lastIndexOf('/', i - 1) : -1;
183
+ if (parentSlash > 0)
184
+ nestedDirNames.add(norm.slice(parentSlash + 1, i));
185
+ }
186
+ }
187
+ return {
188
+ normSet,
189
+ byBasename,
190
+ byInitParent,
191
+ dirPrefixes,
192
+ nestedDirNames,
193
+ ancestorsByDir: new Map(),
194
+ bareImportPrefixesByDir: new Map(),
195
+ };
196
+ });
197
+ /**
198
+ * The sys.path-style prefixes `resolvePythonImportInternal`'s single-segment
199
+ * bare-import walk probes, in order, for an importer sitting in `importerDir` —
200
+ * memoized per DIRECTORY for the lifetime of the pass, in the same index and
201
+ * for the same reasons as `importerAncestors`.
202
+ *
203
+ * ## Why this is not `ancestorsByDir`
204
+ *
205
+ * A DIFFERENT SEQUENCE, not a different spelling. For `backend/routers/cron.py`:
206
+ *
207
+ * importerAncestors ["backend/routers", "backend"]
208
+ * importerBarePrefixes ["backend/", ""]
209
+ *
210
+ * Three differences, each load-bearing:
211
+ *
212
+ * 1. `importerAncestors` opens with the importer's OWN directory; this walk
213
+ * does not, because its proximity check has already probed that directory.
214
+ * 2. This walk ENDS at the workspace root (`""`, which probes `<module>.py`
215
+ * unprefixed); `importerAncestors` stops short of it, because
216
+ * `resolveAbsoluteFromFiles` probes the root before its walk instead.
217
+ * 3. `importerAncestors` drops empty components (`filter(Boolean)`); this walk
218
+ * keeps them, and the difference decides real resolutions — for
219
+ * `/abs/a/b/mod.py` this walk probes `/abs/a/`, `/abs/`, `""`, `""` where a
220
+ * filtered chain would probe `abs/a/b/`, `abs/a/`, `abs/`, none of which is
221
+ * a prefix of any file in an absolute-path workspace.
222
+ *
223
+ * So the two cannot share one chain without changing which files resolve. They
224
+ * do share the index, the key and the lifetime, which is what actually matters
225
+ * for #2649: both are filled lazily, hold one entry per directory that ISSUES
226
+ * an import, and die with the pass because the index does.
227
+ */
228
+ export function importerBarePrefixes(index, importerDir) {
229
+ const memoized = index.bareImportPrefixesByDir.get(importerDir);
230
+ if (memoized !== undefined)
231
+ return memoized;
232
+ const built = buildImporterBarePrefixes(importerDir);
233
+ index.bareImportPrefixesByDir.set(importerDir, built);
234
+ return built;
235
+ }
236
+ /**
237
+ * `["a/b/", "a/", ""]` for `a/b/c` — every proper ancestor of `importerDir`,
238
+ * closest first, slash-terminated, ending at the workspace root.
239
+ *
240
+ * Cutting the string at each `lastIndexOf('/')` walks the same ancestors the
241
+ * pre-#2913-followup `dirParts.slice(0, i).join('/')` produced, INCLUDING the
242
+ * empty components a `filter(Boolean)` would have dropped: `/abs/a/b` yields
243
+ * `["/abs/a/", "/abs/", "", ""]`, the second `""` being the `i === 0` step that
244
+ * followed the leading empty component. Byte-identical sequences, duplicates
245
+ * kept, so the probes this feeds are unchanged in content, order and count.
246
+ */
247
+ function buildImporterBarePrefixes(importerDir) {
248
+ const prefixes = [];
249
+ let dir = importerDir;
250
+ let slash = dir.lastIndexOf('/');
251
+ while (slash !== -1) {
252
+ dir = dir.slice(0, slash);
253
+ prefixes.push(dir === '' ? '' : `${dir}/`);
254
+ slash = dir.lastIndexOf('/');
255
+ }
256
+ prefixes.push('');
257
+ return prefixes;
258
+ }
259
+ /**
260
+ * "No file anywhere in the workspace can be `<X>/<segment>.py` or
261
+ * `<X>/<segment>/__init__.py`, for ANY prefix `<X>`" — in two Map lookups.
262
+ *
263
+ * This is a PROOF OF ABSENCE, not a heuristic filter, and it is what lets the
264
+ * single-segment bare walk skip itself entirely. Both shapes it rules out are
265
+ * the only two shapes that walk probes: a probe `${prefix}${segment}.py` that
266
+ * is a member of the file set is a path with no backslash (the prefix comes
267
+ * from a normalized importer and the guard below rejects a segment carrying
268
+ * one), so it equals its own normalized form and its basename is exactly
269
+ * `${segment}.py` — which puts it in `byBasename`. A probe
270
+ * `${prefix}${segment}/__init__.py` that is a member likewise has parent
271
+ * directory name exactly `segment`, non-empty, which puts it in `byInitParent`
272
+ * whether or not `prefix` is empty. So a miss in both buckets means every probe
273
+ * the walk would issue is guaranteed to miss.
274
+ *
275
+ * Two inputs cannot be proven absent and get `false` — walk as before:
276
+ *
277
+ * - the EMPTY segment (a target spelled with a trailing dot).
278
+ * `byInitParent` skips `__init__.py` files whose parent directory name is
279
+ * empty, so its absence proves nothing. Same carve-out
280
+ * `resolveAbsoluteFromFiles` makes for `lastSeg === ''`.
281
+ * - a segment containing a BACKSLASH. The buckets are keyed on normalized
282
+ * paths, so a raw `a\b.py` is filed under basename `b.py`; a probe for the
283
+ * segment `a\b` would look up `a\b.py`, miss, and wrongly conclude absence
284
+ * while `allFilePaths.has('a\\b.py')` is true. Not reachable from a Python
285
+ * import statement, but this function is a proof and a proof has no
286
+ * unstated preconditions.
287
+ *
288
+ * The dotted tier in `languages/python/import-target.ts` asks the same question
289
+ * of the same two buckets and is deliberately NOT routed through here: it needs
290
+ * the candidate ARRAYS for its suffix fallback, so it does the two `get`s it
291
+ * already needs and derives the answer, rather than paying two extra `has`
292
+ * lookups per import to share four lines.
293
+ */
294
+ export function pythonSegmentAbsent(index, segment) {
295
+ if (segment === '' || segment.includes('\\'))
296
+ return false;
297
+ if (index.byBasename.has(`${segment}.py`))
298
+ return false;
299
+ if (index.byInitParent.has(`${segment}/__init__.py`))
300
+ return false;
301
+ return true;
302
+ }
@@ -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>;