gitnexus 1.6.8-rc.8 → 1.6.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +23 -2
- package/dist/core/ingestion/languages/c-cpp.js +17 -5
- 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 +8 -1
- 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 +44 -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/clone-safety.d.ts +109 -0
- package/dist/core/ingestion/workers/clone-safety.js +465 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +23 -0
- package/dist/core/ingestion/workers/parse-worker.js +81 -53
- package/dist/core/ingestion/workers/post-result.d.ts +22 -0
- package/dist/core/ingestion/workers/post-result.js +87 -0
- package/dist/core/ingestion/workers/result-merge.d.ts +20 -0
- package/dist/core/ingestion/workers/result-merge.js +43 -0
- package/dist/core/ingestion/workers/worker-pool.d.ts +15 -40
- package/dist/core/ingestion/workers/worker-pool.js +43 -16
- 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-ipc.d.ts +58 -0
- package/dist/server/analyze-worker-ipc.js +16 -0
- package/dist/server/analyze-worker.d.ts +17 -1
- package/dist/server/analyze-worker.js +7 -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 +44 -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
|
@@ -9,6 +9,7 @@ import { emitPhpScopeCaptures, interpretPhpImport, interpretPhpTypeBinding, phpA
|
|
|
9
9
|
import { SupportedLanguages } from '../../../_shared/index.js';
|
|
10
10
|
import { createClassExtractor } from '../class-extractors/generic.js';
|
|
11
11
|
import { phpClassConfig } from '../class-extractors/configs/php.js';
|
|
12
|
+
import { createPhpCfgVisitor } from '../cfg/visitors/php.js';
|
|
12
13
|
import { defineLanguage } from '../language-provider.js';
|
|
13
14
|
import { typeConfig as phpConfig } from '../type-extractors/php.js';
|
|
14
15
|
import { phpExportChecker } from '../export-detection.js';
|
|
@@ -271,6 +272,7 @@ export const phpProvider = defineLanguage({
|
|
|
271
272
|
builtInNames: BUILT_INS,
|
|
272
273
|
// ── RFC #909 Ring 3: scope-based resolution hooks ──────────────────────
|
|
273
274
|
emitScopeCaptures: emitPhpScopeCaptures,
|
|
275
|
+
cfgVisitor: createPhpCfgVisitor(),
|
|
274
276
|
interpretImport: interpretPhpImport,
|
|
275
277
|
interpretTypeBinding: interpretPhpTypeBinding,
|
|
276
278
|
// LanguageProvider uses (def, callsite); phpArityCompatibility uses (def, callsite) — same.
|
|
@@ -24,6 +24,7 @@ import { createVariableExtractor } from '../variable-extractors/generic.js';
|
|
|
24
24
|
import { pythonVariableConfig } from '../variable-extractors/configs/python.js';
|
|
25
25
|
import { createCallExtractor } from '../call-extractors/generic.js';
|
|
26
26
|
import { pythonCallConfig } from '../call-extractors/configs/python.js';
|
|
27
|
+
import { createPythonCfgVisitor } from '../cfg/visitors/python.js';
|
|
27
28
|
import { emitPythonScopeCaptures, pythonFunctionDefinitionLabel, interpretPythonImport, interpretPythonTypeBinding, pythonArityCompatibility, pythonBindingScopeFor, pythonImportOwningScope, pythonMergeBindings, pythonReceiverBinding, resolvePythonImportTarget, } from './python/index.js';
|
|
28
29
|
const BUILT_INS = new Set([
|
|
29
30
|
'print',
|
|
@@ -115,6 +116,7 @@ export const pythonProvider = defineLanguage({
|
|
|
115
116
|
// full per-hook rationale and the canonical capture vocabulary in
|
|
116
117
|
// ./python/query.ts (PYTHON_SCOPE_QUERY constant).
|
|
117
118
|
emitScopeCaptures: emitPythonScopeCaptures,
|
|
119
|
+
cfgVisitor: createPythonCfgVisitor(),
|
|
118
120
|
interpretImport: interpretPythonImport,
|
|
119
121
|
interpretTypeBinding: interpretPythonTypeBinding,
|
|
120
122
|
bindingScopeFor: pythonBindingScopeFor,
|
|
@@ -24,6 +24,7 @@ import { createVariableExtractor } from '../variable-extractors/generic.js';
|
|
|
24
24
|
import { rubyVariableConfig } from '../variable-extractors/configs/ruby.js';
|
|
25
25
|
import { createCallExtractor } from '../call-extractors/generic.js';
|
|
26
26
|
import { rubyCallConfig } from '../call-extractors/configs/ruby.js';
|
|
27
|
+
import { createRubyCfgVisitor } from '../cfg/visitors/ruby.js';
|
|
27
28
|
import { emitRubyScopeCaptures, rubyArityCompatibility, rubyBindingScopeFor, rubyImportOwningScope, rubyReceiverBinding, interpretRubyImport, interpretRubyTypeBinding, } from './ruby/index.js';
|
|
28
29
|
/**
|
|
29
30
|
* Ruby label override. Applied to:
|
|
@@ -186,6 +187,7 @@ export const rubyProvider = defineLanguage({
|
|
|
186
187
|
builtInNames: BUILT_INS,
|
|
187
188
|
// ── RFC #909 Ring 3: scope-based resolution hooks ──────────
|
|
188
189
|
emitScopeCaptures: emitRubyScopeCaptures,
|
|
190
|
+
cfgVisitor: createRubyCfgVisitor(),
|
|
189
191
|
interpretImport: interpretRubyImport,
|
|
190
192
|
interpretTypeBinding: interpretRubyTypeBinding,
|
|
191
193
|
bindingScopeFor: rubyBindingScopeFor,
|
|
@@ -24,6 +24,7 @@ import { createVariableExtractor } from '../variable-extractors/generic.js';
|
|
|
24
24
|
import { rustVariableConfig } from '../variable-extractors/configs/rust.js';
|
|
25
25
|
import { createCallExtractor } from '../call-extractors/generic.js';
|
|
26
26
|
import { rustCallConfig } from '../call-extractors/configs/rust.js';
|
|
27
|
+
import { createRustCfgVisitor } from '../cfg/visitors/rust.js';
|
|
27
28
|
import { emitRustScopeCaptures, rustArityCompatibility, rustBindingScopeFor, rustImportOwningScope, rustReceiverBinding, interpretRustImport, interpretRustTypeBinding, } from './rust/index.js';
|
|
28
29
|
/** Rust impl_item: find the function_item child and extract its name as a Method. */
|
|
29
30
|
const rustExtractFunctionName = (node) => {
|
|
@@ -161,6 +162,7 @@ export const rustProvider = defineLanguage({
|
|
|
161
162
|
builtInNames: BUILT_INS,
|
|
162
163
|
// ── RFC #909 Ring 3: scope-based resolution hooks ──────────
|
|
163
164
|
emitScopeCaptures: emitRustScopeCaptures,
|
|
165
|
+
cfgVisitor: createRustCfgVisitor(),
|
|
164
166
|
interpretImport: interpretRustImport,
|
|
165
167
|
interpretTypeBinding: interpretRustTypeBinding,
|
|
166
168
|
bindingScopeFor: rustBindingScopeFor,
|
|
@@ -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,49 @@ 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
|
+
}
|
|
170
|
+
// Clone-safety telemetry (#2112): files whose parse output carried a value
|
|
171
|
+
// the structured-clone algorithm couldn't serialize across the worker
|
|
172
|
+
// boundary. The worker sanitized/dropped the offending value so the run
|
|
173
|
+
// could complete; surface the (rare) data loss so it's visible and the
|
|
174
|
+
// offending extractor can be fixed at source.
|
|
175
|
+
const skippedPaths = [];
|
|
176
|
+
for (const result of chunkResults) {
|
|
177
|
+
for (const entry of result.skippedPaths ?? [])
|
|
178
|
+
skippedPaths.push(entry);
|
|
179
|
+
}
|
|
180
|
+
if (skippedPaths.length > 0) {
|
|
181
|
+
// Keep the per-file reason ("stripped N value(s) from nodes" /
|
|
182
|
+
// "dropped non-serializable parsedFiles entry") — it distinguishes a
|
|
183
|
+
// recoverable strip from a whole-record drop, which a path-only line loses.
|
|
184
|
+
const shown = skippedPaths
|
|
185
|
+
.slice(0, 10)
|
|
186
|
+
.map((e) => `${e.path} (${e.reason})`)
|
|
187
|
+
.join(', ');
|
|
188
|
+
const more = skippedPaths.length > 10 ? ` …and ${skippedPaths.length - 10} more` : '';
|
|
189
|
+
logger.warn(` Sanitized ${skippedPaths.length} file(s) with non-serializable parse output: ${shown}${more}`);
|
|
190
|
+
}
|
|
147
191
|
onFileProgress?.(total, total, 'done');
|
|
148
192
|
return chunkResults;
|
|
149
193
|
};
|
|
@@ -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>;
|