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,465 @@
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
+ /**
30
+ * True iff `value` survives Node's structured-clone algorithm (the same
31
+ * algorithm `postMessage` uses). This is the authoritative probe — it matches
32
+ * the real failure exactly, including Map/Set/Date/RegExp/TypedArray support,
33
+ * so it never false-positives on the `Scope` Maps that clone fine.
34
+ */
35
+ export function isStructuredCloneable(value) {
36
+ try {
37
+ structuredClone(value);
38
+ return true;
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }
44
+ /**
45
+ * Identity at runtime (zero cost — returns its argument unchanged); a
46
+ * compile-time assertion that `value` is structured-clone safe. Wrap a
47
+ * producer that feeds an `unknown` worker-result sink:
48
+ *
49
+ * collectCaptureSideChannel: (filePath) => assertCloneable(collectFoo(filePath))
50
+ *
51
+ * If `collectFoo`'s return type ever gains a non-cloneable member (a function, a
52
+ * `SyntaxNode`, …) the call fails to compile, pointing at the offending key.
53
+ *
54
+ * The parameter is a conditional type rather than an `extends Cloneable<T>`
55
+ * constraint because a self-referential constraint (`T extends Cloneable<T>`)
56
+ * is a "circular constraint" error in TypeScript. For a clone-safe `T` the
57
+ * parameter resolves to `T` (call type-checks as a plain identity); for an
58
+ * unsafe `T` it resolves to `Cloneable<T>` (which has `never` at the bad key),
59
+ * so the argument is rejected.
60
+ */
61
+ export function assertCloneable(value) {
62
+ return value;
63
+ }
64
+ /**
65
+ * Recursion cap for the module's own traversal. An over-deep subtree is treated
66
+ * as non-cloneable rather than recursing to a stack overflow — without this, a
67
+ * deeply-nested record would throw `RangeError` inside the sanitizer and (since
68
+ * the recovery path is the safety net) re-arm the very cascade #2112 fixes. Set
69
+ * far below the observed ~3000-frame overflow and far above any real
70
+ * parse-result record (extraction records are shallow plain data). Note: this
71
+ * caps the module's recursion only; `structuredClone`'s own internal recursion
72
+ * (the `isStructuredCloneable` probe of non-plain objects) is bounded by that
73
+ * helper's catch-all, which turns a probe-side `RangeError` into a
74
+ * non-cloneable verdict — so do not narrow that catch.
75
+ */
76
+ const MAX_CLONE_DEPTH = 200;
77
+ /**
78
+ * True iff `key` is a canonical array-index string (`"0"`, `"1"`, … `< 2^32-1`)
79
+ * — i.e. one of the slots the numeric index loop already visits. Everything
80
+ * else returned by `Object.keys(array)` is a NON-index own-enumerable property
81
+ * (`arr.meta = …`), which the structured-clone algorithm ALSO serializes (and
82
+ * throws on if non-cloneable). The array branches of `containsNonCloneable` and
83
+ * `stripNonCloneable` use this to scan those extra keys in lockstep.
84
+ */
85
+ function isArrayIndexKey(key) {
86
+ const n = Number(key);
87
+ return Number.isInteger(n) && n >= 0 && n < 4294967295 && String(n) === key;
88
+ }
89
+ /**
90
+ * Non-allocating scan: returns true on the FIRST value structured-clone would
91
+ * reject. Used to decide whether an array (or element) needs rewriting at all,
92
+ * so clean arrays keep their referential identity and pay no copy cost.
93
+ */
94
+ function containsNonCloneable(value, seen, depth = 0) {
95
+ const t = typeof value;
96
+ if (t === 'function' || t === 'symbol')
97
+ return true;
98
+ if (value === null || t !== 'object')
99
+ return false;
100
+ // Depth bound: treat an over-deep subtree as non-cloneable (the element is
101
+ // then stripped/dropped) instead of overflowing the stack.
102
+ if (depth >= MAX_CLONE_DEPTH)
103
+ return true;
104
+ const obj = value;
105
+ // Cycles clone fine; don't recurse into one twice.
106
+ if (seen.has(obj))
107
+ return false;
108
+ // Structured-clone-native containers carry no non-cloneable payload of their
109
+ // own; their *contents* still need scanning (a Map value could be a fn).
110
+ if (obj instanceof Date || obj instanceof RegExp)
111
+ return false;
112
+ // Buffers/views usually clone, but a DETACHED one is rejected by
113
+ // structuredClone — probe rather than wave it through. No byteLength
114
+ // heuristic: a legitimately empty `new Uint8Array(0)` also has byteLength 0
115
+ // yet clones fine, so a length check would false-positive.
116
+ if (obj instanceof ArrayBuffer || ArrayBuffer.isView(obj))
117
+ return !isStructuredCloneable(obj);
118
+ seen.add(obj);
119
+ if (Array.isArray(obj)) {
120
+ for (let i = 0; i < obj.length; i++) {
121
+ if (containsNonCloneable(obj[i], seen, depth + 1))
122
+ return true;
123
+ }
124
+ // structuredClone also serializes an array's NON-index own-enumerable
125
+ // properties and throws on a non-cloneable one — scan them too (lockstep
126
+ // with stripNonCloneable's array branch; see isArrayIndexKey).
127
+ for (const key of Object.keys(obj)) {
128
+ if (isArrayIndexKey(key))
129
+ continue;
130
+ let child;
131
+ try {
132
+ child = obj[key];
133
+ }
134
+ catch {
135
+ return true; // a throwing getter can't be serialized either
136
+ }
137
+ if (containsNonCloneable(child, seen, depth + 1))
138
+ return true;
139
+ }
140
+ return false;
141
+ }
142
+ if (obj instanceof Map) {
143
+ for (const [k, v] of obj) {
144
+ if (containsNonCloneable(k, seen, depth + 1) || containsNonCloneable(v, seen, depth + 1))
145
+ return true;
146
+ }
147
+ return false;
148
+ }
149
+ if (obj instanceof Set) {
150
+ for (const v of obj) {
151
+ if (containsNonCloneable(v, seen, depth + 1))
152
+ return true;
153
+ }
154
+ return false;
155
+ }
156
+ // A non-plain object (Promise, WeakMap, class instance with internal slots)
157
+ // that structured clone can't handle: detect via the authoritative probe.
158
+ // Plain objects fall through to a property scan (cheap, no allocation).
159
+ const proto = Object.getPrototypeOf(obj);
160
+ if (proto !== Object.prototype && proto !== null) {
161
+ if (!isStructuredCloneable(obj))
162
+ return true;
163
+ return false;
164
+ }
165
+ for (const key of Object.keys(obj)) {
166
+ let child;
167
+ try {
168
+ child = obj[key];
169
+ }
170
+ catch {
171
+ // A getter that throws can't be serialized either — treat as non-cloneable.
172
+ return true;
173
+ }
174
+ if (containsNonCloneable(child, seen, depth + 1))
175
+ return true;
176
+ }
177
+ return false;
178
+ }
179
+ /** Record a strip at `path` (root → `(root)`); keeps the count + key path in sync. */
180
+ function recordStrip(ctx, path) {
181
+ ctx.stripped++;
182
+ ctx.keys.push(path === '' ? '(root)' : path);
183
+ }
184
+ /**
185
+ * Deep-copy `value`, replacing any value structured-clone would reject with
186
+ * `undefined` (which clones fine). Preserves primitives, arrays, plain
187
+ * objects, and the structured-clone-native containers (Date, RegExp, Map,
188
+ * Set, ArrayBuffer, TypedArray). Rebuilds only what it must — clean leaves are
189
+ * returned by reference. `path` is the dotted key path of `value` (for the
190
+ * diagnostic record).
191
+ */
192
+ function stripNonCloneable(value, ctx, depth = 0, path = '') {
193
+ const t = typeof value;
194
+ if (t === 'function' || t === 'symbol') {
195
+ recordStrip(ctx, path);
196
+ return undefined;
197
+ }
198
+ if (value === null || t !== 'object')
199
+ return value;
200
+ // Depth bound (mirrors containsNonCloneable): drop an over-deep subtree to
201
+ // `undefined` (itself cloneable, and a legal property value / array element)
202
+ // rather than overflowing the stack.
203
+ if (depth >= MAX_CLONE_DEPTH) {
204
+ recordStrip(ctx, path);
205
+ return undefined;
206
+ }
207
+ const obj = value;
208
+ // Memoized? Return the SAME stripped copy (preserves DAG shape; terminates
209
+ // cycles by returning the in-progress copy inserted before recursing below).
210
+ if (ctx.seen.has(obj))
211
+ return ctx.seen.get(obj);
212
+ // Leaf-like values: returned by reference, but still memoize the decision so
213
+ // a second alias resolves identically.
214
+ if (obj instanceof Date || obj instanceof RegExp) {
215
+ ctx.seen.set(obj, value);
216
+ return value;
217
+ }
218
+ if (obj instanceof ArrayBuffer || ArrayBuffer.isView(obj)) {
219
+ // Keep a live buffer/view (even an empty one); drop a detached one, which
220
+ // structuredClone rejects. The probe is exact — no byteLength heuristic.
221
+ if (!isStructuredCloneable(obj)) {
222
+ recordStrip(ctx, path);
223
+ ctx.seen.set(obj, undefined);
224
+ return undefined;
225
+ }
226
+ ctx.seen.set(obj, value);
227
+ return value;
228
+ }
229
+ // Containers: allocate the empty copy, memoize it BEFORE recursing, then fill
230
+ // — so a cycle/alias that re-enters gets this in-progress copy.
231
+ if (Array.isArray(obj)) {
232
+ const out = [];
233
+ ctx.seen.set(obj, out);
234
+ for (let i = 0; i < obj.length; i++)
235
+ out.push(stripNonCloneable(obj[i], ctx, depth + 1, `${path}[${i}]`));
236
+ // Carry NON-index own-enumerable props through the same strip (lockstep
237
+ // with containsNonCloneable): structuredClone serializes them, so a
238
+ // non-cloneable one must be stripped rather than left to throw on re-post.
239
+ for (const key of Object.keys(obj)) {
240
+ if (isArrayIndexKey(key))
241
+ continue;
242
+ const childPath = `${path}.${key}`;
243
+ let child;
244
+ try {
245
+ child = obj[key];
246
+ }
247
+ catch {
248
+ recordStrip(ctx, childPath);
249
+ continue;
250
+ }
251
+ out[key] = stripNonCloneable(child, ctx, depth + 1, childPath);
252
+ }
253
+ return out;
254
+ }
255
+ if (obj instanceof Map) {
256
+ // Scope limit (acceptable): object keys aren't identity-preserved across
257
+ // stripping. Parse-result Maps are primitive-keyed, so this never bites.
258
+ const out = new Map();
259
+ ctx.seen.set(obj, out);
260
+ for (const [k, v] of obj)
261
+ out.set(stripNonCloneable(k, ctx, depth + 1, `${path}<key>`), stripNonCloneable(v, ctx, depth + 1, `${path}<map>`));
262
+ return out;
263
+ }
264
+ if (obj instanceof Set) {
265
+ const out = new Set();
266
+ ctx.seen.set(obj, out);
267
+ for (const v of obj)
268
+ out.add(stripNonCloneable(v, ctx, depth + 1, `${path}<set>`));
269
+ return out;
270
+ }
271
+ const proto = Object.getPrototypeOf(obj);
272
+ if (proto !== Object.prototype && proto !== null) {
273
+ // Non-plain object that the probe already flagged as non-cloneable and
274
+ // that we can't safely reconstruct (Promise, WeakMap, class instance with
275
+ // internal slots). Drop it whole — memoize the decision so aliases agree.
276
+ if (!isStructuredCloneable(obj)) {
277
+ recordStrip(ctx, path);
278
+ ctx.seen.set(obj, undefined);
279
+ return undefined;
280
+ }
281
+ ctx.seen.set(obj, value);
282
+ return value;
283
+ }
284
+ const out = {};
285
+ ctx.seen.set(obj, out);
286
+ for (const key of Object.keys(obj)) {
287
+ const childPath = path === '' ? key : `${path}.${key}`;
288
+ let child;
289
+ try {
290
+ child = obj[key];
291
+ }
292
+ catch {
293
+ // A getter that throws is non-serializable — drop the property.
294
+ recordStrip(ctx, childPath);
295
+ continue;
296
+ }
297
+ out[key] = stripNonCloneable(child, ctx, depth + 1, childPath);
298
+ }
299
+ return out;
300
+ }
301
+ /** Keys checked (top-level and one level deep) to attribute a record to a file. */
302
+ const DEFAULT_PATH_KEYS = ['filePath', 'path', 'file'];
303
+ /** Read `obj[key]`, returning undefined if the access throws (throwing getter / Proxy trap). */
304
+ function safeGet(obj, key) {
305
+ try {
306
+ return obj[key];
307
+ }
308
+ catch {
309
+ return undefined;
310
+ }
311
+ }
312
+ /** Read a path key off a child object (one level deep); never throws. */
313
+ function pathFromChild(child, pathKeys) {
314
+ if (child === null || typeof child !== 'object')
315
+ return undefined;
316
+ const crec = child;
317
+ for (const pk of pathKeys) {
318
+ const v = safeGet(crec, pk);
319
+ if (typeof v === 'string')
320
+ return v;
321
+ }
322
+ return undefined;
323
+ }
324
+ /**
325
+ * Best-effort source-path extraction for reporting; never throws. Reads are
326
+ * defensive (a throwing getter / Proxy trap on a path-attribution key must not
327
+ * escape and abandon the sanitize — it would re-arm the fail-closed cascade).
328
+ */
329
+ function findFilePath(element, pathKeys) {
330
+ if (element === null || typeof element !== 'object')
331
+ return undefined;
332
+ const rec = element;
333
+ // Top level first — a ParsedFile carries `filePath` here.
334
+ for (const key of pathKeys) {
335
+ const v = safeGet(rec, key);
336
+ if (typeof v === 'string')
337
+ return v;
338
+ }
339
+ // Known child next — a ParsedNode carries its path at `properties.filePath`.
340
+ // Prefer it over the generic sweep so attribution is deterministic when a
341
+ // sibling child also happens to carry a path-like key.
342
+ const fromProps = pathFromChild(safeGet(rec, 'properties'), pathKeys);
343
+ if (fromProps !== undefined)
344
+ return fromProps;
345
+ // Generic one-level sweep as the fallback for other shapes.
346
+ let keys;
347
+ try {
348
+ keys = Object.keys(rec);
349
+ }
350
+ catch {
351
+ return undefined; // a Proxy ownKeys trap that throws — give up on attribution
352
+ }
353
+ for (const key of keys) {
354
+ if (key === 'properties')
355
+ continue; // already checked above
356
+ const fromChild = pathFromChild(safeGet(rec, key), pathKeys);
357
+ if (fromChild !== undefined)
358
+ return fromChild;
359
+ }
360
+ return undefined;
361
+ }
362
+ /**
363
+ * Make a worker result's boundary-crossing array fields structured-cloneable,
364
+ * mutating `result` in place. Only arrays that actually contain a
365
+ * non-cloneable value are rewritten; everything else keeps referential
366
+ * identity. Returns the list of affected file paths for reporting.
367
+ *
368
+ * Call this after ANY failure of the fast-path post — a `DataCloneError`, OR a
369
+ * throwing getter's own error surfaced by structuredClone (the caller in
370
+ * `post-result.ts` recovers on any throw, not only `DataCloneError`).
371
+ */
372
+ export function makeWorkerResultCloneSafe(result, options) {
373
+ const pathKeys = options.pathKeys ?? DEFAULT_PATH_KEYS;
374
+ const skipped = [];
375
+ for (const field of Object.keys(result)) {
376
+ if (options.skipFields?.has(field))
377
+ continue;
378
+ const value = result[field];
379
+ if (!Array.isArray(value))
380
+ continue;
381
+ const dropWhole = options.dropWholeElement.has(field);
382
+ // `out` is built lazily — only once a dirty element appears — by copying the
383
+ // clean prefix, so a fully-clean array is never rebuilt and keeps its
384
+ // referential identity (no field reassignment). A dirty element is scanned
385
+ // (containsNonCloneable) and then stripped (stripNonCloneable): two passes,
386
+ // deliberately. The non-allocating pre-scan is exactly what lets CLEAN
387
+ // elements stay by reference (zero-copy) — replacing it with an
388
+ // always-allocating strip would regress that. This whole path is
389
+ // failure-path-only (the fast post already threw), so the second pass over
390
+ // the rare dirty element is acceptable.
391
+ let out = null;
392
+ for (let i = 0; i < value.length; i++) {
393
+ const element = value[i];
394
+ try {
395
+ if (!containsNonCloneable(element, new WeakSet())) {
396
+ if (out)
397
+ out.push(element);
398
+ continue;
399
+ }
400
+ if (!out)
401
+ out = value.slice(0, i); // first dirty element: copy clean prefix
402
+ const path = findFilePath(element, pathKeys) ?? '(unknown)';
403
+ if (dropWhole) {
404
+ skipped.push({ path, reason: `dropped non-serializable ${field} entry` });
405
+ continue;
406
+ }
407
+ const ctx = { stripped: 0, seen: new Map(), keys: [] };
408
+ const cleaned = stripNonCloneable(element, ctx);
409
+ // Last-resort guard: if stripping functions/symbols still left something
410
+ // structured-clone rejects, drop the element rather than re-throw.
411
+ if (isStructuredCloneable(cleaned)) {
412
+ out.push(cleaned);
413
+ // Name the offending key path(s) so the leak is locatable from the log
414
+ // (e.g. "from nodes: properties.toString") — not just the array field.
415
+ const at = ctx.keys.slice(0, 3).join(', ');
416
+ const more = ctx.keys.length > 3 ? `, …+${ctx.keys.length - 3}` : '';
417
+ skipped.push({
418
+ path,
419
+ reason: `stripped ${ctx.stripped} non-serializable value(s) from ${field}: ${at}${more}`,
420
+ });
421
+ }
422
+ else {
423
+ skipped.push({ path, reason: `dropped unsalvageable ${field} entry` });
424
+ }
425
+ }
426
+ catch {
427
+ // A throw DURING this element's scan/strip — a Proxy with a throwing
428
+ // `getPrototypeOf`/`ownKeys` trap reached by Object.getPrototypeOf /
429
+ // Object.keys, or any other structural-enumeration throw. Drop the
430
+ // element rather than let the throw escape to postResultCloneSafe's
431
+ // fail-closed {type:'error'} (which under POOL_SIZE=1 re-arms the
432
+ // cascade this net prevents). One pathological element can't sink the
433
+ // whole result.
434
+ if (!out)
435
+ out = value.slice(0, i);
436
+ skipped.push({ path: '(unknown)', reason: `dropped ${field} entry (sanitizer error)` });
437
+ }
438
+ }
439
+ if (out)
440
+ result[field] = out;
441
+ }
442
+ // Final safety gate. The loop above only rewrites ARRAY fields, so a future
443
+ // non-array result sink (a nested object / Map) — or an array field whose own
444
+ // non-index property the element loop didn't reach — could still hold a
445
+ // non-cloneable value and throw on the re-post. Make "the returned result is
446
+ // structured-cloneable" a hard postcondition: strip any remaining offending
447
+ // field in place. Failure-path-only and a no-op once the result is already
448
+ // clean (the per-field probe short-circuits every clean field).
449
+ if (!isStructuredCloneable(result)) {
450
+ for (const field of Object.keys(result)) {
451
+ if (options.skipFields?.has(field))
452
+ continue;
453
+ if (isStructuredCloneable(result[field]))
454
+ continue;
455
+ const ctx = { stripped: 0, seen: new Map(), keys: [] };
456
+ result[field] = stripNonCloneable(result[field], ctx);
457
+ const at = ctx.keys.slice(0, 3).join(', ');
458
+ skipped.push({
459
+ path: '(result)',
460
+ reason: `stripped ${ctx.stripped} non-serializable value(s) from ${field}${at ? `: ${at}` : ''}`,
461
+ });
462
+ }
463
+ }
464
+ return { skipped };
465
+ }
@@ -1,10 +1,12 @@
1
1
  import { SupportedLanguages } from '../../../_shared/index.js';
2
+ import type { SkippedPath } from './clone-safety.js';
2
3
  import type { ExtractedRouterInclude, ExtractedRouterImport, ExtractedRouterModuleAlias } from '../route-extractors/fastapi-router-bindings.js';
3
4
  import { type MixedChainStep } from '../utils/call-analysis.js';
4
5
  import type { ConstructorBinding } from '../type-env.js';
5
6
  import type { NodeLabel, ParameterTypeClass } from '../../../_shared/index.js';
6
7
  import type { ParsedFile } from '../../../_shared/index.js';
7
8
  import { type ExtractedRoute } from '../route-extractors/laravel.js';
9
+ import { type CfgSkipCounts } from '../cfg/collect.js';
8
10
  export type { ExtractedRoute } from '../route-extractors/laravel.js';
9
11
  interface ParsedNode {
10
12
  id: string;
@@ -49,6 +51,7 @@ interface ParsedSymbol {
49
51
  isReadonly?: boolean;
50
52
  isAbstract?: boolean;
51
53
  isFinal?: boolean;
54
+ isDeleted?: boolean;
52
55
  annotations?: string[];
53
56
  }
54
57
  export interface ExtractedCall {
@@ -201,6 +204,26 @@ export interface ParseWorkerResult {
201
204
  */
202
205
  parsedFiles: ParsedFile[];
203
206
  skippedLanguages: Record<string, number>;
207
+ /**
208
+ * Files whose parse output carried a value the structured-clone algorithm
209
+ * couldn't serialize across the worker boundary (#2112). The clone-safety
210
+ * net stripped or dropped the offending value so the result could be
211
+ * delivered; these paths are surfaced to the operator so the (rare) data
212
+ * loss is visible. Optional for cache backward compatibility — older cache
213
+ * entries predate the field; consumers must guard with `?? []`.
214
+ */
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>;
204
227
  fileCount: number;
205
228
  }
206
229
  export interface ParseWorkerInput {