gitnexus 1.6.11-rc.8 → 1.6.11

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 (531) hide show
  1. package/README.md +95 -26
  2. package/dist/_shared/graph/types.d.ts +81 -2
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/integrations/circuit-breaker.d.ts.map +1 -1
  5. package/dist/_shared/integrations/circuit-breaker.js.map +1 -1
  6. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  7. package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
  8. package/dist/_shared/language-detection.d.ts.map +1 -1
  9. package/dist/_shared/language-detection.js +2 -0
  10. package/dist/_shared/language-detection.js.map +1 -1
  11. package/dist/_shared/languages.d.ts +2 -1
  12. package/dist/_shared/languages.d.ts.map +1 -1
  13. package/dist/_shared/languages.js +1 -0
  14. package/dist/_shared/languages.js.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 +4 -0
  18. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  19. package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
  20. package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -0
  21. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  22. package/dist/_shared/scope-resolution/language-classification.d.ts +3 -0
  23. package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
  24. package/dist/_shared/scope-resolution/language-classification.js +4 -0
  25. package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
  26. package/dist/_shared/scope-resolution/reference-site.d.ts +10 -0
  27. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  28. package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
  29. package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
  30. package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
  31. package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
  32. package/dist/_shared/scope-resolution/types.d.ts +15 -0
  33. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  34. package/dist/cli/ai-context.d.ts +4 -0
  35. package/dist/cli/ai-context.js +90 -14
  36. package/dist/cli/analyze-config.js +14 -0
  37. package/dist/cli/analyze-options.d.ts +14 -0
  38. package/dist/cli/analyze-watch.d.ts +20 -0
  39. package/dist/cli/analyze-watch.js +434 -0
  40. package/dist/cli/analyze.js +27 -9
  41. package/dist/cli/auto-sync.d.ts +1 -0
  42. package/dist/cli/auto-sync.js +107 -0
  43. package/dist/cli/command-banner.d.ts +15 -0
  44. package/dist/cli/command-banner.js +42 -0
  45. package/dist/cli/detect-changes-format.js +21 -0
  46. package/dist/cli/doctor.d.ts +7 -0
  47. package/dist/cli/doctor.js +14 -0
  48. package/dist/cli/group.js +7 -1
  49. package/dist/cli/help-i18n.js +4 -0
  50. package/dist/cli/i18n/en.d.ts +18 -3
  51. package/dist/cli/i18n/en.js +18 -3
  52. package/dist/cli/i18n/resources.d.ts +33 -3
  53. package/dist/cli/i18n/zh-CN.d.ts +15 -0
  54. package/dist/cli/i18n/zh-CN.js +18 -3
  55. package/dist/cli/index.js +34 -7
  56. package/dist/cli/mcp.d.ts +15 -0
  57. package/dist/cli/mcp.js +44 -0
  58. package/dist/cli/optional-grammars.d.ts +3 -2
  59. package/dist/cli/optional-grammars.js +19 -3
  60. package/dist/cli/setup.js +41 -15
  61. package/dist/cli/update-notice.d.ts +34 -0
  62. package/dist/cli/update-notice.js +91 -0
  63. package/dist/cli/update.d.ts +21 -0
  64. package/dist/cli/update.js +93 -0
  65. package/dist/cli/watch.d.ts +1 -20
  66. package/dist/cli/watch.js +5 -371
  67. package/dist/core/analysis-feature-registry.d.ts +2 -0
  68. package/dist/core/analysis-feature-registry.js +15 -0
  69. package/dist/core/analyzer-identity.js +21 -3
  70. package/dist/core/auto-sync/analysis-worker-launch.d.ts +30 -0
  71. package/dist/core/auto-sync/analysis-worker-launch.js +166 -0
  72. package/dist/core/auto-sync/config.d.ts +33 -0
  73. package/dist/core/auto-sync/config.js +320 -0
  74. package/dist/core/auto-sync/index.d.ts +6 -0
  75. package/dist/core/auto-sync/index.js +6 -0
  76. package/dist/core/auto-sync/path-security.d.ts +9 -0
  77. package/dist/core/auto-sync/path-security.js +251 -0
  78. package/dist/core/auto-sync/repo.d.ts +1 -0
  79. package/dist/core/auto-sync/repo.js +6 -0
  80. package/dist/core/auto-sync/runner.d.ts +44 -0
  81. package/dist/core/auto-sync/runner.js +428 -0
  82. package/dist/core/auto-sync/starter.d.ts +50 -0
  83. package/dist/core/auto-sync/starter.js +497 -0
  84. package/dist/core/auto-sync/state.d.ts +37 -0
  85. package/dist/core/auto-sync/state.js +119 -0
  86. package/dist/core/group/config-parser.js +8 -1
  87. package/dist/core/group/cross-impact.d.ts +3 -0
  88. package/dist/core/group/cross-impact.js +36 -4
  89. package/dist/core/group/extractors/http-patterns/java.js +22 -8
  90. package/dist/core/group/extractors/http-patterns/kotlin.js +86 -31
  91. package/dist/core/group/extractors/http-patterns/node.js +145 -8
  92. package/dist/core/group/extractors/http-patterns/python.js +11 -7
  93. package/dist/core/group/extractors/http-route-extractor.js +63 -17
  94. package/dist/core/group/extractors/java-workspace-extractor.js +244 -31
  95. package/dist/core/group/group-lock.js +5 -6
  96. package/dist/core/group/normalization.d.ts +38 -1
  97. package/dist/core/group/normalization.js +59 -3
  98. package/dist/core/group/service.d.ts +11 -0
  99. package/dist/core/group/service.js +13 -1
  100. package/dist/core/group/storage.js +2 -2
  101. package/dist/core/group/sync.d.ts +24 -1
  102. package/dist/core/group/sync.js +46 -8
  103. package/dist/core/group/types.d.ts +13 -0
  104. package/dist/core/incremental/derived-writeback.d.ts +36 -0
  105. package/dist/core/incremental/derived-writeback.js +68 -0
  106. package/dist/core/incremental/spring-config-drift.d.ts +12 -0
  107. package/dist/core/incremental/spring-config-drift.js +46 -0
  108. package/dist/core/incremental/subgraph-extract.d.ts +7 -4
  109. package/dist/core/incremental/subgraph-extract.js +30 -5
  110. package/dist/core/ingestion/asyncapi/document.d.ts +226 -0
  111. package/dist/core/ingestion/asyncapi/document.js +758 -0
  112. package/dist/core/ingestion/asyncapi/protocol.d.ts +79 -0
  113. package/dist/core/ingestion/asyncapi/protocol.js +203 -0
  114. package/dist/core/ingestion/call-extractors/configs/zig.d.ts +2 -0
  115. package/dist/core/ingestion/call-extractors/configs/zig.js +4 -0
  116. package/dist/core/ingestion/call-extractors/zig-static-gating.d.ts +100 -0
  117. package/dist/core/ingestion/call-extractors/zig-static-gating.js +319 -0
  118. package/dist/core/ingestion/call-processor.js +3 -1
  119. package/dist/core/ingestion/class-extractors/configs/zig.d.ts +2 -0
  120. package/dist/core/ingestion/class-extractors/configs/zig.js +32 -0
  121. package/dist/core/ingestion/class-extractors/generic.js +4 -1
  122. package/dist/core/ingestion/class-types.d.ts +6 -2
  123. package/dist/core/ingestion/destination-key.d.ts +59 -0
  124. package/dist/core/ingestion/destination-key.js +61 -0
  125. package/dist/core/ingestion/entry-point-scoring.d.ts +6 -2
  126. package/dist/core/ingestion/entry-point-scoring.js +8 -44
  127. package/dist/core/ingestion/export-detection.d.ts +37 -0
  128. package/dist/core/ingestion/export-detection.js +60 -0
  129. package/dist/core/ingestion/field-extractors/configs/zig.d.ts +8 -0
  130. package/dist/core/ingestion/field-extractors/configs/zig.js +49 -0
  131. package/dist/core/ingestion/field-extractors/generic.d.ts +1 -1
  132. package/dist/core/ingestion/field-extractors/generic.js +12 -1
  133. package/dist/core/ingestion/frameworks/spring/actuator-runtime.d.ts +26 -0
  134. package/dist/core/ingestion/frameworks/spring/actuator-runtime.js +843 -0
  135. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +5 -0
  136. package/dist/core/ingestion/frameworks/spring/analysis-features.js +9 -0
  137. package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +8 -1
  138. package/dist/core/ingestion/frameworks/spring/argument-facts.d.ts +80 -0
  139. package/dist/core/ingestion/frameworks/spring/argument-facts.js +85 -0
  140. package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +1 -0
  141. package/dist/core/ingestion/frameworks/spring/config-bindings.js +2 -1
  142. package/dist/core/ingestion/frameworks/spring/destinations.d.ts +539 -0
  143. package/dist/core/ingestion/frameworks/spring/destinations.js +840 -0
  144. package/dist/core/ingestion/frameworks/spring/dynamic-lookups.d.ts +22 -0
  145. package/dist/core/ingestion/frameworks/spring/dynamic-lookups.js +124 -0
  146. package/dist/core/ingestion/frameworks/spring/message-producers.d.ts +78 -0
  147. package/dist/core/ingestion/frameworks/spring/message-producers.js +90 -0
  148. package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +29 -0
  149. package/dist/core/ingestion/frameworks/spring/vendor-prefixes.d.ts +7 -0
  150. package/dist/core/ingestion/frameworks/spring/vendor-prefixes.js +22 -0
  151. package/dist/core/ingestion/import-resolvers/configs/zig.d.ts +13 -0
  152. package/dist/core/ingestion/import-resolvers/configs/zig.js +26 -0
  153. package/dist/core/ingestion/import-resolvers/zig.d.ts +34 -0
  154. package/dist/core/ingestion/import-resolvers/zig.js +193 -0
  155. package/dist/core/ingestion/language-config.d.ts +177 -0
  156. package/dist/core/ingestion/language-config.js +719 -0
  157. package/dist/core/ingestion/language-provider.d.ts +178 -1
  158. package/dist/core/ingestion/language-provider.js +22 -0
  159. package/dist/core/ingestion/languages/csharp/razor-view-components.d.ts +62 -0
  160. package/dist/core/ingestion/languages/csharp/razor-view-components.js +954 -0
  161. package/dist/core/ingestion/languages/csharp/resolution-config.d.ts +3 -0
  162. package/dist/core/ingestion/languages/csharp/resolution-config.js +6 -1
  163. package/dist/core/ingestion/languages/csharp/scope-resolver.js +8 -0
  164. package/dist/core/ingestion/languages/index.d.ts +1 -0
  165. package/dist/core/ingestion/languages/index.js +2 -0
  166. package/dist/core/ingestion/languages/java/analysis-features.d.ts +1 -1
  167. package/dist/core/ingestion/languages/java/analysis-features.js +14 -6
  168. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +8 -0
  169. package/dist/core/ingestion/languages/java/capture-side-channel.js +34 -0
  170. package/dist/core/ingestion/languages/java/captures.js +22 -1
  171. package/dist/core/ingestion/languages/java/lombok-synthesizer.d.ts +42 -0
  172. package/dist/core/ingestion/languages/java/lombok-synthesizer.js +439 -0
  173. package/dist/core/ingestion/languages/java/scope-resolver.js +2 -0
  174. package/dist/core/ingestion/languages/java/spring-actuator.d.ts +2 -0
  175. package/dist/core/ingestion/languages/java/spring-actuator.js +62 -0
  176. package/dist/core/ingestion/languages/java/spring-di.d.ts +17 -1
  177. package/dist/core/ingestion/languages/java/spring-di.js +44 -2
  178. package/dist/core/ingestion/languages/java/spring-dynamic-lookup.d.ts +8 -0
  179. package/dist/core/ingestion/languages/java/spring-dynamic-lookup.js +62 -0
  180. package/dist/core/ingestion/languages/java/spring-message-producers.d.ts +20 -0
  181. package/dist/core/ingestion/languages/java/spring-message-producers.js +83 -0
  182. package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +11 -1
  183. package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +13 -3
  184. package/dist/core/ingestion/languages/java.js +18 -8
  185. package/dist/core/ingestion/languages/jvm/accessor-synthesis.d.ts +99 -0
  186. package/dist/core/ingestion/languages/jvm/accessor-synthesis.js +173 -0
  187. package/dist/core/ingestion/languages/jvm/beanspec.d.ts +17 -0
  188. package/dist/core/ingestion/languages/jvm/beanspec.js +42 -0
  189. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
  190. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +50 -0
  191. package/dist/core/ingestion/languages/kotlin/captures.js +24 -1
  192. package/dist/core/ingestion/languages/kotlin/lombok-synthesizer.d.ts +26 -0
  193. package/dist/core/ingestion/languages/kotlin/lombok-synthesizer.js +417 -0
  194. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +4 -0
  195. package/dist/core/ingestion/languages/kotlin/spring-actuator.d.ts +4 -0
  196. package/dist/core/ingestion/languages/kotlin/spring-actuator.js +172 -0
  197. package/dist/core/ingestion/languages/kotlin/spring-config-bindings.d.ts +18 -0
  198. package/dist/core/ingestion/languages/kotlin/spring-config-bindings.js +411 -0
  199. package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +51 -1
  200. package/dist/core/ingestion/languages/kotlin/spring-di.js +86 -6
  201. package/dist/core/ingestion/languages/kotlin/spring-dynamic-lookup.d.ts +8 -0
  202. package/dist/core/ingestion/languages/kotlin/spring-dynamic-lookup.js +77 -0
  203. package/dist/core/ingestion/languages/kotlin/spring-message-producers.d.ts +17 -0
  204. package/dist/core/ingestion/languages/kotlin/spring-message-producers.js +119 -0
  205. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +16 -0
  206. package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +77 -2
  207. package/dist/core/ingestion/languages/kotlin.js +24 -0
  208. package/dist/core/ingestion/languages/python.js +2 -0
  209. package/dist/core/ingestion/languages/rust/query.js +8 -8
  210. package/dist/core/ingestion/languages/zig/captures.d.ts +260 -0
  211. package/dist/core/ingestion/languages/zig/captures.js +2070 -0
  212. package/dist/core/ingestion/languages/zig/index.d.ts +4 -0
  213. package/dist/core/ingestion/languages/zig/index.js +4 -0
  214. package/dist/core/ingestion/languages/zig/interpret.d.ts +36 -0
  215. package/dist/core/ingestion/languages/zig/interpret.js +176 -0
  216. package/dist/core/ingestion/languages/zig/query.d.ts +3 -0
  217. package/dist/core/ingestion/languages/zig/query.js +426 -0
  218. package/dist/core/ingestion/languages/zig/range-binding.d.ts +37 -0
  219. package/dist/core/ingestion/languages/zig/range-binding.js +373 -0
  220. package/dist/core/ingestion/languages/zig/scope-resolver.d.ts +12 -0
  221. package/dist/core/ingestion/languages/zig/scope-resolver.js +58 -0
  222. package/dist/core/ingestion/languages/zig/simple-hooks.d.ts +25 -0
  223. package/dist/core/ingestion/languages/zig/simple-hooks.js +143 -0
  224. package/dist/core/ingestion/languages/zig.d.ts +32 -0
  225. package/dist/core/ingestion/languages/zig.js +130 -0
  226. package/dist/core/ingestion/method-extractors/configs/zig.d.ts +2 -0
  227. package/dist/core/ingestion/method-extractors/configs/zig.js +120 -0
  228. package/dist/core/ingestion/method-extractors/generic.js +16 -4
  229. package/dist/core/ingestion/method-types.d.ts +10 -4
  230. package/dist/core/ingestion/model/field-registry.d.ts +3 -3
  231. package/dist/core/ingestion/model/field-registry.js +11 -7
  232. package/dist/core/ingestion/model/method-registry.d.ts +3 -3
  233. package/dist/core/ingestion/model/method-registry.js +13 -8
  234. package/dist/core/ingestion/model/registration-table.js +3 -0
  235. package/dist/core/ingestion/model/type-registry.js +8 -4
  236. package/dist/core/ingestion/pipeline-phases/di.js +47 -14
  237. package/dist/core/ingestion/pipeline-phases/index.d.ts +1 -0
  238. package/dist/core/ingestion/pipeline-phases/index.js +1 -0
  239. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +7 -1
  240. package/dist/core/ingestion/pipeline-phases/parse-impl.js +79 -91
  241. package/dist/core/ingestion/pipeline-phases/parse.d.ts +17 -0
  242. package/dist/core/ingestion/pipeline-phases/processes.d.ts +2 -1
  243. package/dist/core/ingestion/pipeline-phases/processes.js +39 -4
  244. package/dist/core/ingestion/pipeline-phases/routes.js +27 -18
  245. package/dist/core/ingestion/pipeline-phases/runner.d.ts +4 -1
  246. package/dist/core/ingestion/pipeline-phases/runner.js +34 -14
  247. package/dist/core/ingestion/pipeline-phases/scan.js +82 -1
  248. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +2 -0
  249. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +8 -0
  250. package/dist/core/ingestion/pipeline-phases/spring-destinations.d.ts +123 -0
  251. package/dist/core/ingestion/pipeline-phases/spring-destinations.js +688 -0
  252. package/dist/core/ingestion/pipeline.d.ts +30 -1
  253. package/dist/core/ingestion/pipeline.js +52 -14
  254. package/dist/core/ingestion/resolve-references.js +5 -0
  255. package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +16 -0
  256. package/dist/core/ingestion/route-extractors/constant-resolver.js +10 -0
  257. package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +27 -1
  258. package/dist/core/ingestion/route-extractors/java-const-resolver.js +161 -13
  259. package/dist/core/ingestion/route-extractors/kotlin-const-resolver.d.ts +12 -18
  260. package/dist/core/ingestion/route-extractors/kotlin-const-resolver.js +214 -33
  261. package/dist/core/ingestion/route-extractors/kotlin-spring.d.ts +13 -0
  262. package/dist/core/ingestion/route-extractors/kotlin-spring.js +259 -0
  263. package/dist/core/ingestion/route-extractors/python-decorator-handler.d.ts +6 -0
  264. package/dist/core/ingestion/route-extractors/python-decorator-handler.js +16 -0
  265. package/dist/core/ingestion/route-extractors/spring-shared.d.ts +30 -1
  266. package/dist/core/ingestion/route-extractors/spring-shared.js +77 -9
  267. package/dist/core/ingestion/route-extractors/spring.js +9 -5
  268. package/dist/core/ingestion/scope-extractor.js +8 -0
  269. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +62 -0
  270. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +4 -0
  271. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +2 -0
  272. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +28 -0
  273. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +11 -2
  274. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +23 -2
  275. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +24 -3
  276. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +11 -1
  277. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +26 -6
  278. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +11 -0
  279. package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +29 -3
  280. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +8 -1
  281. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +35 -9
  282. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +1 -4
  283. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +277 -9
  284. package/dist/core/ingestion/scope-resolution/pipeline/registry.js +2 -0
  285. package/dist/core/ingestion/scope-resolution/pipeline/run.js +7 -3
  286. package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +43 -9
  287. package/dist/core/ingestion/scope-resolution/scope/walkers.js +71 -10
  288. package/dist/core/ingestion/tree-sitter-queries.d.ts +1 -0
  289. package/dist/core/ingestion/tree-sitter-queries.js +161 -0
  290. package/dist/core/ingestion/type-extractors/zig.d.ts +2 -0
  291. package/dist/core/ingestion/type-extractors/zig.js +17 -0
  292. package/dist/core/ingestion/utils/ast-helpers.d.ts +40 -1
  293. package/dist/core/ingestion/utils/ast-helpers.js +124 -6
  294. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +9 -0
  295. package/dist/core/ingestion/utils/callable-flow-captures.js +75 -14
  296. package/dist/core/ingestion/utils/test-file-path.d.ts +28 -0
  297. package/dist/core/ingestion/utils/test-file-path.js +87 -0
  298. package/dist/core/ingestion/variable-extractors/configs/zig.d.ts +2 -0
  299. package/dist/core/ingestion/variable-extractors/configs/zig.js +71 -0
  300. package/dist/core/ingestion/workers/parse-worker.js +85 -14
  301. package/dist/core/install-context.d.ts +4 -0
  302. package/dist/core/install-context.js +152 -0
  303. package/dist/core/lbug/csv-generator.d.ts +10 -1
  304. package/dist/core/lbug/csv-generator.js +92 -22
  305. package/dist/core/lbug/graph-emit-sink.d.ts +3 -2
  306. package/dist/core/lbug/graph-emit-sink.js +4 -2
  307. package/dist/core/lbug/lbug-adapter.d.ts +100 -5
  308. package/dist/core/lbug/lbug-adapter.js +236 -24
  309. package/dist/core/lbug/schema.d.ts +6 -5
  310. package/dist/core/lbug/schema.js +84 -22
  311. package/dist/core/net/url-guard.d.ts +6 -0
  312. package/dist/core/net/url-guard.js +147 -0
  313. package/dist/core/package-version.d.ts +5 -0
  314. package/dist/core/package-version.js +10 -0
  315. package/dist/core/run-analyze.d.ts +21 -4
  316. package/dist/core/run-analyze.js +426 -117
  317. package/dist/core/search/fts-indexes.d.ts +19 -1
  318. package/dist/core/search/fts-indexes.js +28 -1
  319. package/dist/core/tree-sitter/parser-loader.js +16 -0
  320. package/dist/core/update-cache.d.ts +39 -0
  321. package/dist/core/update-cache.js +141 -0
  322. package/dist/core/update-check.d.ts +31 -0
  323. package/dist/core/update-check.js +274 -0
  324. package/dist/mcp/local/local-backend.d.ts +27 -13
  325. package/dist/mcp/local/local-backend.js +148 -60
  326. package/dist/mcp/repository-policy.d.ts +5 -1
  327. package/dist/mcp/repository-policy.js +48 -4
  328. package/dist/mcp/resources.js +10 -1
  329. package/dist/mcp/server.js +8 -9
  330. package/dist/mcp/tools.js +32 -22
  331. package/dist/server/analyze-launch.d.ts +2 -0
  332. package/dist/server/analyze-launch.js +2 -0
  333. package/dist/server/analyze-worker-protocol.d.ts +6 -1
  334. package/dist/server/analyze-worker.d.ts +1 -0
  335. package/dist/server/analyze-worker.js +38 -20
  336. package/dist/server/api.d.ts +5 -1
  337. package/dist/server/api.js +105 -88
  338. package/dist/server/git-clone.d.ts +40 -16
  339. package/dist/server/git-clone.js +253 -199
  340. package/dist/server/grep-params.d.ts +18 -0
  341. package/dist/server/grep-params.js +83 -0
  342. package/dist/server/grep-scan.d.ts +23 -0
  343. package/dist/server/grep-scan.js +107 -0
  344. package/dist/server/grep-worker.d.ts +1 -0
  345. package/dist/server/grep-worker.js +12 -0
  346. package/dist/server/mcp-http.d.ts +8 -0
  347. package/dist/server/mcp-http.js +16 -1
  348. package/dist/server/update-controller.d.ts +29 -0
  349. package/dist/server/update-controller.js +82 -0
  350. package/dist/storage/file-lock.d.ts +15 -0
  351. package/dist/storage/file-lock.js +155 -0
  352. package/dist/storage/fs-atomic.d.ts +24 -0
  353. package/dist/storage/fs-atomic.js +86 -2
  354. package/dist/storage/global-dir.d.ts +2 -0
  355. package/dist/storage/global-dir.js +6 -0
  356. package/dist/storage/parse-cache.d.ts +45 -7
  357. package/dist/storage/parse-cache.js +189 -42
  358. package/dist/storage/parsedfile-store.d.ts +41 -60
  359. package/dist/storage/parsedfile-store.js +247 -171
  360. package/dist/storage/repo-manager.d.ts +10 -4
  361. package/dist/storage/repo-manager.js +35 -25
  362. package/dist/storage/repo-meta.d.ts +34 -0
  363. package/dist/storage/v8-sidecar.d.ts +48 -0
  364. package/dist/storage/v8-sidecar.js +347 -0
  365. package/dist/types/pipeline.d.ts +14 -0
  366. package/dist/utils/process-identity.d.ts +2 -0
  367. package/dist/utils/process-identity.js +35 -0
  368. package/package.json +10 -4
  369. package/scripts/assert-web-assets.mjs +35 -0
  370. package/scripts/build-web.js +72 -0
  371. package/scripts/build.js +31 -28
  372. package/scripts/cross-platform-tests.ts +5 -0
  373. package/skills/gitnexus-cli.md +5 -1
  374. package/web/assets/ProcessFlowModal-DAeX2BHW.js +24 -0
  375. package/web/assets/{abnfDiagram-QNN2D4NM-Cq2djWWe.js → abnfDiagram-PAR5IXJI-J3OdeHLl.js} +1 -1
  376. package/web/assets/{agent-BWAXPjC5.js → agent-BMRqXorA.js} +6 -4
  377. package/web/assets/architecture-7GRP2DOG-M7G3SWCO-G3sWyX6M.js +1 -0
  378. package/web/assets/architectureDiagram-2PNWDENW-ysKcRlGT.js +36 -0
  379. package/web/assets/blockDiagram-PUWGUBOA-oLXTa1lY.js +129 -0
  380. package/web/assets/c4Diagram-3NLNHZP5-D3iu4eC0.js +38 -0
  381. package/web/assets/{chunk-2SREHG4O-Dip42xOq.js → chunk-2NMSUPJH-B24w-wng.js} +1 -1
  382. package/web/assets/{chunk-VJFVEZTB-CX66F2ep.js → chunk-32MCUW2P-ByUyt0Sa.js} +3 -3
  383. package/web/assets/{chunk-4RFN2BYJ-DHHWuC-n.js → chunk-3NPNU5GP-DocZ07Sg.js} +1 -1
  384. package/web/assets/{chunk-XNMVGMAZ-Cg_LnPtj.js → chunk-3SMGFRGC-CAu4JRLv.js} +1 -1
  385. package/web/assets/{chunk-W44A43WB-BN8EQc_u.js → chunk-4CAJECRU-DRYMwG9z.js} +1 -1
  386. package/web/assets/chunk-4OADUZ5Q-CxrSvOwZ.js +10 -0
  387. package/web/assets/{chunk-DMV4VAQV-Bn6WXDSX.js → chunk-5IQCK5RY-CCMhl4so.js} +2 -2
  388. package/web/assets/{chunk-RRFMTAIC-CMN0wcYA.js → chunk-5MVFYWFU-Db9KvrYO.js} +1 -1
  389. package/web/assets/chunk-CLS4B6BI-Uvx5QNsu.js +168 -0
  390. package/web/assets/chunk-DZP67EKU-B3Mt380j.js +70 -0
  391. package/web/assets/{chunk-6L755F7B-CMhLBxi2.js → chunk-EICP7K5X-CqwE9hui.js} +1 -1
  392. package/web/assets/{chunk-BI6VK774-D0oaWk8V.js → chunk-GDY2UAB4-CtQQR0a8.js} +1 -1
  393. package/web/assets/chunk-H7VHZCWX-CE1nAmt6.js +1 -0
  394. package/web/assets/chunk-IJBDOHL6-BUKtY6oF.js +1 -0
  395. package/web/assets/{chunk-OIYT25JQ-CQ6KOZGX.js → chunk-JFFVMJIA-0fJenqia.js} +1 -1
  396. package/web/assets/{chunk-HNC4WDU7-DoU3KnA7.js → chunk-JZGDI5JK-BeTMSSkJ.js} +1 -1
  397. package/web/assets/{chunk-EQFTRU2I-1ix7TzW9.js → chunk-KD6SPIPN-Qp1Pflah.js} +1 -1
  398. package/web/assets/chunk-NF366YI6-CpSpya3n.js +231 -0
  399. package/web/assets/chunk-NUDPKBEF-CU1-BQIW.js +34 -0
  400. package/web/assets/{chunk-SATU7PGQ-B1zhgOvc.js → chunk-OJINMHTS-zOCQe4eI.js} +1 -1
  401. package/web/assets/{chunk-E5QJAATJ-dh-5CtIV.js → chunk-Q6NGPIAH-yyBomb63.js} +1 -1
  402. package/web/assets/chunk-QJSWEUOL-D_rf9gPD.js +128 -0
  403. package/web/assets/chunk-R7JDMUKV-CRoqKpD6.js +1 -0
  404. package/web/assets/{chunk-VE5CLXGZ-C1vB7wpY.js → chunk-RCXAM2GK-CUqrWQDV.js} +1 -1
  405. package/web/assets/{chunk-66DQ2XMT-CM0xjFAN.js → chunk-RT4MAWR3-zXy9-Lvt.js} +1 -1
  406. package/web/assets/{chunk-TZUXEDM2-B7p9AcTw.js → chunk-SFMINX4W-J2UrvMpD.js} +1 -1
  407. package/web/assets/{chunk-LORZLZWG-B57uGw2N.js → chunk-SLDQ463B-CHY6e_bQ.js} +2 -2
  408. package/web/assets/{chunk-FWYVLQTC-BgDItRzJ.js → chunk-TCEHX7R3-CXPDEVbm.js} +1 -1
  409. package/web/assets/{chunk-224SPVON-B8gxtXpy.js → chunk-VQC2EELJ-Dc8fIy4R.js} +1 -1
  410. package/web/assets/chunk-VRZKL3EH-DB3KixTQ.js +1 -0
  411. package/web/assets/{chunk-A7VWPJGB-B4O3oQdQ.js → chunk-VTHDQ7BV-b7FsPQZO.js} +1 -1
  412. package/web/assets/chunk-VY2OSTJR-Dkgc3Brg.js +2 -0
  413. package/web/assets/chunk-WUBWJARI-7FwILJ3k.js +2 -0
  414. package/web/assets/{chunk-D6VWDJW2-BxcBdZ9c.js → chunk-YBMQ5JGJ-BSnyWZmd.js} +1 -1
  415. package/web/assets/chunk-YDMLL4PJ-IHhMngTz.js +2 -0
  416. package/web/assets/chunk-Z6V44ARX-BjCEsF0Q.js +62 -0
  417. package/web/assets/chunk-ZJJ7VQJP-Dz089b-K.js +321 -0
  418. package/web/assets/chunk-ZNLK7HRR-B0iFpmW4.js +1 -0
  419. package/web/assets/chunk-ZQN7UHIL-Cy7KAjQt.js +1 -0
  420. package/web/assets/{chunk-L5GCOVLC-CE2w8Nm_.js → chunk-ZS6VBONO-DBjJO0w9.js} +2 -2
  421. package/web/assets/{chunk-NV3KIAZN-5yvcpMiu.js → chunk-ZUNWM646-DNRJyNPe.js} +1 -1
  422. package/web/assets/classDiagram-FGAMPOII-C5Ibyode.js +1 -0
  423. package/web/assets/classDiagram-v2-AI5RJEK4-C5Ibyode.js +1 -0
  424. package/web/assets/{cose-bilkent-RZA4XIPR-BHpK4Crp.js → cose-bilkent-Q72C2OJ3-DMeFXnK8.js} +1 -1
  425. package/web/assets/cynefin-OW5HDTMX-6OCTWOGG-vlqakYcO.js +1 -0
  426. package/web/assets/{cynefinDiagram-TR7LZUCG-C3Iar9lZ.js → cynefinDiagram-2OOWUY4M-BY6DZkTt.js} +1 -1
  427. package/web/assets/dagre-MPVFI544-DWO70fy_.js +4 -0
  428. package/web/assets/diagram-AE4NWXFW-f7JRVRUL.js +24 -0
  429. package/web/assets/{diagram-L7DVE3PN-GIRyVUtt.js → diagram-BUJID5UG-BXZv1rCS.js} +2 -2
  430. package/web/assets/{diagram-JCD7PQ7C-DC5-9FRr.js → diagram-C44CZ5NI-CRNfvjCq.js} +1 -1
  431. package/web/assets/diagram-EYOLEXXS-DZOjKQVE.js +30 -0
  432. package/web/assets/diagram-P7B6PWOJ-D3SQmw3_.js +3 -0
  433. package/web/assets/{ebnfDiagram-DRHRQJWO-D8_CI4ZF.js → ebnfDiagram-FTPZ3PV6-jKWpIDN2.js} +1 -1
  434. package/web/assets/erDiagram-H3ERR26V-BqJntEuJ.js +99 -0
  435. package/web/assets/eventmodeling-NTZA5JFV-WKSWQHFS-Bq4FqtBL.js +1 -0
  436. package/web/assets/flowDiagram-YHGXBVSY-Dnlk2bEu.js +1 -0
  437. package/web/assets/ganttDiagram-RWFTB7ED-Bl6Y1K5T.js +292 -0
  438. package/web/assets/gitGraph-4MIJSDKK-JH2HKYUO-B3yc4GkH.js +1 -0
  439. package/web/assets/gitGraphDiagram-MAR6GKOP-CkNvsrdw.js +106 -0
  440. package/web/assets/{index-CJDpyH-n.css → index-C2_aej58.css} +1 -1
  441. package/web/assets/{index-DDRie6_8.js → index-Dj3vQOHK.js} +51 -51
  442. package/web/assets/info-A6RAGUB7-3TX3OFWW-BM3N5_Dv.js +1 -0
  443. package/web/assets/infoDiagram-LV547AFH-COkFutAf.js +2 -0
  444. package/web/assets/{ishikawaDiagram-4JDSWWDM-DmqWtjkl.js → ishikawaDiagram-PUJQGNDS-Bb8FylSR.js} +2 -2
  445. package/web/assets/{journeyDiagram-QUS3FAKT-XAzVzrQW.js → journeyDiagram-EW5QJT4W-BzoHUBhM.js} +4 -4
  446. package/web/assets/{kanban-definition-D4L7SQKK-YurRnmYn.js → kanban-definition-JSQERAZB-Uy2Pi0yQ.js} +4 -4
  447. package/web/assets/katex-CZ4GXH2S-C0Fcou7U.js +257 -0
  448. package/web/assets/{mindmap-definition-66QP5TD6-ChrWWnil.js → mindmap-definition-VBJCLQLM-B-CnOnt_.js} +3 -3
  449. package/web/assets/packet-AYTQ26CC-MKII6P3Y-Bd52ZE3V.js +1 -0
  450. package/web/assets/{pegDiagram-YKIO5C6U-QGeQLEq2.js → pegDiagram-7WILOQTJ-D9sneKXg.js} +1 -1
  451. package/web/assets/pie-WAS4IAKB-6B4OPMJ5-DW5Xy69Z.js +1 -0
  452. package/web/assets/pieDiagram-EFA7CBSB-Dx2NQofL.js +39 -0
  453. package/web/assets/{quadrantDiagram-VO5QLCXA-B7098wSc.js → quadrantDiagram-WARVYA7P-DPKL9_0A.js} +3 -3
  454. package/web/assets/radar-RG4KPBEZ-UPTR3XUL-CkzibT2h.js +1 -0
  455. package/web/assets/railroad-74A4TZTK-MEFUPFMS-D9zF-mDN.js +1 -0
  456. package/web/assets/railroad-abnf-HS5TGJTU-R5YG2S5D-ruacjUbX.js +1 -0
  457. package/web/assets/railroad-ebnf-LZEXJU2U-G5QEX2L6-S1zc5OiO.js +1 -0
  458. package/web/assets/railroad-peg-WCYAUIDC-H5I2ZRY2-Cbcr0XzY.js +1 -0
  459. package/web/assets/{railroadDiagram-M77LTMSB-AXu4vxk_.js → railroadDiagram-5NIQVNLQ-DsweTo14.js} +1 -1
  460. package/web/assets/{requirementDiagram-RASO5HTO-B-l8InpK.js → requirementDiagram-SXREGOKZ-CXwdNSVR.js} +4 -4
  461. package/web/assets/{sankeyDiagram-F32LOJ6L-Kd7zjJgX.js → sankeyDiagram-VV74M2VP-CA6jtP9P.js} +3 -3
  462. package/web/assets/{sequenceDiagram-URATNSBD-BlcdY9DS.js → sequenceDiagram-52ZFIFDL-k_5rEbzm.js} +15 -15
  463. package/web/assets/src-Df5C1Nz4.js +1 -0
  464. package/web/assets/stateDiagram-3QAKPIVI-BejHTf31.js +1 -0
  465. package/web/assets/stateDiagram-v2-HN2P4RDZ-BrfoRuOc.js +1 -0
  466. package/web/assets/swimlanes-QLVP42QD-CQSVO5D6.js +1 -0
  467. package/web/assets/swimlanesDiagram-JKPDBFCN-DrWB9kcD.js +8 -0
  468. package/web/assets/{timeline-definition-WJXWRH4I-DUfp1R3E.js → timeline-definition-GS45XAXW-C0Ks8rPP.js} +4 -4
  469. package/web/assets/treeView-Q6P3EWNA-ZRJGANNQ-DmKOCo6L.js +1 -0
  470. package/web/assets/treemap-WGGIJYW6-K64VN5AS-DO3xY92U.js +1 -0
  471. package/web/assets/{vennDiagram-K3VCMQLI-Bj-FN-XS.js → vennDiagram-QIQU2ZRJ-rgPiS837.js} +3 -3
  472. package/web/assets/wardley-WFR3VGLG-D67OWCCH-DiDPBNft.js +1 -0
  473. package/web/assets/wardleyDiagram-U6YNM66N-DRVr7SPi.js +78 -0
  474. package/web/assets/{xychartDiagram-5VRUVLCW-CK_rbSWE.js → xychartDiagram-XJAZEDNM-COtlZzYb.js} +3 -3
  475. package/web/index.html +19 -17
  476. package/web/assets/ProcessFlowModal-Badh2Pbg.js +0 -24
  477. package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +0 -1
  478. package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +0 -36
  479. package/web/assets/blockDiagram-54WLDVWM-Dg_hrRWE.js +0 -132
  480. package/web/assets/c4Diagram-X2LASM7V-CnhoT4aV.js +0 -10
  481. package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +0 -127
  482. package/web/assets/chunk-5VCL7Z4A-CQ-2dYWj.js +0 -1
  483. package/web/assets/chunk-6BELYETK-ChsYtfHW.js +0 -1
  484. package/web/assets/chunk-7CWYLC5S-DRgGkkpF.js +0 -2
  485. package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +0 -32
  486. package/web/assets/chunk-KRXBNO2N-C-UNuKKf.js +0 -1
  487. package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +0 -321
  488. package/web/assets/chunk-LIEV3EAG-pyKGssV3.js +0 -1
  489. package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +0 -62
  490. package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +0 -10
  491. package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +0 -156
  492. package/web/assets/chunk-SZD42YQK-ijyKKVr1.js +0 -70
  493. package/web/assets/chunk-TFPGFQPA-Dj6a-0pC.js +0 -231
  494. package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +0 -2
  495. package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +0 -1
  496. package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +0 -1
  497. package/web/assets/chunk-WJBAP47W-BckNkuEN.js +0 -1
  498. package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +0 -1
  499. package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +0 -1
  500. package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +0 -1
  501. package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +0 -4
  502. package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +0 -30
  503. package/web/assets/diagram-KFBZAVDW-Dfmf_4ti.js +0 -3
  504. package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +0 -24
  505. package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +0 -85
  506. package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +0 -1
  507. package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +0 -1
  508. package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +0 -292
  509. package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +0 -1
  510. package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +0 -106
  511. package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +0 -1
  512. package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +0 -2
  513. package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +0 -257
  514. package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +0 -1
  515. package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +0 -1
  516. package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +0 -39
  517. package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +0 -1
  518. package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +0 -1
  519. package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +0 -1
  520. package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +0 -1
  521. package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +0 -1
  522. package/web/assets/src-C5sx_gMp.js +0 -1
  523. package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +0 -1
  524. package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +0 -1
  525. package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +0 -2
  526. package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +0 -8
  527. package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +0 -1
  528. package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +0 -1
  529. package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +0 -1
  530. package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +0 -78
  531. /package/web/assets/{sizeCapture-5GORAGP4-BEqQzsxs.js → sizeCapture-FGA5AGYP-BEqQzsxs.js} +0 -0
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Zig Language Provider.
3
+ *
4
+ * Key Zig traits:
5
+ * - mroStrategy: default 'first-wins' is irrelevant — Zig has no inheritance,
6
+ * and no heritage hooks are provided (Zig queries never produce
7
+ * `@heritage.*` captures).
8
+ * - exportChecker: walks to the enclosing variable_declaration /
9
+ * function_declaration and looks for a `pub` or `export` keyword child.
10
+ * - importResolver: resolves local `@import("./foo.zig")` paths and
11
+ * build.zig.zon `.path` deps (root the dep's build.zig declares, then
12
+ * src/root.zig, src/<name>.zig, src/main.zig); `@import("std")` and
13
+ * `.url` packages are deliberately external.
14
+ * - namedBindingExtractor: omitted — the scope side handles
15
+ * `const Foo = @import("x").Foo` and `const Foo = ns.Foo` (ns an
16
+ * @import binding) as NAMED imports instead (`zig/captures.ts`).
17
+ * - scope-resolution hooks (Ring 3): `emitScopeCaptures` walks the file via
18
+ * `zig/query.ts` (containers as Class scopes — including the container a
19
+ * generic type constructor `fn List(comptime T: type) type` returns,
20
+ * named after the fn; container-nested fns relabeled @declaration.method;
21
+ * plain-variable groups filtered for container/import bindings and for
22
+ * the keyword-less `variable_declaration`s tree-sitter-zig uses for
23
+ * statement assignments); `interpretImport` maps `const x = @import("…")`
24
+ * to a namespace import, member forms to named/alias imports and
25
+ * `usingnamespace` to a wildcard; receiver types come from `self`
26
+ * parameters, `T{…}` / `mod.T{…}` / `List(u8){…}` literals, `T.init()`
27
+ * call returns, `x: T` annotations (incl. decl literals), container
28
+ * FIELD types on the container's class scope (`self.session.name()`)
29
+ * and one-level field aliases (`const s = self.session; s.name()`). The
30
+ * emit-side wiring lives in `zig/scope-resolver.ts` (SCOPE_RESOLVERS).
31
+ */
32
+ export declare const zigProvider: import("../language-provider.js").LanguageProvider;
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Zig Language Provider.
3
+ *
4
+ * Key Zig traits:
5
+ * - mroStrategy: default 'first-wins' is irrelevant — Zig has no inheritance,
6
+ * and no heritage hooks are provided (Zig queries never produce
7
+ * `@heritage.*` captures).
8
+ * - exportChecker: walks to the enclosing variable_declaration /
9
+ * function_declaration and looks for a `pub` or `export` keyword child.
10
+ * - importResolver: resolves local `@import("./foo.zig")` paths and
11
+ * build.zig.zon `.path` deps (root the dep's build.zig declares, then
12
+ * src/root.zig, src/<name>.zig, src/main.zig); `@import("std")` and
13
+ * `.url` packages are deliberately external.
14
+ * - namedBindingExtractor: omitted — the scope side handles
15
+ * `const Foo = @import("x").Foo` and `const Foo = ns.Foo` (ns an
16
+ * @import binding) as NAMED imports instead (`zig/captures.ts`).
17
+ * - scope-resolution hooks (Ring 3): `emitScopeCaptures` walks the file via
18
+ * `zig/query.ts` (containers as Class scopes — including the container a
19
+ * generic type constructor `fn List(comptime T: type) type` returns,
20
+ * named after the fn; container-nested fns relabeled @declaration.method;
21
+ * plain-variable groups filtered for container/import bindings and for
22
+ * the keyword-less `variable_declaration`s tree-sitter-zig uses for
23
+ * statement assignments); `interpretImport` maps `const x = @import("…")`
24
+ * to a namespace import, member forms to named/alias imports and
25
+ * `usingnamespace` to a wildcard; receiver types come from `self`
26
+ * parameters, `T{…}` / `mod.T{…}` / `List(u8){…}` literals, `T.init()`
27
+ * call returns, `x: T` annotations (incl. decl literals), container
28
+ * FIELD types on the container's class scope (`self.session.name()`)
29
+ * and one-level field aliases (`const s = self.session; s.name()`). The
30
+ * emit-side wiring lives in `zig/scope-resolver.ts` (SCOPE_RESOLVERS).
31
+ */
32
+ import { SupportedLanguages } from '../../../_shared/index.js';
33
+ import { defineLanguage } from '../language-provider.js';
34
+ import { ZIG_QUERIES } from '../tree-sitter-queries.js';
35
+ import { zigExportChecker } from '../export-detection.js';
36
+ import { createImportResolver } from '../import-resolvers/resolver-factory.js';
37
+ import { zigImportConfig } from '../import-resolvers/configs/zig.js';
38
+ import { createCallExtractor } from '../call-extractors/generic.js';
39
+ import { zigCallConfig } from '../call-extractors/configs/zig.js';
40
+ import { createClassExtractor } from '../class-extractors/generic.js';
41
+ import { zigClassConfig } from '../class-extractors/configs/zig.js';
42
+ import { createFieldExtractor } from '../field-extractors/generic.js';
43
+ import { zigFieldConfig } from '../field-extractors/configs/zig.js';
44
+ import { createMethodExtractor } from '../method-extractors/generic.js';
45
+ import { zigMethodConfig } from '../method-extractors/configs/zig.js';
46
+ import { createVariableExtractor } from '../variable-extractors/generic.js';
47
+ import { zigVariableConfig } from '../variable-extractors/configs/zig.js';
48
+ import { zigTypeConfig } from '../type-extractors/zig.js';
49
+ import { emitZigScopeCaptures, interpretZigImport, interpretZigTypeBinding, isZigContainerMethod, isZigFileStruct, isZigRedundantContainerCapture, isZigTypeShadowingBinding, zigArityCompatibility, zigContainerLabel, zigContainerName, zigFileStructName, zigBindingScopeFor, zigReceiverBinding, ZIG_CONTAINER_TYPES, } from './zig/index.js';
50
+ export const zigProvider = defineLanguage({
51
+ id: SupportedLanguages.Zig,
52
+ extensions: ['.zig'],
53
+ entryPointPatterns: [
54
+ /^main$/, // standard executable entry point
55
+ /^build$/, // build.zig entry point
56
+ ],
57
+ astFrameworkPatterns: [],
58
+ treeSitterQueries: ZIG_QUERIES,
59
+ typeConfig: zigTypeConfig,
60
+ exportChecker: zigExportChecker,
61
+ importResolver: createImportResolver(zigImportConfig),
62
+ callExtractor: createCallExtractor(zigCallConfig),
63
+ classExtractor: createClassExtractor(zigClassConfig),
64
+ fieldExtractor: createFieldExtractor(zigFieldConfig),
65
+ methodExtractor: createMethodExtractor(zigMethodConfig),
66
+ variableExtractor: createVariableExtractor(zigVariableConfig),
67
+ // A `const`/`var` whose value is a container or an `@import` is the
68
+ // Struct/Enum/Union node or the import binding, not a Const beside it.
69
+ // Up to three ZIG_QUERIES rules match one container (wrapper, type
70
+ // constructor, bare container — F8); `zigContainerAnchor` names the one
71
+ // that mints it and the others are dropped here.
72
+ shouldSkipDefinitionCapture: (captureMap, defaultLabel) => {
73
+ if (defaultLabel === 'Const' || defaultLabel === 'Variable') {
74
+ const decl = captureMap['definition.const'] ?? captureMap['definition.variable'];
75
+ return decl !== undefined && isZigTypeShadowingBinding(decl);
76
+ }
77
+ if (defaultLabel === 'Struct' || defaultLabel === 'Enum' || defaultLabel === 'Union') {
78
+ const decl = captureMap['definition.struct'] ??
79
+ captureMap['definition.enum'] ??
80
+ captureMap['definition.union'];
81
+ if (decl === undefined)
82
+ return false;
83
+ // The file-struct rules over-match (a `@This` first parameter, a
84
+ // top-level `@This()` alias — see ZIG_QUERIES); the one predicate decides.
85
+ if (decl.type === 'source_file')
86
+ return !isZigFileStruct(decl);
87
+ return isZigRedundantContainerCapture(decl, captureMap['name']);
88
+ }
89
+ return false;
90
+ },
91
+ // A file whose top level declares fields IS a struct named after the file
92
+ // (`Page.zig` → `Page`): its top-level fns/fields are members of that
93
+ // Struct. Files without fields are namespaces and own nothing.
94
+ resolveFileTypeOwner: (root, filePath) => isZigFileStruct(root) ? { name: zigFileStructName(filePath), label: 'Struct' } : null,
95
+ // Every container's identity comes from `zigContainerName` — the binding
96
+ // name for `const T = struct {…}` at file/container level, the fn name for
97
+ // a generic type constructor, and (F8) `string$R` / `build$1` for
98
+ // function-local and anonymous containers, which no name child spells. The
99
+ // class extractor names the node from the same function, so a member's
100
+ // owner id (`Method:<file>:string$R.get`) and the node id agree.
101
+ resolveContainerTypeOwner: (container, filePath) => {
102
+ if (!ZIG_CONTAINER_TYPES.has(container.type))
103
+ return null;
104
+ const name = zigContainerName(container, filePath);
105
+ const label = zigContainerLabel(container);
106
+ return name !== undefined && label !== undefined ? { name, label } : null;
107
+ },
108
+ labelOverride: (functionNode, defaultLabel) => {
109
+ if (defaultLabel !== 'Function')
110
+ return defaultLabel;
111
+ if (isZigContainerMethod(functionNode))
112
+ return 'Method';
113
+ return defaultLabel;
114
+ },
115
+ // ── RFC #909 Ring 3: scope-based resolution hooks ──
116
+ emitScopeCaptures: emitZigScopeCaptures,
117
+ interpretImport: interpretZigImport,
118
+ // `@import` is compile-time name lookup, not an executed statement: one
119
+ // written inside a function body is resolved exactly as one at file scope
120
+ // (same answer as C `#include` and Rust `use`). Without this, a
121
+ // function-scoped `@import` would be marked `runsOnlyWhenCalled` and a
122
+ // real import cycle through it would be hidden from `check --cycles`.
123
+ importsExecuteWhereWritten: false,
124
+ interpretTypeBinding: interpretZigTypeBinding,
125
+ bindingScopeFor: zigBindingScopeFor,
126
+ receiverBinding: zigReceiverBinding,
127
+ // Provider contract is (def, callsite); the ScopeResolver contract is
128
+ // (callsite, def) — same function, adapted argument order.
129
+ arityCompatibility: (def, callsite) => zigArityCompatibility(callsite, def),
130
+ });
@@ -0,0 +1,2 @@
1
+ import type { MethodExtractionConfig } from '../../method-types.js';
2
+ export declare const zigMethodConfig: MethodExtractionConfig;
@@ -0,0 +1,120 @@
1
+ import { SupportedLanguages } from '../../../../_shared/index.js';
2
+ import { hasZigPubKeyword } from '../../export-detection.js';
3
+ import { ZIG_CONTAINER_TYPES, zigContainerName, zigReceiverParameter, } from '../../languages/zig/captures.js';
4
+ /**
5
+ * Zig method extraction.
6
+ *
7
+ * tree-sitter-zig containers (struct/enum/union/opaque) are anonymous; the
8
+ * binding name lives on the parent variable_declaration, or on the enclosing
9
+ * generic type constructor (`fn List(comptime T: type) type { return struct
10
+ * {…}; }`) — `zigContainerName` decides. Methods inside a container appear as
11
+ * plain `function_declaration` children of the container node.
12
+ *
13
+ * The first parameter is the receiver when it is named `self` OR typed as the
14
+ * enclosing container (`replica: *Replica`, `pool: *@This()`) — see
15
+ * `zigReceiverParameter`; unlike Rust, Zig has no dedicated `self_parameter`
16
+ * node type and `self` is a convention, not a rule.
17
+ */
18
+ const extractZigOwnerName = (node, filePath) => zigContainerName(node, filePath);
19
+ const extractZigName = (node) => {
20
+ const nameNode = node.childForFieldName('name');
21
+ return nameNode?.text;
22
+ };
23
+ /**
24
+ * The `parameters` node of a function_declaration. tree-sitter-zig 1.1.2
25
+ * attaches it as a plain named child — NOT under a `parameters:` field (only
26
+ * `name`, `type` and `body` are fields), so a field lookup is always null
27
+ * (and the grammar-literal gate flags it as a dead field). Reading it that
28
+ * way silently produced empty parameter lists, no receiver, and
29
+ * `isStatic: true` for every method.
30
+ */
31
+ const zigParameterList = (node) => node.namedChildren.find((child) => child?.type === 'parameters') ?? null;
32
+ const extractZigReturnType = (node) => {
33
+ // tree-sitter-zig labels the return type as the `type` field on
34
+ // function_declaration (the same field name used for parameter types).
35
+ const typeNode = node.childForFieldName('type');
36
+ return typeNode?.text?.trim();
37
+ };
38
+ /**
39
+ * Regular parameters only. The receiver parameter (`zigReceiverParameter`) is
40
+ * reported through `extractReceiverType`, not the parameter list (same split
41
+ * as Rust's `self_parameter` skip in `configs/rust.ts`). `filePath` is what
42
+ * names a file-struct (`fn add(ledger: *Ledger)` in `Ledger.zig`): without it
43
+ * the receiver rule cannot see the file stem and such a fn reads as static
44
+ * with the receiver in its arity — an id the scope side, which always has
45
+ * the path, never produces, so its CALLS edges went nowhere.
46
+ */
47
+ const extractZigParameters = (node, filePath) => {
48
+ const paramList = zigParameterList(node);
49
+ if (!paramList)
50
+ return [];
51
+ const params = [];
52
+ const receiver = zigReceiverParameter(node, filePath);
53
+ for (let i = 0; i < paramList.namedChildCount; i++) {
54
+ const param = paramList.namedChild(i);
55
+ if (!param || param.type !== 'parameter')
56
+ continue;
57
+ if (receiver !== null && param.id === receiver.id)
58
+ continue;
59
+ const nameNode = param.childForFieldName('name');
60
+ const typeNode = param.childForFieldName('type');
61
+ params.push({
62
+ name: nameNode?.text ?? '?',
63
+ type: typeNode?.text?.trim() ?? null,
64
+ rawType: typeNode?.text?.trim() ?? null,
65
+ isOptional: false,
66
+ isVariadic: false,
67
+ });
68
+ }
69
+ return params;
70
+ };
71
+ const extractZigReceiverType = (node, filePath) => zigReceiverParameter(node, filePath)?.childForFieldName('type')?.text?.trim();
72
+ /**
73
+ * Names a `test_declaration` during the enclosing-function walk (parse-worker
74
+ * `findEnclosingFunctionId`) with the SAME spelling ZIG_QUERIES captures as
75
+ * `@name` — the string node with its quotes — so calls inside `test "x" {}`
76
+ * attribute to the test's own Function node.
77
+ *
78
+ * Anonymous `test {}` and decl-tests `test add {}` are not graph nodes. They
79
+ * return `''`, not `null`: `null` falls through to `genericFuncName`, whose
80
+ * first-identifier scan would name `test add {}` "add" — the REAL `fn add`'s
81
+ * id — and hang the test body's calls on it. The empty name is falsy, so
82
+ * `findEnclosingFunctionId` skips this node WITHOUT attributing to it and
83
+ * keeps walking up; a test block can only sit at container level, so the walk
84
+ * reaches the file and the calls attribute to the File.
85
+ */
86
+ const extractZigFunctionName = (node) => {
87
+ if (node.type !== 'test_declaration')
88
+ return null;
89
+ const nameString = node.namedChildren.find((child) => child?.type === 'string');
90
+ return { funcName: nameString?.text ?? '', label: 'Function' };
91
+ };
92
+ export const zigMethodConfig = {
93
+ language: SupportedLanguages.Zig,
94
+ // `source_file`: a file-struct's top-level fns are methods of the file's Struct.
95
+ typeDeclarationNodes: [...ZIG_CONTAINER_TYPES, 'source_file'],
96
+ methodNodeTypes: ['function_declaration'],
97
+ bodyNodeTypes: [],
98
+ extractOwnerName: extractZigOwnerName,
99
+ extractName: extractZigName,
100
+ extractFunctionName: extractZigFunctionName,
101
+ extractReturnType: extractZigReturnType,
102
+ extractParameters: extractZigParameters,
103
+ // `pub` only: `export fn` is C linkage, still private to other Zig files
104
+ // (isExported carries the FFI fact — see export-detection.ts).
105
+ extractVisibility: (node) => (hasZigPubKeyword(node) ? 'public' : 'private'),
106
+ extractReceiverType: extractZigReceiverType,
107
+ isStatic(node, filePath) {
108
+ // A Zig "method" is static when it has no receiver parameter — `self` OR
109
+ // a first parameter typed as the enclosing container (`replica:
110
+ // *Replica`, `pool: *@This()`, `ledger: *Ledger` in `Ledger.zig`); see
111
+ // `zigReceiverParameter`.
112
+ return zigReceiverParameter(node, filePath) === null;
113
+ },
114
+ isAbstract() {
115
+ return false;
116
+ },
117
+ isFinal() {
118
+ return false;
119
+ },
120
+ };
@@ -63,7 +63,7 @@ export function createMethodExtractor(config) {
63
63
  // Resolve owner name: config hook → field-based → type_identifier → simple_identifier → "Companion"
64
64
  let ownerName;
65
65
  if (config.extractOwnerName) {
66
- ownerName = config.extractOwnerName(node);
66
+ ownerName = config.extractOwnerName(node, context.filePath);
67
67
  }
68
68
  if (!ownerName) {
69
69
  const nameField = node.childForFieldName('name');
@@ -133,6 +133,17 @@ function findBodies(node, bodyNodeSet) {
133
133
  result.push(bodyField);
134
134
  addNestedBodies(bodyField, bodyNodeSet, result);
135
135
  }
136
+ // Grammars with no body wrapper at all: a config that declares NO
137
+ // `bodyNodeTypes` (tree-sitter-zig's struct_declaration holds its
138
+ // function_declaration children directly) uses the type-declaration node
139
+ // itself as the body. The downstream walk filters by `methodNodeTypes`, so
140
+ // unrelated children are ignored. Deliberately NOT a fallback for configs
141
+ // that do declare body wrappers: for them a node without its wrapper is a
142
+ // bodiless declaration (forward declaration, `declare class`), and scanning
143
+ // it would change every such language for no method it could find.
144
+ if (result.length === 0 && bodyNodeSet.size === 0) {
145
+ result.push(node);
146
+ }
136
147
  return result;
137
148
  }
138
149
  function addNestedBodies(parent, bodyNodeSet, out, seen) {
@@ -183,12 +194,13 @@ function buildMethod(node, ownerNode, context, config) {
183
194
  isFinal = false;
184
195
  // Static-owner detection is config-driven: each language declares which
185
196
  // container node types imply static (e.g. Ruby singleton_class, Kotlin companion_object).
186
- const isStatic = (config.staticOwnerTypes?.has(ownerNode.type) ?? false) || config.isStatic(node);
197
+ const isStatic = (config.staticOwnerTypes?.has(ownerNode.type) ?? false) ||
198
+ config.isStatic(node, context.filePath);
187
199
  return {
188
200
  name,
189
- receiverType: config.extractReceiverType?.(node) ?? null,
201
+ receiverType: config.extractReceiverType?.(node, context.filePath) ?? null,
190
202
  returnType: config.extractReturnType(node) ?? null,
191
- parameters: config.extractParameters(node),
203
+ parameters: config.extractParameters(node, context.filePath),
192
204
  visibility: config.extractVisibility(node),
193
205
  isStatic,
194
206
  isAbstract,
@@ -79,13 +79,19 @@ export interface MethodExtractionConfig {
79
79
  bodyNodeTypes: string[];
80
80
  extractName: (node: SyntaxNode) => string | undefined;
81
81
  extractReturnType: (node: SyntaxNode) => string | undefined;
82
- extractParameters: (node: SyntaxNode) => ParameterInfo[];
82
+ /** The optional `filePath` (the extractor context's) is passed to
83
+ * `extractParameters`, `isStatic` and `extractReceiverType` for languages
84
+ * whose receiver rule depends on the file — Zig's file-struct, whose type
85
+ * name is the file stem, so `fn incr(counter: *Counter)` in `Counter.zig`
86
+ * is a method only when the file is known. Same optional-trailing-argument
87
+ * shape as `extractOwnerName`; every other config ignores it. */
88
+ extractParameters: (node: SyntaxNode, filePath?: string) => ParameterInfo[];
83
89
  extractVisibility: (node: SyntaxNode) => MethodVisibility;
84
- isStatic: (node: SyntaxNode) => boolean;
90
+ isStatic: (node: SyntaxNode, filePath?: string) => boolean;
85
91
  isAbstract: (node: SyntaxNode, ownerNode: SyntaxNode) => boolean;
86
92
  isFinal: (node: SyntaxNode) => boolean;
87
93
  extractAnnotations?: (node: SyntaxNode) => string[];
88
- extractReceiverType?: (node: SyntaxNode) => string | undefined;
94
+ extractReceiverType?: (node: SyntaxNode, filePath?: string) => string | undefined;
89
95
  isVirtual?: (node: SyntaxNode) => boolean;
90
96
  isOverride?: (node: SyntaxNode) => boolean;
91
97
  isAsync?: (node: SyntaxNode) => boolean;
@@ -97,7 +103,7 @@ export interface MethodExtractionConfig {
97
103
  * When the ownerNode matches one of these types, isStatic is forced true. */
98
104
  staticOwnerTypes?: ReadonlySet<string>;
99
105
  /** Resolve the owner name from a standalone method node (e.g. Go receiver type). */
100
- extractOwnerName?: (node: SyntaxNode) => string | undefined;
106
+ extractOwnerName?: (node: SyntaxNode, filePath?: string) => string | undefined;
101
107
  /** Extract a primary constructor from the owner node itself (e.g. C# 12 class Point(int x, int y)). */
102
108
  extractPrimaryConstructor?: (ownerNode: SyntaxNode, context: MethodExtractorContext) => MethodInfo | null;
103
109
  /** Extract function name + label from an AST node during parent-walk.
@@ -2,9 +2,9 @@
2
2
  * Field Registry
3
3
  *
4
4
  * Owner-scoped field/property index extracted from SymbolTable.
5
- * Stores Property / Variable / Const / Static symbols keyed by
6
- * `ownerNodeId\0fieldName` for O(1) lookup. Supports multiple defs
7
- * under the same (owner, name) — e.g. legacy Property plus a
5
+ * Stores Property / Variable / Const / Static symbols in a nested
6
+ * `Map<ownerNodeId, Map<fieldName, defs[]>>` for O(1) lookup. Supports
7
+ * multiple defs under the same (owner, name) — e.g. legacy Property plus a
8
8
  * scope-resolution Variable reconciliation entry.
9
9
  */
10
10
  import type { SymbolDefinition } from '../../../_shared/index.js';
@@ -2,9 +2,9 @@
2
2
  * Field Registry
3
3
  *
4
4
  * Owner-scoped field/property index extracted from SymbolTable.
5
- * Stores Property / Variable / Const / Static symbols keyed by
6
- * `ownerNodeId\0fieldName` for O(1) lookup. Supports multiple defs
7
- * under the same (owner, name) — e.g. legacy Property plus a
5
+ * Stores Property / Variable / Const / Static symbols in a nested
6
+ * `Map<ownerNodeId, Map<fieldName, defs[]>>` for O(1) lookup. Supports
7
+ * multiple defs under the same (owner, name) — e.g. legacy Property plus a
8
8
  * scope-resolution Variable reconciliation entry.
9
9
  */
10
10
  const EMPTY = Object.freeze([]);
@@ -14,20 +14,24 @@ const EMPTY = Object.freeze([]);
14
14
  export const createFieldRegistry = () => {
15
15
  const fieldByOwner = new Map();
16
16
  const lookupAllByOwner = (ownerNodeId, fieldName) => {
17
- return fieldByOwner.get(`${ownerNodeId}\0${fieldName}`) ?? EMPTY;
17
+ return fieldByOwner.get(ownerNodeId)?.get(fieldName) ?? EMPTY;
18
18
  };
19
19
  const lookupFieldByOwner = (ownerNodeId, fieldName) => {
20
20
  const pool = lookupAllByOwner(ownerNodeId, fieldName);
21
21
  return pool.length === 0 ? undefined : pool[0];
22
22
  };
23
23
  const register = (ownerNodeId, fieldName, def) => {
24
- const key = `${ownerNodeId}\0${fieldName}`;
25
- const existing = fieldByOwner.get(key);
24
+ let byName = fieldByOwner.get(ownerNodeId);
25
+ if (!byName) {
26
+ byName = new Map();
27
+ fieldByOwner.set(ownerNodeId, byName);
28
+ }
29
+ const existing = byName.get(fieldName);
26
30
  if (existing) {
27
31
  existing.push(def);
28
32
  }
29
33
  else {
30
- fieldByOwner.set(key, [def]);
34
+ byName.set(fieldName, [def]);
31
35
  }
32
36
  };
33
37
  const clear = () => {
@@ -2,9 +2,9 @@
2
2
  * Method Registry
3
3
  *
4
4
  * Owner-scoped method index extracted from SymbolTable.
5
- * Stores Method/Constructor/Function-with-ownerId symbols keyed by
6
- * `ownerNodeId\0methodName` for O(1) lookup. Supports overloads
7
- * (array values) and arity-based filtering.
5
+ * Stores Method/Constructor/Function-with-ownerId symbols in a nested
6
+ * `Map<ownerNodeId, Map<methodName, defs[]>>` for O(1) lookup. Supports
7
+ * overloads (array values) and arity-based filtering.
8
8
  */
9
9
  import type { SymbolDefinition } from '../../../_shared/index.js';
10
10
  export interface MethodRegistry {
@@ -2,9 +2,9 @@
2
2
  * Method Registry
3
3
  *
4
4
  * Owner-scoped method index extracted from SymbolTable.
5
- * Stores Method/Constructor/Function-with-ownerId symbols keyed by
6
- * `ownerNodeId\0methodName` for O(1) lookup. Supports overloads
7
- * (array values) and arity-based filtering.
5
+ * Stores Method/Constructor/Function-with-ownerId symbols in a nested
6
+ * `Map<ownerNodeId, Map<methodName, defs[]>>` for O(1) lookup. Supports
7
+ * overloads (array values) and arity-based filtering.
8
8
  */
9
9
  // ---------------------------------------------------------------------------
10
10
  // Factory
@@ -19,8 +19,9 @@ export const createMethodRegistry = () => {
19
19
  // Set once when a Function+ownerId def lands here, powers the Tier 3
20
20
  // dedup fast-path. Monotonic: never unset except on `clear()`.
21
21
  let hasFunctionMethodsFlag = false;
22
+ const ownerDefs = (ownerNodeId, methodName) => methodByOwner.get(ownerNodeId)?.get(methodName);
22
23
  const lookupMethodByOwner = (ownerNodeId, methodName, argCount) => {
23
- const defs = methodByOwner.get(`${ownerNodeId}\0${methodName}`);
24
+ const defs = ownerDefs(ownerNodeId, methodName);
24
25
  if (!defs || defs.length === 0)
25
26
  return undefined;
26
27
  // Arity narrowing: when an argCount is provided and there are multiple
@@ -89,16 +90,20 @@ export const createMethodRegistry = () => {
89
90
  return methodsByName.get(name) ?? EMPTY;
90
91
  };
91
92
  const lookupAllByOwner = (ownerNodeId, methodName) => {
92
- return methodByOwner.get(`${ownerNodeId}\0${methodName}`) ?? EMPTY;
93
+ return ownerDefs(ownerNodeId, methodName) ?? EMPTY;
93
94
  };
94
95
  const register = (ownerNodeId, methodName, def) => {
95
- const key = `${ownerNodeId}\0${methodName}`;
96
- const existing = methodByOwner.get(key);
96
+ let owned = methodByOwner.get(ownerNodeId);
97
+ if (!owned) {
98
+ owned = new Map();
99
+ methodByOwner.set(ownerNodeId, owned);
100
+ }
101
+ const existing = owned.get(methodName);
97
102
  if (existing) {
98
103
  existing.push(def);
99
104
  }
100
105
  else {
101
- methodByOwner.set(key, [def]);
106
+ owned.set(methodName, [def]);
102
107
  }
103
108
  const byName = methodsByName.get(methodName);
104
109
  if (byName) {
@@ -116,6 +116,9 @@ const LABEL_BEHAVIOR = {
116
116
  Section: 'inert',
117
117
  Route: 'inert',
118
118
  Tool: 'inert',
119
+ // A broker address, not a symbol: nothing in any language resolves a name to
120
+ // it, so it stays out of the dispatch and callable indexes like `Route`.
121
+ Destination: 'inert',
119
122
  // Taint/PDG substrate (issue #2080) — a control-flow node, never a
120
123
  // symbol-resolution target. Inert: file index only, no owner scope.
121
124
  BasicBlock: 'inert',
@@ -24,7 +24,7 @@ export const createTypeRegistry = () => {
24
24
  return implByName.get(name) ?? [];
25
25
  };
26
26
  const lookupAllByOwner = (ownerNodeId, simpleName) => {
27
- return nestedByOwner.get(`${ownerNodeId}\0${simpleName}`) ?? EMPTY;
27
+ return nestedByOwner.get(ownerNodeId)?.get(simpleName) ?? EMPTY;
28
28
  };
29
29
  const registerClass = (name, qualifiedName, def) => {
30
30
  const existing = classByName.get(name);
@@ -52,13 +52,17 @@ export const createTypeRegistry = () => {
52
52
  }
53
53
  };
54
54
  const registerByOwner = (ownerNodeId, simpleName, def) => {
55
- const key = `${ownerNodeId}\0${simpleName}`;
56
- const existing = nestedByOwner.get(key);
55
+ let byName = nestedByOwner.get(ownerNodeId);
56
+ if (!byName) {
57
+ byName = new Map();
58
+ nestedByOwner.set(ownerNodeId, byName);
59
+ }
60
+ const existing = byName.get(simpleName);
57
61
  if (existing) {
58
62
  existing.push(def);
59
63
  }
60
64
  else {
61
- nestedByOwner.set(key, [def]);
65
+ byName.set(simpleName, [def]);
62
66
  }
63
67
  };
64
68
  const clear = () => {
@@ -48,6 +48,9 @@ function providerCandidates(ids, providers) {
48
48
  // candidates when none are known instead of dropping the injection entirely.
49
49
  return recognized.length > 0 ? recognized : all;
50
50
  }
51
+ function isConcreteTypeNode(node) {
52
+ return node?.label === 'Class' || node?.label === 'Record' || node?.label === 'Enum';
53
+ }
51
54
  export const diPhase = {
52
55
  name: 'di',
53
56
  deps: ['mro'],
@@ -103,21 +106,25 @@ export const diPhase = {
103
106
  ambiguousInjections: 0,
104
107
  };
105
108
  }
106
- const interfaceToImplementers = new Map();
109
+ const directSubtypes = new Map();
107
110
  const directSupertypes = new Map();
108
111
  for (const rel of ctx.graph.iterRelationshipsByType('IMPLEMENTS')) {
109
- const set = interfaceToImplementers.get(rel.targetId) ?? new Set();
110
- set.add(rel.sourceId);
111
- interfaceToImplementers.set(rel.targetId, set);
112
+ const subtypes = directSubtypes.get(rel.targetId) ?? new Set();
113
+ subtypes.add(rel.sourceId);
114
+ directSubtypes.set(rel.targetId, subtypes);
112
115
  const supertypes = directSupertypes.get(rel.sourceId) ?? new Set();
113
116
  supertypes.add(rel.targetId);
114
117
  directSupertypes.set(rel.sourceId, supertypes);
115
118
  }
116
119
  for (const rel of ctx.graph.iterRelationshipsByType('EXTENDS')) {
120
+ const subtypes = directSubtypes.get(rel.targetId) ?? new Set();
121
+ subtypes.add(rel.sourceId);
122
+ directSubtypes.set(rel.targetId, subtypes);
117
123
  const supertypes = directSupertypes.get(rel.sourceId) ?? new Set();
118
124
  supertypes.add(rel.targetId);
119
125
  directSupertypes.set(rel.sourceId, supertypes);
120
126
  }
127
+ const orderedDirectSubtypes = new Map([...directSubtypes].map(([typeId, subtypes]) => [typeId, [...subtypes].sort().reverse()]));
121
128
  const memberToClass = new Map();
122
129
  for (const relationType of ['HAS_PROPERTY', 'HAS_METHOD']) {
123
130
  for (const rel of ctx.graph.iterRelationshipsByType(relationType)) {
@@ -128,18 +135,45 @@ export const diPhase = {
128
135
  const interfacesByLanguage = new Map();
129
136
  const classesByLanguage = new Map();
130
137
  ctx.graph.forEachNode((node) => {
131
- if (node.label !== 'Class' && node.label !== 'Interface')
138
+ const concreteType = isConcreteTypeNode(node);
139
+ if (!concreteType && node.label !== 'Interface')
132
140
  return;
133
141
  const language = node.properties.language;
134
142
  if (typeof language !== 'string' || !candidateLanguages.has(language))
135
143
  return;
136
- const indexes = node.label === 'Class' ? classesByLanguage : interfacesByLanguage;
144
+ const indexes = concreteType ? classesByLanguage : interfacesByLanguage;
137
145
  const index = indexes.get(language) ?? emptyNameIndex();
138
146
  addIndexedName(index, node);
139
147
  indexes.set(language, index);
140
- if (node.label === 'Class')
148
+ if (concreteType)
141
149
  providerNodes.set(node.id, node);
142
150
  });
151
+ const concreteSubtypesByRoot = new Map();
152
+ const concreteSubtypes = (rootTypeId, language) => {
153
+ const cacheKey = `${language}\0${rootTypeId}`;
154
+ const cached = concreteSubtypesByRoot.get(cacheKey);
155
+ if (cached !== undefined)
156
+ return cached;
157
+ const concrete = new Set();
158
+ const queue = [rootTypeId];
159
+ const visited = new Set();
160
+ while (queue.length > 0) {
161
+ const typeId = queue.pop();
162
+ if (typeId === undefined || visited.has(typeId))
163
+ continue;
164
+ visited.add(typeId);
165
+ const typeNode = ctx.graph.getNode(typeId);
166
+ if (typeNode !== undefined &&
167
+ isConcreteTypeNode(typeNode) &&
168
+ typeNode.properties.language === language) {
169
+ concrete.add(typeId);
170
+ }
171
+ const children = orderedDirectSubtypes.get(typeId) ?? [];
172
+ queue.push(...children);
173
+ }
174
+ concreteSubtypesByRoot.set(cacheKey, concrete);
175
+ return concrete;
176
+ };
143
177
  // A declaration returning a concrete class is assignable to every class or
144
178
  // interface that type extends/implements. Expand once per language+type and
145
179
  // register the declaration under those ancestor names. This keeps named
@@ -227,13 +261,12 @@ export const diPhase = {
227
261
  ambiguousTypeNames.add(candidate.targetTypeName);
228
262
  continue;
229
263
  }
230
- const structural = new Set();
231
- if (typeof classEntry === 'string')
232
- structural.add(classEntry);
233
- if (typeof interfaceEntry === 'string') {
234
- for (const id of interfaceToImplementers.get(interfaceEntry) ?? [])
235
- structural.add(id);
236
- }
264
+ const rootTypeId = typeof classEntry === 'string'
265
+ ? classEntry
266
+ : typeof interfaceEntry === 'string'
267
+ ? interfaceEntry
268
+ : undefined;
269
+ const structural = new Set(rootTypeId === undefined ? [] : concreteSubtypes(rootTypeId, candidate.language));
237
270
  for (const id of providedTypes.get(candidate.language)?.get(candidate.targetTypeName) ?? []) {
238
271
  structural.add(id);
239
272
  }
@@ -15,6 +15,7 @@ export { ormPhase, type ORMOutput } from './orm.js';
15
15
  export { crossFilePhase, type CrossFileOutput } from './cross-file.js';
16
16
  export { scopeResolutionPhase, type ScopeResolutionOutput, } from '../scope-resolution/pipeline/phase.js';
17
17
  export { springConfigPhase, type SpringConfigOutput } from './spring-config.js';
18
+ export { springDestinationsPhase, type SpringDestinationsOutput } from './spring-destinations.js';
18
19
  export { springAutoConfigurationPhase, type SpringAutoConfigurationOutput, } from './spring-auto-configuration.js';
19
20
  export { springAopPhase, springAopInheritancePhase, type SpringAopOutput, type SpringAopInheritanceOutput, } from './spring-aop.js';
20
21
  export { pruneLocalSymbolsPhase, type PruneLocalSymbolsOutput } from './prune-local-symbols.js';