gitnexus 1.6.9 → 1.6.10-aptos.0
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 +211 -53
- package/dist/_shared/graph/types.d.ts +67 -3
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/index.d.ts +1 -0
- package/dist/_shared/index.d.ts.map +1 -1
- package/dist/_shared/index.js.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts +3 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.js +4 -3
- package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
- package/dist/_shared/language-detection.d.ts.map +1 -1
- package/dist/_shared/language-detection.js +2 -0
- package/dist/_shared/language-detection.js.map +1 -1
- package/dist/_shared/languages.d.ts +2 -0
- package/dist/_shared/languages.d.ts.map +1 -1
- package/dist/_shared/languages.js +2 -0
- package/dist/_shared/languages.js.map +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts +2 -2
- package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.js +8 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/pipeline.d.ts +1 -1
- package/dist/_shared/pipeline.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/callable-flow-site.d.ts +110 -0
- package/dist/_shared/scope-resolution/callable-flow-site.d.ts.map +1 -0
- package/dist/_shared/scope-resolution/callable-flow-site.js +11 -0
- package/dist/_shared/scope-resolution/callable-flow-site.js.map +1 -0
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.js +1 -0
- package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
- package/dist/_shared/scope-resolution/parsed-file.d.ts +7 -0
- package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts +9 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/types.d.ts +20 -3
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +1 -1
- package/dist/cli/ai-context.js +25 -44
- package/dist/cli/analyze.d.ts +5 -2
- package/dist/cli/analyze.js +197 -11
- package/dist/cli/clean.js +17 -3
- package/dist/cli/cli-message.d.ts +1 -1
- package/dist/cli/doctor.d.ts +18 -0
- package/dist/cli/doctor.js +96 -5
- package/dist/cli/editor-targets.d.ts +17 -2
- package/dist/cli/editor-targets.js +44 -0
- package/dist/cli/embeddings.d.ts +12 -0
- package/dist/cli/embeddings.js +49 -0
- package/dist/cli/eval-server.d.ts +23 -1
- package/dist/cli/eval-server.js +126 -8
- package/dist/cli/help-i18n.js +6 -0
- package/dist/cli/i18n/en.d.ts +18 -8
- package/dist/cli/i18n/en.js +18 -8
- package/dist/cli/i18n/resources.d.ts +28 -8
- package/dist/cli/i18n/zh-CN.d.ts +10 -0
- package/dist/cli/i18n/zh-CN.js +18 -8
- package/dist/cli/index.js +21 -7
- package/dist/cli/lazy-action.d.ts +7 -0
- package/dist/cli/lazy-action.js +27 -0
- package/dist/cli/mcp.js +6 -3
- package/dist/cli/move-availability.d.ts +5 -0
- package/dist/cli/move-availability.js +11 -0
- package/dist/cli/setup.d.ts +8 -0
- package/dist/cli/setup.js +230 -32
- package/dist/cli/skill-gen.js +38 -18
- package/dist/cli/standard-skills.d.ts +76 -0
- package/dist/cli/standard-skills.js +45 -0
- package/dist/cli/status.d.ts +4 -1
- package/dist/cli/status.js +57 -4
- package/dist/cli/tool.js +11 -0
- package/dist/cli/uninstall.js +77 -18
- package/dist/cli/wiki.d.ts +1 -0
- package/dist/cli/wiki.js +7 -1
- package/dist/config/ignore-service.d.ts +2 -0
- package/dist/config/ignore-service.js +27 -0
- package/dist/core/analysis-features.d.ts +21 -0
- package/dist/core/analysis-features.js +59 -0
- package/dist/core/analyzer-identity.d.ts +74 -0
- package/dist/core/analyzer-identity.js +1820 -0
- package/dist/core/augmentation/engine.js +13 -8
- package/dist/core/embeddings/embedder.d.ts +3 -2
- package/dist/core/embeddings/embedder.js +24 -7
- package/dist/core/embeddings/embedding-identity.d.ts +11 -0
- package/dist/core/embeddings/embedding-identity.js +24 -0
- package/dist/core/embeddings/embedding-pipeline.d.ts +36 -1
- package/dist/core/embeddings/embedding-pipeline.js +100 -9
- package/dist/core/embeddings/http-client.d.ts +33 -3
- package/dist/core/embeddings/http-client.js +237 -25
- package/dist/core/embeddings/node-module-compat.d.ts +25 -0
- package/dist/core/embeddings/node-module-compat.js +25 -0
- package/dist/core/embeddings/onnxruntime-common-resolver.js +8 -5
- package/dist/core/embeddings/onnxruntime-node-resolver.js +33 -7
- package/dist/core/embeddings/runtime-install.d.ts +119 -0
- package/dist/core/embeddings/runtime-install.js +372 -0
- package/dist/core/embeddings/runtime-support.d.ts +48 -17
- package/dist/core/embeddings/runtime-support.js +96 -0
- package/dist/core/git-staleness.js +1 -1
- package/dist/core/group/bridge-db.js +2 -0
- package/dist/core/group/extractors/http-patterns/python.js +246 -108
- package/dist/core/group/extractors/manifest-extractor.js +4 -0
- package/dist/core/incremental/escalation-gate.d.ts +38 -0
- package/dist/core/incremental/escalation-gate.js +48 -0
- package/dist/core/incremental/shadow-candidates.d.ts +3 -3
- package/dist/core/incremental/shadow-candidates.js +3 -3
- package/dist/core/incremental/subgraph-extract.d.ts +2 -2
- package/dist/core/incremental/subgraph-extract.js +2 -2
- package/dist/core/index-freshness.d.ts +5 -0
- package/dist/core/index-freshness.js +13 -0
- package/dist/core/ingestion/class-extractors/configs/jvm.js +29 -0
- package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
- package/dist/core/ingestion/cobol/jcl-processor.js +9 -8
- package/dist/core/ingestion/cobol-processor.js +27 -26
- package/dist/core/ingestion/community-processor.d.ts +51 -1
- package/dist/core/ingestion/community-processor.js +323 -64
- package/dist/core/ingestion/emit-references.js +7 -2
- package/dist/core/ingestion/filesystem-walker.js +4 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +3 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +7 -0
- package/dist/core/ingestion/frameworks/spring/bean-candidates.d.ts +30 -0
- package/dist/core/ingestion/frameworks/spring/bean-candidates.js +182 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.d.ts +12 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.js +26 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +24 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.js +115 -0
- package/dist/core/ingestion/languages/c/captures.js +56 -0
- package/dist/core/ingestion/languages/c/query.js +17 -0
- package/dist/core/ingestion/languages/c/scope-resolver.js +6 -0
- package/dist/core/ingestion/languages/cobol/captures.js +93 -0
- package/dist/core/ingestion/languages/cobol/scope-resolver.js +7 -0
- package/dist/core/ingestion/languages/cpp/captures.js +365 -75
- package/dist/core/ingestion/languages/cpp/scope-resolver.js +14 -0
- package/dist/core/ingestion/languages/csharp/captures.js +25 -0
- package/dist/core/ingestion/languages/dart/captures.js +90 -2
- package/dist/core/ingestion/languages/dart/extension-type-preprocess.d.ts +7 -0
- package/dist/core/ingestion/languages/dart/extension-type-preprocess.js +30 -0
- package/dist/core/ingestion/languages/dart.js +2 -0
- package/dist/core/ingestion/languages/go/captures.js +34 -0
- package/dist/core/ingestion/languages/index.d.ts +1 -0
- package/dist/core/ingestion/languages/index.js +2 -0
- package/dist/core/ingestion/languages/java/analysis-features.d.ts +3 -0
- package/dist/core/ingestion/languages/java/analysis-features.js +13 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +22 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +58 -0
- package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
- package/dist/core/ingestion/languages/java/captures.js +193 -17
- package/dist/core/ingestion/languages/java/package-facts.d.ts +5 -0
- package/dist/core/ingestion/languages/java/package-facts.js +9 -0
- package/dist/core/ingestion/languages/java/package-siblings.d.ts +3 -16
- package/dist/core/ingestion/languages/java/package-siblings.js +8 -147
- package/dist/core/ingestion/languages/java/query.js +23 -0
- package/dist/core/ingestion/languages/java/scope-resolver.js +23 -0
- package/dist/core/ingestion/languages/java/spring-bean-metadata.d.ts +2 -0
- package/dist/core/ingestion/languages/java/spring-bean-metadata.js +8 -0
- package/dist/core/ingestion/languages/java/spring-config-bindings.d.ts +23 -0
- package/dist/core/ingestion/languages/java/spring-config-bindings.js +215 -0
- package/dist/core/ingestion/languages/java.js +3 -0
- package/dist/core/ingestion/languages/javascript/captures.js +16 -0
- package/dist/core/ingestion/languages/javascript/query.js +21 -0
- package/dist/core/ingestion/languages/jvm/package-facts.d.ts +35 -0
- package/dist/core/ingestion/languages/jvm/package-facts.js +40 -0
- package/dist/core/ingestion/languages/jvm/package-siblings.d.ts +14 -0
- package/dist/core/ingestion/languages/jvm/package-siblings.js +129 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +17 -3
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +42 -8
- package/dist/core/ingestion/languages/kotlin/captures.js +59 -0
- package/dist/core/ingestion/languages/kotlin/package-facts.d.ts +5 -0
- package/dist/core/ingestion/languages/kotlin/package-facts.js +9 -0
- package/dist/core/ingestion/languages/kotlin/package-siblings.d.ts +4 -0
- package/dist/core/ingestion/languages/kotlin/package-siblings.js +8 -0
- package/dist/core/ingestion/languages/kotlin/query.js +19 -0
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +9 -1
- package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.d.ts +2 -0
- package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.js +8 -0
- package/dist/core/ingestion/languages/kotlin.js +5 -6
- package/dist/core/ingestion/languages/move.d.ts +1 -0
- package/dist/core/ingestion/languages/move.js +27 -0
- package/dist/core/ingestion/languages/php/captures.js +40 -0
- package/dist/core/ingestion/languages/php/import-decomposer.js +12 -0
- package/dist/core/ingestion/languages/php/import-target.d.ts +2 -1
- package/dist/core/ingestion/languages/php/import-target.js +110 -2
- package/dist/core/ingestion/languages/php/interpret.js +10 -0
- package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
- package/dist/core/ingestion/languages/python/captures.d.ts +3 -4
- package/dist/core/ingestion/languages/python/captures.js +24 -5
- package/dist/core/ingestion/languages/python/interpret.js +4 -0
- package/dist/core/ingestion/languages/python/receiver-binding.d.ts +15 -2
- package/dist/core/ingestion/languages/python/receiver-binding.js +96 -2
- package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
- package/dist/core/ingestion/languages/python/simple-hooks.js +15 -5
- package/dist/core/ingestion/languages/ruby/captures.js +42 -0
- package/dist/core/ingestion/languages/rust/captures.js +13 -0
- package/dist/core/ingestion/languages/rust/interpret.js +18 -0
- package/dist/core/ingestion/languages/rust/query.js +9 -0
- package/dist/core/ingestion/languages/rust/range-binding.js +6 -2
- package/dist/core/ingestion/languages/swift/captures.js +12 -0
- package/dist/core/ingestion/languages/typescript/captures.js +21 -0
- package/dist/core/ingestion/languages/typescript/nuxt-auto-imports.js +2 -1
- package/dist/core/ingestion/languages/typescript/query.js +37 -0
- package/dist/core/ingestion/markdown-processor.js +3 -2
- package/dist/core/ingestion/model/registration-table.js +1 -0
- package/dist/core/ingestion/parsing-processor.d.ts +3 -1
- package/dist/core/ingestion/parsing-processor.js +36 -1
- 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.js +56 -2
- package/dist/core/ingestion/pipeline-phases/parse.d.ts +0 -2
- package/dist/core/ingestion/pipeline-phases/parse.js +12 -3
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +8 -0
- package/dist/core/ingestion/pipeline-phases/processes.js +11 -1
- package/dist/core/ingestion/pipeline-phases/spring-config.d.ts +37 -0
- package/dist/core/ingestion/pipeline-phases/spring-config.js +433 -0
- package/dist/core/ingestion/pipeline-phases/standalone-ingest.d.ts +10 -0
- package/dist/core/ingestion/pipeline-phases/standalone-ingest.js +6 -0
- package/dist/core/ingestion/pipeline.d.ts +4 -2
- package/dist/core/ingestion/pipeline.js +5 -2
- package/dist/core/ingestion/resolve-references.js +12 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +83 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.js +131 -0
- package/dist/core/ingestion/route-extractors/python-const-resolver.d.ts +75 -0
- package/dist/core/ingestion/route-extractors/python-const-resolver.js +299 -0
- package/dist/core/ingestion/scope-extractor.js +306 -43
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +71 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +7 -7
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +8 -7
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +3 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +6 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +1 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +4 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +7 -2
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +47 -0
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1138 -0
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +16 -4
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +97 -1
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +60 -0
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +111 -0
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +4 -3
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +5 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +25 -38
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +6 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +147 -35
- package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
- package/dist/core/ingestion/scope-resolution/scope/walkers.js +73 -44
- package/dist/core/ingestion/taint/typescript-model.js +34 -2
- package/dist/core/ingestion/tree-sitter-queries.d.ts +2 -2
- package/dist/core/ingestion/tree-sitter-queries.js +23 -2
- package/dist/core/ingestion/type-extractors/jvm.js +17 -2
- package/dist/core/ingestion/utils/ast-helpers.d.ts +1 -0
- package/dist/core/ingestion/utils/ast-helpers.js +153 -2
- package/dist/core/ingestion/utils/callable-flow-captures.d.ts +94 -0
- package/dist/core/ingestion/utils/callable-flow-captures.js +878 -0
- package/dist/core/ingestion/utils/line-base.d.ts +20 -0
- package/dist/core/ingestion/utils/line-base.js +20 -0
- package/dist/core/ingestion/utils/symbol-labels.d.ts +21 -0
- package/dist/core/ingestion/utils/symbol-labels.js +45 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +34 -0
- package/dist/core/ingestion/workers/parse-worker.js +40 -5
- package/dist/core/ingestion/workers/result-merge.js +4 -0
- package/dist/core/ingestion/workers/worker-pool.d.ts +28 -0
- package/dist/core/ingestion/workers/worker-pool.js +128 -28
- package/dist/core/lbug/csv-generator.d.ts +15 -0
- package/dist/core/lbug/csv-generator.js +124 -27
- package/dist/core/lbug/cypher-escape.d.ts +20 -0
- package/dist/core/lbug/cypher-escape.js +20 -0
- package/dist/core/lbug/extension-load-error.d.ts +67 -0
- package/dist/core/lbug/extension-load-error.js +326 -0
- package/dist/core/lbug/extension-loader.d.ts +17 -2
- package/dist/core/lbug/extension-loader.js +38 -13
- package/dist/core/lbug/lbug-adapter.d.ts +203 -2
- package/dist/core/lbug/lbug-adapter.js +527 -86
- package/dist/core/lbug/lbug-config.d.ts +56 -2
- package/dist/core/lbug/lbug-config.js +267 -7
- package/dist/core/lbug/move-columns.d.ts +7 -0
- package/dist/core/lbug/move-columns.js +86 -0
- package/dist/core/lbug/native-check.d.ts +40 -0
- package/dist/core/lbug/native-check.js +90 -0
- package/dist/core/lbug/node-table-layout.d.ts +29 -0
- package/dist/core/lbug/node-table-layout.js +119 -0
- package/dist/core/lbug/pool-adapter.d.ts +23 -1
- package/dist/core/lbug/pool-adapter.js +115 -8
- package/dist/core/lbug/schema.d.ts +4 -3
- package/dist/core/lbug/schema.js +16 -16
- package/dist/core/lbug/sidecar-recovery.d.ts +172 -0
- package/dist/core/lbug/sidecar-recovery.js +418 -16
- package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
- package/dist/core/move/artifact-download.d.ts +19 -0
- package/dist/core/move/artifact-download.js +179 -0
- package/dist/core/move/compiler-facts.d.ts +120 -0
- package/dist/core/move/compiler-facts.js +9 -0
- package/dist/core/move/consistency.d.ts +28 -0
- package/dist/core/move/consistency.js +98 -0
- package/dist/core/move/constants.d.ts +98 -0
- package/dist/core/move/constants.js +136 -0
- package/dist/core/move/discovery.d.ts +10 -0
- package/dist/core/move/discovery.js +22 -0
- package/dist/core/move/entry-points.d.ts +14 -0
- package/dist/core/move/entry-points.js +40 -0
- package/dist/core/move/facts-mapper.d.ts +75 -0
- package/dist/core/move/facts-mapper.js +534 -0
- package/dist/core/move/install-lock.d.ts +14 -0
- package/dist/core/move/install-lock.js +102 -0
- package/dist/core/move/install.d.ts +39 -0
- package/dist/core/move/install.js +391 -0
- package/dist/core/move/mcp-client.d.ts +115 -0
- package/dist/core/move/mcp-client.js +436 -0
- package/dist/core/move/move-ingest.d.ts +49 -0
- package/dist/core/move/move-ingest.js +320 -0
- package/dist/core/move/provision.d.ts +19 -0
- package/dist/core/move/provision.js +91 -0
- package/dist/core/move/release.d.ts +6 -0
- package/dist/core/move/release.js +10 -0
- package/dist/core/move/symbol-id.d.ts +35 -0
- package/dist/core/move/symbol-id.js +65 -0
- package/dist/core/move/type-parser.d.ts +11 -0
- package/dist/core/move/type-parser.js +38 -0
- package/dist/core/platform/capabilities.d.ts +0 -1
- package/dist/core/platform/capabilities.js +39 -8
- package/dist/core/run-analyze.d.ts +3 -3
- package/dist/core/run-analyze.js +1001 -184
- package/dist/core/search/fts-indexes.d.ts +31 -0
- package/dist/core/search/fts-indexes.js +73 -0
- package/dist/core/search/fts-schema.js +2 -0
- package/dist/core/tree-sitter/safe-parse.d.ts +8 -3
- package/dist/core/tree-sitter/safe-parse.js +21 -7
- package/dist/core/wiki/graph-queries.js +6 -5
- package/dist/core/wiki/llm-client.d.ts +8 -2
- package/dist/core/wiki/llm-client.js +41 -5
- package/dist/mcp/core/embedder.js +16 -2
- package/dist/mcp/http-transport.d.ts +5 -0
- package/dist/mcp/http-transport.js +19 -5
- package/dist/mcp/local/bean-metadata.d.ts +2 -0
- package/dist/mcp/local/bean-metadata.js +25 -0
- package/dist/mcp/local/line-display.d.ts +22 -0
- package/dist/mcp/local/line-display.js +3 -0
- package/dist/mcp/local/local-backend.d.ts +19 -1
- package/dist/mcp/local/local-backend.js +402 -155
- package/dist/mcp/local/pdg-impact.d.ts +5 -3
- package/dist/mcp/local/pdg-impact.js +5 -2
- package/dist/mcp/output-budget.d.ts +5 -0
- package/dist/mcp/output-budget.js +52 -0
- package/dist/mcp/read-only-policy.d.ts +12 -0
- package/dist/mcp/read-only-policy.js +102 -0
- package/dist/mcp/repository-policy.d.ts +34 -0
- package/dist/mcp/repository-policy.js +328 -0
- package/dist/mcp/resources.js +32 -5
- package/dist/mcp/server.d.ts +5 -2
- package/dist/mcp/server.js +29 -9
- package/dist/mcp/tools.d.ts +0 -8
- package/dist/mcp/tools.js +102 -5
- package/dist/server/analyze-job.d.ts +3 -0
- package/dist/server/analyze-job.js +17 -0
- package/dist/server/analyze-launch.d.ts +6 -0
- package/dist/server/analyze-launch.js +82 -6
- package/dist/server/analyze-worker-core.d.ts +2 -1
- package/dist/server/analyze-worker-core.js +5 -2
- package/dist/server/analyze-worker.js +29 -6
- package/dist/server/api.d.ts +30 -0
- package/dist/server/api.js +120 -34
- package/dist/server/mcp-http.d.ts +1 -1
- package/dist/server/mcp-http.js +4 -2
- package/dist/server/upload-ingest.js +2 -1
- package/dist/server/validation.js +2 -1
- package/dist/storage/git.d.ts +31 -0
- package/dist/storage/git.js +111 -1
- package/dist/storage/parse-cache.js +7 -1
- package/dist/storage/parsedfile-store.d.ts +8 -0
- package/dist/storage/parsedfile-store.js +165 -1
- package/dist/storage/repo-manager.d.ts +194 -2
- package/dist/storage/repo-manager.js +56 -1
- package/hooks/antigravity/gitnexus-antigravity-hook.cjs +50 -3
- package/hooks/claude/gitnexus-hook.cjs +59 -9
- package/hooks/claude/pre-tool-use.sh +0 -0
- package/hooks/claude/session-start.sh +0 -0
- package/package.json +21 -15
- package/scripts/cross-platform-tests.ts +56 -0
- package/scripts/ensure-fts.ts +43 -0
- package/scripts/install-duckdb-extension.mjs +85 -24
- package/scripts/run-cross-platform.ts +61 -6
- package/scripts/shard-arg.ts +30 -0
- package/scripts/sync-plugin-manifests.mjs +192 -0
- package/skills/gitnexus-lfg/README.md +55 -0
- package/skills/gitnexus-lfg/SKILL.md +86 -0
- package/skills/gitnexus-plan/README.md +142 -0
- package/skills/gitnexus-plan/SKILL.md +348 -0
- package/skills/gitnexus-plan/references/context-ledger.md +137 -0
- package/skills/gitnexus-plan/references/context-pack.md +126 -0
- package/skills/gitnexus-plan/references/evidence-provenance.md +272 -0
- package/skills/gitnexus-plan/references/pdg-slice.md +109 -0
- package/skills/gitnexus-plan/references/plan-template.md +201 -0
- package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +2084 -0
- package/skills/gitnexus-review/SKILL.md +273 -0
- package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +42 -0
- package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +39 -0
- package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +37 -0
- package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +40 -0
- package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +42 -0
- package/skills/gitnexus-review/ci-personas/ci-security-lens.md +39 -0
- package/skills/gitnexus-work/README.md +71 -0
- package/skills/gitnexus-work/SKILL.md +269 -0
- package/skills/gitnexus-work/references/evidence-provenance.md +272 -0
- package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2084 -0
- package/web/assets/ProcessFlowModal-B_bfBySy.js +22 -0
- package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
- package/web/assets/agent-Bqxn-abU.js +626 -0
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +1 -0
- package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +36 -0
- package/web/assets/{blockDiagram-7IZFK4PR-BkWhpzWB.js → blockDiagram-7IZFK4PR-DBefcjof.js} +7 -7
- package/web/assets/{c4Diagram-Y2BXMSZH-DtBvpzWD.js → c4Diagram-Y2BXMSZH-EjWnjEJl.js} +6 -6
- package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +4 -0
- package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +1 -0
- package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +321 -0
- package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +159 -0
- package/web/assets/{chunk-6764PJDD-DpIS7hxD.js → chunk-6764PJDD-C7xxk063.js} +1 -1
- package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +124 -0
- package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +32 -0
- package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +10 -0
- package/web/assets/chunk-7W6UQGC5-pyKGssV3.js +1 -0
- package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +1 -0
- package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +1 -0
- package/web/assets/{chunk-INKRHTLW-Nu4ri9P-.js → chunk-INKRHTLW-Ckl3_KkO.js} +13 -13
- package/web/assets/chunk-J5EP6P6S-L19oz55R.js +1 -0
- package/web/assets/{chunk-KGFNY3KK-JGMJvKCK.js → chunk-KGFNY3KK-BZeP-55u.js} +17 -17
- package/web/assets/chunk-KGYTTC2M-zm6n242I.js +1 -0
- package/web/assets/{chunk-KRXBNO2N-BW5o0KUN.js → chunk-KRXBNO2N-C-UNuKKf.js} +1 -1
- package/web/assets/{chunk-LCXTWHL2-CfLLCywY.js → chunk-LCXTWHL2-C162wE5z.js} +5 -5
- package/web/assets/chunk-LII3EMHJ-BL6lKJ_P.js +1 -0
- package/web/assets/chunk-LRIF4GLE-n59lhprL.js +1 -0
- package/web/assets/chunk-QA3QBVWF-DVXPOIxe.js +2 -0
- package/web/assets/chunk-RERM46MO-B5dAdWpP.js +1 -0
- package/web/assets/chunk-RG4AUYOV-ZNgyLFq6.js +206 -0
- package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +1 -0
- package/web/assets/chunk-RLI5ZMPA-CkXZ0y0U.js +1 -0
- package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +1 -0
- package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +1 -0
- package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +1 -0
- package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +1 -0
- package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +2 -0
- package/web/assets/{chunk-W44A43WB-JqMLIpR0.js → chunk-W44A43WB-BN8EQc_u.js} +1 -1
- package/web/assets/chunk-ZXARS5L4-C3v-4Fsw.js +1 -0
- package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +1 -0
- package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +1 -0
- package/web/assets/cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js +1 -0
- package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +4 -0
- package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +43 -0
- package/web/assets/diagram-GF46GFSD-B2atbzmU.js +24 -0
- package/web/assets/diagram-HNR7UZ2L-DVRltWbL.js +3 -0
- package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +24 -0
- package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +10 -0
- package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +85 -0
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +1 -0
- package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +162 -0
- package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +292 -0
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +1 -0
- package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +106 -0
- package/web/assets/index-CX_fADmQ.css +2 -0
- package/web/assets/index-D1Z3dGGz.js +575 -0
- package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +1 -0
- package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +2 -0
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-DfYpxnE5.js → ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js} +6 -6
- package/web/assets/journeyDiagram-M6C3CM3L-C6wjooas.js +139 -0
- package/web/assets/kanban-definition-75IXJCU3-5_UVY79g.js +89 -0
- package/web/assets/{katex-K3KEBU37-CTc5BslQ.js → katex-K3KEBU37-qRQBy-EZ.js} +2 -2
- package/web/assets/{mindmap-definition-2TDM6QVE-DypvbOMQ.js → mindmap-definition-2TDM6QVE-8xDLzk2e.js} +29 -29
- package/web/assets/node-Ct_zna8U.js +8 -0
- package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +1 -0
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +1 -0
- package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +30 -0
- package/web/assets/preload-helper-Czpn1I53.js +1 -0
- package/web/assets/{quadrantDiagram-VICAPDV7-yXSZ2lLz.js → quadrantDiagram-VICAPDV7-DR54jOeR.js} +6 -6
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +1 -0
- package/web/assets/requirementDiagram-JXO7QTGE-PEkg7sKC.js +84 -0
- package/web/assets/rolldown-runtime-QTnfLwEv.js +1 -0
- package/web/assets/sankeyDiagram-URQDO5SZ-DDWEtjcs.js +40 -0
- package/web/assets/sdk-CzHHH8tD.js +37 -0
- package/web/assets/sequenceDiagram-VS2MUI6T-Bv-uwANx.js +162 -0
- package/web/assets/src-JV30wyV8.js +1 -0
- package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +1 -0
- package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +1 -0
- package/web/assets/timeline-definition-O6YCAMPW-Qmsuo7qS.js +120 -0
- package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +1 -0
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +1 -0
- package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +34 -0
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +1 -0
- package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +78 -0
- package/web/assets/{xychartDiagram-N2JHSOCM-BOLm0eNm.js → xychartDiagram-N2JHSOCM-CoZ_Tits.js} +6 -6
- package/web/index.html +18 -10
- package/skills/gitnexus-pr-review.md +0 -163
- package/web/assets/agent-Dli_x7bU.js +0 -660
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-dEkqUZN9.js +0 -36
- package/web/assets/chunk-3SSMPTDK-B4_etUhr.js +0 -321
- package/web/assets/chunk-67TQ5CYL-4sNPJU1q.js +0 -124
- package/web/assets/chunk-7W6UQGC5-KyEG0HQg.js +0 -1
- package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +0 -161
- package/web/assets/chunk-LII3EMHJ-D-jm-dLa.js +0 -1
- package/web/assets/chunk-QA3QBVWF-BgRW3SXd.js +0 -2
- package/web/assets/chunk-RG4AUYOV-CqWzWsV3.js +0 -206
- package/web/assets/chunk-T2UQINTJ-DSBqkzH7.js +0 -1
- package/web/assets/chunk-UY5QBCOK-DyF0vyGd.js +0 -1
- package/web/assets/chunk-ZXARS5L4-CxN8oiwI.js +0 -1
- package/web/assets/classDiagram-KGZ6W3CR-CMne4tG9.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-CMne4tG9.js +0 -1
- package/web/assets/cose-bilkent-UX7MHV2Q-D71wNYRJ.js +0 -1
- package/web/assets/dagre-ND4H6XIP-Co5rRx9X.js +0 -4
- package/web/assets/diagram-3NCE3AQN-DBp4O00j.js +0 -43
- package/web/assets/diagram-GF46GFSD-6N_8yS0i.js +0 -24
- package/web/assets/diagram-HNR7UZ2L-DFCfd5LI.js +0 -3
- package/web/assets/diagram-QXG6HAR7-Di093rFg.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-DZWi4SUN.js +0 -10
- package/web/assets/erDiagram-L5TCEMPS-8X1y6R4Y.js +0 -85
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +0 -1
- package/web/assets/flowDiagram-H6V6AXG4-CMpY8Ufn.js +0 -162
- package/web/assets/ganttDiagram-JCBTUEKG-D3iL2Aet.js +0 -292
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +0 -106
- package/web/assets/index-KctnI3Vq.js +0 -635
- package/web/assets/index-_lgn7hs5.css +0 -2
- package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +0 -1
- package/web/assets/infoDiagram-3YFTVSEB-BaLMZkUg.js +0 -2
- package/web/assets/journeyDiagram-M6C3CM3L-CvArszLo.js +0 -139
- package/web/assets/kanban-definition-75IXJCU3-CpfVLLf9.js +0 -89
- package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +0 -1
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +0 -1
- package/web/assets/pieDiagram-CU6KROY3-s27EFWgP.js +0 -30
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +0 -1
- package/web/assets/requirementDiagram-JXO7QTGE-CWhqInuf.js +0 -84
- package/web/assets/sankeyDiagram-URQDO5SZ-1qEjlFIB.js +0 -40
- package/web/assets/sequenceDiagram-VS2MUI6T-RyTlZ5cR.js +0 -162
- package/web/assets/stateDiagram-7D4R322I-DTjVfX4A.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-xY9_k9_Q.js +0 -1
- package/web/assets/timeline-definition-O6YCAMPW-DrrqLYAf.js +0 -120
- package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +0 -1
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +0 -1
- package/web/assets/vennDiagram-MWXL3ELB-B0RkWAim.js +0 -34
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +0 -1
- package/web/assets/wardleyDiagram-CUQ6CDDI-boUxiQ5F.js +0 -78
|
@@ -111,6 +111,11 @@ export function extract(matches, filePath, provider) {
|
|
|
111
111
|
// ── Pass 5: collect reference sites ─────────────────────────────────
|
|
112
112
|
const referenceSites = [];
|
|
113
113
|
pass5CollectReferences(partitioned.reference, positionIndex, filePath, referenceSites, provider, scopeTree);
|
|
114
|
+
// ── Pass 6: collect normalized callable-value-flow facts ───────────
|
|
115
|
+
// Kept after (and independent from) Pass 5 so existing reference-site
|
|
116
|
+
// extraction remains byte-identical.
|
|
117
|
+
const callableFlowSites = [];
|
|
118
|
+
pass6CollectCallableFlows(partitioned.callableFlow, positionIndex, filePath, callableFlowSites);
|
|
114
119
|
// Freeze Scope drafts into final shape and return.
|
|
115
120
|
const frozenScopes = scopeDrafts.map(draftToScope);
|
|
116
121
|
return Object.freeze({
|
|
@@ -120,12 +125,15 @@ export function extract(matches, filePath, provider) {
|
|
|
120
125
|
parsedImports: Object.freeze(parsedImports.slice()),
|
|
121
126
|
localDefs: Object.freeze(localDefs.slice()),
|
|
122
127
|
referenceSites: Object.freeze(referenceSites.slice()),
|
|
128
|
+
...(callableFlowSites.length > 0
|
|
129
|
+
? { callableFlowSites: Object.freeze(callableFlowSites.slice()) }
|
|
130
|
+
: {}),
|
|
123
131
|
});
|
|
124
132
|
}
|
|
125
133
|
/**
|
|
126
|
-
* Bucket each match by
|
|
127
|
-
*
|
|
128
|
-
*
|
|
134
|
+
* Bucket each match by every topic represented by its anchor captures. An
|
|
135
|
+
* emitter may deliberately group a lexical scope and its declaration in one
|
|
136
|
+
* match so both passes observe the exact same source range.
|
|
129
137
|
*
|
|
130
138
|
* A match may contain additional captures (e.g., `@import.source`,
|
|
131
139
|
* `@declaration.class.name`) that are used by the provider hooks to
|
|
@@ -138,49 +146,50 @@ function partitionByTopic(matches) {
|
|
|
138
146
|
const import_ = [];
|
|
139
147
|
const typeBinding = [];
|
|
140
148
|
const reference = [];
|
|
149
|
+
const callableFlow = [];
|
|
141
150
|
for (const match of matches) {
|
|
142
|
-
const topic
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
151
|
+
for (const topic of topicsOf(match)) {
|
|
152
|
+
switch (topic) {
|
|
153
|
+
case 'scope':
|
|
154
|
+
scope.push(match);
|
|
155
|
+
break;
|
|
156
|
+
case 'declaration':
|
|
157
|
+
declaration.push(match);
|
|
158
|
+
break;
|
|
159
|
+
case 'import':
|
|
160
|
+
import_.push(match);
|
|
161
|
+
break;
|
|
162
|
+
case 'type-binding':
|
|
163
|
+
typeBinding.push(match);
|
|
164
|
+
break;
|
|
165
|
+
case 'reference':
|
|
166
|
+
reference.push(match);
|
|
167
|
+
break;
|
|
168
|
+
case 'callable-flow':
|
|
169
|
+
callableFlow.push(match);
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
163
172
|
}
|
|
164
173
|
}
|
|
165
|
-
return { scope, declaration, import_, typeBinding, reference };
|
|
174
|
+
return { scope, declaration, import_, typeBinding, reference, callableFlow };
|
|
166
175
|
}
|
|
167
|
-
function
|
|
168
|
-
|
|
169
|
-
// prefixes. For multi-capture matches, ALL captures share the topic;
|
|
170
|
-
// we pick the first matching key for efficiency.
|
|
176
|
+
function topicsOf(match) {
|
|
177
|
+
const topics = new Set();
|
|
171
178
|
for (const name of Object.keys(match)) {
|
|
172
179
|
if (name.startsWith('@scope.'))
|
|
173
|
-
|
|
174
|
-
if (name.startsWith('@declaration.'))
|
|
175
|
-
|
|
176
|
-
if (name.startsWith('@import.'))
|
|
177
|
-
|
|
178
|
-
if (name.startsWith('@type-binding.'))
|
|
179
|
-
|
|
180
|
-
if (name.startsWith('@reference.'))
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
180
|
+
topics.add('scope');
|
|
181
|
+
else if (name.startsWith('@declaration.'))
|
|
182
|
+
topics.add('declaration');
|
|
183
|
+
else if (name.startsWith('@import.'))
|
|
184
|
+
topics.add('import');
|
|
185
|
+
else if (name.startsWith('@type-binding.'))
|
|
186
|
+
topics.add('type-binding');
|
|
187
|
+
else if (name.startsWith('@reference.'))
|
|
188
|
+
topics.add('reference');
|
|
189
|
+
else if (name.startsWith('@callable-flow.'))
|
|
190
|
+
topics.add('callable-flow');
|
|
191
|
+
}
|
|
192
|
+
return topics;
|
|
184
193
|
}
|
|
185
194
|
function ensureModuleScope(scopeDrafts, filePath, allMatches) {
|
|
186
195
|
const moduleScope = scopeDrafts.find((s) => s.kind === 'Module');
|
|
@@ -299,6 +308,8 @@ function resolveKindForScopeMatch(match, anchor, provider) {
|
|
|
299
308
|
return 'Block';
|
|
300
309
|
case 'expression':
|
|
301
310
|
return 'Expression';
|
|
311
|
+
case 'object':
|
|
312
|
+
return 'Object';
|
|
302
313
|
default:
|
|
303
314
|
return null;
|
|
304
315
|
}
|
|
@@ -574,6 +585,8 @@ function normalizeNodeLabel(kindStr) {
|
|
|
574
585
|
return 'Annotation';
|
|
575
586
|
case 'namespace':
|
|
576
587
|
return 'Namespace';
|
|
588
|
+
case 'program':
|
|
589
|
+
return 'Module';
|
|
577
590
|
case 'macro':
|
|
578
591
|
return 'Macro';
|
|
579
592
|
default:
|
|
@@ -757,13 +770,15 @@ function followChainedRef(start, draftById) {
|
|
|
757
770
|
* name in the same scope. Higher number wins; ties keep the later match
|
|
758
771
|
* (last-write-wins preserves historical order within a tier).
|
|
759
772
|
*
|
|
760
|
-
* Rationale: explicit annotations always beat
|
|
761
|
-
*
|
|
762
|
-
*
|
|
773
|
+
* Rationale: explicit variable and field annotations always beat bindings
|
|
774
|
+
* derived from parameter annotations or inference because they reflect the
|
|
775
|
+
* most specific user intent. `self`/`cls` are treated as strongly as other
|
|
776
|
+
* declared types because they are language-required receiver types.
|
|
763
777
|
*/
|
|
764
778
|
function typeBindingStrength(source) {
|
|
765
779
|
switch (source) {
|
|
766
780
|
case 'annotation':
|
|
781
|
+
return 3;
|
|
767
782
|
case 'parameter-annotation':
|
|
768
783
|
case 'return-annotation':
|
|
769
784
|
case 'self':
|
|
@@ -801,6 +816,9 @@ function pass5CollectReferences(matches, positionIndex, filePath, referenceSites
|
|
|
801
816
|
const arity = extractArity(match);
|
|
802
817
|
const argumentTypes = extractArgumentTypes(match);
|
|
803
818
|
const argumentTypeClasses = parseJsonParameterTypeClassesCapture(match['@reference.parameter-type-classes']);
|
|
819
|
+
// Object-literal key for value-ref sites (`{ key: fn }` / shorthand);
|
|
820
|
+
// consumed by the property-dispatch pass (#2437).
|
|
821
|
+
const propertyKeyCap = match['@reference.property-key'];
|
|
804
822
|
const site = {
|
|
805
823
|
name: nameCap.text,
|
|
806
824
|
atRange: anchor.range,
|
|
@@ -809,6 +827,9 @@ function pass5CollectReferences(matches, positionIndex, filePath, referenceSites
|
|
|
809
827
|
...(qualifiedCap?.text !== undefined && qualifiedCap.text.length > 0
|
|
810
828
|
? { rawQualifiedName: qualifiedCap.text }
|
|
811
829
|
: {}),
|
|
830
|
+
...(propertyKeyCap?.text !== undefined && propertyKeyCap.text.length > 0
|
|
831
|
+
? { propertyKey: propertyKeyCap.text }
|
|
832
|
+
: {}),
|
|
812
833
|
...(callForm !== undefined ? { callForm } : {}),
|
|
813
834
|
...(explicitReceiver !== undefined ? { explicitReceiver } : {}),
|
|
814
835
|
...(arity !== undefined ? { arity } : {}),
|
|
@@ -840,6 +861,8 @@ function referenceKindFromAnchor(name) {
|
|
|
840
861
|
return 'import-use';
|
|
841
862
|
case 'macro':
|
|
842
863
|
return 'macro';
|
|
864
|
+
case 'value-ref':
|
|
865
|
+
return 'value-ref';
|
|
843
866
|
default:
|
|
844
867
|
return undefined;
|
|
845
868
|
}
|
|
@@ -893,6 +916,245 @@ function extractArgumentTypes(match) {
|
|
|
893
916
|
}
|
|
894
917
|
return undefined;
|
|
895
918
|
}
|
|
919
|
+
// ─── Pass 6: collect callable-value-flow facts ─────────────────────────────
|
|
920
|
+
const CALLABLE_FLOW_KINDS = [
|
|
921
|
+
'seed',
|
|
922
|
+
'copy',
|
|
923
|
+
'alias',
|
|
924
|
+
'address',
|
|
925
|
+
'store',
|
|
926
|
+
'load',
|
|
927
|
+
'formal',
|
|
928
|
+
'argument',
|
|
929
|
+
'invoke',
|
|
930
|
+
];
|
|
931
|
+
function pass6CollectCallableFlows(matches, positionIndex, filePath, out) {
|
|
932
|
+
for (const match of matches) {
|
|
933
|
+
const kind = callableFlowKind(match);
|
|
934
|
+
if (kind === undefined)
|
|
935
|
+
continue;
|
|
936
|
+
const anchor = match[`@callable-flow.${kind}`];
|
|
937
|
+
if (anchor === undefined)
|
|
938
|
+
continue;
|
|
939
|
+
switch (kind) {
|
|
940
|
+
case 'seed': {
|
|
941
|
+
const destination = callableFlowOperand(match, 'destination', positionIndex, filePath);
|
|
942
|
+
const target = match['@callable-flow.target'];
|
|
943
|
+
const targetName = match['@callable-flow.target-name']?.text ?? target?.text;
|
|
944
|
+
if (destination === undefined || target === undefined || !nonEmpty(targetName))
|
|
945
|
+
continue;
|
|
946
|
+
const expectedSignature = callableFlowExpectedSignature(match);
|
|
947
|
+
out.push({
|
|
948
|
+
kind,
|
|
949
|
+
destination,
|
|
950
|
+
targetName,
|
|
951
|
+
targetRange: target.range,
|
|
952
|
+
...(nonEmpty(match['@callable-flow.target-qualified-name']?.text)
|
|
953
|
+
? { targetQualifiedName: match['@callable-flow.target-qualified-name'].text }
|
|
954
|
+
: {}),
|
|
955
|
+
...(expectedSignature !== undefined ? { expectedSignature } : {}),
|
|
956
|
+
});
|
|
957
|
+
break;
|
|
958
|
+
}
|
|
959
|
+
case 'copy':
|
|
960
|
+
case 'alias': {
|
|
961
|
+
const source = callableFlowOperand(match, 'source', positionIndex, filePath);
|
|
962
|
+
const destination = callableFlowOperand(match, 'destination', positionIndex, filePath);
|
|
963
|
+
if (source === undefined || destination === undefined)
|
|
964
|
+
continue;
|
|
965
|
+
out.push({ kind, source, destination });
|
|
966
|
+
break;
|
|
967
|
+
}
|
|
968
|
+
case 'address': {
|
|
969
|
+
const source = callableFlowOperand(match, 'source', positionIndex, filePath);
|
|
970
|
+
const destination = callableFlowOperand(match, 'destination', positionIndex, filePath);
|
|
971
|
+
if (source === undefined || destination === undefined)
|
|
972
|
+
continue;
|
|
973
|
+
out.push({ kind, source, destination });
|
|
974
|
+
break;
|
|
975
|
+
}
|
|
976
|
+
case 'store': {
|
|
977
|
+
const source = callableFlowOperand(match, 'source', positionIndex, filePath);
|
|
978
|
+
const pointer = callableFlowOperand(match, 'pointer', positionIndex, filePath);
|
|
979
|
+
if (source === undefined || pointer === undefined)
|
|
980
|
+
continue;
|
|
981
|
+
out.push({ kind, source, pointer });
|
|
982
|
+
break;
|
|
983
|
+
}
|
|
984
|
+
case 'load': {
|
|
985
|
+
const pointer = callableFlowOperand(match, 'pointer', positionIndex, filePath);
|
|
986
|
+
const destination = callableFlowOperand(match, 'destination', positionIndex, filePath);
|
|
987
|
+
if (pointer === undefined || destination === undefined)
|
|
988
|
+
continue;
|
|
989
|
+
out.push({ kind, pointer, destination });
|
|
990
|
+
break;
|
|
991
|
+
}
|
|
992
|
+
case 'formal': {
|
|
993
|
+
const owner = match['@callable-flow.owner'];
|
|
994
|
+
const binding = callableFlowOperand(match, 'binding', positionIndex, filePath);
|
|
995
|
+
const parameterIndex = parseNonNegativeInt(match['@callable-flow.parameter-index']?.text);
|
|
996
|
+
const passingMode = parseCallablePassingMode(match['@callable-flow.passing-mode']?.text);
|
|
997
|
+
if (owner === undefined ||
|
|
998
|
+
!nonEmpty(owner.text) ||
|
|
999
|
+
binding === undefined ||
|
|
1000
|
+
parameterIndex === undefined ||
|
|
1001
|
+
passingMode === undefined) {
|
|
1002
|
+
continue;
|
|
1003
|
+
}
|
|
1004
|
+
const expectedSignature = callableFlowExpectedSignature(match);
|
|
1005
|
+
out.push({
|
|
1006
|
+
kind,
|
|
1007
|
+
ownerName: owner.text,
|
|
1008
|
+
ownerRange: owner.range,
|
|
1009
|
+
parameterIndex,
|
|
1010
|
+
binding,
|
|
1011
|
+
passingMode,
|
|
1012
|
+
...(expectedSignature !== undefined ? { expectedSignature } : {}),
|
|
1013
|
+
});
|
|
1014
|
+
break;
|
|
1015
|
+
}
|
|
1016
|
+
case 'argument': {
|
|
1017
|
+
const source = callableFlowOperand(match, 'source', positionIndex, filePath);
|
|
1018
|
+
const parameterIndex = parseNonNegativeInt(match['@callable-flow.parameter-index']?.text);
|
|
1019
|
+
if (source === undefined || parameterIndex === undefined)
|
|
1020
|
+
continue;
|
|
1021
|
+
out.push({
|
|
1022
|
+
kind,
|
|
1023
|
+
callSite: anchor.range,
|
|
1024
|
+
parameterIndex,
|
|
1025
|
+
source,
|
|
1026
|
+
...(nonEmpty(match['@callable-flow.direct-callee-name']?.text)
|
|
1027
|
+
? { directCalleeName: match['@callable-flow.direct-callee-name'].text }
|
|
1028
|
+
: {}),
|
|
1029
|
+
});
|
|
1030
|
+
break;
|
|
1031
|
+
}
|
|
1032
|
+
case 'invoke': {
|
|
1033
|
+
const callee = callableFlowOperand(match, 'callee', positionIndex, filePath);
|
|
1034
|
+
const inScope = positionIndex.atPosition(filePath, anchor.range.startLine, anchor.range.startCol);
|
|
1035
|
+
const invocationKind = parseCallableInvocationKind(match['@callable-flow.invocation-kind']?.text);
|
|
1036
|
+
if (callee === undefined || inScope === undefined || invocationKind === undefined)
|
|
1037
|
+
continue;
|
|
1038
|
+
const receiver = callableFlowOperand(match, 'receiver', positionIndex, filePath);
|
|
1039
|
+
const arity = parseNonNegativeInt(match['@callable-flow.arity']?.text);
|
|
1040
|
+
out.push({
|
|
1041
|
+
kind,
|
|
1042
|
+
callSite: anchor.range,
|
|
1043
|
+
inScope,
|
|
1044
|
+
callee,
|
|
1045
|
+
invocationKind,
|
|
1046
|
+
...(receiver !== undefined ? { receiver } : {}),
|
|
1047
|
+
...(arity !== undefined ? { arity } : {}),
|
|
1048
|
+
});
|
|
1049
|
+
break;
|
|
1050
|
+
}
|
|
1051
|
+
}
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
function callableFlowKind(match) {
|
|
1055
|
+
return CALLABLE_FLOW_KINDS.find((kind) => match[`@callable-flow.${kind}`] !== undefined);
|
|
1056
|
+
}
|
|
1057
|
+
function callableFlowOperand(match, role, positionIndex, filePath) {
|
|
1058
|
+
const cap = match[`@callable-flow.${role}`];
|
|
1059
|
+
if (cap === undefined || !nonEmpty(cap.text))
|
|
1060
|
+
return undefined;
|
|
1061
|
+
const inScope = positionIndex.atPosition(filePath, cap.range.startLine, cap.range.startCol);
|
|
1062
|
+
if (inScope === undefined)
|
|
1063
|
+
return undefined;
|
|
1064
|
+
const expressionKind = parseCallableOperandKind(match[`@callable-flow.${role}-kind`]?.text);
|
|
1065
|
+
const indirection = parseNonNegativeInt(match[`@callable-flow.${role}-indirection`]?.text);
|
|
1066
|
+
if (indirection !== undefined && indirection > 16)
|
|
1067
|
+
return undefined;
|
|
1068
|
+
return {
|
|
1069
|
+
name: cap.text,
|
|
1070
|
+
inScope,
|
|
1071
|
+
atRange: cap.range,
|
|
1072
|
+
indirection: indirection ?? 0,
|
|
1073
|
+
addressOf: match[`@callable-flow.${role}-address`]?.text === 'true',
|
|
1074
|
+
...(expressionKind !== undefined ? { expressionKind } : {}),
|
|
1075
|
+
...(nonEmpty(match[`@callable-flow.${role}-qualified-name`]?.text)
|
|
1076
|
+
? { qualifiedName: match[`@callable-flow.${role}-qualified-name`].text }
|
|
1077
|
+
: {}),
|
|
1078
|
+
};
|
|
1079
|
+
}
|
|
1080
|
+
function callableFlowExpectedSignature(match) {
|
|
1081
|
+
const parameterCount = parseNonNegativeInt(match['@callable-flow.expected-arity']?.text);
|
|
1082
|
+
const parameterTypes = parseJsonStringArray(match['@callable-flow.expected-types']?.text);
|
|
1083
|
+
const parameterTypeClasses = parseJsonParameterTypeClassesCapture(match['@callable-flow.expected-type-classes']);
|
|
1084
|
+
const isConst = parseBooleanText(match['@callable-flow.expected-const']?.text);
|
|
1085
|
+
if (parameterCount === undefined &&
|
|
1086
|
+
parameterTypes === undefined &&
|
|
1087
|
+
parameterTypeClasses === undefined &&
|
|
1088
|
+
isConst === undefined) {
|
|
1089
|
+
return undefined;
|
|
1090
|
+
}
|
|
1091
|
+
return {
|
|
1092
|
+
...(parameterCount !== undefined ? { parameterCount } : {}),
|
|
1093
|
+
...(parameterTypes !== undefined ? { parameterTypes } : {}),
|
|
1094
|
+
...(parameterTypeClasses !== undefined ? { parameterTypeClasses } : {}),
|
|
1095
|
+
...(isConst !== undefined ? { isConst } : {}),
|
|
1096
|
+
};
|
|
1097
|
+
}
|
|
1098
|
+
function parseCallableOperandKind(text) {
|
|
1099
|
+
switch (text) {
|
|
1100
|
+
case 'binding':
|
|
1101
|
+
case 'callable-designator':
|
|
1102
|
+
case 'bound-member':
|
|
1103
|
+
case 'anonymous-callable':
|
|
1104
|
+
return text;
|
|
1105
|
+
default:
|
|
1106
|
+
return undefined;
|
|
1107
|
+
}
|
|
1108
|
+
}
|
|
1109
|
+
function parseBooleanText(text) {
|
|
1110
|
+
if (text === 'true')
|
|
1111
|
+
return true;
|
|
1112
|
+
if (text === 'false')
|
|
1113
|
+
return false;
|
|
1114
|
+
return undefined;
|
|
1115
|
+
}
|
|
1116
|
+
function parseJsonStringArray(text) {
|
|
1117
|
+
if (text === undefined)
|
|
1118
|
+
return undefined;
|
|
1119
|
+
try {
|
|
1120
|
+
const parsed = JSON.parse(text);
|
|
1121
|
+
return Array.isArray(parsed) && parsed.every((value) => typeof value === 'string')
|
|
1122
|
+
? parsed
|
|
1123
|
+
: undefined;
|
|
1124
|
+
}
|
|
1125
|
+
catch {
|
|
1126
|
+
return undefined;
|
|
1127
|
+
}
|
|
1128
|
+
}
|
|
1129
|
+
function parseNonNegativeInt(text) {
|
|
1130
|
+
if (text === undefined || !/^\d+$/.test(text))
|
|
1131
|
+
return undefined;
|
|
1132
|
+
const value = Number.parseInt(text, 10);
|
|
1133
|
+
return Number.isSafeInteger(value) ? value : undefined;
|
|
1134
|
+
}
|
|
1135
|
+
function parseCallablePassingMode(text) {
|
|
1136
|
+
switch (text) {
|
|
1137
|
+
case 'value':
|
|
1138
|
+
case 'reference':
|
|
1139
|
+
case 'pointer':
|
|
1140
|
+
return text;
|
|
1141
|
+
default:
|
|
1142
|
+
return undefined;
|
|
1143
|
+
}
|
|
1144
|
+
}
|
|
1145
|
+
function parseCallableInvocationKind(text) {
|
|
1146
|
+
switch (text) {
|
|
1147
|
+
case 'indirect':
|
|
1148
|
+
case 'member-pointer':
|
|
1149
|
+
case 'callable-object':
|
|
1150
|
+
return text;
|
|
1151
|
+
default:
|
|
1152
|
+
return undefined;
|
|
1153
|
+
}
|
|
1154
|
+
}
|
|
1155
|
+
function nonEmpty(value) {
|
|
1156
|
+
return value !== undefined && value.length > 0;
|
|
1157
|
+
}
|
|
896
1158
|
// ─── Internal: range + capture utilities ───────────────────────────────────
|
|
897
1159
|
function rangesEqual(a, b) {
|
|
898
1160
|
return (a.startLine === b.startLine &&
|
|
@@ -919,6 +1181,7 @@ const KNOWN_SUB_TAGS = new Set([
|
|
|
919
1181
|
'@type-binding.type',
|
|
920
1182
|
'@reference.name',
|
|
921
1183
|
'@reference.qualified-name',
|
|
1184
|
+
'@reference.property-key',
|
|
922
1185
|
'@reference.receiver',
|
|
923
1186
|
'@reference.operator',
|
|
924
1187
|
'@reference.arity',
|
|
@@ -267,7 +267,7 @@
|
|
|
267
267
|
* Plan that introduced most of these invariants:
|
|
268
268
|
* `docs/plans/2026-04-20-001-refactor-emit-pipeline-generalization-plan.md`.
|
|
269
269
|
*/
|
|
270
|
-
import type { BindingRef, Callsite, ConstraintContext, ParsedFile, ReferenceSite, ScopeId, SupportedLanguages, SymbolDefinition } from '../../../../_shared/index.js';
|
|
270
|
+
import type { BindingRef, Callsite, ConstraintContext, ParsedFile, ParsedImport, ReferenceSite, ScopeId, SupportedLanguages, SymbolDefinition } from '../../../../_shared/index.js';
|
|
271
271
|
import type { KnowledgeGraph } from '../../../graph/types.js';
|
|
272
272
|
import type { GraphNodeLookup } from '../graph-bridge/node-lookup.js';
|
|
273
273
|
import { LanguageProvider } from '../../language-provider.js';
|
|
@@ -288,6 +288,10 @@ export type ReceiverMemberResolution = {
|
|
|
288
288
|
readonly kind: 'ambiguous';
|
|
289
289
|
readonly candidateIds: readonly string[];
|
|
290
290
|
};
|
|
291
|
+
export interface ImportResolutionContext {
|
|
292
|
+
readonly parsedFiles: readonly ParsedFile[];
|
|
293
|
+
readonly parsedImport?: ParsedImport;
|
|
294
|
+
}
|
|
291
295
|
/** Re-exported for ScopeResolver consumers — same shape as
|
|
292
296
|
* `RegistryProviders.constraintCompatibility`'s third parameter. */
|
|
293
297
|
export type { ConstraintContext } from '../../../../_shared/index.js';
|
|
@@ -320,8 +324,13 @@ export interface ScopeResolver {
|
|
|
320
324
|
* orchestrator). TypeScript uses this to thread `tsconfig.json` path
|
|
321
325
|
* aliases through to the standard resolver. Languages that don't
|
|
322
326
|
* need any extra config ignore the parameter.
|
|
327
|
+
*
|
|
328
|
+
* `context.parsedFiles` is the complete, read-only language workspace. It is
|
|
329
|
+
* optional so resolvers that only need paths retain their existing shape.
|
|
330
|
+
* `context.parsedImport` is the exact import being finalized. PHP uses both
|
|
331
|
+
* when a PSR-4 import names a function instead of a file.
|
|
323
332
|
*/
|
|
324
|
-
resolveImportTarget(targetRaw: string, fromFile: string, allFilePaths: ReadonlySet<string>, resolutionConfig?: unknown): string | readonly string[] | null;
|
|
333
|
+
resolveImportTarget(targetRaw: string, fromFile: string, allFilePaths: ReadonlySet<string>, resolutionConfig?: unknown, context?: ImportResolutionContext): string | readonly string[] | null;
|
|
325
334
|
/**
|
|
326
335
|
* Enumerate names visible through a wildcard import after the target
|
|
327
336
|
* module scope has been linked. Languages that do not support
|
|
@@ -364,6 +373,21 @@ export interface ScopeResolver {
|
|
|
364
373
|
* `(def, callsite)` and need an adapter at the wiring site.
|
|
365
374
|
*/
|
|
366
375
|
arityCompatibility(callsite: Callsite, def: SymbolDefinition): ArityVerdict;
|
|
376
|
+
/**
|
|
377
|
+
* Add provider-specific callable value targets beyond the shared
|
|
378
|
+
* Function/Method/Constructor set. This is intentionally a predicate hook:
|
|
379
|
+
* shared flow analysis never branches on a language name or syntax kind.
|
|
380
|
+
*/
|
|
381
|
+
readonly isCallableValueTarget?: (def: SymbolDefinition) => boolean;
|
|
382
|
+
/**
|
|
383
|
+
* Restrict this provider's scope-resolution graph mutations to callable-value
|
|
384
|
+
* CALLS edges. Providers with an existing structural edge pipeline can use
|
|
385
|
+
* the shared scope model and callable solver without duplicating their
|
|
386
|
+
* established CALLS, IMPORTS, heritage, or property-dispatch edges.
|
|
387
|
+
*
|
|
388
|
+
* Default: `all`.
|
|
389
|
+
*/
|
|
390
|
+
readonly scopeResolutionEdgeMode?: 'all' | 'callable-flow-only';
|
|
367
391
|
/**
|
|
368
392
|
* Per-language constraint compatibility between a callsite and a
|
|
369
393
|
* candidate `def` that carries `templateConstraints` metadata.
|
|
@@ -555,6 +579,21 @@ export interface ScopeResolver {
|
|
|
555
579
|
* and any text the simple `isSuperReceiver` hook also rejects.
|
|
556
580
|
*/
|
|
557
581
|
readonly isSuperReceiverInContext?: (receiverText: string, callerScope: ScopeId, scopes: ScopeResolutionIndexes) => boolean;
|
|
582
|
+
/**
|
|
583
|
+
* Source-text retention policy for post-extraction hooks that receive a
|
|
584
|
+
* `fileContents` context (`populateWorkspaceOwners`,
|
|
585
|
+
* `populateNamespaceSiblings`, `populateRangeBindings`, and
|
|
586
|
+
* `emitPostResolutionEdges`).
|
|
587
|
+
*
|
|
588
|
+
* The default, `all-files`, preserves the existing contract: source text is
|
|
589
|
+
* loaded for every file before any of those hooks run. A resolver may choose
|
|
590
|
+
* `uncached-files` only when all of its hooks derive cached-file facts from
|
|
591
|
+
* `ParsedFile` / capture side-channels and tolerate an empty content string
|
|
592
|
+
* for pre-extracted files. This keeps the durable ParsedFile path at
|
|
593
|
+
* O(uncached source) memory without putting language checks in the shared
|
|
594
|
+
* pipeline.
|
|
595
|
+
*/
|
|
596
|
+
readonly postExtractSourceTextPolicy?: 'all-files' | 'uncached-files';
|
|
558
597
|
/**
|
|
559
598
|
* Whether the orchestrator should run `propagateImportedReturnTypes`
|
|
560
599
|
* after finalize. Default `true`. TypeScript with explicit type
|
|
@@ -602,6 +641,23 @@ export interface ScopeResolver {
|
|
|
602
641
|
* but is too loose as a default for strict module systems.
|
|
603
642
|
*/
|
|
604
643
|
readonly allowGlobalFreeCallFallback?: boolean;
|
|
644
|
+
/**
|
|
645
|
+
* In this language every `Method` belongs to a class instance, so a
|
|
646
|
+
* FREE (receiver-less) call may resolve to a `Method` only when the
|
|
647
|
+
* caller's enclosing class chain — the class itself plus its MRO —
|
|
648
|
+
* contains the method's owner (#2550). Suppresses the finalize-bucket
|
|
649
|
+
* leak where an unqualified call matched any same-file method by bare
|
|
650
|
+
* name (`materializeBindings` flattens every declaration onto module
|
|
651
|
+
* scope). Java opts in; C# is the intended next adopter.
|
|
652
|
+
*
|
|
653
|
+
* NOT implemented via `LanguageProvider.builtInNames`: that mechanism
|
|
654
|
+
* has unrelated consumers (`parse-worker`'s call-site extraction gate
|
|
655
|
+
* suppresses member calls too; `type-env`'s return-type lookup) which
|
|
656
|
+
* assume a flagged name is never a real repository declaration —
|
|
657
|
+
* false for common method names like `run`/`get`/`compare` (verified
|
|
658
|
+
* regression).
|
|
659
|
+
*/
|
|
660
|
+
readonly freeCallsRequireInstanceOwnership?: boolean;
|
|
605
661
|
/**
|
|
606
662
|
* When true, a constructor-form call `Type(...)` links to the Class def
|
|
607
663
|
* itself rather than its explicit Constructor def. Default
|
|
@@ -644,6 +700,19 @@ export interface ScopeResolver {
|
|
|
644
700
|
* Languages without file-local linkage semantics leave this undefined.
|
|
645
701
|
*/
|
|
646
702
|
readonly isFileLocalDef?: (def: SymbolDefinition) => boolean;
|
|
703
|
+
/**
|
|
704
|
+
* Optional precise linkage predicate used when callable-value flow joins a
|
|
705
|
+
* declaration graph node (for example a C/C++ prototype in a caller file)
|
|
706
|
+
* to its out-of-file definition. Unlike `isFileLocalDef`, this hook MUST
|
|
707
|
+
* answer only language-level internal/file-local linkage. It must not fold
|
|
708
|
+
* in broader unqualified-name visibility rules such as namespace or member
|
|
709
|
+
* lookup: an explicit declaration already establishes caller visibility.
|
|
710
|
+
*
|
|
711
|
+
* C and C++ provide this hook for `static` free functions. Languages whose
|
|
712
|
+
* declaration/definition identity is already represented by imports or one
|
|
713
|
+
* graph node leave it undefined, disabling cross-file prototype joining.
|
|
714
|
+
*/
|
|
715
|
+
readonly hasFileLocalCallableLinkage?: (def: SymbolDefinition) => boolean;
|
|
647
716
|
/**
|
|
648
717
|
* Optional predicate to identify members for which dispatch through
|
|
649
718
|
* an instance receiver is **invalid at the language level** — i.e.
|
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
* `(atRange.startLine, atRange.startCol)` is byte-equal to U1's `at` — no
|
|
22
22
|
* normalization needed.
|
|
23
23
|
*
|
|
24
|
-
* Gating (R4): the concrete sink is created in `run.ts`
|
|
25
|
-
*
|
|
26
|
-
*
|
|
24
|
+
* Gating (R4): the concrete sink is created in `run.ts` when PDG is enabled OR
|
|
25
|
+
* always-on callable-flow facts need direct call targets for actual→formal
|
|
26
|
+
* propagation. The read-side CFG join remains strictly PDG-gated.
|
|
27
27
|
*
|
|
28
28
|
* Multi-target dispatch (R2/KTD8): one site → multiple emit calls → the `Set`
|
|
29
29
|
* accumulates every resolved target. Capture is per-emit-call, so the
|
|
@@ -67,9 +67,9 @@ export interface CalleeIdMapView {
|
|
|
67
67
|
/** The concrete accumulator: a write sink that also exposes the read view. */
|
|
68
68
|
export interface CalleeIdAccumulator extends CalleeIdSink, CalleeIdMapView {
|
|
69
69
|
}
|
|
70
|
+
export type CalleeIdCaptureFilter = (filePath: string, line: number, col: number) => boolean;
|
|
70
71
|
/**
|
|
71
|
-
* Create the concrete nested-`Map` accumulator
|
|
72
|
-
*
|
|
73
|
-
* overhead — R4).
|
|
72
|
+
* Create the concrete nested-`Map` accumulator for PDG callee capture or
|
|
73
|
+
* callable-value-flow's direct-target index.
|
|
74
74
|
*/
|
|
75
|
-
export declare function createCalleeIdAccumulator(): CalleeIdAccumulator;
|
|
75
|
+
export declare function createCalleeIdAccumulator(shouldCapture?: CalleeIdCaptureFilter): CalleeIdAccumulator;
|
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
* `(atRange.startLine, atRange.startCol)` is byte-equal to U1's `at` — no
|
|
22
22
|
* normalization needed.
|
|
23
23
|
*
|
|
24
|
-
* Gating (R4): the concrete sink is created in `run.ts`
|
|
25
|
-
*
|
|
26
|
-
*
|
|
24
|
+
* Gating (R4): the concrete sink is created in `run.ts` when PDG is enabled OR
|
|
25
|
+
* always-on callable-flow facts need direct call targets for actual→formal
|
|
26
|
+
* propagation. The read-side CFG join remains strictly PDG-gated.
|
|
27
27
|
*
|
|
28
28
|
* Multi-target dispatch (R2/KTD8): one site → multiple emit calls → the `Set`
|
|
29
29
|
* accumulates every resolved target. Capture is per-emit-call, so the
|
|
@@ -36,14 +36,15 @@ export function calleeIdPosKey(line, col) {
|
|
|
36
36
|
return `${line}:${col}`;
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
39
|
-
* Create the concrete nested-`Map` accumulator
|
|
40
|
-
*
|
|
41
|
-
* overhead — R4).
|
|
39
|
+
* Create the concrete nested-`Map` accumulator for PDG callee capture or
|
|
40
|
+
* callable-value-flow's direct-target index.
|
|
42
41
|
*/
|
|
43
|
-
export function createCalleeIdAccumulator() {
|
|
42
|
+
export function createCalleeIdAccumulator(shouldCapture) {
|
|
44
43
|
const byFile = new Map();
|
|
45
44
|
return {
|
|
46
45
|
add(filePath, line, col, calleeId) {
|
|
46
|
+
if (shouldCapture?.(filePath, line, col) === false)
|
|
47
|
+
return;
|
|
47
48
|
let byPos = byFile.get(filePath);
|
|
48
49
|
if (byPos === undefined) {
|
|
49
50
|
byPos = new Map();
|
|
@@ -21,7 +21,9 @@ import type { GraphNodeLookup } from '../graph-bridge/node-lookup.js';
|
|
|
21
21
|
import type { CalleeIdSink } from './callee-id-sink.js';
|
|
22
22
|
/**
|
|
23
23
|
* Optional resolved-callee-id capture context (#2227 follow-up U2). Threaded
|
|
24
|
-
* in
|
|
24
|
+
* in under `--pdg` OR when always-on callable-flow facts need direct call
|
|
25
|
+
* targets (#2437 — the accumulator then carries a position filter); else
|
|
26
|
+
* `undefined` → zero overhead, byte-identity (R4).
|
|
25
27
|
* `filePath` is NOT on the `site` param, so it rides here alongside the sink.
|
|
26
28
|
*/
|
|
27
29
|
export interface CalleeIdCaptureCtx {
|
|
@@ -31,6 +31,12 @@ export function mapReferenceKindToEdgeType(kind) {
|
|
|
31
31
|
return 'EXTENDS';
|
|
32
32
|
case 'type-reference':
|
|
33
33
|
return 'USES';
|
|
34
|
+
// A function registered as an object-literal property value emits a
|
|
35
|
+
// reference-class USES edge, NOT CALLS — a registration is not an
|
|
36
|
+
// invocation (Kythe `ref` vs `ref/call`; Joern `METHOD_REF`). The
|
|
37
|
+
// invocation side is synthesized by the property-dispatch pass (#2437).
|
|
38
|
+
case 'value-ref':
|
|
39
|
+
return 'USES';
|
|
34
40
|
// Macro invocations resolve to a `Macro` node (never a function), so
|
|
35
41
|
// they emit `USES` — kept out of the `CALLS` keyspace which denotes
|
|
36
42
|
// function/method dispatch (#1934 review).
|