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
@@ -10,8 +10,131 @@
10
10
  * single function. The `reason` defaults to
11
11
  * `'scope-resolution: import'`; provider may override if downstream
12
12
  * filters on reason.
13
+ *
14
+ * ## Non-initializing imports carry a distinct `reason`
15
+ *
16
+ * A pair reached ONLY by imports that cannot run at module-initialization time
17
+ * still gets an edge — it is a real dependency, and impact/trace must see it —
18
+ * but it cannot participate in the kind of cycle `check --cycles` exists to
19
+ * find. There are two such kinds, and they are NOT the same fact:
20
+ *
21
+ * - **deferred** — the import exists at runtime, just later. `import('./m')`
22
+ * and a function-local `import` both really load the module; what they do
23
+ * not do is load it while the importing module is still initializing.
24
+ * Deferring is in fact the standard idiom for BREAKING an init cycle, and
25
+ * this repository uses it that way on purpose in both spellings:
26
+ * `core/group/service.ts` does `await import('./cross-impact.js')`, and
27
+ * `eval/workflow_bench/proposer_sandbox.py` puts a plain `import` inside a
28
+ * function under the comment "Kept lazy to avoid a module cycle".
29
+ * - **type-only** — the import does not exist at runtime AT ALL. `tsc` deletes
30
+ * `import type { X } from './m'`; the emitted JavaScript contains no
31
+ * reference to `./m`. Nothing was made later; the dependency is compile-time
32
+ * only. Eight of the ten false cycles this repository reports are this.
33
+ *
34
+ * Reporting either as an init cycle flags the fix as the bug. They get separate
35
+ * suffixes rather than one shared "not really an import" tag because the two
36
+ * answers to "does this edge exist when the program runs?" are opposite, and a
37
+ * reader of the graph — or the next filter written against `reason` — needs to
38
+ * be able to tell them apart.
39
+ *
40
+ * Three signals, because no one of them covers the others. All three ride the
41
+ * EDGE — this function reads properties and never walks the scope tree for
42
+ * them, for the reason spelled out under "Why nothing here is derived from the
43
+ * scope tree" below:
44
+ *
45
+ * - `ImportEdge.kind === 'dynamic-resolved'` — TS/JS `import()`.
46
+ * - `ImportEdge.runsOnlyWhenCalled` — the import sits inside a function body
47
+ * AND this language's imports execute where they are written: Python's
48
+ * `def f(): from x import Y`, Ruby's `def f; require 'x'; end`, a CommonJS
49
+ * `require()` in a body. Nothing marks those as dynamic, because
50
+ * syntactically they are ordinary imports; what defers them is WHERE they
51
+ * sit, so `scope-extractor.ts` decides it in Pass 3 and it is carried down
52
+ * — `ParsedImport` → `finalize-algorithm.ts` → the edge. A language whose
53
+ * imports do not execute never gets the tag no matter where one sits (Rust
54
+ * `use`, C/C++ `#include`; see
55
+ * `LanguageProvider.importsExecuteWhereWritten`).
56
+ * - `ImportEdge.typeOnly` — TypeScript `import type` / `import { type X }`.
57
+ * Neither of the other two sees it: the kind is the ordinary `named` /
58
+ * `alias`, and the statement sits at module top level like any other. Only
59
+ * the `type` keyword says it, so it is carried from the syntax down —
60
+ * `typescript/import-decomposer.ts` → `interpret.ts` → `finalize-algorithm.ts`.
61
+ *
62
+ * ## Why nothing here is derived from the scope tree
63
+ *
64
+ * `scopeTree` is used for exactly one thing: turning the map's key into the
65
+ * source `filePath`. It is NOT a place to ask where an import was written.
66
+ * `finalize-algorithm.ts:295` publishes every file's finalized edges as
67
+ * `linkedByScope.set(file.moduleScope, …)`, so the `imports` map this function
68
+ * receives holds one bucket per FILE, keyed by that file's `Module` scope —
69
+ * never by the scope an import was actually written in. A walk from such a key
70
+ * looking for an enclosing `Function` starts at a `Module` and answers `false`
71
+ * every time, for every import in the tree.
72
+ *
73
+ * That walk was here, and it never fired once. It looked correct in unit tests
74
+ * only because they hand-built `new Map([['fn', …]])`, a shape the pipeline
75
+ * cannot produce. Position now arrives as `runsOnlyWhenCalled`, decided where
76
+ * the position is still known.
77
+ *
78
+ * Tagging the reason is enough for the check query, which already filters
79
+ * non-runtime edges that way (`markdown-link`, Swift implicit module
80
+ * visibility) — no change to the persisted RELATION schema, no new property on
81
+ * the emitted `CodeRelation`. (`typeOnly` and `runsOnlyWhenCalled` are fields
82
+ * on the in-memory `ImportEdge`, which is never persisted; they end here.)
83
+ *
84
+ * ponytail: reason-string tagging rather than a typed relation property,
85
+ * because the one consumer already filters on `reason` and a property would
86
+ * touch the relation schema. If a second consumer ever needs to branch on this,
87
+ * promote it to a real field then.
88
+ *
89
+ * ## Precedence: the strongest runtime presence in a pair wins
90
+ *
91
+ * Emission dedupes by `(sourceFile, targetFile)`, so one edge has to speak for
92
+ * every import that reaches the pair. Rank them by how much of the dependency
93
+ * survives to run time — initializing > deferred > erased — and let the
94
+ * strongest win: the ranks ascend as presence weakens, so the pair keeps the
95
+ * LOWEST rank it sees ({@link PRESENCE_INITIALIZES} is 0). Inverting that
96
+ * comparison is the one mutation here that hides a real cycle rather than
97
+ * inventing a false one, which is why the suite pins it directly.
98
+ *
99
+ * - Any initializing import wins outright. One top-level `import { f }` beside
100
+ * an `await import()` and a dozen `import type`s is a real init dependency;
101
+ * reporting the pair as deferred or erased would HIDE a true cycle.
102
+ * - Deferred beats type-only. A pair with a function-local import plus some
103
+ * `import type`s does load the target at run time, so `(deferred)` is the
104
+ * honest label; `(type-only)` would claim the module never loads.
105
+ * - The two deferred signals rank the same. `import()` and a function-local
106
+ * import are the same claim about the emitted program — it loads, later —
107
+ * so a pair reached only by them is `(deferred)` either way.
108
+ *
109
+ * That also settles the mixed statement `import { type X, Y } from './m'`
110
+ * without the decomposer aggregating anything: `X` is erased, `Y` is not, and
111
+ * `Y` carries the pair. A statement is type-only exactly when every specifier
112
+ * it decomposes to is.
113
+ *
114
+ * Pairs are collected before anything is emitted so the ranking sees every
115
+ * contributing edge rather than whichever one arrived first. Insertion order
116
+ * into the map is first-seen order, so emission order is byte-identical to the
117
+ * single-pass form this replaced.
13
118
  */
14
119
  import type { ImportEdge, ScopeId } from '../../../../_shared/index.js';
15
120
  import type { KnowledgeGraph } from '../../../graph/types.js';
16
121
  import type { ScopeResolutionIndexes } from '../../model/scope-resolution-indexes.js';
122
+ /**
123
+ * Reason suffix for a pair reachable only through imports that run later —
124
+ * `import()` and function-local imports.
125
+ *
126
+ * `check --cycles` matches this EXACTLY, so a provider that overrides the base
127
+ * reason keeps its deferred edges filterable — the suffix travels with it.
128
+ */
129
+ export declare const DEFERRED_IMPORT_REASON_SUFFIX = " (deferred)";
130
+ /**
131
+ * Reason suffix for a pair reachable only through imports the compiler erases —
132
+ * TypeScript `import type` / `import { type X }`.
133
+ *
134
+ * A second suffix rather than a reuse of {@link DEFERRED_IMPORT_REASON_SUFFIX}:
135
+ * both are excluded from the cycle query, but "runs later" and "never runs" are
136
+ * opposite answers about the emitted program, and the reason string is the only
137
+ * place the graph records which one this pair is.
138
+ */
139
+ export declare const TYPE_ONLY_IMPORT_REASON_SUFFIX = " (type-only)";
17
140
  export declare function emitImportEdges(graph: KnowledgeGraph, imports: ReadonlyMap<ScopeId, readonly ImportEdge[]>, scopeTree: ScopeResolutionIndexes['scopeTree'], reason?: string): number;
@@ -10,12 +10,156 @@
10
10
  * single function. The `reason` defaults to
11
11
  * `'scope-resolution: import'`; provider may override if downstream
12
12
  * filters on reason.
13
+ *
14
+ * ## Non-initializing imports carry a distinct `reason`
15
+ *
16
+ * A pair reached ONLY by imports that cannot run at module-initialization time
17
+ * still gets an edge — it is a real dependency, and impact/trace must see it —
18
+ * but it cannot participate in the kind of cycle `check --cycles` exists to
19
+ * find. There are two such kinds, and they are NOT the same fact:
20
+ *
21
+ * - **deferred** — the import exists at runtime, just later. `import('./m')`
22
+ * and a function-local `import` both really load the module; what they do
23
+ * not do is load it while the importing module is still initializing.
24
+ * Deferring is in fact the standard idiom for BREAKING an init cycle, and
25
+ * this repository uses it that way on purpose in both spellings:
26
+ * `core/group/service.ts` does `await import('./cross-impact.js')`, and
27
+ * `eval/workflow_bench/proposer_sandbox.py` puts a plain `import` inside a
28
+ * function under the comment "Kept lazy to avoid a module cycle".
29
+ * - **type-only** — the import does not exist at runtime AT ALL. `tsc` deletes
30
+ * `import type { X } from './m'`; the emitted JavaScript contains no
31
+ * reference to `./m`. Nothing was made later; the dependency is compile-time
32
+ * only. Eight of the ten false cycles this repository reports are this.
33
+ *
34
+ * Reporting either as an init cycle flags the fix as the bug. They get separate
35
+ * suffixes rather than one shared "not really an import" tag because the two
36
+ * answers to "does this edge exist when the program runs?" are opposite, and a
37
+ * reader of the graph — or the next filter written against `reason` — needs to
38
+ * be able to tell them apart.
39
+ *
40
+ * Three signals, because no one of them covers the others. All three ride the
41
+ * EDGE — this function reads properties and never walks the scope tree for
42
+ * them, for the reason spelled out under "Why nothing here is derived from the
43
+ * scope tree" below:
44
+ *
45
+ * - `ImportEdge.kind === 'dynamic-resolved'` — TS/JS `import()`.
46
+ * - `ImportEdge.runsOnlyWhenCalled` — the import sits inside a function body
47
+ * AND this language's imports execute where they are written: Python's
48
+ * `def f(): from x import Y`, Ruby's `def f; require 'x'; end`, a CommonJS
49
+ * `require()` in a body. Nothing marks those as dynamic, because
50
+ * syntactically they are ordinary imports; what defers them is WHERE they
51
+ * sit, so `scope-extractor.ts` decides it in Pass 3 and it is carried down
52
+ * — `ParsedImport` → `finalize-algorithm.ts` → the edge. A language whose
53
+ * imports do not execute never gets the tag no matter where one sits (Rust
54
+ * `use`, C/C++ `#include`; see
55
+ * `LanguageProvider.importsExecuteWhereWritten`).
56
+ * - `ImportEdge.typeOnly` — TypeScript `import type` / `import { type X }`.
57
+ * Neither of the other two sees it: the kind is the ordinary `named` /
58
+ * `alias`, and the statement sits at module top level like any other. Only
59
+ * the `type` keyword says it, so it is carried from the syntax down —
60
+ * `typescript/import-decomposer.ts` → `interpret.ts` → `finalize-algorithm.ts`.
61
+ *
62
+ * ## Why nothing here is derived from the scope tree
63
+ *
64
+ * `scopeTree` is used for exactly one thing: turning the map's key into the
65
+ * source `filePath`. It is NOT a place to ask where an import was written.
66
+ * `finalize-algorithm.ts:295` publishes every file's finalized edges as
67
+ * `linkedByScope.set(file.moduleScope, …)`, so the `imports` map this function
68
+ * receives holds one bucket per FILE, keyed by that file's `Module` scope —
69
+ * never by the scope an import was actually written in. A walk from such a key
70
+ * looking for an enclosing `Function` starts at a `Module` and answers `false`
71
+ * every time, for every import in the tree.
72
+ *
73
+ * That walk was here, and it never fired once. It looked correct in unit tests
74
+ * only because they hand-built `new Map([['fn', …]])`, a shape the pipeline
75
+ * cannot produce. Position now arrives as `runsOnlyWhenCalled`, decided where
76
+ * the position is still known.
77
+ *
78
+ * Tagging the reason is enough for the check query, which already filters
79
+ * non-runtime edges that way (`markdown-link`, Swift implicit module
80
+ * visibility) — no change to the persisted RELATION schema, no new property on
81
+ * the emitted `CodeRelation`. (`typeOnly` and `runsOnlyWhenCalled` are fields
82
+ * on the in-memory `ImportEdge`, which is never persisted; they end here.)
83
+ *
84
+ * ponytail: reason-string tagging rather than a typed relation property,
85
+ * because the one consumer already filters on `reason` and a property would
86
+ * touch the relation schema. If a second consumer ever needs to branch on this,
87
+ * promote it to a real field then.
88
+ *
89
+ * ## Precedence: the strongest runtime presence in a pair wins
90
+ *
91
+ * Emission dedupes by `(sourceFile, targetFile)`, so one edge has to speak for
92
+ * every import that reaches the pair. Rank them by how much of the dependency
93
+ * survives to run time — initializing > deferred > erased — and let the
94
+ * strongest win: the ranks ascend as presence weakens, so the pair keeps the
95
+ * LOWEST rank it sees ({@link PRESENCE_INITIALIZES} is 0). Inverting that
96
+ * comparison is the one mutation here that hides a real cycle rather than
97
+ * inventing a false one, which is why the suite pins it directly.
98
+ *
99
+ * - Any initializing import wins outright. One top-level `import { f }` beside
100
+ * an `await import()` and a dozen `import type`s is a real init dependency;
101
+ * reporting the pair as deferred or erased would HIDE a true cycle.
102
+ * - Deferred beats type-only. A pair with a function-local import plus some
103
+ * `import type`s does load the target at run time, so `(deferred)` is the
104
+ * honest label; `(type-only)` would claim the module never loads.
105
+ * - The two deferred signals rank the same. `import()` and a function-local
106
+ * import are the same claim about the emitted program — it loads, later —
107
+ * so a pair reached only by them is `(deferred)` either way.
108
+ *
109
+ * That also settles the mixed statement `import { type X, Y } from './m'`
110
+ * without the decomposer aggregating anything: `X` is erased, `Y` is not, and
111
+ * `Y` carries the pair. A statement is type-only exactly when every specifier
112
+ * it decomposes to is.
113
+ *
114
+ * Pairs are collected before anything is emitted so the ranking sees every
115
+ * contributing edge rather than whichever one arrived first. Insertion order
116
+ * into the map is first-seen order, so emission order is byte-identical to the
117
+ * single-pass form this replaced.
13
118
  */
14
119
  import { generateId } from '../../../../lib/utils.js';
120
+ /**
121
+ * Reason suffix for a pair reachable only through imports that run later —
122
+ * `import()` and function-local imports.
123
+ *
124
+ * `check --cycles` matches this EXACTLY, so a provider that overrides the base
125
+ * reason keeps its deferred edges filterable — the suffix travels with it.
126
+ */
127
+ export const DEFERRED_IMPORT_REASON_SUFFIX = ' (deferred)';
128
+ /**
129
+ * Reason suffix for a pair reachable only through imports the compiler erases —
130
+ * TypeScript `import type` / `import { type X }`.
131
+ *
132
+ * A second suffix rather than a reuse of {@link DEFERRED_IMPORT_REASON_SUFFIX}:
133
+ * both are excluded from the cycle query, but "runs later" and "never runs" are
134
+ * opposite answers about the emitted program, and the reason string is the only
135
+ * place the graph records which one this pair is.
136
+ */
137
+ export const TYPE_ONLY_IMPORT_REASON_SUFFIX = ' (type-only)';
138
+ /**
139
+ * How much of an import survives to run time. Lower is stronger; a pair takes
140
+ * the minimum over every edge that reaches it. See the precedence section in
141
+ * the module header for why the order is this one.
142
+ */
143
+ const PRESENCE_INITIALIZES = 0;
144
+ const PRESENCE_DEFERRED = 1;
145
+ const PRESENCE_ERASED = 2;
146
+ /**
147
+ * Suffix per presence rank; the empty string is a real init dependency.
148
+ *
149
+ * Indexed rather than branched so the rank order lives in exactly one place —
150
+ * the constants above — instead of being restated by the order of an if-chain.
151
+ */
152
+ const REASON_SUFFIX_BY_PRESENCE = {
153
+ [PRESENCE_INITIALIZES]: '',
154
+ [PRESENCE_DEFERRED]: DEFERRED_IMPORT_REASON_SUFFIX,
155
+ [PRESENCE_ERASED]: TYPE_ONLY_IMPORT_REASON_SUFFIX,
156
+ };
15
157
  export function emitImportEdges(graph, imports, scopeTree, reason = 'scope-resolution: import') {
16
- const seen = new Set();
17
- let emitted = 0;
158
+ /** dedupKey -> the pair, plus the strongest runtime presence reaching it. */
159
+ const pairs = new Map();
18
160
  for (const [scopeId, edges] of imports) {
161
+ // The key's only job here is naming the source file — see the module
162
+ // header on why it says nothing about where an import was written.
19
163
  const scope = scopeTree.getScope(scopeId);
20
164
  if (scope === undefined)
21
165
  continue;
@@ -25,22 +169,32 @@ export function emitImportEdges(graph, imports, scopeTree, reason = 'scope-resol
25
169
  continue;
26
170
  if (edge.targetFile === sourceFile)
27
171
  continue;
172
+ // Erasure is checked first: an `import type` inside a function is still
173
+ // erased, not merely deferred, and the two are not mutually exclusive.
174
+ const presence = edge.typeOnly === true
175
+ ? PRESENCE_ERASED
176
+ : edge.runsOnlyWhenCalled === true || edge.kind === 'dynamic-resolved'
177
+ ? PRESENCE_DEFERRED
178
+ : PRESENCE_INITIALIZES;
28
179
  const dedupKey = `${sourceFile}->${edge.targetFile}`;
29
- if (seen.has(dedupKey))
30
- continue;
31
- seen.add(dedupKey);
32
- const sourceId = generateId('File', sourceFile);
33
- const targetId = generateId('File', edge.targetFile);
34
- graph.addRelationship({
35
- id: generateId('IMPORTS', dedupKey),
36
- sourceId,
37
- targetId,
38
- type: 'IMPORTS',
39
- confidence: 1.0,
40
- reason,
41
- });
42
- emitted++;
180
+ const existing = pairs.get(dedupKey);
181
+ if (existing === undefined) {
182
+ pairs.set(dedupKey, { sourceFile, targetFile: edge.targetFile, presence });
183
+ }
184
+ else if (presence < existing.presence) {
185
+ existing.presence = presence;
186
+ }
43
187
  }
44
188
  }
45
- return emitted;
189
+ for (const [dedupKey, pair] of pairs) {
190
+ graph.addRelationship({
191
+ id: generateId('IMPORTS', dedupKey),
192
+ sourceId: generateId('File', pair.sourceFile),
193
+ targetId: generateId('File', pair.targetFile),
194
+ type: 'IMPORTS',
195
+ confidence: 1.0,
196
+ reason: reason + REASON_SUFFIX_BY_PRESENCE[pair.presence],
197
+ });
198
+ }
199
+ return pairs.size;
46
200
  }
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Build a `(filePath, name) → graphNodeId` lookup over the graph's
3
- * Function/Method/Class/Constructor nodes. Two keys per node:
3
+ * {@link LINKABLE_LABELS} definition nodes. Two keys per node:
4
4
  *
5
5
  * - simple name (`User` / `save`) — legacy fallback
6
6
  * - qualified name when derivable from the node id (`User.save`)
@@ -33,5 +33,60 @@ export type GraphNodeLookup = ReadonlyMap<string, string>;
33
33
  export declare function qualifiedKey(filePath: string, label: NodeLabel, qualifiedName: string): string;
34
34
  /** Simple-name key (legacy fallback keyspace — no `<q>` prefix). */
35
35
  export declare function simpleKey(filePath: string, name: string): string;
36
+ /**
37
+ * Position key: `(filePath, label, 0-based startLine, simple name)` (#2699).
38
+ *
39
+ * The strongest evidence there is, and the only one that needs no name
40
+ * qualification at all — a definition and its graph node are the same
41
+ * construct, so they share a source position. That makes it correct for
42
+ * exactly the cases a name-based key cannot express: a function-local
43
+ * declaration shadowing a file-level one, a local inside an ANONYMOUS
44
+ * function (no name to qualify with), and two same-named declarations in
45
+ * sibling blocks. ECMAScript gives each of those its own environment record;
46
+ * position is what distinguishes them without having to model the chain.
47
+ *
48
+ * Registered only for callable labels, and only when the (line, name) pair is
49
+ * unique in the file — a genuine tie (overloads declared on one line) stores
50
+ * the `AMBIGUOUS_POSITION` tombstone so the caller falls through to the
51
+ * name-based keys rather than picking by source order.
52
+ */
53
+ export declare function positionKey(filePath: string, label: NodeLabel, startLine: number, name: string): string;
54
+ /**
55
+ * Key recording that a FUNCTION-LOCAL callable with this simple name exists in the
56
+ * file (#2699 follow-up).
57
+ *
58
+ * `resolveDefGraphId`'s last resort is a label-agnostic, first-write-wins
59
+ * `simpleKey(filePath, simpleName)`. That is safe while at most one callable in a file
60
+ * carries a given simple name — but #2699 deliberately creates function-locals that
61
+ * share a name with a file-level callable, and the local's graph node is keyed by
62
+ * position (`run.pick@1:2`) while the scope def is not. When the position join misses —
63
+ * the two id phases anchor on different nodes, so a multiline `const pick =` puts the
64
+ * declaration and its initializer on different lines — the simple-name fallback aliases
65
+ * the local onto whichever same-named callable was registered FIRST and mints a
66
+ * fabricated edge. That is the exact failure class #2693 already shipped once.
67
+ *
68
+ * This lets the resolver fail CLOSED for precisely that case and only that case: if a
69
+ * local of this name exists, a position miss is a genuine ambiguity rather than a lookup
70
+ * gap, so emitting no edge is correct. Files with no such local are untouched, which
71
+ * keeps legitimate anchor differences (e.g. a Vue SFC `lineOffset`) resolving through the
72
+ * name keys exactly as before.
73
+ */
74
+ export declare function localNameKey(filePath: string, label: NodeLabel, name: string): string;
75
+ /** Tombstone for a position claimed by two nodes — see `positionKey`. */
76
+ export declare const AMBIGUOUS_POSITION = "";
36
77
  export declare function buildGraphNodeLookup(graph: KnowledgeGraph): GraphNodeLookup;
78
+ /**
79
+ * Every label {@link buildGraphNodeLookup} registers — and therefore the ONLY
80
+ * labels `resolveDefGraphId` can ever return an id for. Both endpoints of every
81
+ * scope-resolution edge come from that lookup (the one exception is the File
82
+ * fallback in `resolveCallerGraphId`), so this set defines the whole FROM/TO
83
+ * surface those edges can produce.
84
+ *
85
+ * That makes it load-bearing for the LadybugDB relation DDL: a label added here
86
+ * without the matching `FROM x TO y` pairs in `RELATION_SCHEMA` crashes
87
+ * `analyze` at `assertDeclaredPair` on whichever codebase first emits the pair
88
+ * (#2792). `test/unit/schema-pair-coverage.test.ts` derives the required pairs
89
+ * from this set and fails in CI instead.
90
+ */
91
+ export declare const LINKABLE_LABELS: ReadonlySet<NodeLabel>;
37
92
  export declare function isLinkableLabel(label: NodeLabel): boolean;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Build a `(filePath, name) → graphNodeId` lookup over the graph's
3
- * Function/Method/Class/Constructor nodes. Two keys per node:
3
+ * {@link LINKABLE_LABELS} definition nodes. Two keys per node:
4
4
  *
5
5
  * - simple name (`User` / `save`) — legacy fallback
6
6
  * - qualified name when derivable from the node id (`User.save`)
@@ -17,11 +17,11 @@
17
17
  * `SymbolDefinition.nodeId` values into the legacy graph-node ID
18
18
  * format that downstream consumers (queries, edges, MCP) expect.
19
19
  */
20
- import { isOverloadableCallable } from '../../utils/callable-labels.js';
20
+ import { isOverloadableCallable, isPositionQualifiedLocalLabel, } from '../../utils/callable-labels.js';
21
21
  import { templateConstraintsIdTag } from '../../utils/template-arguments.js';
22
22
  import { parameterShapeIdTag } from '../../utils/method-props.js';
23
23
  /**
24
- * Parse a qualified name out of a Function/Method node id.
24
+ * Parse a qualified name out of a linkable graph-node id.
25
25
  *
26
26
  * Node id format: `${label}:${filePath}:${qualifiedName}${arityTag}`,
27
27
  * where `arityTag` is `#<n>` (or empty). Strips the known-length
@@ -59,6 +59,51 @@ export function qualifiedKey(filePath, label, qualifiedName) {
59
59
  export function simpleKey(filePath, name) {
60
60
  return `${filePath}::${name}`;
61
61
  }
62
+ /**
63
+ * Position key: `(filePath, label, 0-based startLine, simple name)` (#2699).
64
+ *
65
+ * The strongest evidence there is, and the only one that needs no name
66
+ * qualification at all — a definition and its graph node are the same
67
+ * construct, so they share a source position. That makes it correct for
68
+ * exactly the cases a name-based key cannot express: a function-local
69
+ * declaration shadowing a file-level one, a local inside an ANONYMOUS
70
+ * function (no name to qualify with), and two same-named declarations in
71
+ * sibling blocks. ECMAScript gives each of those its own environment record;
72
+ * position is what distinguishes them without having to model the chain.
73
+ *
74
+ * Registered only for callable labels, and only when the (line, name) pair is
75
+ * unique in the file — a genuine tie (overloads declared on one line) stores
76
+ * the `AMBIGUOUS_POSITION` tombstone so the caller falls through to the
77
+ * name-based keys rather than picking by source order.
78
+ */
79
+ export function positionKey(filePath, label, startLine, name) {
80
+ return `<p>:${filePath}::${label}::${startLine}::${name}`;
81
+ }
82
+ /**
83
+ * Key recording that a FUNCTION-LOCAL callable with this simple name exists in the
84
+ * file (#2699 follow-up).
85
+ *
86
+ * `resolveDefGraphId`'s last resort is a label-agnostic, first-write-wins
87
+ * `simpleKey(filePath, simpleName)`. That is safe while at most one callable in a file
88
+ * carries a given simple name — but #2699 deliberately creates function-locals that
89
+ * share a name with a file-level callable, and the local's graph node is keyed by
90
+ * position (`run.pick@1:2`) while the scope def is not. When the position join misses —
91
+ * the two id phases anchor on different nodes, so a multiline `const pick =` puts the
92
+ * declaration and its initializer on different lines — the simple-name fallback aliases
93
+ * the local onto whichever same-named callable was registered FIRST and mints a
94
+ * fabricated edge. That is the exact failure class #2693 already shipped once.
95
+ *
96
+ * This lets the resolver fail CLOSED for precisely that case and only that case: if a
97
+ * local of this name exists, a position miss is a genuine ambiguity rather than a lookup
98
+ * gap, so emitting no edge is correct. Files with no such local are untouched, which
99
+ * keeps legitimate anchor differences (e.g. a Vue SFC `lineOffset`) resolving through the
100
+ * name keys exactly as before.
101
+ */
102
+ export function localNameKey(filePath, label, name) {
103
+ return `<l>:${filePath}::${label}::${name}`;
104
+ }
105
+ /** Tombstone for a position claimed by two nodes — see `positionKey`. */
106
+ export const AMBIGUOUS_POSITION = '';
62
107
  export function buildGraphNodeLookup(graph) {
63
108
  const lookup = new Map();
64
109
  for (const node of graph.iterNodes()) {
@@ -67,6 +112,20 @@ export function buildGraphNodeLookup(graph) {
67
112
  continue;
68
113
  if (!isLinkableLabel(node.label))
69
114
  continue;
115
+ // Position key (#2699) — see `positionKey`. Second write on a key marks it
116
+ // ambiguous rather than letting source order decide.
117
+ const startLine = props.startLine;
118
+ if (startLine !== undefined && isPositionQualifiedLocalLabel(node.label)) {
119
+ const posK = positionKey(props.filePath, node.label, startLine, props.name);
120
+ lookup.set(posK, lookup.has(posK) ? AMBIGUOUS_POSITION : node.id);
121
+ // A local-identity node carries `@<row>:<col>` on its last name segment. Record
122
+ // that a local of this simple name exists, so the resolver can fail closed on a
123
+ // position miss instead of aliasing through the simple-name fallback.
124
+ const qualForLocal = parseQualifiedFromId(node.id, node.label, props.filePath);
125
+ if (qualForLocal !== undefined && /@\d+:\d+$/.test(qualForLocal)) {
126
+ lookup.set(localNameKey(props.filePath, node.label, props.name), node.id);
127
+ }
128
+ }
70
129
  // Primary key: fully-qualified name + label, in a separate
71
130
  // keyspace from simple names. Class nodes carry `qualifiedName`
72
131
  // in their properties (set by the parsing processor).
@@ -140,7 +199,7 @@ export function buildGraphNodeLookup(graph) {
140
199
  lookup.set(tKey, node.id);
141
200
  }
142
201
  }
143
- // Fallback key: simple name. First-wins within a file — used when
202
+ // Fallback key: simple name. Source-order first-wins within a file — used when
144
203
  // the caller doesn't know the qualifier (unqualified free-call
145
204
  // fallback, cross-file resolution where MethodRegistry already
146
205
  // disambiguated the owner).
@@ -150,33 +209,72 @@ export function buildGraphNodeLookup(graph) {
150
209
  }
151
210
  return lookup;
152
211
  }
212
+ /**
213
+ * Every label {@link buildGraphNodeLookup} registers — and therefore the ONLY
214
+ * labels `resolveDefGraphId` can ever return an id for. Both endpoints of every
215
+ * scope-resolution edge come from that lookup (the one exception is the File
216
+ * fallback in `resolveCallerGraphId`), so this set defines the whole FROM/TO
217
+ * surface those edges can produce.
218
+ *
219
+ * That makes it load-bearing for the LadybugDB relation DDL: a label added here
220
+ * without the matching `FROM x TO y` pairs in `RELATION_SCHEMA` crashes
221
+ * `analyze` at `assertDeclaredPair` on whichever codebase first emits the pair
222
+ * (#2792). `test/unit/schema-pair-coverage.test.ts` derives the required pairs
223
+ * from this set and fails in CI instead.
224
+ */
225
+ export const LINKABLE_LABELS = new Set([
226
+ 'Function',
227
+ 'Method',
228
+ 'Constructor',
229
+ // Program-like module declarations are provider-gated callable-value
230
+ // targets and need the same def→graph bridge.
231
+ 'Module',
232
+ 'Class',
233
+ 'Interface',
234
+ 'Struct',
235
+ 'Enum',
236
+ // Record participates in the same def→graph bridge as other class-like
237
+ // declarations. Without this entry, its qualified/template lookup branches
238
+ // are unreachable and label-agnostic fallback can alias it to a same-named
239
+ // Constructor or Method (#2801).
240
+ 'Record',
241
+ // Trait nodes are linkable so MRO builders can bridge PHP/Rust trait
242
+ // defs between scope-resolution DefIds and the graph's node ids.
243
+ // IMPLEMENTS edges from classes to traits are otherwise invisible to
244
+ // the scope-resolution MRO pass.
245
+ 'Trait',
246
+ // TypeAlias is linkable for the same reason Trait is (R2-2). The alias
247
+ // resolves fine — `CLASS_KINDS` has always listed it, and the ClassRegistry
248
+ // returns the def — but without an entry here `resolveDefGraphId` cannot
249
+ // bridge that def to its graph node, so the edge is dropped after a
250
+ // SUCCESSFUL lookup. That is why an exported contract type owned its members
251
+ // and still reported `incoming: {}`: the failure was one table away from
252
+ // everything that appeared to be responsible.
253
+ //
254
+ // Covers every language that spells an alias this way — TypeScript, Kotlin,
255
+ // Dart and Rust all emit `@declaration.type_alias`. The remaining
256
+ // `CLASS_KINDS` entries (Typedef, Record, Union, Delegate, Annotation,
257
+ // Template) plausibly have the same gap, but nothing exercises them today
258
+ // and adding labels no test covers is how this list drifts out of sync with
259
+ // what it claims.
260
+ 'TypeAlias',
261
+ // Variable / Property are linkable too — receiver-bound write/read
262
+ // ACCESSES edges target field nodes (e.g. `user.name = "x"` →
263
+ // ACCESSES edge to User's `name` Variable/Property node).
264
+ 'Variable',
265
+ 'Property',
266
+ // Const is linkable so the value-receiver-owner bridge in
267
+ // `receiver-bound-calls.ts` Case 5 can translate the scope-resolution
268
+ // `Variable` def for `export const fooService = {...}` to the canonical
269
+ // `Const:filePath:name` graph node id, against which object-literal
270
+ // method symbols register their `ownerId` (PR #1718 / issue #1358).
271
+ 'Const',
272
+ // Macro nodes are linkable so a macro invocation (`log!(…)`) resolved
273
+ // via `MacroRegistry` can bridge its scope-resolution `Macro` def to
274
+ // the legacy `@definition.macro` graph node and emit the `USES` edge
275
+ // (Rust #1934 F72; also covers C/C++ `#define` macro defs).
276
+ 'Macro',
277
+ ]);
153
278
  export function isLinkableLabel(label) {
154
- return (label === 'Function' ||
155
- label === 'Method' ||
156
- label === 'Constructor' ||
157
- label === 'Class' ||
158
- label === 'Interface' ||
159
- label === 'Struct' ||
160
- label === 'Enum' ||
161
- // Trait nodes are linkable so MRO builders can bridge PHP/Rust trait
162
- // defs between scope-resolution DefIds and the graph's node ids.
163
- // IMPLEMENTS edges from classes to traits are otherwise invisible to
164
- // the scope-resolution MRO pass.
165
- label === 'Trait' ||
166
- // Variable / Property are linkable too — receiver-bound write/read
167
- // ACCESSES edges target field nodes (e.g. `user.name = "x"` →
168
- // ACCESSES edge to User's `name` Variable/Property node).
169
- label === 'Variable' ||
170
- label === 'Property' ||
171
- // Const is linkable so the value-receiver-owner bridge in
172
- // `receiver-bound-calls.ts` Case 5 can translate the scope-resolution
173
- // `Variable` def for `export const fooService = {...}` to the canonical
174
- // `Const:filePath:name` graph node id, against which object-literal
175
- // method symbols register their `ownerId` (PR #1718 / issue #1358).
176
- label === 'Const' ||
177
- // Macro nodes are linkable so a macro invocation (`log!(…)`) resolved
178
- // via `MacroRegistry` can bridge its scope-resolution `Macro` def to
179
- // the legacy `@definition.macro` graph node and emit the `USES` edge
180
- // (Rust #1934 F72; also covers C/C++ `#define` macro defs).
181
- label === 'Macro');
279
+ return LINKABLE_LABELS.has(label);
182
280
  }
@@ -30,13 +30,42 @@ import type { CalleeIdSink } from '../graph-bridge/callee-id-sink.js';
30
30
  * `${filePath}:${startLine}:${startCol}`.
31
31
  */
32
32
  type ReferenceSiteSkipSet = ReadonlySet<string>;
33
+ /**
34
+ * Value labels whose defs MAY be function-local. A reference to one of these is
35
+ * dropped only when the def is positively identified as living inside a function
36
+ * body — see `functionLocalValueDefIds`. Everything else, including a class
37
+ * member in a language that keeps no values at module scope, is emitted.
38
+ */
33
39
  export declare function emitReferencesViaLookup(graph: KnowledgeGraph, scopes: ScopeResolutionIndexes, referenceIndex: {
34
40
  readonly bySourceScope: ReadonlyMap<ScopeId, readonly Reference[]>;
35
41
  }, nodeLookup: GraphNodeLookup, skipSites?: ReferenceSiteSkipSet,
36
42
  /** Resolved-callee-id capture sink (#2227 U2). Threaded in only under
37
43
  * `--pdg`; `undefined` ⇒ zero overhead, byte-identity (R4). Captured at the
38
44
  * CALLS emit below BEFORE this loop's `seen` dedup (KTD6/R8). */
39
- calleeIdSink?: CalleeIdSink): {
45
+ calleeIdSink?: CalleeIdSink,
46
+ /**
47
+ * Def ids of value symbols bound inside a FUNCTION body. When supplied, a
48
+ * read/write whose target is a `Const`/`Variable`/`Static` in this set emits
49
+ * no edge.
50
+ *
51
+ * Bare-identifier reads (A2) made module-scope constants answerable, but the
52
+ * same capture also matches a read of a BLOCK-LOCAL `const`. An edge to one
53
+ * of those keeps alive precisely the inert local symbols `pruneLocalSymbols`
54
+ * exists to drop — turning a pruned node into a retained node plus an edge,
55
+ * in every function of every indexed repo. "Who uses this constant?" is a
56
+ * question about a module's surface; a local's uses are the three lines
57
+ * around it.
58
+ *
59
+ * A BLOCKLIST, not an allowlist, and the direction is the point. Asking
60
+ * "is this def module-level?" silently excludes class members — Java/C#
61
+ * fields, Python class attributes — which are neither module-level nor local.
62
+ * Asking "is this def function-local?" excludes only what it can positively
63
+ * identify, so an unrecognised or uninspected def is emitted. A stray inert
64
+ * local is recoverable; a deleted edge class reads as "nothing uses this".
65
+ *
66
+ * Optional so callers that never capture bare identifiers are unchanged.
67
+ */
68
+ functionLocalValueDefIds?: ReadonlySet<string>): {
40
69
  emitted: number;
41
70
  skipped: number;
42
71
  };