gitnexus 1.6.8-rc.9 → 1.6.8

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 (430) hide show
  1. package/README.md +3 -3
  2. package/dist/_shared/graph/types.d.ts +31 -1
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/_shared/language-detection.d.ts.map +1 -1
  5. package/dist/_shared/language-detection.js +11 -1
  6. package/dist/_shared/language-detection.js.map +1 -1
  7. package/dist/_shared/lbug/schema-constants.d.ts +1 -1
  8. package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
  9. package/dist/_shared/lbug/schema-constants.js +6 -0
  10. package/dist/_shared/lbug/schema-constants.js.map +1 -1
  11. package/dist/_shared/scope-resolution/parsed-file.d.ts +21 -0
  12. package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
  13. package/dist/_shared/scope-resolution/symbol-definition.d.ts +6 -0
  14. package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
  15. package/dist/cli/ai-context.d.ts +31 -1
  16. package/dist/cli/ai-context.js +18 -16
  17. package/dist/cli/analyze-config.js +11 -0
  18. package/dist/cli/analyze.d.ts +14 -0
  19. package/dist/cli/analyze.js +98 -0
  20. package/dist/cli/embedding-dims.d.ts +33 -0
  21. package/dist/cli/embedding-dims.js +39 -0
  22. package/dist/cli/eval-server.d.ts +8 -0
  23. package/dist/cli/eval-server.js +242 -2
  24. package/dist/cli/help-i18n.js +19 -0
  25. package/dist/cli/i18n/en.d.ts +15 -1
  26. package/dist/cli/i18n/en.js +15 -1
  27. package/dist/cli/i18n/resources.d.ts +29 -1
  28. package/dist/cli/i18n/zh-CN.d.ts +14 -0
  29. package/dist/cli/i18n/zh-CN.js +15 -1
  30. package/dist/cli/index.js +89 -1
  31. package/dist/cli/mcp.d.ts +6 -1
  32. package/dist/cli/mcp.js +26 -1
  33. package/dist/cli/optional-grammars.d.ts +6 -8
  34. package/dist/cli/optional-grammars.js +8 -11
  35. package/dist/cli/setup.d.ts +3 -1
  36. package/dist/cli/setup.js +67 -17
  37. package/dist/cli/skill-gen.js +2 -1
  38. package/dist/cli/tool.d.ts +19 -1
  39. package/dist/cli/tool.js +96 -3
  40. package/dist/core/embeddings/hf-env.d.ts +0 -66
  41. package/dist/core/embeddings/http-client.d.ts +7 -0
  42. package/dist/core/embeddings/http-client.js +5 -3
  43. package/dist/core/embeddings/server-mapping.d.ts +1 -1
  44. package/dist/core/embeddings/server-mapping.js +7 -3
  45. package/dist/core/graph/import-cycles.d.ts +10 -0
  46. package/dist/core/graph/import-cycles.js +103 -0
  47. package/dist/core/group/cross-impact.d.ts +2 -1
  48. package/dist/core/group/cross-impact.js +5 -1
  49. package/dist/core/group/extractors/grpc-patterns/proto.js +10 -6
  50. package/dist/core/group/extractors/http-patterns/kotlin.js +7 -7
  51. package/dist/core/group/extractors/http-route-extractor.d.ts +24 -0
  52. package/dist/core/group/extractors/http-route-extractor.js +22 -4
  53. package/dist/core/group/extractors/include-extractor.js +22 -13
  54. package/dist/core/group/sync.d.ts +27 -1
  55. package/dist/core/group/sync.js +0 -0
  56. package/dist/core/incremental/subgraph-extract.js +18 -1
  57. package/dist/core/ingestion/cfg/cfg-builder.d.ts +114 -0
  58. package/dist/core/ingestion/cfg/cfg-builder.js +196 -0
  59. package/dist/core/ingestion/cfg/collect.d.ts +51 -0
  60. package/dist/core/ingestion/cfg/collect.js +77 -0
  61. package/dist/core/ingestion/cfg/control-dependence.d.ts +58 -0
  62. package/dist/core/ingestion/cfg/control-dependence.js +182 -0
  63. package/dist/core/ingestion/cfg/control-flow-context.d.ts +106 -0
  64. package/dist/core/ingestion/cfg/control-flow-context.js +124 -0
  65. package/dist/core/ingestion/cfg/emit.d.ts +293 -0
  66. package/dist/core/ingestion/cfg/emit.js +646 -0
  67. package/dist/core/ingestion/cfg/post-dominators.d.ts +79 -0
  68. package/dist/core/ingestion/cfg/post-dominators.js +176 -0
  69. package/dist/core/ingestion/cfg/reaching-def-reason-codec.d.ts +106 -0
  70. package/dist/core/ingestion/cfg/reaching-def-reason-codec.js +133 -0
  71. package/dist/core/ingestion/cfg/reaching-defs-graph.d.ts +18 -0
  72. package/dist/core/ingestion/cfg/reaching-defs-graph.js +312 -0
  73. package/dist/core/ingestion/cfg/reaching-defs.d.ts +162 -0
  74. package/dist/core/ingestion/cfg/reaching-defs.js +785 -0
  75. package/dist/core/ingestion/cfg/synthetic-escape.d.ts +124 -0
  76. package/dist/core/ingestion/cfg/synthetic-escape.js +300 -0
  77. package/dist/core/ingestion/cfg/traversal-result.d.ts +20 -0
  78. package/dist/core/ingestion/cfg/traversal-result.js +2 -0
  79. package/dist/core/ingestion/cfg/types.d.ts +274 -0
  80. package/dist/core/ingestion/cfg/types.js +13 -0
  81. package/dist/core/ingestion/cfg/visitors/c-cpp-harvest.d.ts +111 -0
  82. package/dist/core/ingestion/cfg/visitors/c-cpp-harvest.js +541 -0
  83. package/dist/core/ingestion/cfg/visitors/c-cpp.d.ts +74 -0
  84. package/dist/core/ingestion/cfg/visitors/c-cpp.js +584 -0
  85. package/dist/core/ingestion/cfg/visitors/call-site-harvest.d.ts +195 -0
  86. package/dist/core/ingestion/cfg/visitors/call-site-harvest.js +350 -0
  87. package/dist/core/ingestion/cfg/visitors/csharp-harvest.d.ts +124 -0
  88. package/dist/core/ingestion/cfg/visitors/csharp-harvest.js +589 -0
  89. package/dist/core/ingestion/cfg/visitors/csharp.d.ts +87 -0
  90. package/dist/core/ingestion/cfg/visitors/csharp.js +867 -0
  91. package/dist/core/ingestion/cfg/visitors/dart-harvest.d.ts +278 -0
  92. package/dist/core/ingestion/cfg/visitors/dart-harvest.js +870 -0
  93. package/dist/core/ingestion/cfg/visitors/dart.d.ts +119 -0
  94. package/dist/core/ingestion/cfg/visitors/dart.js +836 -0
  95. package/dist/core/ingestion/cfg/visitors/go-harvest.d.ts +160 -0
  96. package/dist/core/ingestion/cfg/visitors/go-harvest.js +621 -0
  97. package/dist/core/ingestion/cfg/visitors/go.d.ts +108 -0
  98. package/dist/core/ingestion/cfg/visitors/go.js +638 -0
  99. package/dist/core/ingestion/cfg/visitors/java-harvest.d.ts +108 -0
  100. package/dist/core/ingestion/cfg/visitors/java-harvest.js +513 -0
  101. package/dist/core/ingestion/cfg/visitors/java.d.ts +101 -0
  102. package/dist/core/ingestion/cfg/visitors/java.js +812 -0
  103. package/dist/core/ingestion/cfg/visitors/kotlin-harvest.d.ts +253 -0
  104. package/dist/core/ingestion/cfg/visitors/kotlin-harvest.js +719 -0
  105. package/dist/core/ingestion/cfg/visitors/kotlin.d.ts +121 -0
  106. package/dist/core/ingestion/cfg/visitors/kotlin.js +809 -0
  107. package/dist/core/ingestion/cfg/visitors/php-harvest.d.ts +172 -0
  108. package/dist/core/ingestion/cfg/visitors/php-harvest.js +626 -0
  109. package/dist/core/ingestion/cfg/visitors/php.d.ts +96 -0
  110. package/dist/core/ingestion/cfg/visitors/php.js +721 -0
  111. package/dist/core/ingestion/cfg/visitors/python-harvest.d.ts +212 -0
  112. package/dist/core/ingestion/cfg/visitors/python-harvest.js +739 -0
  113. package/dist/core/ingestion/cfg/visitors/python.d.ts +103 -0
  114. package/dist/core/ingestion/cfg/visitors/python.js +558 -0
  115. package/dist/core/ingestion/cfg/visitors/ruby-harvest.d.ts +223 -0
  116. package/dist/core/ingestion/cfg/visitors/ruby-harvest.js +587 -0
  117. package/dist/core/ingestion/cfg/visitors/ruby.d.ts +112 -0
  118. package/dist/core/ingestion/cfg/visitors/ruby.js +756 -0
  119. package/dist/core/ingestion/cfg/visitors/rust-harvest.d.ts +324 -0
  120. package/dist/core/ingestion/cfg/visitors/rust-harvest.js +873 -0
  121. package/dist/core/ingestion/cfg/visitors/rust.d.ts +95 -0
  122. package/dist/core/ingestion/cfg/visitors/rust.js +558 -0
  123. package/dist/core/ingestion/cfg/visitors/scope-tree-harvest.d.ts +87 -0
  124. package/dist/core/ingestion/cfg/visitors/scope-tree-harvest.js +116 -0
  125. package/dist/core/ingestion/cfg/visitors/swift-harvest.d.ts +255 -0
  126. package/dist/core/ingestion/cfg/visitors/swift-harvest.js +679 -0
  127. package/dist/core/ingestion/cfg/visitors/swift.d.ts +116 -0
  128. package/dist/core/ingestion/cfg/visitors/swift.js +787 -0
  129. package/dist/core/ingestion/cfg/visitors/typescript-harvest.d.ts +149 -0
  130. package/dist/core/ingestion/cfg/visitors/typescript-harvest.js +1056 -0
  131. package/dist/core/ingestion/cfg/visitors/typescript.d.ts +66 -0
  132. package/dist/core/ingestion/cfg/visitors/typescript.js +583 -0
  133. package/dist/core/ingestion/import-resolvers/utils.js +2 -0
  134. package/dist/core/ingestion/language-provider.d.ts +11 -0
  135. package/dist/core/ingestion/languages/c-cpp.js +6 -1
  136. package/dist/core/ingestion/languages/cobol.js +4 -0
  137. package/dist/core/ingestion/languages/cpp/arity-metadata.js +41 -2
  138. package/dist/core/ingestion/languages/cpp/captures.js +50 -1
  139. package/dist/core/ingestion/languages/cpp/conversion-rank.d.ts +2 -0
  140. package/dist/core/ingestion/languages/cpp/conversion-rank.js +89 -0
  141. package/dist/core/ingestion/languages/cpp/header-scan.d.ts +1 -1
  142. package/dist/core/ingestion/languages/cpp/header-scan.js +2 -2
  143. package/dist/core/ingestion/languages/cpp/inline-namespaces.js +7 -2
  144. package/dist/core/ingestion/languages/cpp/member-lookup.js +2 -1
  145. package/dist/core/ingestion/languages/cpp/query.js +23 -0
  146. package/dist/core/ingestion/languages/cpp/scope-resolver.js +2 -1
  147. package/dist/core/ingestion/languages/csharp.js +2 -0
  148. package/dist/core/ingestion/languages/dart.js +2 -0
  149. package/dist/core/ingestion/languages/go.js +2 -0
  150. package/dist/core/ingestion/languages/java.js +3 -0
  151. package/dist/core/ingestion/languages/kotlin/query.js +3 -2
  152. package/dist/core/ingestion/languages/kotlin.js +3 -0
  153. package/dist/core/ingestion/languages/php.js +2 -0
  154. package/dist/core/ingestion/languages/python.js +2 -0
  155. package/dist/core/ingestion/languages/ruby.js +2 -0
  156. package/dist/core/ingestion/languages/rust.js +2 -0
  157. package/dist/core/ingestion/languages/swift.js +2 -0
  158. package/dist/core/ingestion/languages/typescript.js +5 -0
  159. package/dist/core/ingestion/languages/vue.js +6 -0
  160. package/dist/core/ingestion/method-extractors/configs/c-cpp.js +6 -13
  161. package/dist/core/ingestion/method-extractors/generic.js +1 -0
  162. package/dist/core/ingestion/method-types.d.ts +2 -0
  163. package/dist/core/ingestion/model/symbol-table.d.ts +1 -0
  164. package/dist/core/ingestion/model/symbol-table.js +1 -0
  165. package/dist/core/ingestion/mro-processor.js +109 -0
  166. package/dist/core/ingestion/parsing-processor.js +23 -0
  167. package/dist/core/ingestion/pipeline-phases/call-summaries.d.ts +26 -0
  168. package/dist/core/ingestion/pipeline-phases/call-summaries.js +46 -0
  169. package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
  170. package/dist/core/ingestion/pipeline-phases/index.js +2 -0
  171. package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +0 -21
  172. package/dist/core/ingestion/pipeline-phases/parse-impl.js +18 -1
  173. package/dist/core/ingestion/pipeline-phases/routes.d.ts +10 -0
  174. package/dist/core/ingestion/pipeline-phases/routes.js +30 -1
  175. package/dist/core/ingestion/pipeline-phases/taint-summaries.d.ts +30 -0
  176. package/dist/core/ingestion/pipeline-phases/taint-summaries.js +81 -0
  177. package/dist/core/ingestion/pipeline.d.ts +92 -10
  178. package/dist/core/ingestion/pipeline.js +11 -2
  179. package/dist/core/ingestion/scope-extractor.js +12 -2
  180. package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +9 -0
  181. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +75 -0
  182. package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +67 -0
  183. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +12 -2
  184. package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +14 -2
  185. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +6 -1
  186. package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +13 -1
  187. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +9 -1
  188. package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +28 -2
  189. package/dist/core/ingestion/scope-resolution/passes/overload-narrowing.d.ts +4 -0
  190. package/dist/core/ingestion/scope-resolution/passes/overload-narrowing.js +9 -0
  191. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +6 -1
  192. package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +174 -40
  193. package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +24 -0
  194. package/dist/core/ingestion/scope-resolution/pipeline/phase.js +276 -190
  195. package/dist/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +43 -3
  196. package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +75 -0
  197. package/dist/core/ingestion/scope-resolution/pipeline/run.js +349 -1
  198. package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
  199. package/dist/core/ingestion/taint/call-summary-codec.d.ts +75 -0
  200. package/dist/core/ingestion/taint/call-summary-codec.js +128 -0
  201. package/dist/core/ingestion/taint/call-summary-emit.d.ts +43 -0
  202. package/dist/core/ingestion/taint/call-summary-emit.js +70 -0
  203. package/dist/core/ingestion/taint/call-summary-harvest.d.ts +77 -0
  204. package/dist/core/ingestion/taint/call-summary-harvest.js +179 -0
  205. package/dist/core/ingestion/taint/call-summary-model.d.ts +47 -0
  206. package/dist/core/ingestion/taint/call-summary-model.js +25 -0
  207. package/dist/core/ingestion/taint/emit.d.ts +125 -0
  208. package/dist/core/ingestion/taint/emit.js +208 -0
  209. package/dist/core/ingestion/taint/interproc-emit.d.ts +50 -0
  210. package/dist/core/ingestion/taint/interproc-emit.js +88 -0
  211. package/dist/core/ingestion/taint/interproc-solver.d.ts +110 -0
  212. package/dist/core/ingestion/taint/interproc-solver.js +312 -0
  213. package/dist/core/ingestion/taint/match.d.ts +153 -0
  214. package/dist/core/ingestion/taint/match.js +278 -0
  215. package/dist/core/ingestion/taint/path-codec.d.ts +134 -0
  216. package/dist/core/ingestion/taint/path-codec.js +190 -0
  217. package/dist/core/ingestion/taint/propagate.d.ts +216 -0
  218. package/dist/core/ingestion/taint/propagate.js +659 -0
  219. package/dist/core/ingestion/taint/site-safety.d.ts +29 -0
  220. package/dist/core/ingestion/taint/site-safety.js +98 -0
  221. package/dist/core/ingestion/taint/source-sink-config.d.ts +107 -23
  222. package/dist/core/ingestion/taint/source-sink-config.js +35 -12
  223. package/dist/core/ingestion/taint/source-sink-registry.d.ts +6 -4
  224. package/dist/core/ingestion/taint/source-sink-registry.js +6 -4
  225. package/dist/core/ingestion/taint/summary-harvest-driver.d.ts +80 -0
  226. package/dist/core/ingestion/taint/summary-harvest-driver.js +179 -0
  227. package/dist/core/ingestion/taint/summary-harvest.d.ts +89 -0
  228. package/dist/core/ingestion/taint/summary-harvest.js +537 -0
  229. package/dist/core/ingestion/taint/summary-model.d.ts +200 -0
  230. package/dist/core/ingestion/taint/summary-model.js +86 -0
  231. package/dist/core/ingestion/taint/typescript-model.d.ts +38 -0
  232. package/dist/core/ingestion/taint/typescript-model.js +102 -0
  233. package/dist/core/ingestion/type-extractors/c-cpp.js +21 -0
  234. package/dist/core/ingestion/utils/env.d.ts +7 -0
  235. package/dist/core/ingestion/utils/env.js +12 -0
  236. package/dist/core/ingestion/utils/method-props.js +1 -0
  237. package/dist/core/ingestion/workers/parse-worker.d.ts +13 -0
  238. package/dist/core/ingestion/workers/parse-worker.js +76 -17
  239. package/dist/core/ingestion/workers/worker-pool.d.ts +9 -40
  240. package/dist/core/ingestion/workers/worker-pool.js +15 -2
  241. package/dist/core/lbug/csv-generator.d.ts +51 -3
  242. package/dist/core/lbug/csv-generator.js +369 -255
  243. package/dist/core/lbug/lbug-adapter.d.ts +58 -18
  244. package/dist/core/lbug/lbug-adapter.js +346 -84
  245. package/dist/core/lbug/lbug-config.d.ts +19 -0
  246. package/dist/core/lbug/lbug-config.js +29 -0
  247. package/dist/core/lbug/pdg-emit-sink.d.ts +127 -0
  248. package/dist/core/lbug/pdg-emit-sink.js +358 -0
  249. package/dist/core/lbug/pool-adapter.d.ts +35 -0
  250. package/dist/core/lbug/pool-adapter.js +90 -1
  251. package/dist/core/lbug/rel-pair-routing.d.ts +54 -0
  252. package/dist/core/lbug/rel-pair-routing.js +140 -0
  253. package/dist/core/lbug/schema.d.ts +2 -2
  254. package/dist/core/lbug/schema.js +3 -0
  255. package/dist/core/logger.d.ts +0 -5
  256. package/dist/core/run-analyze.d.ts +96 -0
  257. package/dist/core/run-analyze.js +207 -3
  258. package/dist/core/tree-sitter/parser-loader.js +5 -4
  259. package/dist/core/tree-sitter/safe-parse.d.ts +0 -5
  260. package/dist/core/tree-sitter/vendored-grammars.d.ts +39 -0
  261. package/dist/core/tree-sitter/vendored-grammars.js +57 -0
  262. package/dist/core/wiki/generator.js +3 -1
  263. package/dist/core/wiki/graph-queries.d.ts +6 -0
  264. package/dist/core/wiki/graph-queries.js +9 -1
  265. package/dist/mcp/http-transport.d.ts +134 -0
  266. package/dist/mcp/http-transport.js +503 -0
  267. package/dist/mcp/local/local-backend.d.ts +110 -24
  268. package/dist/mcp/local/local-backend.js +1225 -19
  269. package/dist/mcp/local/pdg-impact.d.ts +384 -0
  270. package/dist/mcp/local/pdg-impact.js +1972 -0
  271. package/dist/mcp/resources.js +13 -1
  272. package/dist/mcp/tools.d.ts +12 -0
  273. package/dist/mcp/tools.js +214 -7
  274. package/dist/server/analyze-launch.d.ts +29 -0
  275. package/dist/server/analyze-launch.js +137 -0
  276. package/dist/server/analyze-upload.d.ts +33 -0
  277. package/dist/server/analyze-upload.js +123 -0
  278. package/dist/server/analyze-worker.d.ts +17 -1
  279. package/dist/server/api.d.ts +17 -0
  280. package/dist/server/api.js +132 -168
  281. package/dist/server/git-clone.d.ts +43 -2
  282. package/dist/server/git-clone.js +211 -16
  283. package/dist/server/mcp-http.d.ts +5 -6
  284. package/dist/server/mcp-http.js +9 -82
  285. package/dist/server/middleware.d.ts +40 -0
  286. package/dist/server/middleware.js +92 -0
  287. package/dist/server/private-ip.d.ts +1 -0
  288. package/dist/server/private-ip.js +15 -0
  289. package/dist/server/upload-ingest.d.ts +56 -0
  290. package/dist/server/upload-ingest.js +276 -0
  291. package/dist/server/upload-paths.d.ts +37 -0
  292. package/dist/server/upload-paths.js +57 -0
  293. package/dist/server/upload-sweep.d.ts +20 -0
  294. package/dist/server/upload-sweep.js +57 -0
  295. package/dist/storage/git.js +5 -8
  296. package/dist/storage/parse-cache.d.ts +22 -1
  297. package/dist/storage/parse-cache.js +41 -10
  298. package/dist/storage/repo-manager.d.ts +121 -10
  299. package/dist/storage/repo-manager.js +43 -5
  300. package/dist/types/pipeline.d.ts +9 -0
  301. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +110 -10
  302. package/hooks/claude/gitnexus-hook.cjs +110 -13
  303. package/hooks/claude/hook-db-lock-probe.cjs +513 -26
  304. package/package.json +8 -2
  305. package/scripts/assert-publish-grammar-coverage.cjs +31 -0
  306. package/scripts/build-tree-sitter-grammars.cjs +16 -10
  307. package/scripts/cross-platform-tests.ts +1 -0
  308. package/skills/gitnexus-debugging.md +16 -4
  309. package/skills/gitnexus-exploring.md +3 -3
  310. package/skills/gitnexus-guide.md +33 -0
  311. package/skills/gitnexus-pdg-query.md +89 -0
  312. package/skills/gitnexus-refactoring.md +1 -1
  313. package/skills/gitnexus-taint-analysis.md +178 -0
  314. package/vendor/tree-sitter-c/package.json +1 -1
  315. package/vendor/tree-sitter-dart/package.json +1 -1
  316. package/vendor/tree-sitter-kotlin/package.json +1 -1
  317. package/vendor/tree-sitter-proto/package.json +1 -1
  318. package/vendor/tree-sitter-swift/package.json +1 -1
  319. package/web/assets/{agent-CKPMqImC.js → agent-D3Xd7zZE.js} +123 -123
  320. package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +1 -0
  321. package/web/assets/architectureDiagram-UL44E2DR-ChH9xW-N.js +36 -0
  322. package/web/assets/{blockDiagram-7IZFK4PR-B4niSLvR.js → blockDiagram-7IZFK4PR-BkWhpzWB.js} +1 -1
  323. package/web/assets/{c4Diagram-Y2BXMSZH-DIzEXalR.js → c4Diagram-Y2BXMSZH-DtBvpzWD.js} +1 -1
  324. package/web/assets/{chunk-3SSMPTDK-BzGeeheI.js → chunk-3SSMPTDK-B4_etUhr.js} +2 -2
  325. package/web/assets/{chunk-5IMINLNL-CnTLsXIV.js → chunk-5IMINLNL-DOdTeQri.js} +1 -1
  326. package/web/assets/{chunk-5VCL7Z4A-w1BCx98Z.js → chunk-5VCL7Z4A-CQ-2dYWj.js} +1 -1
  327. package/web/assets/chunk-6764PJDD-DpIS7hxD.js +1 -0
  328. package/web/assets/{chunk-67TQ5CYL-CChC2cAv.js → chunk-67TQ5CYL-4sNPJU1q.js} +3 -3
  329. package/web/assets/{chunk-7W6UQGC5-CgFyfZ6k.js → chunk-7W6UQGC5-KyEG0HQg.js} +1 -1
  330. package/web/assets/{chunk-AZZRMDJM-5E9ARdDQ.js → chunk-AZZRMDJM-y-xJBuMz.js} +1 -1
  331. package/web/assets/{chunk-INKRHTLW-ELpfuk9h.js → chunk-INKRHTLW-Nu4ri9P-.js} +1 -1
  332. package/web/assets/{chunk-JQRUD6KW-Dcq_Qnyy.js → chunk-JQRUD6KW-Dbva2Z17.js} +1 -1
  333. package/web/assets/{chunk-KGFNY3KK-W-VR57xb.js → chunk-KGFNY3KK-JGMJvKCK.js} +1 -1
  334. package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +161 -0
  335. package/web/assets/{chunk-KNLZD3CH-BuZBOcso.js → chunk-KNLZD3CH-BGlP6X9R.js} +1 -1
  336. package/web/assets/{chunk-KRXBNO2N-DH2NPM7I.js → chunk-KRXBNO2N-BW5o0KUN.js} +1 -1
  337. package/web/assets/{chunk-LCXTWHL2-Dfmux4m1.js → chunk-LCXTWHL2-zoomRtWX.js} +1 -1
  338. package/web/assets/{chunk-LII3EMHJ-3X33tCpU.js → chunk-LII3EMHJ-D-jm-dLa.js} +1 -1
  339. package/web/assets/{chunk-QA3QBVWF-D5Ha3GgB.js → chunk-QA3QBVWF-BgRW3SXd.js} +1 -1
  340. package/web/assets/{chunk-RG4AUYOV-CAkzcoRj.js → chunk-RG4AUYOV-DD0B2N2B.js} +1 -1
  341. package/web/assets/{chunk-T2UQINTJ-kGYG7ppP.js → chunk-T2UQINTJ-DSBqkzH7.js} +1 -1
  342. package/web/assets/chunk-T5OCTHI4-DdZvN-9i.js +1 -0
  343. package/web/assets/{chunk-UY5QBCOK-Du-c56gs.js → chunk-UY5QBCOK-DyF0vyGd.js} +1 -1
  344. package/web/assets/{chunk-W44A43WB-lrCpuupA.js → chunk-W44A43WB-JqMLIpR0.js} +1 -1
  345. package/web/assets/{chunk-ZXARS5L4-CSZRiyOf.js → chunk-ZXARS5L4-CxN8oiwI.js} +1 -1
  346. package/web/assets/classDiagram-KGZ6W3CR-DJm9BgF-.js +1 -0
  347. package/web/assets/classDiagram-v2-72OJOZXJ-DJm9BgF-.js +1 -0
  348. package/web/assets/{context-builder-_HS0v2ma.js → context-builder-BHiFUA8O.js} +10 -2
  349. package/web/assets/{cose-bilkent-UX7MHV2Q-BHv2bbtl.js → cose-bilkent-UX7MHV2Q-D71wNYRJ.js} +1 -1
  350. package/web/assets/dagre-ND4H6XIP-BIkxmhcu.js +4 -0
  351. package/web/assets/diagram-3NCE3AQN-BTa6iH0T.js +43 -0
  352. package/web/assets/diagram-GF46GFSD-DZDV0vBj.js +24 -0
  353. package/web/assets/{diagram-HNR7UZ2L-fUWreZzx.js → diagram-HNR7UZ2L-DFCfd5LI.js} +2 -2
  354. package/web/assets/diagram-QXG6HAR7-BzM--Jj0.js +24 -0
  355. package/web/assets/diagram-WEQXMOUZ-DFFwz0k4.js +10 -0
  356. package/web/assets/{erDiagram-L5TCEMPS-QN2eEP1e.js → erDiagram-L5TCEMPS-CfHMJJqo.js} +1 -1
  357. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +1 -0
  358. package/web/assets/{flowDiagram-H6V6AXG4-CXbXImlN.js → flowDiagram-H6V6AXG4-Be805QiJ.js} +3 -3
  359. package/web/assets/{ganttDiagram-JCBTUEKG-BHQssTz6.js → ganttDiagram-JCBTUEKG-D3iL2Aet.js} +1 -1
  360. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +1 -0
  361. package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +106 -0
  362. package/web/assets/index-BvYev1UJ.js +635 -0
  363. package/web/assets/index-_lgn7hs5.css +2 -0
  364. package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +1 -0
  365. package/web/assets/infoDiagram-3YFTVSEB-Y7BKSoke.js +2 -0
  366. package/web/assets/{ishikawaDiagram-BNXS4ZKH-6LKOvBfp.js → ishikawaDiagram-BNXS4ZKH-CT4SHFuI.js} +1 -1
  367. package/web/assets/{journeyDiagram-M6C3CM3L-DNPYCpvq.js → journeyDiagram-M6C3CM3L-CvArszLo.js} +1 -1
  368. package/web/assets/{kanban-definition-75IXJCU3-DgDi9oJT.js → kanban-definition-75IXJCU3-C6yDxr7N.js} +3 -3
  369. package/web/assets/{katex-K3KEBU37-CrVLz8l7.js → katex-K3KEBU37-CTc5BslQ.js} +1 -1
  370. package/web/assets/{mindmap-definition-2TDM6QVE-CwR5sBB-.js → mindmap-definition-2TDM6QVE-BOc2WEne.js} +1 -1
  371. package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +1 -0
  372. package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +1 -0
  373. package/web/assets/{pieDiagram-CU6KROY3-By8g6f6B.js → pieDiagram-CU6KROY3-Cvc0f_Pd.js} +1 -1
  374. package/web/assets/{quadrantDiagram-VICAPDV7-bAm6Hi_5.js → quadrantDiagram-VICAPDV7-yXSZ2lLz.js} +1 -1
  375. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +1 -0
  376. package/web/assets/{requirementDiagram-JXO7QTGE-7oDcJ1_J.js → requirementDiagram-JXO7QTGE-BRcZvHs4.js} +1 -1
  377. package/web/assets/{sankeyDiagram-URQDO5SZ-LFJz53u5.js → sankeyDiagram-URQDO5SZ-1qEjlFIB.js} +1 -1
  378. package/web/assets/{sequenceDiagram-VS2MUI6T-FySeKCUy.js → sequenceDiagram-VS2MUI6T-PcSCuvrB.js} +3 -3
  379. package/web/assets/stateDiagram-7D4R322I-D6qYSV1E.js +1 -0
  380. package/web/assets/stateDiagram-v2-36443NZ5-Bg-ImOSX.js +1 -0
  381. package/web/assets/{timeline-definition-O6YCAMPW-Ds2CnVZK.js → timeline-definition-O6YCAMPW-QWkh01xw.js} +1 -1
  382. package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +1 -0
  383. package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +1 -0
  384. package/web/assets/{vennDiagram-MWXL3ELB-DUIEwXWp.js → vennDiagram-MWXL3ELB-ak4DfwuM.js} +3 -3
  385. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +1 -0
  386. package/web/assets/{wardleyDiagram-CUQ6CDDI-DEiFPQih.js → wardleyDiagram-CUQ6CDDI-CTzR4Loq.js} +1 -1
  387. package/web/assets/{xychartDiagram-N2JHSOCM-BUbayhST.js → xychartDiagram-N2JHSOCM-DA1BEaQz.js} +1 -1
  388. package/web/index.html +13 -15
  389. package/scripts/materialize-vendor-grammars.cjs +0 -97
  390. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BETj2x4g.js +0 -1
  391. package/web/assets/architectureDiagram-UL44E2DR-D1EXI0zA.js +0 -36
  392. package/web/assets/chunk-2T2R6R2M-n6s9JZqv.js +0 -4
  393. package/web/assets/chunk-2UTLFMKG-CMBB1TMN.js +0 -1
  394. package/web/assets/chunk-4R4BOZG6-mKhL59ul.js +0 -159
  395. package/web/assets/chunk-6764PJDD-ChwMM2z4.js +0 -1
  396. package/web/assets/chunk-7J6CGLKN-DT-b53FT.js +0 -10
  397. package/web/assets/chunk-C62D2QBJ-CDAWj26E.js +0 -1
  398. package/web/assets/chunk-CEXFNPSA-D68Tk6ls.js +0 -1
  399. package/web/assets/chunk-CilyBKbf.js +0 -1
  400. package/web/assets/chunk-J5EP6P6S-DxWW0yvu.js +0 -1
  401. package/web/assets/chunk-KGYTTC2M-C6PHeuay.js +0 -1
  402. package/web/assets/chunk-RERM46MO-DQNbXtfw.js +0 -1
  403. package/web/assets/chunk-RKZBBQEN-BmTPLSyv.js +0 -1
  404. package/web/assets/chunk-RLI5ZMPA-DExu2DOK.js +0 -1
  405. package/web/assets/chunk-T5OCTHI4--9wWpVws.js +0 -1
  406. package/web/assets/chunk-UP6H54XL-DsKdC6jC.js +0 -1
  407. package/web/assets/chunk-UXSXWOXI-DR81EqLr.js +0 -1
  408. package/web/assets/classDiagram-KGZ6W3CR-Bv93af_b.js +0 -1
  409. package/web/assets/classDiagram-v2-72OJOZXJ-CLfEqHUa.js +0 -1
  410. package/web/assets/dagre-ND4H6XIP-DsIr9MOv.js +0 -4
  411. package/web/assets/diagram-3NCE3AQN-BqAtKUpW.js +0 -43
  412. package/web/assets/diagram-GF46GFSD-CaBG6n6o.js +0 -24
  413. package/web/assets/diagram-QXG6HAR7-CZ-O3rcV.js +0 -24
  414. package/web/assets/diagram-WEQXMOUZ-P4lSL4GH.js +0 -10
  415. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-B3myHUst.js +0 -1
  416. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DF3rtf4A.js +0 -1
  417. package/web/assets/gitGraphDiagram-S2ZK5IYY-CCwVLT__.js +0 -106
  418. package/web/assets/index-BKWA-m7o.css +0 -2
  419. package/web/assets/index-CG6q8eTs.js +0 -626
  420. package/web/assets/info-J43DQDTF-KCYPFFUO-R4XV_akJ.js +0 -1
  421. package/web/assets/infoDiagram-3YFTVSEB-DmLICZx1.js +0 -2
  422. package/web/assets/packet-YPE3B663-LP52Z2RK-CgQPdNZa.js +0 -1
  423. package/web/assets/pie-LRSECV5Y-TCRJHUBD-BzWOwc_c.js +0 -1
  424. package/web/assets/radar-GUYGQ44K-RDLRG3WG-B7KG0FN7.js +0 -1
  425. package/web/assets/stateDiagram-7D4R322I-CB2nABwH.js +0 -1
  426. package/web/assets/stateDiagram-v2-36443NZ5-COBGd2RL.js +0 -1
  427. package/web/assets/treeView-BLDUP644-QA4HXRO3-CRSxEwLO.js +0 -1
  428. package/web/assets/treemap-LRROVOQU-LLAWBHMP-a0PfKoVn.js +0 -1
  429. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-BKQ6e5mC.js +0 -1
  430. /package/web/assets/{chunk-AQ6EADP3-CCFje6lL.js → chunk-AQ6EADP3-CZhslHi-.js} +0 -0
@@ -21,6 +21,7 @@ import { createVariableExtractor } from '../variable-extractors/generic.js';
21
21
  import { swiftVariableConfig } from '../variable-extractors/configs/swift.js';
22
22
  import { createCallExtractor } from '../call-extractors/generic.js';
23
23
  import { swiftCallConfig } from '../call-extractors/configs/swift.js';
24
+ import { createSwiftCfgVisitor } from '../cfg/visitors/swift.js';
24
25
  import { emitSwiftScopeCaptures, interpretSwiftImport, interpretSwiftTypeBinding, swiftBindingScopeFor, swiftImportOwningScope, swiftReceiverBinding, swiftMergeBindings, swiftArityCompatibility, } from './swift/index.js';
25
26
  /** Swift init/deinit declarations have special names and Constructor label. */
26
27
  const swiftExtractFunctionName = (node) => {
@@ -226,6 +227,7 @@ export const swiftProvider = defineLanguage({
226
227
  // ── Scope-based resolution hooks (RFC #909 Ring 3, issue #937). See
227
228
  // languages/swift/ for the implementations. ──────────────────────
228
229
  emitScopeCaptures: emitSwiftScopeCaptures,
230
+ cfgVisitor: createSwiftCfgVisitor(),
229
231
  interpretImport: interpretSwiftImport,
230
232
  interpretTypeBinding: interpretSwiftTypeBinding,
231
233
  bindingScopeFor: swiftBindingScopeFor,
@@ -9,6 +9,7 @@ import { SupportedLanguages } from '../../../_shared/index.js';
9
9
  import { defineLanguage } from '../language-provider.js';
10
10
  import { createClassExtractor } from '../class-extractors/generic.js';
11
11
  import { typescriptClassConfig, javascriptClassConfig, } from '../class-extractors/configs/typescript-javascript.js';
12
+ import { createTypeScriptCfgVisitor } from '../cfg/visitors/typescript.js';
12
13
  import { typeConfig as typescriptConfig } from '../type-extractors/typescript.js';
13
14
  import { tsExportChecker } from '../export-detection.js';
14
15
  import { createImportResolver } from '../import-resolvers/resolver-factory.js';
@@ -293,6 +294,8 @@ export const typescriptProvider = defineLanguage({
293
294
  // canonical capture vocabulary in ./typescript/query.ts
294
295
  // (TYPESCRIPT_SCOPE_QUERY constant).
295
296
  emitScopeCaptures: emitTsScopeCaptures,
297
+ // CFG/PDG substrate (#2081 M1) — runs in the worker on a --pdg run.
298
+ cfgVisitor: createTypeScriptCfgVisitor(),
296
299
  interpretImport: interpretTsImport,
297
300
  interpretTypeBinding: interpretTsTypeBinding,
298
301
  bindingScopeFor: tsBindingScopeFor,
@@ -352,6 +355,8 @@ export const javascriptProvider = defineLanguage({
352
355
  // JSDoc type bindings) live in ./javascript/captures.ts.
353
356
  // See ./javascript/index.ts for the full per-module rationale.
354
357
  emitScopeCaptures: emitJsScopeCaptures,
358
+ // CFG/PDG substrate (#2081 M1) — TS and JS share the same grammar family.
359
+ cfgVisitor: createTypeScriptCfgVisitor(),
355
360
  interpretImport: interpretJsImport,
356
361
  interpretTypeBinding: interpretJsTypeBinding,
357
362
  bindingScopeFor: jsBindingScopeFor,
@@ -27,6 +27,7 @@ import { createCallExtractor } from '../call-extractors/generic.js';
27
27
  import { typescriptCallConfig } from '../call-extractors/configs/typescript-javascript.js';
28
28
  import { interpretTsImport, interpretTsTypeBinding, tsBindingScopeFor, tsImportOwningScope, tsReceiverBinding, typescriptMergeBindings, typescriptArityCompatibility, resolveTsImportTarget, } from './typescript/index.js';
29
29
  import { emitVueScopeCaptures } from './vue/captures.js';
30
+ import { createTypeScriptCfgVisitor } from '../cfg/visitors/typescript.js';
30
31
  const VUE_SPECIFIC_BUILT_INS = [
31
32
  'ref',
32
33
  'reactive',
@@ -74,6 +75,11 @@ export const vueProvider = defineLanguage({
74
75
  variableExtractor: createVariableExtractor(typescriptVariableConfig),
75
76
  classExtractor: vueClassExtractor,
76
77
  builtInNames: VUE_BUILT_INS,
78
+ // Vue SFC <script> blocks are extracted and parsed with the TypeScript
79
+ // grammar (parse-worker GRAMMAR_BY_LANGUAGE[Vue] = TypeScript.typescript),
80
+ // so the TS CFG visitor builds CFGs for the script's functions verbatim —
81
+ // no Vue-specific visitor needed (#2195).
82
+ cfgVisitor: createTypeScriptCfgVisitor(),
77
83
  // Scope-resolution pipeline hooks (RFC #909 Ring 3)
78
84
  emitScopeCaptures: emitVueScopeCaptures,
79
85
  interpretImport: interpretTsImport,
@@ -33,18 +33,12 @@ function findFunctionDeclarator(node) {
33
33
  }
34
34
  return null;
35
35
  }
36
- /**
37
- * Detect `= delete` and `= default` special member function declarations.
38
- * These are not callable methods and should be suppressed from extraction.
39
- * tree-sitter-cpp ^0.23.4 emits `delete_method_clause` / `default_method_clause`
40
- * as named children of the function_definition node.
41
- */
42
- function isDeletedOrDefaulted(node) {
36
+ /** Detect a C++ special member clause by its tree-sitter node type. */
37
+ function hasSpecialMethodClause(node, clauseType) {
43
38
  for (let i = 0; i < node.namedChildCount; i++) {
44
39
  const child = node.namedChild(i);
45
- if (child?.type === 'delete_method_clause' || child?.type === 'default_method_clause') {
40
+ if (child?.type === clauseType)
46
41
  return true;
47
- }
48
42
  }
49
43
  return false;
50
44
  }
@@ -57,10 +51,6 @@ function extractCppMethodName(node) {
57
51
  const funcDecl = findFunctionDeclarator(node);
58
52
  if (!funcDecl)
59
53
  return undefined;
60
- // Suppress `= delete` and `= default` special members — these are not callable
61
- // methods and should not appear in HAS_METHOD edges.
62
- if (isDeletedOrDefaulted(node))
63
- return undefined;
64
54
  const nameNode = funcDecl.childForFieldName('declarator');
65
55
  if (!nameNode)
66
56
  return undefined;
@@ -360,6 +350,9 @@ export const cppMethodConfig = {
360
350
  }
361
351
  return false;
362
352
  },
353
+ isDeleted(node) {
354
+ return hasSpecialMethodClause(node, 'delete_method_clause');
355
+ },
363
356
  };
364
357
  // ---------------------------------------------------------------------------
365
358
  // C config (minimal — C has no classes/methods, only struct function pointers)
@@ -198,6 +198,7 @@ function buildMethod(node, ownerNode, context, config) {
198
198
  ...(config.isAsync?.(node) ? { isAsync: true } : {}),
199
199
  ...(config.isPartial?.(node) ? { isPartial: true } : {}),
200
200
  ...(config.isConst?.(node) ? { isConst: true } : {}),
201
+ ...(config.isDeleted?.(node) ? { isDeleted: true } : {}),
201
202
  annotations: config.extractAnnotations?.(node) ?? [],
202
203
  sourceFile: context.filePath,
203
204
  line: node.startPosition.row + 1,
@@ -27,6 +27,7 @@ export interface MethodInfo {
27
27
  isAsync?: boolean;
28
28
  isPartial?: boolean;
29
29
  isConst?: boolean;
30
+ isDeleted?: boolean;
30
31
  annotations: string[];
31
32
  sourceFile: string;
32
33
  line: number;
@@ -74,6 +75,7 @@ export interface MethodExtractionConfig {
74
75
  isAsync?: (node: SyntaxNode) => boolean;
75
76
  isPartial?: (node: SyntaxNode) => boolean;
76
77
  isConst?: (node: SyntaxNode) => boolean;
78
+ isDeleted?: (node: SyntaxNode) => boolean;
77
79
  /** Owner node types where member functions are effectively static (e.g.
78
80
  * Ruby singleton_class, Kotlin companion_object / object_declaration).
79
81
  * When the ownerNode matches one of these types, isStatic is forced true. */
@@ -102,6 +102,7 @@ export interface AddMetadata {
102
102
  templateArguments?: string[];
103
103
  ownerId?: string;
104
104
  qualifiedName?: string;
105
+ isDeleted?: boolean;
105
106
  }
106
107
  /**
107
108
  * Pure read-only view over the file and callable indexes. Does NOT
@@ -136,6 +136,7 @@ export const createSymbolTable = () => {
136
136
  ? { templateArguments: metadata.templateArguments }
137
137
  : {}),
138
138
  ...(metadata?.ownerId !== undefined ? { ownerId: metadata.ownerId } : {}),
139
+ ...(metadata?.isDeleted === true ? { isDeleted: true } : {}),
139
140
  };
140
141
  // A. File Index — unconditional.
141
142
  if (!fileIndex.has(filePath)) {
@@ -74,6 +74,9 @@ function buildAdjacency(graph) {
74
74
  }
75
75
  return { parentMap, methodMap, parentEdgeType };
76
76
  }
77
+ /** Confidence for a single-ancestor override edge (a subclass overriding one parent
78
+ * method via class inheritance) — same tier as MRO-ordered resolution. */
79
+ const SINGLE_ANCESTOR_OVERRIDE_CONFIDENCE = 0.9;
77
80
  /** Resolve by MRO order — first ancestor in linearized order wins. */
78
81
  function resolveByMroOrder(methodName, defs, mroOrder, reasonPrefix) {
79
82
  for (const ancestorId of mroOrder) {
@@ -266,6 +269,112 @@ export function computeMRO(graph) {
266
269
  ambiguities,
267
270
  });
268
271
  }
272
+ // ── Single-ancestor override detection ──────────────────────────────────
273
+ // The collision loop above only emits when a method is defined in 2+ ancestors
274
+ // (defs.length < 2 is skipped). A subclass overriding a single parent method via
275
+ // class inheritance is the common case. Applicability is derived automatically from
276
+ // the language's existing MRO strategy — no separate per-language flag: every
277
+ // strategy resolves overrides by inheritance order EXCEPT `qualified-syntax` (Rust),
278
+ // where a same-named method is a trait implementation (METHOD_IMPLEMENTS), not an
279
+ // override. The EXTENDS-only walk below reinforces this structurally.
280
+ const emittedOverrideEdgeIds = new Set();
281
+ // Follow only EXTENDS (class-inheritance) parents and skip Interface/Trait ancestors:
282
+ // satisfying an interface/trait default method is a METHOD_IMPLEMENTS relationship
283
+ // (handled by emitMethodImplementsEdges), not an override. This also structurally
284
+ // excludes languages without class inheritance (e.g. Rust traits use IMPLEMENTS).
285
+ const extendsParentsOf = (nodeId) => (parentMap.get(nodeId) ?? []).filter((pid) => {
286
+ if (parentEdgeType.get(nodeId)?.get(pid) !== 'EXTENDS')
287
+ return false;
288
+ const pn = graph.getNode(pid);
289
+ return !!pn && pn.label !== 'Interface' && pn.label !== 'Trait';
290
+ });
291
+ for (const classId of parentMap.keys()) {
292
+ const classNode = graph.getNode(classId);
293
+ const language = classNode?.properties.language;
294
+ if (!language)
295
+ continue;
296
+ // Language-aware gate, reusing the MRO model we already maintain (not a new flag).
297
+ if (getProvider(language).mroStrategy === 'qualified-syntax')
298
+ continue;
299
+ const ownMethods = methodMap.get(classId) ?? [];
300
+ const extendsParents = extendsParentsOf(classId);
301
+ if (extendsParents.length === 0 || ownMethods.length === 0)
302
+ continue;
303
+ const orderedAncestorMethods = [];
304
+ {
305
+ const visited = new Set();
306
+ const queue = [...extendsParents];
307
+ while (queue.length > 0) {
308
+ const ancestorId = queue.shift();
309
+ if (visited.has(ancestorId))
310
+ continue;
311
+ visited.add(ancestorId);
312
+ const ancestorName = graph.getNode(ancestorId)?.properties.name;
313
+ const methodsByName = new Map();
314
+ for (const mid of methodMap.get(ancestorId) ?? []) {
315
+ const mn = graph.getNode(mid);
316
+ if (!mn || mn.label === 'Property' || typeof mn.properties.name !== 'string')
317
+ continue;
318
+ const entry = {
319
+ methodId: mid,
320
+ paramTypes: mn.properties.parameterTypes ?? [],
321
+ paramCount: mn.properties.parameterCount,
322
+ };
323
+ const bucket = methodsByName.get(mn.properties.name);
324
+ if (bucket)
325
+ bucket.push(entry);
326
+ else
327
+ methodsByName.set(mn.properties.name, [entry]);
328
+ }
329
+ orderedAncestorMethods.push({
330
+ className: typeof ancestorName === 'string' ? ancestorName : '<anonymous>',
331
+ methodsByName,
332
+ });
333
+ queue.push(...extendsParentsOf(ancestorId));
334
+ }
335
+ }
336
+ for (const methodId of ownMethods) {
337
+ const methodNode = graph.getNode(methodId);
338
+ if (!methodNode || methodNode.label === 'Property' || !methodNode.properties.name)
339
+ continue;
340
+ const methodName = methodNode.properties.name;
341
+ const ownParamTypes = methodNode.properties.parameterTypes ?? [];
342
+ const ownParamCount = methodNode.properties.parameterCount;
343
+ // Nearest ancestor (BFS order) defining this method by name AND signature, so a
344
+ // same-named overload (e.g. foo(int) vs foo()) is not mistaken for an override.
345
+ for (const { className, methodsByName } of orderedAncestorMethods) {
346
+ const sameName = methodsByName.get(methodName);
347
+ if (!sameName)
348
+ continue;
349
+ const matches = sameName.filter((m) => parameterTypesMatch(ownParamTypes, m.paramTypes, ownParamCount, m.paramCount).match);
350
+ if (matches.length === 0)
351
+ continue; // name present but no signature match — look deeper
352
+ // Emit only when the match is unambiguous (exactly one candidate); >1 means the
353
+ // override target cannot be pinned, so emit nothing. Either way stop — a closer
354
+ // ancestor shadows anything deeper.
355
+ if (matches.length === 1) {
356
+ const matchingMethodId = matches[0].methodId;
357
+ // Target the ancestor METHOD node (not the class), key the id on the method
358
+ // so distinct overrides stay distinct, and count only edges actually added
359
+ // (addRelationship is first-writer-wins, so a duplicate id is dropped).
360
+ const overrideId = generateId('METHOD_OVERRIDES', `${classId}->${matchingMethodId}`);
361
+ if (!emittedOverrideEdgeIds.has(overrideId)) {
362
+ emittedOverrideEdgeIds.add(overrideId);
363
+ graph.addRelationship({
364
+ id: overrideId,
365
+ sourceId: classId,
366
+ targetId: matchingMethodId,
367
+ type: 'METHOD_OVERRIDES',
368
+ confidence: SINGLE_ANCESTOR_OVERRIDE_CONFIDENCE,
369
+ reason: `single-ancestor override: ${className}::${methodName}()`,
370
+ });
371
+ overrideEdges++;
372
+ }
373
+ }
374
+ break; // nearest ancestor shadows deeper ones
375
+ }
376
+ }
377
+ }
269
378
  const methodImplementsEdges = emitMethodImplementsEdges(graph, parentMap, methodMap, parentEdgeType, ancestorsMap, edgeTypesMap);
270
379
  return { entries, overrideEdges, ambiguityCount, methodImplementsEdges };
271
380
  }
@@ -49,6 +49,7 @@ export const mergeChunkResults = (graph, symbolTable, chunkResults, exportedType
49
49
  templateArguments: sym.templateArguments,
50
50
  ownerId: sym.ownerId,
51
51
  qualifiedName: sym.qualifiedName,
52
+ isDeleted: sym.isDeleted,
52
53
  });
53
54
  }
54
55
  if (exportedTypeMap) {
@@ -144,6 +145,28 @@ chunkHash) => {
144
145
  .join(', ');
145
146
  logger.warn(` Skipped unsupported languages: ${summary}`);
146
147
  }
148
+ // Per-language CFG skip telemetry (#2195): functions skipped during the worker
149
+ // CFG walk, bucketed by reason. Only surfaced for a `--pdg` run (otherwise
150
+ // `cfgSkipped` is empty). Warn ONLY when a robustness-relevant bucket
151
+ // (too-deeply-nested / build-error) is non-zero — a too-many-lines skip is the
152
+ // expected, benign minified/generated-code case and would otherwise be spam.
153
+ const cfgSkipped = new Map();
154
+ for (const result of chunkResults) {
155
+ for (const [lang, counts] of Object.entries(result.cfgSkipped ?? {})) {
156
+ const prev = cfgSkipped.get(lang) ?? { tooManyLines: 0, tooDeeplyNested: 0, buildError: 0 };
157
+ cfgSkipped.set(lang, {
158
+ tooManyLines: prev.tooManyLines + counts.tooManyLines,
159
+ tooDeeplyNested: prev.tooDeeplyNested + counts.tooDeeplyNested,
160
+ buildError: prev.buildError + counts.buildError,
161
+ });
162
+ }
163
+ }
164
+ for (const [lang, c] of cfgSkipped) {
165
+ if (c.tooDeeplyNested > 0 || c.buildError > 0) {
166
+ logger.warn(` CFG functions skipped (${lang}): ${c.tooDeeplyNested} too-deeply-nested, ` +
167
+ `${c.buildError} build-error(s), ${c.tooManyLines} over line cap`);
168
+ }
169
+ }
147
170
  // Clone-safety telemetry (#2112): files whose parse output carried a value
148
171
  // the structured-clone algorithm couldn't serialize across the worker
149
172
  // boundary. The worker sanitized/dropped the offending value so the run
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Phase: callSummaries (PDG FU-C, U-C3)
3
+ *
4
+ * The whole-program CALL_SUMMARY materialisation pass — the dependence-engine
5
+ * SIBLING of `taintSummaries`. Runs AFTER scope-resolution (where the resolved
6
+ * `CALLS` graph lives in `ctx.graph` and the per-function RETURN-VALUE ASCENT
7
+ * summaries were harvested in-phase) and emits one `CALL_SUMMARY` self-loop edge
8
+ * per harvested callee. A later consumer phase (NOT this task) decodes the
9
+ * bitset to ascend a callee's return effect into the caller continuation.
10
+ *
11
+ * Opt-in: registered with `enabledWhen: (o) => o.pdg === true`. A default
12
+ * `analyze` run never includes it, so the graph is byte-identical and emits ZERO
13
+ * CALL_SUMMARY edges. No always-on phase depends on it.
14
+ *
15
+ * @deps scopeResolution, pruneLocalSymbols
16
+ * @reads scopeResolution output (callSummaries)
17
+ * @writes graph (CALL_SUMMARY self-loop edges)
18
+ */
19
+ import type { PipelinePhase } from './types.js';
20
+ export interface CallSummariesOutput {
21
+ /** Per-callee summaries fed to the emit. */
22
+ summaries: number;
23
+ /** CALL_SUMMARY edges persisted. */
24
+ edgesEmitted: number;
25
+ }
26
+ export declare const callSummariesPhase: PipelinePhase<CallSummariesOutput>;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Phase: callSummaries (PDG FU-C, U-C3)
3
+ *
4
+ * The whole-program CALL_SUMMARY materialisation pass — the dependence-engine
5
+ * SIBLING of `taintSummaries`. Runs AFTER scope-resolution (where the resolved
6
+ * `CALLS` graph lives in `ctx.graph` and the per-function RETURN-VALUE ASCENT
7
+ * summaries were harvested in-phase) and emits one `CALL_SUMMARY` self-loop edge
8
+ * per harvested callee. A later consumer phase (NOT this task) decodes the
9
+ * bitset to ascend a callee's return effect into the caller continuation.
10
+ *
11
+ * Opt-in: registered with `enabledWhen: (o) => o.pdg === true`. A default
12
+ * `analyze` run never includes it, so the graph is byte-identical and emits ZERO
13
+ * CALL_SUMMARY edges. No always-on phase depends on it.
14
+ *
15
+ * @deps scopeResolution, pruneLocalSymbols
16
+ * @reads scopeResolution output (callSummaries)
17
+ * @writes graph (CALL_SUMMARY self-loop edges)
18
+ */
19
+ import { getPhaseOutput } from './types.js';
20
+ import { emitCallSummaries, DEFAULT_PDG_MAX_CALL_SUMMARY_EDGES, } from '../taint/call-summary-emit.js';
21
+ import { logger } from '../../logger.js';
22
+ const EMPTY = { summaries: 0, edgesEmitted: 0 };
23
+ export const callSummariesPhase = {
24
+ name: 'callSummaries',
25
+ deps: ['scopeResolution', 'pruneLocalSymbols'],
26
+ async execute(ctx, deps) {
27
+ const scope = getPhaseOutput(deps, 'scopeResolution');
28
+ const summaries = scope.callSummaries;
29
+ if (summaries.length === 0)
30
+ return EMPTY;
31
+ const maxEdges = ctx.options?.pdgMaxCallSummaryEdges ?? DEFAULT_PDG_MAX_CALL_SUMMARY_EDGES;
32
+ const emit = emitCallSummaries(ctx.graph, summaries, { maxEdges }, (m) => logger.warn(m));
33
+ if (emit.edgesDropped > 0) {
34
+ logger.warn(`[call-summary] capped: ${emit.edgesDropped} CALL_SUMMARY edge(s) dropped by the ` +
35
+ `per-run cap (${maxEdges}) — raise pdgMaxCallSummaryEdges if intentional`);
36
+ }
37
+ if (emit.skippedMissingEndpoint > 0) {
38
+ logger.debug(`[call-summary] ${emit.skippedMissingEndpoint} summary/summaries skipped (callee node ` +
39
+ `missing from graph)`);
40
+ }
41
+ if (emit.edgesEmitted > 0) {
42
+ logger.debug(`[call-summary] ${summaries.length} summaries → ${emit.edgesEmitted} CALL_SUMMARY edge(s)`);
43
+ }
44
+ return { summaries: summaries.length, edgesEmitted: emit.edgesEmitted };
45
+ },
46
+ };
@@ -15,6 +15,8 @@ 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 { pruneLocalSymbolsPhase, type PruneLocalSymbolsOutput } from './prune-local-symbols.js';
18
+ export { taintSummariesPhase, type TaintSummariesOutput } from './taint-summaries.js';
19
+ export { callSummariesPhase, type CallSummariesOutput } from './call-summaries.js';
18
20
  export { mroPhase, type MROOutput } from './mro.js';
19
21
  export { communitiesPhase, type CommunitiesOutput } from './communities.js';
20
22
  export { processesPhase, type ProcessesOutput } from './processes.js';
@@ -16,6 +16,8 @@ export { ormPhase } from './orm.js';
16
16
  export { crossFilePhase } from './cross-file.js';
17
17
  export { scopeResolutionPhase, } from '../scope-resolution/pipeline/phase.js';
18
18
  export { pruneLocalSymbolsPhase } from './prune-local-symbols.js';
19
+ export { taintSummariesPhase } from './taint-summaries.js';
20
+ export { callSummariesPhase } from './call-summaries.js';
19
21
  export { mroPhase } from './mro.js';
20
22
  export { communitiesPhase } from './communities.js';
21
23
  export { processesPhase } from './processes.js';
@@ -26,27 +26,6 @@ type ScannedFile = {
26
26
  size: number;
27
27
  };
28
28
  type ProgressFn = (progress: PipelineProgress) => void;
29
- /**
30
- * Handle a worker-pool startup failure by FAILING FAST with the captured cause
31
- * (#1741). The pool self-heals *transient* worker crashes on its own — a
32
- * bounded, jittered startup restart loop (see worker-pool.ts) — so this is
33
- * reached only when that self-heal is EXHAUSTED, or a deterministic crash-loop
34
- * was detected, or the pool could not even be constructed. In every such case
35
- * the workers genuinely cannot start.
36
- *
37
- * There is no sequential parser to silently degrade to — that fallback was
38
- * removed (and it had masked a worker-startup regression as a 2-hour "stuck"
39
- * run in #1741, rc99: a dropped `logger.warn` plus an unbounded sequential
40
- * grind). GitNexus surfaces the real crash and aborts so the operator fixes the
41
- * worker startup (commonly a missing build). The pool's own crash
42
- * classification (`crashClass` on WorkerPoolInitializationError) sharpens the
43
- * message.
44
- *
45
- * @throws always — an actionable Error carrying the captured worker crash.
46
- * @internal Exported for unit tests; production callers are the parse loop's
47
- * two worker-startup catch sites below.
48
- */
49
- export declare function handleWorkerStartupFailure(err: Error): never;
50
29
  /**
51
30
  * Chunked parse + resolve loop.
52
31
  *
@@ -18,6 +18,7 @@ import { BindingAccumulator, enrichExportedTypeMap, } from '../binding-accumulat
18
18
  import { mergeChunkResults, dispatchChunkParse } from '../parsing-processor.js';
19
19
  import { fileContentHash, computeChunkHash, loadParseCacheChunk, persistParseCacheChunk, PARSE_CACHE_VERSION, } from '../../../storage/parse-cache.js';
20
20
  import { clearParsedFileStore, persistParsedFileChunk, getDurableParsedFileDir, loadDurableParsedFileIndex, restoreDurableParsedFileShard, } from '../../../storage/parsedfile-store.js';
21
+ import { DEFAULT_PDG_MAX_FUNCTION_LINES } from '../cfg/collect.js';
21
22
  import { processRoutesFromExtracted, buildExportedTypeMapFromGraph, } from '../call-processor.js';
22
23
  import { createSemanticModel } from '../model/index.js';
23
24
  import { getLanguageFromFilename, } from '../../../_shared/index.js';
@@ -319,6 +320,10 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
319
320
  // Initialized below before the chunk loop (same deferred-init pattern
320
321
  // as `parsedFileStorePath`); this closure only runs from the loop.
321
322
  durableParsedFileStoragePath: durableParsedFileDir,
323
+ // CFG/PDG opt-in (#2081 M1) — baked into each worker's workerData so the
324
+ // worker builds + attaches cfgSideChannel. Off by default.
325
+ pdg: options?.pdg === true,
326
+ pdgMaxFunctionLines: options?.pdgMaxFunctionLines,
322
327
  // Fan each chunk across the whole pool (#worker-idle): without this a
323
328
  // chunk smaller than the 8 MB sub-batch cap became a single job on a
324
329
  // single worker. Honors an explicit `subBatchMaxBytes` / env override.
@@ -566,7 +571,19 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
566
571
  filePath: f.path,
567
572
  contentHash: fileContentHash(f.content),
568
573
  }));
569
- chunkHash = computeChunkHash(entries);
574
+ chunkHash = computeChunkHash(entries,
575
+ // Only worker-visible pdg config participates in the key —
576
+ // pdgMaxEdgesPerFunction is emit-time-only and deliberately
577
+ // excluded (see PdgCacheKey in parse-cache.ts; #2099 F3). The line
578
+ // cap is RESOLVED to the worker's default before folding so an
579
+ // explicit-default run shares the default run's keys (the worker
580
+ // output is byte-identical either way).
581
+ options?.pdg === true
582
+ ? {
583
+ pdg: true,
584
+ maxFunctionLines: options?.pdgMaxFunctionLines ?? DEFAULT_PDG_MAX_FUNCTION_LINES,
585
+ }
586
+ : false);
570
587
  }
571
588
  const cachedRaw = chunkHash && parseCache ? await loadParseCacheChunk(parseCache, chunkHash) : undefined;
572
589
  // Track every chunk hash we touched so the orchestrator can
@@ -14,6 +14,15 @@ import type { PipelinePhase } from './types.js';
14
14
  export interface RouteEntry {
15
15
  filePath: string;
16
16
  source: string;
17
+ /**
18
+ * HTTP verb for this route when ingestion knows it structurally
19
+ * (Spring/Laravel framework routes and decorator routes carry
20
+ * `httpMethod`; filesystem-derived routes — Next.js/Expo/PHP file
21
+ * routes — do not, so this stays undefined for them). Persisted onto
22
+ * the Route node so downstream contract extraction can read the verb
23
+ * from the graph instead of re-parsing the handler source.
24
+ */
25
+ method?: string;
17
26
  }
18
27
  export interface RoutesOutput {
19
28
  routeRegistry: Map<string, RouteEntry>;
@@ -26,4 +35,5 @@ export interface TemplateFetchCall {
26
35
  export declare const isTemplateRouteCandidate: (filePath: string) => boolean;
27
36
  export declare function extractTemplateStaticFetchCalls(filePath: string, content: string, namedRouteUrls?: ReadonlyMap<string, string>): TemplateFetchCall[];
28
37
  export declare function normalizeExtractedRoutePath(routePath: string, prefix: string | null): string;
38
+ export declare function normalizeRouteMethod(raw: string | null | undefined): string | undefined;
29
39
  export declare const routesPhase: PipelinePhase<RoutesOutput>;
@@ -97,6 +97,32 @@ export function normalizeExtractedRoutePath(routePath, prefix) {
97
97
  function escapeRegex(s) {
98
98
  return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
99
99
  }
100
+ /**
101
+ * Canonicalize a route's HTTP verb for persistence on the Route node.
102
+ * Returns an upper-cased standard method, or `undefined` when the value
103
+ * is not a real HTTP verb. Laravel `Route::resource` / `apiResource`
104
+ * surface `httpMethod` values like `resource` / `apiResource` (they
105
+ * expand to several verbs at runtime), so they must not be stored as a
106
+ * method — leaving them `undefined` keeps the column clean and lets the
107
+ * contract extractor fall back to its source-scan path for those routes.
108
+ */
109
+ const VALID_HTTP_METHODS = new Set([
110
+ 'GET',
111
+ 'POST',
112
+ 'PUT',
113
+ 'PATCH',
114
+ 'DELETE',
115
+ 'HEAD',
116
+ 'OPTIONS',
117
+ 'TRACE',
118
+ 'CONNECT',
119
+ ]);
120
+ export function normalizeRouteMethod(raw) {
121
+ if (typeof raw !== 'string')
122
+ return undefined;
123
+ const verb = raw.trim().toUpperCase();
124
+ return VALID_HTTP_METHODS.has(verb) ? verb : undefined;
125
+ }
100
126
  export const routesPhase = {
101
127
  name: 'routes',
102
128
  deps: ['parse'],
@@ -166,6 +192,7 @@ export const routesPhase = {
166
192
  addRoute(routeUrl, {
167
193
  filePath: route.filePath,
168
194
  source: 'framework-route',
195
+ method: normalizeRouteMethod(route.httpMethod),
169
196
  });
170
197
  if (route.routeName && !namedRouteRegistry.has(route.routeName)) {
171
198
  namedRouteRegistry.set(route.routeName, routeUrl);
@@ -176,6 +203,7 @@ export const routesPhase = {
176
203
  addRoute(url, {
177
204
  filePath: dr.filePath,
178
205
  source: `decorator-${dr.decoratorName}`,
206
+ method: normalizeRouteMethod(dr.httpMethod),
179
207
  });
180
208
  }
181
209
  let handlerContents;
@@ -183,7 +211,7 @@ export const routesPhase = {
183
211
  const handlerPaths = [...routeRegistry.values()].map((e) => e.filePath);
184
212
  handlerContents = await readFileContents(ctx.repoPath, handlerPaths);
185
213
  for (const [routeURL, entry] of routeRegistry) {
186
- const { filePath: handlerPath, source: routeSource } = entry;
214
+ const { filePath: handlerPath, source: routeSource, method: routeMethod } = entry;
187
215
  const content = handlerContents.get(handlerPath);
188
216
  const { responseKeys, errorKeys } = content
189
217
  ? handlerPath.endsWith('.php')
@@ -199,6 +227,7 @@ export const routesPhase = {
199
227
  properties: {
200
228
  name: routeURL,
201
229
  filePath: handlerPath,
230
+ ...(routeMethod ? { method: routeMethod } : {}),
202
231
  ...(responseKeys ? { responseKeys } : {}),
203
232
  ...(errorKeys ? { errorKeys } : {}),
204
233
  ...(middleware && middleware.length > 0 ? { middleware } : {}),
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Phase: taintSummaries (#2084 M4 U3/U5)
3
+ *
4
+ * The interprocedural taint fixpoint. Runs AFTER scope-resolution (where the
5
+ * complete, resolved `CALLS` graph lives in `ctx.graph` and the per-function
6
+ * summaries were harvested in-phase) and composes those summaries to find
7
+ * source→sink flows that cross function and file boundaries.
8
+ *
9
+ * Opt-in: registered with `enabledWhen: (o) => o.pdg === true` (the first real
10
+ * pdg-gated phase). A default `analyze` run never includes it, so the graph is
11
+ * byte-identical. No always-on phase depends on it (a filtered-out dep would
12
+ * throw in `getPhaseOutput`).
13
+ *
14
+ * @deps scopeResolution, pruneLocalSymbols
15
+ * @reads graph (CALLS edges, Function/Method nodes), scopeResolution output
16
+ * (functionSummaries)
17
+ * @writes graph (TAINT_PATH edges)
18
+ */
19
+ import type { PipelinePhase } from './types.js';
20
+ export interface TaintSummariesOutput {
21
+ /** Function summaries fed to the fixpoint. */
22
+ summaries: number;
23
+ /** Cross-function findings (pre-cap). */
24
+ findings: number;
25
+ /** TAINT_PATH edges persisted. */
26
+ edgesEmitted: number;
27
+ /** Call sites whose callee did not resolve to a summary edge (diagnostics). */
28
+ unmatchedCallSites: number;
29
+ }
30
+ export declare const taintSummariesPhase: PipelinePhase<TaintSummariesOutput>;