gitnexus 1.6.9 → 1.6.10-aptos.1

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 (540) hide show
  1. package/README.md +236 -53
  2. package/dist/_shared/graph/types.d.ts +67 -3
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/index.d.ts +1 -0
  5. package/dist/_shared/index.d.ts.map +1 -1
  6. package/dist/_shared/index.js.map +1 -1
  7. package/dist/_shared/integrations/resilient-fetch.d.ts +3 -1
  8. package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
  9. package/dist/_shared/integrations/resilient-fetch.js +4 -3
  10. package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
  11. package/dist/_shared/language-detection.d.ts.map +1 -1
  12. package/dist/_shared/language-detection.js +2 -0
  13. package/dist/_shared/language-detection.js.map +1 -1
  14. package/dist/_shared/languages.d.ts +2 -0
  15. package/dist/_shared/languages.d.ts.map +1 -1
  16. package/dist/_shared/languages.js +2 -0
  17. package/dist/_shared/languages.js.map +1 -1
  18. package/dist/_shared/lbug/schema-constants.d.ts +2 -2
  19. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  20. package/dist/_shared/lbug/schema-constants.js +8 -0
  21. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  22. package/dist/_shared/pipeline.d.ts +1 -1
  23. package/dist/_shared/pipeline.d.ts.map +1 -1
  24. package/dist/_shared/scope-resolution/callable-flow-site.d.ts +110 -0
  25. package/dist/_shared/scope-resolution/callable-flow-site.d.ts.map +1 -0
  26. package/dist/_shared/scope-resolution/callable-flow-site.js +11 -0
  27. package/dist/_shared/scope-resolution/callable-flow-site.js.map +1 -0
  28. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +1 -1
  29. package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
  30. package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -1
  31. package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
  32. package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
  33. package/dist/_shared/scope-resolution/language-classification.js +1 -0
  34. package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
  35. package/dist/_shared/scope-resolution/parsed-file.d.ts +7 -0
  36. package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
  37. package/dist/_shared/scope-resolution/reference-site.d.ts +9 -1
  38. package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
  39. package/dist/_shared/scope-resolution/types.d.ts +20 -3
  40. package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
  41. package/dist/cli/ai-context.d.ts +1 -1
  42. package/dist/cli/ai-context.js +25 -44
  43. package/dist/cli/analyze.d.ts +5 -2
  44. package/dist/cli/analyze.js +205 -11
  45. package/dist/cli/clean.js +17 -3
  46. package/dist/cli/cli-message.d.ts +1 -1
  47. package/dist/cli/doctor.d.ts +18 -0
  48. package/dist/cli/doctor.js +96 -5
  49. package/dist/cli/editor-targets.d.ts +17 -2
  50. package/dist/cli/editor-targets.js +44 -0
  51. package/dist/cli/embeddings.d.ts +12 -0
  52. package/dist/cli/embeddings.js +49 -0
  53. package/dist/cli/eval-server.d.ts +23 -1
  54. package/dist/cli/eval-server.js +126 -8
  55. package/dist/cli/help-i18n.js +6 -0
  56. package/dist/cli/i18n/en.d.ts +18 -8
  57. package/dist/cli/i18n/en.js +18 -8
  58. package/dist/cli/i18n/resources.d.ts +28 -8
  59. package/dist/cli/i18n/zh-CN.d.ts +10 -0
  60. package/dist/cli/i18n/zh-CN.js +18 -8
  61. package/dist/cli/index.js +21 -7
  62. package/dist/cli/lazy-action.d.ts +7 -0
  63. package/dist/cli/lazy-action.js +27 -0
  64. package/dist/cli/mcp.js +6 -3
  65. package/dist/cli/move-availability.d.ts +5 -0
  66. package/dist/cli/move-availability.js +11 -0
  67. package/dist/cli/setup.d.ts +8 -0
  68. package/dist/cli/setup.js +230 -32
  69. package/dist/cli/skill-gen.js +38 -18
  70. package/dist/cli/standard-skills.d.ts +76 -0
  71. package/dist/cli/standard-skills.js +45 -0
  72. package/dist/cli/status.d.ts +4 -1
  73. package/dist/cli/status.js +57 -4
  74. package/dist/cli/tool.js +11 -0
  75. package/dist/cli/uninstall.js +77 -18
  76. package/dist/cli/wiki.d.ts +1 -0
  77. package/dist/cli/wiki.js +7 -1
  78. package/dist/config/ignore-service.d.ts +2 -0
  79. package/dist/config/ignore-service.js +27 -0
  80. package/dist/core/analysis-features.d.ts +21 -0
  81. package/dist/core/analysis-features.js +59 -0
  82. package/dist/core/analyzer-identity.d.ts +74 -0
  83. package/dist/core/analyzer-identity.js +1820 -0
  84. package/dist/core/augmentation/engine.js +13 -8
  85. package/dist/core/embeddings/embedder.d.ts +3 -2
  86. package/dist/core/embeddings/embedder.js +24 -7
  87. package/dist/core/embeddings/embedding-identity.d.ts +11 -0
  88. package/dist/core/embeddings/embedding-identity.js +24 -0
  89. package/dist/core/embeddings/embedding-pipeline.d.ts +36 -1
  90. package/dist/core/embeddings/embedding-pipeline.js +100 -9
  91. package/dist/core/embeddings/http-client.d.ts +33 -3
  92. package/dist/core/embeddings/http-client.js +237 -25
  93. package/dist/core/embeddings/node-module-compat.d.ts +25 -0
  94. package/dist/core/embeddings/node-module-compat.js +25 -0
  95. package/dist/core/embeddings/onnxruntime-common-resolver.js +8 -5
  96. package/dist/core/embeddings/onnxruntime-node-resolver.js +33 -7
  97. package/dist/core/embeddings/runtime-install.d.ts +119 -0
  98. package/dist/core/embeddings/runtime-install.js +372 -0
  99. package/dist/core/embeddings/runtime-support.d.ts +48 -17
  100. package/dist/core/embeddings/runtime-support.js +96 -0
  101. package/dist/core/git-staleness.js +1 -1
  102. package/dist/core/group/bridge-db.js +2 -0
  103. package/dist/core/group/extractors/http-patterns/python.js +246 -108
  104. package/dist/core/group/extractors/manifest-extractor.js +4 -0
  105. package/dist/core/incremental/escalation-gate.d.ts +38 -0
  106. package/dist/core/incremental/escalation-gate.js +48 -0
  107. package/dist/core/incremental/shadow-candidates.d.ts +3 -3
  108. package/dist/core/incremental/shadow-candidates.js +3 -3
  109. package/dist/core/incremental/subgraph-extract.d.ts +2 -2
  110. package/dist/core/incremental/subgraph-extract.js +2 -2
  111. package/dist/core/index-freshness.d.ts +5 -0
  112. package/dist/core/index-freshness.js +13 -0
  113. package/dist/core/ingestion/class-extractors/configs/jvm.js +29 -0
  114. package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
  115. package/dist/core/ingestion/cobol/jcl-processor.js +9 -8
  116. package/dist/core/ingestion/cobol-processor.js +27 -26
  117. package/dist/core/ingestion/community-processor.d.ts +51 -1
  118. package/dist/core/ingestion/community-processor.js +323 -64
  119. package/dist/core/ingestion/emit-references.js +7 -2
  120. package/dist/core/ingestion/filesystem-walker.js +4 -0
  121. package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +3 -0
  122. package/dist/core/ingestion/frameworks/spring/analysis-features.js +7 -0
  123. package/dist/core/ingestion/frameworks/spring/bean-candidates.d.ts +30 -0
  124. package/dist/core/ingestion/frameworks/spring/bean-candidates.js +182 -0
  125. package/dist/core/ingestion/frameworks/spring/bean-catalog.d.ts +12 -0
  126. package/dist/core/ingestion/frameworks/spring/bean-catalog.js +26 -0
  127. package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +24 -0
  128. package/dist/core/ingestion/frameworks/spring/config-bindings.js +115 -0
  129. package/dist/core/ingestion/languages/c/captures.js +56 -0
  130. package/dist/core/ingestion/languages/c/query.js +17 -0
  131. package/dist/core/ingestion/languages/c/scope-resolver.js +6 -0
  132. package/dist/core/ingestion/languages/cobol/captures.js +93 -0
  133. package/dist/core/ingestion/languages/cobol/scope-resolver.js +7 -0
  134. package/dist/core/ingestion/languages/cpp/captures.js +365 -75
  135. package/dist/core/ingestion/languages/cpp/scope-resolver.js +14 -0
  136. package/dist/core/ingestion/languages/csharp/captures.js +25 -0
  137. package/dist/core/ingestion/languages/dart/captures.js +90 -2
  138. package/dist/core/ingestion/languages/dart/extension-type-preprocess.d.ts +7 -0
  139. package/dist/core/ingestion/languages/dart/extension-type-preprocess.js +30 -0
  140. package/dist/core/ingestion/languages/dart.js +2 -0
  141. package/dist/core/ingestion/languages/go/captures.js +34 -0
  142. package/dist/core/ingestion/languages/index.d.ts +1 -0
  143. package/dist/core/ingestion/languages/index.js +2 -0
  144. package/dist/core/ingestion/languages/java/analysis-features.d.ts +3 -0
  145. package/dist/core/ingestion/languages/java/analysis-features.js +13 -0
  146. package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +22 -0
  147. package/dist/core/ingestion/languages/java/capture-side-channel.js +58 -0
  148. package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
  149. package/dist/core/ingestion/languages/java/captures.js +193 -17
  150. package/dist/core/ingestion/languages/java/package-facts.d.ts +5 -0
  151. package/dist/core/ingestion/languages/java/package-facts.js +9 -0
  152. package/dist/core/ingestion/languages/java/package-siblings.d.ts +3 -16
  153. package/dist/core/ingestion/languages/java/package-siblings.js +8 -147
  154. package/dist/core/ingestion/languages/java/query.js +23 -0
  155. package/dist/core/ingestion/languages/java/scope-resolver.js +23 -0
  156. package/dist/core/ingestion/languages/java/spring-bean-metadata.d.ts +2 -0
  157. package/dist/core/ingestion/languages/java/spring-bean-metadata.js +8 -0
  158. package/dist/core/ingestion/languages/java/spring-config-bindings.d.ts +23 -0
  159. package/dist/core/ingestion/languages/java/spring-config-bindings.js +215 -0
  160. package/dist/core/ingestion/languages/java.js +3 -0
  161. package/dist/core/ingestion/languages/javascript/captures.js +16 -0
  162. package/dist/core/ingestion/languages/javascript/query.js +21 -0
  163. package/dist/core/ingestion/languages/jvm/package-facts.d.ts +35 -0
  164. package/dist/core/ingestion/languages/jvm/package-facts.js +40 -0
  165. package/dist/core/ingestion/languages/jvm/package-siblings.d.ts +14 -0
  166. package/dist/core/ingestion/languages/jvm/package-siblings.js +129 -0
  167. package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +17 -3
  168. package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +42 -8
  169. package/dist/core/ingestion/languages/kotlin/captures.js +59 -0
  170. package/dist/core/ingestion/languages/kotlin/package-facts.d.ts +5 -0
  171. package/dist/core/ingestion/languages/kotlin/package-facts.js +9 -0
  172. package/dist/core/ingestion/languages/kotlin/package-siblings.d.ts +4 -0
  173. package/dist/core/ingestion/languages/kotlin/package-siblings.js +8 -0
  174. package/dist/core/ingestion/languages/kotlin/query.js +19 -0
  175. package/dist/core/ingestion/languages/kotlin/scope-resolver.js +9 -1
  176. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.d.ts +2 -0
  177. package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.js +8 -0
  178. package/dist/core/ingestion/languages/kotlin.js +5 -6
  179. package/dist/core/ingestion/languages/move.d.ts +1 -0
  180. package/dist/core/ingestion/languages/move.js +27 -0
  181. package/dist/core/ingestion/languages/php/captures.js +40 -0
  182. package/dist/core/ingestion/languages/php/import-decomposer.js +12 -0
  183. package/dist/core/ingestion/languages/php/import-target.d.ts +2 -1
  184. package/dist/core/ingestion/languages/php/import-target.js +110 -2
  185. package/dist/core/ingestion/languages/php/interpret.js +10 -0
  186. package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
  187. package/dist/core/ingestion/languages/python/captures.d.ts +3 -4
  188. package/dist/core/ingestion/languages/python/captures.js +24 -5
  189. package/dist/core/ingestion/languages/python/interpret.js +4 -0
  190. package/dist/core/ingestion/languages/python/receiver-binding.d.ts +15 -2
  191. package/dist/core/ingestion/languages/python/receiver-binding.js +96 -2
  192. package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
  193. package/dist/core/ingestion/languages/python/simple-hooks.js +15 -5
  194. package/dist/core/ingestion/languages/ruby/captures.js +42 -0
  195. package/dist/core/ingestion/languages/rust/captures.js +13 -0
  196. package/dist/core/ingestion/languages/rust/interpret.js +18 -0
  197. package/dist/core/ingestion/languages/rust/query.js +9 -0
  198. package/dist/core/ingestion/languages/rust/range-binding.js +6 -2
  199. package/dist/core/ingestion/languages/swift/captures.js +12 -0
  200. package/dist/core/ingestion/languages/typescript/captures.js +21 -0
  201. package/dist/core/ingestion/languages/typescript/nuxt-auto-imports.js +2 -1
  202. package/dist/core/ingestion/languages/typescript/query.js +37 -0
  203. package/dist/core/ingestion/markdown-processor.js +3 -2
  204. package/dist/core/ingestion/model/registration-table.js +1 -0
  205. package/dist/core/ingestion/parsing-processor.d.ts +3 -1
  206. package/dist/core/ingestion/parsing-processor.js +36 -1
  207. package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
  208. package/dist/core/ingestion/pipeline-phases/index.js +2 -0
  209. package/dist/core/ingestion/pipeline-phases/parse-impl.js +56 -2
  210. package/dist/core/ingestion/pipeline-phases/parse.d.ts +0 -2
  211. package/dist/core/ingestion/pipeline-phases/parse.js +12 -3
  212. package/dist/core/ingestion/pipeline-phases/processes.d.ts +8 -0
  213. package/dist/core/ingestion/pipeline-phases/processes.js +11 -1
  214. package/dist/core/ingestion/pipeline-phases/spring-config.d.ts +37 -0
  215. package/dist/core/ingestion/pipeline-phases/spring-config.js +433 -0
  216. package/dist/core/ingestion/pipeline-phases/standalone-ingest.d.ts +16 -0
  217. package/dist/core/ingestion/pipeline-phases/standalone-ingest.js +6 -0
  218. package/dist/core/ingestion/pipeline.d.ts +4 -2
  219. package/dist/core/ingestion/pipeline.js +14 -2
  220. package/dist/core/ingestion/resolve-references.js +12 -0
  221. package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +83 -0
  222. package/dist/core/ingestion/route-extractors/constant-resolver.js +131 -0
  223. package/dist/core/ingestion/route-extractors/python-const-resolver.d.ts +75 -0
  224. package/dist/core/ingestion/route-extractors/python-const-resolver.js +299 -0
  225. package/dist/core/ingestion/scope-extractor.js +306 -43
  226. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +71 -2
  227. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +7 -7
  228. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +8 -7
  229. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +3 -1
  230. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +6 -0
  231. package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +1 -0
  232. package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +4 -1
  233. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +7 -2
  234. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +47 -0
  235. package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1138 -0
  236. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +16 -4
  237. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +97 -1
  238. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +60 -0
  239. package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +111 -0
  240. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +4 -3
  241. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +5 -0
  242. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +25 -38
  243. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +6 -0
  244. package/dist/core/ingestion/scope-resolution/pipeline/run.js +147 -35
  245. package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
  246. package/dist/core/ingestion/scope-resolution/scope/walkers.js +73 -44
  247. package/dist/core/ingestion/taint/typescript-model.js +34 -2
  248. package/dist/core/ingestion/tree-sitter-queries.d.ts +2 -2
  249. package/dist/core/ingestion/tree-sitter-queries.js +23 -2
  250. package/dist/core/ingestion/type-extractors/jvm.js +17 -2
  251. package/dist/core/ingestion/utils/ast-helpers.d.ts +1 -0
  252. package/dist/core/ingestion/utils/ast-helpers.js +153 -2
  253. package/dist/core/ingestion/utils/callable-flow-captures.d.ts +94 -0
  254. package/dist/core/ingestion/utils/callable-flow-captures.js +878 -0
  255. package/dist/core/ingestion/utils/line-base.d.ts +20 -0
  256. package/dist/core/ingestion/utils/line-base.js +20 -0
  257. package/dist/core/ingestion/utils/symbol-labels.d.ts +21 -0
  258. package/dist/core/ingestion/utils/symbol-labels.js +45 -0
  259. package/dist/core/ingestion/workers/parse-worker.d.ts +34 -0
  260. package/dist/core/ingestion/workers/parse-worker.js +40 -5
  261. package/dist/core/ingestion/workers/result-merge.js +4 -0
  262. package/dist/core/ingestion/workers/worker-pool.d.ts +28 -0
  263. package/dist/core/ingestion/workers/worker-pool.js +128 -28
  264. package/dist/core/lbug/csv-generator.d.ts +15 -0
  265. package/dist/core/lbug/csv-generator.js +124 -27
  266. package/dist/core/lbug/cypher-escape.d.ts +20 -0
  267. package/dist/core/lbug/cypher-escape.js +20 -0
  268. package/dist/core/lbug/extension-load-error.d.ts +67 -0
  269. package/dist/core/lbug/extension-load-error.js +326 -0
  270. package/dist/core/lbug/extension-loader.d.ts +17 -2
  271. package/dist/core/lbug/extension-loader.js +38 -13
  272. package/dist/core/lbug/lbug-adapter.d.ts +203 -2
  273. package/dist/core/lbug/lbug-adapter.js +527 -86
  274. package/dist/core/lbug/lbug-config.d.ts +56 -2
  275. package/dist/core/lbug/lbug-config.js +267 -7
  276. package/dist/core/lbug/move-columns.d.ts +7 -0
  277. package/dist/core/lbug/move-columns.js +86 -0
  278. package/dist/core/lbug/native-check.d.ts +40 -0
  279. package/dist/core/lbug/native-check.js +90 -0
  280. package/dist/core/lbug/node-table-layout.d.ts +29 -0
  281. package/dist/core/lbug/node-table-layout.js +119 -0
  282. package/dist/core/lbug/pool-adapter.d.ts +23 -1
  283. package/dist/core/lbug/pool-adapter.js +115 -8
  284. package/dist/core/lbug/schema.d.ts +4 -3
  285. package/dist/core/lbug/schema.js +16 -16
  286. package/dist/core/lbug/sidecar-recovery.d.ts +172 -0
  287. package/dist/core/lbug/sidecar-recovery.js +418 -16
  288. package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
  289. package/dist/core/move/artifact-download.d.ts +19 -0
  290. package/dist/core/move/artifact-download.js +179 -0
  291. package/dist/core/move/compiler-facts.d.ts +120 -0
  292. package/dist/core/move/compiler-facts.js +9 -0
  293. package/dist/core/move/consistency.d.ts +74 -0
  294. package/dist/core/move/consistency.js +182 -0
  295. package/dist/core/move/constants.d.ts +98 -0
  296. package/dist/core/move/constants.js +136 -0
  297. package/dist/core/move/discovery.d.ts +10 -0
  298. package/dist/core/move/discovery.js +22 -0
  299. package/dist/core/move/entry-points.d.ts +14 -0
  300. package/dist/core/move/entry-points.js +40 -0
  301. package/dist/core/move/facts-mapper.d.ts +75 -0
  302. package/dist/core/move/facts-mapper.js +534 -0
  303. package/dist/core/move/install-lock.d.ts +14 -0
  304. package/dist/core/move/install-lock.js +102 -0
  305. package/dist/core/move/install.d.ts +39 -0
  306. package/dist/core/move/install.js +391 -0
  307. package/dist/core/move/mcp-client.d.ts +115 -0
  308. package/dist/core/move/mcp-client.js +436 -0
  309. package/dist/core/move/move-ingest.d.ts +52 -0
  310. package/dist/core/move/move-ingest.js +403 -0
  311. package/dist/core/move/provision.d.ts +19 -0
  312. package/dist/core/move/provision.js +91 -0
  313. package/dist/core/move/release.d.ts +6 -0
  314. package/dist/core/move/release.js +10 -0
  315. package/dist/core/move/symbol-id.d.ts +35 -0
  316. package/dist/core/move/symbol-id.js +65 -0
  317. package/dist/core/move/type-parser.d.ts +11 -0
  318. package/dist/core/move/type-parser.js +38 -0
  319. package/dist/core/platform/capabilities.d.ts +0 -1
  320. package/dist/core/platform/capabilities.js +39 -8
  321. package/dist/core/run-analyze.d.ts +9 -3
  322. package/dist/core/run-analyze.js +1002 -184
  323. package/dist/core/search/fts-indexes.d.ts +31 -0
  324. package/dist/core/search/fts-indexes.js +73 -0
  325. package/dist/core/search/fts-schema.js +2 -0
  326. package/dist/core/tree-sitter/safe-parse.d.ts +8 -3
  327. package/dist/core/tree-sitter/safe-parse.js +21 -7
  328. package/dist/core/wiki/graph-queries.js +6 -5
  329. package/dist/core/wiki/llm-client.d.ts +8 -2
  330. package/dist/core/wiki/llm-client.js +41 -5
  331. package/dist/mcp/core/embedder.js +16 -2
  332. package/dist/mcp/http-transport.d.ts +5 -0
  333. package/dist/mcp/http-transport.js +19 -5
  334. package/dist/mcp/local/bean-metadata.d.ts +2 -0
  335. package/dist/mcp/local/bean-metadata.js +25 -0
  336. package/dist/mcp/local/line-display.d.ts +22 -0
  337. package/dist/mcp/local/line-display.js +3 -0
  338. package/dist/mcp/local/local-backend.d.ts +19 -1
  339. package/dist/mcp/local/local-backend.js +402 -155
  340. package/dist/mcp/local/pdg-impact.d.ts +5 -3
  341. package/dist/mcp/local/pdg-impact.js +5 -2
  342. package/dist/mcp/output-budget.d.ts +5 -0
  343. package/dist/mcp/output-budget.js +52 -0
  344. package/dist/mcp/read-only-policy.d.ts +12 -0
  345. package/dist/mcp/read-only-policy.js +102 -0
  346. package/dist/mcp/repository-policy.d.ts +34 -0
  347. package/dist/mcp/repository-policy.js +328 -0
  348. package/dist/mcp/resources.js +32 -5
  349. package/dist/mcp/server.d.ts +5 -2
  350. package/dist/mcp/server.js +29 -9
  351. package/dist/mcp/tools.d.ts +0 -8
  352. package/dist/mcp/tools.js +102 -5
  353. package/dist/server/analyze-job.d.ts +3 -0
  354. package/dist/server/analyze-job.js +17 -0
  355. package/dist/server/analyze-launch.d.ts +6 -0
  356. package/dist/server/analyze-launch.js +82 -6
  357. package/dist/server/analyze-worker-core.d.ts +2 -1
  358. package/dist/server/analyze-worker-core.js +5 -2
  359. package/dist/server/analyze-worker.js +29 -6
  360. package/dist/server/api.d.ts +30 -0
  361. package/dist/server/api.js +120 -34
  362. package/dist/server/mcp-http.d.ts +1 -1
  363. package/dist/server/mcp-http.js +4 -2
  364. package/dist/server/upload-ingest.js +2 -1
  365. package/dist/server/validation.js +2 -1
  366. package/dist/storage/git.d.ts +31 -0
  367. package/dist/storage/git.js +111 -1
  368. package/dist/storage/parse-cache.js +7 -1
  369. package/dist/storage/parsedfile-store.d.ts +8 -0
  370. package/dist/storage/parsedfile-store.js +165 -1
  371. package/dist/storage/repo-manager.d.ts +194 -2
  372. package/dist/storage/repo-manager.js +56 -1
  373. package/dist/types/pipeline.d.ts +7 -0
  374. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +50 -3
  375. package/hooks/claude/gitnexus-hook.cjs +59 -9
  376. package/hooks/claude/pre-tool-use.sh +0 -0
  377. package/hooks/claude/session-start.sh +0 -0
  378. package/package.json +21 -15
  379. package/scripts/cross-platform-tests.ts +56 -0
  380. package/scripts/ensure-fts.ts +43 -0
  381. package/scripts/install-duckdb-extension.mjs +85 -24
  382. package/scripts/run-cross-platform.ts +61 -6
  383. package/scripts/shard-arg.ts +30 -0
  384. package/scripts/sync-plugin-manifests.mjs +192 -0
  385. package/skills/gitnexus-lfg/README.md +55 -0
  386. package/skills/gitnexus-lfg/SKILL.md +86 -0
  387. package/skills/gitnexus-plan/README.md +142 -0
  388. package/skills/gitnexus-plan/SKILL.md +348 -0
  389. package/skills/gitnexus-plan/references/context-ledger.md +137 -0
  390. package/skills/gitnexus-plan/references/context-pack.md +126 -0
  391. package/skills/gitnexus-plan/references/evidence-provenance.md +272 -0
  392. package/skills/gitnexus-plan/references/pdg-slice.md +109 -0
  393. package/skills/gitnexus-plan/references/plan-template.md +201 -0
  394. package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +2084 -0
  395. package/skills/gitnexus-review/SKILL.md +273 -0
  396. package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +42 -0
  397. package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +39 -0
  398. package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +37 -0
  399. package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +40 -0
  400. package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +42 -0
  401. package/skills/gitnexus-review/ci-personas/ci-security-lens.md +39 -0
  402. package/skills/gitnexus-work/README.md +71 -0
  403. package/skills/gitnexus-work/SKILL.md +269 -0
  404. package/skills/gitnexus-work/references/evidence-provenance.md +272 -0
  405. package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2084 -0
  406. package/web/assets/ProcessFlowModal-B_bfBySy.js +22 -0
  407. package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
  408. package/web/assets/agent-Bqxn-abU.js +626 -0
  409. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +1 -0
  410. package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +36 -0
  411. package/web/assets/{blockDiagram-7IZFK4PR-BkWhpzWB.js → blockDiagram-7IZFK4PR-DBefcjof.js} +7 -7
  412. package/web/assets/{c4Diagram-Y2BXMSZH-DtBvpzWD.js → c4Diagram-Y2BXMSZH-EjWnjEJl.js} +6 -6
  413. package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +4 -0
  414. package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +1 -0
  415. package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +321 -0
  416. package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +159 -0
  417. package/web/assets/{chunk-6764PJDD-DpIS7hxD.js → chunk-6764PJDD-C7xxk063.js} +1 -1
  418. package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +124 -0
  419. package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +32 -0
  420. package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +10 -0
  421. package/web/assets/chunk-7W6UQGC5-pyKGssV3.js +1 -0
  422. package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +1 -0
  423. package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +1 -0
  424. package/web/assets/{chunk-INKRHTLW-Nu4ri9P-.js → chunk-INKRHTLW-Ckl3_KkO.js} +13 -13
  425. package/web/assets/chunk-J5EP6P6S-L19oz55R.js +1 -0
  426. package/web/assets/{chunk-KGFNY3KK-JGMJvKCK.js → chunk-KGFNY3KK-BZeP-55u.js} +17 -17
  427. package/web/assets/chunk-KGYTTC2M-zm6n242I.js +1 -0
  428. package/web/assets/{chunk-KRXBNO2N-BW5o0KUN.js → chunk-KRXBNO2N-C-UNuKKf.js} +1 -1
  429. package/web/assets/{chunk-LCXTWHL2-CfLLCywY.js → chunk-LCXTWHL2-C162wE5z.js} +5 -5
  430. package/web/assets/chunk-LII3EMHJ-BL6lKJ_P.js +1 -0
  431. package/web/assets/chunk-LRIF4GLE-n59lhprL.js +1 -0
  432. package/web/assets/chunk-QA3QBVWF-DVXPOIxe.js +2 -0
  433. package/web/assets/chunk-RERM46MO-B5dAdWpP.js +1 -0
  434. package/web/assets/chunk-RG4AUYOV-ZNgyLFq6.js +206 -0
  435. package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +1 -0
  436. package/web/assets/chunk-RLI5ZMPA-CkXZ0y0U.js +1 -0
  437. package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +1 -0
  438. package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +1 -0
  439. package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +1 -0
  440. package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +1 -0
  441. package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +2 -0
  442. package/web/assets/{chunk-W44A43WB-JqMLIpR0.js → chunk-W44A43WB-BN8EQc_u.js} +1 -1
  443. package/web/assets/chunk-ZXARS5L4-C3v-4Fsw.js +1 -0
  444. package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +1 -0
  445. package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +1 -0
  446. package/web/assets/cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js +1 -0
  447. package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +4 -0
  448. package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +43 -0
  449. package/web/assets/diagram-GF46GFSD-B2atbzmU.js +24 -0
  450. package/web/assets/diagram-HNR7UZ2L-DVRltWbL.js +3 -0
  451. package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +24 -0
  452. package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +10 -0
  453. package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +85 -0
  454. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +1 -0
  455. package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +162 -0
  456. package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +292 -0
  457. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +1 -0
  458. package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +106 -0
  459. package/web/assets/index-CX_fADmQ.css +2 -0
  460. package/web/assets/index-D1Z3dGGz.js +575 -0
  461. package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +1 -0
  462. package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +2 -0
  463. package/web/assets/{ishikawaDiagram-BNXS4ZKH-DfYpxnE5.js → ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js} +6 -6
  464. package/web/assets/journeyDiagram-M6C3CM3L-C6wjooas.js +139 -0
  465. package/web/assets/kanban-definition-75IXJCU3-5_UVY79g.js +89 -0
  466. package/web/assets/{katex-K3KEBU37-CTc5BslQ.js → katex-K3KEBU37-qRQBy-EZ.js} +2 -2
  467. package/web/assets/{mindmap-definition-2TDM6QVE-DypvbOMQ.js → mindmap-definition-2TDM6QVE-8xDLzk2e.js} +29 -29
  468. package/web/assets/node-Ct_zna8U.js +8 -0
  469. package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +1 -0
  470. package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +1 -0
  471. package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +30 -0
  472. package/web/assets/preload-helper-Czpn1I53.js +1 -0
  473. package/web/assets/{quadrantDiagram-VICAPDV7-yXSZ2lLz.js → quadrantDiagram-VICAPDV7-DR54jOeR.js} +6 -6
  474. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +1 -0
  475. package/web/assets/requirementDiagram-JXO7QTGE-PEkg7sKC.js +84 -0
  476. package/web/assets/rolldown-runtime-QTnfLwEv.js +1 -0
  477. package/web/assets/sankeyDiagram-URQDO5SZ-DDWEtjcs.js +40 -0
  478. package/web/assets/sdk-CzHHH8tD.js +37 -0
  479. package/web/assets/sequenceDiagram-VS2MUI6T-Bv-uwANx.js +162 -0
  480. package/web/assets/src-JV30wyV8.js +1 -0
  481. package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +1 -0
  482. package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +1 -0
  483. package/web/assets/timeline-definition-O6YCAMPW-Qmsuo7qS.js +120 -0
  484. package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +1 -0
  485. package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +1 -0
  486. package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +34 -0
  487. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +1 -0
  488. package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +78 -0
  489. package/web/assets/{xychartDiagram-N2JHSOCM-BOLm0eNm.js → xychartDiagram-N2JHSOCM-CoZ_Tits.js} +6 -6
  490. package/web/index.html +18 -10
  491. package/skills/gitnexus-pr-review.md +0 -163
  492. package/web/assets/agent-Dli_x7bU.js +0 -660
  493. package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +0 -1
  494. package/web/assets/architectureDiagram-UL44E2DR-dEkqUZN9.js +0 -36
  495. package/web/assets/chunk-3SSMPTDK-B4_etUhr.js +0 -321
  496. package/web/assets/chunk-67TQ5CYL-4sNPJU1q.js +0 -124
  497. package/web/assets/chunk-7W6UQGC5-KyEG0HQg.js +0 -1
  498. package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +0 -161
  499. package/web/assets/chunk-LII3EMHJ-D-jm-dLa.js +0 -1
  500. package/web/assets/chunk-QA3QBVWF-BgRW3SXd.js +0 -2
  501. package/web/assets/chunk-RG4AUYOV-CqWzWsV3.js +0 -206
  502. package/web/assets/chunk-T2UQINTJ-DSBqkzH7.js +0 -1
  503. package/web/assets/chunk-UY5QBCOK-DyF0vyGd.js +0 -1
  504. package/web/assets/chunk-ZXARS5L4-CxN8oiwI.js +0 -1
  505. package/web/assets/classDiagram-KGZ6W3CR-CMne4tG9.js +0 -1
  506. package/web/assets/classDiagram-v2-72OJOZXJ-CMne4tG9.js +0 -1
  507. package/web/assets/cose-bilkent-UX7MHV2Q-D71wNYRJ.js +0 -1
  508. package/web/assets/dagre-ND4H6XIP-Co5rRx9X.js +0 -4
  509. package/web/assets/diagram-3NCE3AQN-DBp4O00j.js +0 -43
  510. package/web/assets/diagram-GF46GFSD-6N_8yS0i.js +0 -24
  511. package/web/assets/diagram-HNR7UZ2L-DFCfd5LI.js +0 -3
  512. package/web/assets/diagram-QXG6HAR7-Di093rFg.js +0 -24
  513. package/web/assets/diagram-WEQXMOUZ-DZWi4SUN.js +0 -10
  514. package/web/assets/erDiagram-L5TCEMPS-8X1y6R4Y.js +0 -85
  515. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +0 -1
  516. package/web/assets/flowDiagram-H6V6AXG4-CMpY8Ufn.js +0 -162
  517. package/web/assets/ganttDiagram-JCBTUEKG-D3iL2Aet.js +0 -292
  518. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +0 -1
  519. package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +0 -106
  520. package/web/assets/index-KctnI3Vq.js +0 -635
  521. package/web/assets/index-_lgn7hs5.css +0 -2
  522. package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +0 -1
  523. package/web/assets/infoDiagram-3YFTVSEB-BaLMZkUg.js +0 -2
  524. package/web/assets/journeyDiagram-M6C3CM3L-CvArszLo.js +0 -139
  525. package/web/assets/kanban-definition-75IXJCU3-CpfVLLf9.js +0 -89
  526. package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +0 -1
  527. package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +0 -1
  528. package/web/assets/pieDiagram-CU6KROY3-s27EFWgP.js +0 -30
  529. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +0 -1
  530. package/web/assets/requirementDiagram-JXO7QTGE-CWhqInuf.js +0 -84
  531. package/web/assets/sankeyDiagram-URQDO5SZ-1qEjlFIB.js +0 -40
  532. package/web/assets/sequenceDiagram-VS2MUI6T-RyTlZ5cR.js +0 -162
  533. package/web/assets/stateDiagram-7D4R322I-DTjVfX4A.js +0 -1
  534. package/web/assets/stateDiagram-v2-36443NZ5-xY9_k9_Q.js +0 -1
  535. package/web/assets/timeline-definition-O6YCAMPW-DrrqLYAf.js +0 -120
  536. package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +0 -1
  537. package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +0 -1
  538. package/web/assets/vennDiagram-MWXL3ELB-B0RkWAim.js +0 -34
  539. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +0 -1
  540. package/web/assets/wardleyDiagram-CUQ6CDDI-boUxiQ5F.js +0 -78
@@ -0,0 +1,182 @@
1
+ import { makeScopeId } from '../../../../_shared/index.js';
2
+ import { resolveDefGraphId } from '../../scope-resolution/graph-bridge/ids.js';
3
+ import { isClassLike, lookupBindingsAt } from '../../scope-resolution/scope/walkers.js';
4
+ import { SPRING_BEAN_STEREOTYPES } from './bean-catalog.js';
5
+ /** Per-language store for capture facts that cross the worker boundary. */
6
+ export function createClassAnnotationFactStore() {
7
+ const factsByFile = new Map();
8
+ return {
9
+ clear: () => factsByFile.clear(),
10
+ set: (filePath, facts) => {
11
+ if (facts.length === 0)
12
+ factsByFile.delete(filePath);
13
+ else
14
+ factsByFile.set(filePath, facts);
15
+ },
16
+ get: (filePath) => factsByFile.get(filePath) ?? [],
17
+ };
18
+ }
19
+ /** Record one annotation from the language's existing scope-query traversal. */
20
+ export function recordClassAnnotationCapture(facts, filePath, classCapture, annotationName) {
21
+ const classScopeId = makeScopeId({ filePath, range: classCapture.range, kind: 'Class' });
22
+ const names = facts.get(classScopeId) ?? new Set();
23
+ names.add(annotationName.trim());
24
+ facts.set(classScopeId, names);
25
+ }
26
+ export function materializeClassAnnotationFacts(facts) {
27
+ return [...facts].map(([classScopeId, annotationNames]) => ({
28
+ classScopeId,
29
+ annotationNames: [...annotationNames],
30
+ }));
31
+ }
32
+ function simpleNameOf(def) {
33
+ const qualifiedName = def.qualifiedName;
34
+ if (qualifiedName === undefined)
35
+ return undefined;
36
+ const separator = qualifiedName.lastIndexOf('.');
37
+ return separator === -1 ? qualifiedName : qualifiedName.slice(separator + 1);
38
+ }
39
+ function buildOwnedTypeNamesByOwner(indexes) {
40
+ const namesByOwner = new Map();
41
+ for (const def of indexes.defs.byId.values()) {
42
+ if (def.ownerId === undefined)
43
+ continue;
44
+ if (!isClassLike(def.type) && def.type !== 'Annotation')
45
+ continue;
46
+ const simpleName = simpleNameOf(def);
47
+ if (simpleName === undefined)
48
+ continue;
49
+ const names = namesByOwner.get(def.ownerId) ?? new Set();
50
+ names.add(simpleName);
51
+ namesByOwner.set(def.ownerId, names);
52
+ }
53
+ return namesByOwner;
54
+ }
55
+ function hasLexicalTypeDeclaration(startScope, simpleName, indexes) {
56
+ let scopeId = startScope;
57
+ const visited = new Set();
58
+ while (scopeId !== null && !visited.has(scopeId)) {
59
+ visited.add(scopeId);
60
+ const scope = indexes.scopeTree.getScope(scopeId);
61
+ if (scope === undefined)
62
+ return false;
63
+ const locals = scope.bindings.get(simpleName);
64
+ if (locals?.some(({ def }) => isClassLike(def.type) || def.type === 'Annotation'))
65
+ return true;
66
+ scopeId = scope.parent;
67
+ }
68
+ return false;
69
+ }
70
+ function explicitImportTargets(parsed, simpleName) {
71
+ const targets = new Set();
72
+ for (const entry of parsed.parsedImports) {
73
+ if (entry.kind !== 'named' && entry.kind !== 'alias')
74
+ continue;
75
+ if (entry.localName !== simpleName)
76
+ continue;
77
+ targets.add(entry.targetRaw);
78
+ }
79
+ return targets;
80
+ }
81
+ function hasInheritedTypeDeclaration(startScope, simpleName, indexes, ownedTypeNamesByOwner) {
82
+ let scopeId = startScope;
83
+ const visited = new Set();
84
+ while (scopeId !== null && !visited.has(scopeId)) {
85
+ visited.add(scopeId);
86
+ const scope = indexes.scopeTree.getScope(scopeId);
87
+ if (scope === undefined)
88
+ return false;
89
+ if (scope.kind === 'Class') {
90
+ const classDef = scope.ownedDefs.find((def) => isClassLike(def.type));
91
+ if (classDef !== undefined) {
92
+ for (const ancestorId of indexes.methodDispatch.mroFor(classDef.nodeId)) {
93
+ if (ownedTypeNamesByOwner.get(ancestorId)?.has(simpleName) === true)
94
+ return true;
95
+ }
96
+ }
97
+ }
98
+ scopeId = scope.parent;
99
+ }
100
+ return false;
101
+ }
102
+ function hasVisibleTypeBinding(startScope, simpleName, indexes) {
103
+ let scopeId = startScope;
104
+ const visited = new Set();
105
+ while (scopeId !== null && !visited.has(scopeId)) {
106
+ visited.add(scopeId);
107
+ const scope = indexes.scopeTree.getScope(scopeId);
108
+ if (scope === undefined)
109
+ return false;
110
+ const visible = lookupBindingsAt(scopeId, simpleName, indexes);
111
+ if (visible.some(({ def }) => isClassLike(def.type) || def.type === 'Annotation'))
112
+ return true;
113
+ scopeId = scope.parent;
114
+ }
115
+ return false;
116
+ }
117
+ function wildcardImportTarget(parsed, simpleName, recognizedAnnotations) {
118
+ const wildcardPackages = new Set(parsed.parsedImports
119
+ .filter((entry) => entry.kind === 'wildcard')
120
+ .map((entry) => entry.targetRaw.replace(/\.\*$/, '')));
121
+ if (wildcardPackages.size !== 1)
122
+ return undefined;
123
+ const [packageName] = wildcardPackages;
124
+ const target = `${packageName}.${simpleName}`;
125
+ return recognizedAnnotations.has(target) ? target : undefined;
126
+ }
127
+ /** Build a scope-aware Spring annotation resolver shared by framework hooks. */
128
+ export function createSpringAnnotationNameResolver(indexes) {
129
+ const ownedTypeNamesByOwner = buildOwnedTypeNamesByOwner(indexes);
130
+ return (rawName, parsed, enclosingScope, recognizedAnnotations, isPackageVisibilityIncomplete) => {
131
+ if (rawName.includes('.')) {
132
+ return recognizedAnnotations.has(rawName) ? rawName : undefined;
133
+ }
134
+ if (hasLexicalTypeDeclaration(enclosingScope, rawName, indexes))
135
+ return undefined;
136
+ if (hasInheritedTypeDeclaration(enclosingScope, rawName, indexes, ownedTypeNamesByOwner)) {
137
+ return undefined;
138
+ }
139
+ const explicitImports = explicitImportTargets(parsed, rawName);
140
+ if (explicitImports.size > 0) {
141
+ if (explicitImports.size !== 1)
142
+ return undefined;
143
+ const [imported] = explicitImports;
144
+ return recognizedAnnotations.has(imported) ? imported : undefined;
145
+ }
146
+ const wildcardTarget = wildcardImportTarget(parsed, rawName, recognizedAnnotations);
147
+ if (wildcardTarget === undefined || isPackageVisibilityIncomplete)
148
+ return undefined;
149
+ return hasVisibleTypeBinding(enclosingScope, rawName, indexes) ? undefined : wildcardTarget;
150
+ };
151
+ }
152
+ /** Build a language hook that enriches Class nodes after scope resolution. */
153
+ export function createSpringBeanCandidateAttacher(adapter) {
154
+ return (graph, parsedFiles, nodeLookup, indexes) => {
155
+ const resolveSpringAnnotation = createSpringAnnotationNameResolver(indexes);
156
+ for (const parsed of parsedFiles) {
157
+ for (const fact of adapter.getClassAnnotationFacts(parsed.filePath)) {
158
+ const classScope = indexes.scopeTree.getScope(fact.classScopeId);
159
+ if (classScope === undefined || classScope.kind !== 'Class')
160
+ continue;
161
+ const classDef = classScope.ownedDefs.find((def) => def.type === 'Class');
162
+ if (classDef === undefined)
163
+ continue;
164
+ const graphId = resolveDefGraphId(parsed.filePath, classDef, nodeLookup);
165
+ if (graphId === undefined)
166
+ continue;
167
+ const classNode = graph.getNode(graphId);
168
+ if (classNode === undefined || classNode.label !== 'Class')
169
+ continue;
170
+ const recognized = new Set();
171
+ for (const rawName of fact.annotationNames) {
172
+ const annotation = resolveSpringAnnotation(rawName, parsed, classScope.parent, SPRING_BEAN_STEREOTYPES, adapter.isPackageVisibilityIncomplete(parsed.filePath));
173
+ if (annotation !== undefined)
174
+ recognized.add(annotation);
175
+ }
176
+ if (recognized.size === 1) {
177
+ classNode.properties.frameworkAnnotations = [...recognized];
178
+ }
179
+ }
180
+ }
181
+ };
182
+ }
@@ -0,0 +1,12 @@
1
+ export interface SpringBeanMetadata {
2
+ framework: 'spring';
3
+ role: string;
4
+ annotation: string;
5
+ }
6
+ export interface SpringBeanStereotype {
7
+ role: string;
8
+ }
9
+ export declare const SPRING_BEAN_STEREOTYPES: Map<string, SpringBeanStereotype>;
10
+ export declare function deriveSpringBeanMetadata(frameworkAnnotations: readonly string[]): SpringBeanMetadata | undefined;
11
+ /** Whether a source change can alter Spring Bean candidate metadata. */
12
+ export declare function isSpringBeanCandidateSourceFile(filePath: string): boolean;
@@ -0,0 +1,26 @@
1
+ export const SPRING_BEAN_STEREOTYPES = new Map([
2
+ ['org.springframework.stereotype.Component', { role: 'component' }],
3
+ ['org.springframework.stereotype.Service', { role: 'service' }],
4
+ ['org.springframework.stereotype.Repository', { role: 'repository' }],
5
+ ['org.springframework.stereotype.Controller', { role: 'controller' }],
6
+ ['org.springframework.web.bind.annotation.RestController', { role: 'rest-controller' }],
7
+ ['org.springframework.context.annotation.Configuration', { role: 'configuration' }],
8
+ ]);
9
+ export function deriveSpringBeanMetadata(frameworkAnnotations) {
10
+ const recognized = [
11
+ ...new Set(frameworkAnnotations.filter((annotation) => SPRING_BEAN_STEREOTYPES.has(annotation))),
12
+ ];
13
+ if (recognized.length !== 1)
14
+ return undefined;
15
+ const annotation = recognized[0];
16
+ const stereotype = SPRING_BEAN_STEREOTYPES.get(annotation);
17
+ if (!stereotype)
18
+ return undefined;
19
+ return { framework: 'spring', role: stereotype.role, annotation };
20
+ }
21
+ const SPRING_BEAN_SOURCE_EXTENSIONS = ['.java', '.kt', '.kts'];
22
+ /** Whether a source change can alter Spring Bean candidate metadata. */
23
+ export function isSpringBeanCandidateSourceFile(filePath) {
24
+ const normalized = filePath.toLowerCase();
25
+ return SPRING_BEAN_SOURCE_EXTENSIONS.some((extension) => normalized.endsWith(extension));
26
+ }
@@ -0,0 +1,24 @@
1
+ import type { KnowledgeGraph } from '../../../graph/types.js';
2
+ export declare const SPRING_CONFIG_DESCRIPTION = "Spring configuration property";
3
+ export interface SpringValueConsumer {
4
+ readonly kind: 'value';
5
+ readonly fieldName: string;
6
+ readonly line: number;
7
+ readonly keys: readonly string[];
8
+ }
9
+ export interface SpringConfigurationPropertiesConsumer {
10
+ readonly kind: 'configuration-properties';
11
+ readonly className: string;
12
+ readonly line: number;
13
+ readonly prefix: string;
14
+ }
15
+ export type SpringConfigConsumer = SpringValueConsumer | SpringConfigurationPropertiesConsumer;
16
+ export interface SpringConfigConsumerBatch {
17
+ readonly filePath: string;
18
+ readonly consumers: readonly SpringConfigConsumer[];
19
+ }
20
+ /**
21
+ * Attach normalized, language-provider-produced Spring consumers to config
22
+ * keys already present in the shared graph.
23
+ */
24
+ export declare function bindSpringConfigConsumers(graph: KnowledgeGraph, batches: readonly SpringConfigConsumerBatch[]): void;
@@ -0,0 +1,115 @@
1
+ import { generateId } from '../../../../lib/utils.js';
2
+ export const SPRING_CONFIG_DESCRIPTION = 'Spring configuration property';
3
+ function closestNode(candidates, filePath, name, line) {
4
+ return candidates
5
+ .filter((node) => node.properties.filePath === filePath && node.properties.name === name)
6
+ .sort((left, right) => Math.abs(Number(left.properties.startLine ?? 0) - line) -
7
+ Math.abs(Number(right.properties.startLine ?? 0) - line))[0];
8
+ }
9
+ function markUnresolved(node, key) {
10
+ const marker = `Spring config unresolved: ${key}`;
11
+ const existing = typeof node.properties.description === 'string' ? node.properties.description : '';
12
+ if (existing.includes(marker))
13
+ return;
14
+ node.properties.description = existing.length > 0 ? `${existing}; ${marker}` : marker;
15
+ }
16
+ function relaxedName(value) {
17
+ return value.toLowerCase().replace(/[-_.]/g, '');
18
+ }
19
+ function isSpringConfigNode(node) {
20
+ return (node.label === 'Property' &&
21
+ typeof node.properties.description === 'string' &&
22
+ node.properties.description.startsWith(SPRING_CONFIG_DESCRIPTION));
23
+ }
24
+ /**
25
+ * Attach normalized, language-provider-produced Spring consumers to config
26
+ * keys already present in the shared graph.
27
+ */
28
+ export function bindSpringConfigConsumers(graph, batches) {
29
+ if (batches.length === 0)
30
+ return;
31
+ const configNodes = [];
32
+ const propertyNodes = [];
33
+ const classNodes = [];
34
+ for (const node of graph.iterNodes()) {
35
+ if (isSpringConfigNode(node))
36
+ configNodes.push(node);
37
+ else if (node.label === 'Property')
38
+ propertyNodes.push(node);
39
+ else if (node.label === 'Class' || node.label === 'Record')
40
+ classNodes.push(node);
41
+ }
42
+ const keyNodes = new Map();
43
+ for (const node of configNodes) {
44
+ const key = String(node.properties.name);
45
+ const bucket = keyNodes.get(key) ?? [];
46
+ bucket.push(node);
47
+ keyNodes.set(key, bucket);
48
+ }
49
+ const propertiesByOwner = new Map();
50
+ for (const rel of graph.iterRelationshipsByType('HAS_PROPERTY')) {
51
+ const property = graph.getNode(rel.targetId);
52
+ if (property?.label !== 'Property' || isSpringConfigNode(property))
53
+ continue;
54
+ const members = propertiesByOwner.get(rel.sourceId) ?? [];
55
+ members.push(property);
56
+ propertiesByOwner.set(rel.sourceId, members);
57
+ }
58
+ const addBinding = (source, target, reason, confidence) => {
59
+ const edgeId = generateId('USES', `${source.id}->${target.id}:${reason}`);
60
+ graph.addRelationship({
61
+ id: edgeId,
62
+ sourceId: source.id,
63
+ targetId: target.id,
64
+ type: 'USES',
65
+ confidence,
66
+ reason,
67
+ });
68
+ };
69
+ for (const { filePath, consumers } of batches) {
70
+ for (const consumer of consumers) {
71
+ if (consumer.kind === 'value') {
72
+ const field = closestNode(propertyNodes, filePath, consumer.fieldName, consumer.line);
73
+ if (field === undefined)
74
+ continue;
75
+ for (const key of consumer.keys) {
76
+ const matches = keyNodes.get(key) ?? [];
77
+ if (matches.length === 0) {
78
+ markUnresolved(field, key);
79
+ continue;
80
+ }
81
+ for (const match of matches) {
82
+ addBinding(field, match, `spring-config:@Value ${key}`, 1);
83
+ }
84
+ }
85
+ continue;
86
+ }
87
+ const owner = closestNode(classNodes, filePath, consumer.className, consumer.line);
88
+ if (owner === undefined)
89
+ continue;
90
+ const prefix = `${consumer.prefix}.`;
91
+ const matches = configNodes.filter((node) => {
92
+ const key = String(node.properties.name);
93
+ return key === consumer.prefix || key.startsWith(prefix);
94
+ });
95
+ if (matches.length === 0) {
96
+ markUnresolved(owner, consumer.prefix);
97
+ continue;
98
+ }
99
+ for (const match of matches) {
100
+ addBinding(owner, match, `spring-config:@ConfigurationProperties ${consumer.prefix}`, 0.95);
101
+ }
102
+ for (const field of propertiesByOwner.get(owner.id) ?? []) {
103
+ const fieldName = relaxedName(String(field.properties.name));
104
+ for (const match of matches) {
105
+ const key = String(match.properties.name);
106
+ const suffix = key === consumer.prefix ? '' : key.slice(prefix.length);
107
+ const firstSegment = suffix.split(/[.\[]/, 1)[0];
108
+ if (firstSegment.length === 0 || relaxedName(firstSegment) !== fieldName)
109
+ continue;
110
+ addBinding(field, match, `spring-config:@ConfigurationProperties field ${consumer.prefix}`, 0.95);
111
+ }
112
+ }
113
+ }
114
+ }
115
+ }
@@ -5,6 +5,20 @@ import { parseSourceSafe } from '../../../tree-sitter/safe-parse.js';
5
5
  import { splitCInclude } from './import-decomposer.js';
6
6
  import { computeCDeclarationArity, computeCCallArity } from './arity-metadata.js';
7
7
  import { markStaticName } from './static-linkage.js';
8
+ import { synthesizeCallableFlowCaptures, } from '../../utils/callable-flow-captures.js';
9
+ const C_CALLABLE_CAPTURE_OPTIONS = {
10
+ functionNodeTypes: new Set(['function_definition']),
11
+ callNodeTypes: new Set(['call_expression']),
12
+ parameterListNodeTypes: new Set(['parameter_list', 'argument_list']),
13
+ parameterNodeTypes: new Set(['parameter_declaration']),
14
+ bindingNodeTypes: new Set(['init_declarator']),
15
+ assignmentNodeTypes: new Set(['assignment_expression']),
16
+ identifierNodeTypes: new Set(['identifier', 'field_identifier', 'type_identifier']),
17
+ callableSignatureDeclarationNodeTypes: new Set(['declaration', 'parameter_declaration']),
18
+ emitCanonicalInvokeReference: true,
19
+ parameterPassingMode: (parameter) => containsNodeType(parameter, 'pointer_declarator') ? 'pointer' : 'value',
20
+ expectedSignature: (container, destination) => functionDeclaratorSignature(destination) ?? functionDeclaratorSignature(container),
21
+ };
8
22
  export function emitCScopeCaptures(sourceText, filePath, cachedTree) {
9
23
  let tree = cachedTree;
10
24
  if (tree === undefined) {
@@ -106,8 +120,50 @@ export function emitCScopeCaptures(sourceText, filePath, cachedTree) {
106
120
  }
107
121
  out.push(grouped);
108
122
  }
123
+ out.push(...synthesizeCallableFlowCaptures(tree.rootNode, C_CALLABLE_CAPTURE_OPTIONS));
109
124
  return out;
110
125
  }
126
+ function functionDeclaratorSignature(node) {
127
+ const declarator = findDescendantOfType(node, 'function_declarator');
128
+ const parameters = declarator?.childForFieldName('parameters');
129
+ if (parameters === null || parameters === undefined)
130
+ return undefined;
131
+ const parameterNodes = parameters.namedChildren.filter((child) => child !== null && child.type === 'parameter_declaration');
132
+ // tree-sitter-c materializes `...` as a NAMED `variadic_parameter` node —
133
+ // the anonymous-token checks never matched, so variadic signatures were
134
+ // emitted with a wrong fixed arity (#2522 review). Keep the token checks
135
+ // for grammar variants that expose `...` as an anonymous literal.
136
+ const hasEllipsis = parameters.children.some((child) => child.type === 'variadic_parameter' ||
137
+ child.type === '...' ||
138
+ (!child.isNamed && child.text === '...'));
139
+ const isVoidOnly = parameterNodes.length === 1 &&
140
+ parameterNodes[0].namedChildCount === 1 &&
141
+ parameterNodes[0].firstNamedChild?.text === 'void';
142
+ if (isVoidOnly)
143
+ return { parameterCount: 0, parameterTypes: [] };
144
+ const parameterTypes = parameterNodes.map((parameter) => parameter.childForFieldName('type')?.text ?? 'unknown');
145
+ if (hasEllipsis)
146
+ parameterTypes.push('...');
147
+ return {
148
+ ...(hasEllipsis ? {} : { parameterCount: parameterNodes.length }),
149
+ parameterTypes,
150
+ };
151
+ }
152
+ function containsNodeType(root, type) {
153
+ return findDescendantOfType(root, type) !== null;
154
+ }
155
+ function findDescendantOfType(root, type) {
156
+ const stack = [root];
157
+ while (stack.length > 0) {
158
+ const node = stack.pop();
159
+ if (node.type === type)
160
+ return node;
161
+ for (const child of node.namedChildren)
162
+ if (child !== null)
163
+ stack.push(child);
164
+ }
165
+ return null;
166
+ }
111
167
  /**
112
168
  * Check if a C function_definition or declaration has `static` storage class.
113
169
  * Walks direct children for a `storage_class_specifier` node with text `static`.
@@ -117,6 +117,23 @@ const C_SCOPE_QUERY = `
117
117
  declarator: (pointer_declarator
118
118
  declarator: (identifier) @declaration.name)) @declaration.variable
119
119
 
120
+ ;; Declarations — function-pointer variables (\`void (*fp)(int);\`), with and
121
+ ;; without initializer. Without these the file-scope pointer has no scope-tree
122
+ ;; binding, so callable-flow cells written in one function and read in another
123
+ ;; canonicalize to different keys and never join (#2522 review, H1).
124
+ (declaration
125
+ declarator: (function_declarator
126
+ declarator: (parenthesized_declarator
127
+ (pointer_declarator
128
+ declarator: (identifier) @declaration.name)))) @declaration.variable
129
+
130
+ (declaration
131
+ declarator: (init_declarator
132
+ declarator: (function_declarator
133
+ declarator: (parenthesized_declarator
134
+ (pointer_declarator
135
+ declarator: (identifier) @declaration.name))))) @declaration.variable
136
+
120
137
  ;; Declarations — macro definitions
121
138
  (preproc_def
122
139
  name: (identifier) @declaration.name) @declaration.macro
@@ -100,4 +100,10 @@ export const cScopeResolver = {
100
100
  const simple = def.qualifiedName?.split('.').pop() ?? def.qualifiedName ?? '';
101
101
  return isStaticName(def.filePath, simple);
102
102
  },
103
+ // Precise linkage-only variant used to associate a visible prototype with
104
+ // its implementation during callable-value actual-to-formal propagation.
105
+ hasFileLocalCallableLinkage: (def) => {
106
+ const simple = def.qualifiedName?.split('.').pop() ?? def.qualifiedName ?? '';
107
+ return isStaticName(def.filePath, simple);
108
+ },
103
109
  };
@@ -44,6 +44,20 @@ export function emitCobolScopeCaptures(sourceText, _filePath, _cachedTree) {
44
44
  // Run the regex tagger on the preprocessed source
45
45
  const extracted = extractCobolSymbolsWithRegex(cleaned, _filePath);
46
46
  const out = [];
47
+ const procedurePointers = new Set(extracted.dataItems
48
+ .filter((item) => /(?:PROCEDURE|FUNCTION)-POINTER/.test(item.usage?.toUpperCase() ?? ''))
49
+ .map((item) => item.name.toUpperCase()));
50
+ // Fallback for declarations the clause parser missed. Scan CLEANED lines —
51
+ // on raw fixed-format sources the sequence number (cols 1-6) satisfied
52
+ // `\d+` and the LEVEL NUMBER got captured as the name, so the set never
53
+ // contained the real pointer name and the whole feature no-op'd (#2522
54
+ // review, H3). COBOL data names must contain a letter, so `[A-Z]` first
55
+ // rejects level numbers.
56
+ for (const line of cleaned.split(/\r?\n/)) {
57
+ const declaration = line.match(/^\s*\d{1,2}\s+([A-Z][A-Z0-9-]*).*\b(?:PROCEDURE|FUNCTION)-POINTER\b/i);
58
+ if (declaration !== null)
59
+ procedurePointers.add(declaration[1].toUpperCase());
60
+ }
47
61
  // ── 1. PROGRAM-ID → @scope.module ───────────────────────────────────
48
62
  // The primary program name (first PROGRAM-ID encountered)
49
63
  if (extracted.programName) {
@@ -208,6 +222,85 @@ export function emitCobolScopeCaptures(sourceText, _filePath, _cachedTree) {
208
222
  if (m !== null)
209
223
  out.push(m);
210
224
  }
225
+ // ── 9. Procedure-pointer value flow ────────────────────────────────
226
+ // ISO COBOL exposes callable values through USAGE PROCEDURE-POINTER,
227
+ // SET ... TO ENTRY, and dynamic CALL data-items. The regex provider emits
228
+ // the same normalized facts as AST-backed providers so shared ingestion
229
+ // remains language-agnostic.
230
+ for (const program of extracted.programs) {
231
+ for (let index = 0; index < (program.procedureUsing?.length ?? 0); index++) {
232
+ const parameter = program.procedureUsing[index];
233
+ const ownerRange = rangeOf(program.startLine, 0, program.endLine, 0);
234
+ out.push({
235
+ '@callable-flow.formal': capture('@callable-flow.formal', ownerRange, program.name),
236
+ '@callable-flow.owner': capture('@callable-flow.owner', ownerRange, program.name),
237
+ '@callable-flow.binding': capture('@callable-flow.binding', rangeOf(program.startLine, 0, program.startLine, parameter.length), parameter),
238
+ '@callable-flow.parameter-index': capture('@callable-flow.parameter-index', ownerRange, String(index)),
239
+ '@callable-flow.passing-mode': capture('@callable-flow.passing-mode', ownerRange, 'reference'),
240
+ });
241
+ }
242
+ }
243
+ for (let index = 0; index < lines.length; index++) {
244
+ const line = lines[index];
245
+ // Comment lines must not seed flows — a commented-out SET produced a
246
+ // live seed and a false CALLS edge from dead code (#2522 review, M1).
247
+ // Fixed format marks comments with '*'/'/' in indicator column 7; free
248
+ // format uses '*>' (also valid inline, so strip the tail).
249
+ if (line[6] === '*' || line[6] === '/')
250
+ continue;
251
+ const code = line.split('*>')[0];
252
+ const lineNumber = index + 1;
253
+ const lineRange = rangeOf(lineNumber, 0, lineNumber, endColFrom(line));
254
+ const entry = code.match(/\bSET\s+([A-Z0-9][A-Z0-9-]*)\s+TO\s+ENTRY\s+(?:"([^"]+)"|'([^']+)')/i);
255
+ if (entry !== null) {
256
+ const destination = entry[1];
257
+ const target = entry[2] ?? entry[3];
258
+ if (procedurePointers.has(destination.toUpperCase())) {
259
+ out.push({
260
+ '@callable-flow.seed': capture('@callable-flow.seed', lineRange, line),
261
+ '@callable-flow.destination': capture('@callable-flow.destination', lineRange, destination),
262
+ '@callable-flow.target': capture('@callable-flow.target', lineRange, target),
263
+ '@callable-flow.target-name': capture('@callable-flow.target-name', lineRange, target),
264
+ });
265
+ }
266
+ continue;
267
+ }
268
+ const copy = code.match(/\bSET\s+([A-Z0-9][A-Z0-9-]*)\s+TO\s+([A-Z0-9][A-Z0-9-]*)\b/i);
269
+ if (copy !== null &&
270
+ procedurePointers.has(copy[1].toUpperCase()) &&
271
+ procedurePointers.has(copy[2].toUpperCase())) {
272
+ out.push({
273
+ '@callable-flow.copy': capture('@callable-flow.copy', lineRange, line),
274
+ '@callable-flow.destination': capture('@callable-flow.destination', lineRange, copy[1]),
275
+ '@callable-flow.source': capture('@callable-flow.source', lineRange, copy[2]),
276
+ });
277
+ }
278
+ }
279
+ for (const call of extracted.calls) {
280
+ const line = lines[call.line - 1] ?? '';
281
+ const lineRange = rangeOf(call.line, 0, call.line, endColFrom(line));
282
+ for (let index = 0; index < (call.parameters?.length ?? 0); index++) {
283
+ const parameter = call.parameters[index];
284
+ out.push({
285
+ '@callable-flow.argument': capture('@callable-flow.argument', lineRange, line),
286
+ '@callable-flow.source': capture('@callable-flow.source', lineRange, parameter),
287
+ '@callable-flow.parameter-index': capture('@callable-flow.parameter-index', lineRange, String(index)),
288
+ ...(!call.isQuoted && procedurePointers.has(call.target.toUpperCase())
289
+ ? {}
290
+ : {
291
+ '@callable-flow.direct-callee-name': capture('@callable-flow.direct-callee-name', lineRange, call.target),
292
+ }),
293
+ });
294
+ }
295
+ if (!call.isQuoted && procedurePointers.has(call.target.toUpperCase())) {
296
+ out.push({
297
+ '@callable-flow.invoke': capture('@callable-flow.invoke', lineRange, line),
298
+ '@callable-flow.callee': capture('@callable-flow.callee', lineRange, call.target),
299
+ '@callable-flow.invocation-kind': capture('@callable-flow.invocation-kind', lineRange, 'indirect'),
300
+ '@callable-flow.arity': capture('@callable-flow.arity', lineRange, String(call.parameters?.length ?? 0)),
301
+ });
302
+ }
303
+ }
211
304
  return out;
212
305
  }
213
306
  // ---------------------------------------------------------------------------
@@ -56,6 +56,13 @@ const cobolScopeResolver = {
56
56
  return 'compatible';
57
57
  return 'incompatible';
58
58
  },
59
+ // PROGRAM-ID declarations bridge to legacy Module graph nodes. COBOL's
60
+ // procedure-pointer ENTRY values therefore target Module defs, while every
61
+ // AST-backed provider keeps the shared callable-label default.
62
+ isCallableValueTarget: (def) => def.type === 'Module',
63
+ // Structural COBOL CALLS/IMPORTS remain owned by the established regex
64
+ // processor; this resolver contributes only procedure-pointer CALLS.
65
+ scopeResolutionEdgeMode: 'callable-flow-only',
59
66
  // No inheritance in COBOL — empty MRO map.
60
67
  buildMro: () => new Map(),
61
68
  // Everything lives under the PROGRAM-ID Module scope.