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
@@ -14,12 +14,14 @@
14
14
  * 2. **Transitive qualified visibility.** `outer::foo()` resolves to
15
15
  * `outer::v1::foo()` when `v1` is inline. The qualified-namespace
16
16
  * receiver resolver (`resolveCppQualifiedNamespaceMember`) walks
17
- * inline-namespace children transitively when collecting candidates.
17
+ * inline-namespace children transitively when collecting candidates —
18
+ * once per pipeline run, into {@link QualifiedNsMemberIndex} (#2788).
18
19
  *
19
20
  * State lifecycle: capture-time `markCppInlineNamespaceRange` records each
20
21
  * inline namespace's source range; `populateCppInlineNamespaceScopes`
21
22
  * resolves ranges to `ScopeId`s during `populateOwners`. Cleared via
22
- * `clearCppInlineNamespaces`, called from `clearFileLocalNames`.
23
+ * `clearCppInlineNamespaces`, called from
24
+ * `cppScopeResolver.loadResolutionConfig` at the start of every pass.
23
25
  *
24
26
  * STL idiom this enables: `std::__1::vector` (libc++) and `std::__cxx11`
25
27
  * (libstdc++) are inline namespaces of `std`. With this support,
@@ -46,7 +48,14 @@ export declare function markCppInlineNamespaceRange(filePath: string, range: Ran
46
48
  export declare function collectCppInlineNamespaceSideChannel(filePath: string): readonly string[];
47
49
  /** Restore this file's captured inline-namespace ranges from the side-channel. */
48
50
  export declare function applyCppInlineNamespaceSideChannel(filePath: string, ranges: readonly string[]): void;
49
- /** Clear all inline-namespace state. Called from `clearFileLocalNames`. */
51
+ /** Clear all inline-namespace state. Called from
52
+ * `cppScopeResolver.loadResolutionConfig` at the start of every pass.
53
+ *
54
+ * The qualified-namespace index is dropped by REASSIGNING a fresh `WeakMap`
55
+ * (`WeakMap` has no `.clear()`) so its entries — and the `SymbolDefinition`
56
+ * references they hold — are released here rather than waiting on the key.
57
+ * Correctness does not rest on that: {@link inlineNamespaceEpoch} invalidates
58
+ * any surviving entry. */
50
59
  export declare function clearCppInlineNamespaces(): void;
51
60
  /** Resolve captured ranges to actual ScopeIds by matching scope ranges
52
61
  * against the inline-namespace ranges recorded for this file. Run from
@@ -59,17 +68,28 @@ export declare function populateCppInlineNamespaceScopes(parsed: ParsedFile): vo
59
68
  * namespace's level). */
60
69
  export declare function isCppInlineNamespaceScope(scopeId: ScopeId): boolean;
61
70
  /**
62
- * Walk every parsed file looking for a Namespace scope whose qualified
63
- * name matches `receiverName`, collect its callable ownedDefs matching
64
- * `memberName`, transitively descending into any inline-namespace
65
- * children (since they're members of the enclosing namespace under ISO
66
- * C++).
71
+ * Find the Namespace scopes whose simple name matches `receiverName` and
72
+ * return their callable members matching `memberName`, transitively
73
+ * including inline-namespace children (since they're members of the
74
+ * enclosing namespace under ISO C++). Served from a per-pipeline index
75
+ * ({@link QualifiedNsMemberIndex}), not a per-call-site workspace scan.
67
76
  *
68
77
  * Returns the most specific (innermost) match — for `outer::foo()`
69
78
  * where `inline namespace v1` declares `foo`, returns `v1::foo`. When
70
79
  * multiple inline-namespace children declare the same name, ISO C++
71
80
  * leaves the call ambiguous; returns `'ambiguous'` so the caller
72
81
  * suppresses edge emission rather than picking arbitrarily (#1564).
82
+ *
83
+ * Two production call sites, both in `scope-resolver.ts`:
84
+ * - `resolveQualifiedReceiverMember` — the `outer::foo()` qualified-receiver
85
+ * hook. Passes `callsite`, so a multi-candidate set can be narrowed by
86
+ * arity and argument types.
87
+ * - `resolveAdlCandidates` — resolving a `using ns::name;` named import back
88
+ * to its namespace member, for template-class method bodies where the
89
+ * lexical walk misses that visibility. Passes NO `callsite`, which makes
90
+ * the narrowing filters below pass-throughs: on that path any receiver
91
+ * whose member has more than one candidate returns `'ambiguous'` (and the
92
+ * caller then skips it) rather than being disambiguated.
73
93
  */
74
94
  export declare function resolveCppQualifiedNamespaceMember(receiverName: string, memberName: string, parsedFiles: readonly ParsedFile[], _scopes: ScopeResolutionIndexes, callsite?: Callsite): SymbolDefinition | 'ambiguous' | undefined;
75
95
  export {};
@@ -14,12 +14,14 @@
14
14
  * 2. **Transitive qualified visibility.** `outer::foo()` resolves to
15
15
  * `outer::v1::foo()` when `v1` is inline. The qualified-namespace
16
16
  * receiver resolver (`resolveCppQualifiedNamespaceMember`) walks
17
- * inline-namespace children transitively when collecting candidates.
17
+ * inline-namespace children transitively when collecting candidates —
18
+ * once per pipeline run, into {@link QualifiedNsMemberIndex} (#2788).
18
19
  *
19
20
  * State lifecycle: capture-time `markCppInlineNamespaceRange` records each
20
21
  * inline namespace's source range; `populateCppInlineNamespaceScopes`
21
22
  * resolves ranges to `ScopeId`s during `populateOwners`. Cleared via
22
- * `clearCppInlineNamespaces`, called from `clearFileLocalNames`.
23
+ * `clearCppInlineNamespaces`, called from
24
+ * `cppScopeResolver.loadResolutionConfig` at the start of every pass.
23
25
  *
24
26
  * STL idiom this enables: `std::__1::vector` (libc++) and `std::__cxx11`
25
27
  * (libstdc++) are inline namespaces of `std`. With this support,
@@ -27,9 +29,16 @@
27
29
  * declaration transparently.
28
30
  */
29
31
  import { isOverloadAmbiguousAfterNormalization, narrowOverloadCandidates, } from '../../scope-resolution/passes/overload-narrowing.js';
32
+ import { isOverloadableCallable } from '../../utils/callable-labels.js';
33
+ import { isSemanticModelValidatorEnabled } from '../../utils/env.js';
30
34
  import { CPP_CONVERSION_ONLY_ARG_TYPE_PREFIXES, cppConversionRank } from './conversion-rank.js';
31
35
  const inlineNamespaceRangesByFile = new Map();
32
36
  const inlineNamespaceScopeIds = new Set();
37
+ /** Bumped by every writer of {@link inlineNamespaceScopeIds}. The qualified-ns
38
+ * index is a function of both `parsedFiles` and that Set; its WeakMap key sees
39
+ * only the first, so the memo stamps this epoch and a missed
40
+ * {@link clearCppInlineNamespaces} degrades to a rebuild, not a stale answer. */
41
+ let inlineNamespaceEpoch = 0;
33
42
  function rangeKey(r) {
34
43
  return `${r.startLine}:${r.startCol}:${r.endLine}:${r.endCol}`;
35
44
  }
@@ -65,10 +74,19 @@ export function applyCppInlineNamespaceSideChannel(filePath, ranges) {
65
74
  for (const r of ranges)
66
75
  set.add(r);
67
76
  }
68
- /** Clear all inline-namespace state. Called from `clearFileLocalNames`. */
77
+ /** Clear all inline-namespace state. Called from
78
+ * `cppScopeResolver.loadResolutionConfig` at the start of every pass.
79
+ *
80
+ * The qualified-namespace index is dropped by REASSIGNING a fresh `WeakMap`
81
+ * (`WeakMap` has no `.clear()`) so its entries — and the `SymbolDefinition`
82
+ * references they hold — are released here rather than waiting on the key.
83
+ * Correctness does not rest on that: {@link inlineNamespaceEpoch} invalidates
84
+ * any surviving entry. */
69
85
  export function clearCppInlineNamespaces() {
70
86
  inlineNamespaceRangesByFile.clear();
71
87
  inlineNamespaceScopeIds.clear();
88
+ inlineNamespaceEpoch++;
89
+ qualifiedNsIndexByPass = new WeakMap();
72
90
  }
73
91
  /** Resolve captured ranges to actual ScopeIds by matching scope ranges
74
92
  * against the inline-namespace ranges recorded for this file. Run from
@@ -78,6 +96,7 @@ export function populateCppInlineNamespaceScopes(parsed) {
78
96
  const ranges = inlineNamespaceRangesByFile.get(parsed.filePath);
79
97
  if (ranges === undefined || ranges.size === 0)
80
98
  return;
99
+ inlineNamespaceEpoch++;
81
100
  for (const scope of parsed.scopes) {
82
101
  if (scope.kind !== 'Namespace')
83
102
  continue;
@@ -94,45 +113,234 @@ export function isCppInlineNamespaceScope(scopeId) {
94
113
  return inlineNamespaceScopeIds.has(scopeId);
95
114
  }
96
115
  /**
97
- * Walk every parsed file looking for a Namespace scope whose qualified
98
- * name matches `receiverName`, collect its callable ownedDefs matching
99
- * `memberName`, transitively descending into any inline-namespace
100
- * children (since they're members of the enclosing namespace under ISO
101
- * C++).
116
+ * Dev/test-only mutation tripwire on the arrays this module shares across call
117
+ * sites ({@link NO_DEFS} and every `membersByReceiver` memo entry): an in-place
118
+ * `.sort()`/`.splice()` ever added to `overload-narrowing.ts` would corrupt
119
+ * every LATER resolution of the same pair, not just its own call, and freezing
120
+ * makes that a loud `TypeError` instead. DEV-ONLY because the types already
121
+ * reject it — the memo and `narrowOverloadCandidates`' parameter are both
122
+ * `readonly SymbolDefinition[]`, so only a cast gets past — while the freeze is
123
+ * not free: V8 moves a frozen array to `PACKED_FROZEN_ELEMENTS`, off the
124
+ * builtin fast path for the `.filter`/`.map`/`.some` narrowing runs over it at
125
+ * every multi-candidate call site (measured 4.6×; large bench arm 100.3 → 70.6ms
126
+ * with it off). Gated on `isSemanticModelValidatorEnabled()` — the OPT-IN form,
127
+ * not `adl.ts`'s opt-out `NODE_ENV !== 'production'`: `NODE_ENV` is unset in a
128
+ * CLI `analyze`, so the opt-out form would keep paying the freeze exactly where
129
+ * the cost lands. Read once at load because this one is per-call-site.
130
+ */
131
+ const FREEZE_SHARED_CANDIDATES = isSemanticModelValidatorEnabled();
132
+ /** Shared empties: most namespace scopes declare no callables, and most
133
+ * qualified receivers name no namespace at all. `NO_DEFS` is process-wide, so
134
+ * it gets the same dev-only freeze the memoized arrays do. */
135
+ const NO_MEMBERS = new Map();
136
+ const NO_DEFS = FREEZE_SHARED_CANDIDATES ? Object.freeze([]) : [];
137
+ /** Simple (last-segment) name of a def, matching the legacy scan exactly —
138
+ * including the empty-string fallback for a def with no `qualifiedName`, and
139
+ * the empty last segment of a trailing-dot name. `lastIndexOf` + `slice`
140
+ * rather than `split('.').pop()`: same result, no intermediate array, and this
141
+ * runs per callable def and per namespace scope at build. */
142
+ function simpleNameOf(def) {
143
+ const qualified = def.qualifiedName;
144
+ if (qualified == null)
145
+ return '';
146
+ const lastDot = qualified.lastIndexOf('.');
147
+ return lastDot === -1 ? qualified : qualified.slice(lastDot + 1);
148
+ }
149
+ /**
150
+ * Per-pass memo: `parsedFiles` array identity → the built index. `WeakMap`-keyed
151
+ * so the entry lives only as long as the caller's `parsedFiles` array does, and
152
+ * is reclaimed with the pass — mirrors `moduleScopeIndexByPass` in
153
+ * `file-local-linkage.ts`.
102
154
  *
103
- * Returns the most specific (innermost) match — for `outer::foo()`
104
- * where `inline namespace v1` declares `foo`, returns `v1::foo`. When
105
- * multiple inline-namespace children declare the same name, ISO C++
106
- * leaves the call ambiguous; returns `'ambiguous'` so the caller
107
- * suppresses edge emission rather than picking arbitrarily (#1564).
155
+ * Weak keying is load-bearing, not stylistic: the index holds
156
+ * `SymbolDefinition` references reaching into every ParsedFile's scopes, so a
157
+ * module-level strong `let` pair (index + source array) kept the whole C/C++
158
+ * ParsedFile set alive past the point `scope-resolution/pipeline/phase.ts`
159
+ * evicts `files`/`contents`/`preExtractedByPath` and calls `forceGc()` to
160
+ * reclaim it — C++ is 7th of 16 `SCOPE_RESOLVERS` entries, so the retention
161
+ * survived nine later language passes plus emit (104.2 MB measured).
108
162
  */
109
- export function resolveCppQualifiedNamespaceMember(receiverName, memberName, parsedFiles, _scopes, callsite) {
110
- const allHits = [];
111
- const seenNodeId = new Set();
163
+ let qualifiedNsIndexByPass = new WeakMap();
164
+ /** Build the index in two linear passes per file: one to make a node per
165
+ * `Namespace` scope, one to link inline children and register receivers.
166
+ * Linking needs both endpoints to exist and `parsed.scopes` does not promise
167
+ * parents precede children, hence two passes rather than one — but only the
168
+ * first pass filters `parsed.scopes`; it hands the second the `[scope, node]`
169
+ * pairs it already found. */
170
+ function buildQualifiedNsMemberIndex(parsedFiles) {
171
+ const rootsByReceiver = new Map();
112
172
  for (const parsed of parsedFiles) {
113
- const scopesById = new Map();
114
- for (const sc of parsed.scopes)
115
- scopesById.set(sc.id, sc);
116
- for (const scope of parsed.scopes) {
117
- if (scope.kind !== 'Namespace')
173
+ const nodesByScope = new Map();
174
+ const namespaces = [];
175
+ for (const sc of parsed.scopes) {
176
+ if (sc.kind !== 'Namespace')
118
177
  continue;
119
- const nsDef = findNamespaceDefInScope(scope);
178
+ const node = { ownMembers: bucketOwnMembers(sc), inlineChildren: [] };
179
+ nodesByScope.set(sc.id, node);
180
+ namespaces.push([sc, node]);
181
+ }
182
+ for (const [sc, node] of namespaces) {
183
+ // A non-`Namespace` parent (a Module scope, say) has no node, so the
184
+ // inline child links to nothing — hence the `?.` below.
185
+ if (sc.parent !== null && inlineNamespaceScopeIds.has(sc.id)) {
186
+ nodesByScope.get(sc.parent)?.inlineChildren.push(node);
187
+ }
188
+ const nsDef = findNamespaceDefInScope(sc);
120
189
  if (nsDef === undefined)
121
190
  continue;
122
- const nsName = nsDef.qualifiedName?.split('.').pop() ?? nsDef.qualifiedName ?? '';
123
- if (nsName !== receiverName)
124
- continue;
125
- // Found a matching namespace scope in this file. Collect ALL
126
- // members transitively through any inline-namespace children.
127
- const hits = findMemberInNamespaceTransitive(scope, scopesById, memberName);
128
- for (const hit of hits) {
129
- if (seenNodeId.has(hit.nodeId))
130
- continue;
131
- seenNodeId.add(hit.nodeId);
132
- allHits.push(hit);
191
+ const nsName = simpleNameOf(nsDef);
192
+ let roots = rootsByReceiver.get(nsName);
193
+ if (roots === undefined) {
194
+ roots = [];
195
+ rootsByReceiver.set(nsName, roots);
133
196
  }
197
+ roots.push(node);
198
+ }
199
+ }
200
+ return { rootsByReceiver, membersByReceiver: new Map() };
201
+ }
202
+ /** Bucket a namespace scope's own callable `ownedDefs` by member simple name.
203
+ * No descent: inline children are separate nodes reached by the walk. */
204
+ function bucketOwnMembers(scope) {
205
+ let members;
206
+ for (const def of scope.ownedDefs) {
207
+ if (!isOverloadableCallable(def.type))
208
+ continue;
209
+ const simple = simpleNameOf(def);
210
+ members ??= new Map();
211
+ let arr = members.get(simple);
212
+ if (arr === undefined) {
213
+ arr = [];
214
+ members.set(simple, arr);
215
+ }
216
+ arr.push(def);
217
+ }
218
+ return members ?? NO_MEMBERS;
219
+ }
220
+ /** Candidates for `receiver::member`, memoized on the index per pair so a
221
+ * repeated call site costs two Map lookups. */
222
+ function qualifiedNsMembers(index, receiverName, memberName) {
223
+ const roots = index.rootsByReceiver.get(receiverName);
224
+ // No namespace by that name — the most common outcome in real source. Left
225
+ // unmemoized deliberately: it is already O(1), and memoizing would grow the
226
+ // index by an entry per unresolved receiver name in the workspace.
227
+ if (roots === undefined)
228
+ return NO_DEFS;
229
+ let byMember = index.membersByReceiver.get(receiverName);
230
+ if (byMember === undefined) {
231
+ byMember = new Map();
232
+ index.membersByReceiver.set(receiverName, byMember);
233
+ }
234
+ let hits = byMember.get(memberName);
235
+ if (hits === undefined) {
236
+ // Memoization makes this array shared by every call site in the pass rather
237
+ // than rebuilt per call, so it carries the dev-only mutation tripwire (see
238
+ // {@link FREEZE_SHARED_CANDIDATES}).
239
+ hits = gatherQualifiedNsMember(roots, memberName);
240
+ if (FREEZE_SHARED_CANDIDATES)
241
+ hits = Object.freeze(hits);
242
+ byMember.set(memberName, hits);
243
+ }
244
+ return hits;
245
+ }
246
+ /** Pre-order depth-first walk of every scope named `receiverName` and its
247
+ * transitive inline-namespace children, collecting callables named
248
+ * `memberName` — the index twin of the legacy
249
+ * `findMemberInNamespaceTransitive`.
250
+ *
251
+ * Iterative, not recursive: nesting depth is whatever the input file says, and
252
+ * a recursive descent threw `RangeError` past ~8k levels (see
253
+ * {@link QualifiedNsMemberIndex}). */
254
+ function gatherQualifiedNsMember(roots, memberName) {
255
+ const hits = [];
256
+ const stack = [];
257
+ // `visited` spans ALL roots, reproducing the legacy per-receiver `seenNodeId`
258
+ // dedup: `namespace ns { inline namespace ns { … } }` registers both scopes
259
+ // under receiver `ns`, and the outer walk already collected the inner's defs.
260
+ // Node identity is equivalent to the legacy nodeId key because a node always
261
+ // contributes the same defs. It doubles as the guard that a malformed parent
262
+ // cycle terminates instead of spinning — the one regression an explicit stack
263
+ // could otherwise introduce over recursion's `RangeError`.
264
+ const visited = new Set();
265
+ for (const root of roots) {
266
+ stack.push(root);
267
+ while (stack.length > 0) {
268
+ const node = stack.pop();
269
+ if (visited.has(node))
270
+ continue;
271
+ visited.add(node);
272
+ const own = node.ownMembers.get(memberName);
273
+ if (own !== undefined)
274
+ for (const def of own)
275
+ hits.push(def);
276
+ // Reverse push so children pop in declaration order — the legacy walk's
277
+ // pre-order depth-first candidate order (see
278
+ // {@link QualifiedNsMemberIndex.rootsByReceiver}).
279
+ const kids = node.inlineChildren;
280
+ for (let i = kids.length - 1; i >= 0; i--)
281
+ stack.push(kids[i]);
134
282
  }
135
283
  }
284
+ return hits.length === 0 ? NO_DEFS : hits;
285
+ }
286
+ /** Build the index on first use of a given `parsedFiles` set; reuse it for
287
+ * every subsequent call site that passes the same array reference AND the same
288
+ * {@link inlineNamespaceEpoch}.
289
+ *
290
+ * Both keys are needed because the index is a function of TWO inputs:
291
+ * `parsedFiles` and the module-level `inlineNamespaceScopeIds` (which inline
292
+ * children get descended into). A later pass may hand back the same
293
+ * `parsedFiles` reference with different inline-namespace state, so identity
294
+ * alone would serve a stale index — the epoch is what makes that a checked
295
+ * rebuild instead of a documented obligation on the clear site.
296
+ *
297
+ * Lifetime: the entry is reachable only while the caller still holds the
298
+ * `parsedFiles` array; nothing here pins it (see {@link qualifiedNsIndexByPass}).
299
+ *
300
+ * Same STALENESS contract as `ensureAdlIndex` in `adl.ts`, minus that
301
+ * sibling's dev-gated `validateAdlSeqCoverage` guard: this index has no `?? 0`
302
+ * defaulting read to silently collide on, so there is nothing for such a guard
303
+ * to catch. */
304
+ function qualifiedNsMemberIndex(parsedFiles) {
305
+ const memo = qualifiedNsIndexByPass.get(parsedFiles);
306
+ if (memo !== undefined && memo.epoch === inlineNamespaceEpoch)
307
+ return memo.index;
308
+ const index = buildQualifiedNsMemberIndex(parsedFiles);
309
+ qualifiedNsIndexByPass.set(parsedFiles, { epoch: inlineNamespaceEpoch, index });
310
+ return index;
311
+ }
312
+ /** Constant narrowing hooks for the C++ qualified-receiver path — hoisted so
313
+ * the literal is not reallocated at every multi-candidate call site. */
314
+ const CPP_NARROWING_HOOKS = {
315
+ conversionRankFn: cppConversionRank,
316
+ conversionOnlyArgTypePrefixes: CPP_CONVERSION_ONLY_ARG_TYPE_PREFIXES,
317
+ };
318
+ /**
319
+ * Find the Namespace scopes whose simple name matches `receiverName` and
320
+ * return their callable members matching `memberName`, transitively
321
+ * including inline-namespace children (since they're members of the
322
+ * enclosing namespace under ISO C++). Served from a per-pipeline index
323
+ * ({@link QualifiedNsMemberIndex}), not a per-call-site workspace scan.
324
+ *
325
+ * Returns the most specific (innermost) match — for `outer::foo()`
326
+ * where `inline namespace v1` declares `foo`, returns `v1::foo`. When
327
+ * multiple inline-namespace children declare the same name, ISO C++
328
+ * leaves the call ambiguous; returns `'ambiguous'` so the caller
329
+ * suppresses edge emission rather than picking arbitrarily (#1564).
330
+ *
331
+ * Two production call sites, both in `scope-resolver.ts`:
332
+ * - `resolveQualifiedReceiverMember` — the `outer::foo()` qualified-receiver
333
+ * hook. Passes `callsite`, so a multi-candidate set can be narrowed by
334
+ * arity and argument types.
335
+ * - `resolveAdlCandidates` — resolving a `using ns::name;` named import back
336
+ * to its namespace member, for template-class method bodies where the
337
+ * lexical walk misses that visibility. Passes NO `callsite`, which makes
338
+ * the narrowing filters below pass-throughs: on that path any receiver
339
+ * whose member has more than one candidate returns `'ambiguous'` (and the
340
+ * caller then skips it) rather than being disambiguated.
341
+ */
342
+ export function resolveCppQualifiedNamespaceMember(receiverName, memberName, parsedFiles, _scopes, callsite) {
343
+ const allHits = qualifiedNsMembers(qualifiedNsMemberIndex(parsedFiles), receiverName, memberName);
136
344
  if (allHits.length === 0)
137
345
  return undefined;
138
346
  if (allHits.length === 1)
@@ -142,12 +350,7 @@ export function resolveCppQualifiedNamespaceMember(receiverName, memberName, par
142
350
  // can disambiguate via exact-type match and, when available, conversion-rank
143
351
  // scoring (`cppConversionRank`). Same-signature ambiguity is still detected
144
352
  // by `isOverloadAmbiguousAfterNormalization` below.
145
- const narrowed = narrowOverloadCandidates(allHits, callsite?.arity, callsite?.argumentTypes, callsite !== undefined
146
- ? {
147
- conversionRankFn: cppConversionRank,
148
- conversionOnlyArgTypePrefixes: CPP_CONVERSION_ONLY_ARG_TYPE_PREFIXES,
149
- }
150
- : undefined);
353
+ const narrowed = narrowOverloadCandidates(allHits, callsite?.arity, callsite?.argumentTypes, callsite !== undefined ? CPP_NARROWING_HOOKS : undefined);
151
354
  if (narrowed.length === 1)
152
355
  return narrowed[0];
153
356
  if (narrowed.length === 0)
@@ -158,35 +361,6 @@ export function resolveCppQualifiedNamespaceMember(receiverName, memberName, par
158
361
  // suppress because we lack call-site info to disambiguate.
159
362
  return 'ambiguous';
160
363
  }
161
- /** Recursively search a namespace scope and any inline-namespace
162
- * descendants for callable defs with the given simple name. Non-inline
163
- * nested namespaces are NOT traversed — they require explicit
164
- * qualification (`outer::nested::foo`). Returns ALL matches so the
165
- * caller can detect same-name ambiguity across inline children (#1564). */
166
- function findMemberInNamespaceTransitive(scope, scopesById, memberName) {
167
- const results = [];
168
- // Check this scope's own ownedDefs first.
169
- for (const def of scope.ownedDefs) {
170
- if (def.type !== 'Function' && def.type !== 'Method' && def.type !== 'Constructor')
171
- continue;
172
- const simple = def.qualifiedName?.split('.').pop() ?? def.qualifiedName ?? '';
173
- if (simple === memberName)
174
- results.push(def);
175
- }
176
- // Descend into inline-namespace children.
177
- for (const childScope of scopesById.values()) {
178
- if (childScope.parent !== scope.id)
179
- continue;
180
- if (childScope.kind !== 'Namespace')
181
- continue;
182
- if (!inlineNamespaceScopeIds.has(childScope.id))
183
- continue;
184
- const childHits = findMemberInNamespaceTransitive(childScope, scopesById, memberName);
185
- for (const hit of childHits)
186
- results.push(hit);
187
- }
188
- return results;
189
- }
190
364
  function findNamespaceDefInScope(scope) {
191
365
  for (const def of scope.ownedDefs) {
192
366
  if (def.type === 'Namespace')
@@ -23,6 +23,8 @@ export declare function interpretCppImport(captures: CaptureMatch): ParsedImport
23
23
  * - `'alias'` — `auto x = existingVar`
24
24
  */
25
25
  export declare function interpretCppTypeBinding(captures: CaptureMatch): ParsedTypeBinding | null;
26
+ /** Remove C++ declaration specifiers from `text` and trim the result. */
27
+ export declare function stripCppSpecifiers(text: string): string;
26
28
  /**
27
29
  * Normalize a C++ type name: strip pointer/array/reference syntax,
28
30
  * qualifiers, while preserving template arguments for specialization-aware
@@ -78,7 +78,131 @@ export function interpretCppTypeBinding(captures) {
78
78
  else if (captures['@type-binding.annotation'] !== undefined) {
79
79
  source = 'annotation';
80
80
  }
81
- return { boundName: name, rawTypeName: normalizeCppTypeName(type), source };
81
+ // A member field's type is captured AS WRITTEN, qualifier and all
82
+ // (`ns::Repo<User>`), because the query matches the outer
83
+ // `qualified_identifier` — one depth-agnostic pattern per declarator shape
84
+ // instead of one per qualifier depth. The qualifier is dropped HERE; see the
85
+ // "Field type, QUALIFIED" block in query.ts for why the qualified spelling
86
+ // resolves to nothing and the tail resolves like the bare one.
87
+ //
88
+ // FIELDS ONLY. `@type-binding.parameter` and `@type-binding.assignment` also
89
+ // capture qualified spellings (their patterns use `type: (_)`), and reducing
90
+ // THOSE would newly bind every qualified local and parameter in the workspace
91
+ // — a far wider change than the member-field miss this closes, and not one
92
+ // anything here has measured.
93
+ const effectiveType = captures['@type-binding.field'] === undefined ? type : cppQualifiedTail(type);
94
+ // The reduced spelling is also the AS-WRITTEN one, and saying so is load
95
+ // bearing. `collectTypeBindings` derives `TypeRef.declaredSpelling` from
96
+ // `@type-binding.type` whenever that text differs from `rawTypeName`, and it
97
+ // now does for every qualified member. `declaredSpelling` exists to keep a
98
+ // CONTAINER distinguishable from a class of the same name after capture
99
+ // reduced it; a qualifier is not a container — `ns::Address` and `Address`
100
+ // have the identical member set — so recording one here would answer
101
+ // "container, as written" for a plain member and hand `elementTypeOf` a
102
+ // spelling it never sees for the bare form.
103
+ const declaredSpelling = cppPointerSpelling(captures, effectiveType, name) ??
104
+ (effectiveType === type ? undefined : effectiveType);
105
+ return declaredSpelling === undefined
106
+ ? { boundName: name, rawTypeName: normalizeCppTypeName(effectiveType), source }
107
+ : {
108
+ boundName: name,
109
+ rawTypeName: normalizeCppTypeName(effectiveType),
110
+ declaredSpelling,
111
+ source,
112
+ };
113
+ }
114
+ /**
115
+ * The tail of a `::`-qualified type spelling — `a::b::Repo<User>` → `Repo<User>`,
116
+ * `ns::Address` → `Address`, an unqualified spelling unchanged.
117
+ *
118
+ * Only TOP-LEVEL separators count, so a qualified TYPE ARGUMENT survives:
119
+ * `std::vector<std::string>` reduces to `vector<std::string>`, not to `string`.
120
+ * That is the same string the old per-depth rules produced by capturing the
121
+ * inner node, so the reduction is textual where it used to be structural and
122
+ * the result is identical for every depth they covered.
123
+ */
124
+ function cppQualifiedTail(text) {
125
+ let angleDepth = 0;
126
+ let lastSeparator = -1;
127
+ for (let i = 0; i < text.length; i++) {
128
+ const ch = text[i];
129
+ if (ch === '<')
130
+ angleDepth++;
131
+ else if (ch === '>') {
132
+ if (angleDepth > 0)
133
+ angleDepth--;
134
+ }
135
+ else if (angleDepth === 0 && ch === ':' && text[i + 1] === ':') {
136
+ lastSeparator = i;
137
+ i++;
138
+ }
139
+ }
140
+ if (lastSeparator === -1)
141
+ return text;
142
+ const tail = text.slice(lastSeparator + 2).trim();
143
+ // A spelling that ends in `::` has no tail to reduce to. Cannot arise from a
144
+ // parsed `qualified_identifier`, but returning an empty type name would make
145
+ // the binding claim a type of `""`, so the written spelling is kept instead.
146
+ return tail.length === 0 ? text : tail;
147
+ }
148
+ /** Anchors whose capture spans a whole declaration, so the declarator — and
149
+ * with it the pointer — is inside the captured text. */
150
+ const CPP_WHOLE_DECLARATION_ANCHORS = [
151
+ '@type-binding.parameter',
152
+ '@type-binding.annotation',
153
+ '@type-binding.assignment',
154
+ ];
155
+ const squeezeWhitespace = (text) => text.replace(/\s+/g, '');
156
+ /**
157
+ * `User* repos` — the written spelling, when tree-sitter-cpp hangs the pointer
158
+ * off the DECLARATOR rather than the type.
159
+ *
160
+ * `@type-binding.type` is a bare `User` there, so the binding records `User` and
161
+ * nothing downstream can tell `repos[0]` (pointer subscript, element `User`)
162
+ * from `grid[0]` on a class with `operator[]` (element: whatever the operator
163
+ * returns). The index step needs that distinction and declines without it, so
164
+ * the pointer is reconstructed here — at the capture layer, from the anchor,
165
+ * which spans the whole declaration.
166
+ *
167
+ * EXACT SHAPE ONLY: the declaration must be precisely `<type> * <name>` once
168
+ * whitespace is removed. `const T*`, `T**`, an array declarator, a reference,
169
+ * a function pointer — none match, and none get a spelling, so the index step
170
+ * declines for them. A loose match would hand back container evidence that is
171
+ * not there and re-mint the confidently wrong edge this exists to prevent.
172
+ */
173
+ function cppPointerSpelling(captures, typeText, nameText) {
174
+ // The target below always contains a literal `*`, so an anchor whose text has
175
+ // none can never equal it. Testing that FIRST is the whole optimisation: this
176
+ // runs on every C++ type binding and the overwhelming majority declare no
177
+ // pointer, so the squeezes (three `replace` passes over the declaration, the
178
+ // type and the name) are skipped entirely for them. `target` is built lazily
179
+ // on the first star-bearing anchor for the same reason.
180
+ let target;
181
+ for (const anchor of CPP_WHOLE_DECLARATION_ANCHORS) {
182
+ const text = captures[anchor]?.text;
183
+ if (text === undefined || !text.includes('*'))
184
+ continue;
185
+ if (target === undefined) {
186
+ const type = squeezeWhitespace(typeText);
187
+ const name = squeezeWhitespace(nameText);
188
+ if (type.length === 0 || name.length === 0)
189
+ return undefined;
190
+ target = `${type}*${name}`;
191
+ }
192
+ if (squeezeWhitespace(text) === target)
193
+ return `${typeText.trim()}*`;
194
+ }
195
+ return undefined;
196
+ }
197
+ /** Declaration specifiers that carry no type identity. Held in ONE place so
198
+ * every consumer agrees on the keyword list — the resolver's element-type
199
+ * hook strips exactly the same set before deciding whether a spelling is a
200
+ * pointer, and a silently diverging copy there would make the two disagree
201
+ * about what `const T*` is. */
202
+ const CPP_SPECIFIER_RE = /\b(const|volatile|restrict|static|extern|inline|mutable|constexpr|consteval)\b/g;
203
+ /** Remove C++ declaration specifiers from `text` and trim the result. */
204
+ export function stripCppSpecifiers(text) {
205
+ return text.replace(CPP_SPECIFIER_RE, '').trim();
82
206
  }
83
207
  /**
84
208
  * Normalize a C++ type name: strip pointer/array/reference syntax,
@@ -90,11 +214,7 @@ export function interpretCppTypeBinding(captures) {
90
214
  * by base-name fallback in resolveClassBindingForName.
91
215
  */
92
216
  export function normalizeCppTypeName(text) {
93
- let t = text.trim();
94
- // Strip const, volatile, restrict, static, extern, inline, mutable, constexpr
95
- t = t
96
- .replace(/\b(const|volatile|restrict|static|extern|inline|mutable|constexpr|consteval)\b/g, '')
97
- .trim();
217
+ let t = stripCppSpecifiers(text);
98
218
  // Strip pointer stars
99
219
  while (t.endsWith('*'))
100
220
  t = t.slice(0, -1).trim();