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
|
@@ -42,9 +42,11 @@ import { buildPopulatedMethodDispatch } from '../graph-bridge/method-dispatch.js
|
|
|
42
42
|
import { propagateImportedReturnTypes } from '../passes/imported-return-types.js';
|
|
43
43
|
import { emitReceiverBoundCalls } from '../passes/receiver-bound-calls.js';
|
|
44
44
|
import { emitFreeCallFallback } from '../passes/free-call-fallback.js';
|
|
45
|
+
import { emitPropertyDispatchCalls, MAX_PROPERTY_DISPATCH_FANOUT, } from '../passes/property-dispatch.js';
|
|
45
46
|
import { emitReferencesViaLookup } from '../graph-bridge/references-to-edges.js';
|
|
46
47
|
import { createCalleeIdAccumulator, } from '../graph-bridge/callee-id-sink.js';
|
|
47
48
|
import { emitImportEdges } from '../graph-bridge/imports-to-edges.js';
|
|
49
|
+
import { callableFlowSiteKey, collectDeferredIndirectSites, emitCallableValueFlow, } from '../passes/callable-value-flow.js';
|
|
48
50
|
import { findEnclosingClassDef, resolveInheritanceBaseInScope } from '../scope/walkers.js';
|
|
49
51
|
import { buildWorkspaceResolutionIndex } from '../workspace-index.js';
|
|
50
52
|
import { logHeapProbe } from '../../utils/heap-probe.js';
|
|
@@ -198,6 +200,7 @@ function emitDetectedInterfaceImplementations(graph, parsedFiles, nodeLookup, pr
|
|
|
198
200
|
}
|
|
199
201
|
export function runScopeResolution(input, provider) {
|
|
200
202
|
const { graph, files } = input;
|
|
203
|
+
const callableFlowOnly = provider.scopeResolutionEdgeMode === 'callable-flow-only';
|
|
201
204
|
const onWarn = input.onWarn ?? (() => { });
|
|
202
205
|
const resolutionOutcomes = [];
|
|
203
206
|
const recordResolutionOutcome = (outcome) => {
|
|
@@ -272,6 +275,25 @@ export function runScopeResolution(input, provider) {
|
|
|
272
275
|
}
|
|
273
276
|
logHeapProbe('sr-extract-end', `lang=${provider.language} parsedFiles=${parsedFiles.length} preExtractedHits=${preExtractedHits} skipped=${filesSkipped}`);
|
|
274
277
|
provider.populateWorkspaceOwners?.(parsedFiles, { fileContents: getFileContents() });
|
|
278
|
+
// A callable-flow-only provider has no reason to build the whole-graph
|
|
279
|
+
// lookup or finalize ordinary references when none of its files emitted a
|
|
280
|
+
// callable fact. This keeps the opt-in path proportional to source scanning
|
|
281
|
+
// for repositories that use the provider but no first-class callables.
|
|
282
|
+
if (callableFlowOnly &&
|
|
283
|
+
!parsedFiles.some((parsed) => (parsed.callableFlowSites?.length ?? 0) > 0)) {
|
|
284
|
+
return {
|
|
285
|
+
filesProcessed: parsedFiles.length,
|
|
286
|
+
filesSkipped,
|
|
287
|
+
importsEmitted: 0,
|
|
288
|
+
resolve: { sitesProcessed: 0, referencesEmitted: 0, unresolved: 0 },
|
|
289
|
+
referenceEdgesEmitted: 0,
|
|
290
|
+
referenceSkipped: 0,
|
|
291
|
+
propertyDispatchSkippedKeys: 0,
|
|
292
|
+
resolutionOutcomes,
|
|
293
|
+
functionSummaries: [],
|
|
294
|
+
callSummaries: [],
|
|
295
|
+
};
|
|
296
|
+
}
|
|
275
297
|
// Reconcile scope-resolution's ownership view into the SemanticModel.
|
|
276
298
|
// See `reconcile-ownership.ts` for the full rationale (Contract
|
|
277
299
|
// Invariant I9). Debug-mode validator runs immediately after to
|
|
@@ -293,6 +315,7 @@ export function runScopeResolution(input, provider) {
|
|
|
293
315
|
resolve: { sitesProcessed: 0, referencesEmitted: 0, unresolved: 0 },
|
|
294
316
|
referenceEdgesEmitted: 0,
|
|
295
317
|
referenceSkipped: 0,
|
|
318
|
+
propertyDispatchSkippedKeys: 0,
|
|
296
319
|
resolutionOutcomes,
|
|
297
320
|
functionSummaries: [],
|
|
298
321
|
callSummaries: [],
|
|
@@ -308,32 +331,45 @@ export function runScopeResolution(input, provider) {
|
|
|
308
331
|
const resolutionConfig = input.resolutionConfig;
|
|
309
332
|
const finalized = finalizeScopeModel(parsedFiles, {
|
|
310
333
|
hooks: {
|
|
311
|
-
resolveImportTarget: (targetRaw, fromFile) => provider.resolveImportTarget(targetRaw, fromFile, allFilePaths, resolutionConfig
|
|
334
|
+
resolveImportTarget: (targetRaw, fromFile, _workspaceIndex, parsedImport) => provider.resolveImportTarget(targetRaw, fromFile, allFilePaths, resolutionConfig, {
|
|
335
|
+
parsedFiles,
|
|
336
|
+
parsedImport,
|
|
337
|
+
}),
|
|
312
338
|
expandsWildcardTo: (targetModuleScope) => provider.expandsWildcardTo?.(targetModuleScope, parsedFiles) ?? [],
|
|
313
339
|
mergeBindings: (existing, incoming, scopeId) => provider.mergeBindings(existing, incoming, scopeId),
|
|
314
340
|
},
|
|
315
341
|
});
|
|
316
342
|
logHeapProbe('sr-post-finalize', `lang=${provider.language}`);
|
|
317
|
-
const preEmittedInheritanceSites =
|
|
343
|
+
const preEmittedInheritanceSites = callableFlowOnly
|
|
344
|
+
? new Set()
|
|
345
|
+
: preEmitInheritanceEdges(graph, finalized, nodeLookup);
|
|
318
346
|
// Call-based heritage hook (e.g., Ruby include/extend/prepend) — emits
|
|
319
347
|
// IMPLEMENTS edges that `preEmitInheritanceEdges` cannot produce because
|
|
320
348
|
// the heritage declarations are syntactic method calls, not grammar-level
|
|
321
349
|
// heritage clauses. Must run BEFORE `buildMro` so MRO construction sees
|
|
322
350
|
// the freshly-emitted IMPLEMENTS edges.
|
|
323
|
-
|
|
351
|
+
if (!callableFlowOnly) {
|
|
352
|
+
provider.emitHeritageEdges?.(graph, parsedFiles, nodeLookup, finalized);
|
|
353
|
+
}
|
|
324
354
|
// Implicit IMPORTS-edge hook — for languages whose files have compiler-
|
|
325
355
|
// implicit cross-file visibility (no syntactic import statement). The
|
|
326
356
|
// finalized-ImportEdge pipeline (`emitImportEdges`) cannot produce these
|
|
327
357
|
// because there is no `ImportEdge` to materialize. Idempotent.
|
|
328
|
-
|
|
358
|
+
if (!callableFlowOnly) {
|
|
359
|
+
provider.emitImplicitImportEdges?.(graph, parsedFiles, nodeLookup, resolutionConfig);
|
|
360
|
+
}
|
|
329
361
|
// Rebuild the node lookup after heritage-edge emission. Languages like
|
|
330
362
|
// Ruby create Property graph nodes inside `emitHeritageEdges`; those
|
|
331
363
|
// nodes must be visible to downstream passes (`emitReceiverBoundCalls`
|
|
332
364
|
// resolves write-access targets via `resolveDefGraphId` which consults
|
|
333
365
|
// `nodeLookup`). Without this rebuild, Property nodes added by the
|
|
334
366
|
// heritage hook are invisible and ACCESSES edges silently fail to emit.
|
|
335
|
-
const postHeritageNodeLookup = provider.emitHeritageEdges !== undefined
|
|
336
|
-
|
|
367
|
+
const postHeritageNodeLookup = !callableFlowOnly && provider.emitHeritageEdges !== undefined
|
|
368
|
+
? buildGraphNodeLookup(graph)
|
|
369
|
+
: nodeLookup;
|
|
370
|
+
if (!callableFlowOnly) {
|
|
371
|
+
emitDetectedInterfaceImplementations(graph, parsedFiles, postHeritageNodeLookup, provider, finalized, readonlyModel);
|
|
372
|
+
}
|
|
337
373
|
const mroByClassDefId = provider.buildMro(graph, parsedFiles, postHeritageNodeLookup);
|
|
338
374
|
const extendsOnlyMroByClassDefId = provider.buildExtendsOnlyMro?.(graph, parsedFiles, postHeritageNodeLookup);
|
|
339
375
|
// Replace the empty MethodDispatchIndex that finalizeScopeModel
|
|
@@ -437,37 +473,106 @@ export function runScopeResolution(input, provider) {
|
|
|
437
473
|
// ── Phase 4: emit graph edges (LOAD-BEARING ORDER — see I1) ────────────
|
|
438
474
|
input.onProgress?.('linking symbols', files.length, files.length);
|
|
439
475
|
const handledSites = new Set(preEmittedInheritanceSites);
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
476
|
+
const deferredIndirectSites = collectDeferredIndirectSites(emitParsedFiles, indexes);
|
|
477
|
+
const callableArgumentSites = new Set();
|
|
478
|
+
if (input.pdg !== true && deferredIndirectSites.size > 0) {
|
|
479
|
+
for (const parsed of emitParsedFiles) {
|
|
480
|
+
for (const site of parsed.callableFlowSites ?? []) {
|
|
481
|
+
if (site.kind === 'argument') {
|
|
482
|
+
callableArgumentSites.add(callableFlowSiteKey(parsed.filePath, site.callSite));
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
// Resolved-callee-id accumulator (#2227 U2 + callable-value-flow). Created
|
|
488
|
+
// for PDG OR when indirect-call facts need direct targets for actual→formal
|
|
489
|
+
// propagation. Populated below at every CALLS emit path before dedup; the CFG
|
|
490
|
+
// join still consumes it only inside the `input.pdg` block.
|
|
491
|
+
const calleeIdAccumulator = input.pdg === true || deferredIndirectSites.size > 0
|
|
492
|
+
? createCalleeIdAccumulator(input.pdg === true
|
|
493
|
+
? undefined
|
|
494
|
+
: (filePath, line, col) => callableArgumentSites.has(`${filePath}:${line}:${col}`))
|
|
495
|
+
: undefined;
|
|
496
|
+
const receiverExtras = callableFlowOnly
|
|
497
|
+
? 0
|
|
498
|
+
: emitReceiverBoundCalls(graph, indexes, emitParsedFiles, postHeritageNodeLookup, handledSites, provider, workspaceIndex, readonlyModel, {
|
|
499
|
+
recordResolutionOutcome,
|
|
500
|
+
calleeIdSink: calleeIdAccumulator,
|
|
501
|
+
});
|
|
502
|
+
const unresolvedReceiverExtras = !callableFlowOnly && provider.emitUnresolvedReceiverEdges !== undefined
|
|
451
503
|
? provider.emitUnresolvedReceiverEdges(graph, indexes, emitParsedFiles, postHeritageNodeLookup, handledSites, readonlyModel)
|
|
452
504
|
: 0;
|
|
453
|
-
const freeCallExtras =
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
505
|
+
const freeCallExtras = callableFlowOnly
|
|
506
|
+
? 0
|
|
507
|
+
: emitFreeCallFallback(graph, indexes, emitParsedFiles, postHeritageNodeLookup, referenceIndex, handledSites, readonlyModel, workspaceIndex, {
|
|
508
|
+
allowGlobalFallback: provider.allowGlobalFreeCallFallback === true,
|
|
509
|
+
constructorCallTargetsClass: provider.constructorCallTargetsClass === true,
|
|
510
|
+
isFileLocalDef: provider.isFileLocalDef,
|
|
511
|
+
isBuiltInName: provider.languageProvider.isBuiltInName,
|
|
512
|
+
freeCallsRequireInstanceOwnership: provider.freeCallsRequireInstanceOwnership === true,
|
|
513
|
+
isCallableVisibleFromCaller: provider.isCallableVisibleFromCaller,
|
|
514
|
+
resolveAdlCandidates: provider.resolveAdlCandidates,
|
|
515
|
+
conversionRankFn: provider.conversionRankFn,
|
|
516
|
+
conversionOnlyArgTypePrefixes: provider.conversionOnlyArgTypePrefixes,
|
|
517
|
+
constraintCompatibility: provider.constraintCompatibility,
|
|
518
|
+
recordResolutionOutcome,
|
|
519
|
+
calleeIdSink: calleeIdAccumulator,
|
|
520
|
+
skipSites: deferredIndirectSites,
|
|
521
|
+
});
|
|
522
|
+
const referenceSkipSites = new Set(handledSites);
|
|
523
|
+
for (const key of deferredIndirectSites)
|
|
524
|
+
referenceSkipSites.add(key);
|
|
525
|
+
const { emitted, skipped } = callableFlowOnly
|
|
526
|
+
? { emitted: 0, skipped: 0 }
|
|
527
|
+
: emitReferencesViaLookup(graph, indexes, referenceIndex, postHeritageNodeLookup, referenceSkipSites, calleeIdAccumulator);
|
|
528
|
+
// value-ref registrations (#2437): USES edges at the registration sites
|
|
529
|
+
// plus field-based dispatch — synthesized CALLS from member-call sites to
|
|
530
|
+
// functions registered under the same property key. This runs after the
|
|
531
|
+
// ordinary precise passes but before callable-value-flow: property-dispatched
|
|
532
|
+
// wrapper calls must populate the callee accumulator before actual→formal
|
|
533
|
+
// propagation. `graph.addRelationship` remains first-write-wins, so precise
|
|
534
|
+
// edges already emitted for a site retain ownership.
|
|
535
|
+
const propertyDispatch = callableFlowOnly
|
|
536
|
+
? { usesEmitted: 0, callsEmitted: 0, skippedKeys: 0, skippedKeyNames: [] }
|
|
537
|
+
: emitPropertyDispatchCalls(graph, indexes, emitParsedFiles, postHeritageNodeLookup, calleeIdAccumulator);
|
|
538
|
+
if (propertyDispatch.skippedKeys > 0) {
|
|
539
|
+
// Never drop dispatch coverage silently: a hook table larger than the
|
|
540
|
+
// fan-out cap means member calls through those keys get no synthesized
|
|
541
|
+
// CALLS — the #2437 false-safe gap reappears for exactly those keys.
|
|
542
|
+
logger.warn({
|
|
543
|
+
lang: provider.language,
|
|
544
|
+
skippedKeys: propertyDispatch.skippedKeys,
|
|
545
|
+
skippedKeyNames: propertyDispatch.skippedKeyNames,
|
|
546
|
+
fanoutCap: MAX_PROPERTY_DISPATCH_FANOUT,
|
|
547
|
+
}, 'property-dispatch: keys over the fan-out cap were dropped (no CALLS synthesized for them)');
|
|
548
|
+
}
|
|
549
|
+
const callableValueFlow = calleeIdAccumulator === undefined
|
|
550
|
+
? {
|
|
551
|
+
emitted: 0,
|
|
552
|
+
resolvedInvokes: 0,
|
|
553
|
+
ambiguousInvokes: 0,
|
|
554
|
+
unmatchedInvokes: 0,
|
|
555
|
+
iterations: 0,
|
|
556
|
+
}
|
|
557
|
+
: emitCallableValueFlow({
|
|
558
|
+
graph,
|
|
559
|
+
scopes: indexes,
|
|
560
|
+
parsedFiles: emitParsedFiles,
|
|
561
|
+
nodeLookup: postHeritageNodeLookup,
|
|
562
|
+
calleeIds: calleeIdAccumulator,
|
|
563
|
+
language: provider.language,
|
|
564
|
+
collapseByCallerTarget: provider.collapseMemberCallsByCallerTarget === true,
|
|
565
|
+
isCallableValueTarget: provider.isCallableValueTarget,
|
|
566
|
+
hasFileLocalCallableLinkage: provider.hasFileLocalCallableLinkage,
|
|
567
|
+
onWarn: (warning) => logger.warn(warning, 'callable-value-flow: candidate set exceeded the cap; no partial CALLS emitted'),
|
|
568
|
+
});
|
|
569
|
+
const importsEmitted = callableFlowOnly
|
|
570
|
+
? 0
|
|
571
|
+
: emitImportEdges(graph, indexes.imports, indexes.scopeTree, provider.importEdgeReason);
|
|
467
572
|
// Language-specific supplementary edges (e.g. Vue template-derived
|
|
468
573
|
// BINDS_EVENT_HANDLER / EMITS_EVENT / CALLS / ACCESSES edges).
|
|
469
574
|
// Runs last so the full graph — including import edges — is visible.
|
|
470
|
-
if (provider.emitPostResolutionEdges !== undefined) {
|
|
575
|
+
if (!callableFlowOnly && provider.emitPostResolutionEdges !== undefined) {
|
|
471
576
|
provider.emitPostResolutionEdges(graph, emitParsedFiles, postHeritageNodeLookup, indexes, {
|
|
472
577
|
fileContents: getFileContents(),
|
|
473
578
|
resolutionConfig,
|
|
@@ -608,8 +713,8 @@ export function runScopeResolution(input, provider) {
|
|
|
608
713
|
(message) => logger.warn(message),
|
|
609
714
|
// U3 (#2227): the resolved-callee-id map for this file (captured at the
|
|
610
715
|
// three CALLS emit paths in U2), joined by exact call-site position to
|
|
611
|
-
// emit `BasicBlock.calleeIds`.
|
|
612
|
-
// accumulator
|
|
716
|
+
// emit `BasicBlock.calleeIds`. Callable-flow may also have allocated
|
|
717
|
+
// the accumulator in a normal run, but this join remains PDG-only.
|
|
613
718
|
calleeIdAccumulator?.get(pf.filePath));
|
|
614
719
|
cfgBlocks += emitted.blocks;
|
|
615
720
|
cfgEdges += emitted.edges;
|
|
@@ -817,8 +922,15 @@ export function runScopeResolution(input, provider) {
|
|
|
817
922
|
filesSkipped,
|
|
818
923
|
importsEmitted,
|
|
819
924
|
resolve: resolveStats,
|
|
820
|
-
referenceEdgesEmitted: emitted +
|
|
925
|
+
referenceEdgesEmitted: emitted +
|
|
926
|
+
receiverExtras +
|
|
927
|
+
unresolvedReceiverExtras +
|
|
928
|
+
freeCallExtras +
|
|
929
|
+
callableValueFlow.emitted +
|
|
930
|
+
propertyDispatch.usesEmitted +
|
|
931
|
+
propertyDispatch.callsEmitted,
|
|
821
932
|
referenceSkipped: skipped,
|
|
933
|
+
propertyDispatchSkippedKeys: propertyDispatch.skippedKeys,
|
|
822
934
|
resolutionOutcomes,
|
|
823
935
|
functionSummaries: harvestedSummaries,
|
|
824
936
|
callSummaries: harvestedCallSummaries,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Range } from '../../../_shared/index.js';
|
|
2
|
-
export type ResolutionSuppressionReason = 'adl-ordinary-lookup-blocked' | 'conversion-rank-tied' | 'inline-ns-ambiguous' | 'member-lookup-ambiguous' | 'selected-callable-deleted' | 'overload-ambiguous' | 'overload-ambiguous-normalization';
|
|
2
|
+
export type ResolutionSuppressionReason = 'adl-ordinary-lookup-blocked' | 'conversion-rank-tied' | 'inline-ns-ambiguous' | 'member-lookup-ambiguous' | 'selected-callable-deleted' | 'overload-ambiguous' | 'overload-ambiguous-normalization' | 'free-call-instance-ownership';
|
|
3
3
|
export type ResolutionOutcome = {
|
|
4
4
|
readonly kind: 'resolved';
|
|
5
5
|
readonly targetId: string;
|
|
@@ -577,20 +577,26 @@ function walkScopeChain(startScope, name, scopes, predicate) {
|
|
|
577
577
|
const scope = scopes.scopeTree.getScope(currentId);
|
|
578
578
|
if (scope === undefined)
|
|
579
579
|
return undefined;
|
|
580
|
-
//
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
580
|
+
// `Object` scopes (object/record literal bodies) are a hoist
|
|
581
|
+
// boundary only -- their members are reachable via property access,
|
|
582
|
+
// never bare identifiers, so they contribute nothing to lookup
|
|
583
|
+
// (#2545/#2551). Still traverse past to the parent.
|
|
584
|
+
if (scope.kind !== 'Object') {
|
|
585
|
+
// Local first: a `const x` in this scope shadows any imported `x`.
|
|
586
|
+
const localBindings = scope.bindings.get(name);
|
|
587
|
+
if (localBindings !== undefined) {
|
|
588
|
+
for (const b of localBindings) {
|
|
589
|
+
if (predicate(b.def))
|
|
590
|
+
return b.def;
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
// Then imported/augmented bindings — only consulted when no local match.
|
|
594
|
+
const importedBindings = lookupBindingsAt(currentId, name, scopes);
|
|
595
|
+
for (const b of importedBindings) {
|
|
584
596
|
if (predicate(b.def))
|
|
585
597
|
return b.def;
|
|
586
598
|
}
|
|
587
599
|
}
|
|
588
|
-
// Then imported/augmented bindings — only consulted when no local match.
|
|
589
|
-
const importedBindings = lookupBindingsAt(currentId, name, scopes);
|
|
590
|
-
for (const b of importedBindings) {
|
|
591
|
-
if (predicate(b.def))
|
|
592
|
-
return b.def;
|
|
593
|
-
}
|
|
594
600
|
currentId = scope.parent;
|
|
595
601
|
}
|
|
596
602
|
return undefined;
|
|
@@ -626,28 +632,32 @@ export function findAllCallableBindingsInScope(startScope, callableName, scopes)
|
|
|
626
632
|
const scope = scopes.scopeTree.getScope(currentId);
|
|
627
633
|
if (scope === undefined)
|
|
628
634
|
return [];
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
635
|
+
// `Object` scopes are a hoist boundary only -- see walkScopeChain's
|
|
636
|
+
// comment (#2545/#2551). Skip lookup here, still traverse to parent.
|
|
637
|
+
if (scope.kind !== 'Object') {
|
|
638
|
+
const out = [];
|
|
639
|
+
const seen = new Set();
|
|
640
|
+
const pushCallable = (def) => {
|
|
641
|
+
if (def.type !== 'Function' && def.type !== 'Method' && def.type !== 'Constructor')
|
|
642
|
+
return;
|
|
643
|
+
if (seen.has(def.nodeId))
|
|
644
|
+
return;
|
|
645
|
+
seen.add(def.nodeId);
|
|
646
|
+
out.push(def);
|
|
647
|
+
};
|
|
648
|
+
const localBindings = scope.bindings.get(callableName);
|
|
649
|
+
if (localBindings !== undefined) {
|
|
650
|
+
for (const b of localBindings) {
|
|
651
|
+
pushCallable(b.def);
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
const importedBindings = lookupBindingsAt(currentId, callableName, scopes);
|
|
655
|
+
for (const b of importedBindings) {
|
|
642
656
|
pushCallable(b.def);
|
|
643
657
|
}
|
|
658
|
+
if (out.length > 0)
|
|
659
|
+
return out;
|
|
644
660
|
}
|
|
645
|
-
const importedBindings = lookupBindingsAt(currentId, callableName, scopes);
|
|
646
|
-
for (const b of importedBindings) {
|
|
647
|
-
pushCallable(b.def);
|
|
648
|
-
}
|
|
649
|
-
if (out.length > 0)
|
|
650
|
-
return out;
|
|
651
661
|
currentId = scope.parent;
|
|
652
662
|
}
|
|
653
663
|
return [];
|
|
@@ -694,16 +704,22 @@ export function findCallableBindingsAndAdlBlocker(startScope, name, scopes) {
|
|
|
694
704
|
nonCallableFound = true;
|
|
695
705
|
}
|
|
696
706
|
};
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
707
|
+
// `Object` scopes are a hoist boundary only (#2545/#2551) -- never
|
|
708
|
+
// reached by C++'s ADL path in practice (no language reusing this
|
|
709
|
+
// function emits `@scope.object`), guarded for consistency with the
|
|
710
|
+
// other scope-chain walkers in this file.
|
|
711
|
+
if (scope.kind !== 'Object') {
|
|
712
|
+
const localBindings = scope.bindings.get(name);
|
|
713
|
+
if (localBindings !== undefined) {
|
|
714
|
+
for (const b of localBindings) {
|
|
715
|
+
process(b.def);
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
const importedBindings = lookupBindingsAt(currentId, name, scopes);
|
|
719
|
+
for (const b of importedBindings) {
|
|
700
720
|
process(b.def);
|
|
701
721
|
}
|
|
702
722
|
}
|
|
703
|
-
const importedBindings = lookupBindingsAt(currentId, name, scopes);
|
|
704
|
-
for (const b of importedBindings) {
|
|
705
|
-
process(b.def);
|
|
706
|
-
}
|
|
707
723
|
if (anyBinding) {
|
|
708
724
|
// ISO C++: a block-scope function declaration (Function or Block scope)
|
|
709
725
|
// that is NOT a using-declaration blocks ADL. If we found callables at
|
|
@@ -747,6 +763,16 @@ export function populateClassOwnedMembers(parsed) {
|
|
|
747
763
|
return;
|
|
748
764
|
if (q.includes('.'))
|
|
749
765
|
return; // already qualified (dotted)
|
|
766
|
+
// A synthesized anonymous-class def (Java `$`-chain binary name,
|
|
767
|
+
// #2550/#2555 — `M3$2`, `EnumWrap$Mode$1`) already carries its
|
|
768
|
+
// COMPLETE name. Prefixing it (`M3.M3$2`) desyncs from the
|
|
769
|
+
// structure-phase node id (`M3$2.hook`), so same-named methods
|
|
770
|
+
// across sibling enum-constant bodies collapse onto the first
|
|
771
|
+
// body's node via the simple-name fallback (empirically caught in
|
|
772
|
+
// review). Class-like only: `$`-named MEMBERS (legal in JS/TS)
|
|
773
|
+
// still qualify normally against their class.
|
|
774
|
+
if (isClassLike(def.type) && q.includes('$'))
|
|
775
|
+
return;
|
|
750
776
|
const classQ = classDef.qualifiedName;
|
|
751
777
|
if (classQ === undefined || classQ.length === 0)
|
|
752
778
|
return;
|
|
@@ -930,18 +956,21 @@ export function findExportedDefByName(name, inScope, scopes, index) {
|
|
|
930
956
|
const scope = scopes.scopeTree.getScope(currentId);
|
|
931
957
|
if (scope === undefined)
|
|
932
958
|
break;
|
|
933
|
-
|
|
934
|
-
if (
|
|
935
|
-
|
|
959
|
+
// `Object` scopes are a hoist boundary only (#2545/#2551).
|
|
960
|
+
if (scope.kind !== 'Object') {
|
|
961
|
+
const local = scope.bindings.get(name);
|
|
962
|
+
if (local !== undefined) {
|
|
963
|
+
for (const b of local) {
|
|
964
|
+
if (b.def.type === 'Function' || b.def.type === 'Method')
|
|
965
|
+
return b.def;
|
|
966
|
+
}
|
|
967
|
+
}
|
|
968
|
+
const finalized = lookupBindingsAt(currentId, name, scopes);
|
|
969
|
+
for (const b of finalized) {
|
|
936
970
|
if (b.def.type === 'Function' || b.def.type === 'Method')
|
|
937
971
|
return b.def;
|
|
938
972
|
}
|
|
939
973
|
}
|
|
940
|
-
const finalized = lookupBindingsAt(currentId, name, scopes);
|
|
941
|
-
for (const b of finalized) {
|
|
942
|
-
if (b.def.type === 'Function' || b.def.type === 'Method')
|
|
943
|
-
return b.def;
|
|
944
|
-
}
|
|
945
974
|
currentId = scope.parent;
|
|
946
975
|
}
|
|
947
976
|
// Workspace-wide fallback: the first locally-declared callable binding
|
|
@@ -35,10 +35,14 @@ export const TS_JS_TAINT_MODEL = {
|
|
|
35
35
|
},
|
|
36
36
|
],
|
|
37
37
|
sinks: [
|
|
38
|
-
// Command execution —
|
|
38
|
+
// Command execution — shell strings are arg 0; argv-form APIs also treat
|
|
39
|
+
// the argv array at arg 1 as command/option injection surface.
|
|
39
40
|
{ name: 'exec', kind: 'command-injection', args: [0], module: 'child_process' },
|
|
40
41
|
{ name: 'execSync', kind: 'command-injection', args: [0], module: 'child_process' },
|
|
41
|
-
{ name: 'spawn', kind: 'command-injection', args: [0], module: 'child_process' },
|
|
42
|
+
{ name: 'spawn', kind: 'command-injection', args: [0, 1], module: 'child_process' },
|
|
43
|
+
{ name: 'spawnSync', kind: 'command-injection', args: [0, 1], module: 'child_process' },
|
|
44
|
+
{ name: 'execFile', kind: 'command-injection', args: [0, 1], module: 'child_process' },
|
|
45
|
+
{ name: 'execFileSync', kind: 'command-injection', args: [0, 1], module: 'child_process' },
|
|
42
46
|
// Code evaluation. `eval` takes code at 0; `new Function(...)` treats
|
|
43
47
|
// EVERY argument as source text (params + body), so `args` is omitted
|
|
44
48
|
// (= all positions) rather than pinned to 0.
|
|
@@ -53,9 +57,37 @@ export const TS_JS_TAINT_MODEL = {
|
|
|
53
57
|
// (mysql2/pg/knex handles go by many names; receiver-conventional).
|
|
54
58
|
{ name: 'query', kind: 'sql-injection', args: [0], anyReceiver: true },
|
|
55
59
|
{ name: 'execute', kind: 'sql-injection', args: [0], anyReceiver: true },
|
|
60
|
+
// Modern DB libraries expose shorter method names with high collision
|
|
61
|
+
// rates (`map.get`, `task.run`, ...), so keep these receiver-conventional.
|
|
62
|
+
{
|
|
63
|
+
name: 'run',
|
|
64
|
+
kind: 'sql-injection',
|
|
65
|
+
args: [0],
|
|
66
|
+
receivers: ['db', 'database', 'conn', 'client', 'pool', 'stmt', 'statement', 'prepared'],
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: 'all',
|
|
70
|
+
kind: 'sql-injection',
|
|
71
|
+
args: [0],
|
|
72
|
+
receivers: ['db', 'database', 'conn', 'client', 'pool', 'stmt', 'statement', 'prepared'],
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: 'get',
|
|
76
|
+
kind: 'sql-injection',
|
|
77
|
+
args: [0],
|
|
78
|
+
receivers: ['db', 'database', 'conn', 'client', 'pool', 'stmt', 'statement', 'prepared'],
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: 'values',
|
|
82
|
+
kind: 'sql-injection',
|
|
83
|
+
args: [0],
|
|
84
|
+
receivers: ['db', 'database', 'conn', 'client', 'pool'],
|
|
85
|
+
},
|
|
86
|
+
{ name: 'raw', kind: 'sql-injection', args: [0], receivers: ['db', 'knex', 'sequelize'] },
|
|
56
87
|
// Reflected XSS — Express response writes, conventional receiver `res`.
|
|
57
88
|
{ name: 'send', kind: 'xss', args: [0], receivers: ['res'] },
|
|
58
89
|
{ name: 'write', kind: 'xss', args: [0], receivers: ['res'] },
|
|
90
|
+
{ name: 'render', kind: 'xss', args: [0, 1], receivers: ['res'] },
|
|
59
91
|
],
|
|
60
92
|
sanitizers: [
|
|
61
93
|
// URL-encoding: neutralizes markup injection AND path separators
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export declare const TYPESCRIPT_QUERIES: string;
|
|
2
2
|
export declare const JAVASCRIPT_QUERIES: string;
|
|
3
|
-
export declare const PYTHON_QUERIES = "\n(class_definition\n name: (identifier) @name) @definition.class\n\n(function_definition\n name: (identifier) @name) @definition.function\n\n(import_statement\n name: (dotted_name) @import.source) @import\n\n; import numpy as np \u2192 aliased_import captures the module name so the\n; import path is resolved and named-binding extraction stores \"np\" \u2192 \"numpy\".\n(import_statement\n name: (aliased_import\n name: (dotted_name) @import.source)) @import\n\n(import_from_statement\n module_name: (dotted_name) @import.source) @import\n\n(import_from_statement\n module_name: (relative_import) @import.source) @import\n\n(call\n function: (identifier) @call.name) @call\n\n(call\n function: (attribute\n attribute: (identifier) @call.name)) @call\n\n; Class attribute type annotations \u2014 PEP 526: address: Address or address: Address = Address()\n; Both bare annotations (address: Address) and annotated assignments (name: str = \"test\")\n; are parsed as (assignment left: ... type: ...) in tree-sitter-python.\n(expression_statement\n (assignment\n left: (identifier) @name\n type: (type)) @definition.property)\n\n; Plain variable assignments without type annotation: x = 5, MAX_SIZE = 100\n; Overlap with @definition.property (typed) is handled by parse-worker dedup.\n(expression_statement\n (assignment\n left: (identifier) @name)) @definition.variable\n\n; Write access: obj.field = value\n(assignment\n left: (attribute\n object: (_) @assignment.receiver\n attribute: (identifier) @assignment.property)\n right: (_)) @assignment\n\n; Write access: obj.field += value (compound assignment)\n(augmented_assignment\n left: (attribute\n object: (_) @assignment.receiver\n attribute: (identifier) @assignment.property)\n right: (_)) @assignment\n\n; Python HTTP clients: requests.get('/path'), httpx.post('/path'), session.get('/path')\n(call\n function: (attribute\n attribute: (identifier) @http_client.method)\n arguments: (argument_list\n (string (string_content) @http_client.url))) @http_client\n\n; Python decorators: @app.route, @router.get, etc.\n(decorator\n (call\n function: (attribute\n object: (identifier) @decorator.receiver\n attribute: (identifier) @decorator.name)\n arguments: (argument_list\n (string (string_content) @decorator.arg)?))) @decorator\n";
|
|
4
|
-
export declare const JAVA_QUERIES = "\n; Classes, Interfaces, Enums, Annotations\n(class_declaration name: (identifier) @name) @definition.class\n(interface_declaration name: (identifier) @name) @definition.interface\n(enum_declaration name: (identifier) @name) @definition.enum\n(annotation_type_declaration name: (identifier) @name) @definition.annotation\n\n; Methods & Constructors\n(method_declaration name: (identifier) @name) @definition.method\n(constructor_declaration name: (identifier) @name) @definition.constructor\n\n; Fields \u2014 typed field declarations inside class bodies\n(field_declaration\n declarator: (variable_declarator\n name: (identifier) @name)) @definition.property\n\n; Imports - capture any import declaration child as source\n(import_declaration (_) @import.source) @import\n\n; Calls\n(method_invocation name: (identifier) @call.name) @call\n(method_invocation object: (_) name: (identifier) @call.name) @call\n(method_reference) @call\n\n; Constructor calls: new Foo()\n(object_creation_expression type: (type_identifier) @call.name) @call\n\n; Local variable declarations inside method bodies\n(local_variable_declaration\n declarator: (variable_declarator\n name: (identifier) @name)) @definition.variable\n\n; Write access: obj.field = value\n(assignment_expression\n left: (field_access\n object: (_) @assignment.receiver\n field: (identifier) @assignment.property)\n right: (_)) @assignment\n";
|
|
3
|
+
export declare const PYTHON_QUERIES = "\n(class_definition\n name: (identifier) @name) @definition.class\n\n(function_definition\n name: (identifier) @name) @definition.function\n\n(import_statement\n name: (dotted_name) @import.source) @import\n\n; import numpy as np \u2192 aliased_import captures the module name so the\n; import path is resolved and named-binding extraction stores \"np\" \u2192 \"numpy\".\n(import_statement\n name: (aliased_import\n name: (dotted_name) @import.source)) @import\n\n(import_from_statement\n module_name: (dotted_name) @import.source) @import\n\n(import_from_statement\n module_name: (relative_import) @import.source) @import\n\n(call\n function: (identifier) @call.name) @call\n\n(call\n function: (attribute\n attribute: (identifier) @call.name)) @call\n\n; Class attribute type annotations \u2014 PEP 526: address: Address or address: Address = Address()\n; Both bare annotations (address: Address) and annotated assignments (name: str = \"test\")\n; are parsed as (assignment left: ... type: ...) in tree-sitter-python.\n(expression_statement\n (assignment\n left: (identifier) @name\n type: (type)) @definition.property)\n\n; Plain variable assignments without type annotation: x = 5, MAX_SIZE = 100\n; Overlap with @definition.property (typed) is handled by parse-worker dedup.\n(expression_statement\n (assignment\n left: (identifier) @name)) @definition.variable\n\n; Write access: obj.field = value\n(assignment\n left: (attribute\n object: (_) @assignment.receiver\n attribute: (identifier) @assignment.property)\n right: (_)) @assignment\n\n; Write access: obj.field += value (compound assignment)\n(augmented_assignment\n left: (attribute\n object: (_) @assignment.receiver\n attribute: (identifier) @assignment.property)\n right: (_)) @assignment\n\n; Python HTTP clients: requests.get('/path'), httpx.post('/path'), session.get('/path')\n(call\n function: (attribute\n attribute: (identifier) @http_client.method)\n arguments: (argument_list\n (string (string_content) @http_client.url))) @http_client\n\n; Python decorators: @app.route, @router.get, etc.\n; The first positional argument is captured three ways (#2391): a string literal\n; path via @decorator.arg (quote-free, the fast path); a bare constant name or a\n; plus-concatenation via @decorator.arg_expr (resolved cross-file by the constant\n; resolver). The anchored optional alternation pins to the FIRST arg and stays\n; optional, so no-arg decorators (@app.tool(), etc.) and non-path first args still\n; match.\n(decorator\n (call\n function: (attribute\n object: (identifier) @decorator.receiver\n attribute: (identifier) @decorator.name)\n arguments: (argument_list\n .\n [\n (string (string_content)? @decorator.arg) @decorator.arg_str\n (identifier) @decorator.arg_expr\n (binary_operator) @decorator.arg_expr\n ]?))) @decorator\n";
|
|
4
|
+
export declare const JAVA_QUERIES = "\n; Classes, Interfaces, Enums, Records, Annotations\n(class_declaration name: (identifier) @name) @definition.class\n(interface_declaration name: (identifier) @name) @definition.interface\n(enum_declaration name: (identifier) @name) @definition.enum\n(record_declaration name: (identifier) @name) @definition.record\n(annotation_type_declaration name: (identifier) @name) @definition.annotation\n\n; Anonymous class bodies: new Runnable() { ... } \u2014 no @name capture; the\n; class extractor synthesizes the javac-style Worker$N name (#2550)\n(object_creation_expression (class_body)) @definition.class\n\n; Enum constant bodies: enum E { A { ... } } \u2014 javac's other anonymous\n; shape, synthesized as E$N by the same naming authority (#2555)\n(enum_constant body: (class_body)) @definition.class\n\n; Methods & Constructors\n(method_declaration name: (identifier) @name) @definition.method\n(constructor_declaration name: (identifier) @name) @definition.constructor\n\n; Fields \u2014 typed field declarations inside class bodies\n(field_declaration\n declarator: (variable_declarator\n name: (identifier) @name)) @definition.property\n\n; Imports - capture any import declaration child as source\n(import_declaration (_) @import.source) @import\n\n; Calls\n(method_invocation name: (identifier) @call.name) @call\n(method_invocation object: (_) name: (identifier) @call.name) @call\n(method_reference) @call\n\n; Constructor calls: new Foo()\n(object_creation_expression type: (type_identifier) @call.name) @call\n\n; Local variable declarations inside method bodies\n(local_variable_declaration\n declarator: (variable_declarator\n name: (identifier) @name)) @definition.variable\n\n; Write access: obj.field = value\n(assignment_expression\n left: (field_access\n object: (_) @assignment.receiver\n field: (identifier) @assignment.property)\n right: (_)) @assignment\n";
|
|
5
5
|
export declare const C_QUERIES = "\n; Functions (direct declarator)\n(function_definition declarator: (function_declarator declarator: (identifier) @name)) @definition.function\n(declaration declarator: (function_declarator declarator: (identifier) @name)) @definition.function\n\n; Functions returning pointers (pointer_declarator wraps function_declarator)\n(function_definition declarator: (pointer_declarator declarator: (function_declarator declarator: (identifier) @name))) @definition.function\n(declaration declarator: (pointer_declarator declarator: (function_declarator declarator: (identifier) @name))) @definition.function\n\n; Functions returning double pointers (nested pointer_declarator)\n(function_definition declarator: (pointer_declarator declarator: (pointer_declarator declarator: (function_declarator declarator: (identifier) @name)))) @definition.function\n\n; Structs, Unions, Enums, Typedefs\n(struct_specifier name: (type_identifier) @name) @definition.struct\n(type_definition\n type: (struct_specifier\n body: (field_declaration_list))\n declarator: (type_identifier) @name) @definition.struct\n(union_specifier name: (type_identifier) @name) @definition.union\n(enum_specifier name: (type_identifier) @name) @definition.enum\n(type_definition\n type: (enum_specifier\n body: (enumerator_list))\n declarator: (type_identifier) @name) @definition.enum\n(enumerator name: (identifier) @name) @definition.const\n(type_definition declarator: (type_identifier) @name) @definition.typedef\n\n; Macros\n(preproc_function_def name: (identifier) @name) @definition.macro\n(preproc_def name: (identifier) @name) @definition.macro\n\n; Includes\n(preproc_include path: (_) @import.source) @import\n\n; Calls\n(call_expression function: (identifier) @call.name) @call\n(call_expression function: (field_expression field: (field_identifier) @call.name)) @call\n\n; Variable declarations: int x = 5; or int x;\n(declaration\n declarator: (init_declarator\n declarator: (identifier) @name)) @definition.variable\n";
|
|
6
6
|
export declare const GO_QUERIES = "\n; Functions & Methods\n(function_declaration name: (identifier) @name) @definition.function\n(method_declaration name: (field_identifier) @name) @definition.method\n(method_elem name: (field_identifier) @name) @definition.method\n\n; Types\n(type_declaration (type_spec name: (type_identifier) @name type: (struct_type))) @definition.struct\n(type_declaration (type_spec name: (type_identifier) @name type: (interface_type))) @definition.interface\n\n; Imports\n(import_declaration (import_spec path: (interpreted_string_literal) @import.source)) @import\n(import_declaration (import_spec_list (import_spec path: (interpreted_string_literal) @import.source))) @import\n\n; Struct fields \u2014 named field declarations inside struct types\n(field_declaration_list\n (field_declaration\n name: (field_identifier) @name) @definition.property)\n\n; Calls\n(call_expression function: (identifier) @call.name) @call\n(call_expression function: (selector_expression field: (field_identifier) @call.name)) @call\n\n; Const/var declarations\n(const_declaration (const_spec (identifier) @name)) @definition.const\n(var_declaration (var_spec (identifier) @name)) @definition.variable\n(var_declaration (var_spec_list (var_spec (identifier) @name))) @definition.variable\n\n; Short variable declaration: x := 5\n(short_var_declaration left: (expression_list (identifier) @name)) @definition.variable\n\n; Struct literal construction: User{Name: \"Alice\"}\n(composite_literal type: (type_identifier) @call.name) @call\n\n; Write access: obj.field = value\n(assignment_statement\n left: (expression_list\n (selector_expression\n operand: (_) @assignment.receiver\n field: (field_identifier) @assignment.property))\n right: (_)) @assignment\n\n; Write access: obj.field++ / obj.field--\n(inc_statement\n (selector_expression\n operand: (_) @assignment.receiver\n field: (field_identifier) @assignment.property)) @assignment\n(dec_statement\n (selector_expression\n operand: (_) @assignment.receiver\n field: (field_identifier) @assignment.property)) @assignment\n";
|
|
7
7
|
export declare const CPP_QUERIES = "\n; Classes, Structs, Namespaces\n(class_specifier name: (type_identifier) @name) @definition.class\n(class_specifier\n name: (template_type\n (type_identifier) @name\n (template_argument_list) @template-arguments)) @definition.class\n; Out-of-line nested definition: class Outer::Inner { ... } / struct Outer::Inner { ... }.\n; Key the node by the full qualified_identifier text so the def materializes a\n; node that matches the HAS_METHOD owner id (also the full qualified text) and\n; stays distinct from a same-tail type in another scope (#1975, #1978).\n(class_specifier name: (qualified_identifier) @name) @definition.class\n(struct_specifier name: (qualified_identifier) @name) @definition.struct\n(struct_specifier name: (type_identifier) @name) @definition.struct\n(struct_specifier\n name: (template_type\n (type_identifier) @name\n (template_argument_list) @template-arguments)) @definition.struct\n(namespace_definition name: (namespace_identifier) @name) @definition.namespace\n(enum_specifier name: (type_identifier) @name) @definition.enum\n\n; Typedefs and unions (common in C-style headers and mixed C/C++ code)\n(type_definition\n type: (struct_specifier\n body: (field_declaration_list))\n declarator: (type_identifier) @name) @definition.struct\n(type_definition\n type: (enum_specifier\n body: (enumerator_list))\n declarator: (type_identifier) @name) @definition.enum\n(enumerator name: (identifier) @name) @definition.const\n(type_definition declarator: (type_identifier) @name) @definition.typedef\n(union_specifier name: (type_identifier) @name) @definition.union\n\n; Macros\n(preproc_function_def name: (identifier) @name) @definition.macro\n(preproc_def name: (identifier) @name) @definition.macro\n\n; Functions & Methods (direct declarator)\n(function_definition declarator: (function_declarator declarator: (identifier) @name)) @definition.function\n(function_definition declarator: (function_declarator declarator: (operator_name) @name)) @definition.function\n(function_definition declarator: (function_declarator declarator: (qualified_identifier name: (identifier) @name))) @definition.method\n(function_definition declarator: (function_declarator declarator: (qualified_identifier name: (operator_name) @name))) @definition.method\n\n; Functions/methods returning pointers (pointer_declarator wraps function_declarator)\n(function_definition declarator: (pointer_declarator declarator: (function_declarator declarator: (identifier) @name))) @definition.function\n(function_definition declarator: (pointer_declarator declarator: (function_declarator declarator: (qualified_identifier name: (identifier) @name)))) @definition.method\n\n; Functions/methods returning double pointers (nested pointer_declarator)\n(function_definition declarator: (pointer_declarator declarator: (pointer_declarator declarator: (function_declarator declarator: (identifier) @name)))) @definition.function\n(function_definition declarator: (pointer_declarator declarator: (pointer_declarator declarator: (function_declarator declarator: (qualified_identifier name: (identifier) @name))))) @definition.method\n\n; Functions/methods returning references (reference_declarator wraps function_declarator)\n(function_definition declarator: (reference_declarator (function_declarator declarator: (identifier) @name))) @definition.function\n(function_definition declarator: (reference_declarator (function_declarator declarator: (operator_name) @name))) @definition.function\n(function_definition declarator: (reference_declarator (function_declarator declarator: (qualified_identifier name: (identifier) @name)))) @definition.method\n(function_definition declarator: (reference_declarator (function_declarator declarator: (qualified_identifier name: (operator_name) @name)))) @definition.method\n\n; Destructors (destructor_name is distinct from identifier in tree-sitter-cpp)\n(function_definition declarator: (function_declarator declarator: (qualified_identifier name: (destructor_name) @name))) @definition.method\n\n; Function declarations / prototypes (common in headers)\n(declaration declarator: (function_declarator declarator: (identifier) @name)) @definition.function\n(declaration declarator: (function_declarator declarator: (operator_name) @name)) @definition.function\n(declaration declarator: (pointer_declarator declarator: (function_declarator declarator: (identifier) @name))) @definition.function\n(declaration declarator: (reference_declarator (function_declarator declarator: (operator_name) @name))) @definition.function\n\n; Class/struct data member fields (Address address; int count;)\n; Uses field_identifier to exclude method declarations (which use function_declarator)\n(field_declaration\n declarator: (field_identifier) @name) @definition.property\n\n; Pointer member fields (Address* address;)\n(field_declaration\n declarator: (pointer_declarator\n declarator: (field_identifier) @name)) @definition.property\n\n; Reference member fields (Address& address;)\n(field_declaration\n declarator: (reference_declarator\n (field_identifier) @name)) @definition.property\n\n; Inline class method declarations (inside class body, no body: void save();)\n; tree-sitter-cpp uses field_identifier (not identifier) for names inside class bodies\n(field_declaration declarator: (function_declarator declarator: [(field_identifier) (identifier) (operator_name)] @name)) @definition.method\n\n; Inline class method declarations returning a pointer (User* lookup();)\n(field_declaration declarator: (pointer_declarator declarator: (function_declarator declarator: [(field_identifier) (identifier)] @name))) @definition.method\n\n; Inline class method declarations returning a reference (User& lookup();)\n(field_declaration declarator: (reference_declarator (function_declarator declarator: [(field_identifier) (identifier) (operator_name)] @name))) @definition.method\n\n; Inline class method definitions (inside class body, with body: void Foo() { ... })\n(field_declaration_list\n (function_definition\n declarator: (function_declarator\n declarator: [(field_identifier) (identifier) (operator_name) (destructor_name)] @name)) @definition.method)\n\n; Inline class methods returning a pointer type (User* lookup(int id) { ... })\n(field_declaration_list\n (function_definition\n declarator: (pointer_declarator\n declarator: (function_declarator\n declarator: [(field_identifier) (identifier) (operator_name)] @name))) @definition.method)\n\n; Inline class methods returning a reference type (User& lookup(int id) { ... })\n(field_declaration_list\n (function_definition\n declarator: (reference_declarator\n (function_declarator\n declarator: [(field_identifier) (identifier) (operator_name)] @name))) @definition.method)\n\n; Templates\n(template_declaration (class_specifier name: (type_identifier) @name)) @definition.template\n(template_declaration\n (class_specifier\n name: (template_type\n (type_identifier) @name\n (template_argument_list) @template-arguments))) @definition.template\n(template_declaration (function_definition declarator: (function_declarator declarator: (identifier) @name))) @definition.template\n\n; Includes\n(preproc_include path: (_) @import.source) @import\n\n; Calls\n(call_expression function: (identifier) @call.name) @call\n(call_expression function: (field_expression field: (field_identifier) @call.name)) @call\n(call_expression function: (qualified_identifier name: (identifier) @call.name)) @call\n(call_expression function: (template_function name: (identifier) @call.name)) @call\n(binary_expression operator: \"+\" @call.name) @call\n(binary_expression operator: \"<<\" @call.name) @call\n\n; Constructor calls: new User()\n(new_expression type: (type_identifier) @call.name) @call\n\n; Variable declarations: int x = 5; or auto x = 5;\n(declaration\n declarator: (init_declarator\n declarator: (identifier) @name)) @definition.variable\n\n; Structured bindings: auto [a, b] = makePair(); (one @name per bound identifier)\n(declaration\n declarator: (init_declarator\n declarator: (structured_binding_declarator\n (identifier) @name))) @definition.variable\n\n; Structured bindings, reference form: auto& [x, y] = tup;\n(declaration\n declarator: (init_declarator\n declarator: (reference_declarator\n (structured_binding_declarator\n (identifier) @name)))) @definition.variable\n\n; Write access: obj.field = value\n(assignment_expression\n left: (field_expression\n argument: (_) @assignment.receiver\n field: (field_identifier) @assignment.property)\n right: (_)) @assignment\n\n";
|
|
@@ -717,22 +717,42 @@ export const PYTHON_QUERIES = `
|
|
|
717
717
|
(string (string_content) @http_client.url))) @http_client
|
|
718
718
|
|
|
719
719
|
; Python decorators: @app.route, @router.get, etc.
|
|
720
|
+
; The first positional argument is captured three ways (#2391): a string literal
|
|
721
|
+
; path via @decorator.arg (quote-free, the fast path); a bare constant name or a
|
|
722
|
+
; plus-concatenation via @decorator.arg_expr (resolved cross-file by the constant
|
|
723
|
+
; resolver). The anchored optional alternation pins to the FIRST arg and stays
|
|
724
|
+
; optional, so no-arg decorators (@app.tool(), etc.) and non-path first args still
|
|
725
|
+
; match.
|
|
720
726
|
(decorator
|
|
721
727
|
(call
|
|
722
728
|
function: (attribute
|
|
723
729
|
object: (identifier) @decorator.receiver
|
|
724
730
|
attribute: (identifier) @decorator.name)
|
|
725
731
|
arguments: (argument_list
|
|
726
|
-
|
|
732
|
+
.
|
|
733
|
+
[
|
|
734
|
+
(string (string_content)? @decorator.arg) @decorator.arg_str
|
|
735
|
+
(identifier) @decorator.arg_expr
|
|
736
|
+
(binary_operator) @decorator.arg_expr
|
|
737
|
+
]?))) @decorator
|
|
727
738
|
`;
|
|
728
739
|
// Java queries - works with tree-sitter-java
|
|
729
740
|
export const JAVA_QUERIES = `
|
|
730
|
-
; Classes, Interfaces, Enums, Annotations
|
|
741
|
+
; Classes, Interfaces, Enums, Records, Annotations
|
|
731
742
|
(class_declaration name: (identifier) @name) @definition.class
|
|
732
743
|
(interface_declaration name: (identifier) @name) @definition.interface
|
|
733
744
|
(enum_declaration name: (identifier) @name) @definition.enum
|
|
745
|
+
(record_declaration name: (identifier) @name) @definition.record
|
|
734
746
|
(annotation_type_declaration name: (identifier) @name) @definition.annotation
|
|
735
747
|
|
|
748
|
+
; Anonymous class bodies: new Runnable() { ... } — no @name capture; the
|
|
749
|
+
; class extractor synthesizes the javac-style Worker$N name (#2550)
|
|
750
|
+
(object_creation_expression (class_body)) @definition.class
|
|
751
|
+
|
|
752
|
+
; Enum constant bodies: enum E { A { ... } } — javac's other anonymous
|
|
753
|
+
; shape, synthesized as E$N by the same naming authority (#2555)
|
|
754
|
+
(enum_constant body: (class_body)) @definition.class
|
|
755
|
+
|
|
736
756
|
; Methods & Constructors
|
|
737
757
|
(method_declaration name: (identifier) @name) @definition.method
|
|
738
758
|
(constructor_declaration name: (identifier) @name) @definition.constructor
|
|
@@ -1755,4 +1775,5 @@ export const LANGUAGE_QUERIES = {
|
|
|
1755
1775
|
[SupportedLanguages.Dart]: DART_QUERIES,
|
|
1756
1776
|
[SupportedLanguages.Vue]: TYPESCRIPT_QUERIES, // Vue <script> blocks are parsed as TypeScript
|
|
1757
1777
|
[SupportedLanguages.Cobol]: '', // Standalone regex processor — no tree-sitter queries
|
|
1778
|
+
[SupportedLanguages.Move]: '', // Compiler-first via move-flow — no tree-sitter queries
|
|
1758
1779
|
};
|