gitnexus 1.6.10-rc.99 → 1.6.10
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 +177 -18
- package/dist/_shared/graph/types.d.ts +21 -2
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/index.d.ts +3 -3
- package/dist/_shared/index.d.ts.map +1 -1
- package/dist/_shared/index.js +1 -1
- package/dist/_shared/index.js.map +1 -1
- package/dist/_shared/integrations/circuit-breaker.d.ts.map +1 -1
- package/dist/_shared/integrations/circuit-breaker.js.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts +16 -0
- package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.js +19 -7
- package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
- package/dist/_shared/language-detection.d.ts.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 +3 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +5 -0
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js +315 -36
- package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts +115 -0
- package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
- package/dist/_shared/scope-resolution/registries/lookup-core.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/registries/lookup-core.js +58 -2
- package/dist/_shared/scope-resolution/registries/lookup-core.js.map +1 -1
- package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
- package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
- package/dist/_shared/scope-resolution/symbol-definition.d.ts +47 -0
- package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/types.d.ts +278 -3
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +3 -2
- package/dist/cli/ai-context.js +71 -16
- package/dist/cli/analyze-config.d.ts +1 -1
- package/dist/cli/analyze-options.d.ts +131 -0
- package/dist/cli/analyze-options.js +1 -0
- package/dist/cli/analyze.d.ts +21 -113
- package/dist/cli/analyze.js +172 -29
- package/dist/cli/cli-message.d.ts +1 -1
- package/dist/cli/detect-changes-format.js +19 -2
- package/dist/cli/doctor.d.ts +12 -0
- package/dist/cli/doctor.js +32 -5
- package/dist/cli/editor-targets.js +6 -0
- package/dist/cli/eval-server.js +2 -1
- package/dist/cli/format-symbol.d.ts +15 -0
- package/dist/cli/format-symbol.js +17 -0
- package/dist/cli/generated-skill.d.ts +17 -0
- package/dist/cli/generated-skill.js +1 -0
- package/dist/cli/group.js +229 -21
- package/dist/cli/help-i18n.js +1 -2
- package/dist/cli/i18n/en.d.ts +11 -9
- package/dist/cli/i18n/en.js +13 -9
- package/dist/cli/i18n/resources.d.ts +15 -11
- package/dist/cli/i18n/zh-CN.d.ts +4 -2
- package/dist/cli/i18n/zh-CN.js +11 -9
- package/dist/cli/index.js +8 -4
- package/dist/cli/resolve-invocation.d.ts +7 -3
- package/dist/cli/resolve-invocation.js +7 -3
- package/dist/cli/setup.js +4 -3
- package/dist/cli/skill-gen.d.ts +1 -6
- package/dist/cli/tool.d.ts +1 -0
- package/dist/cli/tool.js +74 -17
- package/dist/cli/wiki.js +53 -10
- package/dist/config/ignore-service.d.ts +2 -0
- package/dist/config/ignore-service.js +54 -13
- package/dist/core/analyzer-identity.d.ts +80 -0
- package/dist/core/analyzer-identity.js +364 -26
- package/dist/core/augmentation/engine.js +86 -71
- package/dist/core/embedding-checkpoint.d.ts +143 -0
- package/dist/core/embedding-checkpoint.js +221 -0
- package/dist/core/embedding-count.d.ts +61 -0
- package/dist/core/embedding-count.js +69 -0
- package/dist/core/embeddings/ast-utils.js +9 -1
- package/dist/core/embeddings/embedding-pipeline.d.ts +8 -0
- package/dist/core/embeddings/embedding-pipeline.js +253 -14
- package/dist/core/embeddings/http-client.d.ts +5 -0
- package/dist/core/embeddings/http-client.js +142 -27
- package/dist/core/graph/graph.js +3 -0
- package/dist/core/graph/import-cycles.d.ts +194 -3
- package/dist/core/graph/import-cycles.js +522 -73
- package/dist/core/graph/types.d.ts +18 -0
- package/dist/core/group/bridge-db.d.ts +204 -1
- package/dist/core/group/bridge-db.js +401 -28
- package/dist/core/group/completeness.d.ts +130 -0
- package/dist/core/group/completeness.js +83 -0
- package/dist/core/group/config-parser.js +0 -5
- package/dist/core/group/cross-impact.d.ts +46 -1
- package/dist/core/group/cross-impact.js +220 -19
- package/dist/core/group/cross-trace.d.ts +32 -11
- package/dist/core/group/cross-trace.js +114 -20
- package/dist/core/group/extractors/http-patterns/java.js +278 -22
- package/dist/core/group/extractors/http-patterns/node.js +332 -216
- package/dist/core/group/extractors/http-patterns/types.d.ts +8 -0
- package/dist/core/group/extractors/http-route-extractor.d.ts +1 -0
- package/dist/core/group/extractors/http-route-extractor.js +122 -48
- package/dist/core/group/extractors/include-extractor.js +20 -2
- package/dist/core/group/extractors/manifest-extractor.d.ts +1 -1
- package/dist/core/group/extractors/manifest-extractor.js +7 -7
- package/dist/core/group/extractors/python-workspace-extractor.js +5 -2
- package/dist/core/group/group-lock.d.ts +31 -0
- package/dist/core/group/group-lock.js +166 -0
- package/dist/core/group/service.js +297 -16
- package/dist/core/group/storage.d.ts +3 -0
- package/dist/core/group/storage.js +7 -39
- package/dist/core/group/sync.d.ts +49 -3
- package/dist/core/group/sync.js +0 -0
- package/dist/core/group/types.d.ts +183 -8
- package/dist/core/group/types.js +28 -1
- package/dist/core/incremental/subgraph-extract.d.ts +9 -6
- package/dist/core/incremental/subgraph-extract.js +33 -10
- package/dist/core/index-freshness.d.ts +77 -2
- package/dist/core/index-freshness.js +109 -2
- package/dist/core/ingestion/call-processor.d.ts +13 -1
- package/dist/core/ingestion/call-processor.js +110 -3
- package/dist/core/ingestion/cfg/callee-cell-format.d.ts +42 -0
- package/dist/core/ingestion/cfg/callee-cell-format.js +42 -0
- package/dist/core/ingestion/cfg/emit.d.ts +8 -23
- package/dist/core/ingestion/cfg/emit.js +9 -23
- package/dist/core/ingestion/class-extractors/configs/go.js +10 -5
- package/dist/core/ingestion/cluster-enricher.js +8 -4
- package/dist/core/ingestion/community-processor.d.ts +21 -3
- package/dist/core/ingestion/community-processor.js +81 -82
- package/dist/core/ingestion/di-extractors/index.d.ts +9 -33
- package/dist/core/ingestion/di-extractors/spring.d.ts +1 -1
- package/dist/core/ingestion/di-extractors/spring.js +8 -1
- package/dist/core/ingestion/di-extractors/types.d.ts +60 -0
- package/dist/core/ingestion/di-extractors/types.js +15 -0
- package/dist/core/ingestion/filesystem-walker.js +30 -14
- package/dist/core/ingestion/finalize-orchestrator.js +1 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +6 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +35 -1
- package/dist/core/ingestion/frameworks/spring/annotation-arguments.d.ts +13 -0
- package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +227 -0
- package/dist/core/ingestion/frameworks/spring/aop-candidates.d.ts +15 -0
- package/dist/core/ingestion/frameworks/spring/aop-candidates.js +85 -0
- package/dist/core/ingestion/frameworks/spring/aop.d.ts +118 -0
- package/dist/core/ingestion/frameworks/spring/aop.js +476 -0
- package/dist/core/ingestion/frameworks/spring/auto-configuration.d.ts +8 -0
- package/dist/core/ingestion/frameworks/spring/auto-configuration.js +16 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.js +1 -0
- package/dist/core/ingestion/frameworks/spring/bean-factories.d.ts +33 -0
- package/dist/core/ingestion/frameworks/spring/bean-factories.js +65 -0
- package/dist/core/ingestion/frameworks/spring/conditionals.d.ts +25 -0
- package/dist/core/ingestion/frameworks/spring/conditionals.js +319 -0
- package/dist/core/ingestion/frameworks/spring/di-metadata.d.ts +3 -0
- package/dist/core/ingestion/frameworks/spring/di-metadata.js +162 -13
- package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +28 -0
- package/dist/core/ingestion/frameworks/spring/non-http-handlers.js +152 -0
- package/dist/core/ingestion/frameworks/spring/resource-injection.d.ts +5 -0
- package/dist/core/ingestion/frameworks/spring/resource-injection.js +91 -0
- package/dist/core/ingestion/import-resolvers/configs/csharp.js +5 -1
- package/dist/core/ingestion/import-resolvers/configs/swift.js +13 -0
- package/dist/core/ingestion/import-resolvers/csharp.d.ts +9 -1
- package/dist/core/ingestion/import-resolvers/csharp.js +234 -27
- package/dist/core/ingestion/import-resolvers/go.d.ts +11 -1
- package/dist/core/ingestion/import-resolvers/go.js +44 -17
- package/dist/core/ingestion/import-resolvers/jvm.d.ts +2 -2
- package/dist/core/ingestion/import-resolvers/node-workspace-packages.d.ts +90 -0
- package/dist/core/ingestion/import-resolvers/node-workspace-packages.js +429 -0
- package/dist/core/ingestion/import-resolvers/package-dir-index.d.ts +124 -0
- package/dist/core/ingestion/import-resolvers/package-dir-index.js +223 -0
- package/dist/core/ingestion/import-resolvers/pass-cache.d.ts +50 -0
- package/dist/core/ingestion/import-resolvers/pass-cache.js +60 -0
- package/dist/core/ingestion/import-resolvers/per-file-set.d.ts +71 -0
- package/dist/core/ingestion/import-resolvers/per-file-set.js +11 -0
- package/dist/core/ingestion/import-resolvers/php.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/php.js +65 -19
- package/dist/core/ingestion/import-resolvers/python-file-index.d.ts +201 -0
- package/dist/core/ingestion/import-resolvers/python-file-index.js +302 -0
- package/dist/core/ingestion/import-resolvers/python.js +25 -6
- package/dist/core/ingestion/import-resolvers/ruby.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/rust.d.ts +2 -2
- package/dist/core/ingestion/import-resolvers/standard.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/types.d.ts +1 -12
- package/dist/core/ingestion/import-resolvers/utils.d.ts +65 -6
- package/dist/core/ingestion/import-resolvers/utils.js +215 -36
- package/dist/core/ingestion/import-resolvers/workspace-file-index.d.ts +72 -0
- package/dist/core/ingestion/import-resolvers/workspace-file-index.js +58 -0
- package/dist/core/ingestion/language-config.d.ts +29 -1
- package/dist/core/ingestion/language-config.js +110 -35
- package/dist/core/ingestion/language-provider.d.ts +209 -7
- package/dist/core/ingestion/language-provider.js +37 -0
- package/dist/core/ingestion/languages/c/captures.js +7 -0
- package/dist/core/ingestion/languages/c/import-target.js +12 -16
- package/dist/core/ingestion/languages/c/scope-resolver.js +20 -19
- package/dist/core/ingestion/languages/c/static-linkage.js +12 -16
- package/dist/core/ingestion/languages/c-cpp.js +13 -0
- package/dist/core/ingestion/languages/cobol/scope-resolver.js +27 -20
- package/dist/core/ingestion/languages/cobol.js +13 -0
- package/dist/core/ingestion/languages/cpp/adl.d.ts +2 -2
- package/dist/core/ingestion/languages/cpp/adl.js +67 -44
- package/dist/core/ingestion/languages/cpp/captures.js +14 -2
- package/dist/core/ingestion/languages/cpp/file-local-linkage.js +11 -15
- package/dist/core/ingestion/languages/cpp/inline-namespaces.d.ts +28 -8
- package/dist/core/ingestion/languages/cpp/inline-namespaces.js +242 -68
- package/dist/core/ingestion/languages/cpp/interpret.d.ts +2 -0
- package/dist/core/ingestion/languages/cpp/interpret.js +126 -6
- package/dist/core/ingestion/languages/cpp/query.js +106 -0
- package/dist/core/ingestion/languages/cpp/scope-resolver.js +48 -20
- package/dist/core/ingestion/languages/csharp/accessor-unwrap.d.ts +2 -15
- package/dist/core/ingestion/languages/csharp/accessor-unwrap.js +18 -10
- package/dist/core/ingestion/languages/csharp/captures.js +19 -0
- package/dist/core/ingestion/languages/csharp/import-target.js +46 -72
- package/dist/core/ingestion/languages/csharp/namespace-siblings.js +5 -1
- package/dist/core/ingestion/languages/csharp/query.js +25 -5
- package/dist/core/ingestion/languages/csharp/scope-resolver.js +75 -2
- package/dist/core/ingestion/languages/dart/captures.d.ts +10 -0
- package/dist/core/ingestion/languages/dart/captures.js +598 -16
- package/dist/core/ingestion/languages/dart/import-target.js +32 -9
- package/dist/core/ingestion/languages/dart/index.d.ts +1 -1
- package/dist/core/ingestion/languages/dart/index.js +1 -1
- package/dist/core/ingestion/languages/dart/query.js +98 -1
- package/dist/core/ingestion/languages/dart/scope-resolver.js +14 -3
- package/dist/core/ingestion/languages/dart/simple-hooks.js +9 -0
- package/dist/core/ingestion/languages/dart.js +6 -1
- package/dist/core/ingestion/languages/go/captures.js +108 -3
- package/dist/core/ingestion/languages/go/generic-type-parameters.d.ts +31 -0
- package/dist/core/ingestion/languages/go/generic-type-parameters.js +140 -0
- package/dist/core/ingestion/languages/go/import-target.d.ts +3 -10
- package/dist/core/ingestion/languages/go/import-target.js +34 -30
- package/dist/core/ingestion/languages/go/index.d.ts +1 -1
- package/dist/core/ingestion/languages/go/interface-impls.d.ts +9 -1
- package/dist/core/ingestion/languages/go/interface-impls.js +693 -87
- package/dist/core/ingestion/languages/go/interpret.d.ts +2 -0
- package/dist/core/ingestion/languages/go/interpret.js +22 -8
- package/dist/core/ingestion/languages/go/method-owners.js +31 -12
- package/dist/core/ingestion/languages/go/package-clause.d.ts +46 -0
- package/dist/core/ingestion/languages/go/package-clause.js +75 -0
- package/dist/core/ingestion/languages/go/package-siblings.js +7 -11
- package/dist/core/ingestion/languages/go/query.js +56 -3
- package/dist/core/ingestion/languages/go/scope-resolver.js +39 -0
- package/dist/core/ingestion/languages/go.js +9 -0
- package/dist/core/ingestion/languages/java/analysis-features.d.ts +4 -0
- package/dist/core/ingestion/languages/java/analysis-features.js +12 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +12 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +48 -0
- package/dist/core/ingestion/languages/java/captures.js +77 -32
- package/dist/core/ingestion/languages/java/import-target.d.ts +49 -9
- package/dist/core/ingestion/languages/java/import-target.js +68 -88
- package/dist/core/ingestion/languages/java/interpret.js +3 -2
- package/dist/core/ingestion/languages/java/module-resolution.d.ts +62 -0
- package/dist/core/ingestion/languages/java/module-resolution.js +142 -0
- package/dist/core/ingestion/languages/java/query.js +15 -3
- package/dist/core/ingestion/languages/java/record-components.d.ts +14 -0
- package/dist/core/ingestion/languages/java/record-components.js +185 -0
- package/dist/core/ingestion/languages/java/scope-resolver.js +10 -2
- package/dist/core/ingestion/languages/java/spring-aop.d.ts +12 -0
- package/dist/core/ingestion/languages/java/spring-aop.js +49 -0
- package/dist/core/ingestion/languages/java/spring-conditionals.d.ts +11 -0
- package/dist/core/ingestion/languages/java/spring-conditionals.js +48 -0
- package/dist/core/ingestion/languages/java/spring-di.d.ts +4 -1
- package/dist/core/ingestion/languages/java/spring-di.js +41 -9
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +7 -0
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +32 -0
- package/dist/core/ingestion/languages/java.js +94 -3
- package/dist/core/ingestion/languages/javascript/captures.d.ts +6 -1
- package/dist/core/ingestion/languages/javascript/captures.js +262 -4
- package/dist/core/ingestion/languages/javascript/import-target.d.ts +17 -21
- package/dist/core/ingestion/languages/javascript/import-target.js +24 -41
- package/dist/core/ingestion/languages/javascript/index.d.ts +54 -5
- package/dist/core/ingestion/languages/javascript/index.js +54 -5
- package/dist/core/ingestion/languages/javascript/query.d.ts +1 -0
- package/dist/core/ingestion/languages/javascript/query.js +211 -5
- package/dist/core/ingestion/languages/javascript/scope-resolver.js +12 -0
- package/dist/core/ingestion/languages/javascript/simple-hooks.js +2 -1
- package/dist/core/ingestion/languages/jvm/package-siblings.js +77 -9
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +48 -0
- package/dist/core/ingestion/languages/kotlin/captures.js +43 -1
- package/dist/core/ingestion/languages/kotlin/import-target.d.ts +8 -1
- package/dist/core/ingestion/languages/kotlin/import-target.js +20 -123
- package/dist/core/ingestion/languages/kotlin/index.d.ts +1 -0
- package/dist/core/ingestion/languages/kotlin/index.js +1 -0
- package/dist/core/ingestion/languages/kotlin/module-resolution.d.ts +22 -0
- package/dist/core/ingestion/languages/kotlin/module-resolution.js +108 -0
- package/dist/core/ingestion/languages/kotlin/query.js +28 -2
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +23 -2
- package/dist/core/ingestion/languages/kotlin/spring-aop.d.ts +12 -0
- package/dist/core/ingestion/languages/kotlin/spring-aop.js +64 -0
- package/dist/core/ingestion/languages/kotlin/spring-conditionals.d.ts +12 -0
- package/dist/core/ingestion/languages/kotlin/spring-conditionals.js +49 -0
- package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +2 -0
- package/dist/core/ingestion/languages/kotlin/spring-di.js +60 -11
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +10 -0
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +41 -0
- package/dist/core/ingestion/languages/php/captures.d.ts +5 -0
- package/dist/core/ingestion/languages/php/captures.js +319 -51
- package/dist/core/ingestion/languages/php/import-target.d.ts +3 -4
- package/dist/core/ingestion/languages/php/import-target.js +192 -62
- package/dist/core/ingestion/languages/php/query.js +31 -0
- package/dist/core/ingestion/languages/python/arity-metadata.d.ts +1 -0
- package/dist/core/ingestion/languages/python/arity-metadata.js +1 -0
- package/dist/core/ingestion/languages/python/captures.js +29 -0
- package/dist/core/ingestion/languages/python/import-decomposer.js +22 -1
- package/dist/core/ingestion/languages/python/import-target.d.ts +42 -1
- package/dist/core/ingestion/languages/python/import-target.js +277 -91
- package/dist/core/ingestion/languages/python/index.d.ts +1 -1
- package/dist/core/ingestion/languages/python/index.js +1 -1
- package/dist/core/ingestion/languages/python/interpret.d.ts +52 -0
- package/dist/core/ingestion/languages/python/interpret.js +249 -7
- package/dist/core/ingestion/languages/python/query.js +9 -0
- package/dist/core/ingestion/languages/python/receiver-binding.d.ts +8 -6
- package/dist/core/ingestion/languages/python/receiver-binding.js +108 -12
- package/dist/core/ingestion/languages/python/scope-resolver.js +27 -4
- package/dist/core/ingestion/languages/python/simple-hooks.js +2 -8
- package/dist/core/ingestion/languages/python.js +13 -0
- package/dist/core/ingestion/languages/ruby/captures.js +158 -0
- package/dist/core/ingestion/languages/ruby/import-target.js +7 -5
- package/dist/core/ingestion/languages/ruby/query.js +93 -0
- package/dist/core/ingestion/languages/ruby/scope-resolver.js +2 -0
- package/dist/core/ingestion/languages/ruby/simple-hooks.d.ts +1 -1
- package/dist/core/ingestion/languages/ruby/simple-hooks.js +22 -1
- package/dist/core/ingestion/languages/rust/captures.js +39 -1
- package/dist/core/ingestion/languages/rust/method-owners.js +11 -1
- package/dist/core/ingestion/languages/rust/module-path.d.ts +126 -0
- package/dist/core/ingestion/languages/rust/module-path.js +214 -0
- package/dist/core/ingestion/languages/rust/qualified-call.d.ts +41 -0
- package/dist/core/ingestion/languages/rust/qualified-call.js +481 -0
- package/dist/core/ingestion/languages/rust/query.js +39 -6
- package/dist/core/ingestion/languages/rust/scope-resolver.js +21 -2
- package/dist/core/ingestion/languages/rust.js +17 -0
- package/dist/core/ingestion/languages/swift/captures.js +87 -3
- package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.d.ts +48 -0
- package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.js +253 -0
- package/dist/core/ingestion/languages/swift/import-target.js +4 -9
- package/dist/core/ingestion/languages/swift/query.js +17 -0
- package/dist/core/ingestion/languages/swift/receiver-binding.d.ts +8 -0
- package/dist/core/ingestion/languages/swift/receiver-binding.js +6 -2
- package/dist/core/ingestion/languages/swift.js +2 -0
- package/dist/core/ingestion/languages/typescript/captures.d.ts +90 -1
- package/dist/core/ingestion/languages/typescript/captures.js +267 -5
- package/dist/core/ingestion/languages/typescript/cjs-export-assignment.d.ts +134 -0
- package/dist/core/ingestion/languages/typescript/cjs-export-assignment.js +523 -0
- package/dist/core/ingestion/languages/typescript/cjs-module-exports.d.ts +54 -0
- package/dist/core/ingestion/languages/typescript/cjs-module-exports.js +191 -0
- package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.d.ts +7 -0
- package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.js +92 -0
- package/dist/core/ingestion/languages/typescript/file-candidates.d.ts +29 -0
- package/dist/core/ingestion/languages/typescript/file-candidates.js +70 -0
- package/dist/core/ingestion/languages/typescript/import-decomposer.d.ts +28 -1
- package/dist/core/ingestion/languages/typescript/import-decomposer.js +125 -10
- package/dist/core/ingestion/languages/typescript/import-target.d.ts +25 -37
- package/dist/core/ingestion/languages/typescript/import-target.js +24 -26
- package/dist/core/ingestion/languages/typescript/interpret.d.ts +21 -1
- package/dist/core/ingestion/languages/typescript/interpret.js +45 -5
- package/dist/core/ingestion/languages/typescript/module-resolution.d.ts +48 -0
- package/dist/core/ingestion/languages/typescript/module-resolution.js +171 -0
- package/dist/core/ingestion/languages/typescript/query.d.ts +1 -0
- package/dist/core/ingestion/languages/typescript/query.js +303 -14
- package/dist/core/ingestion/languages/typescript/receiver-binding.d.ts +17 -0
- package/dist/core/ingestion/languages/typescript/receiver-binding.js +27 -0
- package/dist/core/ingestion/languages/typescript/scope-resolver.js +27 -40
- package/dist/core/ingestion/languages/typescript/simple-hooks.d.ts +0 -10
- package/dist/core/ingestion/languages/typescript/simple-hooks.js +22 -22
- package/dist/core/ingestion/languages/typescript/tsconfig.d.ts +59 -0
- package/dist/core/ingestion/languages/typescript/tsconfig.js +292 -0
- package/dist/core/ingestion/languages/typescript.js +93 -2
- package/dist/core/ingestion/languages/vue/import-target.d.ts +6 -22
- package/dist/core/ingestion/languages/vue/import-target.js +11 -47
- package/dist/core/ingestion/languages/vue/scope-resolver.js +4 -2
- package/dist/core/ingestion/local-symbol-pruner.js +11 -11
- package/dist/core/ingestion/method-extractors/configs/csharp.js +1 -0
- package/dist/core/ingestion/method-extractors/generic.js +1 -0
- package/dist/core/ingestion/method-types.d.ts +16 -0
- package/dist/core/ingestion/pipeline-phases/di.d.ts +1 -1
- package/dist/core/ingestion/pipeline-phases/di.js +136 -21
- package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
- package/dist/core/ingestion/pipeline-phases/index.js +2 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +15 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +154 -4
- package/dist/core/ingestion/pipeline-phases/parse.js +5 -0
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +3 -2
- package/dist/core/ingestion/pipeline-phases/processes.js +91 -6
- package/dist/core/ingestion/pipeline-phases/routes.js +116 -25
- package/dist/core/ingestion/pipeline-phases/spring-aop.d.ts +34 -0
- package/dist/core/ingestion/pipeline-phases/spring-aop.js +439 -0
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +34 -0
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +255 -0
- package/dist/core/ingestion/pipeline-phases/types.d.ts +7 -0
- package/dist/core/ingestion/pipeline.d.ts +26 -2
- package/dist/core/ingestion/pipeline.js +60 -11
- package/dist/core/ingestion/process-processor.d.ts +109 -2
- package/dist/core/ingestion/process-processor.js +464 -52
- package/dist/core/ingestion/resolve-references.d.ts +6 -1
- package/dist/core/ingestion/resolve-references.js +66 -6
- package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +8 -2
- package/dist/core/ingestion/route-extractors/constant-resolver.js +11 -7
- package/dist/core/ingestion/route-extractors/data-route-table.d.ts +40 -0
- package/dist/core/ingestion/route-extractors/data-route-table.js +876 -0
- package/dist/core/ingestion/route-extractors/dispatch-guard.d.ts +96 -0
- package/dist/core/ingestion/route-extractors/dispatch-guard.js +1184 -0
- package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +114 -0
- package/dist/core/ingestion/route-extractors/java-const-resolver.js +569 -0
- package/dist/core/ingestion/route-extractors/js-const-resolver.d.ts +192 -0
- package/dist/core/ingestion/route-extractors/js-const-resolver.js +1033 -0
- package/dist/core/ingestion/route-extractors/nest.d.ts +53 -0
- package/dist/core/ingestion/route-extractors/nest.js +523 -0
- package/dist/core/ingestion/route-extractors/spring-shared.d.ts +11 -0
- package/dist/core/ingestion/route-extractors/spring-shared.js +89 -0
- package/dist/core/ingestion/route-extractors/spring.js +214 -29
- package/dist/core/ingestion/scope-extractor-bridge.js +9 -1
- package/dist/core/ingestion/scope-extractor.d.ts +22 -7
- package/dist/core/ingestion/scope-extractor.js +309 -15
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +311 -21
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +16 -5
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +12 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +47 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +20 -15
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +280 -42
- package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.d.ts +123 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +171 -17
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.d.ts +58 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +137 -34
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +30 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +39 -1
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +18 -1
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +113 -18
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +107 -5
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +590 -33
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +3 -0
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +101 -41
- package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.d.ts +34 -0
- package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.js +62 -0
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +5 -1
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +8 -1
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +105 -5
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +931 -92
- package/dist/core/ingestion/scope-resolution/passes/return-shape-members.d.ts +58 -0
- package/dist/core/ingestion/scope-resolution/passes/return-shape-members.js +458 -0
- package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.d.ts +180 -0
- package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.js +418 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +29 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +57 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +55 -1
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +241 -19
- package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +112 -2
- package/dist/core/ingestion/scope-resolution/resolution-outcome.js +38 -1
- package/dist/core/ingestion/scope-resolution/scope/namespace-targets.d.ts +25 -3
- package/dist/core/ingestion/scope-resolution/scope/namespace-targets.js +36 -16
- package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +210 -9
- package/dist/core/ingestion/scope-resolution/scope/walkers.js +905 -22
- package/dist/core/ingestion/scope-resolution/summary-maps.d.ts +28 -0
- package/dist/core/ingestion/scope-resolution/summary-maps.js +50 -0
- package/dist/core/ingestion/scope-resolution/undecided-satisfaction.d.ts +55 -0
- package/dist/core/ingestion/scope-resolution/undecided-satisfaction.js +37 -0
- package/dist/core/ingestion/scope-resolution/unresolved-receivers.d.ts +109 -0
- package/dist/core/ingestion/scope-resolution/unresolved-receivers.js +204 -0
- package/dist/core/ingestion/scope-resolution/utils/definition-id.d.ts +13 -0
- package/dist/core/ingestion/scope-resolution/utils/definition-id.js +19 -0
- package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.d.ts +171 -0
- package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.js +218 -0
- package/dist/core/ingestion/scope-resolution/workspace-index-types.d.ts +34 -0
- package/dist/core/ingestion/scope-resolution/workspace-index-types.js +15 -0
- package/dist/core/ingestion/scope-resolution/workspace-index.d.ts +7 -20
- package/dist/core/ingestion/tree-sitter-queries.d.ts +11 -11
- package/dist/core/ingestion/tree-sitter-queries.js +678 -4
- package/dist/core/ingestion/type-env.js +11 -7
- package/dist/core/ingestion/type-extractors/shared.d.ts +17 -0
- package/dist/core/ingestion/type-extractors/shared.js +16 -0
- package/dist/core/ingestion/type-extractors/types.d.ts +12 -0
- package/dist/core/ingestion/type-extractors/typescript.d.ts +20 -0
- package/dist/core/ingestion/type-extractors/typescript.js +26 -0
- package/dist/core/ingestion/utils/ast-helpers.d.ts +297 -15
- package/dist/core/ingestion/utils/ast-helpers.js +578 -46
- package/dist/core/ingestion/utils/call-analysis.d.ts +27 -22
- package/dist/core/ingestion/utils/call-analysis.js +202 -7
- package/dist/core/ingestion/utils/callable-flow-captures.d.ts +59 -0
- package/dist/core/ingestion/utils/callable-flow-captures.js +51 -1
- package/dist/core/ingestion/utils/callable-labels.d.ts +25 -0
- package/dist/core/ingestion/utils/callable-labels.js +31 -0
- package/dist/core/ingestion/utils/effective-ram.d.ts +40 -0
- package/dist/core/ingestion/utils/effective-ram.js +58 -0
- package/dist/core/ingestion/utils/line-base.d.ts +14 -0
- package/dist/core/ingestion/utils/line-base.js +14 -0
- package/dist/core/ingestion/utils/method-props.d.ts +27 -4
- package/dist/core/ingestion/utils/method-props.js +29 -4
- package/dist/core/ingestion/utils/receiver-chain-captures.d.ts +31 -0
- package/dist/core/ingestion/utils/receiver-chain-captures.js +57 -0
- package/dist/core/ingestion/utils/receiver-chain-codec.d.ts +89 -0
- package/dist/core/ingestion/utils/receiver-chain-codec.js +182 -0
- package/dist/core/ingestion/utils/scope-tree-walk.d.ts +22 -0
- package/dist/core/ingestion/utils/scope-tree-walk.js +33 -0
- package/dist/core/ingestion/utils/template-arguments.d.ts +96 -0
- package/dist/core/ingestion/utils/template-arguments.js +196 -0
- package/dist/core/ingestion/utils/type-parameters.d.ts +49 -0
- package/dist/core/ingestion/utils/type-parameters.js +206 -0
- package/dist/core/ingestion/workers/callable-id.d.ts +80 -0
- package/dist/core/ingestion/workers/callable-id.js +125 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +14 -1
- package/dist/core/ingestion/workers/parse-worker.js +493 -54
- package/dist/core/ingestion/workers/worker-pool.d.ts +20 -27
- package/dist/core/ingestion/workers/worker-pool.js +91 -3
- package/dist/core/lbug/csv-generator.d.ts +27 -0
- package/dist/core/lbug/csv-generator.js +72 -17
- package/dist/core/lbug/extension-load-error.js +13 -2
- package/dist/core/lbug/extension-loader.d.ts +29 -0
- package/dist/core/lbug/extension-loader.js +31 -6
- package/dist/core/lbug/graph-emit-sink.d.ts +264 -0
- package/dist/core/lbug/graph-emit-sink.js +581 -0
- package/dist/core/lbug/lbug-adapter.d.ts +290 -11
- package/dist/core/lbug/lbug-adapter.js +652 -69
- package/dist/core/lbug/native-check.d.ts +21 -0
- package/dist/core/lbug/native-check.js +248 -32
- package/dist/core/lbug/pdg-emit-sink.d.ts +13 -4
- package/dist/core/lbug/pdg-emit-sink.js +21 -111
- package/dist/core/lbug/pool-adapter.d.ts +9 -0
- package/dist/core/lbug/pool-adapter.js +164 -14
- package/dist/core/lbug/query-batch.d.ts +75 -0
- package/dist/core/lbug/query-batch.js +102 -0
- package/dist/core/lbug/rel-pair-routing.d.ts +160 -2
- package/dist/core/lbug/rel-pair-routing.js +228 -10
- package/dist/core/lbug/schema.d.ts +163 -4
- package/dist/core/lbug/schema.js +404 -159
- package/dist/core/lbug/sync-csv-writer.d.ts +47 -0
- package/dist/core/lbug/sync-csv-writer.js +108 -0
- package/dist/core/run-analyze.d.ts +147 -0
- package/dist/core/run-analyze.js +1215 -179
- package/dist/core/search/bm25-index.d.ts +11 -0
- package/dist/core/search/bm25-index.js +60 -26
- package/dist/core/search/fts-indexes.d.ts +150 -9
- package/dist/core/search/fts-indexes.js +241 -23
- package/dist/core/wiki/graph-queries.js +145 -112
- package/dist/core/wiki/llm-client.d.ts +29 -3
- package/dist/core/wiki/llm-client.js +47 -12
- package/dist/core/wiki/prompts.d.ts +19 -0
- package/dist/core/wiki/prompts.js +20 -1
- package/dist/lib/utils.d.ts +113 -0
- package/dist/lib/utils.js +185 -0
- package/dist/mcp/local/aop-metadata.d.ts +77 -0
- package/dist/mcp/local/aop-metadata.js +227 -0
- package/dist/mcp/local/bean-metadata.d.ts +2 -1
- package/dist/mcp/local/bean-metadata.js +22 -1
- package/dist/mcp/local/convex-metadata.d.ts +8 -0
- package/dist/mcp/local/convex-metadata.js +45 -0
- package/dist/mcp/local/local-backend.d.ts +174 -11
- package/dist/mcp/local/local-backend.js +1678 -331
- package/dist/mcp/local/path-predicate.d.ts +19 -0
- package/dist/mcp/local/path-predicate.js +21 -0
- package/dist/mcp/local/pdg-impact.d.ts +132 -10
- package/dist/mcp/local/pdg-impact.js +391 -98
- package/dist/mcp/repository-policy.d.ts +1 -0
- package/dist/mcp/repository-policy.js +5 -0
- package/dist/mcp/resources.js +26 -4
- package/dist/mcp/server.js +23 -13
- package/dist/mcp/tools.d.ts +8 -0
- package/dist/mcp/tools.js +76 -23
- package/dist/server/analyze-job.d.ts +37 -2
- package/dist/server/analyze-job.js +13 -2
- package/dist/server/analyze-launch.d.ts +1 -1
- package/dist/server/analyze-launch.js +79 -10
- package/dist/server/analyze-worker-core.d.ts +1 -1
- package/dist/server/analyze-worker-core.js +10 -1
- package/dist/server/analyze-worker-ipc.d.ts +1 -1
- package/dist/server/analyze-worker-ipc.js +4 -0
- package/dist/server/analyze-worker-protocol.d.ts +59 -0
- package/dist/server/analyze-worker-protocol.js +1 -0
- package/dist/server/analyze-worker.d.ts +1 -17
- package/dist/server/api.d.ts +2 -11
- package/dist/server/api.js +164 -163
- package/dist/server/embed-run-outcome.d.ts +89 -0
- package/dist/server/embed-run-outcome.js +88 -0
- package/dist/server/git-clone.js +6 -2
- package/dist/server/middleware.d.ts +116 -9
- package/dist/server/middleware.js +291 -22
- package/dist/server/sse-progress.d.ts +41 -0
- package/dist/server/sse-progress.js +125 -0
- package/dist/storage/branch-index.d.ts +11 -6
- package/dist/storage/branch-index.js +15 -7
- package/dist/storage/file-hash.js +2 -2
- package/dist/storage/fs-atomic.d.ts +25 -0
- package/dist/storage/fs-atomic.js +42 -0
- package/dist/storage/git.d.ts +131 -0
- package/dist/storage/git.js +236 -2
- package/dist/storage/index-lock.d.ts +102 -0
- package/dist/storage/index-lock.js +660 -0
- package/dist/storage/parse-cache.js +588 -6
- package/dist/storage/parsedfile-store.js +76 -6
- package/dist/storage/repo-manager.d.ts +54 -441
- package/dist/storage/repo-manager.js +312 -221
- package/dist/storage/repo-meta.d.ts +530 -0
- package/dist/storage/repo-meta.js +100 -0
- package/dist/types/pipeline.d.ts +37 -0
- package/hooks/antigravity/gitnexus-antigravity-hook.cjs +1 -1
- package/hooks/claude/gitnexus-hook.cjs +1 -1
- package/hooks/claude/resolve-analyze-cmd.cjs +80 -13
- package/package.json +11 -2
- package/scripts/cross-platform-shard.ts +153 -0
- package/scripts/cross-platform-tests.ts +122 -0
- package/scripts/run-cross-platform.ts +16 -5
- package/skills/gitnexus-cli.md +3 -3
- package/skills/gitnexus-debugging.md +37 -7
- package/skills/gitnexus-exploring.md +26 -4
- package/skills/gitnexus-impact-analysis.md +71 -10
- package/skills/gitnexus-plan/README.md +11 -6
- package/skills/gitnexus-plan/references/evidence-provenance.md +49 -12
- package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +654 -372
- package/skills/gitnexus-refactoring.md +48 -5
- package/skills/gitnexus-review/SKILL.md +12 -6
- package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-security-lens.md +1 -1
- package/skills/gitnexus-taint-analysis.md +13 -7
- package/skills/gitnexus-work/SKILL.md +4 -1
- package/skills/gitnexus-work/references/evidence-provenance.md +49 -12
- package/skills/gitnexus-work/scripts/evidence-provenance.mjs +654 -372
- package/vendor/leiden/utils.cjs +28 -1
- package/web/assets/ProcessFlowModal-Badh2Pbg.js +24 -0
- package/web/assets/{__vite-browser-external-bMKyYQkO.js → __vite-browser-external-COxE8F0G.js} +1 -1
- package/web/assets/abnfDiagram-QNN2D4NM-Cq2djWWe.js +1 -0
- package/web/assets/agent-Dr4l5EOp.js +662 -0
- package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +1 -0
- package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +36 -0
- package/web/assets/{blockDiagram-7IZFK4PR-DBefcjof.js → blockDiagram-54WLDVWM-Dg_hrRWE.js} +4 -4
- package/web/assets/{c4Diagram-Y2BXMSZH-EjWnjEJl.js → c4Diagram-X2LASM7V-CnhoT4aV.js} +2 -2
- package/web/assets/chunk-224SPVON-B8gxtXpy.js +1 -0
- package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +127 -0
- package/web/assets/chunk-2SREHG4O-Dip42xOq.js +1 -0
- package/web/assets/chunk-4RFN2BYJ-DHHWuC-n.js +1 -0
- package/web/assets/chunk-66DQ2XMT-CM0xjFAN.js +1 -0
- package/web/assets/chunk-6BELYETK-ChsYtfHW.js +1 -0
- package/web/assets/{chunk-LII3EMHJ-BL6lKJ_P.js → chunk-6L755F7B-CMhLBxi2.js} +1 -1
- package/web/assets/{chunk-QA3QBVWF-DVXPOIxe.js → chunk-7CWYLC5S-DRgGkkpF.js} +1 -1
- package/web/assets/{chunk-ZXARS5L4-C3v-4Fsw.js → chunk-A7VWPJGB-B4O3oQdQ.js} +1 -1
- package/web/assets/chunk-BI6VK774-D0oaWk8V.js +1 -0
- package/web/assets/chunk-D6VWDJW2-BxcBdZ9c.js +2 -0
- package/web/assets/chunk-DMV4VAQV-Bn6WXDSX.js +4 -0
- package/web/assets/chunk-E5QJAATJ-dh-5CtIV.js +2 -0
- package/web/assets/chunk-EQFTRU2I-1ix7TzW9.js +2 -0
- package/web/assets/chunk-FWYVLQTC-BgDItRzJ.js +1 -0
- package/web/assets/chunk-HNC4WDU7-DoU3KnA7.js +1 -0
- package/web/assets/chunk-L5GCOVLC-CE2w8Nm_.js +161 -0
- package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +321 -0
- package/web/assets/chunk-LORZLZWG-B57uGw2N.js +88 -0
- package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +62 -0
- package/web/assets/chunk-NV3KIAZN-5yvcpMiu.js +1 -0
- package/web/assets/chunk-OIYT25JQ-CQ6KOZGX.js +1 -0
- package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +10 -0
- package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +156 -0
- package/web/assets/chunk-RRFMTAIC-CMN0wcYA.js +1 -0
- package/web/assets/{chunk-RLI5ZMPA-CkXZ0y0U.js → chunk-SATU7PGQ-B1zhgOvc.js} +1 -1
- package/web/assets/chunk-STOV2HOB-GnExfzIX.js +1 -0
- package/web/assets/{chunk-INKRHTLW-Ckl3_KkO.js → chunk-SZD42YQK-ijyKKVr1.js} +21 -21
- package/web/assets/{chunk-LCXTWHL2-C162wE5z.js → chunk-TFPGFQPA-Dj6a-0pC.js} +3 -3
- package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +2 -0
- package/web/assets/chunk-TZUXEDM2-B7p9AcTw.js +1 -0
- package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +1 -0
- package/web/assets/{chunk-6764PJDD-C7xxk063.js → chunk-VE5CLXGZ-C1vB7wpY.js} +1 -1
- package/web/assets/{chunk-RG4AUYOV-ZNgyLFq6.js → chunk-VJFVEZTB-CX66F2ep.js} +3 -3
- package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +1 -0
- package/web/assets/chunk-WJBAP47W-BckNkuEN.js +1 -0
- package/web/assets/chunk-XNMVGMAZ-Cg_LnPtj.js +1 -0
- package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +1 -0
- package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +1 -0
- package/web/assets/{cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js → cose-bilkent-RZA4XIPR-BHpK4Crp.js} +1 -1
- package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +1 -0
- package/web/assets/cynefinDiagram-TR7LZUCG-C3Iar9lZ.js +62 -0
- package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +4 -0
- package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +30 -0
- package/web/assets/diagram-JCD7PQ7C-DC5-9FRr.js +24 -0
- package/web/assets/{diagram-HNR7UZ2L-DVRltWbL.js → diagram-KFBZAVDW-Dfmf_4ti.js} +3 -3
- package/web/assets/diagram-L7DVE3PN-GIRyVUtt.js +41 -0
- package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +24 -0
- package/web/assets/ebnfDiagram-DRHRQJWO-D8_CI4ZF.js +1 -0
- package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +85 -0
- package/web/assets/error-D9MtuG9s.js +1 -0
- package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +1 -0
- package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +1 -0
- package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +292 -0
- package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +1 -0
- package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +106 -0
- package/web/assets/{index-D7mTFcvQ.js → index-2zdvEdzg.js} +51 -51
- package/web/assets/index-CJDpyH-n.css +2 -0
- package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +1 -0
- package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +2 -0
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js → ishikawaDiagram-4JDSWWDM-DmqWtjkl.js} +2 -2
- package/web/assets/{journeyDiagram-M6C3CM3L-C6wjooas.js → journeyDiagram-QUS3FAKT-XAzVzrQW.js} +3 -3
- package/web/assets/{kanban-definition-75IXJCU3-5_UVY79g.js → kanban-definition-D4L7SQKK-YurRnmYn.js} +6 -6
- package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +257 -0
- package/web/assets/{mindmap-definition-2TDM6QVE-8xDLzk2e.js → mindmap-definition-66QP5TD6-ChrWWnil.js} +5 -5
- package/web/assets/node.browser-U-KyT5AW.js +1 -0
- package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +1 -0
- package/web/assets/pegDiagram-YKIO5C6U-QGeQLEq2.js +1 -0
- package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +1 -0
- package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +39 -0
- package/web/assets/{quadrantDiagram-VICAPDV7-DR54jOeR.js → quadrantDiagram-VO5QLCXA-B7098wSc.js} +3 -3
- package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +1 -0
- package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +1 -0
- package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +1 -0
- package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +1 -0
- package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +1 -0
- package/web/assets/railroadDiagram-M77LTMSB-AXu4vxk_.js +1 -0
- package/web/assets/{requirementDiagram-JXO7QTGE-PEkg7sKC.js → requirementDiagram-RASO5HTO-B-l8InpK.js} +4 -4
- package/web/assets/{sankeyDiagram-URQDO5SZ-DDWEtjcs.js → sankeyDiagram-F32LOJ6L-Kd7zjJgX.js} +3 -3
- package/web/assets/{sequenceDiagram-VS2MUI6T-Bv-uwANx.js → sequenceDiagram-URATNSBD-BlcdY9DS.js} +7 -7
- package/web/assets/sizeCapture-5GORAGP4-BEqQzsxs.js +1 -0
- package/web/assets/src-C5sx_gMp.js +1 -0
- package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +1 -0
- package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +1 -0
- package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +2 -0
- package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +8 -0
- package/web/assets/{timeline-definition-O6YCAMPW-Qmsuo7qS.js → timeline-definition-WJXWRH4I-DUfp1R3E.js} +3 -3
- package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +1 -0
- package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +1 -0
- package/web/assets/vennDiagram-K3VCMQLI-Bj-FN-XS.js +34 -0
- package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +1 -0
- package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +78 -0
- package/web/assets/xychartDiagram-5VRUVLCW-CK_rbSWE.js +7 -0
- package/web/index.html +16 -15
- package/dist/core/ingestion/languages/python/index-stats.d.ts +0 -18
- package/dist/core/ingestion/languages/python/index-stats.js +0 -25
- package/web/assets/ProcessFlowModal-CwkpVkv-.js +0 -22
- package/web/assets/agent-Ds-lkZjX.js +0 -626
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +0 -36
- package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +0 -4
- package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +0 -1
- package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +0 -321
- package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +0 -159
- package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +0 -124
- package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +0 -10
- package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +0 -1
- package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +0 -1
- package/web/assets/chunk-J5EP6P6S-L19oz55R.js +0 -1
- package/web/assets/chunk-KGFNY3KK-BZeP-55u.js +0 -62
- package/web/assets/chunk-KGYTTC2M-zm6n242I.js +0 -1
- package/web/assets/chunk-KNLZD3CH-BGlP6X9R.js +0 -1
- package/web/assets/chunk-LRIF4GLE-n59lhprL.js +0 -1
- package/web/assets/chunk-RERM46MO-B5dAdWpP.js +0 -1
- package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +0 -1
- package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +0 -1
- package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +0 -1
- package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +0 -1
- package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +0 -1
- package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +0 -2
- package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +0 -1
- package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +0 -4
- package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +0 -43
- package/web/assets/diagram-GF46GFSD-B2atbzmU.js +0 -24
- package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +0 -10
- package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +0 -85
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +0 -1
- package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +0 -162
- package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +0 -292
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +0 -106
- package/web/assets/index-CX_fADmQ.css +0 -2
- package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +0 -1
- package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +0 -2
- package/web/assets/katex-K3KEBU37-qRQBy-EZ.js +0 -261
- package/web/assets/node-Ct_zna8U.js +0 -8
- package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +0 -1
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +0 -1
- package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +0 -30
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +0 -1
- package/web/assets/sdk-CzHHH8tD.js +0 -37
- package/web/assets/src-Cv1eWg0o.js +0 -1
- package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +0 -1
- package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +0 -1
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +0 -1
- package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +0 -34
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +0 -1
- package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +0 -78
- package/web/assets/xychartDiagram-N2JHSOCM-CoZ_Tits.js +0 -7
- /package/web/assets/{chunk-7W6UQGC5-pyKGssV3.js → chunk-LIEV3EAG-pyKGssV3.js} +0 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Last-resort property resolution by UNIQUE NAME (A1/A5).
|
|
3
|
+
*
|
|
4
|
+
* Idiomatic JS reads configuration off a plain object whose receiver cannot be
|
|
5
|
+
* typed — an options bag passed as a parameter, a destructured handle, an
|
|
6
|
+
* imported literal. The precise passes resolve none of those, so a field read
|
|
7
|
+
* and written across a live code path produced no `ACCESSES` edge at all and
|
|
8
|
+
* "who reads this setting?" answered a confident zero.
|
|
9
|
+
*
|
|
10
|
+
* This pass runs AFTER every precise pass and only sees what they left behind.
|
|
11
|
+
* For each still-unresolved read/write site it asks one question: does exactly
|
|
12
|
+
* ONE `Property` node in the graph carry this name? If so the read almost
|
|
13
|
+
* certainly means it, and an edge is emitted at REDUCED CONFIDENCE with a
|
|
14
|
+
* reason that names the inference. If two or more carry the name, nothing is
|
|
15
|
+
* emitted — a guess between them would be a coin flip, and a wrong edge in the
|
|
16
|
+
* pre-edit safety gate is worse than a missing one.
|
|
17
|
+
*
|
|
18
|
+
* Why uniqueness is the right gate: the names this recovers are the ones worth
|
|
19
|
+
* recovering. Distinctive domain fields (`exitMinAtrMult`, `bookNotionalUsdt`)
|
|
20
|
+
* are unique in a repo and resolve; generic keys (`id`, `name`, `data`) are not
|
|
21
|
+
* and are skipped, which is exactly where name matching would over-connect.
|
|
22
|
+
* That is the `fieldFallbackOnMethodLookup` trade this codebase already accepts
|
|
23
|
+
* for dynamic languages, bounded so it cannot fire on the ambiguous majority.
|
|
24
|
+
*
|
|
25
|
+
* Confidence is 0.5 — the same tier the 3-tier import resolver assigns its
|
|
26
|
+
* global fallback, because this is the same kind of claim: a name matched
|
|
27
|
+
* workspace-wide with no scope evidence behind it.
|
|
28
|
+
*
|
|
29
|
+
* ── R2: workspace uniqueness is too blunt on its own ────────────────────────
|
|
30
|
+
*
|
|
31
|
+
* Measured on the repo this pass was written for: `exitMinAtrMult` has 26
|
|
32
|
+
* `Property` definitions — 16 of them in one-off `scripts/`, 7 in the frontend,
|
|
33
|
+
* one in a test, and exactly ONE in the backend that actually reads it. Strict
|
|
34
|
+
* uniqueness declined every backend read because research scripts the backend
|
|
35
|
+
* has no relationship with each carry a same-named key. The gate was not
|
|
36
|
+
* wrong, it was scope-blind: it compared against the whole workspace when the
|
|
37
|
+
* reader can only plausibly mean something it can SEE.
|
|
38
|
+
*
|
|
39
|
+
* So a name with several definitions is now narrowed before being abandoned:
|
|
40
|
+
* Tier 1 — a definition in the READING FILE itself.
|
|
41
|
+
* Tier 2 — a definition in a file the reading file DIRECTLY IMPORTS.
|
|
42
|
+
* Exactly one survivor at the first non-empty tier resolves; anything else is
|
|
43
|
+
* still refused. Narrowing uses the finalized import graph, so it is real
|
|
44
|
+
* evidence rather than a path-shape heuristic, and it is language-neutral.
|
|
45
|
+
*
|
|
46
|
+
* A tier that finds SEVERAL candidates stops the walk instead of falling
|
|
47
|
+
* through to the next one. Two same-named keys in the reading file mean the
|
|
48
|
+
* read is genuinely ambiguous where the reader is standing; reaching past them
|
|
49
|
+
* to an imported file would answer a question the local evidence already
|
|
50
|
+
* contradicts.
|
|
51
|
+
*
|
|
52
|
+
* Confidence stays 0.5 for every tier. Narrowing improves which candidate is
|
|
53
|
+
* chosen, not the kind of claim being made — it is still a name match, and the
|
|
54
|
+
* round-1 contract is that a consumer filtering on confidence can drop all
|
|
55
|
+
* name inference without dropping scope-resolved edges. The reason string
|
|
56
|
+
* records which tier fired.
|
|
57
|
+
*
|
|
58
|
+
* WHY GRAPH NODES, NOT SCOPE DEFS: an object-literal key mints a `Property`
|
|
59
|
+
* NODE (parse query) but no scope-resolution DEF, so `scope.bindings` and
|
|
60
|
+
* `localDefs` are both empty for exactly the population this pass exists to
|
|
61
|
+
* serve. Indexing the graph is therefore not a shortcut — it is the only place
|
|
62
|
+
* these symbols exist. It also means the pass emits straight to the graph
|
|
63
|
+
* rather than through `tryEmitEdge`, whose target side takes a def.
|
|
64
|
+
*/
|
|
65
|
+
import type { ImportEdge, ParsedFile, ScopeId } from '../../../../_shared/index.js';
|
|
66
|
+
import type { KnowledgeGraph } from '../../../graph/types.js';
|
|
67
|
+
import type { ScopeResolutionIndexes } from '../../model/scope-resolution-indexes.js';
|
|
68
|
+
import type { GraphNodeLookup } from '../graph-bridge/node-lookup.js';
|
|
69
|
+
interface PropertyCandidate {
|
|
70
|
+
readonly id: string;
|
|
71
|
+
readonly filePath: string;
|
|
72
|
+
/**
|
|
73
|
+
* True when this definition is the RETURN SHAPE of a function (R3-4) rather
|
|
74
|
+
* than a declared surface — a named object literal, a class field, an
|
|
75
|
+
* interface or alias member.
|
|
76
|
+
*
|
|
77
|
+
* Return shapes are the weaker anchor and are ranked below declared ones, so
|
|
78
|
+
* adding them cannot change an answer that already resolved. That is what
|
|
79
|
+
* reconciles this with R2-1b, which deliberately modelled returned keys as
|
|
80
|
+
* WRITES to avoid adding same-named competitors to narrowing: they are
|
|
81
|
+
* definitions now, but they never outrank a real declaration, so the
|
|
82
|
+
* competitor problem it was avoiding does not come back.
|
|
83
|
+
*/
|
|
84
|
+
readonly fromReturnShape: boolean;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The only part of the finalized scope model this pass reads. Narrowed to a
|
|
88
|
+
* structural type so the pass does not depend on the full finalize result.
|
|
89
|
+
*/
|
|
90
|
+
interface FinalizedImportView {
|
|
91
|
+
readonly imports: ReadonlyMap<ScopeId, readonly ImportEdge[]>;
|
|
92
|
+
}
|
|
93
|
+
export interface UniqueNamePropertyStats {
|
|
94
|
+
/** Edges emitted from a name match at any tier. */
|
|
95
|
+
readonly emitted: number;
|
|
96
|
+
/**
|
|
97
|
+
* Sites skipped because the name could not be narrowed to one definition,
|
|
98
|
+
* so a match would have been a coin flip. Reported rather than silently
|
|
99
|
+
* dropped: this is the population a receiver-typing improvement would
|
|
100
|
+
* convert into precise edges.
|
|
101
|
+
*/
|
|
102
|
+
readonly ambiguous: number;
|
|
103
|
+
/**
|
|
104
|
+
* Of {@link emitted}, how many needed scope narrowing — the name carried
|
|
105
|
+
* several definitions and same-file or direct-import evidence picked one.
|
|
106
|
+
* Strict workspace uniqueness would have refused every one of these.
|
|
107
|
+
*/
|
|
108
|
+
readonly narrowed: number;
|
|
109
|
+
/**
|
|
110
|
+
* The distinct names behind {@link ambiguous}, capped. A bare count says a
|
|
111
|
+
* gap exists; the names say WHICH fields are unanswerable, which is the
|
|
112
|
+
* difference between a metric and something a reader can act on.
|
|
113
|
+
*/
|
|
114
|
+
readonly ambiguousNames: readonly string[];
|
|
115
|
+
/**
|
|
116
|
+
* Read/write sites whose name IS defined in the workspace, but only in
|
|
117
|
+
* ANOTHER language — so per-language inference correctly declined, and the
|
|
118
|
+
* caller got an empty result byte-identical to "this field is unused".
|
|
119
|
+
*
|
|
120
|
+
* Keeping this separate from {@link ambiguous} matters: ambiguity means the
|
|
121
|
+
* analyzer saw several candidates and refused to choose, while this means it
|
|
122
|
+
* saw candidates it was not allowed to consider. The remedies differ — one
|
|
123
|
+
* wants better receiver typing, the other wants an anchor in this language
|
|
124
|
+
* (or a text search) — so collapsing them would tell a reader the wrong thing
|
|
125
|
+
* to do.
|
|
126
|
+
*/
|
|
127
|
+
readonly crossLanguageOnly: number;
|
|
128
|
+
/**
|
|
129
|
+
* The distinct names behind {@link crossLanguageOnly}, capped, each with the
|
|
130
|
+
* languages its definitions actually live in. That is the actionable half:
|
|
131
|
+
* "wickRatio is defined only in TypeScript" tells a reader why their
|
|
132
|
+
* JavaScript query came back empty and what to do about it.
|
|
133
|
+
*/
|
|
134
|
+
readonly crossLanguageOnlyNames: readonly {
|
|
135
|
+
readonly name: string;
|
|
136
|
+
readonly languages: string[];
|
|
137
|
+
}[];
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Every `Property` node in the graph, grouped by name.
|
|
141
|
+
*
|
|
142
|
+
* WHOLE-GRAPH AND LANGUAGE-AGNOSTIC, so it is built ONCE by the caller and
|
|
143
|
+
* shared across every language pass — the same treatment `sharedNodeLookup` and
|
|
144
|
+
* `sharedFnNodeIndex` already get in `phase.ts`, and for the same reason: a
|
|
145
|
+
* per-language rebuild scans every node in the repo N times, and on a large
|
|
146
|
+
* repo a small language's full copy overlaps the next language's.
|
|
147
|
+
*
|
|
148
|
+
* Deliberately NOT capped here. The cap belongs after the language filter (see
|
|
149
|
+
* {@link candidatesForLanguage}) — a name carried by forty properties across a
|
|
150
|
+
* polyglot monorepo but only two in the language being resolved is answerable,
|
|
151
|
+
* and capping globally would refuse it. One entry per Property node is the same
|
|
152
|
+
* order as the node-lookup map built beside it.
|
|
153
|
+
*/
|
|
154
|
+
export type PropertyNameIndex = ReadonlyMap<string, readonly PropertyCandidate[]>;
|
|
155
|
+
export declare function buildPropertyNameIndex(graph: KnowledgeGraph): PropertyNameIndex;
|
|
156
|
+
export declare function emitUniqueNamePropertyAccesses(graph: KnowledgeGraph, indexes: ScopeResolutionIndexes, parsedFiles: readonly ParsedFile[], nodeLookup: GraphNodeLookup,
|
|
157
|
+
/** Sites a precise pass already owns — never second-guessed here. */
|
|
158
|
+
skipSites: ReadonlySet<string>,
|
|
159
|
+
/** Finalized import graph; narrows a name carried by several definitions. */
|
|
160
|
+
finalized?: FinalizedImportView,
|
|
161
|
+
/**
|
|
162
|
+
* Whole-graph `Property`-by-name index built ONCE by the caller and shared
|
|
163
|
+
* across every language pass. It is a full node scan and language-agnostic,
|
|
164
|
+
* so rebuilding it per language repeats that scan N times — the pattern
|
|
165
|
+
* `phase.ts` already hoisted out for `sharedNodeLookup`. Built locally when
|
|
166
|
+
* omitted (tests / isolated calls).
|
|
167
|
+
*/
|
|
168
|
+
prebuiltPropertyNameIndex?: PropertyNameIndex,
|
|
169
|
+
/**
|
|
170
|
+
* DETECT WITHOUT EMITTING. A language that sets
|
|
171
|
+
* `fieldFallbackOnMethodLookup: false` (TypeScript) opts out of name
|
|
172
|
+
* inference because a real type system should answer precisely — that opt-out
|
|
173
|
+
* is right and stays. But skipping the pass wholesale also skipped its
|
|
174
|
+
* REPORTING, so a TypeScript read whose only anchor is JavaScript got the
|
|
175
|
+
* same silent empty answer R3-1 exists to remove, just in the other
|
|
176
|
+
* direction. Detection is not inference: counting what could not be linked
|
|
177
|
+
* asserts nothing about what it means.
|
|
178
|
+
*/
|
|
179
|
+
reportOnly?: boolean): UniqueNamePropertyStats;
|
|
180
|
+
export {};
|
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Last-resort property resolution by UNIQUE NAME (A1/A5).
|
|
3
|
+
*
|
|
4
|
+
* Idiomatic JS reads configuration off a plain object whose receiver cannot be
|
|
5
|
+
* typed — an options bag passed as a parameter, a destructured handle, an
|
|
6
|
+
* imported literal. The precise passes resolve none of those, so a field read
|
|
7
|
+
* and written across a live code path produced no `ACCESSES` edge at all and
|
|
8
|
+
* "who reads this setting?" answered a confident zero.
|
|
9
|
+
*
|
|
10
|
+
* This pass runs AFTER every precise pass and only sees what they left behind.
|
|
11
|
+
* For each still-unresolved read/write site it asks one question: does exactly
|
|
12
|
+
* ONE `Property` node in the graph carry this name? If so the read almost
|
|
13
|
+
* certainly means it, and an edge is emitted at REDUCED CONFIDENCE with a
|
|
14
|
+
* reason that names the inference. If two or more carry the name, nothing is
|
|
15
|
+
* emitted — a guess between them would be a coin flip, and a wrong edge in the
|
|
16
|
+
* pre-edit safety gate is worse than a missing one.
|
|
17
|
+
*
|
|
18
|
+
* Why uniqueness is the right gate: the names this recovers are the ones worth
|
|
19
|
+
* recovering. Distinctive domain fields (`exitMinAtrMult`, `bookNotionalUsdt`)
|
|
20
|
+
* are unique in a repo and resolve; generic keys (`id`, `name`, `data`) are not
|
|
21
|
+
* and are skipped, which is exactly where name matching would over-connect.
|
|
22
|
+
* That is the `fieldFallbackOnMethodLookup` trade this codebase already accepts
|
|
23
|
+
* for dynamic languages, bounded so it cannot fire on the ambiguous majority.
|
|
24
|
+
*
|
|
25
|
+
* Confidence is 0.5 — the same tier the 3-tier import resolver assigns its
|
|
26
|
+
* global fallback, because this is the same kind of claim: a name matched
|
|
27
|
+
* workspace-wide with no scope evidence behind it.
|
|
28
|
+
*
|
|
29
|
+
* ── R2: workspace uniqueness is too blunt on its own ────────────────────────
|
|
30
|
+
*
|
|
31
|
+
* Measured on the repo this pass was written for: `exitMinAtrMult` has 26
|
|
32
|
+
* `Property` definitions — 16 of them in one-off `scripts/`, 7 in the frontend,
|
|
33
|
+
* one in a test, and exactly ONE in the backend that actually reads it. Strict
|
|
34
|
+
* uniqueness declined every backend read because research scripts the backend
|
|
35
|
+
* has no relationship with each carry a same-named key. The gate was not
|
|
36
|
+
* wrong, it was scope-blind: it compared against the whole workspace when the
|
|
37
|
+
* reader can only plausibly mean something it can SEE.
|
|
38
|
+
*
|
|
39
|
+
* So a name with several definitions is now narrowed before being abandoned:
|
|
40
|
+
* Tier 1 — a definition in the READING FILE itself.
|
|
41
|
+
* Tier 2 — a definition in a file the reading file DIRECTLY IMPORTS.
|
|
42
|
+
* Exactly one survivor at the first non-empty tier resolves; anything else is
|
|
43
|
+
* still refused. Narrowing uses the finalized import graph, so it is real
|
|
44
|
+
* evidence rather than a path-shape heuristic, and it is language-neutral.
|
|
45
|
+
*
|
|
46
|
+
* A tier that finds SEVERAL candidates stops the walk instead of falling
|
|
47
|
+
* through to the next one. Two same-named keys in the reading file mean the
|
|
48
|
+
* read is genuinely ambiguous where the reader is standing; reaching past them
|
|
49
|
+
* to an imported file would answer a question the local evidence already
|
|
50
|
+
* contradicts.
|
|
51
|
+
*
|
|
52
|
+
* Confidence stays 0.5 for every tier. Narrowing improves which candidate is
|
|
53
|
+
* chosen, not the kind of claim being made — it is still a name match, and the
|
|
54
|
+
* round-1 contract is that a consumer filtering on confidence can drop all
|
|
55
|
+
* name inference without dropping scope-resolved edges. The reason string
|
|
56
|
+
* records which tier fired.
|
|
57
|
+
*
|
|
58
|
+
* WHY GRAPH NODES, NOT SCOPE DEFS: an object-literal key mints a `Property`
|
|
59
|
+
* NODE (parse query) but no scope-resolution DEF, so `scope.bindings` and
|
|
60
|
+
* `localDefs` are both empty for exactly the population this pass exists to
|
|
61
|
+
* serve. Indexing the graph is therefore not a shortcut — it is the only place
|
|
62
|
+
* these symbols exist. It also means the pass emits straight to the graph
|
|
63
|
+
* rather than through `tryEmitEdge`, whose target side takes a def.
|
|
64
|
+
*/
|
|
65
|
+
import { resolveCallerGraphId } from '../graph-bridge/ids.js';
|
|
66
|
+
import { callableFlowSiteKey } from './callable-value-flow.js';
|
|
67
|
+
import { isTestFile } from '../../entry-point-scoring.js';
|
|
68
|
+
import { getLanguageFromFilename } from '../../../../_shared/index.js';
|
|
69
|
+
/** Language a definition lives in, for reporting which anchor a reader cannot reach. */
|
|
70
|
+
function languageOf(filePath) {
|
|
71
|
+
return getLanguageFromFilename(filePath) ?? 'unknown';
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Confidence for a workspace-unique name match. Deliberately the global tier's
|
|
75
|
+
* 0.5 and not the 0.85 default: a consumer filtering on confidence must be able
|
|
76
|
+
* to drop these without dropping scope-resolved edges.
|
|
77
|
+
*/
|
|
78
|
+
const UNIQUE_NAME_CONFIDENCE = 0.5;
|
|
79
|
+
const EDGE_REASON = 'scope-resolution: unique-name property';
|
|
80
|
+
/**
|
|
81
|
+
* Most candidates any one name will keep for narrowing. A name carried by more
|
|
82
|
+
* definitions than this is a generic key (`id`, `type`, `value`) that no tier
|
|
83
|
+
* is going to disambiguate, so the candidate list is dropped and the name is
|
|
84
|
+
* treated as ambiguous outright. This is what keeps the index from
|
|
85
|
+
* materializing a long array per generic key in a large repo — the concern
|
|
86
|
+
* that made the original implementation store a sentinel instead of a list.
|
|
87
|
+
*/
|
|
88
|
+
const MAX_TRACKED_CANDIDATES = 32;
|
|
89
|
+
/** Sentinel for "too many nodes carry this name to narrow" — never resolved. */
|
|
90
|
+
const OVERSATURATED = null;
|
|
91
|
+
/** Most distinct names reported back; enough to act on, bounded for logs. */
|
|
92
|
+
const MAX_REPORTED_AMBIGUOUS_NAMES = 25;
|
|
93
|
+
export function buildPropertyNameIndex(graph) {
|
|
94
|
+
const byName = new Map();
|
|
95
|
+
for (const node of graph.iterNodes()) {
|
|
96
|
+
if (node.label !== 'Property')
|
|
97
|
+
continue;
|
|
98
|
+
const name = node.properties.name;
|
|
99
|
+
if (typeof name !== 'string' || name.length === 0)
|
|
100
|
+
continue;
|
|
101
|
+
const filePath = node.properties.filePath;
|
|
102
|
+
if (typeof filePath !== 'string')
|
|
103
|
+
continue;
|
|
104
|
+
const candidate = {
|
|
105
|
+
id: node.id,
|
|
106
|
+
filePath,
|
|
107
|
+
fromReturnShape: node.properties.fromReturnShape === true,
|
|
108
|
+
};
|
|
109
|
+
const existing = byName.get(name);
|
|
110
|
+
if (existing === undefined) {
|
|
111
|
+
byName.set(name, [candidate]);
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (existing.some((c) => c.id === node.id))
|
|
115
|
+
continue;
|
|
116
|
+
existing.push(candidate);
|
|
117
|
+
}
|
|
118
|
+
return byName;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* The candidates a read in THIS language may consider, or {@link OVERSATURATED}
|
|
122
|
+
* when there are too many to disambiguate.
|
|
123
|
+
*
|
|
124
|
+
* SAME LANGUAGE ONLY. The graph is shared across every language in the repo, and
|
|
125
|
+
* `fieldFallbackOnMethodLookup` only decides whether this pass RUNS for a
|
|
126
|
+
* language — it never restricted which nodes could be TARGETS. So a Java backend
|
|
127
|
+
* declaring `private int loyaltyPoints` was the unique carrier of that name, and
|
|
128
|
+
* a JS frontend writing `cfg.loyaltyPoints` on an untyped parameter got an edge
|
|
129
|
+
* to it: no owner, file, or language evidence, and inference across a language
|
|
130
|
+
* boundary that has no call path at all. The confidence tier does not save it,
|
|
131
|
+
* since `minConfidence` defaults to 0.
|
|
132
|
+
*
|
|
133
|
+
* `parsedFiles` is exactly this language's file set, so matching on it is a
|
|
134
|
+
* precise restriction rather than a heuristic — no node property needed.
|
|
135
|
+
*
|
|
136
|
+
* The cap is applied HERE, to the filtered set, so it means what it says: this
|
|
137
|
+
* many same-named keys IN THE LANGUAGE BEING RESOLVED is a generic name no tier
|
|
138
|
+
* can disambiguate.
|
|
139
|
+
*/
|
|
140
|
+
function candidatesForLanguage(all, ownFilePaths) {
|
|
141
|
+
const mine = [];
|
|
142
|
+
for (const candidate of all) {
|
|
143
|
+
if (!ownFilePaths.has(candidate.filePath))
|
|
144
|
+
continue;
|
|
145
|
+
if (mine.length >= MAX_TRACKED_CANDIDATES)
|
|
146
|
+
return OVERSATURATED;
|
|
147
|
+
mine.push(candidate);
|
|
148
|
+
}
|
|
149
|
+
// Three outcomes, and they are not interchangeable: `undefined` means no
|
|
150
|
+
// property of this name exists in this language (nothing to say HERE, though
|
|
151
|
+
// see `crossLanguageAnchors` for why the CALLER still needs to know), `null`
|
|
152
|
+
// means too many to choose between (reportable), and a list means proceed to
|
|
153
|
+
// narrowing.
|
|
154
|
+
return mine.length === 0 ? undefined : mine;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Files each file directly imports, from the FINALIZED import graph.
|
|
158
|
+
*
|
|
159
|
+
* Built from `finalized.imports` rather than the raw per-scope edges because
|
|
160
|
+
* only the finalized form has `targetFile` linked — pre-finalize the field is
|
|
161
|
+
* still null for anything the resolver had to look up, which would silently
|
|
162
|
+
* narrow every read to nothing.
|
|
163
|
+
*/
|
|
164
|
+
function buildDirectImportMap(indexes, finalized) {
|
|
165
|
+
// Resolve each importing scope to its file by POINT LOOKUP on the scope tree,
|
|
166
|
+
// not by walking `parsed.scopes`.
|
|
167
|
+
//
|
|
168
|
+
// The out-of-core seal replaces `emitParsedFiles` with a scope-STRIPPED copy —
|
|
169
|
+
// `scopes: []` for every file — and that is the documented contract: after the
|
|
170
|
+
// seal, scopes are reachable only via `scopeTree.getScope`. Building the map
|
|
171
|
+
// from `parsed.scopes` therefore produced an EMPTY map under
|
|
172
|
+
// `GITNEXUS_DISK_SCOPE_INDEX=1`, every `directImports` lookup returned
|
|
173
|
+
// undefined, tier-2 narrowing died, and — worst of it — the loss was
|
|
174
|
+
// misreported as `ambiguous`: "several candidates, refused to choose" when the
|
|
175
|
+
// truth was "the evidence was discarded one function earlier". Same commit,
|
|
176
|
+
// same repo, two different graphs depending on an env var.
|
|
177
|
+
//
|
|
178
|
+
// This is the SECOND consumer of `parsed.scopes` on this branch to hit the
|
|
179
|
+
// seal. The first was hoisted above it; this one is converted to the point
|
|
180
|
+
// lookup instead, which is stronger — there is no ordering left to get wrong.
|
|
181
|
+
const byFile = new Map();
|
|
182
|
+
for (const [scopeId, edges] of finalized.imports) {
|
|
183
|
+
const fromFile = indexes.scopeTree.getScope(scopeId)?.filePath;
|
|
184
|
+
if (fromFile === undefined)
|
|
185
|
+
continue;
|
|
186
|
+
for (const edge of edges) {
|
|
187
|
+
if (edge.targetFile === null || edge.targetFile === fromFile)
|
|
188
|
+
continue;
|
|
189
|
+
let set = byFile.get(fromFile);
|
|
190
|
+
if (set === undefined) {
|
|
191
|
+
set = new Set();
|
|
192
|
+
byFile.set(fromFile, set);
|
|
193
|
+
}
|
|
194
|
+
set.add(edge.targetFile);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return byFile;
|
|
198
|
+
}
|
|
199
|
+
/** Is this Property id qualified by `<owner>.`, allowing a position suffix? */
|
|
200
|
+
function idOwnedBy(id, owner) {
|
|
201
|
+
const at = id.indexOf(`:${owner}.`);
|
|
202
|
+
if (at === -1)
|
|
203
|
+
return false;
|
|
204
|
+
const rest = id.slice(at + owner.length + 2);
|
|
205
|
+
return !rest.includes('.') || rest.indexOf('@') < rest.indexOf('.');
|
|
206
|
+
}
|
|
207
|
+
/** Trailing symbol name of a graph id (`Function:a/b.js:buildB` -> `buildB`). */
|
|
208
|
+
function simpleNameOfGraphId(graphId) {
|
|
209
|
+
const tail = graphId.slice(graphId.lastIndexOf(':') + 1);
|
|
210
|
+
const at = tail.indexOf('@');
|
|
211
|
+
return at === -1 ? tail : tail.slice(0, at);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Pick the single candidate a read in `readingFile` can plausibly mean.
|
|
215
|
+
*
|
|
216
|
+
* Tiers are tried in order and the FIRST non-empty one decides — including
|
|
217
|
+
* deciding to refuse. A tier holding several candidates returns null rather
|
|
218
|
+
* than falling through, because local evidence that is itself ambiguous is
|
|
219
|
+
* still evidence: reaching past two same-named keys in the reading file to an
|
|
220
|
+
* imported third would answer a question the reader's own file contradicts.
|
|
221
|
+
*/
|
|
222
|
+
function narrowToSingleCandidate(candidatesIn, readingFile, importedFiles,
|
|
223
|
+
/** Simple name of the callable the site sits in, when it could be resolved. */
|
|
224
|
+
ownerName) {
|
|
225
|
+
// DECLARED ANCHORS FIRST. A return shape is a real definition but a weaker
|
|
226
|
+
// one: it says "some function builds an object with this key", where a named
|
|
227
|
+
// literal or a class/interface member says "this IS the field". Whenever both
|
|
228
|
+
// exist, the declared one is what a reader means — and ranking it first is
|
|
229
|
+
// what guarantees R3-4 cannot change an answer that already resolved before
|
|
230
|
+
// return shapes were indexed at all.
|
|
231
|
+
let candidates = candidatesIn;
|
|
232
|
+
// A SITE INSIDE ITS OWN RETURN SHAPE BINDS TO ITS OWN KEY.
|
|
233
|
+
//
|
|
234
|
+
// `export function buildB(row) { return { tickIntervalMs: row.b } }` writes
|
|
235
|
+
// the key that IS `buildB.tickIntervalMs`. Ranking declared anchors above
|
|
236
|
+
// return shapes is right for a READ through a receiver, but applied here it
|
|
237
|
+
// handed that write to a same-named module const (`fnSettings.tickIntervalMs`)
|
|
238
|
+
// that `buildB` never touches — a wrong edge, reported at the confident tier,
|
|
239
|
+
// and the node the key actually defines was left with no writer at all.
|
|
240
|
+
//
|
|
241
|
+
// Checked before every other rule because it is evidence rather than ranking:
|
|
242
|
+
// the owner qualifier on the candidate id and the enclosing callable are the
|
|
243
|
+
// same symbol. Nothing else can outrank that.
|
|
244
|
+
if (ownerName !== undefined && ownerName.length > 0) {
|
|
245
|
+
const own = candidates.filter((c) => c.fromReturnShape && idOwnedBy(c.id, ownerName));
|
|
246
|
+
if (own.length === 1)
|
|
247
|
+
return { id: own[0].id, tier: 'own-return-shape' };
|
|
248
|
+
}
|
|
249
|
+
// PRODUCTION CODE FIRST. A test constructs throwaway shapes with the same
|
|
250
|
+
// field names as the thing it exercises — measured on the reporting repo,
|
|
251
|
+
// four of the seven JavaScript anchors for `wickRatio` are in `tests/` — and
|
|
252
|
+
// a read in production code cannot mean any of them. Applied before the
|
|
253
|
+
// declared/return-shape split because "is this the shipped program" is the
|
|
254
|
+
// stronger signal: a declaration in a test fixture is still a test fixture.
|
|
255
|
+
//
|
|
256
|
+
// Only when the READER is production. A read inside a test legitimately means
|
|
257
|
+
// the test's own shape, so this must not fire there.
|
|
258
|
+
if (!isTestFile(readingFile)) {
|
|
259
|
+
const production = candidates.filter((c) => !isTestFile(c.filePath));
|
|
260
|
+
if (production.length > 0)
|
|
261
|
+
candidates = production;
|
|
262
|
+
}
|
|
263
|
+
const declared = candidates.filter((c) => !c.fromReturnShape);
|
|
264
|
+
const ranked = declared.length > 0 ? declared : candidates;
|
|
265
|
+
if (ranked.length === 1) {
|
|
266
|
+
// TIER HONESTY. `workspace-unique` is a claim that exactly one node in the
|
|
267
|
+
// workspace carries this name — a fact about the graph. Reaching one
|
|
268
|
+
// survivor by FILTERING (tests out, return shapes down-ranked) is a
|
|
269
|
+
// different and weaker claim, and reporting it under the same label told a
|
|
270
|
+
// reader "unambiguous workspace-wide match" for an answer that was
|
|
271
|
+
// narrowed. The edge is the same; what it is allowed to say about itself is
|
|
272
|
+
// not. `narrowed` counts it correctly now too, since that keys off the tier.
|
|
273
|
+
const tier = candidatesIn.length === 1 ? 'workspace-unique' : 'ranked';
|
|
274
|
+
return { id: ranked[0].id, tier };
|
|
275
|
+
}
|
|
276
|
+
candidates = ranked;
|
|
277
|
+
const sameFile = candidates.filter((c) => c.filePath === readingFile);
|
|
278
|
+
if (sameFile.length > 0) {
|
|
279
|
+
return sameFile.length === 1 ? { id: sameFile[0].id, tier: 'same-file' } : null;
|
|
280
|
+
}
|
|
281
|
+
if (importedFiles === undefined)
|
|
282
|
+
return null;
|
|
283
|
+
const imported = candidates.filter((c) => importedFiles.has(c.filePath));
|
|
284
|
+
if (imported.length > 0) {
|
|
285
|
+
return imported.length === 1 ? { id: imported[0].id, tier: 'imported-file' } : null;
|
|
286
|
+
}
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
export function emitUniqueNamePropertyAccesses(graph, indexes, parsedFiles, nodeLookup,
|
|
290
|
+
/** Sites a precise pass already owns — never second-guessed here. */
|
|
291
|
+
skipSites,
|
|
292
|
+
/** Finalized import graph; narrows a name carried by several definitions. */
|
|
293
|
+
finalized,
|
|
294
|
+
/**
|
|
295
|
+
* Whole-graph `Property`-by-name index built ONCE by the caller and shared
|
|
296
|
+
* across every language pass. It is a full node scan and language-agnostic,
|
|
297
|
+
* so rebuilding it per language repeats that scan N times — the pattern
|
|
298
|
+
* `phase.ts` already hoisted out for `sharedNodeLookup`. Built locally when
|
|
299
|
+
* omitted (tests / isolated calls).
|
|
300
|
+
*/
|
|
301
|
+
prebuiltPropertyNameIndex,
|
|
302
|
+
/**
|
|
303
|
+
* DETECT WITHOUT EMITTING. A language that sets
|
|
304
|
+
* `fieldFallbackOnMethodLookup: false` (TypeScript) opts out of name
|
|
305
|
+
* inference because a real type system should answer precisely — that opt-out
|
|
306
|
+
* is right and stays. But skipping the pass wholesale also skipped its
|
|
307
|
+
* REPORTING, so a TypeScript read whose only anchor is JavaScript got the
|
|
308
|
+
* same silent empty answer R3-1 exists to remove, just in the other
|
|
309
|
+
* direction. Detection is not inference: counting what could not be linked
|
|
310
|
+
* asserts nothing about what it means.
|
|
311
|
+
*/
|
|
312
|
+
reportOnly = false) {
|
|
313
|
+
const byName = prebuiltPropertyNameIndex ?? buildPropertyNameIndex(graph);
|
|
314
|
+
const ownFilePaths = new Set(parsedFiles.map((p) => p.filePath));
|
|
315
|
+
if (byName.size === 0) {
|
|
316
|
+
return {
|
|
317
|
+
emitted: 0,
|
|
318
|
+
ambiguous: 0,
|
|
319
|
+
narrowed: 0,
|
|
320
|
+
ambiguousNames: [],
|
|
321
|
+
crossLanguageOnly: 0,
|
|
322
|
+
crossLanguageOnlyNames: [],
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
const directImports = finalized === undefined
|
|
326
|
+
? new Map()
|
|
327
|
+
: buildDirectImportMap(indexes, finalized);
|
|
328
|
+
let emitted = 0;
|
|
329
|
+
let ambiguous = 0;
|
|
330
|
+
let narrowed = 0;
|
|
331
|
+
let crossLanguageOnly = 0;
|
|
332
|
+
const ambiguousNames = new Set();
|
|
333
|
+
/** name -> the languages its definitions actually live in. */
|
|
334
|
+
const crossLanguageAnchors = new Map();
|
|
335
|
+
const seen = new Set();
|
|
336
|
+
for (const parsed of parsedFiles) {
|
|
337
|
+
for (const site of parsed.referenceSites) {
|
|
338
|
+
if (site.kind !== 'read' && site.kind !== 'write')
|
|
339
|
+
continue;
|
|
340
|
+
// A bare identifier is not a property access — without a receiver there
|
|
341
|
+
// is no object whose member this could be, and matching one by name
|
|
342
|
+
// would link a local variable to an unrelated object's key.
|
|
343
|
+
if (site.explicitReceiver === undefined)
|
|
344
|
+
continue;
|
|
345
|
+
const siteKey = callableFlowSiteKey(parsed.filePath, site.atRange);
|
|
346
|
+
if (skipSites.has(siteKey))
|
|
347
|
+
continue;
|
|
348
|
+
const allWithName = byName.get(site.name);
|
|
349
|
+
if (allWithName === undefined)
|
|
350
|
+
continue;
|
|
351
|
+
const candidates = candidatesForLanguage(allWithName, ownFilePaths);
|
|
352
|
+
if (candidates === undefined) {
|
|
353
|
+
// The name IS defined in this workspace, just not in a language this
|
|
354
|
+
// pass may infer across — so declining is correct, and staying silent
|
|
355
|
+
// about it is not. An empty answer here is byte-identical to "this
|
|
356
|
+
// field is unused", which is the confident-empty failure this whole
|
|
357
|
+
// series exists to remove; the only difference is that the missing
|
|
358
|
+
// fact is now about the ANALYZER's reach rather than the code's.
|
|
359
|
+
crossLanguageOnly++;
|
|
360
|
+
if (!crossLanguageAnchors.has(site.name)) {
|
|
361
|
+
crossLanguageAnchors.set(site.name, new Set(allWithName.map((c) => languageOf(c.filePath))));
|
|
362
|
+
}
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
if (candidates === OVERSATURATED) {
|
|
366
|
+
ambiguous++;
|
|
367
|
+
ambiguousNames.add(site.name);
|
|
368
|
+
continue;
|
|
369
|
+
}
|
|
370
|
+
// Resolved BEFORE narrowing: the enclosing callable is evidence the
|
|
371
|
+
// ranking needs, not just the edge's source.
|
|
372
|
+
const callerGraphId = resolveCallerGraphId(site.inScope, indexes, nodeLookup, site.atRange);
|
|
373
|
+
if (callerGraphId === undefined)
|
|
374
|
+
continue;
|
|
375
|
+
const choice = narrowToSingleCandidate(candidates, parsed.filePath, directImports.get(parsed.filePath), simpleNameOfGraphId(callerGraphId));
|
|
376
|
+
if (choice === null) {
|
|
377
|
+
ambiguous++;
|
|
378
|
+
ambiguousNames.add(site.name);
|
|
379
|
+
continue;
|
|
380
|
+
}
|
|
381
|
+
const targetId = choice.id;
|
|
382
|
+
if (choice.tier !== 'workspace-unique')
|
|
383
|
+
narrowed++;
|
|
384
|
+
// A property reading itself is not a fact about anything.
|
|
385
|
+
if (callerGraphId === targetId)
|
|
386
|
+
continue;
|
|
387
|
+
const dedupKey = `ACCESSES:${callerGraphId}->${targetId}:${site.atRange.startLine}:${site.atRange.startCol}`;
|
|
388
|
+
if (seen.has(dedupKey))
|
|
389
|
+
continue;
|
|
390
|
+
seen.add(dedupKey);
|
|
391
|
+
if (reportOnly)
|
|
392
|
+
continue;
|
|
393
|
+
// `addRelationship` is first-write-wins, so a precise edge already
|
|
394
|
+
// emitted for this exact id keeps ownership over the inference.
|
|
395
|
+
graph.addRelationship({
|
|
396
|
+
id: `rel:${dedupKey}`,
|
|
397
|
+
sourceId: callerGraphId,
|
|
398
|
+
targetId,
|
|
399
|
+
type: 'ACCESSES',
|
|
400
|
+
confidence: UNIQUE_NAME_CONFIDENCE,
|
|
401
|
+
reason: `${EDGE_REASON} (${choice.tier}): ${site.kind}`,
|
|
402
|
+
evidence: [],
|
|
403
|
+
});
|
|
404
|
+
emitted++;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
return {
|
|
408
|
+
emitted,
|
|
409
|
+
ambiguous,
|
|
410
|
+
narrowed,
|
|
411
|
+
ambiguousNames: Array.from(ambiguousNames).sort().slice(0, MAX_REPORTED_AMBIGUOUS_NAMES),
|
|
412
|
+
crossLanguageOnly,
|
|
413
|
+
crossLanguageOnlyNames: Array.from(crossLanguageAnchors)
|
|
414
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
|
|
415
|
+
.slice(0, MAX_REPORTED_AMBIGUOUS_NAMES)
|
|
416
|
+
.map(([name, languages]) => ({ name, languages: Array.from(languages).sort() })),
|
|
417
|
+
};
|
|
418
|
+
}
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
import type { PipelinePhase } from '../../pipeline-phases/types.js';
|
|
27
27
|
import { SupportedLanguages } from '../../../../_shared/index.js';
|
|
28
28
|
import type { ResolutionOutcome } from '../resolution-outcome.js';
|
|
29
|
+
import type { UndecidedSatisfaction } from '../contract/scope-resolver.js';
|
|
29
30
|
import type { FunctionSummary } from '../../taint/summary-model.js';
|
|
30
31
|
import type { CallSummary } from '../../taint/call-summary-model.js';
|
|
31
32
|
import { type PdgEmitManifest } from '../../../lbug/pdg-emit-sink.js';
|
|
@@ -41,6 +42,34 @@ export interface ScopeResolutionOutput {
|
|
|
41
42
|
readonly referenceEdgesEmitted: number;
|
|
42
43
|
/** Additive stream of resolver diagnostics; does not affect graph edges. */
|
|
43
44
|
readonly resolutionOutcomes: readonly ResolutionOutcome[];
|
|
45
|
+
/**
|
|
46
|
+
* Interfaces whose structural-satisfaction check could not be completed
|
|
47
|
+
* (#2873). Emits no edges — it is what lets a query distinguish "nothing
|
|
48
|
+
* implements this" from "we could not tell what implements this".
|
|
49
|
+
*
|
|
50
|
+
* Absent when no language ran; `[]` when one ran and decided everything.
|
|
51
|
+
*/
|
|
52
|
+
readonly undecidedSatisfaction?: readonly UndecidedSatisfaction[];
|
|
53
|
+
/**
|
|
54
|
+
* Property inference facts a CALLER needs in order to read an empty result
|
|
55
|
+
* correctly (R3-1). Without these, "no ACCESSES for this field" is
|
|
56
|
+
* byte-identical whether the field is unused, ambiguous, or anchored in a
|
|
57
|
+
* language this pass may not infer across — three different situations with
|
|
58
|
+
* three different remedies.
|
|
59
|
+
*/
|
|
60
|
+
readonly propertyInference: {
|
|
61
|
+
/** Sites declined because the name could not be narrowed to one definition. */
|
|
62
|
+
readonly ambiguous: number;
|
|
63
|
+
/** Those field names, capped. */
|
|
64
|
+
readonly ambiguousNames: readonly string[];
|
|
65
|
+
/** Sites declined because every definition of the name is another language. */
|
|
66
|
+
readonly crossLanguage: number;
|
|
67
|
+
/** Those field names with the languages their definitions live in, capped. */
|
|
68
|
+
readonly crossLanguageNames: readonly {
|
|
69
|
+
readonly name: string;
|
|
70
|
+
readonly languages: string[];
|
|
71
|
+
}[];
|
|
72
|
+
};
|
|
44
73
|
/** Per-language breakdown for telemetry. */
|
|
45
74
|
readonly perLanguage: ReadonlyMap<SupportedLanguages, {
|
|
46
75
|
readonly filesProcessed: number;
|