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
@@ -26,6 +26,7 @@ import type { ExtractedContract, RepoHandle } from '../types.js';
26
26
  export declare const HANDLES_ROUTE_QUERY = "\nMATCH (handlerFile:File)-[r:CodeRelation {type: 'HANDLES_ROUTE'}]->(route:Route)\nRETURN handlerFile.id AS fileId, handlerFile.filePath AS filePath,\n route.name AS routePath, route.id AS routeId,\n route.method AS routeMethod,\n route.handlerSymbolId AS handlerSymbolId,\n route.responseKeys AS responseKeys,\n r.reason AS routeSource";
27
27
  export declare const RESOLVE_BY_NAME_QUERY = "\nMATCH (n) WHERE labels(n) IN ['Function','Method','CodeElement']\n AND n.name = $name AND n.filePath <> ''\nRETURN n.id AS uid, n.name AS name, n.filePath AS filePath\nLIMIT 2";
28
28
  export declare const RESOLVE_IN_MODULE_QUERY = "\nMATCH (n) WHERE labels(n) IN ['Function','Method','CodeElement']\n AND n.name = $name AND (n.filePath STARTS WITH $fileDot OR n.filePath STARTS WITH $fileSlash)\nRETURN n.id AS uid, n.name AS name, n.filePath AS filePath\nLIMIT 2";
29
+ export declare const RESOLVE_IN_EXACT_MODULE_QUERY = "\nMATCH (n) WHERE labels(n) IN ['Function','Method','CodeElement']\n AND n.name = $name AND n.filePath IN $filePaths\nRETURN n.id AS uid, n.name AS name, n.filePath AS filePath\nLIMIT 2";
29
30
  /**
30
31
  * Canonicalize a provider-side HTTP path for contract-id generation:
31
32
  * - strip query string
@@ -4,7 +4,9 @@ import Parser from 'tree-sitter';
4
4
  import { createIgnoreFilter } from '../../../config/ignore-service.js';
5
5
  import { readSafe } from './fs-utils.js';
6
6
  import { parseSourceSafe } from '../../tree-sitter/safe-parse.js';
7
+ import { toZeroBasedLine } from '../../ingestion/utils/line-base.js';
7
8
  import { logger } from '../../logger.js';
9
+ import { DATA_ROUTE_TABLE_SOURCE } from '../../ingestion/route-extractors/data-route-table.js';
8
10
  import { getPluginForFile, HTTP_SCAN_GLOB, } from './http-patterns/index.js';
9
11
  /**
10
12
  * Language-agnostic orchestrator for HTTP route (provider + consumer)
@@ -89,6 +91,10 @@ RETURN sym.id AS uid, sym.name AS name, sym.filePath AS filePath,
89
91
  // degenerate edge-less node NOR inflates the uniqueness count and masks the real
90
92
  // handler. `LIMIT 2` bounds materialization: distinguishing unique (1) from
91
93
  // ambiguous (>=2) never needs more than two rows (the count guard stays exact).
94
+ //
95
+ // determinism: probe — uniqueness discriminator, not a window. `toResolvedSymbol`
96
+ // reads row 0 only when `rows.length === 1`; a 2-row result is discarded whole,
97
+ // so WHICH two rows came back can never reach a caller.
92
98
  export const RESOLVE_BY_NAME_QUERY = `
93
99
  MATCH (n) WHERE labels(n) IN ['Function','Method','CodeElement']
94
100
  AND n.name = $name AND n.filePath <> ''
@@ -96,21 +102,33 @@ RETURN n.id AS uid, n.name AS name, n.filePath AS filePath
96
102
  LIMIT 2`;
97
103
  // Resolve an IMPORTED handler by pinning it to the import's target module: the
98
104
  // declared export `$name` whose file is the module the handler was imported from
99
- // (`$fileDot` matches `mod.ext`, `$fileSlash` matches `mod/index.ext`). This is
105
+ // (`$filePaths` contains exact source-file and directory-index candidates). This is
100
106
  // the precise rung — it survives aliases and local same-name collisions that a
101
107
  // repo-wide name lookup cannot, and only resolves on a unique match within that
102
108
  // module. `LIMIT 2` keeps the uniqueness count exact (see RESOLVE_BY_NAME_QUERY).
109
+ //
110
+ // determinism: probe — uniqueness discriminator, not a window. Same consumer as
111
+ // RESOLVE_BY_NAME_QUERY: `toResolvedSymbol` reads row 0 only when exactly one row
112
+ // came back, and discards a 2-row result whole.
103
113
  export const RESOLVE_IN_MODULE_QUERY = `
104
114
  MATCH (n) WHERE labels(n) IN ['Function','Method','CodeElement']
105
115
  AND n.name = $name AND (n.filePath STARTS WITH $fileDot OR n.filePath STARTS WITH $fileSlash)
106
116
  RETURN n.id AS uid, n.name AS name, n.filePath AS filePath
107
117
  LIMIT 2`;
118
+ // determinism: probe — uniqueness discriminator, not a window. The consumer
119
+ // accepts exactly one row and rejects a 2-row result whole, so row identity
120
+ // cannot affect the resolution decision.
121
+ export const RESOLVE_IN_EXACT_MODULE_QUERY = `
122
+ MATCH (n) WHERE labels(n) IN ['Function','Method','CodeElement']
123
+ AND n.name = $name AND n.filePath IN $filePaths
124
+ RETURN n.id AS uid, n.name AS name, n.filePath AS filePath
125
+ LIMIT 2`;
108
126
  // Source-file extensions an import specifier may resolve to (stripped before
109
127
  // building the module file-prefix so `./h/users` and `./h/users.ts` agree).
110
128
  const SOURCE_EXT_RE = /\.(?:m|c)?[jt]sx?$/;
111
129
  /**
112
130
  * Resolve an import specifier to a repo-relative FILE BASE (path without
113
- * extension) so the target module can be matched by `filePath STARTS WITH`.
131
+ * extension) so exact target-file candidates can be constructed.
114
132
  * Handles two relative-import dialects and returns null for bare/absolute
115
133
  * imports (which fall back to a repo-wide name lookup):
116
134
  * - path-style (JS/TS): `./handlers/users`, `../x` → joined against the
@@ -137,6 +155,23 @@ function resolveModuleBase(fromFile, module) {
137
155
  }
138
156
  return null; // bare / absolute import — repo-wide fallback
139
157
  }
158
+ const MODULE_SOURCE_EXTENSIONS = [
159
+ '.ts',
160
+ '.tsx',
161
+ '.mts',
162
+ '.cts',
163
+ '.js',
164
+ '.jsx',
165
+ '.mjs',
166
+ '.cjs',
167
+ '.py',
168
+ ];
169
+ function moduleFileCandidates(base) {
170
+ return [
171
+ ...MODULE_SOURCE_EXTENSIONS.map((extension) => `${base}${extension}`),
172
+ ...MODULE_SOURCE_EXTENSIONS.map((extension) => extension === '.py' ? `${base}/__init__.py` : `${base}/index${extension}`),
173
+ ];
174
+ }
140
175
  /**
141
176
  * The innermost Function/Method whose `[startLine, endLine]` span contains
142
177
  * `line` — i.e. the symbol the HTTP call lives inside. For a consumer this is
@@ -147,13 +182,17 @@ function resolveModuleBase(fromFile, module) {
147
182
  */
148
183
  function resolveContainingSymbol(rows, line) {
149
184
  const norm = (x) => String(x ?? '');
150
- // Detection lines are 1-based; symbol spans are stored 0-based for the
151
- // languages indexed today (parse-worker records `startPosition.row`). So the
152
- // base-correct probe is `line - 1`. Pick the INNERMOST (smallest-span) symbol
153
- // whose span contains the probe. Only if nothing contains `line - 1` do we
154
- // retry with the raw `line` — a defensive fallback for any future language
155
- // that stores 1-based spans. Probing `line - 1` first (rather than OR-ing both)
156
- // avoids the +1 slack mis-picking a one-line sibling that sits on `line`.
185
+ // Detection lines are 1-based (`HttpDetection.line`); symbol spans are stored
186
+ // 0-based for the languages indexed today (parse-worker records
187
+ // `startPosition.row`). So the base-correct probe is `toZeroBasedLine(line)` —
188
+ // the same named 1-based→graph-space conversion the ingestion emitters use
189
+ // (#2377), rather than a bare literal. Pick the INNERMOST (smallest-span)
190
+ // symbol whose span contains the probe. Only if nothing contains the 0-based
191
+ // probe do we retry with the raw `line` — a defensive fallback for any future
192
+ // language that stores 1-based spans. Probing 0-based first (rather than
193
+ // OR-ing both) avoids the +1 slack mis-picking a one-line sibling that sits on
194
+ // `line`. The helper's `Math.max(0, …)` clamp is inert here: every plugin sets
195
+ // `line` from `startPosition.row + 1`, so it is always >= 1.
157
196
  const pick = (probe) => {
158
197
  let best = null;
159
198
  let bestSpan = Number.POSITIVE_INFINITY;
@@ -179,7 +218,7 @@ function resolveContainingSymbol(rows, line) {
179
218
  }
180
219
  return best && best.uid ? best : null;
181
220
  };
182
- return pick(line - 1) ?? pick(line);
221
+ return pick(toZeroBasedLine(line)) ?? pick(line);
183
222
  }
184
223
  /** A Function/Method in the file matching `name` exactly (for named handlers). */
185
224
  function resolveSymbolByName(rows, name) {
@@ -196,6 +235,13 @@ function resolveSymbolByName(rows, name) {
196
235
  }
197
236
  return null;
198
237
  }
238
+ function resolveFileSymbolByNameUnique(rows, name) {
239
+ const matches = rows
240
+ .map((row) => resolveSymbolByName([row], name))
241
+ .filter((match) => match !== null);
242
+ const byUid = new Map(matches.map((match) => [match.uid, match]));
243
+ return byUid.size === 1 ? (byUid.values().next().value ?? null) : null;
244
+ }
199
245
  // ─── Path normalization (shared between provider / consumer paths) ──
200
246
  /**
201
247
  * Canonicalize a provider-side HTTP path for contract-id generation:
@@ -438,28 +484,25 @@ export class HttpRouteExtractor {
438
484
  globalNameCache.set(name, result);
439
485
  return result;
440
486
  };
441
- // Resolve a handler imported from a RELATIVE module to the unique declared
442
- // symbol of that name inside the import's target file. Returns null for
443
- // non-relative (bare/aliased-path) imports — those fall back to the repo-wide
444
- // name lookup. Cached by (target-file-prefix, declared name).
487
+ // Resolve a handler imported from a relative module to the unique declared
488
+ // symbol inside its target file. The caller decides whether a miss may use
489
+ // the historical unique repository-wide fallback.
445
490
  const importedSymbolCache = new Map();
446
- const resolveImportedSymbol = async (fromFile, imp) => {
491
+ const resolveImportedSymbol = async (fromFile, imp, strict = false) => {
447
492
  if (!dbExecutor)
448
493
  return null;
449
494
  const base = resolveModuleBase(fromFile, imp.module);
450
495
  if (base === null)
451
- return null; // bare/absolute import → repo-wide fallback
452
- const cacheKey = JSON.stringify([base, imp.name]);
496
+ return null;
497
+ const cacheKey = JSON.stringify([base, imp.name, strict]);
453
498
  const cached = importedSymbolCache.get(cacheKey);
454
499
  if (cached !== undefined)
455
500
  return cached;
456
501
  let rows = [];
457
502
  try {
458
- rows = await dbExecutor(RESOLVE_IN_MODULE_QUERY, {
459
- name: imp.name,
460
- fileDot: `${base}.`,
461
- fileSlash: `${base}/`,
462
- });
503
+ rows = await dbExecutor(strict ? RESOLVE_IN_EXACT_MODULE_QUERY : RESOLVE_IN_MODULE_QUERY, strict
504
+ ? { name: imp.name, filePaths: moduleFileCandidates(base) }
505
+ : { name: imp.name, fileDot: `${base}.`, fileSlash: `${base}/` });
463
506
  }
464
507
  catch {
465
508
  rows = [];
@@ -471,6 +514,8 @@ export class HttpRouteExtractor {
471
514
  const resolveDetectionSymbol = async (filePath, d) => {
472
515
  if (!dbExecutor)
473
516
  return null;
517
+ if (d.role === 'provider' && d.unresolvedHandler)
518
+ return null;
474
519
  const syms = await loadFileSymbols(filePath);
475
520
  // Name resolution does NOT need a detection line — a named provider
476
521
  // handler (Spring/Go/etc. method name) resolves by name even when the
@@ -484,17 +529,20 @@ export class HttpRouteExtractor {
484
529
  // its (declared) name would be wrong; on a miss go straight to a unique
485
530
  // repo-wide match on the declared name, never file-scoped.
486
531
  if (d.handlerImport) {
487
- const byImport = await resolveImportedSymbol(filePath, d.handlerImport);
532
+ const byImport = await resolveImportedSymbol(filePath, d.handlerImport, d.strictHandlerResolution);
488
533
  if (byImport)
489
534
  return byImport;
490
- const byGlobal = await resolveSymbolByNameUnique(d.handlerImport.name);
491
- if (byGlobal)
492
- return byGlobal;
493
- return null;
535
+ if (d.strictHandlerResolution)
536
+ return null;
537
+ return resolveSymbolByNameUnique(d.handlerImport.name);
494
538
  }
495
- const byName = resolveSymbolByName(syms, d.name);
539
+ const byName = d.strictHandlerResolution
540
+ ? resolveFileSymbolByNameUnique(syms, d.name)
541
+ : resolveSymbolByName(syms, d.name);
496
542
  if (byName)
497
543
  return byName;
544
+ if (d.strictHandlerResolution)
545
+ return null;
498
546
  const byGlobal = await resolveSymbolByNameUnique(d.name);
499
547
  if (byGlobal)
500
548
  return byGlobal;
@@ -707,7 +755,7 @@ export class HttpRouteExtractor {
707
755
  }
708
756
  // ─── Source-scan providers ─────────────────────────────────────────
709
757
  async extractProvidersSourceScan(files, getDetections, resolveSymbol) {
710
- const out = [];
758
+ const candidates = [];
711
759
  for (const rel of files) {
712
760
  const detections = await getDetections(rel);
713
761
  const filePath = normalizeRepoRelPath(rel);
@@ -719,26 +767,52 @@ export class HttpRouteExtractor {
719
767
  // arrow that encloses the registration line) so the contract carries a
720
768
  // real symbolUid; fall back to the file + detection name otherwise.
721
769
  const resolved = await resolveSymbol(filePath, d);
722
- out.push({
723
- contractId: contractIdFor(d.method, pathNorm),
724
- type: 'http',
725
- role: 'provider',
726
- symbolUid: resolved?.uid ?? '',
727
- symbolRef: {
728
- filePath: resolved?.filePath || filePath,
729
- name: resolved?.name ?? d.name ?? 'handler',
730
- },
731
- symbolName: resolved?.name ?? d.name ?? 'handler',
732
- confidence: d.confidence,
733
- meta: {
734
- method: d.method,
735
- path: pathNorm,
736
- pathSegments: pathNorm.split('/').filter(Boolean),
737
- extractionStrategy: resolved ? 'source_scan_resolved' : 'source_scan',
738
- framework: d.framework,
739
- },
740
- });
770
+ candidates.push({ detection: d, filePath, pathNorm, resolved });
771
+ }
772
+ }
773
+ const dataCandidatesByIdentity = new Map();
774
+ for (const candidate of candidates) {
775
+ if (candidate.detection.framework !== DATA_ROUTE_TABLE_SOURCE)
776
+ continue;
777
+ const identity = contractIdFor(candidate.detection.method, candidate.pathNorm);
778
+ const grouped = dataCandidatesByIdentity.get(identity) ?? [];
779
+ grouped.push(candidate);
780
+ dataCandidatesByIdentity.set(identity, grouped);
781
+ }
782
+ const ambiguousDataIdentities = new Set();
783
+ for (const [identity, grouped] of dataCandidatesByIdentity) {
784
+ if (grouped.length < 2)
785
+ continue;
786
+ const resolvedIds = new Set(grouped.flatMap((candidate) => candidate.resolved === null ? [] : [candidate.resolved.uid]));
787
+ if (grouped.some((candidate) => candidate.resolved === null) || resolvedIds.size !== 1) {
788
+ ambiguousDataIdentities.add(identity);
789
+ }
790
+ }
791
+ const out = [];
792
+ for (const { detection: d, filePath, pathNorm, resolved } of candidates) {
793
+ const contractId = contractIdFor(d.method, pathNorm);
794
+ if (d.framework === DATA_ROUTE_TABLE_SOURCE && ambiguousDataIdentities.has(contractId)) {
795
+ continue;
741
796
  }
797
+ out.push({
798
+ contractId,
799
+ type: 'http',
800
+ role: 'provider',
801
+ symbolUid: resolved?.uid ?? '',
802
+ symbolRef: {
803
+ filePath: resolved?.filePath || filePath,
804
+ name: resolved?.name ?? d.name ?? 'handler',
805
+ },
806
+ symbolName: resolved?.name ?? d.name ?? 'handler',
807
+ confidence: d.confidence,
808
+ meta: {
809
+ method: d.method,
810
+ path: pathNorm,
811
+ pathSegments: pathNorm.split('/').filter(Boolean),
812
+ extractionStrategy: resolved ? 'source_scan_resolved' : 'source_scan',
813
+ framework: d.framework,
814
+ },
815
+ });
742
816
  }
743
817
  return this.dedupeContracts(out);
744
818
  }
@@ -397,19 +397,37 @@ export class IncludeExtractor {
397
397
  const rows = await db(`MATCH (f:File)
398
398
  WHERE f.filePath =~ '.*\\\\.(h|hpp|hxx|hh|cuh)$'
399
399
  RETURN f.filePath AS filePath, f.id AS fileId`);
400
- // gitnexus analyze stores absolute paths in the File.filePath column.
401
400
  // Provider contract IDs MUST be repo-relative — otherwise the consumer
402
401
  // emits `include::map/base/view.h` and the provider emits
403
402
  // `include::/abs/path/to/repo/map/base/view.h`, which never match
404
403
  // through runExactMatch and the cross-link silently disappears.
405
404
  // (PR #1156 follow-up review: graph provider absolute-path bug.)
405
+ //
406
+ // Current `gitnexus analyze` does NOT store absolute paths here, contrary
407
+ // to what this comment used to claim: File.filePath is built from the
408
+ // walker's repo-relative, forward-slash paths (filesystem-walker.ts →
409
+ // processStructure), and a full self-index at 89bbdcf5 had 0 of 239,070
410
+ // nodes with an absolute or backslash-bearing filePath (#2667). The
411
+ // relativisation below therefore stays as a guard against rows this
412
+ // process did not write — an index built by an older version, or one
413
+ // carried over from another machine — not as a description of what
414
+ // analyze currently emits.
406
415
  const normalizedRepoPath = path.resolve(repoPath);
407
416
  const out = [];
408
417
  for (const r of rows) {
409
418
  if (typeof r.filePath !== 'string' || !r.filePath)
410
419
  continue;
411
420
  const absolute = r.filePath;
412
- const rel = path.relative(normalizedRepoPath, absolute);
421
+ // Only relativise a row that is actually absolute. Current analyze writes
422
+ // repo-relative paths (above), and `path.relative(repoRoot, 'src/a.h')`
423
+ // resolves the second argument against the PROCESS CWD — so from any cwd
424
+ // other than the repo root every relative row came back `..`-prefixed and
425
+ // was dropped by the guard below, silently emptying this strategy (#2667
426
+ // review). Absolute rows still go through `path.relative` so the
427
+ // containment check keeps rejecting foreign and escaping paths.
428
+ const rel = path.isAbsolute(absolute)
429
+ ? path.relative(normalizedRepoPath, absolute)
430
+ : absolute;
413
431
  // Skip rows that resolve outside the repo (e.g., system headers
414
432
  // somehow indexed, or stale absolute paths from a different machine).
415
433
  // path.relative returns a `..`-prefixed path or an absolute path
@@ -4,7 +4,7 @@ export interface ManifestExtractResult {
4
4
  contracts: StoredContract[];
5
5
  crossLinks: CrossLink[];
6
6
  }
7
- export declare const CUSTOM_CONTRACT_RESOLVE_QUERY = "MATCH (n)\n WHERE labels(n) IN ['Function','Method','Class','Interface','Struct','Enum','Trait','Constructor','TypeAlias','Impl','Macro','Union','Typedef','Property','Record','Delegate','Annotation','Template','Const','Static','CodeElement']\n AND n.name = $symbolName\n RETURN n.id AS uid, n.name AS name, n.filePath AS filePath\n ORDER BY n.filePath ASC\n LIMIT 1";
7
+ export declare const CUSTOM_CONTRACT_RESOLVE_QUERY = "MATCH (n)\n WHERE labels(n) IN ['Function','Method','Class','Interface','Struct','Enum','Trait','Constructor','TypeAlias','Impl','Macro','Union','Typedef','Property','Record','Delegate','Annotation','Template','Const','Static','CodeElement']\n AND n.name = $symbolName\n RETURN n.id AS uid, n.name AS name, n.filePath AS filePath\n ORDER BY n.filePath ASC, n.id ASC\n LIMIT 1";
8
8
  /**
9
9
  * Stable synthetic symbolUid for a manifest-declared contract whose target
10
10
  * symbol could not be resolved against the per-repo graph (resolveSymbol
@@ -15,7 +15,7 @@ export const CUSTOM_CONTRACT_RESOLVE_QUERY = `MATCH (n)
15
15
  WHERE labels(n) IN ['Function','Method','Class','Interface','Struct','Enum','Trait','Constructor','TypeAlias','Impl','Macro','Union','Typedef','Property','Record','Delegate','Annotation','Template','Const','Static','CodeElement']
16
16
  AND n.name = $symbolName
17
17
  RETURN n.id AS uid, n.name AS name, n.filePath AS filePath
18
- ORDER BY n.filePath ASC
18
+ ORDER BY n.filePath ASC, n.id ASC
19
19
  LIMIT 1`;
20
20
  /**
21
21
  * Canonicalize an HTTP path for matching against Route.name in the graph.
@@ -199,7 +199,7 @@ export class ManifestExtractor {
199
199
  rows = await executor(`MATCH (handler)-[r:CodeRelation {type: 'HANDLES_ROUTE'}]->(route:Route)
200
200
  WHERE route.name = $normalized
201
201
  RETURN handler.id AS uid, handler.name AS name, handler.filePath AS filePath
202
- ORDER BY handler.filePath ASC
202
+ ORDER BY handler.filePath ASC, handler.id ASC
203
203
  LIMIT 1`, { normalized });
204
204
  }
205
205
  else if (link.type === 'topic') {
@@ -210,7 +210,7 @@ export class ManifestExtractor {
210
210
  // share the topic name.
211
211
  rows = await executor(`MATCH (n) WHERE labels(n) IN ['Function','Method','Class','Interface'] AND n.name = $contract
212
212
  RETURN n.id AS uid, n.name AS name, n.filePath AS filePath
213
- ORDER BY n.filePath ASC
213
+ ORDER BY n.filePath ASC, n.id ASC
214
214
  LIMIT 1`, { contract: link.contract });
215
215
  }
216
216
  else if (link.type === 'grpc' || link.type === 'thrift') {
@@ -231,13 +231,13 @@ export class ManifestExtractor {
231
231
  if (methodName) {
232
232
  rows = await executor(`MATCH (n) WHERE labels(n) IN ['Function','Method'] AND n.name = $methodName
233
233
  RETURN n.id AS uid, n.name AS name, n.filePath AS filePath
234
- ORDER BY n.filePath ASC
234
+ ORDER BY n.filePath ASC, n.id ASC
235
235
  LIMIT 1`, { methodName });
236
236
  }
237
237
  else if (serviceName) {
238
238
  rows = await executor(`MATCH (n) WHERE labels(n) IN ['Class','Interface'] AND n.name = $serviceName
239
239
  RETURN n.id AS uid, n.name AS name, n.filePath AS filePath
240
- ORDER BY n.filePath ASC
240
+ ORDER BY n.filePath ASC, n.id ASC
241
241
  LIMIT 1`, { serviceName });
242
242
  }
243
243
  else {
@@ -253,13 +253,13 @@ export class ManifestExtractor {
253
253
  // NODE_TABLES — so a `Package` entry only ever matched nothing.)
254
254
  rows = await executor(`MATCH (n) WHERE labels(n) IN ['Module'] AND n.name = $contract
255
255
  RETURN n.id AS uid, n.name AS name, n.filePath AS filePath
256
- ORDER BY n.filePath ASC
256
+ ORDER BY n.filePath ASC, n.id ASC
257
257
  LIMIT 1`, { contract: link.contract });
258
258
  }
259
259
  else if (link.type === 'include') {
260
260
  rows = await executor(`MATCH (f:File) WHERE f.filePath = $contract
261
261
  RETURN f.id AS uid, f.name AS name, f.filePath AS filePath
262
- ORDER BY f.filePath ASC
262
+ ORDER BY f.filePath ASC, f.id ASC
263
263
  LIMIT 1`, { contract: link.contract });
264
264
  }
265
265
  else if (link.type === 'custom') {
@@ -9,7 +9,10 @@ import { loadMeta } from '../../storage/repo-manager.js';
9
9
  import { GroupNotFoundError, loadGroupConfig } from './config-parser.js';
10
10
  import { fileMatchesServicePrefix, normalizeServicePrefix, repoInSubgroup, } from './group-path-utils.js';
11
11
  import { getDefaultGitnexusDir, getGroupDir, listGroups, readContractRegistry } from './storage.js';
12
- import { syncGroup } from './sync.js';
12
+ // `./sync.js` is imported LAZILY in `groupSync` — see the comment at its call
13
+ // site. It statically pulls the six contract extractors and, through them, the
14
+ // native tree-sitter binding; a static import here puts all of that on MCP
15
+ // server startup, which never syncs.
13
16
  import { logger } from '../logger.js';
14
17
  function isStoredContract(raw) {
15
18
  if (!raw || typeof raw !== 'object')
@@ -166,6 +169,12 @@ export class GroupService {
166
169
  return { error: `Group "${name}" not found. Run group_list to see configured groups.` };
167
170
  throw err;
168
171
  }
172
+ // Lazy: `sync.js` reaches the six contract extractors and the native
173
+ // tree-sitter binding. `groupSync` is the ONLY consumer — the other seven
174
+ // group tools never need it — so deferring it here keeps that closure off
175
+ // MCP server startup entirely and off every non-sync group call. The CLI
176
+ // already does exactly this at `cli/group.ts`'s sync command.
177
+ const { syncGroup } = await import('./sync.js');
169
178
  const result = await syncGroup(config, {
170
179
  groupDir,
171
180
  exactOnly: Boolean(params.exactOnly),
@@ -2,16 +2,7 @@ import * as fs from 'node:fs';
2
2
  import * as fsp from 'node:fs/promises';
3
3
  import * as path from 'node:path';
4
4
  import * as os from 'node:os';
5
- import { randomBytes } from 'node:crypto';
6
- import { retryRename } from '../../storage/fs-atomic.js';
7
- /**
8
- * Build an unpredictable suffix for atomic-write tmp files. Replaces the
9
- * previous `Date.now()` pattern which CodeQL flagged as
10
- * js/insecure-temporary-file: a guessable suffix in a writable directory
11
- * lets a co-located attacker pre-create or symlink the tmp path before the
12
- * write lands.
13
- */
14
- const tmpSuffix = () => randomBytes(8).toString('hex');
5
+ import { writeFileAtomic } from '../../storage/fs-atomic.js';
15
6
  const CONTRACTS_FILE = 'contracts.json';
16
7
  export function getDefaultGitnexusDir() {
17
8
  return process.env.GITNEXUS_HOME || path.join(os.homedir(), '.gitnexus');
@@ -30,29 +21,7 @@ export function getGroupDir(gitnexusDir, groupName) {
30
21
  return path.join(gitnexusDir, 'groups', groupName);
31
22
  }
32
23
  export async function writeContractRegistry(groupDir, registry) {
33
- const targetPath = path.join(groupDir, CONTRACTS_FILE);
34
- const tmpPath = `${targetPath}.tmp.${tmpSuffix()}`;
35
- // O_EXCL via `'wx'` flag + explicit `0o600` mode — closes both halves
36
- // of the CodeQL js/insecure-temporary-file finding: `'wx'` rejects a
37
- // pre-planted symlink at the path, and `0o600` (user-only) prevents
38
- // the file from being created group/world readable while it briefly
39
- // contains contract data en route to the rename. The query's
40
- // `isSecureMode` predicate inspects ONLY the mode argument, not the
41
- // flags, so the explicit mode is what credits the fix.
42
- const handle = await fsp.open(tmpPath, 'wx', 0o600);
43
- try {
44
- await handle.writeFile(JSON.stringify(registry, null, 2), 'utf-8');
45
- }
46
- finally {
47
- await handle.close();
48
- }
49
- // retryRename absorbs the documented Windows EPERM/EBUSY/EACCES race that
50
- // fires when AV scanners or another concurrent rename briefly hold the
51
- // destination handle between rename calls. Same helper bridge-db.ts uses
52
- // (lines 304, 583, 587, 595, 605, 677) for the bridge.lbug atomic swap —
53
- // single source of truth for the Windows-rename pattern across the group
54
- // package.
55
- await retryRename(tmpPath, targetPath);
24
+ await writeFileAtomic(path.join(groupDir, CONTRACTS_FILE), JSON.stringify(registry, null, 2));
56
25
  }
57
26
  export async function readContractRegistry(groupDir) {
58
27
  const filePath = path.join(groupDir, CONTRACTS_FILE);
@@ -120,6 +120,18 @@ export interface GroupImpactResult {
120
120
  cross_repo_hits: number;
121
121
  };
122
122
  risk: string;
123
+ /**
124
+ * `'lower-bound'` when the fan-out was cut short, so `risk` is a FLOOR, not a
125
+ * verdict. Same vocabulary as single-repo `impact`'s `epistemic` field.
126
+ *
127
+ * `mergeRisk` is monotone increasing in the number of traversed crossings, so
128
+ * dropping a crossing can only move the reported risk DOWN — a fully
129
+ * truncated fan-out returns bare `localRisk`, making a symbol whose blast
130
+ * radius crosses a repo boundary indistinguishable from one with no
131
+ * cross-repo consumers. Absent this marker a truncated run emits a
132
+ * confident-looking `risk` byte-identical to a complete one.
133
+ */
134
+ riskEpistemic?: 'lower-bound';
123
135
  /**
124
136
  * Milliseconds budget applied to the **Phase 1 local impact** leg (`safeLocalImpact`).
125
137
  * If the walk hits this wall first, expect `truncationReason: 'timeout'` and a partial `local` payload.
@@ -160,6 +172,12 @@ export interface CrossRepoImpact {
160
172
  };
161
173
  by_depth: Record<string, unknown[]>;
162
174
  affected_processes: string[];
175
+ /**
176
+ * Present when the bridge proves a repository boundary but the far endpoint
177
+ * has no graph symbol, so local fan-out cannot be attempted. Omitted for
178
+ * completed fan-out to preserve the existing serialized result shape.
179
+ */
180
+ fanout_status?: 'not_attempted';
163
181
  }
164
182
  export interface OutOfScopeLink {
165
183
  from: string;
@@ -6,8 +6,8 @@
6
6
  * replaced, produce a smaller KnowledgeGraph that contains:
7
7
  *
8
8
  * - Every node whose `properties.filePath` is in `toWriteSet`.
9
- * - Every graph-wide node (Community, Process) — these are regenerated
10
- * each run by the communities/processes phases and must be fully
9
+ * - Every graph-wide node (Community, Process, and Spring metadata
10
+ * placeholders) — these are regenerated each run and must be fully
11
11
  * rewritten.
12
12
  * - Every relationship where AT LEAST ONE endpoint is in the writable
13
13
  * set above. Relationships entirely between unchanged-file nodes
@@ -51,10 +51,13 @@ import type { KnowledgeGraph } from '../graph/types.js';
51
51
  export declare const extractChangedSubgraph: (fullGraph: KnowledgeGraph, toWriteSet: ReadonlySet<string>) => KnowledgeGraph;
52
52
  /**
53
53
  * Public — derive the EFFECTIVE write-set: `toWriteSet` expanded by one
54
- * hop along every edge in the new graph that crosses the writable
55
- * boundary (one endpoint in a writable file, the other in an unchanged
56
- * file). The unchanged-side file is pulled in so its stale rows are
57
- * deleted + rewritten in lockstep with the changed side.
54
+ * hop along every file-owned edge in the new graph that crosses the
55
+ * writable boundary (one endpoint in a writable file, the other in an
56
+ * unchanged file). Graph-wide relationships are excluded: their owner
57
+ * phase delete-alls and re-extracts them independently, so following them
58
+ * here would turn high-fan-out metadata into a near-full-repository write.
59
+ * For ordinary edges, the unchanged-side file is pulled in so its stale
60
+ * rows are deleted + rewritten in lockstep with the changed side.
58
61
  *
59
62
  * Single pass over the edge list. Does NOT mutate `toWriteSet`. The
60
63
  * orchestrator MUST feed the returned set to both `deleteNodesForFiles`
@@ -6,8 +6,8 @@
6
6
  * replaced, produce a smaller KnowledgeGraph that contains:
7
7
  *
8
8
  * - Every node whose `properties.filePath` is in `toWriteSet`.
9
- * - Every graph-wide node (Community, Process) — these are regenerated
10
- * each run by the communities/processes phases and must be fully
9
+ * - Every graph-wide node (Community, Process, and Spring metadata
10
+ * placeholders) — these are regenerated each run and must be fully
11
11
  * rewritten.
12
12
  * - Every relationship where AT LEAST ONE endpoint is in the writable
13
13
  * set above. Relationships entirely between unchanged-file nodes
@@ -48,7 +48,12 @@
48
48
  * IMPORTS from the pre-pipeline DB) covers that case instead.
49
49
  */
50
50
  import { createKnowledgeGraph } from '../graph/graph.js';
51
- const isGraphWide = (label) => label === 'Community' || label === 'Process';
51
+ import { isSpringAutoConfigurationDeclaration, isSpringAutoConfigurationSyntheticClass, } from '../ingestion/frameworks/spring/auto-configuration.js';
52
+ import { isSpringAopEvidenceNode } from '../ingestion/frameworks/spring/aop.js';
53
+ const isGraphWideNode = (node) => node.label === 'Community' ||
54
+ node.label === 'Process' ||
55
+ isSpringAopEvidenceNode(node) ||
56
+ isSpringAutoConfigurationSyntheticClass(node);
52
57
  /**
53
58
  * Relationship types whose VALIDITY is a whole-program property, not a
54
59
  * function of their endpoints' files (#2084 M4 U6). `TAINT_PATH` (cross-
@@ -76,7 +81,20 @@ const isGraphWide = (label) => label === 'Community' || label === 'Process';
76
81
  // analyze, and the `incrementalInProgress` dirty flag (saved before any
77
82
  // delete) forces a full rebuild on the next run. Temporary absence is
78
83
  // possible; duplicates are not.
79
- const isGraphWideRelType = (type) => type === 'TAINT_PATH' || type === 'CALL_SUMMARY' || type === 'INJECTS';
84
+ //
85
+ // Spring auto-configuration DECLARES edges (#2415) are also recomputed from
86
+ // repository-wide metadata. A third-file class addition/removal can retarget
87
+ // an unchanged declaration, so they need the same global re-extract contract.
88
+ // DECLARES itself is generic, however: only the two Spring-owned reasons are
89
+ // graph-wide, leaving future metadata systems under their own lifecycle.
90
+ const isGraphWideRelationship = (relationship) => relationship.type === 'TAINT_PATH' ||
91
+ relationship.type === 'CALL_SUMMARY' ||
92
+ relationship.type === 'INJECTS' ||
93
+ // Spring pointcut matching (#2416) is repository-wide. A third-file change
94
+ // can alter annotation-name visibility or the set matched by a wildcard,
95
+ // even when neither endpoint file changed.
96
+ relationship.type === 'ADVISED_BY' ||
97
+ isSpringAutoConfigurationDeclaration(relationship);
80
98
  /**
81
99
  * Build a Map<nodeId, filePath> for every File-bound node in the graph.
82
100
  * Graph-wide nodes (Community/Process) have no filePath and are filtered.
@@ -95,7 +113,7 @@ export const extractChangedSubgraph = (fullGraph, toWriteSet) => {
95
113
  const writableNodeIds = new Set();
96
114
  fullGraph.forEachNode((n) => {
97
115
  const filePath = n.properties?.filePath;
98
- const include = (filePath && toWriteSet.has(filePath)) || isGraphWide(n.label);
116
+ const include = (filePath && toWriteSet.has(filePath)) || isGraphWideNode(n);
99
117
  if (include) {
100
118
  sub.addNode(n);
101
119
  writableNodeIds.add(n.id);
@@ -104,7 +122,7 @@ export const extractChangedSubgraph = (fullGraph, toWriteSet) => {
104
122
  fullGraph.forEachRelationship((r) => {
105
123
  if (writableNodeIds.has(r.sourceId) ||
106
124
  writableNodeIds.has(r.targetId) ||
107
- isGraphWideRelType(r.type)) {
125
+ isGraphWideRelationship(r)) {
108
126
  sub.addRelationship(r);
109
127
  }
110
128
  });
@@ -112,10 +130,13 @@ export const extractChangedSubgraph = (fullGraph, toWriteSet) => {
112
130
  };
113
131
  /**
114
132
  * Public — derive the EFFECTIVE write-set: `toWriteSet` expanded by one
115
- * hop along every edge in the new graph that crosses the writable
116
- * boundary (one endpoint in a writable file, the other in an unchanged
117
- * file). The unchanged-side file is pulled in so its stale rows are
118
- * deleted + rewritten in lockstep with the changed side.
133
+ * hop along every file-owned edge in the new graph that crosses the
134
+ * writable boundary (one endpoint in a writable file, the other in an
135
+ * unchanged file). Graph-wide relationships are excluded: their owner
136
+ * phase delete-alls and re-extracts them independently, so following them
137
+ * here would turn high-fan-out metadata into a near-full-repository write.
138
+ * For ordinary edges, the unchanged-side file is pulled in so its stale
139
+ * rows are deleted + rewritten in lockstep with the changed side.
119
140
  *
120
141
  * Single pass over the edge list. Does NOT mutate `toWriteSet`. The
121
142
  * orchestrator MUST feed the returned set to both `deleteNodesForFiles`
@@ -126,6 +147,8 @@ export const computeEffectiveWriteSet = (fullGraph, toWriteSet) => {
126
147
  const nodeFilePaths = indexNodeFilePaths(fullGraph);
127
148
  const expanded = new Set(toWriteSet);
128
149
  fullGraph.forEachRelationship((r) => {
150
+ if (isGraphWideRelationship(r))
151
+ return;
129
152
  const sourcePath = nodeFilePaths.get(r.sourceId);
130
153
  const targetPath = nodeFilePaths.get(r.targetId);
131
154
  if (!sourcePath || !targetPath)