gitnexus 1.6.8-rc.9 → 1.6.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/_shared/graph/types.d.ts +31 -1
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/language-detection.d.ts.map +1 -1
- package/dist/_shared/language-detection.js +11 -1
- package/dist/_shared/language-detection.js.map +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.js +6 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/scope-resolution/parsed-file.d.ts +21 -0
- package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/symbol-definition.d.ts +6 -0
- package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +31 -1
- package/dist/cli/ai-context.js +18 -16
- package/dist/cli/analyze-config.js +11 -0
- package/dist/cli/analyze.d.ts +14 -0
- package/dist/cli/analyze.js +98 -0
- package/dist/cli/embedding-dims.d.ts +33 -0
- package/dist/cli/embedding-dims.js +39 -0
- package/dist/cli/eval-server.d.ts +8 -0
- package/dist/cli/eval-server.js +242 -2
- package/dist/cli/help-i18n.js +19 -0
- package/dist/cli/i18n/en.d.ts +15 -1
- package/dist/cli/i18n/en.js +15 -1
- package/dist/cli/i18n/resources.d.ts +29 -1
- package/dist/cli/i18n/zh-CN.d.ts +14 -0
- package/dist/cli/i18n/zh-CN.js +15 -1
- package/dist/cli/index.js +89 -1
- package/dist/cli/mcp.d.ts +6 -1
- package/dist/cli/mcp.js +26 -1
- package/dist/cli/optional-grammars.d.ts +6 -8
- package/dist/cli/optional-grammars.js +8 -11
- package/dist/cli/setup.d.ts +3 -1
- package/dist/cli/setup.js +67 -17
- package/dist/cli/skill-gen.js +2 -1
- package/dist/cli/tool.d.ts +19 -1
- package/dist/cli/tool.js +96 -3
- package/dist/core/embeddings/hf-env.d.ts +0 -66
- package/dist/core/embeddings/http-client.d.ts +7 -0
- package/dist/core/embeddings/http-client.js +5 -3
- package/dist/core/embeddings/server-mapping.d.ts +1 -1
- package/dist/core/embeddings/server-mapping.js +7 -3
- package/dist/core/graph/import-cycles.d.ts +10 -0
- package/dist/core/graph/import-cycles.js +103 -0
- package/dist/core/group/cross-impact.d.ts +2 -1
- package/dist/core/group/cross-impact.js +5 -1
- package/dist/core/group/extractors/grpc-patterns/proto.js +10 -6
- package/dist/core/group/extractors/http-patterns/kotlin.js +7 -7
- package/dist/core/group/extractors/http-route-extractor.d.ts +24 -0
- package/dist/core/group/extractors/http-route-extractor.js +22 -4
- package/dist/core/group/extractors/include-extractor.js +22 -13
- package/dist/core/group/sync.d.ts +27 -1
- package/dist/core/group/sync.js +0 -0
- package/dist/core/incremental/subgraph-extract.js +18 -1
- package/dist/core/ingestion/cfg/cfg-builder.d.ts +114 -0
- package/dist/core/ingestion/cfg/cfg-builder.js +196 -0
- package/dist/core/ingestion/cfg/collect.d.ts +51 -0
- package/dist/core/ingestion/cfg/collect.js +77 -0
- package/dist/core/ingestion/cfg/control-dependence.d.ts +58 -0
- package/dist/core/ingestion/cfg/control-dependence.js +182 -0
- package/dist/core/ingestion/cfg/control-flow-context.d.ts +106 -0
- package/dist/core/ingestion/cfg/control-flow-context.js +124 -0
- package/dist/core/ingestion/cfg/emit.d.ts +293 -0
- package/dist/core/ingestion/cfg/emit.js +646 -0
- package/dist/core/ingestion/cfg/post-dominators.d.ts +79 -0
- package/dist/core/ingestion/cfg/post-dominators.js +176 -0
- package/dist/core/ingestion/cfg/reaching-def-reason-codec.d.ts +106 -0
- package/dist/core/ingestion/cfg/reaching-def-reason-codec.js +133 -0
- package/dist/core/ingestion/cfg/reaching-defs-graph.d.ts +18 -0
- package/dist/core/ingestion/cfg/reaching-defs-graph.js +312 -0
- package/dist/core/ingestion/cfg/reaching-defs.d.ts +162 -0
- package/dist/core/ingestion/cfg/reaching-defs.js +785 -0
- package/dist/core/ingestion/cfg/synthetic-escape.d.ts +124 -0
- package/dist/core/ingestion/cfg/synthetic-escape.js +300 -0
- package/dist/core/ingestion/cfg/traversal-result.d.ts +20 -0
- package/dist/core/ingestion/cfg/traversal-result.js +2 -0
- package/dist/core/ingestion/cfg/types.d.ts +274 -0
- package/dist/core/ingestion/cfg/types.js +13 -0
- package/dist/core/ingestion/cfg/visitors/c-cpp-harvest.d.ts +111 -0
- package/dist/core/ingestion/cfg/visitors/c-cpp-harvest.js +541 -0
- package/dist/core/ingestion/cfg/visitors/c-cpp.d.ts +74 -0
- package/dist/core/ingestion/cfg/visitors/c-cpp.js +584 -0
- package/dist/core/ingestion/cfg/visitors/call-site-harvest.d.ts +195 -0
- package/dist/core/ingestion/cfg/visitors/call-site-harvest.js +350 -0
- package/dist/core/ingestion/cfg/visitors/csharp-harvest.d.ts +124 -0
- package/dist/core/ingestion/cfg/visitors/csharp-harvest.js +589 -0
- package/dist/core/ingestion/cfg/visitors/csharp.d.ts +87 -0
- package/dist/core/ingestion/cfg/visitors/csharp.js +867 -0
- package/dist/core/ingestion/cfg/visitors/dart-harvest.d.ts +278 -0
- package/dist/core/ingestion/cfg/visitors/dart-harvest.js +870 -0
- package/dist/core/ingestion/cfg/visitors/dart.d.ts +119 -0
- package/dist/core/ingestion/cfg/visitors/dart.js +836 -0
- package/dist/core/ingestion/cfg/visitors/go-harvest.d.ts +160 -0
- package/dist/core/ingestion/cfg/visitors/go-harvest.js +621 -0
- package/dist/core/ingestion/cfg/visitors/go.d.ts +108 -0
- package/dist/core/ingestion/cfg/visitors/go.js +638 -0
- package/dist/core/ingestion/cfg/visitors/java-harvest.d.ts +108 -0
- package/dist/core/ingestion/cfg/visitors/java-harvest.js +513 -0
- package/dist/core/ingestion/cfg/visitors/java.d.ts +101 -0
- package/dist/core/ingestion/cfg/visitors/java.js +812 -0
- package/dist/core/ingestion/cfg/visitors/kotlin-harvest.d.ts +253 -0
- package/dist/core/ingestion/cfg/visitors/kotlin-harvest.js +719 -0
- package/dist/core/ingestion/cfg/visitors/kotlin.d.ts +121 -0
- package/dist/core/ingestion/cfg/visitors/kotlin.js +809 -0
- package/dist/core/ingestion/cfg/visitors/php-harvest.d.ts +172 -0
- package/dist/core/ingestion/cfg/visitors/php-harvest.js +626 -0
- package/dist/core/ingestion/cfg/visitors/php.d.ts +96 -0
- package/dist/core/ingestion/cfg/visitors/php.js +721 -0
- package/dist/core/ingestion/cfg/visitors/python-harvest.d.ts +212 -0
- package/dist/core/ingestion/cfg/visitors/python-harvest.js +739 -0
- package/dist/core/ingestion/cfg/visitors/python.d.ts +103 -0
- package/dist/core/ingestion/cfg/visitors/python.js +558 -0
- package/dist/core/ingestion/cfg/visitors/ruby-harvest.d.ts +223 -0
- package/dist/core/ingestion/cfg/visitors/ruby-harvest.js +587 -0
- package/dist/core/ingestion/cfg/visitors/ruby.d.ts +112 -0
- package/dist/core/ingestion/cfg/visitors/ruby.js +756 -0
- package/dist/core/ingestion/cfg/visitors/rust-harvest.d.ts +324 -0
- package/dist/core/ingestion/cfg/visitors/rust-harvest.js +873 -0
- package/dist/core/ingestion/cfg/visitors/rust.d.ts +95 -0
- package/dist/core/ingestion/cfg/visitors/rust.js +558 -0
- package/dist/core/ingestion/cfg/visitors/scope-tree-harvest.d.ts +87 -0
- package/dist/core/ingestion/cfg/visitors/scope-tree-harvest.js +116 -0
- package/dist/core/ingestion/cfg/visitors/swift-harvest.d.ts +255 -0
- package/dist/core/ingestion/cfg/visitors/swift-harvest.js +679 -0
- package/dist/core/ingestion/cfg/visitors/swift.d.ts +116 -0
- package/dist/core/ingestion/cfg/visitors/swift.js +787 -0
- package/dist/core/ingestion/cfg/visitors/typescript-harvest.d.ts +149 -0
- package/dist/core/ingestion/cfg/visitors/typescript-harvest.js +1056 -0
- package/dist/core/ingestion/cfg/visitors/typescript.d.ts +66 -0
- package/dist/core/ingestion/cfg/visitors/typescript.js +583 -0
- package/dist/core/ingestion/import-resolvers/utils.js +2 -0
- package/dist/core/ingestion/language-provider.d.ts +11 -0
- package/dist/core/ingestion/languages/c-cpp.js +6 -1
- package/dist/core/ingestion/languages/cobol.js +4 -0
- package/dist/core/ingestion/languages/cpp/arity-metadata.js +41 -2
- package/dist/core/ingestion/languages/cpp/captures.js +50 -1
- package/dist/core/ingestion/languages/cpp/conversion-rank.d.ts +2 -0
- package/dist/core/ingestion/languages/cpp/conversion-rank.js +89 -0
- package/dist/core/ingestion/languages/cpp/header-scan.d.ts +1 -1
- package/dist/core/ingestion/languages/cpp/header-scan.js +2 -2
- package/dist/core/ingestion/languages/cpp/inline-namespaces.js +7 -2
- package/dist/core/ingestion/languages/cpp/member-lookup.js +2 -1
- package/dist/core/ingestion/languages/cpp/query.js +23 -0
- package/dist/core/ingestion/languages/cpp/scope-resolver.js +2 -1
- package/dist/core/ingestion/languages/csharp.js +2 -0
- package/dist/core/ingestion/languages/dart.js +2 -0
- package/dist/core/ingestion/languages/go.js +2 -0
- package/dist/core/ingestion/languages/java.js +3 -0
- package/dist/core/ingestion/languages/kotlin/query.js +3 -2
- package/dist/core/ingestion/languages/kotlin.js +3 -0
- package/dist/core/ingestion/languages/php.js +2 -0
- package/dist/core/ingestion/languages/python.js +2 -0
- package/dist/core/ingestion/languages/ruby.js +2 -0
- package/dist/core/ingestion/languages/rust.js +2 -0
- package/dist/core/ingestion/languages/swift.js +2 -0
- package/dist/core/ingestion/languages/typescript.js +5 -0
- package/dist/core/ingestion/languages/vue.js +6 -0
- package/dist/core/ingestion/method-extractors/configs/c-cpp.js +6 -13
- package/dist/core/ingestion/method-extractors/generic.js +1 -0
- package/dist/core/ingestion/method-types.d.ts +2 -0
- package/dist/core/ingestion/model/symbol-table.d.ts +1 -0
- package/dist/core/ingestion/model/symbol-table.js +1 -0
- package/dist/core/ingestion/mro-processor.js +109 -0
- package/dist/core/ingestion/parsing-processor.js +23 -0
- package/dist/core/ingestion/pipeline-phases/call-summaries.d.ts +26 -0
- package/dist/core/ingestion/pipeline-phases/call-summaries.js +46 -0
- package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
- package/dist/core/ingestion/pipeline-phases/index.js +2 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +0 -21
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +18 -1
- package/dist/core/ingestion/pipeline-phases/routes.d.ts +10 -0
- package/dist/core/ingestion/pipeline-phases/routes.js +30 -1
- package/dist/core/ingestion/pipeline-phases/taint-summaries.d.ts +30 -0
- package/dist/core/ingestion/pipeline-phases/taint-summaries.js +81 -0
- package/dist/core/ingestion/pipeline.d.ts +92 -10
- package/dist/core/ingestion/pipeline.js +11 -2
- package/dist/core/ingestion/scope-extractor.js +12 -2
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +9 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +75 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +67 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +12 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +14 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +6 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +13 -1
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +9 -1
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +28 -2
- package/dist/core/ingestion/scope-resolution/passes/overload-narrowing.d.ts +4 -0
- package/dist/core/ingestion/scope-resolution/passes/overload-narrowing.js +9 -0
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +6 -1
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +174 -40
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +24 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +276 -190
- package/dist/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +43 -3
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +75 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +349 -1
- package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
- package/dist/core/ingestion/taint/call-summary-codec.d.ts +75 -0
- package/dist/core/ingestion/taint/call-summary-codec.js +128 -0
- package/dist/core/ingestion/taint/call-summary-emit.d.ts +43 -0
- package/dist/core/ingestion/taint/call-summary-emit.js +70 -0
- package/dist/core/ingestion/taint/call-summary-harvest.d.ts +77 -0
- package/dist/core/ingestion/taint/call-summary-harvest.js +179 -0
- package/dist/core/ingestion/taint/call-summary-model.d.ts +47 -0
- package/dist/core/ingestion/taint/call-summary-model.js +25 -0
- package/dist/core/ingestion/taint/emit.d.ts +125 -0
- package/dist/core/ingestion/taint/emit.js +208 -0
- package/dist/core/ingestion/taint/interproc-emit.d.ts +50 -0
- package/dist/core/ingestion/taint/interproc-emit.js +88 -0
- package/dist/core/ingestion/taint/interproc-solver.d.ts +110 -0
- package/dist/core/ingestion/taint/interproc-solver.js +312 -0
- package/dist/core/ingestion/taint/match.d.ts +153 -0
- package/dist/core/ingestion/taint/match.js +278 -0
- package/dist/core/ingestion/taint/path-codec.d.ts +134 -0
- package/dist/core/ingestion/taint/path-codec.js +190 -0
- package/dist/core/ingestion/taint/propagate.d.ts +216 -0
- package/dist/core/ingestion/taint/propagate.js +659 -0
- package/dist/core/ingestion/taint/site-safety.d.ts +29 -0
- package/dist/core/ingestion/taint/site-safety.js +98 -0
- package/dist/core/ingestion/taint/source-sink-config.d.ts +107 -23
- package/dist/core/ingestion/taint/source-sink-config.js +35 -12
- package/dist/core/ingestion/taint/source-sink-registry.d.ts +6 -4
- package/dist/core/ingestion/taint/source-sink-registry.js +6 -4
- package/dist/core/ingestion/taint/summary-harvest-driver.d.ts +80 -0
- package/dist/core/ingestion/taint/summary-harvest-driver.js +179 -0
- package/dist/core/ingestion/taint/summary-harvest.d.ts +89 -0
- package/dist/core/ingestion/taint/summary-harvest.js +537 -0
- package/dist/core/ingestion/taint/summary-model.d.ts +200 -0
- package/dist/core/ingestion/taint/summary-model.js +86 -0
- package/dist/core/ingestion/taint/typescript-model.d.ts +38 -0
- package/dist/core/ingestion/taint/typescript-model.js +102 -0
- package/dist/core/ingestion/type-extractors/c-cpp.js +21 -0
- package/dist/core/ingestion/utils/env.d.ts +7 -0
- package/dist/core/ingestion/utils/env.js +12 -0
- package/dist/core/ingestion/utils/method-props.js +1 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +13 -0
- package/dist/core/ingestion/workers/parse-worker.js +76 -17
- package/dist/core/ingestion/workers/worker-pool.d.ts +9 -40
- package/dist/core/ingestion/workers/worker-pool.js +15 -2
- package/dist/core/lbug/csv-generator.d.ts +51 -3
- package/dist/core/lbug/csv-generator.js +369 -255
- package/dist/core/lbug/lbug-adapter.d.ts +58 -18
- package/dist/core/lbug/lbug-adapter.js +346 -84
- package/dist/core/lbug/lbug-config.d.ts +19 -0
- package/dist/core/lbug/lbug-config.js +29 -0
- package/dist/core/lbug/pdg-emit-sink.d.ts +127 -0
- package/dist/core/lbug/pdg-emit-sink.js +358 -0
- package/dist/core/lbug/pool-adapter.d.ts +35 -0
- package/dist/core/lbug/pool-adapter.js +90 -1
- package/dist/core/lbug/rel-pair-routing.d.ts +54 -0
- package/dist/core/lbug/rel-pair-routing.js +140 -0
- package/dist/core/lbug/schema.d.ts +2 -2
- package/dist/core/lbug/schema.js +3 -0
- package/dist/core/logger.d.ts +0 -5
- package/dist/core/run-analyze.d.ts +96 -0
- package/dist/core/run-analyze.js +207 -3
- package/dist/core/tree-sitter/parser-loader.js +5 -4
- package/dist/core/tree-sitter/safe-parse.d.ts +0 -5
- package/dist/core/tree-sitter/vendored-grammars.d.ts +39 -0
- package/dist/core/tree-sitter/vendored-grammars.js +57 -0
- package/dist/core/wiki/generator.js +3 -1
- package/dist/core/wiki/graph-queries.d.ts +6 -0
- package/dist/core/wiki/graph-queries.js +9 -1
- package/dist/mcp/http-transport.d.ts +134 -0
- package/dist/mcp/http-transport.js +503 -0
- package/dist/mcp/local/local-backend.d.ts +110 -24
- package/dist/mcp/local/local-backend.js +1225 -19
- package/dist/mcp/local/pdg-impact.d.ts +384 -0
- package/dist/mcp/local/pdg-impact.js +1972 -0
- package/dist/mcp/resources.js +13 -1
- package/dist/mcp/tools.d.ts +12 -0
- package/dist/mcp/tools.js +214 -7
- package/dist/server/analyze-launch.d.ts +29 -0
- package/dist/server/analyze-launch.js +137 -0
- package/dist/server/analyze-upload.d.ts +33 -0
- package/dist/server/analyze-upload.js +123 -0
- package/dist/server/analyze-worker.d.ts +17 -1
- package/dist/server/api.d.ts +17 -0
- package/dist/server/api.js +132 -168
- package/dist/server/git-clone.d.ts +43 -2
- package/dist/server/git-clone.js +211 -16
- package/dist/server/mcp-http.d.ts +5 -6
- package/dist/server/mcp-http.js +9 -82
- package/dist/server/middleware.d.ts +40 -0
- package/dist/server/middleware.js +92 -0
- package/dist/server/private-ip.d.ts +1 -0
- package/dist/server/private-ip.js +15 -0
- package/dist/server/upload-ingest.d.ts +56 -0
- package/dist/server/upload-ingest.js +276 -0
- package/dist/server/upload-paths.d.ts +37 -0
- package/dist/server/upload-paths.js +57 -0
- package/dist/server/upload-sweep.d.ts +20 -0
- package/dist/server/upload-sweep.js +57 -0
- package/dist/storage/git.js +5 -8
- package/dist/storage/parse-cache.d.ts +22 -1
- package/dist/storage/parse-cache.js +41 -10
- package/dist/storage/repo-manager.d.ts +121 -10
- package/dist/storage/repo-manager.js +43 -5
- package/dist/types/pipeline.d.ts +9 -0
- package/hooks/antigravity/gitnexus-antigravity-hook.cjs +110 -10
- package/hooks/claude/gitnexus-hook.cjs +110 -13
- package/hooks/claude/hook-db-lock-probe.cjs +513 -26
- package/package.json +8 -2
- package/scripts/assert-publish-grammar-coverage.cjs +31 -0
- package/scripts/build-tree-sitter-grammars.cjs +16 -10
- package/scripts/cross-platform-tests.ts +1 -0
- package/skills/gitnexus-debugging.md +16 -4
- package/skills/gitnexus-exploring.md +3 -3
- package/skills/gitnexus-guide.md +33 -0
- package/skills/gitnexus-pdg-query.md +89 -0
- package/skills/gitnexus-refactoring.md +1 -1
- package/skills/gitnexus-taint-analysis.md +178 -0
- package/vendor/tree-sitter-c/package.json +1 -1
- package/vendor/tree-sitter-dart/package.json +1 -1
- package/vendor/tree-sitter-kotlin/package.json +1 -1
- package/vendor/tree-sitter-proto/package.json +1 -1
- package/vendor/tree-sitter-swift/package.json +1 -1
- package/web/assets/{agent-CKPMqImC.js → agent-D3Xd7zZE.js} +123 -123
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +1 -0
- package/web/assets/architectureDiagram-UL44E2DR-ChH9xW-N.js +36 -0
- package/web/assets/{blockDiagram-7IZFK4PR-B4niSLvR.js → blockDiagram-7IZFK4PR-BkWhpzWB.js} +1 -1
- package/web/assets/{c4Diagram-Y2BXMSZH-DIzEXalR.js → c4Diagram-Y2BXMSZH-DtBvpzWD.js} +1 -1
- package/web/assets/{chunk-3SSMPTDK-BzGeeheI.js → chunk-3SSMPTDK-B4_etUhr.js} +2 -2
- package/web/assets/{chunk-5IMINLNL-CnTLsXIV.js → chunk-5IMINLNL-DOdTeQri.js} +1 -1
- package/web/assets/{chunk-5VCL7Z4A-w1BCx98Z.js → chunk-5VCL7Z4A-CQ-2dYWj.js} +1 -1
- package/web/assets/chunk-6764PJDD-DpIS7hxD.js +1 -0
- package/web/assets/{chunk-67TQ5CYL-CChC2cAv.js → chunk-67TQ5CYL-4sNPJU1q.js} +3 -3
- package/web/assets/{chunk-7W6UQGC5-CgFyfZ6k.js → chunk-7W6UQGC5-KyEG0HQg.js} +1 -1
- package/web/assets/{chunk-AZZRMDJM-5E9ARdDQ.js → chunk-AZZRMDJM-y-xJBuMz.js} +1 -1
- package/web/assets/{chunk-INKRHTLW-ELpfuk9h.js → chunk-INKRHTLW-Nu4ri9P-.js} +1 -1
- package/web/assets/{chunk-JQRUD6KW-Dcq_Qnyy.js → chunk-JQRUD6KW-Dbva2Z17.js} +1 -1
- package/web/assets/{chunk-KGFNY3KK-W-VR57xb.js → chunk-KGFNY3KK-JGMJvKCK.js} +1 -1
- package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +161 -0
- package/web/assets/{chunk-KNLZD3CH-BuZBOcso.js → chunk-KNLZD3CH-BGlP6X9R.js} +1 -1
- package/web/assets/{chunk-KRXBNO2N-DH2NPM7I.js → chunk-KRXBNO2N-BW5o0KUN.js} +1 -1
- package/web/assets/{chunk-LCXTWHL2-Dfmux4m1.js → chunk-LCXTWHL2-zoomRtWX.js} +1 -1
- package/web/assets/{chunk-LII3EMHJ-3X33tCpU.js → chunk-LII3EMHJ-D-jm-dLa.js} +1 -1
- package/web/assets/{chunk-QA3QBVWF-D5Ha3GgB.js → chunk-QA3QBVWF-BgRW3SXd.js} +1 -1
- package/web/assets/{chunk-RG4AUYOV-CAkzcoRj.js → chunk-RG4AUYOV-DD0B2N2B.js} +1 -1
- package/web/assets/{chunk-T2UQINTJ-kGYG7ppP.js → chunk-T2UQINTJ-DSBqkzH7.js} +1 -1
- package/web/assets/chunk-T5OCTHI4-DdZvN-9i.js +1 -0
- package/web/assets/{chunk-UY5QBCOK-Du-c56gs.js → chunk-UY5QBCOK-DyF0vyGd.js} +1 -1
- package/web/assets/{chunk-W44A43WB-lrCpuupA.js → chunk-W44A43WB-JqMLIpR0.js} +1 -1
- package/web/assets/{chunk-ZXARS5L4-CSZRiyOf.js → chunk-ZXARS5L4-CxN8oiwI.js} +1 -1
- package/web/assets/classDiagram-KGZ6W3CR-DJm9BgF-.js +1 -0
- package/web/assets/classDiagram-v2-72OJOZXJ-DJm9BgF-.js +1 -0
- package/web/assets/{context-builder-_HS0v2ma.js → context-builder-BHiFUA8O.js} +10 -2
- package/web/assets/{cose-bilkent-UX7MHV2Q-BHv2bbtl.js → cose-bilkent-UX7MHV2Q-D71wNYRJ.js} +1 -1
- package/web/assets/dagre-ND4H6XIP-BIkxmhcu.js +4 -0
- package/web/assets/diagram-3NCE3AQN-BTa6iH0T.js +43 -0
- package/web/assets/diagram-GF46GFSD-DZDV0vBj.js +24 -0
- package/web/assets/{diagram-HNR7UZ2L-fUWreZzx.js → diagram-HNR7UZ2L-DFCfd5LI.js} +2 -2
- package/web/assets/diagram-QXG6HAR7-BzM--Jj0.js +24 -0
- package/web/assets/diagram-WEQXMOUZ-DFFwz0k4.js +10 -0
- package/web/assets/{erDiagram-L5TCEMPS-QN2eEP1e.js → erDiagram-L5TCEMPS-CfHMJJqo.js} +1 -1
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +1 -0
- package/web/assets/{flowDiagram-H6V6AXG4-CXbXImlN.js → flowDiagram-H6V6AXG4-Be805QiJ.js} +3 -3
- package/web/assets/{ganttDiagram-JCBTUEKG-BHQssTz6.js → ganttDiagram-JCBTUEKG-D3iL2Aet.js} +1 -1
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +1 -0
- package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +106 -0
- package/web/assets/index-BvYev1UJ.js +635 -0
- package/web/assets/index-_lgn7hs5.css +2 -0
- package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +1 -0
- package/web/assets/infoDiagram-3YFTVSEB-Y7BKSoke.js +2 -0
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-6LKOvBfp.js → ishikawaDiagram-BNXS4ZKH-CT4SHFuI.js} +1 -1
- package/web/assets/{journeyDiagram-M6C3CM3L-DNPYCpvq.js → journeyDiagram-M6C3CM3L-CvArszLo.js} +1 -1
- package/web/assets/{kanban-definition-75IXJCU3-DgDi9oJT.js → kanban-definition-75IXJCU3-C6yDxr7N.js} +3 -3
- package/web/assets/{katex-K3KEBU37-CrVLz8l7.js → katex-K3KEBU37-CTc5BslQ.js} +1 -1
- package/web/assets/{mindmap-definition-2TDM6QVE-CwR5sBB-.js → mindmap-definition-2TDM6QVE-BOc2WEne.js} +1 -1
- package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +1 -0
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +1 -0
- package/web/assets/{pieDiagram-CU6KROY3-By8g6f6B.js → pieDiagram-CU6KROY3-Cvc0f_Pd.js} +1 -1
- package/web/assets/{quadrantDiagram-VICAPDV7-bAm6Hi_5.js → quadrantDiagram-VICAPDV7-yXSZ2lLz.js} +1 -1
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +1 -0
- package/web/assets/{requirementDiagram-JXO7QTGE-7oDcJ1_J.js → requirementDiagram-JXO7QTGE-BRcZvHs4.js} +1 -1
- package/web/assets/{sankeyDiagram-URQDO5SZ-LFJz53u5.js → sankeyDiagram-URQDO5SZ-1qEjlFIB.js} +1 -1
- package/web/assets/{sequenceDiagram-VS2MUI6T-FySeKCUy.js → sequenceDiagram-VS2MUI6T-PcSCuvrB.js} +3 -3
- package/web/assets/stateDiagram-7D4R322I-D6qYSV1E.js +1 -0
- package/web/assets/stateDiagram-v2-36443NZ5-Bg-ImOSX.js +1 -0
- package/web/assets/{timeline-definition-O6YCAMPW-Ds2CnVZK.js → timeline-definition-O6YCAMPW-QWkh01xw.js} +1 -1
- package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +1 -0
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +1 -0
- package/web/assets/{vennDiagram-MWXL3ELB-DUIEwXWp.js → vennDiagram-MWXL3ELB-ak4DfwuM.js} +3 -3
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +1 -0
- package/web/assets/{wardleyDiagram-CUQ6CDDI-DEiFPQih.js → wardleyDiagram-CUQ6CDDI-CTzR4Loq.js} +1 -1
- package/web/assets/{xychartDiagram-N2JHSOCM-BUbayhST.js → xychartDiagram-N2JHSOCM-DA1BEaQz.js} +1 -1
- package/web/index.html +13 -15
- package/scripts/materialize-vendor-grammars.cjs +0 -97
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BETj2x4g.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-D1EXI0zA.js +0 -36
- package/web/assets/chunk-2T2R6R2M-n6s9JZqv.js +0 -4
- package/web/assets/chunk-2UTLFMKG-CMBB1TMN.js +0 -1
- package/web/assets/chunk-4R4BOZG6-mKhL59ul.js +0 -159
- package/web/assets/chunk-6764PJDD-ChwMM2z4.js +0 -1
- package/web/assets/chunk-7J6CGLKN-DT-b53FT.js +0 -10
- package/web/assets/chunk-C62D2QBJ-CDAWj26E.js +0 -1
- package/web/assets/chunk-CEXFNPSA-D68Tk6ls.js +0 -1
- package/web/assets/chunk-CilyBKbf.js +0 -1
- package/web/assets/chunk-J5EP6P6S-DxWW0yvu.js +0 -1
- package/web/assets/chunk-KGYTTC2M-C6PHeuay.js +0 -1
- package/web/assets/chunk-RERM46MO-DQNbXtfw.js +0 -1
- package/web/assets/chunk-RKZBBQEN-BmTPLSyv.js +0 -1
- package/web/assets/chunk-RLI5ZMPA-DExu2DOK.js +0 -1
- package/web/assets/chunk-T5OCTHI4--9wWpVws.js +0 -1
- package/web/assets/chunk-UP6H54XL-DsKdC6jC.js +0 -1
- package/web/assets/chunk-UXSXWOXI-DR81EqLr.js +0 -1
- package/web/assets/classDiagram-KGZ6W3CR-Bv93af_b.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-CLfEqHUa.js +0 -1
- package/web/assets/dagre-ND4H6XIP-DsIr9MOv.js +0 -4
- package/web/assets/diagram-3NCE3AQN-BqAtKUpW.js +0 -43
- package/web/assets/diagram-GF46GFSD-CaBG6n6o.js +0 -24
- package/web/assets/diagram-QXG6HAR7-CZ-O3rcV.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-P4lSL4GH.js +0 -10
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-B3myHUst.js +0 -1
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DF3rtf4A.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-CCwVLT__.js +0 -106
- package/web/assets/index-BKWA-m7o.css +0 -2
- package/web/assets/index-CG6q8eTs.js +0 -626
- package/web/assets/info-J43DQDTF-KCYPFFUO-R4XV_akJ.js +0 -1
- package/web/assets/infoDiagram-3YFTVSEB-DmLICZx1.js +0 -2
- package/web/assets/packet-YPE3B663-LP52Z2RK-CgQPdNZa.js +0 -1
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-BzWOwc_c.js +0 -1
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-B7KG0FN7.js +0 -1
- package/web/assets/stateDiagram-7D4R322I-CB2nABwH.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-COBGd2RL.js +0 -1
- package/web/assets/treeView-BLDUP644-QA4HXRO3-CRSxEwLO.js +0 -1
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-a0PfKoVn.js +0 -1
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-BKQ6e5mC.js +0 -1
- /package/web/assets/{chunk-AQ6EADP3-CCFje6lL.js → chunk-AQ6EADP3-CZhslHi-.js} +0 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call-summary reason codec (PDG FU-C, U-C2) — the ONE shared encoder/decoder
|
|
3
|
+
* for the bitset carried on persisted `CALL_SUMMARY` edges.
|
|
4
|
+
*
|
|
5
|
+
* A `CALL_SUMMARY` edge is a self-loop on a Function/Method/Constructor node
|
|
6
|
+
* recording that callee's RETURN-VALUE ASCENT: for each formal-parameter index,
|
|
7
|
+
* whether that parameter flows to the function's return value. The producer
|
|
8
|
+
* (the whole-program emit phase) writes this; a later consumer phase reads it to
|
|
9
|
+
* ascend a callee's return effect into the caller continuation. Two hand-rolled
|
|
10
|
+
* copies of a wire format drift — both sides MUST import from here (the same
|
|
11
|
+
* discipline `path-codec.ts` documents).
|
|
12
|
+
*
|
|
13
|
+
* ## Wire format (version `1`)
|
|
14
|
+
*
|
|
15
|
+
* ```
|
|
16
|
+
* 1|r:<hexbitset>[|<reserved-segment>…]
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* - One-character version prefix ({@link CALL_SUMMARY_CODEC_VERSION}), then `|`,
|
|
20
|
+
* then a `r:` (return) segment whose payload is the param→return bitset as a
|
|
21
|
+
* lowercase hex string (LSB = formal index 0). Bit `i` set ⇒ formal parameter
|
|
22
|
+
* `i` flows to the return value. An empty/zero bitset is the absence of any
|
|
23
|
+
* return-flow (a sound EMPTY summary — never a false claim).
|
|
24
|
+
* - FORWARD COMPATIBILITY: the format reserves space for future facts via
|
|
25
|
+
* additional trailing `|<tag>:<payload>` segments (planned: `o:` out-params,
|
|
26
|
+
* `e:` exception ascent — both deferred: out-params need an alias model,
|
|
27
|
+
* exception ascent needs try/catch CDG). The decoder accepts and ignores any
|
|
28
|
+
* trailing segment whose tag it does not understand, so a future writer's
|
|
29
|
+
* output stays decodable by today's reader (and vice-versa: today's reader
|
|
30
|
+
* only requires the `r:` segment). Reserved tags MUST stay disjoint from `r`.
|
|
31
|
+
*
|
|
32
|
+
* ## Delimiter / round-trip discipline (mirrors path-codec KTD6)
|
|
33
|
+
*
|
|
34
|
+
* Every structural character (`|`, `:`, the version digit, hex digits `[0-9a-f]`)
|
|
35
|
+
* is printable ASCII, so the encoding survives `escapeCSVField ∘ sanitizeUTF8`
|
|
36
|
+
* (csv-generator.ts) byte-exact (pinned by the round-trip test). The hex payload
|
|
37
|
+
* is a non-negative integer rendered via BigInt, so the codec handles functions
|
|
38
|
+
* with arbitrarily many formal parameters without overflow.
|
|
39
|
+
*
|
|
40
|
+
* The decoder NEVER throws — anything malformed yields a typed failure, exactly
|
|
41
|
+
* like `decodeTaintPath`. A decode failure on the consumer side means "no usable
|
|
42
|
+
* ascent fact", which is the sound default (never claim a false return-flow).
|
|
43
|
+
*/
|
|
44
|
+
/** One-character format version prefix. Bump on any wire-format change. */
|
|
45
|
+
export const CALL_SUMMARY_CODEC_VERSION = '1';
|
|
46
|
+
/** Return-flow segment tag (`r:<hexbitset>`). */
|
|
47
|
+
const RETURN_TAG = 'r';
|
|
48
|
+
/** Hex payload charset (lowercase). */
|
|
49
|
+
const HEX = /^[0-9a-f]+$/;
|
|
50
|
+
/**
|
|
51
|
+
* Pack a set of return-flowing formal-parameter indices into a bitset (LSB =
|
|
52
|
+
* index 0). Negative or non-integer indices are ignored (defensive; the
|
|
53
|
+
* harvester only ever passes non-negative integers). Returns a `BigInt`.
|
|
54
|
+
*/
|
|
55
|
+
function packReturnBitset(returnFlowParams) {
|
|
56
|
+
let bits = 0n;
|
|
57
|
+
for (const idx of returnFlowParams) {
|
|
58
|
+
if (!Number.isInteger(idx) || idx < 0)
|
|
59
|
+
continue;
|
|
60
|
+
bits |= 1n << BigInt(idx);
|
|
61
|
+
}
|
|
62
|
+
return bits;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Encode the param→return ascent into the versioned `reason` wire string.
|
|
66
|
+
* Deterministic; never throws. `returnFlowParams` is the set of formal indices
|
|
67
|
+
* that flow to the return value (order/duplication irrelevant — the bitset
|
|
68
|
+
* canonicalises). An empty set encodes as `r:0` (an explicit empty summary).
|
|
69
|
+
*/
|
|
70
|
+
export function encodeCallSummary(returnFlowParams) {
|
|
71
|
+
const bits = packReturnBitset(returnFlowParams);
|
|
72
|
+
return `${CALL_SUMMARY_CODEC_VERSION}|${RETURN_TAG}:${bits.toString(16)}`;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Decode a `CALL_SUMMARY` reason wire string into its ascent facts. Returns a
|
|
76
|
+
* typed failure for anything that is not a well-formed version-`1` summary —
|
|
77
|
+
* never throws. Unknown trailing segments (future facts) are accepted and
|
|
78
|
+
* ignored (forward compatibility).
|
|
79
|
+
*/
|
|
80
|
+
export function decodeCallSummary(reason) {
|
|
81
|
+
if (typeof reason !== 'string' || reason.length === 0) {
|
|
82
|
+
return { ok: false, error: 'empty or non-string reason' };
|
|
83
|
+
}
|
|
84
|
+
// Read the version as the substring BEFORE the first '|' (NOT a single char):
|
|
85
|
+
// the wire format reserves multi-digit future versions, so a `12|…` writer must
|
|
86
|
+
// degrade to a clean 'unsupported version' typed-failure here, never silently
|
|
87
|
+
// parse as version '1' with a stray '2' segment. No '|' ⇒ the whole reason is a
|
|
88
|
+
// bare token with no body, which is malformed.
|
|
89
|
+
const firstSep = reason.indexOf('|');
|
|
90
|
+
if (firstSep === -1) {
|
|
91
|
+
return { ok: false, error: 'malformed body: expected a segment separator after the version' };
|
|
92
|
+
}
|
|
93
|
+
const version = reason.slice(0, firstSep);
|
|
94
|
+
if (version !== CALL_SUMMARY_CODEC_VERSION) {
|
|
95
|
+
return { ok: false, error: `unsupported call-summary version '${version}'` };
|
|
96
|
+
}
|
|
97
|
+
const segments = reason.slice(firstSep + 1).split('|');
|
|
98
|
+
let returnBits;
|
|
99
|
+
for (const seg of segments) {
|
|
100
|
+
const sep = seg.indexOf(':');
|
|
101
|
+
if (sep === -1) {
|
|
102
|
+
return { ok: false, error: `malformed segment '${seg}' (expected '<tag>:<payload>')` };
|
|
103
|
+
}
|
|
104
|
+
const tag = seg.slice(0, sep);
|
|
105
|
+
const payload = seg.slice(sep + 1);
|
|
106
|
+
if (tag === RETURN_TAG) {
|
|
107
|
+
if (!HEX.test(payload)) {
|
|
108
|
+
return { ok: false, error: `invalid return bitset '${payload}'` };
|
|
109
|
+
}
|
|
110
|
+
returnBits = BigInt(`0x${payload}`);
|
|
111
|
+
}
|
|
112
|
+
// Unknown tag (reserved future fact): accept + ignore for forward compat.
|
|
113
|
+
}
|
|
114
|
+
if (returnBits === undefined) {
|
|
115
|
+
return { ok: false, error: "missing required 'r:' return segment" };
|
|
116
|
+
}
|
|
117
|
+
// Unpack the bitset into ascending formal indices.
|
|
118
|
+
const returnFlowParams = [];
|
|
119
|
+
let bits = returnBits;
|
|
120
|
+
let idx = 0;
|
|
121
|
+
while (bits > 0n) {
|
|
122
|
+
if ((bits & 1n) === 1n)
|
|
123
|
+
returnFlowParams.push(idx);
|
|
124
|
+
bits >>= 1n;
|
|
125
|
+
idx++;
|
|
126
|
+
}
|
|
127
|
+
return { ok: true, version, returnFlowParams };
|
|
128
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call-summary emission (PDG FU-C, U-C3) — materialise `CALL_SUMMARY`.
|
|
3
|
+
*
|
|
4
|
+
* Persists each per-callee {@link CallSummary} as ONE `CALL_SUMMARY` self-loop
|
|
5
|
+
* edge on the callee Function/Method/Constructor node, with the param→return
|
|
6
|
+
* ASCENT bitset encoded in `reason` via the SHARED {@link call-summary-codec}
|
|
7
|
+
* (never a second hand-rolled wire format). A later consumer phase decodes it to
|
|
8
|
+
* ascend a callee's return effect into the caller continuation.
|
|
9
|
+
*
|
|
10
|
+
* The self-loop shape matches the schema (Function→Function / Method→Method /
|
|
11
|
+
* Constructor→Constructor pairs already exist from the M0 TAINT_PATH work — zero
|
|
12
|
+
* new schema pairs). Like `TAINT_PATH`/`TAINTED`, `CALL_SUMMARY` stays OUT of
|
|
13
|
+
* `VALID_RELATION_TYPES` and the web schema — it is an internal PDG-engine edge.
|
|
14
|
+
*
|
|
15
|
+
* Boundedness mirrors the M4 interproc emit driver: dedup by the deterministic
|
|
16
|
+
* edge id, an optional per-run cap, and unconditional truncate-and-warn.
|
|
17
|
+
*/
|
|
18
|
+
import type { KnowledgeGraph } from '../../graph/types.js';
|
|
19
|
+
import type { CallSummary } from './call-summary-model.js';
|
|
20
|
+
/** Confidence stamped on `CALL_SUMMARY` edges. A summary is a context-
|
|
21
|
+
* insensitive whole-parameter abstraction — a coarser signal than a resolved
|
|
22
|
+
* `CALLS` edge, so kept below 1.0 (mirrors the interproc TAINT_PATH posture). */
|
|
23
|
+
export declare const CALL_SUMMARY_CONFIDENCE = 0.6;
|
|
24
|
+
/** Default per-run cap on emitted `CALL_SUMMARY` edges. `0` ⇒ unlimited. */
|
|
25
|
+
export declare const DEFAULT_PDG_MAX_CALL_SUMMARY_EDGES = 0;
|
|
26
|
+
export interface CallSummaryEmitLimits {
|
|
27
|
+
/** Max `CALL_SUMMARY` edges per run (post-dedup). `undefined`/0 ⇒ unlimited. */
|
|
28
|
+
readonly maxEdges?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface CallSummaryEmitResult {
|
|
31
|
+
/** CALL_SUMMARY edges persisted. */
|
|
32
|
+
edgesEmitted: number;
|
|
33
|
+
/** Summaries dropped by the per-run cap. */
|
|
34
|
+
edgesDropped: number;
|
|
35
|
+
/** Summaries skipped because the callee node was missing from the graph. */
|
|
36
|
+
skippedMissingEndpoint: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Persist per-callee summaries as `CALL_SUMMARY` self-loop edges. `summaries` is
|
|
40
|
+
* assumed deterministically ordered (the harvest sorts `returnFlowParams`).
|
|
41
|
+
* Never throws on valid input.
|
|
42
|
+
*/
|
|
43
|
+
export declare function emitCallSummaries(graph: KnowledgeGraph, summaries: readonly CallSummary[], limits?: CallSummaryEmitLimits, onWarn?: (message: string) => void): CallSummaryEmitResult;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call-summary emission (PDG FU-C, U-C3) — materialise `CALL_SUMMARY`.
|
|
3
|
+
*
|
|
4
|
+
* Persists each per-callee {@link CallSummary} as ONE `CALL_SUMMARY` self-loop
|
|
5
|
+
* edge on the callee Function/Method/Constructor node, with the param→return
|
|
6
|
+
* ASCENT bitset encoded in `reason` via the SHARED {@link call-summary-codec}
|
|
7
|
+
* (never a second hand-rolled wire format). A later consumer phase decodes it to
|
|
8
|
+
* ascend a callee's return effect into the caller continuation.
|
|
9
|
+
*
|
|
10
|
+
* The self-loop shape matches the schema (Function→Function / Method→Method /
|
|
11
|
+
* Constructor→Constructor pairs already exist from the M0 TAINT_PATH work — zero
|
|
12
|
+
* new schema pairs). Like `TAINT_PATH`/`TAINTED`, `CALL_SUMMARY` stays OUT of
|
|
13
|
+
* `VALID_RELATION_TYPES` and the web schema — it is an internal PDG-engine edge.
|
|
14
|
+
*
|
|
15
|
+
* Boundedness mirrors the M4 interproc emit driver: dedup by the deterministic
|
|
16
|
+
* edge id, an optional per-run cap, and unconditional truncate-and-warn.
|
|
17
|
+
*/
|
|
18
|
+
import { encodeCallSummary } from './call-summary-codec.js';
|
|
19
|
+
/** Confidence stamped on `CALL_SUMMARY` edges. A summary is a context-
|
|
20
|
+
* insensitive whole-parameter abstraction — a coarser signal than a resolved
|
|
21
|
+
* `CALLS` edge, so kept below 1.0 (mirrors the interproc TAINT_PATH posture). */
|
|
22
|
+
export const CALL_SUMMARY_CONFIDENCE = 0.6;
|
|
23
|
+
/** Default per-run cap on emitted `CALL_SUMMARY` edges. `0` ⇒ unlimited. */
|
|
24
|
+
export const DEFAULT_PDG_MAX_CALL_SUMMARY_EDGES = 0;
|
|
25
|
+
/**
|
|
26
|
+
* Persist per-callee summaries as `CALL_SUMMARY` self-loop edges. `summaries` is
|
|
27
|
+
* assumed deterministically ordered (the harvest sorts `returnFlowParams`).
|
|
28
|
+
* Never throws on valid input.
|
|
29
|
+
*/
|
|
30
|
+
export function emitCallSummaries(graph, summaries, limits, onWarn) {
|
|
31
|
+
const result = {
|
|
32
|
+
edgesEmitted: 0,
|
|
33
|
+
edgesDropped: 0,
|
|
34
|
+
skippedMissingEndpoint: 0,
|
|
35
|
+
};
|
|
36
|
+
const maxEdges = limits?.maxEdges && limits.maxEdges > 0 ? limits.maxEdges : Infinity;
|
|
37
|
+
const seen = new Set();
|
|
38
|
+
for (const summary of summaries) {
|
|
39
|
+
if (result.edgesEmitted >= maxEdges) {
|
|
40
|
+
result.edgesDropped++;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const node = graph.getNode(summary.fnId);
|
|
44
|
+
if (!node) {
|
|
45
|
+
result.skippedMissingEndpoint++;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
// One self-loop edge per callee; dedup by the callee id (the harvest already
|
|
49
|
+
// produces at most one summary per resolved fnId, but a same-line anchor
|
|
50
|
+
// could in principle map two CFGs to one id — the Set keeps it idempotent).
|
|
51
|
+
const id = `rel:CALL_SUMMARY:${summary.fnId}`;
|
|
52
|
+
if (seen.has(id))
|
|
53
|
+
continue;
|
|
54
|
+
seen.add(id);
|
|
55
|
+
graph.addRelationship({
|
|
56
|
+
id,
|
|
57
|
+
sourceId: summary.fnId,
|
|
58
|
+
targetId: summary.fnId,
|
|
59
|
+
type: 'CALL_SUMMARY',
|
|
60
|
+
confidence: CALL_SUMMARY_CONFIDENCE,
|
|
61
|
+
reason: encodeCallSummary(summary.returnFlowParams),
|
|
62
|
+
});
|
|
63
|
+
result.edgesEmitted++;
|
|
64
|
+
}
|
|
65
|
+
if (result.edgesDropped > 0) {
|
|
66
|
+
onWarn?.(`[call-summary] ${result.edgesDropped} CALL_SUMMARY edge(s) dropped by the ` +
|
|
67
|
+
`per-run cap (${maxEdges})`);
|
|
68
|
+
}
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-function dependence-SUMMARY harvest (PDG FU-C, U-C2).
|
|
3
|
+
*
|
|
4
|
+
* Pure, deterministic derivation of one function's RETURN-VALUE ASCENT — which
|
|
5
|
+
* formal-parameter indices flow to the function's return value — from the SAME
|
|
6
|
+
* substrate the M2/M3 passes consume: the reaching-definition facts
|
|
7
|
+
* (`computeReachingDefs`) over the function's CFG. No graph, no I/O, no logger;
|
|
8
|
+
* mirrors the {@link harvestFunctionSummary} (taint) contract so snapshot tests
|
|
9
|
+
* and the version stamp stay stable. Runs IN-PHASE inside the scope-resolution
|
|
10
|
+
* pdg window where the RD facts are materialised (reusing them — zero new
|
|
11
|
+
* worker/CFG work, so NO parse-cache pdg:N bump).
|
|
12
|
+
*
|
|
13
|
+
* ## Return-site identification (language-agnostic, soundness-first)
|
|
14
|
+
*
|
|
15
|
+
* Return statements are identified STRUCTURALLY via the M2 edge-kind invariant:
|
|
16
|
+
* the SOURCE block of every CFG edge of kind `return` terminates in the return
|
|
17
|
+
* jump, so that block's LAST statement is the `return <expr>` — its `uses` are
|
|
18
|
+
* the returned bindings. A `return;` with no value has empty uses (contributes
|
|
19
|
+
* nothing). For languages whose visitor models IMPLICIT returns (arrow-function
|
|
20
|
+
* expression bodies, Python last-expression), the CFG emits a `return` edge to
|
|
21
|
+
* EXIT whose source block's last statement carries the returned expression's
|
|
22
|
+
* `uses`, so those flow through the same path with no language-specific code.
|
|
23
|
+
*
|
|
24
|
+
* SOUNDNESS = never claim a false return-flow: when a function has NO `return`
|
|
25
|
+
* CFG edge (a language/shape with no robust exit notion modelled, or a void
|
|
26
|
+
* function), `returnUseStmtKeys` is empty and the harvest emits an EMPTY summary
|
|
27
|
+
* — the absence of a fact, never a wrong one.
|
|
28
|
+
*
|
|
29
|
+
* ## Param → return reachability
|
|
30
|
+
*
|
|
31
|
+
* Each formal parameter is seeded as a value at its entry def point(s); forward
|
|
32
|
+
* reachability over the def→use facts marks the param's index as return-flowing
|
|
33
|
+
* the moment a tainted binding it produced (under the M3 statement-level floor:
|
|
34
|
+
* a statement using a value taints all of its defs/mayDefs) is among a
|
|
35
|
+
* return-use statement's `uses`. The recorded edge is from an ACTUAL binding
|
|
36
|
+
* occurrence in a return's uses — never the floor — keeping the recorded fact
|
|
37
|
+
* precise even though onward propagation over-approximates.
|
|
38
|
+
*
|
|
39
|
+
* ## Formal-position soundness — destructured / rest params
|
|
40
|
+
*
|
|
41
|
+
* The consumer reads `returnFlowParams` POSITIONALLY (call-site arg position →
|
|
42
|
+
* same-index formal → bitset), so each recorded index MUST be the 0-based
|
|
43
|
+
* ENCLOSING FORMAL position, never the flattened binding ordinal. A
|
|
44
|
+
* destructured/rest formal binds several names: `function f({a, b}, c)` flattens
|
|
45
|
+
* to bindings a, b, c, whose ORDINALS are 0, 1, 2 — but the formal positions are
|
|
46
|
+
* 0, 0, 1. Recording an ordinal would misattribute `b`'s return-flow to formal
|
|
47
|
+
* `c` (a FALSE return-flow claim, not a miss). To stay sound we key every
|
|
48
|
+
* recorded index on {@link BindingEntry.formalIndex} (the producer-supplied
|
|
49
|
+
* enclosing-formal position, identical for every inner name of one formal).
|
|
50
|
+
*
|
|
51
|
+
* CONSERVATIVE FALLBACK: a producer that does not yet supply `formalIndex` on
|
|
52
|
+
* its param bindings leaves the harvest unable to prove the ordinal equals the
|
|
53
|
+
* formal slot, so the harvest emits an EMPTY summary for that function — a
|
|
54
|
+
* documented MISS (loses ascent), NEVER a false claim. Functions whose every
|
|
55
|
+
* param binding carries `formalIndex` get the precise formal positions.
|
|
56
|
+
*/
|
|
57
|
+
import type { FunctionCfg } from '../cfg/types.js';
|
|
58
|
+
import { type FunctionDefUse } from '../cfg/reaching-defs.js';
|
|
59
|
+
/** The own-facts portion of a call summary (fnId/anchor added by the caller). */
|
|
60
|
+
export interface HarvestedCallSummaryFacts {
|
|
61
|
+
readonly paramCount: number;
|
|
62
|
+
/** Sorted, de-duplicated formal-parameter indices that flow to the return. */
|
|
63
|
+
readonly returnFlowParams: readonly number[];
|
|
64
|
+
}
|
|
65
|
+
export interface CallSummaryHarvestResult {
|
|
66
|
+
/** `computed` — facts derived; `coverage-gap` — the RD solver was not
|
|
67
|
+
* `computed`, so no summary is produced (consistent with the taint harvest). */
|
|
68
|
+
readonly status: 'computed' | 'coverage-gap';
|
|
69
|
+
readonly gapReason?: FunctionDefUse['status'];
|
|
70
|
+
readonly facts: HarvestedCallSummaryFacts;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Harvest the RETURN-VALUE ASCENT facts for one function. PRECONDITION: `cfg`
|
|
74
|
+
* is `isEmitSafeCfg`-filtered and `defUse` was computed from it (the caller
|
|
75
|
+
* gates exactly as the taint harvest path does).
|
|
76
|
+
*/
|
|
77
|
+
export declare function harvestCallSummary(cfg: FunctionCfg, defUse: FunctionDefUse): CallSummaryHarvestResult;
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-function dependence-SUMMARY harvest (PDG FU-C, U-C2).
|
|
3
|
+
*
|
|
4
|
+
* Pure, deterministic derivation of one function's RETURN-VALUE ASCENT — which
|
|
5
|
+
* formal-parameter indices flow to the function's return value — from the SAME
|
|
6
|
+
* substrate the M2/M3 passes consume: the reaching-definition facts
|
|
7
|
+
* (`computeReachingDefs`) over the function's CFG. No graph, no I/O, no logger;
|
|
8
|
+
* mirrors the {@link harvestFunctionSummary} (taint) contract so snapshot tests
|
|
9
|
+
* and the version stamp stay stable. Runs IN-PHASE inside the scope-resolution
|
|
10
|
+
* pdg window where the RD facts are materialised (reusing them — zero new
|
|
11
|
+
* worker/CFG work, so NO parse-cache pdg:N bump).
|
|
12
|
+
*
|
|
13
|
+
* ## Return-site identification (language-agnostic, soundness-first)
|
|
14
|
+
*
|
|
15
|
+
* Return statements are identified STRUCTURALLY via the M2 edge-kind invariant:
|
|
16
|
+
* the SOURCE block of every CFG edge of kind `return` terminates in the return
|
|
17
|
+
* jump, so that block's LAST statement is the `return <expr>` — its `uses` are
|
|
18
|
+
* the returned bindings. A `return;` with no value has empty uses (contributes
|
|
19
|
+
* nothing). For languages whose visitor models IMPLICIT returns (arrow-function
|
|
20
|
+
* expression bodies, Python last-expression), the CFG emits a `return` edge to
|
|
21
|
+
* EXIT whose source block's last statement carries the returned expression's
|
|
22
|
+
* `uses`, so those flow through the same path with no language-specific code.
|
|
23
|
+
*
|
|
24
|
+
* SOUNDNESS = never claim a false return-flow: when a function has NO `return`
|
|
25
|
+
* CFG edge (a language/shape with no robust exit notion modelled, or a void
|
|
26
|
+
* function), `returnUseStmtKeys` is empty and the harvest emits an EMPTY summary
|
|
27
|
+
* — the absence of a fact, never a wrong one.
|
|
28
|
+
*
|
|
29
|
+
* ## Param → return reachability
|
|
30
|
+
*
|
|
31
|
+
* Each formal parameter is seeded as a value at its entry def point(s); forward
|
|
32
|
+
* reachability over the def→use facts marks the param's index as return-flowing
|
|
33
|
+
* the moment a tainted binding it produced (under the M3 statement-level floor:
|
|
34
|
+
* a statement using a value taints all of its defs/mayDefs) is among a
|
|
35
|
+
* return-use statement's `uses`. The recorded edge is from an ACTUAL binding
|
|
36
|
+
* occurrence in a return's uses — never the floor — keeping the recorded fact
|
|
37
|
+
* precise even though onward propagation over-approximates.
|
|
38
|
+
*
|
|
39
|
+
* ## Formal-position soundness — destructured / rest params
|
|
40
|
+
*
|
|
41
|
+
* The consumer reads `returnFlowParams` POSITIONALLY (call-site arg position →
|
|
42
|
+
* same-index formal → bitset), so each recorded index MUST be the 0-based
|
|
43
|
+
* ENCLOSING FORMAL position, never the flattened binding ordinal. A
|
|
44
|
+
* destructured/rest formal binds several names: `function f({a, b}, c)` flattens
|
|
45
|
+
* to bindings a, b, c, whose ORDINALS are 0, 1, 2 — but the formal positions are
|
|
46
|
+
* 0, 0, 1. Recording an ordinal would misattribute `b`'s return-flow to formal
|
|
47
|
+
* `c` (a FALSE return-flow claim, not a miss). To stay sound we key every
|
|
48
|
+
* recorded index on {@link BindingEntry.formalIndex} (the producer-supplied
|
|
49
|
+
* enclosing-formal position, identical for every inner name of one formal).
|
|
50
|
+
*
|
|
51
|
+
* CONSERVATIVE FALLBACK: a producer that does not yet supply `formalIndex` on
|
|
52
|
+
* its param bindings leaves the harvest unable to prove the ordinal equals the
|
|
53
|
+
* formal slot, so the harvest emits an EMPTY summary for that function — a
|
|
54
|
+
* documented MISS (loses ascent), NEVER a false claim. Functions whose every
|
|
55
|
+
* param binding carries `formalIndex` get the precise formal positions.
|
|
56
|
+
*/
|
|
57
|
+
import { pointKey } from '../cfg/reaching-defs.js';
|
|
58
|
+
const EMPTY_FACTS = { paramCount: 0, returnFlowParams: [] };
|
|
59
|
+
/**
|
|
60
|
+
* Harvest the RETURN-VALUE ASCENT facts for one function. PRECONDITION: `cfg`
|
|
61
|
+
* is `isEmitSafeCfg`-filtered and `defUse` was computed from it (the caller
|
|
62
|
+
* gates exactly as the taint harvest path does).
|
|
63
|
+
*/
|
|
64
|
+
export function harvestCallSummary(cfg, defUse) {
|
|
65
|
+
if (defUse.status !== 'computed') {
|
|
66
|
+
return { status: 'coverage-gap', gapReason: defUse.status, facts: EMPTY_FACTS };
|
|
67
|
+
}
|
|
68
|
+
const bindings = defUse.bindings;
|
|
69
|
+
// ── param bindings → ENCLOSING FORMAL position ────────────────────────────
|
|
70
|
+
// SOUNDNESS (FU-C): the consumer joins `returnFlowParams` positionally against
|
|
71
|
+
// call-site arg positions, so each index MUST be the 0-based enclosing formal
|
|
72
|
+
// position — `BindingEntry.formalIndex`, which a destructured/rest formal hands
|
|
73
|
+
// identically to every inner name. The flattened binding ORDINAL is NOT a safe
|
|
74
|
+
// substitute (`function f({a, b}, c)` ⇒ b's ordinal 1 collides with formal c).
|
|
75
|
+
const paramBindings = bindings
|
|
76
|
+
.map((b, idx) => ({ b, idx }))
|
|
77
|
+
.filter((e) => e.b.kind === 'param')
|
|
78
|
+
.sort((a, b) => a.b.declLine - b.b.declLine || a.b.declColumn - b.b.declColumn);
|
|
79
|
+
// CONSERVATIVE FALLBACK: build binding-index → enclosing-formal-position only
|
|
80
|
+
// while every param binding supplies `formalIndex` (narrowed per-entry, no
|
|
81
|
+
// assertion). If ANY lacks it, the ordinal-vs-formal mapping is unprovable, so
|
|
82
|
+
// the summary degrades to EMPTY below (a documented MISS, never a false claim).
|
|
83
|
+
const paramCount = paramBindings.length;
|
|
84
|
+
const paramFormalOf = new Map();
|
|
85
|
+
let missingFormalIndex = false;
|
|
86
|
+
for (const e of paramBindings) {
|
|
87
|
+
const formalIndex = e.b.formalIndex;
|
|
88
|
+
if (formalIndex === undefined) {
|
|
89
|
+
missingFormalIndex = true;
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
paramFormalOf.set(e.idx, formalIndex);
|
|
93
|
+
}
|
|
94
|
+
// ── return points: source block of every `return` CFG edge ────────────────
|
|
95
|
+
// The M2 edge-kind invariant: a `return` edge's SOURCE block terminates in the
|
|
96
|
+
// return jump, so its LAST statement is `return <expr>` — its `uses` are the
|
|
97
|
+
// returned bindings. (`return;` with no value has empty uses.) No `return`
|
|
98
|
+
// edge ⇒ empty set ⇒ EMPTY summary (sound — never a false return-flow claim).
|
|
99
|
+
const returnUseStmtKeys = new Set();
|
|
100
|
+
for (const e of cfg.edges) {
|
|
101
|
+
if (e.kind !== 'return')
|
|
102
|
+
continue;
|
|
103
|
+
const block = cfg.blocks[e.from];
|
|
104
|
+
const stmts = block?.statements;
|
|
105
|
+
if (!stmts || stmts.length === 0)
|
|
106
|
+
continue;
|
|
107
|
+
returnUseStmtKeys.add(`${e.from}:${stmts.length - 1}`);
|
|
108
|
+
}
|
|
109
|
+
// Fast exit: no params, no return sites, or an unprovable formal mapping
|
|
110
|
+
// (conservative fallback) ⇒ nothing safely flows to the return.
|
|
111
|
+
if (paramCount === 0 || returnUseStmtKeys.size === 0 || missingFormalIndex) {
|
|
112
|
+
return { status: 'computed', facts: { paramCount, returnFlowParams: [] } };
|
|
113
|
+
}
|
|
114
|
+
const stmtAt = (p) => cfg.blocks[p.blockIndex]?.statements?.[p.stmtIndex];
|
|
115
|
+
// ── def→use index ─────────────────────────────────────────────────────────
|
|
116
|
+
const factsByDef = new Map();
|
|
117
|
+
for (const f of defUse.facts) {
|
|
118
|
+
const key = `${f.bindingIdx}:${pointKey(f.def)}`;
|
|
119
|
+
const list = factsByDef.get(key);
|
|
120
|
+
const entry = { bindingIdx: f.bindingIdx, use: f.use };
|
|
121
|
+
if (list)
|
|
122
|
+
list.push(entry);
|
|
123
|
+
else
|
|
124
|
+
factsByDef.set(key, [entry]);
|
|
125
|
+
}
|
|
126
|
+
// ── seeds: each param at its entry def point(s) ────────────────────────────
|
|
127
|
+
const queue = [];
|
|
128
|
+
const visited = new Set();
|
|
129
|
+
const enqueue = (v) => {
|
|
130
|
+
const key = `${v.paramIdx}:${v.bindingIdx}:${pointKey(v.point)}`;
|
|
131
|
+
if (visited.has(key))
|
|
132
|
+
return;
|
|
133
|
+
visited.add(key);
|
|
134
|
+
queue.push(v);
|
|
135
|
+
};
|
|
136
|
+
for (const { idx } of paramBindings) {
|
|
137
|
+
// 0-based ENCLOSING formal position — guaranteed present (the missing-formal
|
|
138
|
+
// case returned EMPTY above), but guard rather than assert to stay `any`-free.
|
|
139
|
+
const paramIdx = paramFormalOf.get(idx);
|
|
140
|
+
if (paramIdx === undefined)
|
|
141
|
+
continue;
|
|
142
|
+
for (const f of defUse.facts) {
|
|
143
|
+
if (f.bindingIdx === idx && f.def.blockIndex === cfg.entryIndex) {
|
|
144
|
+
enqueue({ bindingIdx: idx, point: f.def, paramIdx });
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// ── forward reachability ──────────────────────────────────────────────────
|
|
149
|
+
const returnFlow = new Set();
|
|
150
|
+
let head = 0;
|
|
151
|
+
while (head < queue.length) {
|
|
152
|
+
const v = queue[head++];
|
|
153
|
+
const b = v.bindingIdx;
|
|
154
|
+
for (const fact of factsByDef.get(`${b}:${pointKey(v.point)}`) ?? []) {
|
|
155
|
+
const useStmt = stmtAt(fact.use);
|
|
156
|
+
if (!useStmt)
|
|
157
|
+
continue;
|
|
158
|
+
const useKey = `${fact.use.blockIndex}:${fact.use.stmtIndex}`;
|
|
159
|
+
// (1) return reach: the param's value is among a return-use's `uses`.
|
|
160
|
+
if (returnUseStmtKeys.has(useKey) && useStmt.uses.includes(b)) {
|
|
161
|
+
returnFlow.add(v.paramIdx);
|
|
162
|
+
}
|
|
163
|
+
// (2) onward floor: this statement's defs/mayDefs carry the value onward.
|
|
164
|
+
for (const d of [...useStmt.defs, ...(useStmt.mayDefs ?? [])]) {
|
|
165
|
+
enqueue({
|
|
166
|
+
bindingIdx: d,
|
|
167
|
+
point: {
|
|
168
|
+
blockIndex: fact.use.blockIndex,
|
|
169
|
+
stmtIndex: fact.use.stmtIndex,
|
|
170
|
+
line: useStmt.line,
|
|
171
|
+
},
|
|
172
|
+
paramIdx: v.paramIdx,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const returnFlowParams = [...returnFlow].sort((a, b) => a - b);
|
|
178
|
+
return { status: 'computed', facts: { paramCount, returnFlowParams } };
|
|
179
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-callee dependence SUMMARY model (PDG FU-C, U-C2).
|
|
3
|
+
*
|
|
4
|
+
* A {@link CallSummary} is the compact, context-insensitive abstraction of one
|
|
5
|
+
* function's RETURN-VALUE ASCENT: which formal-parameter indices flow to the
|
|
6
|
+
* function's return value. It is the data-dependence twin of the M4
|
|
7
|
+
* {@link FunctionSummary} (taint), but for the *slicing* engine rather than the
|
|
8
|
+
* taint engine — a later consumer phase uses it to ascend a callee's return
|
|
9
|
+
* effect into the caller continuation (the documented no-ascent false negative).
|
|
10
|
+
*
|
|
11
|
+
* ## Scope (first cut — RETURN-VALUE ONLY)
|
|
12
|
+
*
|
|
13
|
+
* WHOLE-PARAMETER granularity. Ports are `param i` → `return`. Out-params /
|
|
14
|
+
* mutated args (need an alias model) and exception ascent (need try/catch CDG)
|
|
15
|
+
* are DEFERRED — the {@link call-summary-codec} reserves wire-format space for
|
|
16
|
+
* them so they can land without a cache-namespace bump.
|
|
17
|
+
*
|
|
18
|
+
* ## Plain-data discipline
|
|
19
|
+
*
|
|
20
|
+
* A summary is a JSON-plain value type (no functions, class instances, Maps, or
|
|
21
|
+
* Symbols) so it survives `RunScopeResolutionStats` → `ScopeResolutionOutput`
|
|
22
|
+
* threading unchanged — the same `Cloneable` constraint the CFG side channel and
|
|
23
|
+
* the taint {@link FunctionSummary} obey.
|
|
24
|
+
*/
|
|
25
|
+
/** Source-relative parameter index (0-based, declaration order). */
|
|
26
|
+
export type ParamIndex = number;
|
|
27
|
+
/**
|
|
28
|
+
* The dependence abstraction of one function. The resolved Function/Method/
|
|
29
|
+
* Constructor graph node id this summary describes, plus the set of formal
|
|
30
|
+
* parameters whose value flows to the return.
|
|
31
|
+
*/
|
|
32
|
+
export interface CallSummary {
|
|
33
|
+
/** The resolved `Function`/`Method`/`Constructor` graph node id. */
|
|
34
|
+
readonly fnId: string;
|
|
35
|
+
/** Repo-relative source path (carried for diagnostics + the anchor join). */
|
|
36
|
+
readonly filePath: string;
|
|
37
|
+
/** 1-based function start line (mirrors `FunctionCfg.functionStartLine`). */
|
|
38
|
+
readonly startLine: number;
|
|
39
|
+
/** Number of declared formal parameters (port arity). */
|
|
40
|
+
readonly paramCount: number;
|
|
41
|
+
/**
|
|
42
|
+
* Sorted, de-duplicated formal-parameter indices that flow to the function's
|
|
43
|
+
* return value (ascending). Empty ⇒ no parameter reaches the return (a sound
|
|
44
|
+
* EMPTY summary — never a false claim).
|
|
45
|
+
*/
|
|
46
|
+
readonly returnFlowParams: readonly ParamIndex[];
|
|
47
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-callee dependence SUMMARY model (PDG FU-C, U-C2).
|
|
3
|
+
*
|
|
4
|
+
* A {@link CallSummary} is the compact, context-insensitive abstraction of one
|
|
5
|
+
* function's RETURN-VALUE ASCENT: which formal-parameter indices flow to the
|
|
6
|
+
* function's return value. It is the data-dependence twin of the M4
|
|
7
|
+
* {@link FunctionSummary} (taint), but for the *slicing* engine rather than the
|
|
8
|
+
* taint engine — a later consumer phase uses it to ascend a callee's return
|
|
9
|
+
* effect into the caller continuation (the documented no-ascent false negative).
|
|
10
|
+
*
|
|
11
|
+
* ## Scope (first cut — RETURN-VALUE ONLY)
|
|
12
|
+
*
|
|
13
|
+
* WHOLE-PARAMETER granularity. Ports are `param i` → `return`. Out-params /
|
|
14
|
+
* mutated args (need an alias model) and exception ascent (need try/catch CDG)
|
|
15
|
+
* are DEFERRED — the {@link call-summary-codec} reserves wire-format space for
|
|
16
|
+
* them so they can land without a cache-namespace bump.
|
|
17
|
+
*
|
|
18
|
+
* ## Plain-data discipline
|
|
19
|
+
*
|
|
20
|
+
* A summary is a JSON-plain value type (no functions, class instances, Maps, or
|
|
21
|
+
* Symbols) so it survives `RunScopeResolutionStats` → `ScopeResolutionOutput`
|
|
22
|
+
* threading unchanged — the same `Cloneable` constraint the CFG side channel and
|
|
23
|
+
* the taint {@link FunctionSummary} obey.
|
|
24
|
+
*/
|
|
25
|
+
export {};
|