gitnexus 1.6.8-rc.8 → 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 (439) 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 +23 -2
  135. package/dist/core/ingestion/languages/c-cpp.js +17 -5
  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 +8 -1
  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 +44 -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/clone-safety.d.ts +109 -0
  238. package/dist/core/ingestion/workers/clone-safety.js +465 -0
  239. package/dist/core/ingestion/workers/parse-worker.d.ts +23 -0
  240. package/dist/core/ingestion/workers/parse-worker.js +81 -53
  241. package/dist/core/ingestion/workers/post-result.d.ts +22 -0
  242. package/dist/core/ingestion/workers/post-result.js +87 -0
  243. package/dist/core/ingestion/workers/result-merge.d.ts +20 -0
  244. package/dist/core/ingestion/workers/result-merge.js +43 -0
  245. package/dist/core/ingestion/workers/worker-pool.d.ts +15 -40
  246. package/dist/core/ingestion/workers/worker-pool.js +43 -16
  247. package/dist/core/lbug/csv-generator.d.ts +51 -3
  248. package/dist/core/lbug/csv-generator.js +369 -255
  249. package/dist/core/lbug/lbug-adapter.d.ts +58 -18
  250. package/dist/core/lbug/lbug-adapter.js +346 -84
  251. package/dist/core/lbug/lbug-config.d.ts +19 -0
  252. package/dist/core/lbug/lbug-config.js +29 -0
  253. package/dist/core/lbug/pdg-emit-sink.d.ts +127 -0
  254. package/dist/core/lbug/pdg-emit-sink.js +358 -0
  255. package/dist/core/lbug/pool-adapter.d.ts +35 -0
  256. package/dist/core/lbug/pool-adapter.js +90 -1
  257. package/dist/core/lbug/rel-pair-routing.d.ts +54 -0
  258. package/dist/core/lbug/rel-pair-routing.js +140 -0
  259. package/dist/core/lbug/schema.d.ts +2 -2
  260. package/dist/core/lbug/schema.js +3 -0
  261. package/dist/core/logger.d.ts +0 -5
  262. package/dist/core/run-analyze.d.ts +96 -0
  263. package/dist/core/run-analyze.js +207 -3
  264. package/dist/core/tree-sitter/parser-loader.js +5 -4
  265. package/dist/core/tree-sitter/safe-parse.d.ts +0 -5
  266. package/dist/core/tree-sitter/vendored-grammars.d.ts +39 -0
  267. package/dist/core/tree-sitter/vendored-grammars.js +57 -0
  268. package/dist/core/wiki/generator.js +3 -1
  269. package/dist/core/wiki/graph-queries.d.ts +6 -0
  270. package/dist/core/wiki/graph-queries.js +9 -1
  271. package/dist/mcp/http-transport.d.ts +134 -0
  272. package/dist/mcp/http-transport.js +503 -0
  273. package/dist/mcp/local/local-backend.d.ts +110 -24
  274. package/dist/mcp/local/local-backend.js +1225 -19
  275. package/dist/mcp/local/pdg-impact.d.ts +384 -0
  276. package/dist/mcp/local/pdg-impact.js +1972 -0
  277. package/dist/mcp/resources.js +13 -1
  278. package/dist/mcp/tools.d.ts +12 -0
  279. package/dist/mcp/tools.js +214 -7
  280. package/dist/server/analyze-launch.d.ts +29 -0
  281. package/dist/server/analyze-launch.js +137 -0
  282. package/dist/server/analyze-upload.d.ts +33 -0
  283. package/dist/server/analyze-upload.js +123 -0
  284. package/dist/server/analyze-worker-ipc.d.ts +58 -0
  285. package/dist/server/analyze-worker-ipc.js +16 -0
  286. package/dist/server/analyze-worker.d.ts +17 -1
  287. package/dist/server/analyze-worker.js +7 -1
  288. package/dist/server/api.d.ts +17 -0
  289. package/dist/server/api.js +132 -168
  290. package/dist/server/git-clone.d.ts +43 -2
  291. package/dist/server/git-clone.js +211 -16
  292. package/dist/server/mcp-http.d.ts +5 -6
  293. package/dist/server/mcp-http.js +9 -82
  294. package/dist/server/middleware.d.ts +40 -0
  295. package/dist/server/middleware.js +92 -0
  296. package/dist/server/private-ip.d.ts +1 -0
  297. package/dist/server/private-ip.js +15 -0
  298. package/dist/server/upload-ingest.d.ts +56 -0
  299. package/dist/server/upload-ingest.js +276 -0
  300. package/dist/server/upload-paths.d.ts +37 -0
  301. package/dist/server/upload-paths.js +57 -0
  302. package/dist/server/upload-sweep.d.ts +20 -0
  303. package/dist/server/upload-sweep.js +57 -0
  304. package/dist/storage/git.js +5 -8
  305. package/dist/storage/parse-cache.d.ts +22 -1
  306. package/dist/storage/parse-cache.js +44 -10
  307. package/dist/storage/repo-manager.d.ts +121 -10
  308. package/dist/storage/repo-manager.js +43 -5
  309. package/dist/types/pipeline.d.ts +9 -0
  310. package/hooks/antigravity/gitnexus-antigravity-hook.cjs +110 -10
  311. package/hooks/claude/gitnexus-hook.cjs +110 -13
  312. package/hooks/claude/hook-db-lock-probe.cjs +513 -26
  313. package/package.json +8 -2
  314. package/scripts/assert-publish-grammar-coverage.cjs +31 -0
  315. package/scripts/build-tree-sitter-grammars.cjs +16 -10
  316. package/scripts/cross-platform-tests.ts +1 -0
  317. package/skills/gitnexus-debugging.md +16 -4
  318. package/skills/gitnexus-exploring.md +3 -3
  319. package/skills/gitnexus-guide.md +33 -0
  320. package/skills/gitnexus-pdg-query.md +89 -0
  321. package/skills/gitnexus-refactoring.md +1 -1
  322. package/skills/gitnexus-taint-analysis.md +178 -0
  323. package/vendor/tree-sitter-c/package.json +1 -1
  324. package/vendor/tree-sitter-dart/package.json +1 -1
  325. package/vendor/tree-sitter-kotlin/package.json +1 -1
  326. package/vendor/tree-sitter-proto/package.json +1 -1
  327. package/vendor/tree-sitter-swift/package.json +1 -1
  328. package/web/assets/{agent-CKPMqImC.js → agent-D3Xd7zZE.js} +123 -123
  329. package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +1 -0
  330. package/web/assets/architectureDiagram-UL44E2DR-ChH9xW-N.js +36 -0
  331. package/web/assets/{blockDiagram-7IZFK4PR-B4niSLvR.js → blockDiagram-7IZFK4PR-BkWhpzWB.js} +1 -1
  332. package/web/assets/{c4Diagram-Y2BXMSZH-DIzEXalR.js → c4Diagram-Y2BXMSZH-DtBvpzWD.js} +1 -1
  333. package/web/assets/{chunk-3SSMPTDK-BzGeeheI.js → chunk-3SSMPTDK-B4_etUhr.js} +2 -2
  334. package/web/assets/{chunk-5IMINLNL-CnTLsXIV.js → chunk-5IMINLNL-DOdTeQri.js} +1 -1
  335. package/web/assets/{chunk-5VCL7Z4A-w1BCx98Z.js → chunk-5VCL7Z4A-CQ-2dYWj.js} +1 -1
  336. package/web/assets/chunk-6764PJDD-DpIS7hxD.js +1 -0
  337. package/web/assets/{chunk-67TQ5CYL-CChC2cAv.js → chunk-67TQ5CYL-4sNPJU1q.js} +3 -3
  338. package/web/assets/{chunk-7W6UQGC5-CgFyfZ6k.js → chunk-7W6UQGC5-KyEG0HQg.js} +1 -1
  339. package/web/assets/{chunk-AZZRMDJM-5E9ARdDQ.js → chunk-AZZRMDJM-y-xJBuMz.js} +1 -1
  340. package/web/assets/{chunk-INKRHTLW-ELpfuk9h.js → chunk-INKRHTLW-Nu4ri9P-.js} +1 -1
  341. package/web/assets/{chunk-JQRUD6KW-Dcq_Qnyy.js → chunk-JQRUD6KW-Dbva2Z17.js} +1 -1
  342. package/web/assets/{chunk-KGFNY3KK-W-VR57xb.js → chunk-KGFNY3KK-JGMJvKCK.js} +1 -1
  343. package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +161 -0
  344. package/web/assets/{chunk-KNLZD3CH-BuZBOcso.js → chunk-KNLZD3CH-BGlP6X9R.js} +1 -1
  345. package/web/assets/{chunk-KRXBNO2N-DH2NPM7I.js → chunk-KRXBNO2N-BW5o0KUN.js} +1 -1
  346. package/web/assets/{chunk-LCXTWHL2-Dfmux4m1.js → chunk-LCXTWHL2-zoomRtWX.js} +1 -1
  347. package/web/assets/{chunk-LII3EMHJ-3X33tCpU.js → chunk-LII3EMHJ-D-jm-dLa.js} +1 -1
  348. package/web/assets/{chunk-QA3QBVWF-D5Ha3GgB.js → chunk-QA3QBVWF-BgRW3SXd.js} +1 -1
  349. package/web/assets/{chunk-RG4AUYOV-CAkzcoRj.js → chunk-RG4AUYOV-DD0B2N2B.js} +1 -1
  350. package/web/assets/{chunk-T2UQINTJ-kGYG7ppP.js → chunk-T2UQINTJ-DSBqkzH7.js} +1 -1
  351. package/web/assets/chunk-T5OCTHI4-DdZvN-9i.js +1 -0
  352. package/web/assets/{chunk-UY5QBCOK-Du-c56gs.js → chunk-UY5QBCOK-DyF0vyGd.js} +1 -1
  353. package/web/assets/{chunk-W44A43WB-lrCpuupA.js → chunk-W44A43WB-JqMLIpR0.js} +1 -1
  354. package/web/assets/{chunk-ZXARS5L4-CSZRiyOf.js → chunk-ZXARS5L4-CxN8oiwI.js} +1 -1
  355. package/web/assets/classDiagram-KGZ6W3CR-DJm9BgF-.js +1 -0
  356. package/web/assets/classDiagram-v2-72OJOZXJ-DJm9BgF-.js +1 -0
  357. package/web/assets/{context-builder-_HS0v2ma.js → context-builder-BHiFUA8O.js} +10 -2
  358. package/web/assets/{cose-bilkent-UX7MHV2Q-BHv2bbtl.js → cose-bilkent-UX7MHV2Q-D71wNYRJ.js} +1 -1
  359. package/web/assets/dagre-ND4H6XIP-BIkxmhcu.js +4 -0
  360. package/web/assets/diagram-3NCE3AQN-BTa6iH0T.js +43 -0
  361. package/web/assets/diagram-GF46GFSD-DZDV0vBj.js +24 -0
  362. package/web/assets/{diagram-HNR7UZ2L-fUWreZzx.js → diagram-HNR7UZ2L-DFCfd5LI.js} +2 -2
  363. package/web/assets/diagram-QXG6HAR7-BzM--Jj0.js +24 -0
  364. package/web/assets/diagram-WEQXMOUZ-DFFwz0k4.js +10 -0
  365. package/web/assets/{erDiagram-L5TCEMPS-QN2eEP1e.js → erDiagram-L5TCEMPS-CfHMJJqo.js} +1 -1
  366. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +1 -0
  367. package/web/assets/{flowDiagram-H6V6AXG4-CXbXImlN.js → flowDiagram-H6V6AXG4-Be805QiJ.js} +3 -3
  368. package/web/assets/{ganttDiagram-JCBTUEKG-BHQssTz6.js → ganttDiagram-JCBTUEKG-D3iL2Aet.js} +1 -1
  369. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +1 -0
  370. package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +106 -0
  371. package/web/assets/index-BvYev1UJ.js +635 -0
  372. package/web/assets/index-_lgn7hs5.css +2 -0
  373. package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +1 -0
  374. package/web/assets/infoDiagram-3YFTVSEB-Y7BKSoke.js +2 -0
  375. package/web/assets/{ishikawaDiagram-BNXS4ZKH-6LKOvBfp.js → ishikawaDiagram-BNXS4ZKH-CT4SHFuI.js} +1 -1
  376. package/web/assets/{journeyDiagram-M6C3CM3L-DNPYCpvq.js → journeyDiagram-M6C3CM3L-CvArszLo.js} +1 -1
  377. package/web/assets/{kanban-definition-75IXJCU3-DgDi9oJT.js → kanban-definition-75IXJCU3-C6yDxr7N.js} +3 -3
  378. package/web/assets/{katex-K3KEBU37-CrVLz8l7.js → katex-K3KEBU37-CTc5BslQ.js} +1 -1
  379. package/web/assets/{mindmap-definition-2TDM6QVE-CwR5sBB-.js → mindmap-definition-2TDM6QVE-BOc2WEne.js} +1 -1
  380. package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +1 -0
  381. package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +1 -0
  382. package/web/assets/{pieDiagram-CU6KROY3-By8g6f6B.js → pieDiagram-CU6KROY3-Cvc0f_Pd.js} +1 -1
  383. package/web/assets/{quadrantDiagram-VICAPDV7-bAm6Hi_5.js → quadrantDiagram-VICAPDV7-yXSZ2lLz.js} +1 -1
  384. package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +1 -0
  385. package/web/assets/{requirementDiagram-JXO7QTGE-7oDcJ1_J.js → requirementDiagram-JXO7QTGE-BRcZvHs4.js} +1 -1
  386. package/web/assets/{sankeyDiagram-URQDO5SZ-LFJz53u5.js → sankeyDiagram-URQDO5SZ-1qEjlFIB.js} +1 -1
  387. package/web/assets/{sequenceDiagram-VS2MUI6T-FySeKCUy.js → sequenceDiagram-VS2MUI6T-PcSCuvrB.js} +3 -3
  388. package/web/assets/stateDiagram-7D4R322I-D6qYSV1E.js +1 -0
  389. package/web/assets/stateDiagram-v2-36443NZ5-Bg-ImOSX.js +1 -0
  390. package/web/assets/{timeline-definition-O6YCAMPW-Ds2CnVZK.js → timeline-definition-O6YCAMPW-QWkh01xw.js} +1 -1
  391. package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +1 -0
  392. package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +1 -0
  393. package/web/assets/{vennDiagram-MWXL3ELB-DUIEwXWp.js → vennDiagram-MWXL3ELB-ak4DfwuM.js} +3 -3
  394. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +1 -0
  395. package/web/assets/{wardleyDiagram-CUQ6CDDI-DEiFPQih.js → wardleyDiagram-CUQ6CDDI-CTzR4Loq.js} +1 -1
  396. package/web/assets/{xychartDiagram-N2JHSOCM-BUbayhST.js → xychartDiagram-N2JHSOCM-DA1BEaQz.js} +1 -1
  397. package/web/index.html +13 -15
  398. package/scripts/materialize-vendor-grammars.cjs +0 -97
  399. package/web/assets/architecture-7EHR7CIX-6QZW5X65-BETj2x4g.js +0 -1
  400. package/web/assets/architectureDiagram-UL44E2DR-D1EXI0zA.js +0 -36
  401. package/web/assets/chunk-2T2R6R2M-n6s9JZqv.js +0 -4
  402. package/web/assets/chunk-2UTLFMKG-CMBB1TMN.js +0 -1
  403. package/web/assets/chunk-4R4BOZG6-mKhL59ul.js +0 -159
  404. package/web/assets/chunk-6764PJDD-ChwMM2z4.js +0 -1
  405. package/web/assets/chunk-7J6CGLKN-DT-b53FT.js +0 -10
  406. package/web/assets/chunk-C62D2QBJ-CDAWj26E.js +0 -1
  407. package/web/assets/chunk-CEXFNPSA-D68Tk6ls.js +0 -1
  408. package/web/assets/chunk-CilyBKbf.js +0 -1
  409. package/web/assets/chunk-J5EP6P6S-DxWW0yvu.js +0 -1
  410. package/web/assets/chunk-KGYTTC2M-C6PHeuay.js +0 -1
  411. package/web/assets/chunk-RERM46MO-DQNbXtfw.js +0 -1
  412. package/web/assets/chunk-RKZBBQEN-BmTPLSyv.js +0 -1
  413. package/web/assets/chunk-RLI5ZMPA-DExu2DOK.js +0 -1
  414. package/web/assets/chunk-T5OCTHI4--9wWpVws.js +0 -1
  415. package/web/assets/chunk-UP6H54XL-DsKdC6jC.js +0 -1
  416. package/web/assets/chunk-UXSXWOXI-DR81EqLr.js +0 -1
  417. package/web/assets/classDiagram-KGZ6W3CR-Bv93af_b.js +0 -1
  418. package/web/assets/classDiagram-v2-72OJOZXJ-CLfEqHUa.js +0 -1
  419. package/web/assets/dagre-ND4H6XIP-DsIr9MOv.js +0 -4
  420. package/web/assets/diagram-3NCE3AQN-BqAtKUpW.js +0 -43
  421. package/web/assets/diagram-GF46GFSD-CaBG6n6o.js +0 -24
  422. package/web/assets/diagram-QXG6HAR7-CZ-O3rcV.js +0 -24
  423. package/web/assets/diagram-WEQXMOUZ-P4lSL4GH.js +0 -10
  424. package/web/assets/eventmodeling-FCH6USID-MREXMVOE-B3myHUst.js +0 -1
  425. package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DF3rtf4A.js +0 -1
  426. package/web/assets/gitGraphDiagram-S2ZK5IYY-CCwVLT__.js +0 -106
  427. package/web/assets/index-BKWA-m7o.css +0 -2
  428. package/web/assets/index-CG6q8eTs.js +0 -626
  429. package/web/assets/info-J43DQDTF-KCYPFFUO-R4XV_akJ.js +0 -1
  430. package/web/assets/infoDiagram-3YFTVSEB-DmLICZx1.js +0 -2
  431. package/web/assets/packet-YPE3B663-LP52Z2RK-CgQPdNZa.js +0 -1
  432. package/web/assets/pie-LRSECV5Y-TCRJHUBD-BzWOwc_c.js +0 -1
  433. package/web/assets/radar-GUYGQ44K-RDLRG3WG-B7KG0FN7.js +0 -1
  434. package/web/assets/stateDiagram-7D4R322I-CB2nABwH.js +0 -1
  435. package/web/assets/stateDiagram-v2-36443NZ5-COBGd2RL.js +0 -1
  436. package/web/assets/treeView-BLDUP644-QA4HXRO3-CRSxEwLO.js +0 -1
  437. package/web/assets/treemap-LRROVOQU-LLAWBHMP-a0PfKoVn.js +0 -1
  438. package/web/assets/wardley-L42UT6IY-5TKZOOLJ-BKQ6e5mC.js +0 -1
  439. /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
  }
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Structured-clone safety for the worker result boundary (#2112).
3
+ *
4
+ * A parse worker delivers its accumulated result to the main thread via
5
+ * `parentPort.postMessage(...)`. Node serializes that payload with the
6
+ * structured-clone algorithm SYNCHRONOUSLY on the worker thread, and it
7
+ * THROWS a `DataCloneError` the instant it meets a value it can't serialize —
8
+ * a function, a symbol, a Promise, a WeakMap, etc. The reporter of #2112 hit
9
+ * exactly this: a node record whose `properties` carried an own-enumerable
10
+ * value pointing at a native function (`function toString() { [native code] }
11
+ * could not be cloned`). One such value aborted the entire parse phase,
12
+ * because the worker re-posts the throw as `{type:'error'}` which the pool
13
+ * counts as a worker death — and under `GITNEXUS_WORKER_POOL_SIZE=1` the same
14
+ * graph re-throws on every respawn until the slot's budget is exhausted.
15
+ *
16
+ * This module is the safety net. It runs ONLY after a real clone failure on
17
+ * the fast-path post (zero overhead on healthy runs), and rewrites the
18
+ * boundary-crossing arrays so the result becomes cloneable: a non-cloneable
19
+ * value inside a plain extraction record is dropped (the record is otherwise
20
+ * kept — strictly-missing data, never wrong), and a `ParsedFile` that can't be
21
+ * made cloneable is dropped whole so scope-resolution re-derives it on the
22
+ * main thread (where there is no clone boundary) with intact edge data.
23
+ *
24
+ * Language-neutral by construction: it keys on value shape and field name
25
+ * only, never on a language (AGENTS.md shared-pipeline rule). The strip
26
+ * semantics mirror what the store path's `JSON.stringify` already silently
27
+ * drops, so store / no-store / cold / warm runs converge on the same graph.
28
+ */
29
+ /** A file whose parse result was sanitized or dropped at the clone boundary. */
30
+ export interface SkippedPath {
31
+ /** Best-effort source path of the offending record (or `(unknown)`). */
32
+ path: string;
33
+ /** Human-readable reason, e.g. "dropped 1 non-serializable value from nodes". */
34
+ reason: string;
35
+ }
36
+ /**
37
+ * True iff `value` survives Node's structured-clone algorithm (the same
38
+ * algorithm `postMessage` uses). This is the authoritative probe — it matches
39
+ * the real failure exactly, including Map/Set/Date/RegExp/TypedArray support,
40
+ * so it never false-positives on the `Scope` Maps that clone fine.
41
+ */
42
+ export declare function isStructuredCloneable(value: unknown): boolean;
43
+ /** The leaf values the structured-clone algorithm copies verbatim. */
44
+ type CloneablePrimitive = undefined | null | boolean | number | bigint | string;
45
+ /**
46
+ * Maps `T` to itself when every value reachable from it is structured-clone
47
+ * safe, and to a type containing `never` at the first offending property
48
+ * otherwise. A function or symbol — the values `postMessage` rejects — becomes
49
+ * `never`, so a struct carrying one is no longer assignable to its own
50
+ * `Cloneable<T>` and `assertCloneable` rejects it, naming the bad key.
51
+ *
52
+ * Implemented as a homomorphic mapped type (`{ [K in keyof T]: … }`) so it
53
+ * preserves `interface` shapes and `readonly` modifiers and works WITHOUT
54
+ * requiring the payload types to carry an index signature — sidestepping the
55
+ * "closed interface is not assignable to a recursive index-signature type" wall
56
+ * that blocked the value-typed-`Cloneable` approach (#2143). `Map`/`Set`/array
57
+ * containers recurse into their element types; `Date`/`RegExp` are clone-safe
58
+ * leaves.
59
+ */
60
+ /** True iff `T` is `any` (the canonical `IsAny` probe: only `any` satisfies `0 extends 1 & T`). */
61
+ type IsAny<T> = 0 extends 1 & T ? true : false;
62
+ export type Cloneable<T> = IsAny<T> extends true ? never : T extends CloneablePrimitive | Date | RegExp ? T : T extends (...args: never[]) => unknown ? never : T extends symbol ? never : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<Cloneable<K>, Cloneable<V>> : T extends ReadonlySet<infer U> ? ReadonlySet<Cloneable<U>> : T extends readonly (infer U)[] ? T extends unknown[] ? Cloneable<U>[] : readonly Cloneable<U>[] : T extends object ? {
63
+ [K in keyof T]: Cloneable<T[K]>;
64
+ } : never;
65
+ /**
66
+ * Identity at runtime (zero cost — returns its argument unchanged); a
67
+ * compile-time assertion that `value` is structured-clone safe. Wrap a
68
+ * producer that feeds an `unknown` worker-result sink:
69
+ *
70
+ * collectCaptureSideChannel: (filePath) => assertCloneable(collectFoo(filePath))
71
+ *
72
+ * If `collectFoo`'s return type ever gains a non-cloneable member (a function, a
73
+ * `SyntaxNode`, …) the call fails to compile, pointing at the offending key.
74
+ *
75
+ * The parameter is a conditional type rather than an `extends Cloneable<T>`
76
+ * constraint because a self-referential constraint (`T extends Cloneable<T>`)
77
+ * is a "circular constraint" error in TypeScript. For a clone-safe `T` the
78
+ * parameter resolves to `T` (call type-checks as a plain identity); for an
79
+ * unsafe `T` it resolves to `Cloneable<T>` (which has `never` at the bad key),
80
+ * so the argument is rejected.
81
+ */
82
+ export declare function assertCloneable<T>(value: T extends Cloneable<T> ? T : Cloneable<T>): T;
83
+ export interface MakeCloneSafeOptions {
84
+ /**
85
+ * Array field names whose offending elements are DROPPED whole rather than
86
+ * stripped in place (e.g. `parsedFiles` — its `captureSideChannel` drives
87
+ * edge resolution, so a stripped-and-delivered file would ship WRONG edges;
88
+ * dropping it lets scope-resolution re-derive it on the main thread).
89
+ */
90
+ dropWholeElement: ReadonlySet<string>;
91
+ /** Field names to skip entirely (e.g. the `skippedPaths` field itself). */
92
+ skipFields?: ReadonlySet<string>;
93
+ /** Keys to probe for a file path when attributing a skip. */
94
+ pathKeys?: readonly string[];
95
+ }
96
+ /**
97
+ * Make a worker result's boundary-crossing array fields structured-cloneable,
98
+ * mutating `result` in place. Only arrays that actually contain a
99
+ * non-cloneable value are rewritten; everything else keeps referential
100
+ * identity. Returns the list of affected file paths for reporting.
101
+ *
102
+ * Call this after ANY failure of the fast-path post — a `DataCloneError`, OR a
103
+ * throwing getter's own error surfaced by structuredClone (the caller in
104
+ * `post-result.ts` recovers on any throw, not only `DataCloneError`).
105
+ */
106
+ export declare function makeWorkerResultCloneSafe(result: Record<string, unknown>, options: MakeCloneSafeOptions): {
107
+ skipped: SkippedPath[];
108
+ };
109
+ export {};