gitnexus 1.6.10-rc.21 → 1.6.10-rc.211
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 +212 -22
- package/dist/_shared/graph/types.d.ts +27 -8
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/index.d.ts +4 -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 +19 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.js +23 -10
- 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/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/evidence-weights.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +6 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js +316 -37
- package/dist/_shared/scope-resolution/finalize-algorithm.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 +124 -1
- 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 +297 -5
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +10 -2
- package/dist/cli/ai-context.js +128 -61
- 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 +25 -114
- package/dist/cli/analyze.js +194 -36
- package/dist/cli/cli-message.d.ts +1 -1
- package/dist/cli/detect-changes-format.js +19 -2
- package/dist/cli/doctor.d.ts +23 -0
- package/dist/cli/doctor.js +72 -9
- package/dist/cli/editor-targets.js +6 -0
- package/dist/cli/eval-server.d.ts +23 -1
- package/dist/cli/eval-server.js +128 -9
- 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 +23 -2
- package/dist/cli/help-i18n.js +3 -0
- package/dist/cli/i18n/en.d.ts +17 -8
- package/dist/cli/i18n/en.js +19 -8
- package/dist/cli/i18n/resources.d.ts +26 -8
- package/dist/cli/i18n/zh-CN.d.ts +9 -0
- package/dist/cli/i18n/zh-CN.js +17 -8
- package/dist/cli/index.js +16 -9
- 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/resolve-invocation.d.ts +7 -3
- package/dist/cli/resolve-invocation.js +7 -3
- package/dist/cli/setup.d.ts +8 -0
- package/dist/cli/setup.js +30 -7
- package/dist/cli/skill-gen.d.ts +1 -6
- package/dist/cli/skill-gen.js +88 -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.d.ts +1 -0
- package/dist/cli/tool.js +75 -7
- package/dist/cli/uninstall.js +7 -2
- package/dist/cli/wiki.d.ts +1 -0
- package/dist/cli/wiki.js +59 -10
- package/dist/config/ignore-service.d.ts +2 -0
- package/dist/config/ignore-service.js +31 -4
- package/dist/core/analysis-features.d.ts +21 -0
- package/dist/core/analysis-features.js +59 -0
- package/dist/core/analyzer-identity.d.ts +154 -0
- package/dist/core/analyzer-identity.js +2158 -0
- package/dist/core/augmentation/engine.js +95 -76
- 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/embedder.d.ts +3 -2
- package/dist/core/embeddings/embedder.js +8 -5
- 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 +24 -1
- package/dist/core/embeddings/embedding-pipeline.js +341 -19
- package/dist/core/embeddings/http-client.d.ts +10 -2
- package/dist/core/embeddings/http-client.js +282 -47
- package/dist/core/embeddings/node-module-compat.d.ts +4 -2
- package/dist/core/embeddings/node-module-compat.js +4 -2
- package/dist/core/embeddings/onnxruntime-common-resolver.js +5 -5
- package/dist/core/embeddings/onnxruntime-node-resolver.js +2 -2
- package/dist/core/embeddings/runtime-install.js +1 -1
- package/dist/core/git-staleness.js +1 -1
- 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.js +5 -27
- package/dist/core/group/cross-impact.d.ts +21 -0
- package/dist/core/group/cross-impact.js +128 -15
- package/dist/core/group/cross-trace.js +27 -16
- package/dist/core/group/extractors/http-patterns/java.js +91 -14
- package/dist/core/group/extractors/http-patterns/node.js +19 -0
- 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/service.js +10 -1
- package/dist/core/group/storage.js +2 -33
- package/dist/core/group/types.d.ts +18 -0
- 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 +80 -0
- package/dist/core/index-freshness.js +120 -0
- 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/class-extractors/configs/jvm.js +29 -0
- package/dist/core/ingestion/cluster-enricher.js +8 -4
- package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
- package/dist/core/ingestion/community-processor.d.ts +21 -3
- package/dist/core/ingestion/community-processor.js +88 -83
- package/dist/core/ingestion/di-extractors/index.d.ts +22 -34
- package/dist/core/ingestion/di-extractors/index.js +17 -18
- package/dist/core/ingestion/di-extractors/spring.d.ts +27 -5
- package/dist/core/ingestion/di-extractors/spring.js +87 -3
- 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/emit-references.js +4 -0
- package/dist/core/ingestion/filesystem-walker.js +16 -12
- package/dist/core/ingestion/finalize-orchestrator.js +1 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +9 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +41 -0
- 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-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 +27 -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/config-bindings.d.ts +24 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.js +115 -0
- package/dist/core/ingestion/frameworks/spring/di-metadata.d.ts +48 -0
- package/dist/core/ingestion/frameworks/spring/di-metadata.js +379 -0
- 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 +428 -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 +27 -8
- 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 +20 -1
- package/dist/core/ingestion/language-config.js +18 -23
- package/dist/core/ingestion/language-provider.d.ts +133 -7
- package/dist/core/ingestion/languages/c/captures.js +63 -0
- package/dist/core/ingestion/languages/c/import-target.js +12 -16
- package/dist/core/ingestion/languages/c/query.js +17 -0
- package/dist/core/ingestion/languages/c/scope-resolver.js +26 -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/captures.js +93 -0
- package/dist/core/ingestion/languages/cobol/scope-resolver.js +34 -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 +222 -3
- 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 +62 -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 +44 -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 +686 -16
- 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/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 +8 -1
- package/dist/core/ingestion/languages/go/captures.js +142 -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 +7 -0
- package/dist/core/ingestion/languages/java/analysis-features.js +25 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +38 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +124 -0
- package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
- package/dist/core/ingestion/languages/java/captures.js +321 -49
- 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/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 +39 -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 +35 -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-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-conditionals.d.ts +11 -0
- package/dist/core/ingestion/languages/java/spring-conditionals.js +48 -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/spring-di.d.ts +20 -0
- package/dist/core/ingestion/languages/java/spring-di.js +160 -0
- 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 +76 -3
- package/dist/core/ingestion/languages/javascript/captures.d.ts +6 -1
- package/dist/core/ingestion/languages/javascript/captures.js +278 -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 +232 -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-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 +197 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +40 -3
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +111 -8
- package/dist/core/ingestion/languages/kotlin/captures.js +112 -0
- 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/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 +47 -2
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +36 -3
- 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-bean-metadata.d.ts +2 -0
- package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.js +8 -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 +20 -0
- package/dist/core/ingestion/languages/kotlin/spring-di.js +299 -0
- 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/kotlin.js +5 -6
- package/dist/core/ingestion/languages/php/captures.d.ts +5 -0
- package/dist/core/ingestion/languages/php/captures.js +359 -51
- 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 +229 -7
- package/dist/core/ingestion/languages/php/interpret.js +10 -0
- package/dist/core/ingestion/languages/php/query.js +31 -0
- package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
- 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.d.ts +3 -4
- package/dist/core/ingestion/languages/python/captures.js +53 -5
- 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 -3
- package/dist/core/ingestion/languages/python/query.js +9 -0
- package/dist/core/ingestion/languages/python/receiver-binding.d.ts +17 -2
- package/dist/core/ingestion/languages/python/receiver-binding.js +192 -2
- package/dist/core/ingestion/languages/python/scope-resolver.js +27 -4
- package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
- package/dist/core/ingestion/languages/python/simple-hooks.js +9 -5
- package/dist/core/ingestion/languages/ruby/captures.js +200 -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 +52 -1
- package/dist/core/ingestion/languages/rust/interpret.js +18 -0
- 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 +48 -6
- package/dist/core/ingestion/languages/rust/range-binding.d.ts +1 -11
- package/dist/core/ingestion/languages/rust/range-binding.js +149 -63
- 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 +99 -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 +288 -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/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/nuxt-auto-imports.js +2 -1
- package/dist/core/ingestion/languages/typescript/query.d.ts +1 -0
- package/dist/core/ingestion/languages/typescript/query.js +340 -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 +291 -0
- package/dist/core/ingestion/languages/typescript.js +87 -1
- 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/parsing-processor.js +32 -1
- package/dist/core/ingestion/pipeline-phases/di.d.ts +8 -33
- package/dist/core/ingestion/pipeline-phases/di.js +275 -157
- package/dist/core/ingestion/pipeline-phases/index.d.ts +3 -0
- package/dist/core/ingestion/pipeline-phases/index.js +3 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +15 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +158 -3
- package/dist/core/ingestion/pipeline-phases/parse.js +5 -0
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +11 -2
- package/dist/core/ingestion/pipeline-phases/processes.js +102 -7
- package/dist/core/ingestion/pipeline-phases/routes.js +56 -10
- 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/spring-config.d.ts +37 -0
- package/dist/core/ingestion/pipeline-phases/spring-config.js +433 -0
- package/dist/core/ingestion/pipeline-phases/types.d.ts +7 -0
- package/dist/core/ingestion/pipeline.d.ts +27 -3
- package/dist/core/ingestion/pipeline.js +62 -12
- 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 +78 -6
- package/dist/core/ingestion/route-extractors/data-route-table.d.ts +25 -0
- package/dist/core/ingestion/route-extractors/data-route-table.js +864 -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/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 +109 -24
- 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 +617 -59
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +381 -22
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +16 -5
- 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 +15 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +53 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +20 -15
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +275 -41
- 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 +56 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +130 -32
- 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 +46 -3
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +64 -0
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1233 -0
- 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 +19 -4
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +160 -4
- 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 +64 -0
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +118 -0
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +109 -8
- 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 +34 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +82 -38
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +61 -1
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +384 -48
- 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 +968 -56
- 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/taint/typescript-model.js +34 -2
- package/dist/core/ingestion/tree-sitter-queries.d.ts +11 -11
- package/dist/core/ingestion/tree-sitter-queries.js +688 -5
- package/dist/core/ingestion/type-env.js +11 -7
- package/dist/core/ingestion/type-extractors/jvm.js +17 -2
- 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 +311 -14
- package/dist/core/ingestion/utils/ast-helpers.js +745 -48
- 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 +153 -0
- package/dist/core/ingestion/utils/callable-flow-captures.js +928 -0
- 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 +72 -0
- package/dist/core/ingestion/workers/callable-id.js +116 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +14 -1
- package/dist/core/ingestion/workers/parse-worker.js +409 -39
- package/dist/core/ingestion/workers/worker-pool.d.ts +34 -27
- package/dist/core/ingestion/workers/worker-pool.js +133 -25
- package/dist/core/lbug/csv-generator.d.ts +27 -0
- package/dist/core/lbug/csv-generator.js +80 -17
- package/dist/core/lbug/extension-load-error.d.ts +2 -2
- package/dist/core/lbug/extension-load-error.js +44 -27
- package/dist/core/lbug/extension-loader.d.ts +29 -0
- package/dist/core/lbug/extension-loader.js +32 -7
- 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 +337 -3
- package/dist/core/lbug/lbug-adapter.js +772 -67
- package/dist/core/lbug/lbug-config.d.ts +93 -6
- package/dist/core/lbug/lbug-config.js +269 -9
- package/dist/core/lbug/native-check.d.ts +39 -0
- package/dist/core/lbug/native-check.js +323 -46
- 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 +23 -1
- package/dist/core/lbug/pool-adapter.js +115 -7
- 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 +162 -3
- package/dist/core/lbug/schema.js +392 -157
- package/dist/core/lbug/sidecar-recovery.d.ts +1 -0
- package/dist/core/lbug/sidecar-recovery.js +1 -1
- package/dist/core/lbug/sync-csv-writer.d.ts +47 -0
- package/dist/core/lbug/sync-csv-writer.js +108 -0
- package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
- package/dist/core/platform/capabilities.d.ts +0 -1
- package/dist/core/platform/capabilities.js +12 -7
- package/dist/core/run-analyze.d.ts +150 -3
- package/dist/core/run-analyze.js +1562 -151
- 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 +167 -2
- package/dist/core/search/fts-indexes.js +264 -10
- package/dist/core/wiki/graph-queries.js +145 -112
- package/dist/core/wiki/llm-client.d.ts +37 -5
- package/dist/core/wiki/llm-client.js +88 -17
- 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/http-transport.d.ts +5 -0
- package/dist/mcp/http-transport.js +19 -5
- 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 +3 -0
- package/dist/mcp/local/bean-metadata.js +46 -0
- package/dist/mcp/local/local-backend.d.ts +167 -6
- package/dist/mcp/local/local-backend.js +1756 -405
- 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/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 +35 -0
- package/dist/mcp/repository-policy.js +333 -0
- package/dist/mcp/resources.js +34 -7
- package/dist/mcp/server.d.ts +5 -2
- package/dist/mcp/server.js +48 -18
- package/dist/mcp/tools.d.ts +8 -8
- package/dist/mcp/tools.js +91 -20
- package/dist/server/analyze-job.d.ts +40 -2
- package/dist/server/analyze-job.js +30 -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 +3 -2
- package/dist/server/analyze-worker-core.js +15 -3
- 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/analyze-worker.js +29 -6
- package/dist/server/api.d.ts +2 -11
- package/dist/server/api.js +200 -155
- 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/mcp-http.d.ts +1 -1
- package/dist/server/mcp-http.js +4 -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/server/upload-ingest.js +2 -1
- package/dist/server/validation.js +2 -1
- 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 +165 -0
- package/dist/storage/git.js +352 -3
- package/dist/storage/index-lock.d.ts +83 -0
- package/dist/storage/index-lock.js +654 -0
- package/dist/storage/parse-cache.js +482 -1
- package/dist/storage/parsedfile-store.d.ts +8 -0
- package/dist/storage/parsedfile-store.js +235 -1
- package/dist/storage/repo-manager.d.ts +29 -309
- package/dist/storage/repo-manager.js +187 -165
- 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 +20 -12
- package/scripts/cross-platform-shard.ts +143 -0
- package/scripts/cross-platform-tests.ts +94 -0
- package/scripts/ensure-fts.ts +14 -3
- package/scripts/run-cross-platform.ts +36 -10
- package/scripts/sync-plugin-manifests.mjs +192 -0
- 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-lfg/README.md +55 -0
- package/skills/gitnexus-lfg/SKILL.md +86 -0
- package/skills/gitnexus-plan/README.md +147 -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 +309 -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 +2366 -0
- package/skills/gitnexus-refactoring.md +48 -5
- package/skills/gitnexus-review/SKILL.md +279 -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-taint-analysis.md +13 -7
- package/skills/gitnexus-work/README.md +71 -0
- package/skills/gitnexus-work/SKILL.md +272 -0
- package/skills/gitnexus-work/references/evidence-provenance.md +309 -0
- package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2366 -0
- package/vendor/leiden/utils.cjs +28 -1
- package/web/assets/ProcessFlowModal-Badh2Pbg.js +24 -0
- package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
- package/web/assets/abnfDiagram-QNN2D4NM-Cq2djWWe.js +1 -0
- package/web/assets/agent-DIzEQ1JJ.js +626 -0
- package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +1 -0
- package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +36 -0
- package/web/assets/blockDiagram-54WLDVWM-Dg_hrRWE.js +132 -0
- package/web/assets/{c4Diagram-Y2BXMSZH-DOXVs7-C.js → c4Diagram-X2LASM7V-CnhoT4aV.js} +6 -6
- 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-6L755F7B-CMhLBxi2.js +1 -0
- package/web/assets/chunk-7CWYLC5S-DRgGkkpF.js +2 -0
- package/web/assets/chunk-A7VWPJGB-B4O3oQdQ.js +1 -0
- 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-SZD42YQK-ijyKKVr1.js +70 -0
- package/web/assets/chunk-TFPGFQPA-Dj6a-0pC.js +231 -0
- 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-VJFVEZTB-CX66F2ep.js +206 -0
- 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-KFBZAVDW-Dfmf_4ti.js +3 -0
- 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/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-B4eB4dNZ.js → index-BBNl0qfX.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-BLjivjXL.js → ishikawaDiagram-4JDSWWDM-DmqWtjkl.js} +6 -6
- package/web/assets/{journeyDiagram-M6C3CM3L-Cetgs3NH.js → journeyDiagram-QUS3FAKT-XAzVzrQW.js} +6 -6
- package/web/assets/{kanban-definition-75IXJCU3-DMlCaIpf.js → kanban-definition-D4L7SQKK-YurRnmYn.js} +27 -27
- package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +257 -0
- package/web/assets/{mindmap-definition-2TDM6QVE-B4GbXQBc.js → mindmap-definition-66QP5TD6-ChrWWnil.js} +29 -29
- package/web/assets/node-Ct_zna8U.js +8 -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/preload-helper-Czpn1I53.js +1 -0
- package/web/assets/{quadrantDiagram-VICAPDV7-B1TQnlm0.js → quadrantDiagram-VO5QLCXA-B7098wSc.js} +6 -6
- 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-RASO5HTO-B-l8InpK.js +84 -0
- package/web/assets/sankeyDiagram-F32LOJ6L-Kd7zjJgX.js +40 -0
- package/web/assets/sdk-CzHHH8tD.js +37 -0
- package/web/assets/sequenceDiagram-URATNSBD-BlcdY9DS.js +162 -0
- 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-WJXWRH4I-DUfp1R3E.js +120 -0
- 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 +17 -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/skills/gitnexus-pr-review.md +0 -163
- package/web/assets/ProcessFlowModal-Dna7GkwO.js +0 -22
- package/web/assets/agent-DNYDy-KA.js +0 -660
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-BU5ZRITg.js +0 -36
- package/web/assets/blockDiagram-7IZFK4PR-Dut1BpTV.js +0 -132
- package/web/assets/chunk-2T2R6R2M-pkw2oXHH.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-zxhDWgyF.js +0 -124
- package/web/assets/chunk-7J6CGLKN-AmkN8jJN.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-INKRHTLW-D9BM9HWZ.js +0 -70
- package/web/assets/chunk-J5EP6P6S-L19oz55R.js +0 -1
- package/web/assets/chunk-KGFNY3KK-tD2F6wxK.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-LCXTWHL2-Ba9JK-6F.js +0 -231
- package/web/assets/chunk-LII3EMHJ-EGx-eBIu.js +0 -1
- package/web/assets/chunk-LRIF4GLE-C3_PqUBq.js +0 -1
- package/web/assets/chunk-QA3QBVWF-D4cSJBf6.js +0 -2
- package/web/assets/chunk-RERM46MO-B5dAdWpP.js +0 -1
- package/web/assets/chunk-RG4AUYOV-OqBBMwuQ.js +0 -206
- package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +0 -1
- package/web/assets/chunk-T2UQINTJ-BJusEiGe.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-BCpUlARQ.js +0 -1
- package/web/assets/chunk-VU6ZFW4Y-BeXVk45_.js +0 -2
- package/web/assets/chunk-ZXARS5L4-BI_qR2Nm.js +0 -1
- package/web/assets/classDiagram-KGZ6W3CR-D9zSIg0x.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-D9zSIg0x.js +0 -1
- package/web/assets/dagre-ND4H6XIP-CpcV5kbl.js +0 -4
- package/web/assets/diagram-3NCE3AQN-6SMxBRpj.js +0 -43
- package/web/assets/diagram-GF46GFSD-BZEdNcRZ.js +0 -24
- package/web/assets/diagram-HNR7UZ2L-DxKW2a2Y.js +0 -3
- package/web/assets/diagram-QXG6HAR7-HfTHcXX_.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-CyijUS8r.js +0 -10
- package/web/assets/erDiagram-L5TCEMPS-D0fvpWEX.js +0 -85
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +0 -1
- package/web/assets/flowDiagram-H6V6AXG4-Bvr9bbhk.js +0 -162
- package/web/assets/ganttDiagram-JCBTUEKG-TzODrLzv.js +0 -292
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-ONQSwJIY.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-DIPVUIQ6.js +0 -2
- package/web/assets/katex-K3KEBU37-qRQBy-EZ.js +0 -261
- 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-D3YC_xyg.js +0 -30
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +0 -1
- package/web/assets/requirementDiagram-JXO7QTGE-f8wczLQf.js +0 -84
- package/web/assets/sankeyDiagram-URQDO5SZ-BTxzG5j0.js +0 -40
- package/web/assets/sequenceDiagram-VS2MUI6T-DuamM-IR.js +0 -162
- package/web/assets/src-BNCXICdA.js +0 -1
- package/web/assets/stateDiagram-7D4R322I-Ch2pEUcw.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-7ANuoZLL.js +0 -1
- package/web/assets/timeline-definition-O6YCAMPW-07BR8R8G.js +0 -120
- 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-BQX2ossk.js +0 -34
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +0 -1
- package/web/assets/wardleyDiagram-CUQ6CDDI-CGIJBBiK.js +0 -78
- package/web/assets/xychartDiagram-N2JHSOCM-B3HNMuWp.js +0 -7
- /package/web/assets/{chunk-7W6UQGC5-pyKGssV3.js → chunk-LIEV3EAG-pyKGssV3.js} +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import fsp from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import { createHash
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
4
|
import lbug from '@ladybugdb/core';
|
|
5
5
|
import { BRIDGE_SCHEMA_QUERIES, BRIDGE_SCHEMA_VERSION } from './bridge-schema.js';
|
|
6
6
|
import { closeLbugConnection, openLbugConnection, } from '../lbug/lbug-config.js';
|
|
7
7
|
import { dedupeContracts, dedupeCrossLinks } from './normalization.js';
|
|
8
8
|
import { createLogger } from '../logger.js';
|
|
9
|
-
import { retryRename } from '../../storage/fs-atomic.js';
|
|
9
|
+
import { retryRename, writeFileAtomic } from '../../storage/fs-atomic.js';
|
|
10
10
|
const bridgeLogger = createLogger('bridge-db', {
|
|
11
11
|
debugEnvVar: 'GITNEXUS_DEBUG_BRIDGE',
|
|
12
12
|
});
|
|
@@ -516,31 +516,7 @@ export async function closeBridgeDb(handle) {
|
|
|
516
516
|
/* writeBridgeMeta / readBridgeMeta */
|
|
517
517
|
/* ------------------------------------------------------------------ */
|
|
518
518
|
export async function writeBridgeMeta(groupDir, meta) {
|
|
519
|
-
|
|
520
|
-
// Unpredictable suffix + O_EXCL via `'wx'` flag closes the symlink/
|
|
521
|
-
// pre-create attack window. The third argument `0o600` is the
|
|
522
|
-
// user-only mode mask — CodeQL's `js/insecure-temporary-file` query
|
|
523
|
-
// sources its verdict from the `mode` argument, NOT from `flags`:
|
|
524
|
-
// its `isSecureMode(mode)` predicate requires the low 6 bits to be
|
|
525
|
-
// zero (no group/world bits). Without an explicit mode the file is
|
|
526
|
-
// created with the process umask (typically 0o644 = group/world
|
|
527
|
-
// readable), which the query treats as the actual vulnerability.
|
|
528
|
-
// Both `'wx'` (runtime O_EXCL) AND `0o600` (CodeQL-credited mode)
|
|
529
|
-
// are needed: one closes the symlink race, the other closes the
|
|
530
|
-
// permissions exposure.
|
|
531
|
-
const tmp = `${target}.tmp.${randomBytes(8).toString('hex')}`;
|
|
532
|
-
const handle = await fsp.open(tmp, 'wx', 0o600);
|
|
533
|
-
try {
|
|
534
|
-
await handle.writeFile(JSON.stringify(meta, null, 2), 'utf-8');
|
|
535
|
-
}
|
|
536
|
-
finally {
|
|
537
|
-
await handle.close();
|
|
538
|
-
}
|
|
539
|
-
// Use retryRename for consistency with writeBridge's atomic swap — on
|
|
540
|
-
// Windows a concurrent reader can cause EBUSY/EPERM even on a tiny
|
|
541
|
-
// meta.json, and we don't want meta write to be less robust than the
|
|
542
|
-
// bridge.lbug swap it accompanies.
|
|
543
|
-
await retryRename(tmp, target);
|
|
519
|
+
await writeFileAtomic(path.join(groupDir, 'meta.json'), JSON.stringify(meta, null, 2));
|
|
544
520
|
}
|
|
545
521
|
export async function readBridgeMeta(groupDir) {
|
|
546
522
|
try {
|
|
@@ -829,6 +805,8 @@ const LBUG_OPEN_RETRY_PATTERNS = [
|
|
|
829
805
|
'could not set lock',
|
|
830
806
|
'lock held by another process',
|
|
831
807
|
];
|
|
808
|
+
// Cross-repo bridge RO open retry. Catalogued as entry 5 of the lbug-config
|
|
809
|
+
// retry-budget registry; caps back-off so total wait ~3s.
|
|
832
810
|
const LBUG_OPEN_RETRY_ATTEMPTS = 10;
|
|
833
811
|
const LBUG_OPEN_RETRY_BASE_MS = 100;
|
|
834
812
|
/** Cap individual back-off delays so the total wait is bounded (~3s). */
|
|
@@ -4,10 +4,30 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { BridgeHandle, CrossRepoImpact, GroupImpactResult } from './types.js';
|
|
6
6
|
import type { GroupToolPort } from './service.js';
|
|
7
|
+
import { compareCodeUnits } from '../../lib/utils.js';
|
|
7
8
|
/** Cross-boundary hops beyond this value are clamped (multi-hop reserved for future work). */
|
|
8
9
|
export declare const MAX_SUPPORTED_CROSS_DEPTH = 1;
|
|
9
10
|
/** Default wall-clock budget for the Phase 1 `impact` leg when callers omit `timeoutMs`. */
|
|
10
11
|
export declare const DEFAULT_LOCAL_IMPACT_TIMEOUT_MS = 30000;
|
|
12
|
+
/**
|
|
13
|
+
* Cap on neighbour fan-outs attempted per group-impact request.
|
|
14
|
+
*
|
|
15
|
+
* The bound used to be the wall clock alone, which made the cutoff a function
|
|
16
|
+
* of machine load: an idle host traversed more crossings and `mergeRisk`
|
|
17
|
+
* escalated to CRITICAL at three, while a loaded host stopped at two and
|
|
18
|
+
* reported HIGH or lower — same graph, same arguments, different verdict
|
|
19
|
+
* (#2787). A count is deterministic, and the neighbour list carries a total
|
|
20
|
+
* order over the full crossing identity (confidence DESC, then repo, uid,
|
|
21
|
+
* contract), so the cap keeps the strongest crossings rather than an arbitrary
|
|
22
|
+
* prefix.
|
|
23
|
+
*
|
|
24
|
+
* 50 is borrowed from `MAX_CROSSINGS_TO_TRY` (cross-trace.ts) on cost, not on
|
|
25
|
+
* scope — that one caps ContractLinks per repo pair inside a trace, this one
|
|
26
|
+
* caps the total across all neighbour repos in one impact call, and group impact
|
|
27
|
+
* had no numeric cap at all before #2787. The wall clock stays as a hang
|
|
28
|
+
* backstop below; this is the bound that normally binds.
|
|
29
|
+
*/
|
|
30
|
+
export declare const MAX_NEIGHBOR_FANOUT = 50;
|
|
11
31
|
export type BridgeNeighborRow = {
|
|
12
32
|
neighborRepo: string;
|
|
13
33
|
neighborUid: string;
|
|
@@ -117,3 +137,4 @@ export declare function runGroupImpact(deps: RunGroupImpactDeps, params: Record<
|
|
|
117
137
|
error: string;
|
|
118
138
|
}>;
|
|
119
139
|
export { normalizeServicePrefix, fileMatchesServicePrefix } from './group-path-utils.js';
|
|
140
|
+
export { compareCodeUnits };
|
|
@@ -9,6 +9,7 @@ import { fileMatchesServicePrefix, normalizeServicePrefix, repoInSubgroup, } fro
|
|
|
9
9
|
import { getGroupDir } from './storage.js';
|
|
10
10
|
import { closeBridgeDb, getCachedBridgeReadOnly, queryBridge, readBridgeMeta, } from './bridge-db.js';
|
|
11
11
|
import { BRIDGE_SCHEMA_VERSION } from './bridge-schema.js';
|
|
12
|
+
import { compareCodeUnits } from '../../lib/utils.js';
|
|
12
13
|
// High limit for the local phase of group impact so collectImpactSymbolUids
|
|
13
14
|
// sees (nearly) all symbols. Bypasses the MCP-facing default of 100.
|
|
14
15
|
const GROUP_LOCAL_PHASE_LIMIT = 10000;
|
|
@@ -16,6 +17,25 @@ const GROUP_LOCAL_PHASE_LIMIT = 10000;
|
|
|
16
17
|
export const MAX_SUPPORTED_CROSS_DEPTH = 1;
|
|
17
18
|
/** Default wall-clock budget for the Phase 1 `impact` leg when callers omit `timeoutMs`. */
|
|
18
19
|
export const DEFAULT_LOCAL_IMPACT_TIMEOUT_MS = 30_000;
|
|
20
|
+
/**
|
|
21
|
+
* Cap on neighbour fan-outs attempted per group-impact request.
|
|
22
|
+
*
|
|
23
|
+
* The bound used to be the wall clock alone, which made the cutoff a function
|
|
24
|
+
* of machine load: an idle host traversed more crossings and `mergeRisk`
|
|
25
|
+
* escalated to CRITICAL at three, while a loaded host stopped at two and
|
|
26
|
+
* reported HIGH or lower — same graph, same arguments, different verdict
|
|
27
|
+
* (#2787). A count is deterministic, and the neighbour list carries a total
|
|
28
|
+
* order over the full crossing identity (confidence DESC, then repo, uid,
|
|
29
|
+
* contract), so the cap keeps the strongest crossings rather than an arbitrary
|
|
30
|
+
* prefix.
|
|
31
|
+
*
|
|
32
|
+
* 50 is borrowed from `MAX_CROSSINGS_TO_TRY` (cross-trace.ts) on cost, not on
|
|
33
|
+
* scope — that one caps ContractLinks per repo pair inside a trace, this one
|
|
34
|
+
* caps the total across all neighbour repos in one impact call, and group impact
|
|
35
|
+
* had no numeric cap at all before #2787. The wall clock stays as a hang
|
|
36
|
+
* backstop below; this is the bound that normally binds.
|
|
37
|
+
*/
|
|
38
|
+
export const MAX_NEIGHBOR_FANOUT = 50;
|
|
19
39
|
const CY_NEIGHBORS_UPSTREAM = `
|
|
20
40
|
MATCH (consumer:Contract)-[l:ContractLink]->(provider:Contract)
|
|
21
41
|
WHERE provider.repo = $localRepo
|
|
@@ -256,17 +276,49 @@ function extractProcessNames(impact) {
|
|
|
256
276
|
// No behavior change — `'UNKNOWN'` was already handled correctly at the
|
|
257
277
|
// `(localRisk === 'LOW' || localRisk === 'UNKNOWN')` branch below.
|
|
258
278
|
export function mergeRisk(localRisk, cross) {
|
|
259
|
-
const
|
|
279
|
+
const traversed = cross.filter((c) => c.fanout_status !== 'not_attempted');
|
|
280
|
+
const highConf = traversed.some((c) => c.contract.confidence >= 0.85);
|
|
260
281
|
if (localRisk === 'CRITICAL')
|
|
261
282
|
return 'CRITICAL';
|
|
262
|
-
if (
|
|
283
|
+
if (traversed.length >= 3)
|
|
263
284
|
return 'CRITICAL';
|
|
264
285
|
if (highConf)
|
|
265
286
|
return 'HIGH';
|
|
266
|
-
if (
|
|
287
|
+
if (traversed.length > 0 && (localRisk === 'LOW' || localRisk === 'UNKNOWN'))
|
|
267
288
|
return 'MEDIUM';
|
|
268
289
|
return localRisk;
|
|
269
290
|
}
|
|
291
|
+
/**
|
|
292
|
+
* Build the truncation fields every `runGroupImpact` return path shares.
|
|
293
|
+
*
|
|
294
|
+
* `riskEpistemic` must follow `truncated` mechanically: it is the marker that
|
|
295
|
+
* tells a caller the `risk` value is a floor rather than a verdict, and
|
|
296
|
+
* `mergeRisk` can only under-report once a crossing is dropped. Attaching it at
|
|
297
|
+
* each return let two of the four paths set `truncated` without it, so a
|
|
298
|
+
* truncated result read as complete — deriving it in one place is what keeps
|
|
299
|
+
* the invariant from drifting again (#2787).
|
|
300
|
+
*/
|
|
301
|
+
function truncationFields(truncated,
|
|
302
|
+
// Only read on the truncated branch, so the not-truncated call sites omit it
|
|
303
|
+
// rather than passing a reason that is thrown away.
|
|
304
|
+
reasonIfTruncated = 'partial') {
|
|
305
|
+
if (!truncated)
|
|
306
|
+
return { truncated: false };
|
|
307
|
+
return { truncated: true, truncationReason: reasonIfTruncated, riskEpistemic: 'lower-bound' };
|
|
308
|
+
}
|
|
309
|
+
function addCrossImpact(cross, candidate) {
|
|
310
|
+
const sameBoundary = (entry) => entry.repo_path === candidate.repo_path && entry.contract.id === candidate.contract.id;
|
|
311
|
+
if (candidate.fanout_status === 'not_attempted') {
|
|
312
|
+
if (cross.some(sameBoundary))
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
const boundaryOnlyIndex = cross.findIndex((entry) => sameBoundary(entry) && entry.fanout_status === 'not_attempted');
|
|
317
|
+
if (boundaryOnlyIndex >= 0)
|
|
318
|
+
cross.splice(boundaryOnlyIndex, 1);
|
|
319
|
+
}
|
|
320
|
+
cross.push(candidate);
|
|
321
|
+
}
|
|
270
322
|
export async function ensureBridgeReady(groupDir) {
|
|
271
323
|
const meta = await readBridgeMeta(groupDir);
|
|
272
324
|
if (meta.version > 0 && meta.version !== BRIDGE_SCHEMA_VERSION) {
|
|
@@ -337,7 +389,15 @@ export async function resolveBridgeNeighbors(handle, opts) {
|
|
|
337
389
|
if (n)
|
|
338
390
|
neighbors.push(n);
|
|
339
391
|
}
|
|
340
|
-
|
|
392
|
+
// Sort on the FULL crossing identity — the same triple the fan-out dedups on
|
|
393
|
+
// below (`repo\0uid\0contractId`). Two links that share (confidence, repo,
|
|
394
|
+
// uid) but differ in contract both survive that dedup, so leaving contractId
|
|
395
|
+
// out of the comparator makes them compare 0 and fall back to raw bridge row
|
|
396
|
+
// order, which is what decides who lands past MAX_NEIGHBOR_FANOUT (#2787).
|
|
397
|
+
neighbors.sort((a, b) => b.confidence - a.confidence ||
|
|
398
|
+
compareCodeUnits(a.neighborRepo, b.neighborRepo) ||
|
|
399
|
+
compareCodeUnits(a.neighborUid, b.neighborUid) ||
|
|
400
|
+
compareCodeUnits(a.contractId, b.contractId));
|
|
341
401
|
return neighbors;
|
|
342
402
|
}
|
|
343
403
|
export async function runGroupImpact(deps, params) {
|
|
@@ -376,7 +436,7 @@ export async function runGroupImpact(deps, params) {
|
|
|
376
436
|
group: name,
|
|
377
437
|
cross: [],
|
|
378
438
|
outOfScope: [],
|
|
379
|
-
|
|
439
|
+
...truncationFields(true, 'timeout'),
|
|
380
440
|
truncatedRepos: [],
|
|
381
441
|
summary: {
|
|
382
442
|
direct: 0,
|
|
@@ -386,7 +446,6 @@ export async function runGroupImpact(deps, params) {
|
|
|
386
446
|
},
|
|
387
447
|
risk: 'UNKNOWN',
|
|
388
448
|
timeoutMs,
|
|
389
|
-
truncationReason: 'timeout',
|
|
390
449
|
crossDepthWarning,
|
|
391
450
|
};
|
|
392
451
|
}
|
|
@@ -408,7 +467,7 @@ export async function runGroupImpact(deps, params) {
|
|
|
408
467
|
group: name,
|
|
409
468
|
cross: [],
|
|
410
469
|
outOfScope: [],
|
|
411
|
-
|
|
470
|
+
...truncationFields(false),
|
|
412
471
|
truncatedRepos: [],
|
|
413
472
|
summary: {
|
|
414
473
|
direct: 0,
|
|
@@ -430,7 +489,7 @@ export async function runGroupImpact(deps, params) {
|
|
|
430
489
|
group: name,
|
|
431
490
|
cross: [],
|
|
432
491
|
outOfScope: [],
|
|
433
|
-
|
|
492
|
+
...truncationFields(Boolean(local.partial), 'partial'),
|
|
434
493
|
truncatedRepos: [],
|
|
435
494
|
summary: {
|
|
436
495
|
direct: s.direct ?? 0,
|
|
@@ -440,7 +499,6 @@ export async function runGroupImpact(deps, params) {
|
|
|
440
499
|
},
|
|
441
500
|
risk: String(local.risk ?? 'LOW'),
|
|
442
501
|
timeoutMs,
|
|
443
|
-
truncationReason: local.partial ? 'partial' : undefined,
|
|
444
502
|
crossDepthWarning,
|
|
445
503
|
};
|
|
446
504
|
}
|
|
@@ -451,6 +509,10 @@ export async function runGroupImpact(deps, params) {
|
|
|
451
509
|
const cross = [];
|
|
452
510
|
const outOfScope = [];
|
|
453
511
|
const truncatedRepos = [];
|
|
512
|
+
/** Real `impactByUid` fan-outs issued — what MAX_NEIGHBOR_FANOUT bounds. */
|
|
513
|
+
let attemptedFanouts = 0;
|
|
514
|
+
/** True when the wall-clock backstop, not the count cap, cut the fan-out. */
|
|
515
|
+
let fanoutTimedOut = false;
|
|
454
516
|
try {
|
|
455
517
|
const neighbors = await resolveBridgeNeighbors(handle, {
|
|
456
518
|
localRepo: repoPath,
|
|
@@ -459,7 +521,10 @@ export async function runGroupImpact(deps, params) {
|
|
|
459
521
|
});
|
|
460
522
|
const seen = new Set();
|
|
461
523
|
for (const n of neighbors) {
|
|
462
|
-
|
|
524
|
+
const manifestOnly = n.neighborUid.startsWith('manifest::');
|
|
525
|
+
if (servicePrefix &&
|
|
526
|
+
!manifestOnly &&
|
|
527
|
+
!fileMatchesServicePrefix(n.neighborFilePath, servicePrefix)) {
|
|
463
528
|
continue;
|
|
464
529
|
}
|
|
465
530
|
if (!repoInSubgroup(n.neighborRepo, subgroup)) {
|
|
@@ -475,8 +540,18 @@ export async function runGroupImpact(deps, params) {
|
|
|
475
540
|
if (seen.has(key))
|
|
476
541
|
continue;
|
|
477
542
|
seen.add(key);
|
|
478
|
-
|
|
479
|
-
|
|
543
|
+
// Deterministic bound first: the count decides the cutoff on every host.
|
|
544
|
+
// Manifest-only crossings are exempt because they cost no `impactByUid`
|
|
545
|
+
// and dropping them regresses #2784.
|
|
546
|
+
if (!manifestOnly && attemptedFanouts >= MAX_NEIGHBOR_FANOUT) {
|
|
547
|
+
truncatedRepos.push(n.neighborRepo);
|
|
548
|
+
continue;
|
|
549
|
+
}
|
|
550
|
+
// Wall clock second, as a hang backstop only. It is load-dependent by
|
|
551
|
+
// construction, so when it is what fired the response must say `timeout`,
|
|
552
|
+
// not the generic `partial` it used to report.
|
|
553
|
+
if (!manifestOnly && deadline - Date.now() <= 0) {
|
|
554
|
+
fanoutTimedOut = true;
|
|
480
555
|
truncatedRepos.push(n.neighborRepo);
|
|
481
556
|
continue;
|
|
482
557
|
}
|
|
@@ -491,11 +566,40 @@ export async function runGroupImpact(deps, params) {
|
|
|
491
566
|
truncatedRepos.push(n.neighborRepo);
|
|
492
567
|
continue;
|
|
493
568
|
}
|
|
569
|
+
// A manifest link can prove the repository boundary even when its far
|
|
570
|
+
// endpoint has no graph symbol of its own (for example, a string-based
|
|
571
|
+
// RPC dispatch). Those endpoints deliberately use a deterministic
|
|
572
|
+
// `manifest::...` UID. Calling impactByUid with that synthetic value can
|
|
573
|
+
// never succeed because it is not a node in the verified neighbor
|
|
574
|
+
// repository; dropping the crossing here made `group sync` report the
|
|
575
|
+
// manifest link while `group impact` silently returned cross=0 (#2722).
|
|
576
|
+
//
|
|
577
|
+
// Preserve the proven crossing with an empty local fan-out. Real UIDs
|
|
578
|
+
// still take the normal impactByUid path below, where failures remain
|
|
579
|
+
// truncations rather than false successful traversals.
|
|
580
|
+
if (manifestOnly) {
|
|
581
|
+
addCrossImpact(cross, {
|
|
582
|
+
repo: regName,
|
|
583
|
+
repo_path: n.neighborRepo,
|
|
584
|
+
contract: {
|
|
585
|
+
id: n.contractId,
|
|
586
|
+
type: n.contractType,
|
|
587
|
+
match_type: 'manifest',
|
|
588
|
+
confidence: n.confidence,
|
|
589
|
+
},
|
|
590
|
+
by_depth: {},
|
|
591
|
+
affected_processes: [],
|
|
592
|
+
fanout_status: 'not_attempted',
|
|
593
|
+
});
|
|
594
|
+
continue;
|
|
595
|
+
}
|
|
596
|
+
const remainingMs = deadline - Date.now();
|
|
494
597
|
// Phase-2 hardening: race each impactByUid against a per-call
|
|
495
598
|
// timeout derived from the remaining budget. Without this wrap a
|
|
496
599
|
// single hung neighbor would pin the request past the clamped
|
|
497
600
|
// timeout, which Codex's adversarial review on PR #1331 flagged
|
|
498
601
|
// as the still-open half of CodeQL #184 / js/resource-exhaustion.
|
|
602
|
+
attemptedFanouts += 1;
|
|
499
603
|
const { value: fan, timedOut: neighborTimedOut } = await safeNeighborImpact(deps.port, neighborHandle.id, n.neighborUid, direction, {
|
|
500
604
|
maxDepth,
|
|
501
605
|
relationTypes: relationTypes ?? [],
|
|
@@ -503,10 +607,12 @@ export async function runGroupImpact(deps, params) {
|
|
|
503
607
|
includeTests,
|
|
504
608
|
}, remainingMs);
|
|
505
609
|
if (neighborTimedOut || fan == null) {
|
|
610
|
+
if (neighborTimedOut)
|
|
611
|
+
fanoutTimedOut = true;
|
|
506
612
|
truncatedRepos.push(n.neighborRepo);
|
|
507
613
|
continue;
|
|
508
614
|
}
|
|
509
|
-
cross
|
|
615
|
+
addCrossImpact(cross, {
|
|
510
616
|
repo: regName,
|
|
511
617
|
repo_path: n.neighborRepo,
|
|
512
618
|
contract: {
|
|
@@ -532,7 +638,12 @@ export async function runGroupImpact(deps, params) {
|
|
|
532
638
|
group: name,
|
|
533
639
|
cross,
|
|
534
640
|
outOfScope,
|
|
535
|
-
|
|
641
|
+
// The risk VALUE is never clamped down. `mergeRisk` is monotone increasing
|
|
642
|
+
// in the traversed-crossing count, so truncation can only under-report —
|
|
643
|
+
// and under-reporting a blast radius is the unsafe direction (an agent told
|
|
644
|
+
// LOW proceeds; told CRITICAL it stops). Marking the floor keeps the
|
|
645
|
+
// warning intact while making the incompleteness legible.
|
|
646
|
+
...truncationFields(truncated, fanoutTimedOut ? 'timeout' : 'partial'),
|
|
536
647
|
truncatedRepos: [...new Set(truncatedRepos)],
|
|
537
648
|
summary: {
|
|
538
649
|
direct: localSum.direct ?? 0,
|
|
@@ -542,9 +653,11 @@ export async function runGroupImpact(deps, params) {
|
|
|
542
653
|
},
|
|
543
654
|
risk: mergeRisk(localRisk, cross),
|
|
544
655
|
timeoutMs,
|
|
545
|
-
truncationReason: truncated ? 'partial' : undefined,
|
|
546
656
|
crossDepthWarning,
|
|
547
657
|
};
|
|
548
658
|
return result;
|
|
549
659
|
}
|
|
550
660
|
export { normalizeServicePrefix, fileMatchesServicePrefix } from './group-path-utils.js';
|
|
661
|
+
// Re-exported, not redefined: the single definition lives in lib/utils.ts, but
|
|
662
|
+
// this module's own surface is what the #2787 regression test imports it from.
|
|
663
|
+
export { compareCodeUnits };
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
import { GroupNotFoundError, loadGroupConfig } from './config-parser.js';
|
|
26
26
|
import { getGroupDir } from './storage.js';
|
|
27
27
|
import { ensureBridgeReady, MAX_SUPPORTED_CROSS_DEPTH } from './cross-impact.js';
|
|
28
|
+
import { compareCodeUnits } from '../../lib/utils.js';
|
|
28
29
|
import { closeBridgeDb, queryBridge } from './bridge-db.js';
|
|
29
30
|
/**
|
|
30
31
|
* Centralized degraded-state messages so wording stays consistent and
|
|
@@ -115,7 +116,7 @@ RETURN consumer.symbolUid AS consumerUid,
|
|
|
115
116
|
l.confidence AS confidence,
|
|
116
117
|
l.contractId AS contractId,
|
|
117
118
|
consumer.type AS contractType
|
|
118
|
-
ORDER BY l.confidence DESC
|
|
119
|
+
ORDER BY l.confidence DESC, contractId, consumerUid, providerUid
|
|
119
120
|
LIMIT ${MAX_CROSSINGS_TO_TRY + 1}
|
|
120
121
|
`;
|
|
121
122
|
// Destination trace: every ContractLink leaving a consumer repo, to ANY provider
|
|
@@ -136,7 +137,7 @@ RETURN consumer.symbolUid AS consumerUid,
|
|
|
136
137
|
l.confidence AS confidence,
|
|
137
138
|
l.contractId AS contractId,
|
|
138
139
|
consumer.type AS contractType
|
|
139
|
-
ORDER BY l.confidence DESC
|
|
140
|
+
ORDER BY l.confidence DESC, contractId, consumerUid, providerUid
|
|
140
141
|
LIMIT ${MAX_CROSSINGS_TO_TRY + 1}
|
|
141
142
|
`;
|
|
142
143
|
function rowToCrossing(r) {
|
|
@@ -164,6 +165,28 @@ function rowToCrossing(r) {
|
|
|
164
165
|
contractType: String(r.contractType ?? r[7] ?? 'custom'),
|
|
165
166
|
};
|
|
166
167
|
}
|
|
168
|
+
/**
|
|
169
|
+
* Sort a crossing list on the full crossing identity, then apply
|
|
170
|
+
* `MAX_CROSSINGS_TO_TRY`.
|
|
171
|
+
*
|
|
172
|
+
* Both bridge queries already order by confidence DESC; this re-sorts
|
|
173
|
+
* defensively so the cap keeps the strongest candidates even if a tuple-mode
|
|
174
|
+
* driver reorders rows. The comparator mirrors BOTH queries' `ORDER BY`
|
|
175
|
+
* key-for-key — a shorter comparator reproduces less than the order it is
|
|
176
|
+
* defending, leaving ties on raw row order (#2787) — so it lives in one place
|
|
177
|
+
* rather than being hand-synced across the two callers and two Cypher clauses.
|
|
178
|
+
*/
|
|
179
|
+
function capCrossings(all) {
|
|
180
|
+
all.sort((a, b) => b.confidence - a.confidence ||
|
|
181
|
+
compareCodeUnits(a.contractId, b.contractId) ||
|
|
182
|
+
compareCodeUnits(a.consumerUid, b.consumerUid) ||
|
|
183
|
+
compareCodeUnits(a.providerUid, b.providerUid));
|
|
184
|
+
const truncated = all.length > MAX_CROSSINGS_TO_TRY;
|
|
185
|
+
return {
|
|
186
|
+
crossings: truncated ? all.slice(0, MAX_CROSSINGS_TO_TRY) : all,
|
|
187
|
+
truncated,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
167
190
|
async function listCrossingsBetween(handle, fromRepo, toRepo) {
|
|
168
191
|
const rows = await queryBridge(handle, CY_CROSSINGS_BETWEEN, {
|
|
169
192
|
fromRepo,
|
|
@@ -175,14 +198,7 @@ async function listCrossingsBetween(handle, fromRepo, toRepo) {
|
|
|
175
198
|
if (c)
|
|
176
199
|
all.push(c);
|
|
177
200
|
}
|
|
178
|
-
|
|
179
|
-
// keeps the strongest candidates even if a tuple-mode driver reorders rows.
|
|
180
|
-
all.sort((a, b) => b.confidence - a.confidence);
|
|
181
|
-
const truncated = all.length > MAX_CROSSINGS_TO_TRY;
|
|
182
|
-
return {
|
|
183
|
-
crossings: truncated ? all.slice(0, MAX_CROSSINGS_TO_TRY) : all,
|
|
184
|
-
truncated,
|
|
185
|
-
};
|
|
201
|
+
return capCrossings(all);
|
|
186
202
|
}
|
|
187
203
|
function destRowToCrossing(r) {
|
|
188
204
|
const consumerUid = String(r.consumerUid ?? r[0] ?? '');
|
|
@@ -212,12 +228,7 @@ async function listCrossingsFrom(handle, fromRepo) {
|
|
|
212
228
|
if (c)
|
|
213
229
|
all.push(c);
|
|
214
230
|
}
|
|
215
|
-
all
|
|
216
|
-
const truncated = all.length > MAX_CROSSINGS_TO_TRY;
|
|
217
|
-
return {
|
|
218
|
-
crossings: truncated ? all.slice(0, MAX_CROSSINGS_TO_TRY) : all,
|
|
219
|
-
truncated,
|
|
220
|
-
};
|
|
231
|
+
return capCrossings(all);
|
|
221
232
|
}
|
|
222
233
|
/**
|
|
223
234
|
* Resolve a symbol query across every member repo. Exactly one `ok` match and
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import Java from 'tree-sitter-java';
|
|
2
2
|
import { compilePatterns, runCompiledPatterns, unquoteLiteral, } from '../tree-sitter-scanner.js';
|
|
3
|
-
import {
|
|
3
|
+
import { springAnnotationHttpMethods, intersectSpringHttpMethods, isRouteMemberKey, findEnclosingClass, joinPath, } from '../../../ingestion/route-extractors/spring-shared.js';
|
|
4
4
|
import { REST_TEMPLATE_TO_HTTP, WEB_CLIENT_SHORT_TO_HTTP, WEB_CLIENT_LONG_VERB_RE, EXCHANGE_ANNOTATION_TO_HTTP, parseRequestLine, pushPrefix, scanSpringInheritanceProject, OPENFEIGN_FRAMEWORK, HTTP_INTERFACE_FRAMEWORK, FEIGN_CONFIDENCE, REQUEST_LINE_CONFIDENCE, EXCHANGE_CONFIDENCE, } from './spring-consumer-shared.js';
|
|
5
5
|
import { extractStaticPathExpression, inferOkHttpMethod, inferHttpClientMethod, okHttpUrlRootsAtBuilder, httpClientUriRootsAtNewBuilder, httpClientChainHasUriCall, } from './java-static-path.js';
|
|
6
6
|
/**
|
|
7
7
|
* Java HTTP plugin. Handles:
|
|
8
|
-
* - Spring `@RequestMapping` class prefixes +
|
|
8
|
+
* - Spring `@RequestMapping` class prefixes + shortcut/`@RequestMapping` method annotations
|
|
9
9
|
* - Spring `RestTemplate.getForObject/...`, `exchange(...)`
|
|
10
10
|
* - Spring `WebClient.method(HttpMethod.X, ...)`, `WebClient.get().uri(...)`
|
|
11
11
|
* - OkHttp `new Request.Builder().url("...")`
|
|
@@ -345,6 +345,33 @@ function getNodeName(node) {
|
|
|
345
345
|
function simpleName(text) {
|
|
346
346
|
return text.split('.').pop() ?? text;
|
|
347
347
|
}
|
|
348
|
+
function declarationAnnotations(node) {
|
|
349
|
+
const modifiers = node.namedChildren.find((child) => child.type === 'modifiers');
|
|
350
|
+
if (!modifiers)
|
|
351
|
+
return [];
|
|
352
|
+
return modifiers.namedChildren.filter((child) => child.type === 'annotation' || child.type === 'marker_annotation');
|
|
353
|
+
}
|
|
354
|
+
function annotationHasRouteMember(annotation) {
|
|
355
|
+
const args = annotation.childForFieldName('arguments');
|
|
356
|
+
if (!args)
|
|
357
|
+
return false;
|
|
358
|
+
for (const child of args.namedChildren) {
|
|
359
|
+
if (child.type !== 'element_value_pair')
|
|
360
|
+
return true;
|
|
361
|
+
const key = child.childForFieldName('key');
|
|
362
|
+
if (isRouteMemberKey(key ?? undefined))
|
|
363
|
+
return true;
|
|
364
|
+
}
|
|
365
|
+
return false;
|
|
366
|
+
}
|
|
367
|
+
function typeRequestMethods(typeNode) {
|
|
368
|
+
const mappings = declarationAnnotations(typeNode).filter((annotation) => simpleName(annotation.childForFieldName('name')?.text ?? '') === 'RequestMapping');
|
|
369
|
+
if (mappings.length === 0)
|
|
370
|
+
return ['*'];
|
|
371
|
+
if (mappings.length !== 1)
|
|
372
|
+
return [];
|
|
373
|
+
return springAnnotationHttpMethods('RequestMapping', mappings[0].text);
|
|
374
|
+
}
|
|
348
375
|
function hasAnnotation(node, names) {
|
|
349
376
|
const modifiers = node.namedChildren.find((child) => child.type === 'modifiers');
|
|
350
377
|
if (!modifiers)
|
|
@@ -385,6 +412,7 @@ function scanRouteAnnotations(tree) {
|
|
|
385
412
|
const methodRoutes = [];
|
|
386
413
|
const requestLines = [];
|
|
387
414
|
const exchangeRoutes = [];
|
|
415
|
+
const httpMethodsByAnnotationId = new Map();
|
|
388
416
|
// Interface `@RequestMapping` prefixes rank below `@FeignClient(path)`;
|
|
389
417
|
// collect them and apply only after the FeignClient pass below.
|
|
390
418
|
const interfaceRequestMappingPrefixes = [];
|
|
@@ -405,19 +433,30 @@ function scanRouteAnnotations(tree) {
|
|
|
405
433
|
const ann = simpleName(annNode.text);
|
|
406
434
|
const keyNode = captures.key; // undefined for the positional shape
|
|
407
435
|
if (node.type === 'method_declaration') {
|
|
408
|
-
// Method-level: a Spring
|
|
409
|
-
const
|
|
410
|
-
if (
|
|
436
|
+
// Method-level: a Spring shortcut/`@RequestMapping` route, or native `@RequestLine`.
|
|
437
|
+
const annotationNode = annNode.parent;
|
|
438
|
+
if (!annotationNode)
|
|
439
|
+
continue;
|
|
440
|
+
let httpMethods = httpMethodsByAnnotationId.get(annotationNode.id);
|
|
441
|
+
if (!httpMethods) {
|
|
442
|
+
httpMethods = springAnnotationHttpMethods(ann, annotationNode.text);
|
|
443
|
+
httpMethodsByAnnotationId.set(annotationNode.id, httpMethods);
|
|
444
|
+
}
|
|
445
|
+
if (httpMethods.length > 0) {
|
|
446
|
+
const feignHttpMethod = httpMethods.length === 1 ? (httpMethods[0] === '*' ? 'GET' : httpMethods[0]) : null;
|
|
411
447
|
if (!isRouteMemberKey(keyNode))
|
|
412
448
|
continue;
|
|
413
449
|
const rawPath = unquoteLiteral(valueNode.text);
|
|
414
450
|
if (rawPath !== null) {
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
451
|
+
for (const httpMethod of httpMethods) {
|
|
452
|
+
methodRoutes.push({
|
|
453
|
+
methodNode: node,
|
|
454
|
+
methodName: captures.member?.text ?? null,
|
|
455
|
+
httpMethod,
|
|
456
|
+
rawPath,
|
|
457
|
+
feignHttpMethod,
|
|
458
|
+
});
|
|
459
|
+
}
|
|
421
460
|
}
|
|
422
461
|
}
|
|
423
462
|
else if (ann === 'RequestLine') {
|
|
@@ -483,6 +522,42 @@ function scanRouteAnnotations(tree) {
|
|
|
483
522
|
pushPrefix(httpExchangePrefixByTypeId, node.id, prefix);
|
|
484
523
|
}
|
|
485
524
|
}
|
|
525
|
+
const classHttpMethodsByTypeId = new Map();
|
|
526
|
+
for (const match of runCompiledPatterns(SPRING_TYPE_DECLARATION_PATTERNS, tree)) {
|
|
527
|
+
const typeNode = match.captures.type;
|
|
528
|
+
if (!typeNode)
|
|
529
|
+
continue;
|
|
530
|
+
const classMethods = typeRequestMethods(typeNode);
|
|
531
|
+
classHttpMethodsByTypeId.set(typeNode.id, classMethods);
|
|
532
|
+
for (const methodNode of collectDirectMethods(typeNode)) {
|
|
533
|
+
for (const annotationNode of declarationAnnotations(methodNode)) {
|
|
534
|
+
if (annotationHasRouteMember(annotationNode))
|
|
535
|
+
continue;
|
|
536
|
+
const ann = simpleName(annotationNode.childForFieldName('name')?.text ?? '');
|
|
537
|
+
const httpMethods = springAnnotationHttpMethods(ann, annotationNode.text);
|
|
538
|
+
if (httpMethods.length === 0)
|
|
539
|
+
continue;
|
|
540
|
+
const feignHttpMethod = httpMethods.length === 1 ? (httpMethods[0] === '*' ? 'GET' : httpMethods[0]) : null;
|
|
541
|
+
for (const httpMethod of httpMethods) {
|
|
542
|
+
methodRoutes.push({
|
|
543
|
+
methodNode,
|
|
544
|
+
methodName: getNodeName(methodNode),
|
|
545
|
+
httpMethod,
|
|
546
|
+
rawPath: '',
|
|
547
|
+
feignHttpMethod,
|
|
548
|
+
});
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
const constrainedMethodRoutes = methodRoutes.flatMap((route) => {
|
|
554
|
+
const typeNode = findEnclosingInterface(route.methodNode) ?? findEnclosingClass(route.methodNode);
|
|
555
|
+
const classMethods = typeNode ? (classHttpMethodsByTypeId.get(typeNode.id) ?? ['*']) : ['*'];
|
|
556
|
+
return intersectSpringHttpMethods(classMethods, [route.httpMethod]).map((httpMethod) => ({
|
|
557
|
+
...route,
|
|
558
|
+
httpMethod,
|
|
559
|
+
}));
|
|
560
|
+
});
|
|
486
561
|
// `@RequestMapping` on a Feign interface is the fallback prefix, but only when
|
|
487
562
|
// the interface has no `@FeignClient(path)` of its own (path wins).
|
|
488
563
|
for (const { id, prefix } of interfaceRequestMappingPrefixes) {
|
|
@@ -493,7 +568,7 @@ function scanRouteAnnotations(tree) {
|
|
|
493
568
|
prefixByTypeId,
|
|
494
569
|
feignPrefixByInterfaceId,
|
|
495
570
|
httpExchangePrefixByTypeId,
|
|
496
|
-
methodRoutes,
|
|
571
|
+
methodRoutes: constrainedMethodRoutes,
|
|
497
572
|
requestLines,
|
|
498
573
|
exchangeRoutes,
|
|
499
574
|
};
|
|
@@ -600,7 +675,7 @@ export const JAVA_HTTP_PLUGIN = {
|
|
|
600
675
|
const out = [];
|
|
601
676
|
// ─── Spring providers + OpenFeign consumers (one query pass) ────
|
|
602
677
|
// `scanRouteAnnotations` resolves every route-defining annotation —
|
|
603
|
-
// class/interface prefixes, method
|
|
678
|
+
// class/interface prefixes, method shortcut/`@RequestMapping`s and native
|
|
604
679
|
// `@RequestLine`s — from a single `matches()` pass over the tree.
|
|
605
680
|
const { prefixByTypeId, feignPrefixByInterfaceId, httpExchangePrefixByTypeId, methodRoutes, requestLines, exchangeRoutes, } = scanRouteAnnotations(tree);
|
|
606
681
|
// A `@(Get|...)Mapping` inside a `@FeignClient` interface is an OpenFeign
|
|
@@ -611,12 +686,14 @@ export const JAVA_HTTP_PLUGIN = {
|
|
|
611
686
|
for (const route of methodRoutes) {
|
|
612
687
|
const enclosingInterface = findEnclosingInterface(route.methodNode);
|
|
613
688
|
if (enclosingInterface && hasAnnotation(enclosingInterface, 'FeignClient')) {
|
|
689
|
+
if (!route.feignHttpMethod)
|
|
690
|
+
continue;
|
|
614
691
|
const prefixes = feignPrefixByInterfaceId.get(enclosingInterface.id) ?? [''];
|
|
615
692
|
for (const prefix of prefixes) {
|
|
616
693
|
out.push({
|
|
617
694
|
role: 'consumer',
|
|
618
695
|
framework: OPENFEIGN_FRAMEWORK,
|
|
619
|
-
method: route.
|
|
696
|
+
method: route.feignHttpMethod,
|
|
620
697
|
path: joinPath(prefix, route.rawPath),
|
|
621
698
|
name: route.methodName,
|
|
622
699
|
line: route.methodNode.startPosition.row + 1,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import JavaScript from 'tree-sitter-javascript';
|
|
2
2
|
import TypeScript from 'tree-sitter-typescript';
|
|
3
3
|
import { compilePatterns, runCompiledPatterns, unquoteLiteral, } from '../tree-sitter-scanner.js';
|
|
4
|
+
import { DATA_ROUTE_TABLE_SOURCE, scanDataRouteTables, } from '../../../ingestion/route-extractors/data-route-table.js';
|
|
4
5
|
/**
|
|
5
6
|
* Node.js / TypeScript HTTP plugin family. Handles:
|
|
6
7
|
* - NestJS `@Controller('prefix')` classes with `@Get(':id')` methods
|
|
@@ -530,6 +531,24 @@ function scanBundle(bundle, tree) {
|
|
|
530
531
|
confidence: 0.7,
|
|
531
532
|
});
|
|
532
533
|
}
|
|
534
|
+
for (const route of scanDataRouteTables(tree)) {
|
|
535
|
+
const imported = route.handlerLocalName === undefined ? undefined : importMap.get(route.handlerLocalName);
|
|
536
|
+
out.push({
|
|
537
|
+
role: 'provider',
|
|
538
|
+
framework: DATA_ROUTE_TABLE_SOURCE,
|
|
539
|
+
method: route.method,
|
|
540
|
+
path: route.path,
|
|
541
|
+
// A source-only scan can prove a bare local/imported binding. Member
|
|
542
|
+
// ownership needs the semantic model, so leave it unattributed here;
|
|
543
|
+
// the graph-backed path consumes the exact handlerSymbolId later.
|
|
544
|
+
name: imported?.name ?? (route.handlerLocalName === undefined ? null : route.handlerName),
|
|
545
|
+
...(imported === undefined ? {} : { handlerImport: imported }),
|
|
546
|
+
strictHandlerResolution: true,
|
|
547
|
+
...(route.handlerLocalName === undefined ? { unresolvedHandler: true } : {}),
|
|
548
|
+
line: route.line,
|
|
549
|
+
confidence: 0.8,
|
|
550
|
+
});
|
|
551
|
+
}
|
|
533
552
|
return out;
|
|
534
553
|
}
|
|
535
554
|
export const JAVASCRIPT_HTTP_PLUGIN = {
|
|
@@ -56,6 +56,14 @@ export interface HttpDetection {
|
|
|
56
56
|
name: string;
|
|
57
57
|
module: string;
|
|
58
58
|
};
|
|
59
|
+
/** Resolve only from the registration file or exact import target; never guess repo-wide. */
|
|
60
|
+
strictHandlerResolution?: boolean;
|
|
61
|
+
/**
|
|
62
|
+
* The plugin saw a provider handler designator but could not prove its owner.
|
|
63
|
+
* Prevents the orchestrator from treating it as an anonymous inline handler
|
|
64
|
+
* and attributing it to the containing registrar function.
|
|
65
|
+
*/
|
|
66
|
+
unresolvedHandler?: boolean;
|
|
59
67
|
/** Confidence in (0, 1]. Source-scan plugins typically use 0.7–0.8. */
|
|
60
68
|
confidence: number;
|
|
61
69
|
}
|