gitnexus 1.6.8-rc.9 → 1.6.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/_shared/graph/types.d.ts +31 -1
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/language-detection.d.ts.map +1 -1
- package/dist/_shared/language-detection.js +11 -1
- package/dist/_shared/language-detection.js.map +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.js +6 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/scope-resolution/parsed-file.d.ts +21 -0
- package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/symbol-definition.d.ts +6 -0
- package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +31 -1
- package/dist/cli/ai-context.js +18 -16
- package/dist/cli/analyze-config.js +11 -0
- package/dist/cli/analyze.d.ts +14 -0
- package/dist/cli/analyze.js +98 -0
- package/dist/cli/embedding-dims.d.ts +33 -0
- package/dist/cli/embedding-dims.js +39 -0
- package/dist/cli/eval-server.d.ts +8 -0
- package/dist/cli/eval-server.js +242 -2
- package/dist/cli/help-i18n.js +19 -0
- package/dist/cli/i18n/en.d.ts +15 -1
- package/dist/cli/i18n/en.js +15 -1
- package/dist/cli/i18n/resources.d.ts +29 -1
- package/dist/cli/i18n/zh-CN.d.ts +14 -0
- package/dist/cli/i18n/zh-CN.js +15 -1
- package/dist/cli/index.js +89 -1
- package/dist/cli/mcp.d.ts +6 -1
- package/dist/cli/mcp.js +26 -1
- package/dist/cli/optional-grammars.d.ts +6 -8
- package/dist/cli/optional-grammars.js +8 -11
- package/dist/cli/setup.d.ts +3 -1
- package/dist/cli/setup.js +67 -17
- package/dist/cli/skill-gen.js +2 -1
- package/dist/cli/tool.d.ts +19 -1
- package/dist/cli/tool.js +96 -3
- package/dist/core/embeddings/hf-env.d.ts +0 -66
- package/dist/core/embeddings/http-client.d.ts +7 -0
- package/dist/core/embeddings/http-client.js +5 -3
- package/dist/core/embeddings/server-mapping.d.ts +1 -1
- package/dist/core/embeddings/server-mapping.js +7 -3
- package/dist/core/graph/import-cycles.d.ts +10 -0
- package/dist/core/graph/import-cycles.js +103 -0
- package/dist/core/group/cross-impact.d.ts +2 -1
- package/dist/core/group/cross-impact.js +5 -1
- package/dist/core/group/extractors/grpc-patterns/proto.js +10 -6
- package/dist/core/group/extractors/http-patterns/kotlin.js +7 -7
- package/dist/core/group/extractors/http-route-extractor.d.ts +24 -0
- package/dist/core/group/extractors/http-route-extractor.js +22 -4
- package/dist/core/group/extractors/include-extractor.js +22 -13
- package/dist/core/group/sync.d.ts +27 -1
- package/dist/core/group/sync.js +0 -0
- package/dist/core/incremental/subgraph-extract.js +18 -1
- package/dist/core/ingestion/cfg/cfg-builder.d.ts +114 -0
- package/dist/core/ingestion/cfg/cfg-builder.js +196 -0
- package/dist/core/ingestion/cfg/collect.d.ts +51 -0
- package/dist/core/ingestion/cfg/collect.js +77 -0
- package/dist/core/ingestion/cfg/control-dependence.d.ts +58 -0
- package/dist/core/ingestion/cfg/control-dependence.js +182 -0
- package/dist/core/ingestion/cfg/control-flow-context.d.ts +106 -0
- package/dist/core/ingestion/cfg/control-flow-context.js +124 -0
- package/dist/core/ingestion/cfg/emit.d.ts +293 -0
- package/dist/core/ingestion/cfg/emit.js +646 -0
- package/dist/core/ingestion/cfg/post-dominators.d.ts +79 -0
- package/dist/core/ingestion/cfg/post-dominators.js +176 -0
- package/dist/core/ingestion/cfg/reaching-def-reason-codec.d.ts +106 -0
- package/dist/core/ingestion/cfg/reaching-def-reason-codec.js +133 -0
- package/dist/core/ingestion/cfg/reaching-defs-graph.d.ts +18 -0
- package/dist/core/ingestion/cfg/reaching-defs-graph.js +312 -0
- package/dist/core/ingestion/cfg/reaching-defs.d.ts +162 -0
- package/dist/core/ingestion/cfg/reaching-defs.js +785 -0
- package/dist/core/ingestion/cfg/synthetic-escape.d.ts +124 -0
- package/dist/core/ingestion/cfg/synthetic-escape.js +300 -0
- package/dist/core/ingestion/cfg/traversal-result.d.ts +20 -0
- package/dist/core/ingestion/cfg/traversal-result.js +2 -0
- package/dist/core/ingestion/cfg/types.d.ts +274 -0
- package/dist/core/ingestion/cfg/types.js +13 -0
- package/dist/core/ingestion/cfg/visitors/c-cpp-harvest.d.ts +111 -0
- package/dist/core/ingestion/cfg/visitors/c-cpp-harvest.js +541 -0
- package/dist/core/ingestion/cfg/visitors/c-cpp.d.ts +74 -0
- package/dist/core/ingestion/cfg/visitors/c-cpp.js +584 -0
- package/dist/core/ingestion/cfg/visitors/call-site-harvest.d.ts +195 -0
- package/dist/core/ingestion/cfg/visitors/call-site-harvest.js +350 -0
- package/dist/core/ingestion/cfg/visitors/csharp-harvest.d.ts +124 -0
- package/dist/core/ingestion/cfg/visitors/csharp-harvest.js +589 -0
- package/dist/core/ingestion/cfg/visitors/csharp.d.ts +87 -0
- package/dist/core/ingestion/cfg/visitors/csharp.js +867 -0
- package/dist/core/ingestion/cfg/visitors/dart-harvest.d.ts +278 -0
- package/dist/core/ingestion/cfg/visitors/dart-harvest.js +870 -0
- package/dist/core/ingestion/cfg/visitors/dart.d.ts +119 -0
- package/dist/core/ingestion/cfg/visitors/dart.js +836 -0
- package/dist/core/ingestion/cfg/visitors/go-harvest.d.ts +160 -0
- package/dist/core/ingestion/cfg/visitors/go-harvest.js +621 -0
- package/dist/core/ingestion/cfg/visitors/go.d.ts +108 -0
- package/dist/core/ingestion/cfg/visitors/go.js +638 -0
- package/dist/core/ingestion/cfg/visitors/java-harvest.d.ts +108 -0
- package/dist/core/ingestion/cfg/visitors/java-harvest.js +513 -0
- package/dist/core/ingestion/cfg/visitors/java.d.ts +101 -0
- package/dist/core/ingestion/cfg/visitors/java.js +812 -0
- package/dist/core/ingestion/cfg/visitors/kotlin-harvest.d.ts +253 -0
- package/dist/core/ingestion/cfg/visitors/kotlin-harvest.js +719 -0
- package/dist/core/ingestion/cfg/visitors/kotlin.d.ts +121 -0
- package/dist/core/ingestion/cfg/visitors/kotlin.js +809 -0
- package/dist/core/ingestion/cfg/visitors/php-harvest.d.ts +172 -0
- package/dist/core/ingestion/cfg/visitors/php-harvest.js +626 -0
- package/dist/core/ingestion/cfg/visitors/php.d.ts +96 -0
- package/dist/core/ingestion/cfg/visitors/php.js +721 -0
- package/dist/core/ingestion/cfg/visitors/python-harvest.d.ts +212 -0
- package/dist/core/ingestion/cfg/visitors/python-harvest.js +739 -0
- package/dist/core/ingestion/cfg/visitors/python.d.ts +103 -0
- package/dist/core/ingestion/cfg/visitors/python.js +558 -0
- package/dist/core/ingestion/cfg/visitors/ruby-harvest.d.ts +223 -0
- package/dist/core/ingestion/cfg/visitors/ruby-harvest.js +587 -0
- package/dist/core/ingestion/cfg/visitors/ruby.d.ts +112 -0
- package/dist/core/ingestion/cfg/visitors/ruby.js +756 -0
- package/dist/core/ingestion/cfg/visitors/rust-harvest.d.ts +324 -0
- package/dist/core/ingestion/cfg/visitors/rust-harvest.js +873 -0
- package/dist/core/ingestion/cfg/visitors/rust.d.ts +95 -0
- package/dist/core/ingestion/cfg/visitors/rust.js +558 -0
- package/dist/core/ingestion/cfg/visitors/scope-tree-harvest.d.ts +87 -0
- package/dist/core/ingestion/cfg/visitors/scope-tree-harvest.js +116 -0
- package/dist/core/ingestion/cfg/visitors/swift-harvest.d.ts +255 -0
- package/dist/core/ingestion/cfg/visitors/swift-harvest.js +679 -0
- package/dist/core/ingestion/cfg/visitors/swift.d.ts +116 -0
- package/dist/core/ingestion/cfg/visitors/swift.js +787 -0
- package/dist/core/ingestion/cfg/visitors/typescript-harvest.d.ts +149 -0
- package/dist/core/ingestion/cfg/visitors/typescript-harvest.js +1056 -0
- package/dist/core/ingestion/cfg/visitors/typescript.d.ts +66 -0
- package/dist/core/ingestion/cfg/visitors/typescript.js +583 -0
- package/dist/core/ingestion/import-resolvers/utils.js +2 -0
- package/dist/core/ingestion/language-provider.d.ts +11 -0
- package/dist/core/ingestion/languages/c-cpp.js +6 -1
- package/dist/core/ingestion/languages/cobol.js +4 -0
- package/dist/core/ingestion/languages/cpp/arity-metadata.js +41 -2
- package/dist/core/ingestion/languages/cpp/captures.js +50 -1
- package/dist/core/ingestion/languages/cpp/conversion-rank.d.ts +2 -0
- package/dist/core/ingestion/languages/cpp/conversion-rank.js +89 -0
- package/dist/core/ingestion/languages/cpp/header-scan.d.ts +1 -1
- package/dist/core/ingestion/languages/cpp/header-scan.js +2 -2
- package/dist/core/ingestion/languages/cpp/inline-namespaces.js +7 -2
- package/dist/core/ingestion/languages/cpp/member-lookup.js +2 -1
- package/dist/core/ingestion/languages/cpp/query.js +23 -0
- package/dist/core/ingestion/languages/cpp/scope-resolver.js +2 -1
- package/dist/core/ingestion/languages/csharp.js +2 -0
- package/dist/core/ingestion/languages/dart.js +2 -0
- package/dist/core/ingestion/languages/go.js +2 -0
- package/dist/core/ingestion/languages/java.js +3 -0
- package/dist/core/ingestion/languages/kotlin/query.js +3 -2
- package/dist/core/ingestion/languages/kotlin.js +3 -0
- package/dist/core/ingestion/languages/php.js +2 -0
- package/dist/core/ingestion/languages/python.js +2 -0
- package/dist/core/ingestion/languages/ruby.js +2 -0
- package/dist/core/ingestion/languages/rust.js +2 -0
- package/dist/core/ingestion/languages/swift.js +2 -0
- package/dist/core/ingestion/languages/typescript.js +5 -0
- package/dist/core/ingestion/languages/vue.js +6 -0
- package/dist/core/ingestion/method-extractors/configs/c-cpp.js +6 -13
- package/dist/core/ingestion/method-extractors/generic.js +1 -0
- package/dist/core/ingestion/method-types.d.ts +2 -0
- package/dist/core/ingestion/model/symbol-table.d.ts +1 -0
- package/dist/core/ingestion/model/symbol-table.js +1 -0
- package/dist/core/ingestion/mro-processor.js +109 -0
- package/dist/core/ingestion/parsing-processor.js +23 -0
- package/dist/core/ingestion/pipeline-phases/call-summaries.d.ts +26 -0
- package/dist/core/ingestion/pipeline-phases/call-summaries.js +46 -0
- package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
- package/dist/core/ingestion/pipeline-phases/index.js +2 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +0 -21
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +18 -1
- package/dist/core/ingestion/pipeline-phases/routes.d.ts +10 -0
- package/dist/core/ingestion/pipeline-phases/routes.js +30 -1
- package/dist/core/ingestion/pipeline-phases/taint-summaries.d.ts +30 -0
- package/dist/core/ingestion/pipeline-phases/taint-summaries.js +81 -0
- package/dist/core/ingestion/pipeline.d.ts +92 -10
- package/dist/core/ingestion/pipeline.js +11 -2
- package/dist/core/ingestion/scope-extractor.js +12 -2
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +9 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +75 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +67 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +12 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +14 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +6 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +13 -1
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +9 -1
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +28 -2
- package/dist/core/ingestion/scope-resolution/passes/overload-narrowing.d.ts +4 -0
- package/dist/core/ingestion/scope-resolution/passes/overload-narrowing.js +9 -0
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +6 -1
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +174 -40
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +24 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +276 -190
- package/dist/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +43 -3
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +75 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +349 -1
- package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
- package/dist/core/ingestion/taint/call-summary-codec.d.ts +75 -0
- package/dist/core/ingestion/taint/call-summary-codec.js +128 -0
- package/dist/core/ingestion/taint/call-summary-emit.d.ts +43 -0
- package/dist/core/ingestion/taint/call-summary-emit.js +70 -0
- package/dist/core/ingestion/taint/call-summary-harvest.d.ts +77 -0
- package/dist/core/ingestion/taint/call-summary-harvest.js +179 -0
- package/dist/core/ingestion/taint/call-summary-model.d.ts +47 -0
- package/dist/core/ingestion/taint/call-summary-model.js +25 -0
- package/dist/core/ingestion/taint/emit.d.ts +125 -0
- package/dist/core/ingestion/taint/emit.js +208 -0
- package/dist/core/ingestion/taint/interproc-emit.d.ts +50 -0
- package/dist/core/ingestion/taint/interproc-emit.js +88 -0
- package/dist/core/ingestion/taint/interproc-solver.d.ts +110 -0
- package/dist/core/ingestion/taint/interproc-solver.js +312 -0
- package/dist/core/ingestion/taint/match.d.ts +153 -0
- package/dist/core/ingestion/taint/match.js +278 -0
- package/dist/core/ingestion/taint/path-codec.d.ts +134 -0
- package/dist/core/ingestion/taint/path-codec.js +190 -0
- package/dist/core/ingestion/taint/propagate.d.ts +216 -0
- package/dist/core/ingestion/taint/propagate.js +659 -0
- package/dist/core/ingestion/taint/site-safety.d.ts +29 -0
- package/dist/core/ingestion/taint/site-safety.js +98 -0
- package/dist/core/ingestion/taint/source-sink-config.d.ts +107 -23
- package/dist/core/ingestion/taint/source-sink-config.js +35 -12
- package/dist/core/ingestion/taint/source-sink-registry.d.ts +6 -4
- package/dist/core/ingestion/taint/source-sink-registry.js +6 -4
- package/dist/core/ingestion/taint/summary-harvest-driver.d.ts +80 -0
- package/dist/core/ingestion/taint/summary-harvest-driver.js +179 -0
- package/dist/core/ingestion/taint/summary-harvest.d.ts +89 -0
- package/dist/core/ingestion/taint/summary-harvest.js +537 -0
- package/dist/core/ingestion/taint/summary-model.d.ts +200 -0
- package/dist/core/ingestion/taint/summary-model.js +86 -0
- package/dist/core/ingestion/taint/typescript-model.d.ts +38 -0
- package/dist/core/ingestion/taint/typescript-model.js +102 -0
- package/dist/core/ingestion/type-extractors/c-cpp.js +21 -0
- package/dist/core/ingestion/utils/env.d.ts +7 -0
- package/dist/core/ingestion/utils/env.js +12 -0
- package/dist/core/ingestion/utils/method-props.js +1 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +13 -0
- package/dist/core/ingestion/workers/parse-worker.js +76 -17
- package/dist/core/ingestion/workers/worker-pool.d.ts +9 -40
- package/dist/core/ingestion/workers/worker-pool.js +15 -2
- package/dist/core/lbug/csv-generator.d.ts +51 -3
- package/dist/core/lbug/csv-generator.js +369 -255
- package/dist/core/lbug/lbug-adapter.d.ts +58 -18
- package/dist/core/lbug/lbug-adapter.js +346 -84
- package/dist/core/lbug/lbug-config.d.ts +19 -0
- package/dist/core/lbug/lbug-config.js +29 -0
- package/dist/core/lbug/pdg-emit-sink.d.ts +127 -0
- package/dist/core/lbug/pdg-emit-sink.js +358 -0
- package/dist/core/lbug/pool-adapter.d.ts +35 -0
- package/dist/core/lbug/pool-adapter.js +90 -1
- package/dist/core/lbug/rel-pair-routing.d.ts +54 -0
- package/dist/core/lbug/rel-pair-routing.js +140 -0
- package/dist/core/lbug/schema.d.ts +2 -2
- package/dist/core/lbug/schema.js +3 -0
- package/dist/core/logger.d.ts +0 -5
- package/dist/core/run-analyze.d.ts +96 -0
- package/dist/core/run-analyze.js +207 -3
- package/dist/core/tree-sitter/parser-loader.js +5 -4
- package/dist/core/tree-sitter/safe-parse.d.ts +0 -5
- package/dist/core/tree-sitter/vendored-grammars.d.ts +39 -0
- package/dist/core/tree-sitter/vendored-grammars.js +57 -0
- package/dist/core/wiki/generator.js +3 -1
- package/dist/core/wiki/graph-queries.d.ts +6 -0
- package/dist/core/wiki/graph-queries.js +9 -1
- package/dist/mcp/http-transport.d.ts +134 -0
- package/dist/mcp/http-transport.js +503 -0
- package/dist/mcp/local/local-backend.d.ts +110 -24
- package/dist/mcp/local/local-backend.js +1225 -19
- package/dist/mcp/local/pdg-impact.d.ts +384 -0
- package/dist/mcp/local/pdg-impact.js +1972 -0
- package/dist/mcp/resources.js +13 -1
- package/dist/mcp/tools.d.ts +12 -0
- package/dist/mcp/tools.js +214 -7
- package/dist/server/analyze-launch.d.ts +29 -0
- package/dist/server/analyze-launch.js +137 -0
- package/dist/server/analyze-upload.d.ts +33 -0
- package/dist/server/analyze-upload.js +123 -0
- package/dist/server/analyze-worker.d.ts +17 -1
- package/dist/server/api.d.ts +17 -0
- package/dist/server/api.js +132 -168
- package/dist/server/git-clone.d.ts +43 -2
- package/dist/server/git-clone.js +211 -16
- package/dist/server/mcp-http.d.ts +5 -6
- package/dist/server/mcp-http.js +9 -82
- package/dist/server/middleware.d.ts +40 -0
- package/dist/server/middleware.js +92 -0
- package/dist/server/private-ip.d.ts +1 -0
- package/dist/server/private-ip.js +15 -0
- package/dist/server/upload-ingest.d.ts +56 -0
- package/dist/server/upload-ingest.js +276 -0
- package/dist/server/upload-paths.d.ts +37 -0
- package/dist/server/upload-paths.js +57 -0
- package/dist/server/upload-sweep.d.ts +20 -0
- package/dist/server/upload-sweep.js +57 -0
- package/dist/storage/git.js +5 -8
- package/dist/storage/parse-cache.d.ts +22 -1
- package/dist/storage/parse-cache.js +41 -10
- package/dist/storage/repo-manager.d.ts +121 -10
- package/dist/storage/repo-manager.js +43 -5
- package/dist/types/pipeline.d.ts +9 -0
- package/hooks/antigravity/gitnexus-antigravity-hook.cjs +110 -10
- package/hooks/claude/gitnexus-hook.cjs +110 -13
- package/hooks/claude/hook-db-lock-probe.cjs +513 -26
- package/package.json +8 -2
- package/scripts/assert-publish-grammar-coverage.cjs +31 -0
- package/scripts/build-tree-sitter-grammars.cjs +16 -10
- package/scripts/cross-platform-tests.ts +1 -0
- package/skills/gitnexus-debugging.md +16 -4
- package/skills/gitnexus-exploring.md +3 -3
- package/skills/gitnexus-guide.md +33 -0
- package/skills/gitnexus-pdg-query.md +89 -0
- package/skills/gitnexus-refactoring.md +1 -1
- package/skills/gitnexus-taint-analysis.md +178 -0
- package/vendor/tree-sitter-c/package.json +1 -1
- package/vendor/tree-sitter-dart/package.json +1 -1
- package/vendor/tree-sitter-kotlin/package.json +1 -1
- package/vendor/tree-sitter-proto/package.json +1 -1
- package/vendor/tree-sitter-swift/package.json +1 -1
- package/web/assets/{agent-CKPMqImC.js → agent-D3Xd7zZE.js} +123 -123
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +1 -0
- package/web/assets/architectureDiagram-UL44E2DR-ChH9xW-N.js +36 -0
- package/web/assets/{blockDiagram-7IZFK4PR-B4niSLvR.js → blockDiagram-7IZFK4PR-BkWhpzWB.js} +1 -1
- package/web/assets/{c4Diagram-Y2BXMSZH-DIzEXalR.js → c4Diagram-Y2BXMSZH-DtBvpzWD.js} +1 -1
- package/web/assets/{chunk-3SSMPTDK-BzGeeheI.js → chunk-3SSMPTDK-B4_etUhr.js} +2 -2
- package/web/assets/{chunk-5IMINLNL-CnTLsXIV.js → chunk-5IMINLNL-DOdTeQri.js} +1 -1
- package/web/assets/{chunk-5VCL7Z4A-w1BCx98Z.js → chunk-5VCL7Z4A-CQ-2dYWj.js} +1 -1
- package/web/assets/chunk-6764PJDD-DpIS7hxD.js +1 -0
- package/web/assets/{chunk-67TQ5CYL-CChC2cAv.js → chunk-67TQ5CYL-4sNPJU1q.js} +3 -3
- package/web/assets/{chunk-7W6UQGC5-CgFyfZ6k.js → chunk-7W6UQGC5-KyEG0HQg.js} +1 -1
- package/web/assets/{chunk-AZZRMDJM-5E9ARdDQ.js → chunk-AZZRMDJM-y-xJBuMz.js} +1 -1
- package/web/assets/{chunk-INKRHTLW-ELpfuk9h.js → chunk-INKRHTLW-Nu4ri9P-.js} +1 -1
- package/web/assets/{chunk-JQRUD6KW-Dcq_Qnyy.js → chunk-JQRUD6KW-Dbva2Z17.js} +1 -1
- package/web/assets/{chunk-KGFNY3KK-W-VR57xb.js → chunk-KGFNY3KK-JGMJvKCK.js} +1 -1
- package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +161 -0
- package/web/assets/{chunk-KNLZD3CH-BuZBOcso.js → chunk-KNLZD3CH-BGlP6X9R.js} +1 -1
- package/web/assets/{chunk-KRXBNO2N-DH2NPM7I.js → chunk-KRXBNO2N-BW5o0KUN.js} +1 -1
- package/web/assets/{chunk-LCXTWHL2-Dfmux4m1.js → chunk-LCXTWHL2-zoomRtWX.js} +1 -1
- package/web/assets/{chunk-LII3EMHJ-3X33tCpU.js → chunk-LII3EMHJ-D-jm-dLa.js} +1 -1
- package/web/assets/{chunk-QA3QBVWF-D5Ha3GgB.js → chunk-QA3QBVWF-BgRW3SXd.js} +1 -1
- package/web/assets/{chunk-RG4AUYOV-CAkzcoRj.js → chunk-RG4AUYOV-DD0B2N2B.js} +1 -1
- package/web/assets/{chunk-T2UQINTJ-kGYG7ppP.js → chunk-T2UQINTJ-DSBqkzH7.js} +1 -1
- package/web/assets/chunk-T5OCTHI4-DdZvN-9i.js +1 -0
- package/web/assets/{chunk-UY5QBCOK-Du-c56gs.js → chunk-UY5QBCOK-DyF0vyGd.js} +1 -1
- package/web/assets/{chunk-W44A43WB-lrCpuupA.js → chunk-W44A43WB-JqMLIpR0.js} +1 -1
- package/web/assets/{chunk-ZXARS5L4-CSZRiyOf.js → chunk-ZXARS5L4-CxN8oiwI.js} +1 -1
- package/web/assets/classDiagram-KGZ6W3CR-DJm9BgF-.js +1 -0
- package/web/assets/classDiagram-v2-72OJOZXJ-DJm9BgF-.js +1 -0
- package/web/assets/{context-builder-_HS0v2ma.js → context-builder-BHiFUA8O.js} +10 -2
- package/web/assets/{cose-bilkent-UX7MHV2Q-BHv2bbtl.js → cose-bilkent-UX7MHV2Q-D71wNYRJ.js} +1 -1
- package/web/assets/dagre-ND4H6XIP-BIkxmhcu.js +4 -0
- package/web/assets/diagram-3NCE3AQN-BTa6iH0T.js +43 -0
- package/web/assets/diagram-GF46GFSD-DZDV0vBj.js +24 -0
- package/web/assets/{diagram-HNR7UZ2L-fUWreZzx.js → diagram-HNR7UZ2L-DFCfd5LI.js} +2 -2
- package/web/assets/diagram-QXG6HAR7-BzM--Jj0.js +24 -0
- package/web/assets/diagram-WEQXMOUZ-DFFwz0k4.js +10 -0
- package/web/assets/{erDiagram-L5TCEMPS-QN2eEP1e.js → erDiagram-L5TCEMPS-CfHMJJqo.js} +1 -1
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +1 -0
- package/web/assets/{flowDiagram-H6V6AXG4-CXbXImlN.js → flowDiagram-H6V6AXG4-Be805QiJ.js} +3 -3
- package/web/assets/{ganttDiagram-JCBTUEKG-BHQssTz6.js → ganttDiagram-JCBTUEKG-D3iL2Aet.js} +1 -1
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +1 -0
- package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +106 -0
- package/web/assets/index-BvYev1UJ.js +635 -0
- package/web/assets/index-_lgn7hs5.css +2 -0
- package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +1 -0
- package/web/assets/infoDiagram-3YFTVSEB-Y7BKSoke.js +2 -0
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-6LKOvBfp.js → ishikawaDiagram-BNXS4ZKH-CT4SHFuI.js} +1 -1
- package/web/assets/{journeyDiagram-M6C3CM3L-DNPYCpvq.js → journeyDiagram-M6C3CM3L-CvArszLo.js} +1 -1
- package/web/assets/{kanban-definition-75IXJCU3-DgDi9oJT.js → kanban-definition-75IXJCU3-C6yDxr7N.js} +3 -3
- package/web/assets/{katex-K3KEBU37-CrVLz8l7.js → katex-K3KEBU37-CTc5BslQ.js} +1 -1
- package/web/assets/{mindmap-definition-2TDM6QVE-CwR5sBB-.js → mindmap-definition-2TDM6QVE-BOc2WEne.js} +1 -1
- package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +1 -0
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +1 -0
- package/web/assets/{pieDiagram-CU6KROY3-By8g6f6B.js → pieDiagram-CU6KROY3-Cvc0f_Pd.js} +1 -1
- package/web/assets/{quadrantDiagram-VICAPDV7-bAm6Hi_5.js → quadrantDiagram-VICAPDV7-yXSZ2lLz.js} +1 -1
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +1 -0
- package/web/assets/{requirementDiagram-JXO7QTGE-7oDcJ1_J.js → requirementDiagram-JXO7QTGE-BRcZvHs4.js} +1 -1
- package/web/assets/{sankeyDiagram-URQDO5SZ-LFJz53u5.js → sankeyDiagram-URQDO5SZ-1qEjlFIB.js} +1 -1
- package/web/assets/{sequenceDiagram-VS2MUI6T-FySeKCUy.js → sequenceDiagram-VS2MUI6T-PcSCuvrB.js} +3 -3
- package/web/assets/stateDiagram-7D4R322I-D6qYSV1E.js +1 -0
- package/web/assets/stateDiagram-v2-36443NZ5-Bg-ImOSX.js +1 -0
- package/web/assets/{timeline-definition-O6YCAMPW-Ds2CnVZK.js → timeline-definition-O6YCAMPW-QWkh01xw.js} +1 -1
- package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +1 -0
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +1 -0
- package/web/assets/{vennDiagram-MWXL3ELB-DUIEwXWp.js → vennDiagram-MWXL3ELB-ak4DfwuM.js} +3 -3
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +1 -0
- package/web/assets/{wardleyDiagram-CUQ6CDDI-DEiFPQih.js → wardleyDiagram-CUQ6CDDI-CTzR4Loq.js} +1 -1
- package/web/assets/{xychartDiagram-N2JHSOCM-BUbayhST.js → xychartDiagram-N2JHSOCM-DA1BEaQz.js} +1 -1
- package/web/index.html +13 -15
- package/scripts/materialize-vendor-grammars.cjs +0 -97
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BETj2x4g.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-D1EXI0zA.js +0 -36
- package/web/assets/chunk-2T2R6R2M-n6s9JZqv.js +0 -4
- package/web/assets/chunk-2UTLFMKG-CMBB1TMN.js +0 -1
- package/web/assets/chunk-4R4BOZG6-mKhL59ul.js +0 -159
- package/web/assets/chunk-6764PJDD-ChwMM2z4.js +0 -1
- package/web/assets/chunk-7J6CGLKN-DT-b53FT.js +0 -10
- package/web/assets/chunk-C62D2QBJ-CDAWj26E.js +0 -1
- package/web/assets/chunk-CEXFNPSA-D68Tk6ls.js +0 -1
- package/web/assets/chunk-CilyBKbf.js +0 -1
- package/web/assets/chunk-J5EP6P6S-DxWW0yvu.js +0 -1
- package/web/assets/chunk-KGYTTC2M-C6PHeuay.js +0 -1
- package/web/assets/chunk-RERM46MO-DQNbXtfw.js +0 -1
- package/web/assets/chunk-RKZBBQEN-BmTPLSyv.js +0 -1
- package/web/assets/chunk-RLI5ZMPA-DExu2DOK.js +0 -1
- package/web/assets/chunk-T5OCTHI4--9wWpVws.js +0 -1
- package/web/assets/chunk-UP6H54XL-DsKdC6jC.js +0 -1
- package/web/assets/chunk-UXSXWOXI-DR81EqLr.js +0 -1
- package/web/assets/classDiagram-KGZ6W3CR-Bv93af_b.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-CLfEqHUa.js +0 -1
- package/web/assets/dagre-ND4H6XIP-DsIr9MOv.js +0 -4
- package/web/assets/diagram-3NCE3AQN-BqAtKUpW.js +0 -43
- package/web/assets/diagram-GF46GFSD-CaBG6n6o.js +0 -24
- package/web/assets/diagram-QXG6HAR7-CZ-O3rcV.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-P4lSL4GH.js +0 -10
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-B3myHUst.js +0 -1
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DF3rtf4A.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-CCwVLT__.js +0 -106
- package/web/assets/index-BKWA-m7o.css +0 -2
- package/web/assets/index-CG6q8eTs.js +0 -626
- package/web/assets/info-J43DQDTF-KCYPFFUO-R4XV_akJ.js +0 -1
- package/web/assets/infoDiagram-3YFTVSEB-DmLICZx1.js +0 -2
- package/web/assets/packet-YPE3B663-LP52Z2RK-CgQPdNZa.js +0 -1
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-BzWOwc_c.js +0 -1
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-B7KG0FN7.js +0 -1
- package/web/assets/stateDiagram-7D4R322I-CB2nABwH.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-COBGd2RL.js +0 -1
- package/web/assets/treeView-BLDUP644-QA4HXRO3-CRSxEwLO.js +0 -1
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-a0PfKoVn.js +0 -1
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-BKQ6e5mC.js +0 -1
- /package/web/assets/{chunk-AQ6EADP3-CCFje6lL.js → chunk-AQ6EADP3-CZhslHi-.js} +0 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-function taint SUMMARY model (#2084 M4 U2).
|
|
3
|
+
*
|
|
4
|
+
* A {@link FunctionSummary} is the compact, context-insensitive abstraction of
|
|
5
|
+
* one function's taint behaviour — the input to the interprocedural fixpoint
|
|
6
|
+
* (`interproc-solver.ts`). It is the GitNexus analogue of Pysa's `.pysa`
|
|
7
|
+
* models, Mariana Trench's "propagations", and CodeQL Models-as-Data summary
|
|
8
|
+
* rows: a function is reduced to how taint enters (params / generated sources),
|
|
9
|
+
* how it moves through (param→return, param→callee-arg), and where it lands
|
|
10
|
+
* (param→sink). The fixpoint composes these across resolved `CALLS` edges so a
|
|
11
|
+
* source in one function reaches a sink in another.
|
|
12
|
+
*
|
|
13
|
+
* ## Why summaries (not whole-program IFDS)
|
|
14
|
+
*
|
|
15
|
+
* The functional/summary method (Sharir-Pnueli 1981) analyses each function
|
|
16
|
+
* ONCE and propagates the result over the call graph — the same shape Pysa,
|
|
17
|
+
* Mariana Trench, and Infer use in production. GitNexus already resolves the
|
|
18
|
+
* call graph (`CALLS` edges carry final node ids), so the summary IS the only
|
|
19
|
+
* new artifact; propagation is graph reachability over a finite lattice.
|
|
20
|
+
*
|
|
21
|
+
* ## Granularity (first cut)
|
|
22
|
+
*
|
|
23
|
+
* WHOLE-PARAMETER. Ports are `param i`, `return`, and `receiver` — no field
|
|
24
|
+
* access paths (`arg0.field.sub`). Field sensitivity, callback-parameter ports
|
|
25
|
+
* (`Argument[0].Parameter[0]`), and context sensitivity are deferred (plan
|
|
26
|
+
* KTD; the largest JS/TS FN class — closures — stays a documented gap).
|
|
27
|
+
*
|
|
28
|
+
* ## Plain-data discipline
|
|
29
|
+
*
|
|
30
|
+
* A summary is a JSON-plain value type (no functions, class instances, Maps, or
|
|
31
|
+
* Symbols) so it survives `RunScopeResolutionStats` → `ScopeResolutionOutput`
|
|
32
|
+
* threading and any future worker/cache boundary unchanged — the same
|
|
33
|
+
* `Cloneable` constraint the CFG side channel obeys.
|
|
34
|
+
*/
|
|
35
|
+
import type { SinkKind, SourceKind } from './source-sink-config.js';
|
|
36
|
+
/**
|
|
37
|
+
* Source-relative parameter index (0-based, in declaration order). A
|
|
38
|
+
* function's first parameter is `0`. Destructured / rest params map each bound
|
|
39
|
+
* name to the index of the formal parameter that introduced it (so
|
|
40
|
+
* `function f([a, b]) {}` binds both `a` and `b` to param `0`).
|
|
41
|
+
*/
|
|
42
|
+
export type ParamIndex = number;
|
|
43
|
+
/**
|
|
44
|
+
* `param i` flows into argument `argIndex` of a call at source line `callLine`.
|
|
45
|
+
* The interprocedural solver joins this to the caller's outgoing `CALLS` edges
|
|
46
|
+
* by CALLEE NAME (`calleeName`) — NOT by `callLine` — because line-base parity
|
|
47
|
+
* between the CFG harvest (1-based) and the resolved reference site is fragile,
|
|
48
|
+
* while the callee identity is exact. It then applies the callee's summary at
|
|
49
|
+
* port `param argIndex`. This is the TITO ("taint-in-taint-out") propagation
|
|
50
|
+
* edge — a param laundered into a callee, the callee's behaviour deciding what
|
|
51
|
+
* happens next.
|
|
52
|
+
*
|
|
53
|
+
* `calleeName` is the site's dotted-callee tail (best-effort); absent when the
|
|
54
|
+
* callee chain was not statically resolvable, in which case the solver
|
|
55
|
+
* conservatively matches every outgoing call (sound over-approximation).
|
|
56
|
+
* `callLine` is the 1-based statement line as harvested (`StatementFacts.line`)
|
|
57
|
+
* — carried for hop display and as a TIE-BREAKER among several same-named
|
|
58
|
+
* callees of one caller, never as the primary join key.
|
|
59
|
+
*/
|
|
60
|
+
export interface ParamToCallArg {
|
|
61
|
+
readonly param: ParamIndex;
|
|
62
|
+
readonly callLine: number;
|
|
63
|
+
readonly argIndex: number;
|
|
64
|
+
readonly calleeName?: string;
|
|
65
|
+
/**
|
|
66
|
+
* Sink kinds neutralised on EVERY harvested path from the param to this call
|
|
67
|
+
* argument (intersection-over-paths, #2084 review P1-2). A sanitizer between
|
|
68
|
+
* the param and the callee arg (`relay(x){ const y=escape(x); sinkFn(y); }`)
|
|
69
|
+
* must carry across the boundary so the callee's `paramToSink` of a
|
|
70
|
+
* neutralised kind does not fire (the cross-function false positive). Absent
|
|
71
|
+
* means none neutralised.
|
|
72
|
+
*/
|
|
73
|
+
readonly neutralized?: readonly SinkKind[];
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* `param i` flows to the function's return value (a `return <expr>` use).
|
|
77
|
+
*
|
|
78
|
+
* RESERVED — not yet consumed by the fixpoint (#2084 review P1-1). The M3
|
|
79
|
+
* statement-level floor already treats every call as propagate-through, so it
|
|
80
|
+
* taints a callee's RESULT whenever the caller passes tainted input; param→
|
|
81
|
+
* return recall is therefore already covered, and consuming `paramToReturn`
|
|
82
|
+
* would only add PRECISION (avoiding the floor's over-approximation for
|
|
83
|
+
* functions that don't actually return their param) — a larger refactor
|
|
84
|
+
* deferred. Harvested + version-stamped so the precision pass can land without
|
|
85
|
+
* a cache-namespace bump.
|
|
86
|
+
*/
|
|
87
|
+
export interface ParamToReturn {
|
|
88
|
+
readonly param: ParamIndex;
|
|
89
|
+
/** Sink kinds neutralised on EVERY path param→return (intersection). */
|
|
90
|
+
readonly neutralized?: readonly SinkKind[];
|
|
91
|
+
}
|
|
92
|
+
/** `param i` reaches a modelled sink of kind `sinkKind` inside this function. */
|
|
93
|
+
export interface ParamToSink {
|
|
94
|
+
readonly param: ParamIndex;
|
|
95
|
+
readonly sinkKind: SinkKind;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* The function itself GENERATES a source (a modelled source read, e.g.
|
|
99
|
+
* `req.body`) that reaches its return value — calling it yields tainted data
|
|
100
|
+
* with no tainted input required. The generative analogue of Pysa's
|
|
101
|
+
* `TaintSource[...]` return model. CONSUMED by the fixpoint via the caller's
|
|
102
|
+
* {@link CallResult} edges (#2084 review P1-1): a caller that uses such a
|
|
103
|
+
* function's result composes this into a finding/propagation. This is the
|
|
104
|
+
* genuinely-additive recall the floor cannot cover (the source is inside the
|
|
105
|
+
* callee — the caller passes no tainted input for the floor to propagate).
|
|
106
|
+
*/
|
|
107
|
+
export interface SourceToReturn {
|
|
108
|
+
readonly sourceKind: SourceKind;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* What a user-function call's RESULT flows into, in the CALLER (#2084 review
|
|
112
|
+
* P1-1). Recorded when a call to a (potentially generative) user function has
|
|
113
|
+
* its return value used by the caller. The fixpoint composes it with the
|
|
114
|
+
* callee's {@link SourceToReturn}: if the callee returns a generated source,
|
|
115
|
+
* the caller's downstream use of the result is tainted.
|
|
116
|
+
*/
|
|
117
|
+
export type CallResultDest = {
|
|
118
|
+
readonly to: 'sink';
|
|
119
|
+
readonly sinkKind: SinkKind;
|
|
120
|
+
} | {
|
|
121
|
+
readonly to: 'return';
|
|
122
|
+
} | {
|
|
123
|
+
readonly to: 'callArg';
|
|
124
|
+
readonly toCallee?: string;
|
|
125
|
+
readonly argIndex: ParamIndex;
|
|
126
|
+
};
|
|
127
|
+
/** The result of a call to `calleeName` flows to `dest` in this function. */
|
|
128
|
+
export interface CallResult {
|
|
129
|
+
readonly calleeName: string;
|
|
130
|
+
readonly dest: CallResultDest;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* A modelled source generated in this function flows into argument `argIndex`
|
|
134
|
+
* of a call at `callLine`. This SEEDS the interprocedural fixpoint: the source
|
|
135
|
+
* taints the callee's parameter, which the callee's summary then carries to a
|
|
136
|
+
* sink (one or more hops away). The cross-function analogue of an intra-
|
|
137
|
+
* procedural `source → sink` partial flow whose sink lives in the callee.
|
|
138
|
+
*/
|
|
139
|
+
export interface SourceToCallArg {
|
|
140
|
+
readonly sourceKind: SourceKind;
|
|
141
|
+
/** Carried for hop display + same-name tie-break; NOT the join key (see
|
|
142
|
+
* {@link ParamToCallArg} — the solver joins by `calleeName`). */
|
|
143
|
+
readonly callLine: number;
|
|
144
|
+
readonly argIndex: number;
|
|
145
|
+
readonly calleeName?: string;
|
|
146
|
+
/** Sink kinds neutralised on EVERY path from the generated source to this
|
|
147
|
+
* call argument (intersection; #2084 review P1-2 — see {@link ParamToCallArg}). */
|
|
148
|
+
readonly neutralized?: readonly SinkKind[];
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* The compact taint abstraction of one function. All arrays are deterministically
|
|
152
|
+
* sorted by the harvester and deduped, so two structurally-equal summaries
|
|
153
|
+
* serialise identically (the {@link summaryVersion} contract).
|
|
154
|
+
*/
|
|
155
|
+
export interface FunctionSummary {
|
|
156
|
+
/** The resolved `Function`/`Method` graph node id this summary describes. */
|
|
157
|
+
readonly fnId: string;
|
|
158
|
+
/** Repo-relative source path (carried for diagnostics + the join debug). */
|
|
159
|
+
readonly filePath: string;
|
|
160
|
+
/** 1-based function start line (mirrors `FunctionCfg.functionStartLine`). */
|
|
161
|
+
readonly startLine: number;
|
|
162
|
+
/** Number of declared formal parameters (port arity). */
|
|
163
|
+
readonly paramCount: number;
|
|
164
|
+
/** param→return TITO edges. */
|
|
165
|
+
readonly paramToReturn: readonly ParamToReturn[];
|
|
166
|
+
/** param→callee-arg TITO edges (composed across `CALLS` in the fixpoint). */
|
|
167
|
+
readonly paramToCallArg: readonly ParamToCallArg[];
|
|
168
|
+
/** param→sink partial flows (a source reaching this param triggers a finding). */
|
|
169
|
+
readonly paramToSink: readonly ParamToSink[];
|
|
170
|
+
/** Generative source→return models. */
|
|
171
|
+
readonly sourceToReturn: readonly SourceToReturn[];
|
|
172
|
+
/** Generative source→callee-arg seeds (fixpoint entry points). */
|
|
173
|
+
readonly sourceToCallArg: readonly SourceToCallArg[];
|
|
174
|
+
/** Caller-side call-result flows — compose with callee `sourceToReturn`. */
|
|
175
|
+
readonly callResults: readonly CallResult[];
|
|
176
|
+
/**
|
|
177
|
+
* Content version stamp — `hash(own-facts ∪ sorted callee versions)`. The
|
|
178
|
+
* incremental cache key (Infer's content-keyed summary): equal across two
|
|
179
|
+
* runs iff the function's own taint facts AND every callee summary it depends
|
|
180
|
+
* on are unchanged. NOTE (#2084 review P1-1): callee-version composition is
|
|
181
|
+
* RESERVED — the harvester stamps the own-facts portion only
|
|
182
|
+
* ({@link ownFactsDigest}); the fixpoint does not yet recompose it.
|
|
183
|
+
*/
|
|
184
|
+
readonly version: string;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Deterministic digest of a summary's OWN taint facts (everything except
|
|
188
|
+
* `version`, which is derived). Order-independent within each edge category —
|
|
189
|
+
* the harvester already sorts, but the digest re-canonicalises so a reordering
|
|
190
|
+
* never changes the stamp. Used as the leaf of {@link summaryVersion}.
|
|
191
|
+
*/
|
|
192
|
+
export declare function ownFactsDigest(s: Pick<FunctionSummary, 'paramCount' | 'paramToReturn' | 'paramToCallArg' | 'paramToSink' | 'sourceToReturn' | 'sourceToCallArg' | 'callResults'>): string;
|
|
193
|
+
/**
|
|
194
|
+
* Content version stamp for a summary: `hash(ownFactsDigest ∪ sorted callee
|
|
195
|
+
* versions)`. Order-independent over callee versions (sorted). Equal iff the
|
|
196
|
+
* function's own facts AND every callee dependency are unchanged — this is the
|
|
197
|
+
* incremental invalidation primitive (a changed callee changes its version,
|
|
198
|
+
* which changes every transitive caller's version).
|
|
199
|
+
*/
|
|
200
|
+
export declare function summaryVersion(ownDigest: string, calleeVersions: readonly string[]): string;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-function taint SUMMARY model (#2084 M4 U2).
|
|
3
|
+
*
|
|
4
|
+
* A {@link FunctionSummary} is the compact, context-insensitive abstraction of
|
|
5
|
+
* one function's taint behaviour — the input to the interprocedural fixpoint
|
|
6
|
+
* (`interproc-solver.ts`). It is the GitNexus analogue of Pysa's `.pysa`
|
|
7
|
+
* models, Mariana Trench's "propagations", and CodeQL Models-as-Data summary
|
|
8
|
+
* rows: a function is reduced to how taint enters (params / generated sources),
|
|
9
|
+
* how it moves through (param→return, param→callee-arg), and where it lands
|
|
10
|
+
* (param→sink). The fixpoint composes these across resolved `CALLS` edges so a
|
|
11
|
+
* source in one function reaches a sink in another.
|
|
12
|
+
*
|
|
13
|
+
* ## Why summaries (not whole-program IFDS)
|
|
14
|
+
*
|
|
15
|
+
* The functional/summary method (Sharir-Pnueli 1981) analyses each function
|
|
16
|
+
* ONCE and propagates the result over the call graph — the same shape Pysa,
|
|
17
|
+
* Mariana Trench, and Infer use in production. GitNexus already resolves the
|
|
18
|
+
* call graph (`CALLS` edges carry final node ids), so the summary IS the only
|
|
19
|
+
* new artifact; propagation is graph reachability over a finite lattice.
|
|
20
|
+
*
|
|
21
|
+
* ## Granularity (first cut)
|
|
22
|
+
*
|
|
23
|
+
* WHOLE-PARAMETER. Ports are `param i`, `return`, and `receiver` — no field
|
|
24
|
+
* access paths (`arg0.field.sub`). Field sensitivity, callback-parameter ports
|
|
25
|
+
* (`Argument[0].Parameter[0]`), and context sensitivity are deferred (plan
|
|
26
|
+
* KTD; the largest JS/TS FN class — closures — stays a documented gap).
|
|
27
|
+
*
|
|
28
|
+
* ## Plain-data discipline
|
|
29
|
+
*
|
|
30
|
+
* A summary is a JSON-plain value type (no functions, class instances, Maps, or
|
|
31
|
+
* Symbols) so it survives `RunScopeResolutionStats` → `ScopeResolutionOutput`
|
|
32
|
+
* threading and any future worker/cache boundary unchanged — the same
|
|
33
|
+
* `Cloneable` constraint the CFG side channel obeys.
|
|
34
|
+
*/
|
|
35
|
+
/** Stable FNV-1a 32-bit hash → 8-char hex. Pure, deterministic, no deps. */
|
|
36
|
+
function fnv1a(input) {
|
|
37
|
+
let h = 0x811c9dc5;
|
|
38
|
+
for (let i = 0; i < input.length; i++) {
|
|
39
|
+
h ^= input.charCodeAt(i);
|
|
40
|
+
// 32-bit FNV prime multiply via shifts (avoids BigInt; stays in int32 land).
|
|
41
|
+
h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0;
|
|
42
|
+
}
|
|
43
|
+
return (h >>> 0).toString(16).padStart(8, '0');
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Deterministic digest of a summary's OWN taint facts (everything except
|
|
47
|
+
* `version`, which is derived). Order-independent within each edge category —
|
|
48
|
+
* the harvester already sorts, but the digest re-canonicalises so a reordering
|
|
49
|
+
* never changes the stamp. Used as the leaf of {@link summaryVersion}.
|
|
50
|
+
*/
|
|
51
|
+
export function ownFactsDigest(s) {
|
|
52
|
+
const parts = [`p${s.paramCount}`];
|
|
53
|
+
parts.push(...s.paramToReturn
|
|
54
|
+
.map((r) => `r:${r.param}:${[...(r.neutralized ?? [])].sort().join(',')}`)
|
|
55
|
+
.sort());
|
|
56
|
+
parts.push(...s.paramToCallArg
|
|
57
|
+
.map((c) => `c:${c.param}:${c.callLine}:${c.argIndex}:${c.calleeName ?? ''}:${[...(c.neutralized ?? [])].sort().join(',')}`)
|
|
58
|
+
.sort());
|
|
59
|
+
parts.push(...s.paramToSink.map((k) => `k:${k.param}:${k.sinkKind}`).sort());
|
|
60
|
+
parts.push(...s.sourceToReturn.map((g) => `g:${g.sourceKind}`).sort());
|
|
61
|
+
parts.push(...s.sourceToCallArg
|
|
62
|
+
.map((g) => `s:${g.sourceKind}:${g.callLine}:${g.argIndex}:${g.calleeName ?? ''}:${[...(g.neutralized ?? [])].sort().join(',')}`)
|
|
63
|
+
.sort());
|
|
64
|
+
parts.push(...s.callResults
|
|
65
|
+
.map((cr) => {
|
|
66
|
+
const d = cr.dest;
|
|
67
|
+
const dest = d.to === 'sink'
|
|
68
|
+
? `sink:${d.sinkKind}`
|
|
69
|
+
: d.to === 'return'
|
|
70
|
+
? 'return'
|
|
71
|
+
: `arg:${d.toCallee ?? ''}:${d.argIndex}`;
|
|
72
|
+
return `cr:${cr.calleeName}:${dest}`;
|
|
73
|
+
})
|
|
74
|
+
.sort());
|
|
75
|
+
return fnv1a(parts.join('|'));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Content version stamp for a summary: `hash(ownFactsDigest ∪ sorted callee
|
|
79
|
+
* versions)`. Order-independent over callee versions (sorted). Equal iff the
|
|
80
|
+
* function's own facts AND every callee dependency are unchanged — this is the
|
|
81
|
+
* incremental invalidation primitive (a changed callee changes its version,
|
|
82
|
+
* which changes every transitive caller's version).
|
|
83
|
+
*/
|
|
84
|
+
export function summaryVersion(ownDigest, calleeVersions) {
|
|
85
|
+
return fnv1a(`${ownDigest}#${[...calleeVersions].sort().join(',')}`);
|
|
86
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in TS/JS taint model (#2083 M3 U2, plan KTD7).
|
|
3
|
+
*
|
|
4
|
+
* The canonical Express/Node source/sink/sanitizer set, registered for the
|
|
5
|
+
* `typescript` and `javascript` language ids via the EXPLICIT
|
|
6
|
+
* {@link registerBuiltinTaintModels} seam — deliberately not an import
|
|
7
|
+
* side-effect, so the U4 emit path controls WHEN registration happens (call
|
|
8
|
+
* it once before the pdg window runs; it is idempotent — the registry is
|
|
9
|
+
* last-write-wins on the same language id).
|
|
10
|
+
*
|
|
11
|
+
* `taintModelVersion` is a deterministic digest of the FULL model content
|
|
12
|
+
* (entries, kinds, args, modules). It joins the RepoMeta `pdg` stamp in U5 so
|
|
13
|
+
* that ANY model change — adding an entry, relabeling a kind — trips full
|
|
14
|
+
* writeback on an existing `--pdg` index (R7): persisted findings must never
|
|
15
|
+
* outlive the model that produced them.
|
|
16
|
+
*/
|
|
17
|
+
import type { SourceSinkSanitizerSpec } from './source-sink-config.js';
|
|
18
|
+
/**
|
|
19
|
+
* The built-in TS/JS model. Module provenance uses bare specifier names —
|
|
20
|
+
* the matcher normalizes the `node:` scheme prefix, so `import { exec } from
|
|
21
|
+
* 'node:child_process'` resolves identically.
|
|
22
|
+
*/
|
|
23
|
+
export declare const TS_JS_TAINT_MODEL: SourceSinkSanitizerSpec;
|
|
24
|
+
/**
|
|
25
|
+
* Deterministic digest of a spec's full content. Key order is canonicalized
|
|
26
|
+
* (recursively sorted) so the version reflects CONTENT, not literal layout;
|
|
27
|
+
* array order is semantic (entry identity) and intentionally preserved.
|
|
28
|
+
*/
|
|
29
|
+
export declare function computeTaintModelVersion(spec: SourceSinkSanitizerSpec): string;
|
|
30
|
+
/** Version stamp of the built-in TS/JS model (joins the RepoMeta pdg key in U5). */
|
|
31
|
+
export declare const taintModelVersion: string;
|
|
32
|
+
/**
|
|
33
|
+
* Register the built-in model for TypeScript and JavaScript. Explicit init
|
|
34
|
+
* seam for the U4 emit path (call before the pdg window consumes the
|
|
35
|
+
* registry); idempotent. Vue and other TS-adjacent language ids are
|
|
36
|
+
* deliberately NOT registered — the M3 scope is TS/JS only.
|
|
37
|
+
*/
|
|
38
|
+
export declare function registerBuiltinTaintModels(): void;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in TS/JS taint model (#2083 M3 U2, plan KTD7).
|
|
3
|
+
*
|
|
4
|
+
* The canonical Express/Node source/sink/sanitizer set, registered for the
|
|
5
|
+
* `typescript` and `javascript` language ids via the EXPLICIT
|
|
6
|
+
* {@link registerBuiltinTaintModels} seam — deliberately not an import
|
|
7
|
+
* side-effect, so the U4 emit path controls WHEN registration happens (call
|
|
8
|
+
* it once before the pdg window runs; it is idempotent — the registry is
|
|
9
|
+
* last-write-wins on the same language id).
|
|
10
|
+
*
|
|
11
|
+
* `taintModelVersion` is a deterministic digest of the FULL model content
|
|
12
|
+
* (entries, kinds, args, modules). It joins the RepoMeta `pdg` stamp in U5 so
|
|
13
|
+
* that ANY model change — adding an entry, relabeling a kind — trips full
|
|
14
|
+
* writeback on an existing `--pdg` index (R7): persisted findings must never
|
|
15
|
+
* outlive the model that produced them.
|
|
16
|
+
*/
|
|
17
|
+
import { createHash } from 'node:crypto';
|
|
18
|
+
import { SupportedLanguages } from '../../../_shared/index.js';
|
|
19
|
+
import { registerSourceSinkConfig } from './source-sink-registry.js';
|
|
20
|
+
/**
|
|
21
|
+
* The built-in TS/JS model. Module provenance uses bare specifier names —
|
|
22
|
+
* the matcher normalizes the `node:` scheme prefix, so `import { exec } from
|
|
23
|
+
* 'node:child_process'` resolves identically.
|
|
24
|
+
*/
|
|
25
|
+
export const TS_JS_TAINT_MODEL = {
|
|
26
|
+
sources: [
|
|
27
|
+
// Express-convention request member reads, matched name-based on the
|
|
28
|
+
// receiver (`req`/`request`) — the plan's accepted Semgrep-style trade.
|
|
29
|
+
{
|
|
30
|
+
kind: 'remote-input',
|
|
31
|
+
objects: ['req', 'request'],
|
|
32
|
+
properties: ['body', 'query', 'params', 'headers', 'cookies'],
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
sinks: [
|
|
36
|
+
// Command execution — the command string is argument 0.
|
|
37
|
+
{ name: 'exec', kind: 'command-injection', args: [0], module: 'child_process' },
|
|
38
|
+
{ name: 'execSync', kind: 'command-injection', args: [0], module: 'child_process' },
|
|
39
|
+
{ name: 'spawn', kind: 'command-injection', args: [0], module: 'child_process' },
|
|
40
|
+
// Code evaluation. `eval` takes code at 0; `new Function(...)` treats
|
|
41
|
+
// EVERY argument as source text (params + body), so `args` is omitted
|
|
42
|
+
// (= all positions) rather than pinned to 0.
|
|
43
|
+
{ name: 'eval', kind: 'code-injection', args: [0], global: true },
|
|
44
|
+
{ name: 'Function', kind: 'code-injection', global: true, newOnly: true },
|
|
45
|
+
// Filesystem path consumption — path argument 0.
|
|
46
|
+
{ name: 'readFile', kind: 'path-traversal', args: [0], module: 'fs' },
|
|
47
|
+
{ name: 'readFileSync', kind: 'path-traversal', args: [0], module: 'fs' },
|
|
48
|
+
{ name: 'writeFile', kind: 'path-traversal', args: [0], module: 'fs' },
|
|
49
|
+
{ name: 'writeFileSync', kind: 'path-traversal', args: [0], module: 'fs' },
|
|
50
|
+
// SQL — `.query(sql)` / `.execute(sql)` member calls on ANY receiver
|
|
51
|
+
// (mysql2/pg/knex handles go by many names; receiver-conventional).
|
|
52
|
+
{ name: 'query', kind: 'sql-injection', args: [0], anyReceiver: true },
|
|
53
|
+
{ name: 'execute', kind: 'sql-injection', args: [0], anyReceiver: true },
|
|
54
|
+
// Reflected XSS — Express response writes, conventional receiver `res`.
|
|
55
|
+
{ name: 'send', kind: 'xss', args: [0], receivers: ['res'] },
|
|
56
|
+
{ name: 'write', kind: 'xss', args: [0], receivers: ['res'] },
|
|
57
|
+
],
|
|
58
|
+
sanitizers: [
|
|
59
|
+
// URL-encoding: neutralizes markup injection AND path separators
|
|
60
|
+
// (`%2F` is not a separator inside a path component).
|
|
61
|
+
{ name: 'encodeURIComponent', neutralizes: ['xss', 'path-traversal'], global: true },
|
|
62
|
+
// `escape-html` exports its function as the module default — the
|
|
63
|
+
// `'default'` pseudo-name matches the default-imported / require'd
|
|
64
|
+
// module handle being invoked directly.
|
|
65
|
+
{ name: 'default', neutralizes: ['xss'], module: 'escape-html' },
|
|
66
|
+
{ name: 'encode', neutralizes: ['xss'], module: 'he' },
|
|
67
|
+
{ name: 'basename', neutralizes: ['path-traversal'], module: 'path' },
|
|
68
|
+
{ name: 'escape', neutralizes: ['xss'], module: 'validator' },
|
|
69
|
+
],
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Deterministic digest of a spec's full content. Key order is canonicalized
|
|
73
|
+
* (recursively sorted) so the version reflects CONTENT, not literal layout;
|
|
74
|
+
* array order is semantic (entry identity) and intentionally preserved.
|
|
75
|
+
*/
|
|
76
|
+
export function computeTaintModelVersion(spec) {
|
|
77
|
+
return createHash('sha256').update(canonicalJson(spec)).digest('hex').slice(0, 12);
|
|
78
|
+
}
|
|
79
|
+
function canonicalJson(value) {
|
|
80
|
+
if (Array.isArray(value))
|
|
81
|
+
return `[${value.map(canonicalJson).join(',')}]`;
|
|
82
|
+
if (value !== null && typeof value === 'object') {
|
|
83
|
+
const entries = Object.entries(value)
|
|
84
|
+
.filter(([, v]) => v !== undefined)
|
|
85
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
|
|
86
|
+
.map(([k, v]) => `${JSON.stringify(k)}:${canonicalJson(v)}`);
|
|
87
|
+
return `{${entries.join(',')}}`;
|
|
88
|
+
}
|
|
89
|
+
return JSON.stringify(value);
|
|
90
|
+
}
|
|
91
|
+
/** Version stamp of the built-in TS/JS model (joins the RepoMeta pdg key in U5). */
|
|
92
|
+
export const taintModelVersion = computeTaintModelVersion(TS_JS_TAINT_MODEL);
|
|
93
|
+
/**
|
|
94
|
+
* Register the built-in model for TypeScript and JavaScript. Explicit init
|
|
95
|
+
* seam for the U4 emit path (call before the pdg window consumes the
|
|
96
|
+
* registry); idempotent. Vue and other TS-adjacent language ids are
|
|
97
|
+
* deliberately NOT registered — the M3 scope is TS/JS only.
|
|
98
|
+
*/
|
|
99
|
+
export function registerBuiltinTaintModels() {
|
|
100
|
+
registerSourceSinkConfig(SupportedLanguages.TypeScript, TS_JS_TAINT_MODEL);
|
|
101
|
+
registerSourceSinkConfig(SupportedLanguages.JavaScript, TS_JS_TAINT_MODEL);
|
|
102
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { extractSimpleTypeName, extractVarName, resolveIterableElementType, methodToTypeArgPosition, } from './shared.js';
|
|
2
|
+
import { CPP_BRACED_INIT_TYPE_PREFIX } from '../languages/cpp/conversion-rank.js';
|
|
2
3
|
const DECLARATION_NODE_TYPES = new Set(['declaration']);
|
|
3
4
|
/** Smart pointer factory function names that create a typed object. */
|
|
4
5
|
const SMART_PTR_FACTORIES = new Set(['make_shared', 'make_unique', 'make_shared_for_overwrite']);
|
|
@@ -447,6 +448,8 @@ const extractForLoopBinding = (node, { scopeEnv, declarationTypeNodes, scope })
|
|
|
447
448
|
/** Infer the type of a literal AST node for C++ overload disambiguation. */
|
|
448
449
|
const inferLiteralType = (node) => {
|
|
449
450
|
switch (node.type) {
|
|
451
|
+
case 'initializer_list':
|
|
452
|
+
return inferBracedInitLiteralType(node);
|
|
450
453
|
case 'number_literal': {
|
|
451
454
|
const t = node.text;
|
|
452
455
|
// Float suffixes
|
|
@@ -475,6 +478,24 @@ const inferLiteralType = (node) => {
|
|
|
475
478
|
return undefined;
|
|
476
479
|
}
|
|
477
480
|
};
|
|
481
|
+
function inferBracedInitLiteralType(node) {
|
|
482
|
+
const elementTypes = [];
|
|
483
|
+
for (const child of node.children) {
|
|
484
|
+
if (child.type === ',' || child.type === '{' || child.type === '}')
|
|
485
|
+
continue;
|
|
486
|
+
const elementType = inferLiteralType(child);
|
|
487
|
+
if (elementType === undefined || elementType.startsWith(CPP_BRACED_INIT_TYPE_PREFIX)) {
|
|
488
|
+
return `${CPP_BRACED_INIT_TYPE_PREFIX}unknown:${elementTypes.length + 1}`;
|
|
489
|
+
}
|
|
490
|
+
elementTypes.push(elementType);
|
|
491
|
+
}
|
|
492
|
+
if (elementTypes.length === 0)
|
|
493
|
+
return `${CPP_BRACED_INIT_TYPE_PREFIX}unknown:0`;
|
|
494
|
+
const first = elementTypes[0];
|
|
495
|
+
return elementTypes.every((type) => type === first)
|
|
496
|
+
? `${CPP_BRACED_INIT_TYPE_PREFIX}${first}:${elementTypes.length}`
|
|
497
|
+
: `${CPP_BRACED_INIT_TYPE_PREFIX}unknown:${elementTypes.length}`;
|
|
498
|
+
}
|
|
478
499
|
/** C++: detect constructor type from smart pointer factory calls (make_shared<Dog>()).
|
|
479
500
|
* Extracts the template type argument as the constructor type for virtual dispatch. */
|
|
480
501
|
const detectCppConstructorType = (node, classNames) => {
|
|
@@ -21,6 +21,13 @@ export declare const isDev: boolean;
|
|
|
21
21
|
* conventions and serves a different purpose.
|
|
22
22
|
*/
|
|
23
23
|
export declare const parseTruthyEnv: (raw: string | undefined) => boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Parse a positive-integer env-var value. Returns the integer when `raw` is a
|
|
26
|
+
* finite integer `> 0`; otherwise (`undefined`, empty, non-numeric, `0`, or
|
|
27
|
+
* negative) returns `undefined` so the caller falls back to its default. Used
|
|
28
|
+
* for numeric tuning knobs like `GITNEXUS_PDG_EMIT_CHUNK_SIZE` (#2202).
|
|
29
|
+
*/
|
|
30
|
+
export declare const parsePositiveIntEnv: (raw: string | undefined) => number | undefined;
|
|
24
31
|
/**
|
|
25
32
|
* Whether scope-resolution dev validators (e.g. `validateBindingsImmutability`)
|
|
26
33
|
* should run AND emit warnings. Off by default in CLI runs to avoid silent
|
|
@@ -26,6 +26,18 @@ export const parseTruthyEnv = (raw) => {
|
|
|
26
26
|
const value = raw.trim().toLowerCase();
|
|
27
27
|
return value === '1' || value === 'true' || value === 'yes';
|
|
28
28
|
};
|
|
29
|
+
/**
|
|
30
|
+
* Parse a positive-integer env-var value. Returns the integer when `raw` is a
|
|
31
|
+
* finite integer `> 0`; otherwise (`undefined`, empty, non-numeric, `0`, or
|
|
32
|
+
* negative) returns `undefined` so the caller falls back to its default. Used
|
|
33
|
+
* for numeric tuning knobs like `GITNEXUS_PDG_EMIT_CHUNK_SIZE` (#2202).
|
|
34
|
+
*/
|
|
35
|
+
export const parsePositiveIntEnv = (raw) => {
|
|
36
|
+
if (raw === undefined)
|
|
37
|
+
return undefined;
|
|
38
|
+
const n = Number(raw.trim());
|
|
39
|
+
return Number.isInteger(n) && n > 0 ? n : undefined;
|
|
40
|
+
};
|
|
29
41
|
/**
|
|
30
42
|
* Whether scope-resolution dev validators (e.g. `validateBindingsImmutability`)
|
|
31
43
|
* should run AND emit warnings. Off by default in CLI runs to avoid silent
|
|
@@ -184,6 +184,7 @@ export function buildMethodProps(info) {
|
|
|
184
184
|
...(info.isAsync ? { isAsync: info.isAsync } : {}),
|
|
185
185
|
...(info.isPartial ? { isPartial: info.isPartial } : {}),
|
|
186
186
|
...(info.isConst ? { isConst: info.isConst } : {}),
|
|
187
|
+
...(info.isDeleted ? { isDeleted: info.isDeleted } : {}),
|
|
187
188
|
...(info.annotations.length > 0 ? { annotations: info.annotations } : {}),
|
|
188
189
|
};
|
|
189
190
|
}
|
|
@@ -6,6 +6,7 @@ import type { ConstructorBinding } from '../type-env.js';
|
|
|
6
6
|
import type { NodeLabel, ParameterTypeClass } from '../../../_shared/index.js';
|
|
7
7
|
import type { ParsedFile } from '../../../_shared/index.js';
|
|
8
8
|
import { type ExtractedRoute } from '../route-extractors/laravel.js';
|
|
9
|
+
import { type CfgSkipCounts } from '../cfg/collect.js';
|
|
9
10
|
export type { ExtractedRoute } from '../route-extractors/laravel.js';
|
|
10
11
|
interface ParsedNode {
|
|
11
12
|
id: string;
|
|
@@ -50,6 +51,7 @@ interface ParsedSymbol {
|
|
|
50
51
|
isReadonly?: boolean;
|
|
51
52
|
isAbstract?: boolean;
|
|
52
53
|
isFinal?: boolean;
|
|
54
|
+
isDeleted?: boolean;
|
|
53
55
|
annotations?: string[];
|
|
54
56
|
}
|
|
55
57
|
export interface ExtractedCall {
|
|
@@ -211,6 +213,17 @@ export interface ParseWorkerResult {
|
|
|
211
213
|
* entries predate the field; consumers must guard with `?? []`.
|
|
212
214
|
*/
|
|
213
215
|
skippedPaths?: SkippedPath[];
|
|
216
|
+
/**
|
|
217
|
+
* Per-language CFG-bearing functions skipped during the worker walk, bucketed
|
|
218
|
+
* by reason (#2195): too-many-lines, too-deeply-nested (the proactive
|
|
219
|
+
* depth-guard bail), or build-error. Survives the parse cache (a small number
|
|
220
|
+
* map, kept by `...result` in slimParseWorkerResultsForCache) and is merged +
|
|
221
|
+
* logged per-language in `dispatchChunkParse` (alongside `skippedLanguages`),
|
|
222
|
+
* so a CFG coverage gap is visible. Like that sibling telemetry the warn is
|
|
223
|
+
* emitted for freshly-parsed chunks, not re-emitted on a warm cache hit.
|
|
224
|
+
* Optional for cache backward-compatibility — older shards predate it.
|
|
225
|
+
*/
|
|
226
|
+
cfgSkipped?: Record<string, CfgSkipCounts>;
|
|
214
227
|
fileCount: number;
|
|
215
228
|
}
|
|
216
229
|
export interface ParseWorkerInput {
|