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
|
@@ -21,6 +21,7 @@ import { createVariableExtractor } from '../variable-extractors/generic.js';
|
|
|
21
21
|
import { swiftVariableConfig } from '../variable-extractors/configs/swift.js';
|
|
22
22
|
import { createCallExtractor } from '../call-extractors/generic.js';
|
|
23
23
|
import { swiftCallConfig } from '../call-extractors/configs/swift.js';
|
|
24
|
+
import { createSwiftCfgVisitor } from '../cfg/visitors/swift.js';
|
|
24
25
|
import { emitSwiftScopeCaptures, interpretSwiftImport, interpretSwiftTypeBinding, swiftBindingScopeFor, swiftImportOwningScope, swiftReceiverBinding, swiftMergeBindings, swiftArityCompatibility, } from './swift/index.js';
|
|
25
26
|
/** Swift init/deinit declarations have special names and Constructor label. */
|
|
26
27
|
const swiftExtractFunctionName = (node) => {
|
|
@@ -226,6 +227,7 @@ export const swiftProvider = defineLanguage({
|
|
|
226
227
|
// ── Scope-based resolution hooks (RFC #909 Ring 3, issue #937). See
|
|
227
228
|
// languages/swift/ for the implementations. ──────────────────────
|
|
228
229
|
emitScopeCaptures: emitSwiftScopeCaptures,
|
|
230
|
+
cfgVisitor: createSwiftCfgVisitor(),
|
|
229
231
|
interpretImport: interpretSwiftImport,
|
|
230
232
|
interpretTypeBinding: interpretSwiftTypeBinding,
|
|
231
233
|
bindingScopeFor: swiftBindingScopeFor,
|
|
@@ -9,6 +9,7 @@ import { SupportedLanguages } from '../../../_shared/index.js';
|
|
|
9
9
|
import { defineLanguage } from '../language-provider.js';
|
|
10
10
|
import { createClassExtractor } from '../class-extractors/generic.js';
|
|
11
11
|
import { typescriptClassConfig, javascriptClassConfig, } from '../class-extractors/configs/typescript-javascript.js';
|
|
12
|
+
import { createTypeScriptCfgVisitor } from '../cfg/visitors/typescript.js';
|
|
12
13
|
import { typeConfig as typescriptConfig } from '../type-extractors/typescript.js';
|
|
13
14
|
import { tsExportChecker } from '../export-detection.js';
|
|
14
15
|
import { createImportResolver } from '../import-resolvers/resolver-factory.js';
|
|
@@ -293,6 +294,8 @@ export const typescriptProvider = defineLanguage({
|
|
|
293
294
|
// canonical capture vocabulary in ./typescript/query.ts
|
|
294
295
|
// (TYPESCRIPT_SCOPE_QUERY constant).
|
|
295
296
|
emitScopeCaptures: emitTsScopeCaptures,
|
|
297
|
+
// CFG/PDG substrate (#2081 M1) — runs in the worker on a --pdg run.
|
|
298
|
+
cfgVisitor: createTypeScriptCfgVisitor(),
|
|
296
299
|
interpretImport: interpretTsImport,
|
|
297
300
|
interpretTypeBinding: interpretTsTypeBinding,
|
|
298
301
|
bindingScopeFor: tsBindingScopeFor,
|
|
@@ -352,6 +355,8 @@ export const javascriptProvider = defineLanguage({
|
|
|
352
355
|
// JSDoc type bindings) live in ./javascript/captures.ts.
|
|
353
356
|
// See ./javascript/index.ts for the full per-module rationale.
|
|
354
357
|
emitScopeCaptures: emitJsScopeCaptures,
|
|
358
|
+
// CFG/PDG substrate (#2081 M1) — TS and JS share the same grammar family.
|
|
359
|
+
cfgVisitor: createTypeScriptCfgVisitor(),
|
|
355
360
|
interpretImport: interpretJsImport,
|
|
356
361
|
interpretTypeBinding: interpretJsTypeBinding,
|
|
357
362
|
bindingScopeFor: jsBindingScopeFor,
|
|
@@ -27,6 +27,7 @@ import { createCallExtractor } from '../call-extractors/generic.js';
|
|
|
27
27
|
import { typescriptCallConfig } from '../call-extractors/configs/typescript-javascript.js';
|
|
28
28
|
import { interpretTsImport, interpretTsTypeBinding, tsBindingScopeFor, tsImportOwningScope, tsReceiverBinding, typescriptMergeBindings, typescriptArityCompatibility, resolveTsImportTarget, } from './typescript/index.js';
|
|
29
29
|
import { emitVueScopeCaptures } from './vue/captures.js';
|
|
30
|
+
import { createTypeScriptCfgVisitor } from '../cfg/visitors/typescript.js';
|
|
30
31
|
const VUE_SPECIFIC_BUILT_INS = [
|
|
31
32
|
'ref',
|
|
32
33
|
'reactive',
|
|
@@ -74,6 +75,11 @@ export const vueProvider = defineLanguage({
|
|
|
74
75
|
variableExtractor: createVariableExtractor(typescriptVariableConfig),
|
|
75
76
|
classExtractor: vueClassExtractor,
|
|
76
77
|
builtInNames: VUE_BUILT_INS,
|
|
78
|
+
// Vue SFC <script> blocks are extracted and parsed with the TypeScript
|
|
79
|
+
// grammar (parse-worker GRAMMAR_BY_LANGUAGE[Vue] = TypeScript.typescript),
|
|
80
|
+
// so the TS CFG visitor builds CFGs for the script's functions verbatim —
|
|
81
|
+
// no Vue-specific visitor needed (#2195).
|
|
82
|
+
cfgVisitor: createTypeScriptCfgVisitor(),
|
|
77
83
|
// Scope-resolution pipeline hooks (RFC #909 Ring 3)
|
|
78
84
|
emitScopeCaptures: emitVueScopeCaptures,
|
|
79
85
|
interpretImport: interpretTsImport,
|
|
@@ -33,18 +33,12 @@ function findFunctionDeclarator(node) {
|
|
|
33
33
|
}
|
|
34
34
|
return null;
|
|
35
35
|
}
|
|
36
|
-
/**
|
|
37
|
-
|
|
38
|
-
* These are not callable methods and should be suppressed from extraction.
|
|
39
|
-
* tree-sitter-cpp ^0.23.4 emits `delete_method_clause` / `default_method_clause`
|
|
40
|
-
* as named children of the function_definition node.
|
|
41
|
-
*/
|
|
42
|
-
function isDeletedOrDefaulted(node) {
|
|
36
|
+
/** Detect a C++ special member clause by its tree-sitter node type. */
|
|
37
|
+
function hasSpecialMethodClause(node, clauseType) {
|
|
43
38
|
for (let i = 0; i < node.namedChildCount; i++) {
|
|
44
39
|
const child = node.namedChild(i);
|
|
45
|
-
if (child?.type ===
|
|
40
|
+
if (child?.type === clauseType)
|
|
46
41
|
return true;
|
|
47
|
-
}
|
|
48
42
|
}
|
|
49
43
|
return false;
|
|
50
44
|
}
|
|
@@ -57,10 +51,6 @@ function extractCppMethodName(node) {
|
|
|
57
51
|
const funcDecl = findFunctionDeclarator(node);
|
|
58
52
|
if (!funcDecl)
|
|
59
53
|
return undefined;
|
|
60
|
-
// Suppress `= delete` and `= default` special members — these are not callable
|
|
61
|
-
// methods and should not appear in HAS_METHOD edges.
|
|
62
|
-
if (isDeletedOrDefaulted(node))
|
|
63
|
-
return undefined;
|
|
64
54
|
const nameNode = funcDecl.childForFieldName('declarator');
|
|
65
55
|
if (!nameNode)
|
|
66
56
|
return undefined;
|
|
@@ -360,6 +350,9 @@ export const cppMethodConfig = {
|
|
|
360
350
|
}
|
|
361
351
|
return false;
|
|
362
352
|
},
|
|
353
|
+
isDeleted(node) {
|
|
354
|
+
return hasSpecialMethodClause(node, 'delete_method_clause');
|
|
355
|
+
},
|
|
363
356
|
};
|
|
364
357
|
// ---------------------------------------------------------------------------
|
|
365
358
|
// C config (minimal — C has no classes/methods, only struct function pointers)
|
|
@@ -198,6 +198,7 @@ function buildMethod(node, ownerNode, context, config) {
|
|
|
198
198
|
...(config.isAsync?.(node) ? { isAsync: true } : {}),
|
|
199
199
|
...(config.isPartial?.(node) ? { isPartial: true } : {}),
|
|
200
200
|
...(config.isConst?.(node) ? { isConst: true } : {}),
|
|
201
|
+
...(config.isDeleted?.(node) ? { isDeleted: true } : {}),
|
|
201
202
|
annotations: config.extractAnnotations?.(node) ?? [],
|
|
202
203
|
sourceFile: context.filePath,
|
|
203
204
|
line: node.startPosition.row + 1,
|
|
@@ -27,6 +27,7 @@ export interface MethodInfo {
|
|
|
27
27
|
isAsync?: boolean;
|
|
28
28
|
isPartial?: boolean;
|
|
29
29
|
isConst?: boolean;
|
|
30
|
+
isDeleted?: boolean;
|
|
30
31
|
annotations: string[];
|
|
31
32
|
sourceFile: string;
|
|
32
33
|
line: number;
|
|
@@ -74,6 +75,7 @@ export interface MethodExtractionConfig {
|
|
|
74
75
|
isAsync?: (node: SyntaxNode) => boolean;
|
|
75
76
|
isPartial?: (node: SyntaxNode) => boolean;
|
|
76
77
|
isConst?: (node: SyntaxNode) => boolean;
|
|
78
|
+
isDeleted?: (node: SyntaxNode) => boolean;
|
|
77
79
|
/** Owner node types where member functions are effectively static (e.g.
|
|
78
80
|
* Ruby singleton_class, Kotlin companion_object / object_declaration).
|
|
79
81
|
* When the ownerNode matches one of these types, isStatic is forced true. */
|
|
@@ -136,6 +136,7 @@ export const createSymbolTable = () => {
|
|
|
136
136
|
? { templateArguments: metadata.templateArguments }
|
|
137
137
|
: {}),
|
|
138
138
|
...(metadata?.ownerId !== undefined ? { ownerId: metadata.ownerId } : {}),
|
|
139
|
+
...(metadata?.isDeleted === true ? { isDeleted: true } : {}),
|
|
139
140
|
};
|
|
140
141
|
// A. File Index — unconditional.
|
|
141
142
|
if (!fileIndex.has(filePath)) {
|
|
@@ -74,6 +74,9 @@ function buildAdjacency(graph) {
|
|
|
74
74
|
}
|
|
75
75
|
return { parentMap, methodMap, parentEdgeType };
|
|
76
76
|
}
|
|
77
|
+
/** Confidence for a single-ancestor override edge (a subclass overriding one parent
|
|
78
|
+
* method via class inheritance) — same tier as MRO-ordered resolution. */
|
|
79
|
+
const SINGLE_ANCESTOR_OVERRIDE_CONFIDENCE = 0.9;
|
|
77
80
|
/** Resolve by MRO order — first ancestor in linearized order wins. */
|
|
78
81
|
function resolveByMroOrder(methodName, defs, mroOrder, reasonPrefix) {
|
|
79
82
|
for (const ancestorId of mroOrder) {
|
|
@@ -266,6 +269,112 @@ export function computeMRO(graph) {
|
|
|
266
269
|
ambiguities,
|
|
267
270
|
});
|
|
268
271
|
}
|
|
272
|
+
// ── Single-ancestor override detection ──────────────────────────────────
|
|
273
|
+
// The collision loop above only emits when a method is defined in 2+ ancestors
|
|
274
|
+
// (defs.length < 2 is skipped). A subclass overriding a single parent method via
|
|
275
|
+
// class inheritance is the common case. Applicability is derived automatically from
|
|
276
|
+
// the language's existing MRO strategy — no separate per-language flag: every
|
|
277
|
+
// strategy resolves overrides by inheritance order EXCEPT `qualified-syntax` (Rust),
|
|
278
|
+
// where a same-named method is a trait implementation (METHOD_IMPLEMENTS), not an
|
|
279
|
+
// override. The EXTENDS-only walk below reinforces this structurally.
|
|
280
|
+
const emittedOverrideEdgeIds = new Set();
|
|
281
|
+
// Follow only EXTENDS (class-inheritance) parents and skip Interface/Trait ancestors:
|
|
282
|
+
// satisfying an interface/trait default method is a METHOD_IMPLEMENTS relationship
|
|
283
|
+
// (handled by emitMethodImplementsEdges), not an override. This also structurally
|
|
284
|
+
// excludes languages without class inheritance (e.g. Rust traits use IMPLEMENTS).
|
|
285
|
+
const extendsParentsOf = (nodeId) => (parentMap.get(nodeId) ?? []).filter((pid) => {
|
|
286
|
+
if (parentEdgeType.get(nodeId)?.get(pid) !== 'EXTENDS')
|
|
287
|
+
return false;
|
|
288
|
+
const pn = graph.getNode(pid);
|
|
289
|
+
return !!pn && pn.label !== 'Interface' && pn.label !== 'Trait';
|
|
290
|
+
});
|
|
291
|
+
for (const classId of parentMap.keys()) {
|
|
292
|
+
const classNode = graph.getNode(classId);
|
|
293
|
+
const language = classNode?.properties.language;
|
|
294
|
+
if (!language)
|
|
295
|
+
continue;
|
|
296
|
+
// Language-aware gate, reusing the MRO model we already maintain (not a new flag).
|
|
297
|
+
if (getProvider(language).mroStrategy === 'qualified-syntax')
|
|
298
|
+
continue;
|
|
299
|
+
const ownMethods = methodMap.get(classId) ?? [];
|
|
300
|
+
const extendsParents = extendsParentsOf(classId);
|
|
301
|
+
if (extendsParents.length === 0 || ownMethods.length === 0)
|
|
302
|
+
continue;
|
|
303
|
+
const orderedAncestorMethods = [];
|
|
304
|
+
{
|
|
305
|
+
const visited = new Set();
|
|
306
|
+
const queue = [...extendsParents];
|
|
307
|
+
while (queue.length > 0) {
|
|
308
|
+
const ancestorId = queue.shift();
|
|
309
|
+
if (visited.has(ancestorId))
|
|
310
|
+
continue;
|
|
311
|
+
visited.add(ancestorId);
|
|
312
|
+
const ancestorName = graph.getNode(ancestorId)?.properties.name;
|
|
313
|
+
const methodsByName = new Map();
|
|
314
|
+
for (const mid of methodMap.get(ancestorId) ?? []) {
|
|
315
|
+
const mn = graph.getNode(mid);
|
|
316
|
+
if (!mn || mn.label === 'Property' || typeof mn.properties.name !== 'string')
|
|
317
|
+
continue;
|
|
318
|
+
const entry = {
|
|
319
|
+
methodId: mid,
|
|
320
|
+
paramTypes: mn.properties.parameterTypes ?? [],
|
|
321
|
+
paramCount: mn.properties.parameterCount,
|
|
322
|
+
};
|
|
323
|
+
const bucket = methodsByName.get(mn.properties.name);
|
|
324
|
+
if (bucket)
|
|
325
|
+
bucket.push(entry);
|
|
326
|
+
else
|
|
327
|
+
methodsByName.set(mn.properties.name, [entry]);
|
|
328
|
+
}
|
|
329
|
+
orderedAncestorMethods.push({
|
|
330
|
+
className: typeof ancestorName === 'string' ? ancestorName : '<anonymous>',
|
|
331
|
+
methodsByName,
|
|
332
|
+
});
|
|
333
|
+
queue.push(...extendsParentsOf(ancestorId));
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
for (const methodId of ownMethods) {
|
|
337
|
+
const methodNode = graph.getNode(methodId);
|
|
338
|
+
if (!methodNode || methodNode.label === 'Property' || !methodNode.properties.name)
|
|
339
|
+
continue;
|
|
340
|
+
const methodName = methodNode.properties.name;
|
|
341
|
+
const ownParamTypes = methodNode.properties.parameterTypes ?? [];
|
|
342
|
+
const ownParamCount = methodNode.properties.parameterCount;
|
|
343
|
+
// Nearest ancestor (BFS order) defining this method by name AND signature, so a
|
|
344
|
+
// same-named overload (e.g. foo(int) vs foo()) is not mistaken for an override.
|
|
345
|
+
for (const { className, methodsByName } of orderedAncestorMethods) {
|
|
346
|
+
const sameName = methodsByName.get(methodName);
|
|
347
|
+
if (!sameName)
|
|
348
|
+
continue;
|
|
349
|
+
const matches = sameName.filter((m) => parameterTypesMatch(ownParamTypes, m.paramTypes, ownParamCount, m.paramCount).match);
|
|
350
|
+
if (matches.length === 0)
|
|
351
|
+
continue; // name present but no signature match — look deeper
|
|
352
|
+
// Emit only when the match is unambiguous (exactly one candidate); >1 means the
|
|
353
|
+
// override target cannot be pinned, so emit nothing. Either way stop — a closer
|
|
354
|
+
// ancestor shadows anything deeper.
|
|
355
|
+
if (matches.length === 1) {
|
|
356
|
+
const matchingMethodId = matches[0].methodId;
|
|
357
|
+
// Target the ancestor METHOD node (not the class), key the id on the method
|
|
358
|
+
// so distinct overrides stay distinct, and count only edges actually added
|
|
359
|
+
// (addRelationship is first-writer-wins, so a duplicate id is dropped).
|
|
360
|
+
const overrideId = generateId('METHOD_OVERRIDES', `${classId}->${matchingMethodId}`);
|
|
361
|
+
if (!emittedOverrideEdgeIds.has(overrideId)) {
|
|
362
|
+
emittedOverrideEdgeIds.add(overrideId);
|
|
363
|
+
graph.addRelationship({
|
|
364
|
+
id: overrideId,
|
|
365
|
+
sourceId: classId,
|
|
366
|
+
targetId: matchingMethodId,
|
|
367
|
+
type: 'METHOD_OVERRIDES',
|
|
368
|
+
confidence: SINGLE_ANCESTOR_OVERRIDE_CONFIDENCE,
|
|
369
|
+
reason: `single-ancestor override: ${className}::${methodName}()`,
|
|
370
|
+
});
|
|
371
|
+
overrideEdges++;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
break; // nearest ancestor shadows deeper ones
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
269
378
|
const methodImplementsEdges = emitMethodImplementsEdges(graph, parentMap, methodMap, parentEdgeType, ancestorsMap, edgeTypesMap);
|
|
270
379
|
return { entries, overrideEdges, ambiguityCount, methodImplementsEdges };
|
|
271
380
|
}
|
|
@@ -49,6 +49,7 @@ export const mergeChunkResults = (graph, symbolTable, chunkResults, exportedType
|
|
|
49
49
|
templateArguments: sym.templateArguments,
|
|
50
50
|
ownerId: sym.ownerId,
|
|
51
51
|
qualifiedName: sym.qualifiedName,
|
|
52
|
+
isDeleted: sym.isDeleted,
|
|
52
53
|
});
|
|
53
54
|
}
|
|
54
55
|
if (exportedTypeMap) {
|
|
@@ -144,6 +145,28 @@ chunkHash) => {
|
|
|
144
145
|
.join(', ');
|
|
145
146
|
logger.warn(` Skipped unsupported languages: ${summary}`);
|
|
146
147
|
}
|
|
148
|
+
// Per-language CFG skip telemetry (#2195): functions skipped during the worker
|
|
149
|
+
// CFG walk, bucketed by reason. Only surfaced for a `--pdg` run (otherwise
|
|
150
|
+
// `cfgSkipped` is empty). Warn ONLY when a robustness-relevant bucket
|
|
151
|
+
// (too-deeply-nested / build-error) is non-zero — a too-many-lines skip is the
|
|
152
|
+
// expected, benign minified/generated-code case and would otherwise be spam.
|
|
153
|
+
const cfgSkipped = new Map();
|
|
154
|
+
for (const result of chunkResults) {
|
|
155
|
+
for (const [lang, counts] of Object.entries(result.cfgSkipped ?? {})) {
|
|
156
|
+
const prev = cfgSkipped.get(lang) ?? { tooManyLines: 0, tooDeeplyNested: 0, buildError: 0 };
|
|
157
|
+
cfgSkipped.set(lang, {
|
|
158
|
+
tooManyLines: prev.tooManyLines + counts.tooManyLines,
|
|
159
|
+
tooDeeplyNested: prev.tooDeeplyNested + counts.tooDeeplyNested,
|
|
160
|
+
buildError: prev.buildError + counts.buildError,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
for (const [lang, c] of cfgSkipped) {
|
|
165
|
+
if (c.tooDeeplyNested > 0 || c.buildError > 0) {
|
|
166
|
+
logger.warn(` CFG functions skipped (${lang}): ${c.tooDeeplyNested} too-deeply-nested, ` +
|
|
167
|
+
`${c.buildError} build-error(s), ${c.tooManyLines} over line cap`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
147
170
|
// Clone-safety telemetry (#2112): files whose parse output carried a value
|
|
148
171
|
// the structured-clone algorithm couldn't serialize across the worker
|
|
149
172
|
// boundary. The worker sanitized/dropped the offending value so the run
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase: callSummaries (PDG FU-C, U-C3)
|
|
3
|
+
*
|
|
4
|
+
* The whole-program CALL_SUMMARY materialisation pass — the dependence-engine
|
|
5
|
+
* SIBLING of `taintSummaries`. Runs AFTER scope-resolution (where the resolved
|
|
6
|
+
* `CALLS` graph lives in `ctx.graph` and the per-function RETURN-VALUE ASCENT
|
|
7
|
+
* summaries were harvested in-phase) and emits one `CALL_SUMMARY` self-loop edge
|
|
8
|
+
* per harvested callee. A later consumer phase (NOT this task) decodes the
|
|
9
|
+
* bitset to ascend a callee's return effect into the caller continuation.
|
|
10
|
+
*
|
|
11
|
+
* Opt-in: registered with `enabledWhen: (o) => o.pdg === true`. A default
|
|
12
|
+
* `analyze` run never includes it, so the graph is byte-identical and emits ZERO
|
|
13
|
+
* CALL_SUMMARY edges. No always-on phase depends on it.
|
|
14
|
+
*
|
|
15
|
+
* @deps scopeResolution, pruneLocalSymbols
|
|
16
|
+
* @reads scopeResolution output (callSummaries)
|
|
17
|
+
* @writes graph (CALL_SUMMARY self-loop edges)
|
|
18
|
+
*/
|
|
19
|
+
import type { PipelinePhase } from './types.js';
|
|
20
|
+
export interface CallSummariesOutput {
|
|
21
|
+
/** Per-callee summaries fed to the emit. */
|
|
22
|
+
summaries: number;
|
|
23
|
+
/** CALL_SUMMARY edges persisted. */
|
|
24
|
+
edgesEmitted: number;
|
|
25
|
+
}
|
|
26
|
+
export declare const callSummariesPhase: PipelinePhase<CallSummariesOutput>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase: callSummaries (PDG FU-C, U-C3)
|
|
3
|
+
*
|
|
4
|
+
* The whole-program CALL_SUMMARY materialisation pass — the dependence-engine
|
|
5
|
+
* SIBLING of `taintSummaries`. Runs AFTER scope-resolution (where the resolved
|
|
6
|
+
* `CALLS` graph lives in `ctx.graph` and the per-function RETURN-VALUE ASCENT
|
|
7
|
+
* summaries were harvested in-phase) and emits one `CALL_SUMMARY` self-loop edge
|
|
8
|
+
* per harvested callee. A later consumer phase (NOT this task) decodes the
|
|
9
|
+
* bitset to ascend a callee's return effect into the caller continuation.
|
|
10
|
+
*
|
|
11
|
+
* Opt-in: registered with `enabledWhen: (o) => o.pdg === true`. A default
|
|
12
|
+
* `analyze` run never includes it, so the graph is byte-identical and emits ZERO
|
|
13
|
+
* CALL_SUMMARY edges. No always-on phase depends on it.
|
|
14
|
+
*
|
|
15
|
+
* @deps scopeResolution, pruneLocalSymbols
|
|
16
|
+
* @reads scopeResolution output (callSummaries)
|
|
17
|
+
* @writes graph (CALL_SUMMARY self-loop edges)
|
|
18
|
+
*/
|
|
19
|
+
import { getPhaseOutput } from './types.js';
|
|
20
|
+
import { emitCallSummaries, DEFAULT_PDG_MAX_CALL_SUMMARY_EDGES, } from '../taint/call-summary-emit.js';
|
|
21
|
+
import { logger } from '../../logger.js';
|
|
22
|
+
const EMPTY = { summaries: 0, edgesEmitted: 0 };
|
|
23
|
+
export const callSummariesPhase = {
|
|
24
|
+
name: 'callSummaries',
|
|
25
|
+
deps: ['scopeResolution', 'pruneLocalSymbols'],
|
|
26
|
+
async execute(ctx, deps) {
|
|
27
|
+
const scope = getPhaseOutput(deps, 'scopeResolution');
|
|
28
|
+
const summaries = scope.callSummaries;
|
|
29
|
+
if (summaries.length === 0)
|
|
30
|
+
return EMPTY;
|
|
31
|
+
const maxEdges = ctx.options?.pdgMaxCallSummaryEdges ?? DEFAULT_PDG_MAX_CALL_SUMMARY_EDGES;
|
|
32
|
+
const emit = emitCallSummaries(ctx.graph, summaries, { maxEdges }, (m) => logger.warn(m));
|
|
33
|
+
if (emit.edgesDropped > 0) {
|
|
34
|
+
logger.warn(`[call-summary] capped: ${emit.edgesDropped} CALL_SUMMARY edge(s) dropped by the ` +
|
|
35
|
+
`per-run cap (${maxEdges}) — raise pdgMaxCallSummaryEdges if intentional`);
|
|
36
|
+
}
|
|
37
|
+
if (emit.skippedMissingEndpoint > 0) {
|
|
38
|
+
logger.debug(`[call-summary] ${emit.skippedMissingEndpoint} summary/summaries skipped (callee node ` +
|
|
39
|
+
`missing from graph)`);
|
|
40
|
+
}
|
|
41
|
+
if (emit.edgesEmitted > 0) {
|
|
42
|
+
logger.debug(`[call-summary] ${summaries.length} summaries → ${emit.edgesEmitted} CALL_SUMMARY edge(s)`);
|
|
43
|
+
}
|
|
44
|
+
return { summaries: summaries.length, edgesEmitted: emit.edgesEmitted };
|
|
45
|
+
},
|
|
46
|
+
};
|
|
@@ -15,6 +15,8 @@ export { ormPhase, type ORMOutput } from './orm.js';
|
|
|
15
15
|
export { crossFilePhase, type CrossFileOutput } from './cross-file.js';
|
|
16
16
|
export { scopeResolutionPhase, type ScopeResolutionOutput, } from '../scope-resolution/pipeline/phase.js';
|
|
17
17
|
export { pruneLocalSymbolsPhase, type PruneLocalSymbolsOutput } from './prune-local-symbols.js';
|
|
18
|
+
export { taintSummariesPhase, type TaintSummariesOutput } from './taint-summaries.js';
|
|
19
|
+
export { callSummariesPhase, type CallSummariesOutput } from './call-summaries.js';
|
|
18
20
|
export { mroPhase, type MROOutput } from './mro.js';
|
|
19
21
|
export { communitiesPhase, type CommunitiesOutput } from './communities.js';
|
|
20
22
|
export { processesPhase, type ProcessesOutput } from './processes.js';
|
|
@@ -16,6 +16,8 @@ export { ormPhase } from './orm.js';
|
|
|
16
16
|
export { crossFilePhase } from './cross-file.js';
|
|
17
17
|
export { scopeResolutionPhase, } from '../scope-resolution/pipeline/phase.js';
|
|
18
18
|
export { pruneLocalSymbolsPhase } from './prune-local-symbols.js';
|
|
19
|
+
export { taintSummariesPhase } from './taint-summaries.js';
|
|
20
|
+
export { callSummariesPhase } from './call-summaries.js';
|
|
19
21
|
export { mroPhase } from './mro.js';
|
|
20
22
|
export { communitiesPhase } from './communities.js';
|
|
21
23
|
export { processesPhase } from './processes.js';
|
|
@@ -26,27 +26,6 @@ type ScannedFile = {
|
|
|
26
26
|
size: number;
|
|
27
27
|
};
|
|
28
28
|
type ProgressFn = (progress: PipelineProgress) => void;
|
|
29
|
-
/**
|
|
30
|
-
* Handle a worker-pool startup failure by FAILING FAST with the captured cause
|
|
31
|
-
* (#1741). The pool self-heals *transient* worker crashes on its own — a
|
|
32
|
-
* bounded, jittered startup restart loop (see worker-pool.ts) — so this is
|
|
33
|
-
* reached only when that self-heal is EXHAUSTED, or a deterministic crash-loop
|
|
34
|
-
* was detected, or the pool could not even be constructed. In every such case
|
|
35
|
-
* the workers genuinely cannot start.
|
|
36
|
-
*
|
|
37
|
-
* There is no sequential parser to silently degrade to — that fallback was
|
|
38
|
-
* removed (and it had masked a worker-startup regression as a 2-hour "stuck"
|
|
39
|
-
* run in #1741, rc99: a dropped `logger.warn` plus an unbounded sequential
|
|
40
|
-
* grind). GitNexus surfaces the real crash and aborts so the operator fixes the
|
|
41
|
-
* worker startup (commonly a missing build). The pool's own crash
|
|
42
|
-
* classification (`crashClass` on WorkerPoolInitializationError) sharpens the
|
|
43
|
-
* message.
|
|
44
|
-
*
|
|
45
|
-
* @throws always — an actionable Error carrying the captured worker crash.
|
|
46
|
-
* @internal Exported for unit tests; production callers are the parse loop's
|
|
47
|
-
* two worker-startup catch sites below.
|
|
48
|
-
*/
|
|
49
|
-
export declare function handleWorkerStartupFailure(err: Error): never;
|
|
50
29
|
/**
|
|
51
30
|
* Chunked parse + resolve loop.
|
|
52
31
|
*
|
|
@@ -18,6 +18,7 @@ import { BindingAccumulator, enrichExportedTypeMap, } from '../binding-accumulat
|
|
|
18
18
|
import { mergeChunkResults, dispatchChunkParse } from '../parsing-processor.js';
|
|
19
19
|
import { fileContentHash, computeChunkHash, loadParseCacheChunk, persistParseCacheChunk, PARSE_CACHE_VERSION, } from '../../../storage/parse-cache.js';
|
|
20
20
|
import { clearParsedFileStore, persistParsedFileChunk, getDurableParsedFileDir, loadDurableParsedFileIndex, restoreDurableParsedFileShard, } from '../../../storage/parsedfile-store.js';
|
|
21
|
+
import { DEFAULT_PDG_MAX_FUNCTION_LINES } from '../cfg/collect.js';
|
|
21
22
|
import { processRoutesFromExtracted, buildExportedTypeMapFromGraph, } from '../call-processor.js';
|
|
22
23
|
import { createSemanticModel } from '../model/index.js';
|
|
23
24
|
import { getLanguageFromFilename, } from '../../../_shared/index.js';
|
|
@@ -319,6 +320,10 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
|
|
|
319
320
|
// Initialized below before the chunk loop (same deferred-init pattern
|
|
320
321
|
// as `parsedFileStorePath`); this closure only runs from the loop.
|
|
321
322
|
durableParsedFileStoragePath: durableParsedFileDir,
|
|
323
|
+
// CFG/PDG opt-in (#2081 M1) — baked into each worker's workerData so the
|
|
324
|
+
// worker builds + attaches cfgSideChannel. Off by default.
|
|
325
|
+
pdg: options?.pdg === true,
|
|
326
|
+
pdgMaxFunctionLines: options?.pdgMaxFunctionLines,
|
|
322
327
|
// Fan each chunk across the whole pool (#worker-idle): without this a
|
|
323
328
|
// chunk smaller than the 8 MB sub-batch cap became a single job on a
|
|
324
329
|
// single worker. Honors an explicit `subBatchMaxBytes` / env override.
|
|
@@ -566,7 +571,19 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
|
|
|
566
571
|
filePath: f.path,
|
|
567
572
|
contentHash: fileContentHash(f.content),
|
|
568
573
|
}));
|
|
569
|
-
chunkHash = computeChunkHash(entries
|
|
574
|
+
chunkHash = computeChunkHash(entries,
|
|
575
|
+
// Only worker-visible pdg config participates in the key —
|
|
576
|
+
// pdgMaxEdgesPerFunction is emit-time-only and deliberately
|
|
577
|
+
// excluded (see PdgCacheKey in parse-cache.ts; #2099 F3). The line
|
|
578
|
+
// cap is RESOLVED to the worker's default before folding so an
|
|
579
|
+
// explicit-default run shares the default run's keys (the worker
|
|
580
|
+
// output is byte-identical either way).
|
|
581
|
+
options?.pdg === true
|
|
582
|
+
? {
|
|
583
|
+
pdg: true,
|
|
584
|
+
maxFunctionLines: options?.pdgMaxFunctionLines ?? DEFAULT_PDG_MAX_FUNCTION_LINES,
|
|
585
|
+
}
|
|
586
|
+
: false);
|
|
570
587
|
}
|
|
571
588
|
const cachedRaw = chunkHash && parseCache ? await loadParseCacheChunk(parseCache, chunkHash) : undefined;
|
|
572
589
|
// Track every chunk hash we touched so the orchestrator can
|
|
@@ -14,6 +14,15 @@ import type { PipelinePhase } from './types.js';
|
|
|
14
14
|
export interface RouteEntry {
|
|
15
15
|
filePath: string;
|
|
16
16
|
source: string;
|
|
17
|
+
/**
|
|
18
|
+
* HTTP verb for this route when ingestion knows it structurally
|
|
19
|
+
* (Spring/Laravel framework routes and decorator routes carry
|
|
20
|
+
* `httpMethod`; filesystem-derived routes — Next.js/Expo/PHP file
|
|
21
|
+
* routes — do not, so this stays undefined for them). Persisted onto
|
|
22
|
+
* the Route node so downstream contract extraction can read the verb
|
|
23
|
+
* from the graph instead of re-parsing the handler source.
|
|
24
|
+
*/
|
|
25
|
+
method?: string;
|
|
17
26
|
}
|
|
18
27
|
export interface RoutesOutput {
|
|
19
28
|
routeRegistry: Map<string, RouteEntry>;
|
|
@@ -26,4 +35,5 @@ export interface TemplateFetchCall {
|
|
|
26
35
|
export declare const isTemplateRouteCandidate: (filePath: string) => boolean;
|
|
27
36
|
export declare function extractTemplateStaticFetchCalls(filePath: string, content: string, namedRouteUrls?: ReadonlyMap<string, string>): TemplateFetchCall[];
|
|
28
37
|
export declare function normalizeExtractedRoutePath(routePath: string, prefix: string | null): string;
|
|
38
|
+
export declare function normalizeRouteMethod(raw: string | null | undefined): string | undefined;
|
|
29
39
|
export declare const routesPhase: PipelinePhase<RoutesOutput>;
|
|
@@ -97,6 +97,32 @@ export function normalizeExtractedRoutePath(routePath, prefix) {
|
|
|
97
97
|
function escapeRegex(s) {
|
|
98
98
|
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
99
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Canonicalize a route's HTTP verb for persistence on the Route node.
|
|
102
|
+
* Returns an upper-cased standard method, or `undefined` when the value
|
|
103
|
+
* is not a real HTTP verb. Laravel `Route::resource` / `apiResource`
|
|
104
|
+
* surface `httpMethod` values like `resource` / `apiResource` (they
|
|
105
|
+
* expand to several verbs at runtime), so they must not be stored as a
|
|
106
|
+
* method — leaving them `undefined` keeps the column clean and lets the
|
|
107
|
+
* contract extractor fall back to its source-scan path for those routes.
|
|
108
|
+
*/
|
|
109
|
+
const VALID_HTTP_METHODS = new Set([
|
|
110
|
+
'GET',
|
|
111
|
+
'POST',
|
|
112
|
+
'PUT',
|
|
113
|
+
'PATCH',
|
|
114
|
+
'DELETE',
|
|
115
|
+
'HEAD',
|
|
116
|
+
'OPTIONS',
|
|
117
|
+
'TRACE',
|
|
118
|
+
'CONNECT',
|
|
119
|
+
]);
|
|
120
|
+
export function normalizeRouteMethod(raw) {
|
|
121
|
+
if (typeof raw !== 'string')
|
|
122
|
+
return undefined;
|
|
123
|
+
const verb = raw.trim().toUpperCase();
|
|
124
|
+
return VALID_HTTP_METHODS.has(verb) ? verb : undefined;
|
|
125
|
+
}
|
|
100
126
|
export const routesPhase = {
|
|
101
127
|
name: 'routes',
|
|
102
128
|
deps: ['parse'],
|
|
@@ -166,6 +192,7 @@ export const routesPhase = {
|
|
|
166
192
|
addRoute(routeUrl, {
|
|
167
193
|
filePath: route.filePath,
|
|
168
194
|
source: 'framework-route',
|
|
195
|
+
method: normalizeRouteMethod(route.httpMethod),
|
|
169
196
|
});
|
|
170
197
|
if (route.routeName && !namedRouteRegistry.has(route.routeName)) {
|
|
171
198
|
namedRouteRegistry.set(route.routeName, routeUrl);
|
|
@@ -176,6 +203,7 @@ export const routesPhase = {
|
|
|
176
203
|
addRoute(url, {
|
|
177
204
|
filePath: dr.filePath,
|
|
178
205
|
source: `decorator-${dr.decoratorName}`,
|
|
206
|
+
method: normalizeRouteMethod(dr.httpMethod),
|
|
179
207
|
});
|
|
180
208
|
}
|
|
181
209
|
let handlerContents;
|
|
@@ -183,7 +211,7 @@ export const routesPhase = {
|
|
|
183
211
|
const handlerPaths = [...routeRegistry.values()].map((e) => e.filePath);
|
|
184
212
|
handlerContents = await readFileContents(ctx.repoPath, handlerPaths);
|
|
185
213
|
for (const [routeURL, entry] of routeRegistry) {
|
|
186
|
-
const { filePath: handlerPath, source: routeSource } = entry;
|
|
214
|
+
const { filePath: handlerPath, source: routeSource, method: routeMethod } = entry;
|
|
187
215
|
const content = handlerContents.get(handlerPath);
|
|
188
216
|
const { responseKeys, errorKeys } = content
|
|
189
217
|
? handlerPath.endsWith('.php')
|
|
@@ -199,6 +227,7 @@ export const routesPhase = {
|
|
|
199
227
|
properties: {
|
|
200
228
|
name: routeURL,
|
|
201
229
|
filePath: handlerPath,
|
|
230
|
+
...(routeMethod ? { method: routeMethod } : {}),
|
|
202
231
|
...(responseKeys ? { responseKeys } : {}),
|
|
203
232
|
...(errorKeys ? { errorKeys } : {}),
|
|
204
233
|
...(middleware && middleware.length > 0 ? { middleware } : {}),
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase: taintSummaries (#2084 M4 U3/U5)
|
|
3
|
+
*
|
|
4
|
+
* The interprocedural taint fixpoint. Runs AFTER scope-resolution (where the
|
|
5
|
+
* complete, resolved `CALLS` graph lives in `ctx.graph` and the per-function
|
|
6
|
+
* summaries were harvested in-phase) and composes those summaries to find
|
|
7
|
+
* source→sink flows that cross function and file boundaries.
|
|
8
|
+
*
|
|
9
|
+
* Opt-in: registered with `enabledWhen: (o) => o.pdg === true` (the first real
|
|
10
|
+
* pdg-gated phase). A default `analyze` run never includes it, so the graph is
|
|
11
|
+
* byte-identical. No always-on phase depends on it (a filtered-out dep would
|
|
12
|
+
* throw in `getPhaseOutput`).
|
|
13
|
+
*
|
|
14
|
+
* @deps scopeResolution, pruneLocalSymbols
|
|
15
|
+
* @reads graph (CALLS edges, Function/Method nodes), scopeResolution output
|
|
16
|
+
* (functionSummaries)
|
|
17
|
+
* @writes graph (TAINT_PATH edges)
|
|
18
|
+
*/
|
|
19
|
+
import type { PipelinePhase } from './types.js';
|
|
20
|
+
export interface TaintSummariesOutput {
|
|
21
|
+
/** Function summaries fed to the fixpoint. */
|
|
22
|
+
summaries: number;
|
|
23
|
+
/** Cross-function findings (pre-cap). */
|
|
24
|
+
findings: number;
|
|
25
|
+
/** TAINT_PATH edges persisted. */
|
|
26
|
+
edgesEmitted: number;
|
|
27
|
+
/** Call sites whose callee did not resolve to a summary edge (diagnostics). */
|
|
28
|
+
unmatchedCallSites: number;
|
|
29
|
+
}
|
|
30
|
+
export declare const taintSummariesPhase: PipelinePhase<TaintSummariesOutput>;
|