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
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Per-function taint SUMMARY model (#2084 M4 U2).
3
+ *
4
+ * A {@link FunctionSummary} is the compact, context-insensitive abstraction of
5
+ * one function's taint behaviour — the input to the interprocedural fixpoint
6
+ * (`interproc-solver.ts`). It is the GitNexus analogue of Pysa's `.pysa`
7
+ * models, Mariana Trench's "propagations", and CodeQL Models-as-Data summary
8
+ * rows: a function is reduced to how taint enters (params / generated sources),
9
+ * how it moves through (param→return, param→callee-arg), and where it lands
10
+ * (param→sink). The fixpoint composes these across resolved `CALLS` edges so a
11
+ * source in one function reaches a sink in another.
12
+ *
13
+ * ## Why summaries (not whole-program IFDS)
14
+ *
15
+ * The functional/summary method (Sharir-Pnueli 1981) analyses each function
16
+ * ONCE and propagates the result over the call graph — the same shape Pysa,
17
+ * Mariana Trench, and Infer use in production. GitNexus already resolves the
18
+ * call graph (`CALLS` edges carry final node ids), so the summary IS the only
19
+ * new artifact; propagation is graph reachability over a finite lattice.
20
+ *
21
+ * ## Granularity (first cut)
22
+ *
23
+ * WHOLE-PARAMETER. Ports are `param i`, `return`, and `receiver` — no field
24
+ * access paths (`arg0.field.sub`). Field sensitivity, callback-parameter ports
25
+ * (`Argument[0].Parameter[0]`), and context sensitivity are deferred (plan
26
+ * KTD; the largest JS/TS FN class — closures — stays a documented gap).
27
+ *
28
+ * ## Plain-data discipline
29
+ *
30
+ * A summary is a JSON-plain value type (no functions, class instances, Maps, or
31
+ * Symbols) so it survives `RunScopeResolutionStats` → `ScopeResolutionOutput`
32
+ * threading and any future worker/cache boundary unchanged — the same
33
+ * `Cloneable` constraint the CFG side channel obeys.
34
+ */
35
+ import type { SinkKind, SourceKind } from './source-sink-config.js';
36
+ /**
37
+ * Source-relative parameter index (0-based, in declaration order). A
38
+ * function's first parameter is `0`. Destructured / rest params map each bound
39
+ * name to the index of the formal parameter that introduced it (so
40
+ * `function f([a, b]) {}` binds both `a` and `b` to param `0`).
41
+ */
42
+ export type ParamIndex = number;
43
+ /**
44
+ * `param i` flows into argument `argIndex` of a call at source line `callLine`.
45
+ * The interprocedural solver joins this to the caller's outgoing `CALLS` edges
46
+ * by CALLEE NAME (`calleeName`) — NOT by `callLine` — because line-base parity
47
+ * between the CFG harvest (1-based) and the resolved reference site is fragile,
48
+ * while the callee identity is exact. It then applies the callee's summary at
49
+ * port `param argIndex`. This is the TITO ("taint-in-taint-out") propagation
50
+ * edge — a param laundered into a callee, the callee's behaviour deciding what
51
+ * happens next.
52
+ *
53
+ * `calleeName` is the site's dotted-callee tail (best-effort); absent when the
54
+ * callee chain was not statically resolvable, in which case the solver
55
+ * conservatively matches every outgoing call (sound over-approximation).
56
+ * `callLine` is the 1-based statement line as harvested (`StatementFacts.line`)
57
+ * — carried for hop display and as a TIE-BREAKER among several same-named
58
+ * callees of one caller, never as the primary join key.
59
+ */
60
+ export interface ParamToCallArg {
61
+ readonly param: ParamIndex;
62
+ readonly callLine: number;
63
+ readonly argIndex: number;
64
+ readonly calleeName?: string;
65
+ /**
66
+ * Sink kinds neutralised on EVERY harvested path from the param to this call
67
+ * argument (intersection-over-paths, #2084 review P1-2). A sanitizer between
68
+ * the param and the callee arg (`relay(x){ const y=escape(x); sinkFn(y); }`)
69
+ * must carry across the boundary so the callee's `paramToSink` of a
70
+ * neutralised kind does not fire (the cross-function false positive). Absent
71
+ * means none neutralised.
72
+ */
73
+ readonly neutralized?: readonly SinkKind[];
74
+ }
75
+ /**
76
+ * `param i` flows to the function's return value (a `return <expr>` use).
77
+ *
78
+ * RESERVED — not yet consumed by the fixpoint (#2084 review P1-1). The M3
79
+ * statement-level floor already treats every call as propagate-through, so it
80
+ * taints a callee's RESULT whenever the caller passes tainted input; param→
81
+ * return recall is therefore already covered, and consuming `paramToReturn`
82
+ * would only add PRECISION (avoiding the floor's over-approximation for
83
+ * functions that don't actually return their param) — a larger refactor
84
+ * deferred. Harvested + version-stamped so the precision pass can land without
85
+ * a cache-namespace bump.
86
+ */
87
+ export interface ParamToReturn {
88
+ readonly param: ParamIndex;
89
+ /** Sink kinds neutralised on EVERY path param→return (intersection). */
90
+ readonly neutralized?: readonly SinkKind[];
91
+ }
92
+ /** `param i` reaches a modelled sink of kind `sinkKind` inside this function. */
93
+ export interface ParamToSink {
94
+ readonly param: ParamIndex;
95
+ readonly sinkKind: SinkKind;
96
+ }
97
+ /**
98
+ * The function itself GENERATES a source (a modelled source read, e.g.
99
+ * `req.body`) that reaches its return value — calling it yields tainted data
100
+ * with no tainted input required. The generative analogue of Pysa's
101
+ * `TaintSource[...]` return model. CONSUMED by the fixpoint via the caller's
102
+ * {@link CallResult} edges (#2084 review P1-1): a caller that uses such a
103
+ * function's result composes this into a finding/propagation. This is the
104
+ * genuinely-additive recall the floor cannot cover (the source is inside the
105
+ * callee — the caller passes no tainted input for the floor to propagate).
106
+ */
107
+ export interface SourceToReturn {
108
+ readonly sourceKind: SourceKind;
109
+ }
110
+ /**
111
+ * What a user-function call's RESULT flows into, in the CALLER (#2084 review
112
+ * P1-1). Recorded when a call to a (potentially generative) user function has
113
+ * its return value used by the caller. The fixpoint composes it with the
114
+ * callee's {@link SourceToReturn}: if the callee returns a generated source,
115
+ * the caller's downstream use of the result is tainted.
116
+ */
117
+ export type CallResultDest = {
118
+ readonly to: 'sink';
119
+ readonly sinkKind: SinkKind;
120
+ } | {
121
+ readonly to: 'return';
122
+ } | {
123
+ readonly to: 'callArg';
124
+ readonly toCallee?: string;
125
+ readonly argIndex: ParamIndex;
126
+ };
127
+ /** The result of a call to `calleeName` flows to `dest` in this function. */
128
+ export interface CallResult {
129
+ readonly calleeName: string;
130
+ readonly dest: CallResultDest;
131
+ }
132
+ /**
133
+ * A modelled source generated in this function flows into argument `argIndex`
134
+ * of a call at `callLine`. This SEEDS the interprocedural fixpoint: the source
135
+ * taints the callee's parameter, which the callee's summary then carries to a
136
+ * sink (one or more hops away). The cross-function analogue of an intra-
137
+ * procedural `source → sink` partial flow whose sink lives in the callee.
138
+ */
139
+ export interface SourceToCallArg {
140
+ readonly sourceKind: SourceKind;
141
+ /** Carried for hop display + same-name tie-break; NOT the join key (see
142
+ * {@link ParamToCallArg} — the solver joins by `calleeName`). */
143
+ readonly callLine: number;
144
+ readonly argIndex: number;
145
+ readonly calleeName?: string;
146
+ /** Sink kinds neutralised on EVERY path from the generated source to this
147
+ * call argument (intersection; #2084 review P1-2 — see {@link ParamToCallArg}). */
148
+ readonly neutralized?: readonly SinkKind[];
149
+ }
150
+ /**
151
+ * The compact taint abstraction of one function. All arrays are deterministically
152
+ * sorted by the harvester and deduped, so two structurally-equal summaries
153
+ * serialise identically (the {@link summaryVersion} contract).
154
+ */
155
+ export interface FunctionSummary {
156
+ /** The resolved `Function`/`Method` graph node id this summary describes. */
157
+ readonly fnId: string;
158
+ /** Repo-relative source path (carried for diagnostics + the join debug). */
159
+ readonly filePath: string;
160
+ /** 1-based function start line (mirrors `FunctionCfg.functionStartLine`). */
161
+ readonly startLine: number;
162
+ /** Number of declared formal parameters (port arity). */
163
+ readonly paramCount: number;
164
+ /** param→return TITO edges. */
165
+ readonly paramToReturn: readonly ParamToReturn[];
166
+ /** param→callee-arg TITO edges (composed across `CALLS` in the fixpoint). */
167
+ readonly paramToCallArg: readonly ParamToCallArg[];
168
+ /** param→sink partial flows (a source reaching this param triggers a finding). */
169
+ readonly paramToSink: readonly ParamToSink[];
170
+ /** Generative source→return models. */
171
+ readonly sourceToReturn: readonly SourceToReturn[];
172
+ /** Generative source→callee-arg seeds (fixpoint entry points). */
173
+ readonly sourceToCallArg: readonly SourceToCallArg[];
174
+ /** Caller-side call-result flows — compose with callee `sourceToReturn`. */
175
+ readonly callResults: readonly CallResult[];
176
+ /**
177
+ * Content version stamp — `hash(own-facts ∪ sorted callee versions)`. The
178
+ * incremental cache key (Infer's content-keyed summary): equal across two
179
+ * runs iff the function's own taint facts AND every callee summary it depends
180
+ * on are unchanged. NOTE (#2084 review P1-1): callee-version composition is
181
+ * RESERVED — the harvester stamps the own-facts portion only
182
+ * ({@link ownFactsDigest}); the fixpoint does not yet recompose it.
183
+ */
184
+ readonly version: string;
185
+ }
186
+ /**
187
+ * Deterministic digest of a summary's OWN taint facts (everything except
188
+ * `version`, which is derived). Order-independent within each edge category —
189
+ * the harvester already sorts, but the digest re-canonicalises so a reordering
190
+ * never changes the stamp. Used as the leaf of {@link summaryVersion}.
191
+ */
192
+ export declare function ownFactsDigest(s: Pick<FunctionSummary, 'paramCount' | 'paramToReturn' | 'paramToCallArg' | 'paramToSink' | 'sourceToReturn' | 'sourceToCallArg' | 'callResults'>): string;
193
+ /**
194
+ * Content version stamp for a summary: `hash(ownFactsDigest ∪ sorted callee
195
+ * versions)`. Order-independent over callee versions (sorted). Equal iff the
196
+ * function's own facts AND every callee dependency are unchanged — this is the
197
+ * incremental invalidation primitive (a changed callee changes its version,
198
+ * which changes every transitive caller's version).
199
+ */
200
+ export declare function summaryVersion(ownDigest: string, calleeVersions: readonly string[]): string;
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Per-function taint SUMMARY model (#2084 M4 U2).
3
+ *
4
+ * A {@link FunctionSummary} is the compact, context-insensitive abstraction of
5
+ * one function's taint behaviour — the input to the interprocedural fixpoint
6
+ * (`interproc-solver.ts`). It is the GitNexus analogue of Pysa's `.pysa`
7
+ * models, Mariana Trench's "propagations", and CodeQL Models-as-Data summary
8
+ * rows: a function is reduced to how taint enters (params / generated sources),
9
+ * how it moves through (param→return, param→callee-arg), and where it lands
10
+ * (param→sink). The fixpoint composes these across resolved `CALLS` edges so a
11
+ * source in one function reaches a sink in another.
12
+ *
13
+ * ## Why summaries (not whole-program IFDS)
14
+ *
15
+ * The functional/summary method (Sharir-Pnueli 1981) analyses each function
16
+ * ONCE and propagates the result over the call graph — the same shape Pysa,
17
+ * Mariana Trench, and Infer use in production. GitNexus already resolves the
18
+ * call graph (`CALLS` edges carry final node ids), so the summary IS the only
19
+ * new artifact; propagation is graph reachability over a finite lattice.
20
+ *
21
+ * ## Granularity (first cut)
22
+ *
23
+ * WHOLE-PARAMETER. Ports are `param i`, `return`, and `receiver` — no field
24
+ * access paths (`arg0.field.sub`). Field sensitivity, callback-parameter ports
25
+ * (`Argument[0].Parameter[0]`), and context sensitivity are deferred (plan
26
+ * KTD; the largest JS/TS FN class — closures — stays a documented gap).
27
+ *
28
+ * ## Plain-data discipline
29
+ *
30
+ * A summary is a JSON-plain value type (no functions, class instances, Maps, or
31
+ * Symbols) so it survives `RunScopeResolutionStats` → `ScopeResolutionOutput`
32
+ * threading and any future worker/cache boundary unchanged — the same
33
+ * `Cloneable` constraint the CFG side channel obeys.
34
+ */
35
+ /** Stable FNV-1a 32-bit hash → 8-char hex. Pure, deterministic, no deps. */
36
+ function fnv1a(input) {
37
+ let h = 0x811c9dc5;
38
+ for (let i = 0; i < input.length; i++) {
39
+ h ^= input.charCodeAt(i);
40
+ // 32-bit FNV prime multiply via shifts (avoids BigInt; stays in int32 land).
41
+ h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0;
42
+ }
43
+ return (h >>> 0).toString(16).padStart(8, '0');
44
+ }
45
+ /**
46
+ * Deterministic digest of a summary's OWN taint facts (everything except
47
+ * `version`, which is derived). Order-independent within each edge category —
48
+ * the harvester already sorts, but the digest re-canonicalises so a reordering
49
+ * never changes the stamp. Used as the leaf of {@link summaryVersion}.
50
+ */
51
+ export function ownFactsDigest(s) {
52
+ const parts = [`p${s.paramCount}`];
53
+ parts.push(...s.paramToReturn
54
+ .map((r) => `r:${r.param}:${[...(r.neutralized ?? [])].sort().join(',')}`)
55
+ .sort());
56
+ parts.push(...s.paramToCallArg
57
+ .map((c) => `c:${c.param}:${c.callLine}:${c.argIndex}:${c.calleeName ?? ''}:${[...(c.neutralized ?? [])].sort().join(',')}`)
58
+ .sort());
59
+ parts.push(...s.paramToSink.map((k) => `k:${k.param}:${k.sinkKind}`).sort());
60
+ parts.push(...s.sourceToReturn.map((g) => `g:${g.sourceKind}`).sort());
61
+ parts.push(...s.sourceToCallArg
62
+ .map((g) => `s:${g.sourceKind}:${g.callLine}:${g.argIndex}:${g.calleeName ?? ''}:${[...(g.neutralized ?? [])].sort().join(',')}`)
63
+ .sort());
64
+ parts.push(...s.callResults
65
+ .map((cr) => {
66
+ const d = cr.dest;
67
+ const dest = d.to === 'sink'
68
+ ? `sink:${d.sinkKind}`
69
+ : d.to === 'return'
70
+ ? 'return'
71
+ : `arg:${d.toCallee ?? ''}:${d.argIndex}`;
72
+ return `cr:${cr.calleeName}:${dest}`;
73
+ })
74
+ .sort());
75
+ return fnv1a(parts.join('|'));
76
+ }
77
+ /**
78
+ * Content version stamp for a summary: `hash(ownFactsDigest ∪ sorted callee
79
+ * versions)`. Order-independent over callee versions (sorted). Equal iff the
80
+ * function's own facts AND every callee dependency are unchanged — this is the
81
+ * incremental invalidation primitive (a changed callee changes its version,
82
+ * which changes every transitive caller's version).
83
+ */
84
+ export function summaryVersion(ownDigest, calleeVersions) {
85
+ return fnv1a(`${ownDigest}#${[...calleeVersions].sort().join(',')}`);
86
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Built-in TS/JS taint model (#2083 M3 U2, plan KTD7).
3
+ *
4
+ * The canonical Express/Node source/sink/sanitizer set, registered for the
5
+ * `typescript` and `javascript` language ids via the EXPLICIT
6
+ * {@link registerBuiltinTaintModels} seam — deliberately not an import
7
+ * side-effect, so the U4 emit path controls WHEN registration happens (call
8
+ * it once before the pdg window runs; it is idempotent — the registry is
9
+ * last-write-wins on the same language id).
10
+ *
11
+ * `taintModelVersion` is a deterministic digest of the FULL model content
12
+ * (entries, kinds, args, modules). It joins the RepoMeta `pdg` stamp in U5 so
13
+ * that ANY model change — adding an entry, relabeling a kind — trips full
14
+ * writeback on an existing `--pdg` index (R7): persisted findings must never
15
+ * outlive the model that produced them.
16
+ */
17
+ import type { SourceSinkSanitizerSpec } from './source-sink-config.js';
18
+ /**
19
+ * The built-in TS/JS model. Module provenance uses bare specifier names —
20
+ * the matcher normalizes the `node:` scheme prefix, so `import { exec } from
21
+ * 'node:child_process'` resolves identically.
22
+ */
23
+ export declare const TS_JS_TAINT_MODEL: SourceSinkSanitizerSpec;
24
+ /**
25
+ * Deterministic digest of a spec's full content. Key order is canonicalized
26
+ * (recursively sorted) so the version reflects CONTENT, not literal layout;
27
+ * array order is semantic (entry identity) and intentionally preserved.
28
+ */
29
+ export declare function computeTaintModelVersion(spec: SourceSinkSanitizerSpec): string;
30
+ /** Version stamp of the built-in TS/JS model (joins the RepoMeta pdg key in U5). */
31
+ export declare const taintModelVersion: string;
32
+ /**
33
+ * Register the built-in model for TypeScript and JavaScript. Explicit init
34
+ * seam for the U4 emit path (call before the pdg window consumes the
35
+ * registry); idempotent. Vue and other TS-adjacent language ids are
36
+ * deliberately NOT registered — the M3 scope is TS/JS only.
37
+ */
38
+ export declare function registerBuiltinTaintModels(): void;
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Built-in TS/JS taint model (#2083 M3 U2, plan KTD7).
3
+ *
4
+ * The canonical Express/Node source/sink/sanitizer set, registered for the
5
+ * `typescript` and `javascript` language ids via the EXPLICIT
6
+ * {@link registerBuiltinTaintModels} seam — deliberately not an import
7
+ * side-effect, so the U4 emit path controls WHEN registration happens (call
8
+ * it once before the pdg window runs; it is idempotent — the registry is
9
+ * last-write-wins on the same language id).
10
+ *
11
+ * `taintModelVersion` is a deterministic digest of the FULL model content
12
+ * (entries, kinds, args, modules). It joins the RepoMeta `pdg` stamp in U5 so
13
+ * that ANY model change — adding an entry, relabeling a kind — trips full
14
+ * writeback on an existing `--pdg` index (R7): persisted findings must never
15
+ * outlive the model that produced them.
16
+ */
17
+ import { createHash } from 'node:crypto';
18
+ import { SupportedLanguages } from '../../../_shared/index.js';
19
+ import { registerSourceSinkConfig } from './source-sink-registry.js';
20
+ /**
21
+ * The built-in TS/JS model. Module provenance uses bare specifier names —
22
+ * the matcher normalizes the `node:` scheme prefix, so `import { exec } from
23
+ * 'node:child_process'` resolves identically.
24
+ */
25
+ export const TS_JS_TAINT_MODEL = {
26
+ sources: [
27
+ // Express-convention request member reads, matched name-based on the
28
+ // receiver (`req`/`request`) — the plan's accepted Semgrep-style trade.
29
+ {
30
+ kind: 'remote-input',
31
+ objects: ['req', 'request'],
32
+ properties: ['body', 'query', 'params', 'headers', 'cookies'],
33
+ },
34
+ ],
35
+ sinks: [
36
+ // Command execution — the command string is argument 0.
37
+ { name: 'exec', kind: 'command-injection', args: [0], module: 'child_process' },
38
+ { name: 'execSync', kind: 'command-injection', args: [0], module: 'child_process' },
39
+ { name: 'spawn', kind: 'command-injection', args: [0], module: 'child_process' },
40
+ // Code evaluation. `eval` takes code at 0; `new Function(...)` treats
41
+ // EVERY argument as source text (params + body), so `args` is omitted
42
+ // (= all positions) rather than pinned to 0.
43
+ { name: 'eval', kind: 'code-injection', args: [0], global: true },
44
+ { name: 'Function', kind: 'code-injection', global: true, newOnly: true },
45
+ // Filesystem path consumption — path argument 0.
46
+ { name: 'readFile', kind: 'path-traversal', args: [0], module: 'fs' },
47
+ { name: 'readFileSync', kind: 'path-traversal', args: [0], module: 'fs' },
48
+ { name: 'writeFile', kind: 'path-traversal', args: [0], module: 'fs' },
49
+ { name: 'writeFileSync', kind: 'path-traversal', args: [0], module: 'fs' },
50
+ // SQL — `.query(sql)` / `.execute(sql)` member calls on ANY receiver
51
+ // (mysql2/pg/knex handles go by many names; receiver-conventional).
52
+ { name: 'query', kind: 'sql-injection', args: [0], anyReceiver: true },
53
+ { name: 'execute', kind: 'sql-injection', args: [0], anyReceiver: true },
54
+ // Reflected XSS — Express response writes, conventional receiver `res`.
55
+ { name: 'send', kind: 'xss', args: [0], receivers: ['res'] },
56
+ { name: 'write', kind: 'xss', args: [0], receivers: ['res'] },
57
+ ],
58
+ sanitizers: [
59
+ // URL-encoding: neutralizes markup injection AND path separators
60
+ // (`%2F` is not a separator inside a path component).
61
+ { name: 'encodeURIComponent', neutralizes: ['xss', 'path-traversal'], global: true },
62
+ // `escape-html` exports its function as the module default — the
63
+ // `'default'` pseudo-name matches the default-imported / require'd
64
+ // module handle being invoked directly.
65
+ { name: 'default', neutralizes: ['xss'], module: 'escape-html' },
66
+ { name: 'encode', neutralizes: ['xss'], module: 'he' },
67
+ { name: 'basename', neutralizes: ['path-traversal'], module: 'path' },
68
+ { name: 'escape', neutralizes: ['xss'], module: 'validator' },
69
+ ],
70
+ };
71
+ /**
72
+ * Deterministic digest of a spec's full content. Key order is canonicalized
73
+ * (recursively sorted) so the version reflects CONTENT, not literal layout;
74
+ * array order is semantic (entry identity) and intentionally preserved.
75
+ */
76
+ export function computeTaintModelVersion(spec) {
77
+ return createHash('sha256').update(canonicalJson(spec)).digest('hex').slice(0, 12);
78
+ }
79
+ function canonicalJson(value) {
80
+ if (Array.isArray(value))
81
+ return `[${value.map(canonicalJson).join(',')}]`;
82
+ if (value !== null && typeof value === 'object') {
83
+ const entries = Object.entries(value)
84
+ .filter(([, v]) => v !== undefined)
85
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
86
+ .map(([k, v]) => `${JSON.stringify(k)}:${canonicalJson(v)}`);
87
+ return `{${entries.join(',')}}`;
88
+ }
89
+ return JSON.stringify(value);
90
+ }
91
+ /** Version stamp of the built-in TS/JS model (joins the RepoMeta pdg key in U5). */
92
+ export const taintModelVersion = computeTaintModelVersion(TS_JS_TAINT_MODEL);
93
+ /**
94
+ * Register the built-in model for TypeScript and JavaScript. Explicit init
95
+ * seam for the U4 emit path (call before the pdg window consumes the
96
+ * registry); idempotent. Vue and other TS-adjacent language ids are
97
+ * deliberately NOT registered — the M3 scope is TS/JS only.
98
+ */
99
+ export function registerBuiltinTaintModels() {
100
+ registerSourceSinkConfig(SupportedLanguages.TypeScript, TS_JS_TAINT_MODEL);
101
+ registerSourceSinkConfig(SupportedLanguages.JavaScript, TS_JS_TAINT_MODEL);
102
+ }
@@ -1,4 +1,5 @@
1
1
  import { extractSimpleTypeName, extractVarName, resolveIterableElementType, methodToTypeArgPosition, } from './shared.js';
2
+ import { CPP_BRACED_INIT_TYPE_PREFIX } from '../languages/cpp/conversion-rank.js';
2
3
  const DECLARATION_NODE_TYPES = new Set(['declaration']);
3
4
  /** Smart pointer factory function names that create a typed object. */
4
5
  const SMART_PTR_FACTORIES = new Set(['make_shared', 'make_unique', 'make_shared_for_overwrite']);
@@ -447,6 +448,8 @@ const extractForLoopBinding = (node, { scopeEnv, declarationTypeNodes, scope })
447
448
  /** Infer the type of a literal AST node for C++ overload disambiguation. */
448
449
  const inferLiteralType = (node) => {
449
450
  switch (node.type) {
451
+ case 'initializer_list':
452
+ return inferBracedInitLiteralType(node);
450
453
  case 'number_literal': {
451
454
  const t = node.text;
452
455
  // Float suffixes
@@ -475,6 +478,24 @@ const inferLiteralType = (node) => {
475
478
  return undefined;
476
479
  }
477
480
  };
481
+ function inferBracedInitLiteralType(node) {
482
+ const elementTypes = [];
483
+ for (const child of node.children) {
484
+ if (child.type === ',' || child.type === '{' || child.type === '}')
485
+ continue;
486
+ const elementType = inferLiteralType(child);
487
+ if (elementType === undefined || elementType.startsWith(CPP_BRACED_INIT_TYPE_PREFIX)) {
488
+ return `${CPP_BRACED_INIT_TYPE_PREFIX}unknown:${elementTypes.length + 1}`;
489
+ }
490
+ elementTypes.push(elementType);
491
+ }
492
+ if (elementTypes.length === 0)
493
+ return `${CPP_BRACED_INIT_TYPE_PREFIX}unknown:0`;
494
+ const first = elementTypes[0];
495
+ return elementTypes.every((type) => type === first)
496
+ ? `${CPP_BRACED_INIT_TYPE_PREFIX}${first}:${elementTypes.length}`
497
+ : `${CPP_BRACED_INIT_TYPE_PREFIX}unknown:${elementTypes.length}`;
498
+ }
478
499
  /** C++: detect constructor type from smart pointer factory calls (make_shared<Dog>()).
479
500
  * Extracts the template type argument as the constructor type for virtual dispatch. */
480
501
  const detectCppConstructorType = (node, classNames) => {
@@ -21,6 +21,13 @@ export declare const isDev: boolean;
21
21
  * conventions and serves a different purpose.
22
22
  */
23
23
  export declare const parseTruthyEnv: (raw: string | undefined) => boolean;
24
+ /**
25
+ * Parse a positive-integer env-var value. Returns the integer when `raw` is a
26
+ * finite integer `> 0`; otherwise (`undefined`, empty, non-numeric, `0`, or
27
+ * negative) returns `undefined` so the caller falls back to its default. Used
28
+ * for numeric tuning knobs like `GITNEXUS_PDG_EMIT_CHUNK_SIZE` (#2202).
29
+ */
30
+ export declare const parsePositiveIntEnv: (raw: string | undefined) => number | undefined;
24
31
  /**
25
32
  * Whether scope-resolution dev validators (e.g. `validateBindingsImmutability`)
26
33
  * should run AND emit warnings. Off by default in CLI runs to avoid silent
@@ -26,6 +26,18 @@ export const parseTruthyEnv = (raw) => {
26
26
  const value = raw.trim().toLowerCase();
27
27
  return value === '1' || value === 'true' || value === 'yes';
28
28
  };
29
+ /**
30
+ * Parse a positive-integer env-var value. Returns the integer when `raw` is a
31
+ * finite integer `> 0`; otherwise (`undefined`, empty, non-numeric, `0`, or
32
+ * negative) returns `undefined` so the caller falls back to its default. Used
33
+ * for numeric tuning knobs like `GITNEXUS_PDG_EMIT_CHUNK_SIZE` (#2202).
34
+ */
35
+ export const parsePositiveIntEnv = (raw) => {
36
+ if (raw === undefined)
37
+ return undefined;
38
+ const n = Number(raw.trim());
39
+ return Number.isInteger(n) && n > 0 ? n : undefined;
40
+ };
29
41
  /**
30
42
  * Whether scope-resolution dev validators (e.g. `validateBindingsImmutability`)
31
43
  * should run AND emit warnings. Off by default in CLI runs to avoid silent
@@ -184,6 +184,7 @@ export function buildMethodProps(info) {
184
184
  ...(info.isAsync ? { isAsync: info.isAsync } : {}),
185
185
  ...(info.isPartial ? { isPartial: info.isPartial } : {}),
186
186
  ...(info.isConst ? { isConst: info.isConst } : {}),
187
+ ...(info.isDeleted ? { isDeleted: info.isDeleted } : {}),
187
188
  ...(info.annotations.length > 0 ? { annotations: info.annotations } : {}),
188
189
  };
189
190
  }
@@ -6,6 +6,7 @@ import type { ConstructorBinding } from '../type-env.js';
6
6
  import type { NodeLabel, ParameterTypeClass } from '../../../_shared/index.js';
7
7
  import type { ParsedFile } from '../../../_shared/index.js';
8
8
  import { type ExtractedRoute } from '../route-extractors/laravel.js';
9
+ import { type CfgSkipCounts } from '../cfg/collect.js';
9
10
  export type { ExtractedRoute } from '../route-extractors/laravel.js';
10
11
  interface ParsedNode {
11
12
  id: string;
@@ -50,6 +51,7 @@ interface ParsedSymbol {
50
51
  isReadonly?: boolean;
51
52
  isAbstract?: boolean;
52
53
  isFinal?: boolean;
54
+ isDeleted?: boolean;
53
55
  annotations?: string[];
54
56
  }
55
57
  export interface ExtractedCall {
@@ -211,6 +213,17 @@ export interface ParseWorkerResult {
211
213
  * entries predate the field; consumers must guard with `?? []`.
212
214
  */
213
215
  skippedPaths?: SkippedPath[];
216
+ /**
217
+ * Per-language CFG-bearing functions skipped during the worker walk, bucketed
218
+ * by reason (#2195): too-many-lines, too-deeply-nested (the proactive
219
+ * depth-guard bail), or build-error. Survives the parse cache (a small number
220
+ * map, kept by `...result` in slimParseWorkerResultsForCache) and is merged +
221
+ * logged per-language in `dispatchChunkParse` (alongside `skippedLanguages`),
222
+ * so a CFG coverage gap is visible. Like that sibling telemetry the warn is
223
+ * emitted for freshly-parsed chunks, not re-emitted on a warm cache hit.
224
+ * Optional for cache backward-compatibility — older shards predate it.
225
+ */
226
+ cfgSkipped?: Record<string, CfgSkipCounts>;
214
227
  fileCount: number;
215
228
  }
216
229
  export interface ParseWorkerInput {