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
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Detects execution flows (Processes) in the code graph by:
|
|
5
5
|
* 1. Finding entry points (functions with no internal callers)
|
|
6
|
-
* 2. Tracing forward via CALLS edges (
|
|
6
|
+
* 2. Tracing forward via CALLS edges (DFS)
|
|
7
7
|
* 3. Grouping and deduplicating similar paths
|
|
8
8
|
* 4. Labeling with heuristic names
|
|
9
9
|
*
|
|
@@ -19,6 +19,16 @@ const DEFAULT_CONFIG = {
|
|
|
19
19
|
maxProcesses: 75,
|
|
20
20
|
minSteps: 3, // 3+ steps = genuine multi-hop flow (2-step is just "A calls B")
|
|
21
21
|
};
|
|
22
|
+
/** Zeroed counters, mutated in place by the walk. */
|
|
23
|
+
const emptyTruncation = () => ({
|
|
24
|
+
truncated: false,
|
|
25
|
+
entryPointCandidatesDropped: 0,
|
|
26
|
+
entryPointsUnexplored: 0,
|
|
27
|
+
walksCutByBudget: 0,
|
|
28
|
+
tracesDepthCapped: 0,
|
|
29
|
+
calleesDropped: 0,
|
|
30
|
+
processesDropped: 0,
|
|
31
|
+
});
|
|
22
32
|
// ============================================================================
|
|
23
33
|
// MAIN PROCESSOR
|
|
24
34
|
// ============================================================================
|
|
@@ -27,8 +37,16 @@ const DEFAULT_CONFIG = {
|
|
|
27
37
|
*
|
|
28
38
|
* This runs AFTER community detection, using CALLS edges to trace flows.
|
|
29
39
|
*/
|
|
30
|
-
export const processProcesses = async (knowledgeGraph, memberships, onProgress, config = {}
|
|
40
|
+
export const processProcesses = async (knowledgeGraph, memberships, onProgress, config = {},
|
|
41
|
+
/**
|
|
42
|
+
* Places the program reaches outward — fetch calls and ORM queries, each with
|
|
43
|
+
* a file and a line (R3-6). Attributed to their enclosing function to form the
|
|
44
|
+
* sink set; omitted, behaviour is exactly as before.
|
|
45
|
+
*/
|
|
46
|
+
outwardActionSites = []) => {
|
|
31
47
|
const cfg = { ...DEFAULT_CONFIG, ...config };
|
|
48
|
+
const sinkFunctions = buildSinkFunctionSet(knowledgeGraph, outwardActionSites);
|
|
49
|
+
const isSink = (nodeId) => sinkFunctions.has(nodeId);
|
|
32
50
|
onProgress?.('Finding entry points...', 0);
|
|
33
51
|
// Build lookup maps
|
|
34
52
|
const membershipMap = new Map();
|
|
@@ -38,31 +56,153 @@ export const processProcesses = async (knowledgeGraph, memberships, onProgress,
|
|
|
38
56
|
const nodeMap = new Map();
|
|
39
57
|
for (const n of knowledgeGraph.iterNodes())
|
|
40
58
|
nodeMap.set(n.id, n);
|
|
59
|
+
// Declared before Step 1 because `findEntryPoints` has a ceiling of its own
|
|
60
|
+
// (see `ENTRY_POINT_CANDIDATE_LIMIT`) and reports it through the same record.
|
|
61
|
+
const truncation = emptyTruncation();
|
|
41
62
|
// Step 1: Find entry points (functions that call others but have few callers)
|
|
42
|
-
const entryPoints = findEntryPoints(knowledgeGraph, reverseCallsEdges, callsEdges);
|
|
63
|
+
const entryPoints = findEntryPoints(knowledgeGraph, reverseCallsEdges, callsEdges, truncation);
|
|
43
64
|
onProgress?.(`Found ${entryPoints.length} entry points, tracing flows...`, 20);
|
|
44
65
|
onProgress?.(`Found ${entryPoints.length} entry points, tracing flows...`, 20);
|
|
45
66
|
// Step 2: Trace processes from each entry point
|
|
46
67
|
const allTraces = [];
|
|
68
|
+
let tracedEntryPoints = 0;
|
|
47
69
|
for (let i = 0; i < entryPoints.length && allTraces.length < cfg.maxProcesses * 2; i++) {
|
|
48
70
|
const entryId = entryPoints[i];
|
|
49
|
-
const traces = traceFromEntryPoint(entryId, callsEdges, cfg);
|
|
71
|
+
const traces = traceFromEntryPoint(entryId, callsEdges, cfg, isSink, truncation);
|
|
72
|
+
tracedEntryPoints = i + 1;
|
|
50
73
|
// Filter out traces that are too short
|
|
51
74
|
traces.filter((t) => t.length >= cfg.minSteps).forEach((t) => allTraces.push(t));
|
|
52
75
|
if (i % 10 === 0) {
|
|
53
76
|
onProgress?.(`Tracing entry point ${i + 1}/${entryPoints.length}...`, 20 + (i / entryPoints.length) * 40);
|
|
54
77
|
}
|
|
55
78
|
}
|
|
79
|
+
// The loop exits on the TRACE quota, not on running out of entry points, so
|
|
80
|
+
// the remainder are not "no flows found" — they were never looked at.
|
|
81
|
+
//
|
|
82
|
+
// Counted over the list `findEntryPoints` RETURNS, which is already capped at
|
|
83
|
+
// `ENTRY_POINT_CANDIDATE_LIMIT`; candidates beyond that cap are invisible here
|
|
84
|
+
// by construction and are reported separately as
|
|
85
|
+
// `entryPointCandidatesDropped`.
|
|
86
|
+
truncation.entryPointsUnexplored = entryPoints.length - tracedEntryPoints;
|
|
56
87
|
onProgress?.(`Found ${allTraces.length} traces, deduplicating...`, 60);
|
|
57
88
|
// Step 3: Deduplicate similar traces (subset removal)
|
|
58
|
-
const uniqueTraces = deduplicateTraces(allTraces);
|
|
89
|
+
const uniqueTraces = deduplicateTraces(allTraces, isSink);
|
|
59
90
|
// Step 3b: Deduplicate by entry+terminal pair (keep longest path per pair)
|
|
60
91
|
const endpointDeduped = deduplicateByEndpoints(uniqueTraces);
|
|
61
92
|
onProgress?.(`Deduped ${uniqueTraces.length} → ${endpointDeduped.length} unique endpoint pairs`, 70);
|
|
62
|
-
// Step 4: Limit to max processes
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
93
|
+
// Step 4: Limit to max processes — deepest first, but ROUND-ROBIN across
|
|
94
|
+
// TERMINALS (R2-3).
|
|
95
|
+
//
|
|
96
|
+
// Ranking was `sort by length` alone, and the top of that list was one
|
|
97
|
+
// behaviour described many ways: measured on the reporting repo, eleven of
|
|
98
|
+
// the top fourteen processes were four entry points crossed with three
|
|
99
|
+
// terminals of the same date-window utility cluster — `Handle ->
|
|
100
|
+
// AlignWindowEnd`, `Main -> AlignWindowStart`, `ProcessSymbol ->
|
|
101
|
+
// ResolveGridIntervalMs`. Genuine call chains, but a reader learns one thing
|
|
102
|
+
// from fourteen entries.
|
|
103
|
+
//
|
|
104
|
+
// Keyed on the TERMINAL, not the entry point. Keying on the entry was tried
|
|
105
|
+
// first and made it worse — many files declare a `main`, so each was a
|
|
106
|
+
// distinct entry that round-robin then awarded its own slot, and
|
|
107
|
+
// `Main -> AlignWindowEnd` went from one row to eight. The repetition was
|
|
108
|
+
// never in where a flow starts; it is in where flows pile up.
|
|
109
|
+
//
|
|
110
|
+
// Depth still orders within a terminal and still leads the list, since
|
|
111
|
+
// insertion order here is deepest-first. What changes is that no terminal
|
|
112
|
+
// takes a second slot until every other has had a first. Measured: distinct
|
|
113
|
+
// terminals in the top 20 went 3 -> 20, and the repo's own domain flows
|
|
114
|
+
// (`ReconcilePositions -> ...`) moved into the top 4%.
|
|
115
|
+
//
|
|
116
|
+
// What this does NOT do, recorded so it does not read as settled: the
|
|
117
|
+
// reported cause — ranking rewarding fan-in, promoting chains ending in
|
|
118
|
+
// widely-called helpers — measured FALSE. Those terminals have one caller
|
|
119
|
+
// each (`alignWindowStart` 1, `validateSymbol` 1). A fan-in discount was
|
|
120
|
+
// implemented against that hypothesis and moved nothing.
|
|
121
|
+
//
|
|
122
|
+
// R3-6 adds one rule ahead of depth: a SINK-terminated trace outranks a
|
|
123
|
+
// leaf-terminated one. A flow that ends where the program does something —
|
|
124
|
+
// places an order, writes a row — is what a reader came for; a chain that
|
|
125
|
+
// ends in a date helper is where control happened to stop. Depth still orders
|
|
126
|
+
// within each group.
|
|
127
|
+
//
|
|
128
|
+
// This is what closed the gap that used to be described here as out of reach:
|
|
129
|
+
// a business flow could not be a process in its own right, because the walk
|
|
130
|
+
// emitted only at a leaf, at max depth, or on a cycle, so a flow whose
|
|
131
|
+
// meaningful endpoint calls onward survived only as whatever leaf it bottomed
|
|
132
|
+
// out in. Ranking could never fix it — the flow was not a candidate to rank.
|
|
133
|
+
// It is bounded honestly rather than fully closed: sinks are exactly where
|
|
134
|
+
// fetch/ORM extraction fires (see `buildSinkFunctionSet`), so a codebase whose
|
|
135
|
+
// outward calls are not detected as such still sees leaf-terminated traces
|
|
136
|
+
// only.
|
|
137
|
+
// DETERMINISM. The comparator below ranks by sink-ness then by depth, and for
|
|
138
|
+
// two flows equal on both it returned 0. `Array.prototype.sort` is stable, so
|
|
139
|
+
// a 0 preserves INPUT order — which traces back to `graph.iterNodes()`, i.e.
|
|
140
|
+
// the order files happened to be inserted. Under `maxProcesses` capping that
|
|
141
|
+
// decided which `Process` and `STEP_IN_PROCESS` nodes were persisted at all.
|
|
142
|
+
//
|
|
143
|
+
// Reproduced: two equal three-step flows with `maxProcesses: 1` select
|
|
144
|
+
// `handleAlpha`; inserting the identical nodes and CALLS edges in reverse
|
|
145
|
+
// select `handleBeta`. Same repository, same commit, different persisted
|
|
146
|
+
// graph — so an incremental run that reorders assembly, or a filesystem that
|
|
147
|
+
// enumerates differently, silently changes what the tool reports.
|
|
148
|
+
//
|
|
149
|
+
// The id is the tiebreak because it is the only totally-ordered, content-derived
|
|
150
|
+
// key available here; comparing the whole path keeps it stable when two traces
|
|
151
|
+
// share a terminal.
|
|
152
|
+
//
|
|
153
|
+
// MUTATION STATUS, recorded so nobody mistakes this for a verified guard:
|
|
154
|
+
// removing THIS tiebreak alone fails nothing, because the two dedup sorts
|
|
155
|
+
// below already impose a total order on the list that reaches here. The
|
|
156
|
+
// entry-point sort and the dedup sorts each ARE individually verified. This
|
|
157
|
+
// one is kept as defence in depth — it cannot misbehave (it only makes an
|
|
158
|
+
// already-deterministic order explicit) and it is what stops a future change
|
|
159
|
+
// to dedup ordering from silently re-opening the defect.
|
|
160
|
+
//
|
|
161
|
+
// Decorated once and sorted on the precomputed key rather than joining inside
|
|
162
|
+
// the comparator — see `traceOrderKey` for why the key exists at all and
|
|
163
|
+
// `sortByDepthThenPath` for why it is built exactly once per trace. The sink
|
|
164
|
+
// test is hoisted for the same reason: it ran twice per comparison.
|
|
165
|
+
const tracesByTerminal = new Map();
|
|
166
|
+
const rankedByInterest = (() => {
|
|
167
|
+
const decorated = endpointDeduped.map((trace) => ({
|
|
168
|
+
trace,
|
|
169
|
+
sink: isSink(trace[trace.length - 1] ?? '') ? 1 : 0,
|
|
170
|
+
key: traceOrderKey(trace),
|
|
171
|
+
}));
|
|
172
|
+
decorated.sort((a, b) => b.sink - a.sink || b.trace.length - a.trace.length || compareOrderKeys(a.key, b.key));
|
|
173
|
+
return decorated.map((d) => d.trace);
|
|
174
|
+
})();
|
|
175
|
+
for (const trace of rankedByInterest) {
|
|
176
|
+
const terminalId = trace[trace.length - 1];
|
|
177
|
+
if (terminalId === undefined)
|
|
178
|
+
continue;
|
|
179
|
+
const existing = tracesByTerminal.get(terminalId);
|
|
180
|
+
if (existing === undefined)
|
|
181
|
+
tracesByTerminal.set(terminalId, [trace]);
|
|
182
|
+
else
|
|
183
|
+
existing.push(trace);
|
|
184
|
+
}
|
|
185
|
+
// Insertion order is deepest-trace-first, so the round-robin visits terminals
|
|
186
|
+
// in that order too and depth still leads the list.
|
|
187
|
+
const limitedTraces = [];
|
|
188
|
+
for (let round = 0; limitedTraces.length < cfg.maxProcesses; round++) {
|
|
189
|
+
let addedAny = false;
|
|
190
|
+
for (const traces of tracesByTerminal.values()) {
|
|
191
|
+
const trace = traces[round];
|
|
192
|
+
if (trace === undefined)
|
|
193
|
+
continue;
|
|
194
|
+
limitedTraces.push(trace);
|
|
195
|
+
addedAny = true;
|
|
196
|
+
if (limitedTraces.length >= cfg.maxProcesses)
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
if (!addedAny)
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
// Counted against the DEDUPED input, not `allTraces`: the difference between
|
|
203
|
+
// those two is deduplication doing its job, which is not truncation.
|
|
204
|
+
const dedupedAvailable = [...tracesByTerminal.values()].reduce((n, t) => n + t.length, 0);
|
|
205
|
+
truncation.processesDropped = dedupedAvailable - limitedTraces.length;
|
|
66
206
|
onProgress?.(`Creating ${limitedTraces.length} process nodes...`, 80);
|
|
67
207
|
// Step 5: Create process nodes
|
|
68
208
|
const processes = [];
|
|
@@ -113,6 +253,24 @@ export const processProcesses = async (knowledgeGraph, memberships, onProgress,
|
|
|
113
253
|
const avgStepCount = processes.length > 0
|
|
114
254
|
? processes.reduce((sum, p) => sum + p.stepCount, 0) / processes.length
|
|
115
255
|
: 0;
|
|
256
|
+
// Derived last, from the counters the walk accumulated, so a new ceiling added
|
|
257
|
+
// later cannot be forgotten here — it only has to increment its own counter.
|
|
258
|
+
//
|
|
259
|
+
// That claim was wrong when it was written: `findEntryPoints`' 200-candidate
|
|
260
|
+
// slice was an EXISTING ceiling with no counter, so it was not merely
|
|
261
|
+
// forgettable, it had already been forgotten. Adding a counter is only half
|
|
262
|
+
// the discipline; the other half is checking, when you write a line like this,
|
|
263
|
+
// that every cap in the file actually has one.
|
|
264
|
+
truncation.truncated =
|
|
265
|
+
truncation.entryPointCandidatesDropped > 0 ||
|
|
266
|
+
truncation.entryPointsUnexplored > 0 ||
|
|
267
|
+
truncation.walksCutByBudget > 0 ||
|
|
268
|
+
truncation.tracesDepthCapped > 0 ||
|
|
269
|
+
truncation.calleesDropped > 0 ||
|
|
270
|
+
truncation.processesDropped > 0;
|
|
271
|
+
if (truncation.truncated) {
|
|
272
|
+
logger.debug({ truncation }, 'process-processor: detection was truncated by one or more caps');
|
|
273
|
+
}
|
|
116
274
|
return {
|
|
117
275
|
processes,
|
|
118
276
|
steps,
|
|
@@ -121,6 +279,7 @@ export const processProcesses = async (knowledgeGraph, memberships, onProgress,
|
|
|
121
279
|
crossCommunityCount,
|
|
122
280
|
avgStepCount: Math.round(avgStepCount * 10) / 10,
|
|
123
281
|
entryPointsFound: entryPoints.length,
|
|
282
|
+
truncation,
|
|
124
283
|
},
|
|
125
284
|
};
|
|
126
285
|
};
|
|
@@ -132,28 +291,37 @@ export const processProcesses = async (knowledgeGraph, memberships, onProgress,
|
|
|
132
291
|
const MIN_TRACE_CONFIDENCE = 0.5;
|
|
133
292
|
const buildCallsGraph = (graph) => {
|
|
134
293
|
const adj = new Map();
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
294
|
+
// Field-wise scan (#2680) — whole-graph walk, four fields, no object needed.
|
|
295
|
+
graph.forEachRelationshipFields((sourceId, targetId, type, confidence) => {
|
|
296
|
+
if (type !== 'CALLS' || confidence < MIN_TRACE_CONFIDENCE)
|
|
297
|
+
return;
|
|
298
|
+
const existing = adj.get(sourceId);
|
|
299
|
+
if (existing === undefined)
|
|
300
|
+
adj.set(sourceId, [targetId]);
|
|
301
|
+
else
|
|
302
|
+
existing.push(targetId);
|
|
303
|
+
});
|
|
143
304
|
return adj;
|
|
144
305
|
};
|
|
145
306
|
const buildReverseCallsGraph = (graph) => {
|
|
146
307
|
const adj = new Map();
|
|
147
|
-
|
|
148
|
-
if (
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
adj.
|
|
153
|
-
|
|
154
|
-
|
|
308
|
+
graph.forEachRelationshipFields((sourceId, targetId, type, confidence) => {
|
|
309
|
+
if (type !== 'CALLS' || confidence < MIN_TRACE_CONFIDENCE)
|
|
310
|
+
return;
|
|
311
|
+
const existing = adj.get(targetId);
|
|
312
|
+
if (existing === undefined)
|
|
313
|
+
adj.set(targetId, [sourceId]);
|
|
314
|
+
else
|
|
315
|
+
existing.push(sourceId);
|
|
316
|
+
});
|
|
155
317
|
return adj;
|
|
156
318
|
};
|
|
319
|
+
/**
|
|
320
|
+
* How many ranked candidates survive to be traced. Everything below this line
|
|
321
|
+
* is discarded — see `ProcessTruncationStats.entryPointCandidatesDropped`, the
|
|
322
|
+
* counter that exists because this cap spent a release being invisible.
|
|
323
|
+
*/
|
|
324
|
+
const ENTRY_POINT_CANDIDATE_LIMIT = 200;
|
|
157
325
|
/**
|
|
158
326
|
* Find functions/methods that are good entry points for tracing.
|
|
159
327
|
*
|
|
@@ -164,7 +332,15 @@ const buildReverseCallsGraph = (graph) => {
|
|
|
164
332
|
*
|
|
165
333
|
* Test files are excluded entirely.
|
|
166
334
|
*/
|
|
167
|
-
const findEntryPoints = (graph, reverseCallsEdges, callsEdges
|
|
335
|
+
const findEntryPoints = (graph, reverseCallsEdges, callsEdges,
|
|
336
|
+
/**
|
|
337
|
+
* Mutated in place when the candidate cap fires. Optional and reported
|
|
338
|
+
* through an out-parameter rather than a richer return value, matching
|
|
339
|
+
* `traceFromEntryPoint`: the `string[]` contract every caller already uses is
|
|
340
|
+
* unchanged, and a caller that does not care about completeness does not have
|
|
341
|
+
* to unwrap a counter to ask for entry points.
|
|
342
|
+
*/
|
|
343
|
+
truncation) => {
|
|
168
344
|
const symbolTypes = new Set(['Function', 'Method']);
|
|
169
345
|
const entryPointCandidates = [];
|
|
170
346
|
for (const node of graph.iterNodes()) {
|
|
@@ -191,8 +367,12 @@ const findEntryPoints = (graph, reverseCallsEdges, callsEdges) => {
|
|
|
191
367
|
entryPointCandidates.push({ id: node.id, score, reasons });
|
|
192
368
|
}
|
|
193
369
|
}
|
|
194
|
-
// Sort by score descending
|
|
195
|
-
|
|
370
|
+
// Sort by score descending, then by node id. Ties on score are common — most
|
|
371
|
+
// candidates share a heuristic bucket — and a stable sort resolves them by
|
|
372
|
+
// `iterNodes()` order, so which entry points survive the `slice` below became
|
|
373
|
+
// a function of file insertion order. See the determinism note on
|
|
374
|
+
// `rankedByInterest`.
|
|
375
|
+
const sorted = entryPointCandidates.sort((a, b) => b.score - a.score || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
|
|
196
376
|
// DEBUG: Log top candidates with new scoring details
|
|
197
377
|
if (sorted.length > 0 && isDev) {
|
|
198
378
|
logger.info(`[Process] Top 10 entry point candidates (new scoring):`);
|
|
@@ -204,24 +384,66 @@ const findEntryPoints = (graph, reverseCallsEdges, callsEdges) => {
|
|
|
204
384
|
logger.info(` score: ${c.score.toFixed(2)} = [${c.reasons.join(' × ')}]`);
|
|
205
385
|
});
|
|
206
386
|
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
387
|
+
// Limit to prevent explosion — and SAY SO. This is the ceiling that decides
|
|
388
|
+
// how much of a repository process detection ever looks at: on anything with
|
|
389
|
+
// more than 200 scoring candidates the reported flows are a sample of the
|
|
390
|
+
// top-ranked ones, and every downstream count (`entryPointsFound`,
|
|
391
|
+
// `entryPointsUnexplored`) is computed over the survivors, so none of them can
|
|
392
|
+
// see what was cut here.
|
|
393
|
+
if (truncation !== undefined && sorted.length > ENTRY_POINT_CANDIDATE_LIMIT) {
|
|
394
|
+
truncation.entryPointCandidatesDropped = sorted.length - ENTRY_POINT_CANDIDATE_LIMIT;
|
|
395
|
+
}
|
|
396
|
+
return sorted.slice(0, ENTRY_POINT_CANDIDATE_LIMIT).map((c) => c.id);
|
|
210
397
|
};
|
|
211
398
|
// ============================================================================
|
|
212
|
-
// HELPER: Trace from entry point (
|
|
399
|
+
// HELPER: Trace from entry point (DFS)
|
|
213
400
|
// ============================================================================
|
|
214
401
|
/**
|
|
215
|
-
* Trace forward from an entry point using
|
|
402
|
+
* Trace forward from an entry point using DEPTH-first search.
|
|
216
403
|
* Returns all distinct paths up to maxDepth.
|
|
217
404
|
*/
|
|
218
|
-
|
|
405
|
+
// Exported for tests ONLY: traversal order is the whole behaviour here, and it
|
|
406
|
+
// is unobservable through `processProcesses` because `findEntryPoints` supplies
|
|
407
|
+
// several starting points — a deep chain gets traced from inside it regardless
|
|
408
|
+
// of order, so a test at that level passes under either traversal and pins
|
|
409
|
+
// nothing.
|
|
410
|
+
export const traceFromEntryPoint = (entryId, callsEdges, config,
|
|
411
|
+
/**
|
|
412
|
+
* Functions that reach outward (R3-6). A trace also ENDS here, even though
|
|
413
|
+
* the walk continues past it: a flow whose meaningful endpoint calls onward
|
|
414
|
+
* was otherwise never a candidate, only ever surviving as whatever leaf it
|
|
415
|
+
* bottomed out in.
|
|
416
|
+
*/
|
|
417
|
+
isSink = () => false,
|
|
418
|
+
/**
|
|
419
|
+
* Mutated in place when a ceiling fires. Optional so the many direct callers
|
|
420
|
+
* in tests are unchanged, and because a caller that does not care about
|
|
421
|
+
* completeness should not have to invent a counter to ask for a trace.
|
|
422
|
+
*/
|
|
423
|
+
truncation) => {
|
|
219
424
|
const traces = [];
|
|
220
|
-
//
|
|
221
|
-
//
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
425
|
+
// DEPTH-first, not breadth-first. Each stack item: [currentNodeId, pathSoFar].
|
|
426
|
+
//
|
|
427
|
+
// The walk stops after a fixed NUMBER of traces, so the traversal order
|
|
428
|
+
// decides which traces those are. Breadth-first reaches every shallow
|
|
429
|
+
// terminal before any deep one, so the quota filled with the shortest paths
|
|
430
|
+
// in the graph and the walk stopped — `maxTraceDepth` was never approached.
|
|
431
|
+
// Measured on a 75k-node repo: of 300 processes, none exceeded 7 steps and
|
|
432
|
+
// 90% were 3-4, so a multi-hop business flow (signal → order → exit) had no
|
|
433
|
+
// process that could represent it, and `query` could only rank the mechanical
|
|
434
|
+
// pairs that did exist.
|
|
435
|
+
//
|
|
436
|
+
// Depth-first descends to a terminal first, so the same quota is spent on
|
|
437
|
+
// paths worth keeping. Cost is unchanged — same budget, same cycle guard,
|
|
438
|
+
// same `maxTraceDepth` ceiling — only the ORDER of exploration differs, and
|
|
439
|
+
// the caller already sorts by length and dedupes by endpoint, so it was
|
|
440
|
+
// always asking for the deepest traces this walk could give it.
|
|
441
|
+
// A LIFO stack, not a queue — the name followed the traversal when this was
|
|
442
|
+
// breadth-first and was left behind by the change to depth-first.
|
|
443
|
+
const stack = [[entryId, [entryId]]];
|
|
444
|
+
const traceBudget = config.maxBranching * 3;
|
|
445
|
+
while (stack.length > 0 && traces.length < traceBudget) {
|
|
446
|
+
const [currentId, path] = stack.pop();
|
|
225
447
|
// Get outgoing calls
|
|
226
448
|
const callees = callsEdges.get(currentId) || [];
|
|
227
449
|
if (callees.length === 0) {
|
|
@@ -231,19 +453,41 @@ const traceFromEntryPoint = (entryId, callsEdges, config) => {
|
|
|
231
453
|
}
|
|
232
454
|
}
|
|
233
455
|
else if (path.length >= config.maxTraceDepth) {
|
|
234
|
-
// Max depth reached - save what we have
|
|
456
|
+
// Max depth reached - save what we have. The trace is kept, but it is a
|
|
457
|
+
// PREFIX of a longer flow rather than a flow that ended, and only this
|
|
458
|
+
// counter distinguishes the two downstream.
|
|
459
|
+
if (truncation !== undefined)
|
|
460
|
+
truncation.tracesDepthCapped++;
|
|
235
461
|
if (path.length >= config.minSteps) {
|
|
236
462
|
traces.push([...path]);
|
|
237
463
|
}
|
|
238
464
|
}
|
|
239
465
|
else {
|
|
466
|
+
// A SINK ends a trace without ending the walk (R3-6). Emitting here is
|
|
467
|
+
// what lets `placeOrder` be an endpoint while `placeOrder -> formatDate`
|
|
468
|
+
// still exists as its own longer trace; the two answer different
|
|
469
|
+
// questions and neither should suppress the other.
|
|
470
|
+
if (isSink(currentId) && path.length >= config.minSteps) {
|
|
471
|
+
traces.push([...path]);
|
|
472
|
+
}
|
|
240
473
|
// Continue tracing - limit branching
|
|
241
474
|
const limitedCallees = callees.slice(0, config.maxBranching);
|
|
475
|
+
if (truncation !== undefined && callees.length > limitedCallees.length) {
|
|
476
|
+
truncation.calleesDropped += callees.length - limitedCallees.length;
|
|
477
|
+
}
|
|
242
478
|
let addedBranch = false;
|
|
243
|
-
|
|
479
|
+
// PUSHED IN REVERSE so the stack POPS them in source order. `slice`
|
|
480
|
+
// selects the first N callees while `pop()` takes the last pushed, so
|
|
481
|
+
// without this the walk spends its trace budget on the LAST-declared
|
|
482
|
+
// branch first: for `main() { init(); loadConfig(); run(); shutdown(); }`
|
|
483
|
+
// it explores `shutdown` first and can exhaust the quota before reaching
|
|
484
|
+
// `init` — dropping the earliest steps of a flow, which is the opposite
|
|
485
|
+
// of what a process is meant to describe. Selecting the first N and then
|
|
486
|
+
// exploring them last-first was simply inconsistent.
|
|
487
|
+
for (const calleeId of [...limitedCallees].reverse()) {
|
|
244
488
|
// Avoid cycles
|
|
245
489
|
if (!path.includes(calleeId)) {
|
|
246
|
-
|
|
490
|
+
stack.push([calleeId, [...path, calleeId]]);
|
|
247
491
|
addedBranch = true;
|
|
248
492
|
}
|
|
249
493
|
}
|
|
@@ -253,8 +497,130 @@ const traceFromEntryPoint = (entryId, callsEdges, config) => {
|
|
|
253
497
|
}
|
|
254
498
|
}
|
|
255
499
|
}
|
|
500
|
+
// A silently truncating cap reads as "this is everything", which is the same
|
|
501
|
+
// class of confident-empty answer this work is about. The repo already sets
|
|
502
|
+
// this precedent for `dispatchFanoutSkipped` and
|
|
503
|
+
// `propertyDispatch.skippedKeys`.
|
|
504
|
+
//
|
|
505
|
+
// The debug line stays for the per-entry-point detail (which entry, how many
|
|
506
|
+
// branches); the counter is what escapes to a CONSUMER. A log nobody has
|
|
507
|
+
// enabled is not a disclosure.
|
|
508
|
+
if (stack.length > 0) {
|
|
509
|
+
if (truncation !== undefined)
|
|
510
|
+
truncation.walksCutByBudget++;
|
|
511
|
+
logger.debug({ entryId, traceBudget, unexploredBranches: stack.length }, 'process-processor: trace budget exhausted; unexplored branches remain for this entry point');
|
|
512
|
+
}
|
|
256
513
|
return traces;
|
|
257
514
|
};
|
|
515
|
+
const CALLABLE_SINK_LABELS = new Set([
|
|
516
|
+
'Function',
|
|
517
|
+
'Method',
|
|
518
|
+
'Constructor',
|
|
519
|
+
]);
|
|
520
|
+
/**
|
|
521
|
+
* Functions that DO something outward — issue a request, run a query (R3-6).
|
|
522
|
+
*
|
|
523
|
+
* The missing layer behind "business flows are never processes". A trace is
|
|
524
|
+
* only emitted at a node with NO outgoing calls, so a real flow — scan, score,
|
|
525
|
+
* arm, place the order — is always a PREFIX of some longer chain that runs on
|
|
526
|
+
* into date helpers and formatters, and can never be a process in its own
|
|
527
|
+
* right. Ending a trace somewhere meaningful needs a notion of an endpoint that
|
|
528
|
+
* is not a leaf, and the walk had none.
|
|
529
|
+
*
|
|
530
|
+
* GitNexus already knew where the program reaches outward: the parse phase
|
|
531
|
+
* collects fetch calls and ORM queries carrying `filePath` + `lineNumber`. Those
|
|
532
|
+
* facts only ever produced FILE-level edges (`File -[FETCHES]-> Route`), which
|
|
533
|
+
* is too coarse to end a trace on — every function in a file containing one
|
|
534
|
+
* would qualify. Attributing each site to the function whose range CONTAINS it
|
|
535
|
+
* turns the same facts into the function-level signal the walk needs, with no
|
|
536
|
+
* new extraction, no new relation pair, and no schema change.
|
|
537
|
+
*
|
|
538
|
+
* Innermost wins: a nested closure that performs the call is the sink, not the
|
|
539
|
+
* outer function that merely spans it.
|
|
540
|
+
*/
|
|
541
|
+
export function buildSinkFunctionSet(graph, sites) {
|
|
542
|
+
const sinks = new Set();
|
|
543
|
+
if (sites.length === 0)
|
|
544
|
+
return sinks;
|
|
545
|
+
const byFile = new Map();
|
|
546
|
+
for (const node of graph.iterNodes()) {
|
|
547
|
+
if (!CALLABLE_SINK_LABELS.has(node.label))
|
|
548
|
+
continue;
|
|
549
|
+
const props = node.properties;
|
|
550
|
+
if (typeof props.filePath !== 'string')
|
|
551
|
+
continue;
|
|
552
|
+
if (typeof props.startLine !== 'number' || typeof props.endLine !== 'number')
|
|
553
|
+
continue;
|
|
554
|
+
const entry = { id: node.id, start: props.startLine, end: props.endLine };
|
|
555
|
+
const list = byFile.get(props.filePath);
|
|
556
|
+
if (list === undefined)
|
|
557
|
+
byFile.set(props.filePath, [entry]);
|
|
558
|
+
else
|
|
559
|
+
list.push(entry);
|
|
560
|
+
}
|
|
561
|
+
for (const site of sites) {
|
|
562
|
+
const candidates = byFile.get(site.filePath);
|
|
563
|
+
if (candidates === undefined)
|
|
564
|
+
continue;
|
|
565
|
+
let best;
|
|
566
|
+
for (const c of candidates) {
|
|
567
|
+
if (site.lineNumber < c.start || site.lineNumber > c.end)
|
|
568
|
+
continue;
|
|
569
|
+
if (best === undefined || c.end - c.start < best.end - best.start)
|
|
570
|
+
best = c;
|
|
571
|
+
}
|
|
572
|
+
if (best !== undefined)
|
|
573
|
+
sinks.add(best.id);
|
|
574
|
+
}
|
|
575
|
+
return sinks;
|
|
576
|
+
}
|
|
577
|
+
// ============================================================================
|
|
578
|
+
// HELPER: Deterministic trace ordering
|
|
579
|
+
// ============================================================================
|
|
580
|
+
/**
|
|
581
|
+
* Total-order key for a trace — the TIEBREAK every trace sort in this file uses.
|
|
582
|
+
*
|
|
583
|
+
* NUL is the separator, and that is load-bearing rather than cosmetic. Node ids
|
|
584
|
+
* embed file paths and a path may contain a SPACE, so a space-joined key is
|
|
585
|
+
* ambiguous in exactly the way `traceKey`'s unpadded `->` join was (#2894):
|
|
586
|
+
* `['A B', 'C']` and `['A', 'B C']` both render as `A B C`, the comparator
|
|
587
|
+
* returns 0, and `Array.prototype.sort` — being stable — falls straight back to
|
|
588
|
+
* the input order the tiebreak exists to remove. Two of the three trace sorts
|
|
589
|
+
* here joined on a space and had that hole; all three now share this key.
|
|
590
|
+
*
|
|
591
|
+
* NUL cannot occur in a node id (not in a POSIX path, not in a source
|
|
592
|
+
* identifier) and sorts below every character that can, so joining on it is
|
|
593
|
+
* order-equivalent to comparing the two arrays element by element. That
|
|
594
|
+
* equivalence is what makes it a drop-in for the space-joined keys: on any
|
|
595
|
+
* corpus without the collision above the resulting order is IDENTICAL, which is
|
|
596
|
+
* asserted directly in `process-processor.test.ts`.
|
|
597
|
+
*/
|
|
598
|
+
const traceOrderKey = (trace) => trace.join('\u0000');
|
|
599
|
+
/** Lexicographic compare of two `traceOrderKey` results. */
|
|
600
|
+
const compareOrderKeys = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
|
|
601
|
+
/**
|
|
602
|
+
* Sort traces deepest-first, breaking ties on the path key.
|
|
603
|
+
*
|
|
604
|
+
* A Schwartzian transform: the key is built ONCE per trace and the comparator
|
|
605
|
+
* only compares two strings. Written the obvious way — `a.join(sep) <
|
|
606
|
+
* b.join(sep)` inside the comparator — each comparison allocates up to FOUR
|
|
607
|
+
* joined strings, so an O(n log n) sort performs O(n log n) joins of
|
|
608
|
+
* O(depth x id-length) characters each.
|
|
609
|
+
*
|
|
610
|
+
* `n` is bounded here (`ENTRY_POINT_CANDIDATE_LIMIT` entry points x the
|
|
611
|
+
* per-entry trace budget), so the cost is small and once-per-analyze: measured
|
|
612
|
+
* at the ceiling, 23,851 comparisons performed 70,524 joins, and end-to-end
|
|
613
|
+
* `processProcesses` at 80,000 functions / 640k CALLS went 456 -> 555 ms. It is
|
|
614
|
+
* fixed anyway because it is the same allocation-in-the-comparator shape that
|
|
615
|
+
* was just removed from `deduplicateTraces` below (deep_chain 1233 -> 102 ms),
|
|
616
|
+
* and leaving one instance of it standing next to that comment invites the next
|
|
617
|
+
* one.
|
|
618
|
+
*/
|
|
619
|
+
const sortByDepthThenPath = (traces) => {
|
|
620
|
+
const decorated = traces.map((trace) => ({ trace, key: traceOrderKey(trace) }));
|
|
621
|
+
decorated.sort((a, b) => b.trace.length - a.trace.length || compareOrderKeys(a.key, b.key));
|
|
622
|
+
return decorated.map((d) => d.trace);
|
|
623
|
+
};
|
|
258
624
|
// ============================================================================
|
|
259
625
|
// HELPER: Deduplicate traces
|
|
260
626
|
// ============================================================================
|
|
@@ -262,21 +628,65 @@ const traceFromEntryPoint = (entryId, callsEdges, config) => {
|
|
|
262
628
|
* Merge traces that are subsets of other traces.
|
|
263
629
|
* Keep longer traces, remove redundant shorter ones.
|
|
264
630
|
*/
|
|
265
|
-
const deduplicateTraces = (traces
|
|
631
|
+
export const deduplicateTraces = (traces,
|
|
632
|
+
/** See `buildSinkFunctionSet` — a sink-terminated trace survives subsumption. */
|
|
633
|
+
isSink = () => false) => {
|
|
266
634
|
if (traces.length === 0)
|
|
267
635
|
return [];
|
|
268
|
-
// Sort by length descending
|
|
269
|
-
|
|
636
|
+
// Sort by length descending, then by path, so equal-length traces have a
|
|
637
|
+
// total order instead of inheriting graph-traversal order (determinism note
|
|
638
|
+
// on `rankedByInterest`). Which of two equal traces is kept as the
|
|
639
|
+
// representative is otherwise decided by insertion order.
|
|
640
|
+
const sorted = sortByDepthThenPath(traces);
|
|
270
641
|
const unique = [];
|
|
642
|
+
// Keys for `unique`, built ONCE per surviving trace rather than once per
|
|
643
|
+
// COMPARISON. The join used to sit inside the `some()` callback below, so
|
|
644
|
+
// every already-kept trace had its key rebuilt from scratch against every
|
|
645
|
+
// candidate — O(T*U) joins of O(depth * id-length) characters, and it is that
|
|
646
|
+
// allocation, not the substring scan, that dominates the pass.
|
|
647
|
+
//
|
|
648
|
+
// Nothing about breadth-first search made that safe; it only kept the cost
|
|
649
|
+
// small by keeping traces short. Measured on this repo, the walk went from an
|
|
650
|
+
// average of 4.3 steps to 9.4 when D1 made it depth-first, which roughly
|
|
651
|
+
// doubles both the number of surviving traces and the length of every key —
|
|
652
|
+
// so the same quadratic that was affordable under BFS is ~6x the work under
|
|
653
|
+
// DFS. Hoisting the join removes the multiplication entirely.
|
|
654
|
+
const uniqueKeys = [];
|
|
271
655
|
for (const trace of sorted) {
|
|
656
|
+
// A SINK-TERMINATED trace is never redundant (R3-6), even though it is by
|
|
657
|
+
// definition a prefix of the longer chain that runs on past the sink into
|
|
658
|
+
// helpers. That is the whole shape of a business flow — scan, score, arm,
|
|
659
|
+
// PLACE THE ORDER — so subsuming it here is exactly what kept such flows
|
|
660
|
+
// from ever being processes. Emitting one at the walk and deleting it one
|
|
661
|
+
// step later would have been a no-op fix.
|
|
662
|
+
const terminal = trace[trace.length - 1];
|
|
663
|
+
// PADDED with the separator on both ends, so `includes` can only match whole
|
|
664
|
+
// steps (#2894). Unpadded, the test is not anchored to a step boundary and a
|
|
665
|
+
// match may begin in the MIDDLE of a node id:
|
|
666
|
+
//
|
|
667
|
+
// 'X->AA->B'.includes('A->B') -> true
|
|
668
|
+
//
|
|
669
|
+
// which discards `A -> B` as redundant against a chain `A` is not a step of
|
|
670
|
+
// at all. Measured inert on every corpus tried — the collision needs one id
|
|
671
|
+
// to be a strict suffix of another, which real ids
|
|
672
|
+
// (`Function:<path>:<name>`) do not produce — but the predicate did not mean
|
|
673
|
+
// what the surrounding code says it means, and this is a function whose
|
|
674
|
+
// entire job is deciding what to delete.
|
|
675
|
+
//
|
|
676
|
+
// Note the encoding assumes `->` never appears IN a node id. A C++
|
|
677
|
+
// `operator->` would defeat the join regardless of padding; out of scope
|
|
678
|
+
// here, but the assumption is real.
|
|
679
|
+
const traceKey = `->${trace.join('->')}->`;
|
|
680
|
+
if (terminal !== undefined && isSink(terminal)) {
|
|
681
|
+
unique.push(trace);
|
|
682
|
+
uniqueKeys.push(traceKey);
|
|
683
|
+
continue;
|
|
684
|
+
}
|
|
272
685
|
// Check if this trace is a subset of any already-added trace
|
|
273
|
-
const
|
|
274
|
-
const isSubset = unique.some((existing) => {
|
|
275
|
-
const existingKey = existing.join('->');
|
|
276
|
-
return existingKey.includes(traceKey);
|
|
277
|
-
});
|
|
686
|
+
const isSubset = uniqueKeys.some((existingKey) => existingKey.includes(traceKey));
|
|
278
687
|
if (!isSubset) {
|
|
279
688
|
unique.push(trace);
|
|
689
|
+
uniqueKeys.push(traceKey);
|
|
280
690
|
}
|
|
281
691
|
}
|
|
282
692
|
return unique;
|
|
@@ -292,8 +702,10 @@ const deduplicateByEndpoints = (traces) => {
|
|
|
292
702
|
if (traces.length === 0)
|
|
293
703
|
return [];
|
|
294
704
|
const byEndpoints = new Map();
|
|
295
|
-
// Sort longest first so the first seen per key is the longest
|
|
296
|
-
|
|
705
|
+
// Sort longest first so the first seen per key is the longest; the path
|
|
706
|
+
// tiebreak makes "which of two equal-length traces represents this endpoint
|
|
707
|
+
// pair" independent of insertion order.
|
|
708
|
+
const sorted = sortByDepthThenPath(traces);
|
|
297
709
|
for (const trace of sorted) {
|
|
298
710
|
const key = `${trace[0]}::${trace[trace.length - 1]}`;
|
|
299
711
|
if (!byEndpoints.has(key)) {
|