gitnexus 1.6.10-rc.99 → 1.6.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +177 -18
- package/dist/_shared/graph/types.d.ts +21 -2
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/index.d.ts +3 -3
- package/dist/_shared/index.d.ts.map +1 -1
- package/dist/_shared/index.js +1 -1
- package/dist/_shared/index.js.map +1 -1
- package/dist/_shared/integrations/circuit-breaker.d.ts.map +1 -1
- package/dist/_shared/integrations/circuit-breaker.js.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts +16 -0
- package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.js +19 -7
- package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
- package/dist/_shared/language-detection.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts +2 -2
- package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.js +3 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/scope-resolution/evidence-weights.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +5 -0
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js +315 -36
- package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts +115 -0
- package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/registries/field-registry.js.map +1 -1
- package/dist/_shared/scope-resolution/registries/lookup-core.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/registries/lookup-core.js +58 -2
- package/dist/_shared/scope-resolution/registries/lookup-core.js.map +1 -1
- package/dist/_shared/scope-resolution/registries/method-registry.js.map +1 -1
- package/dist/_shared/scope-resolution/scope-tree.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/scope-tree.js.map +1 -1
- package/dist/_shared/scope-resolution/symbol-definition.d.ts +47 -0
- package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/types.d.ts +278 -3
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +3 -2
- package/dist/cli/ai-context.js +71 -16
- package/dist/cli/analyze-config.d.ts +1 -1
- package/dist/cli/analyze-options.d.ts +131 -0
- package/dist/cli/analyze-options.js +1 -0
- package/dist/cli/analyze.d.ts +21 -113
- package/dist/cli/analyze.js +172 -29
- package/dist/cli/cli-message.d.ts +1 -1
- package/dist/cli/detect-changes-format.js +19 -2
- package/dist/cli/doctor.d.ts +12 -0
- package/dist/cli/doctor.js +32 -5
- package/dist/cli/editor-targets.js +6 -0
- package/dist/cli/eval-server.js +2 -1
- package/dist/cli/format-symbol.d.ts +15 -0
- package/dist/cli/format-symbol.js +17 -0
- package/dist/cli/generated-skill.d.ts +17 -0
- package/dist/cli/generated-skill.js +1 -0
- package/dist/cli/group.js +229 -21
- package/dist/cli/help-i18n.js +1 -2
- package/dist/cli/i18n/en.d.ts +11 -9
- package/dist/cli/i18n/en.js +13 -9
- package/dist/cli/i18n/resources.d.ts +15 -11
- package/dist/cli/i18n/zh-CN.d.ts +4 -2
- package/dist/cli/i18n/zh-CN.js +11 -9
- package/dist/cli/index.js +8 -4
- package/dist/cli/resolve-invocation.d.ts +7 -3
- package/dist/cli/resolve-invocation.js +7 -3
- package/dist/cli/setup.js +4 -3
- package/dist/cli/skill-gen.d.ts +1 -6
- package/dist/cli/tool.d.ts +1 -0
- package/dist/cli/tool.js +74 -17
- package/dist/cli/wiki.js +53 -10
- package/dist/config/ignore-service.d.ts +2 -0
- package/dist/config/ignore-service.js +54 -13
- package/dist/core/analyzer-identity.d.ts +80 -0
- package/dist/core/analyzer-identity.js +364 -26
- package/dist/core/augmentation/engine.js +86 -71
- package/dist/core/embedding-checkpoint.d.ts +143 -0
- package/dist/core/embedding-checkpoint.js +221 -0
- package/dist/core/embedding-count.d.ts +61 -0
- package/dist/core/embedding-count.js +69 -0
- package/dist/core/embeddings/ast-utils.js +9 -1
- package/dist/core/embeddings/embedding-pipeline.d.ts +8 -0
- package/dist/core/embeddings/embedding-pipeline.js +253 -14
- package/dist/core/embeddings/http-client.d.ts +5 -0
- package/dist/core/embeddings/http-client.js +142 -27
- package/dist/core/graph/graph.js +3 -0
- package/dist/core/graph/import-cycles.d.ts +194 -3
- package/dist/core/graph/import-cycles.js +522 -73
- package/dist/core/graph/types.d.ts +18 -0
- package/dist/core/group/bridge-db.d.ts +204 -1
- package/dist/core/group/bridge-db.js +401 -28
- package/dist/core/group/completeness.d.ts +130 -0
- package/dist/core/group/completeness.js +83 -0
- package/dist/core/group/config-parser.js +0 -5
- package/dist/core/group/cross-impact.d.ts +46 -1
- package/dist/core/group/cross-impact.js +220 -19
- package/dist/core/group/cross-trace.d.ts +32 -11
- package/dist/core/group/cross-trace.js +114 -20
- package/dist/core/group/extractors/http-patterns/java.js +278 -22
- package/dist/core/group/extractors/http-patterns/node.js +332 -216
- package/dist/core/group/extractors/http-patterns/types.d.ts +8 -0
- package/dist/core/group/extractors/http-route-extractor.d.ts +1 -0
- package/dist/core/group/extractors/http-route-extractor.js +122 -48
- package/dist/core/group/extractors/include-extractor.js +20 -2
- package/dist/core/group/extractors/manifest-extractor.d.ts +1 -1
- package/dist/core/group/extractors/manifest-extractor.js +7 -7
- package/dist/core/group/extractors/python-workspace-extractor.js +5 -2
- package/dist/core/group/group-lock.d.ts +31 -0
- package/dist/core/group/group-lock.js +166 -0
- package/dist/core/group/service.js +297 -16
- package/dist/core/group/storage.d.ts +3 -0
- package/dist/core/group/storage.js +7 -39
- package/dist/core/group/sync.d.ts +49 -3
- package/dist/core/group/sync.js +0 -0
- package/dist/core/group/types.d.ts +183 -8
- package/dist/core/group/types.js +28 -1
- package/dist/core/incremental/subgraph-extract.d.ts +9 -6
- package/dist/core/incremental/subgraph-extract.js +33 -10
- package/dist/core/index-freshness.d.ts +77 -2
- package/dist/core/index-freshness.js +109 -2
- package/dist/core/ingestion/call-processor.d.ts +13 -1
- package/dist/core/ingestion/call-processor.js +110 -3
- package/dist/core/ingestion/cfg/callee-cell-format.d.ts +42 -0
- package/dist/core/ingestion/cfg/callee-cell-format.js +42 -0
- package/dist/core/ingestion/cfg/emit.d.ts +8 -23
- package/dist/core/ingestion/cfg/emit.js +9 -23
- package/dist/core/ingestion/class-extractors/configs/go.js +10 -5
- package/dist/core/ingestion/cluster-enricher.js +8 -4
- package/dist/core/ingestion/community-processor.d.ts +21 -3
- package/dist/core/ingestion/community-processor.js +81 -82
- package/dist/core/ingestion/di-extractors/index.d.ts +9 -33
- package/dist/core/ingestion/di-extractors/spring.d.ts +1 -1
- package/dist/core/ingestion/di-extractors/spring.js +8 -1
- package/dist/core/ingestion/di-extractors/types.d.ts +60 -0
- package/dist/core/ingestion/di-extractors/types.js +15 -0
- package/dist/core/ingestion/filesystem-walker.js +30 -14
- package/dist/core/ingestion/finalize-orchestrator.js +1 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +6 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +35 -1
- package/dist/core/ingestion/frameworks/spring/annotation-arguments.d.ts +13 -0
- package/dist/core/ingestion/frameworks/spring/annotation-arguments.js +227 -0
- package/dist/core/ingestion/frameworks/spring/aop-candidates.d.ts +15 -0
- package/dist/core/ingestion/frameworks/spring/aop-candidates.js +85 -0
- package/dist/core/ingestion/frameworks/spring/aop.d.ts +118 -0
- package/dist/core/ingestion/frameworks/spring/aop.js +476 -0
- package/dist/core/ingestion/frameworks/spring/auto-configuration.d.ts +8 -0
- package/dist/core/ingestion/frameworks/spring/auto-configuration.js +16 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.js +1 -0
- package/dist/core/ingestion/frameworks/spring/bean-factories.d.ts +33 -0
- package/dist/core/ingestion/frameworks/spring/bean-factories.js +65 -0
- package/dist/core/ingestion/frameworks/spring/conditionals.d.ts +25 -0
- package/dist/core/ingestion/frameworks/spring/conditionals.js +319 -0
- package/dist/core/ingestion/frameworks/spring/di-metadata.d.ts +3 -0
- package/dist/core/ingestion/frameworks/spring/di-metadata.js +162 -13
- package/dist/core/ingestion/frameworks/spring/non-http-handlers.d.ts +28 -0
- package/dist/core/ingestion/frameworks/spring/non-http-handlers.js +152 -0
- package/dist/core/ingestion/frameworks/spring/resource-injection.d.ts +5 -0
- package/dist/core/ingestion/frameworks/spring/resource-injection.js +91 -0
- package/dist/core/ingestion/import-resolvers/configs/csharp.js +5 -1
- package/dist/core/ingestion/import-resolvers/configs/swift.js +13 -0
- package/dist/core/ingestion/import-resolvers/csharp.d.ts +9 -1
- package/dist/core/ingestion/import-resolvers/csharp.js +234 -27
- package/dist/core/ingestion/import-resolvers/go.d.ts +11 -1
- package/dist/core/ingestion/import-resolvers/go.js +44 -17
- package/dist/core/ingestion/import-resolvers/jvm.d.ts +2 -2
- package/dist/core/ingestion/import-resolvers/node-workspace-packages.d.ts +90 -0
- package/dist/core/ingestion/import-resolvers/node-workspace-packages.js +429 -0
- package/dist/core/ingestion/import-resolvers/package-dir-index.d.ts +124 -0
- package/dist/core/ingestion/import-resolvers/package-dir-index.js +223 -0
- package/dist/core/ingestion/import-resolvers/pass-cache.d.ts +50 -0
- package/dist/core/ingestion/import-resolvers/pass-cache.js +60 -0
- package/dist/core/ingestion/import-resolvers/per-file-set.d.ts +71 -0
- package/dist/core/ingestion/import-resolvers/per-file-set.js +11 -0
- package/dist/core/ingestion/import-resolvers/php.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/php.js +65 -19
- package/dist/core/ingestion/import-resolvers/python-file-index.d.ts +201 -0
- package/dist/core/ingestion/import-resolvers/python-file-index.js +302 -0
- package/dist/core/ingestion/import-resolvers/python.js +25 -6
- package/dist/core/ingestion/import-resolvers/ruby.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/rust.d.ts +2 -2
- package/dist/core/ingestion/import-resolvers/standard.d.ts +1 -1
- package/dist/core/ingestion/import-resolvers/types.d.ts +1 -12
- package/dist/core/ingestion/import-resolvers/utils.d.ts +65 -6
- package/dist/core/ingestion/import-resolvers/utils.js +215 -36
- package/dist/core/ingestion/import-resolvers/workspace-file-index.d.ts +72 -0
- package/dist/core/ingestion/import-resolvers/workspace-file-index.js +58 -0
- package/dist/core/ingestion/language-config.d.ts +29 -1
- package/dist/core/ingestion/language-config.js +110 -35
- package/dist/core/ingestion/language-provider.d.ts +209 -7
- package/dist/core/ingestion/language-provider.js +37 -0
- package/dist/core/ingestion/languages/c/captures.js +7 -0
- package/dist/core/ingestion/languages/c/import-target.js +12 -16
- package/dist/core/ingestion/languages/c/scope-resolver.js +20 -19
- package/dist/core/ingestion/languages/c/static-linkage.js +12 -16
- package/dist/core/ingestion/languages/c-cpp.js +13 -0
- package/dist/core/ingestion/languages/cobol/scope-resolver.js +27 -20
- package/dist/core/ingestion/languages/cobol.js +13 -0
- package/dist/core/ingestion/languages/cpp/adl.d.ts +2 -2
- package/dist/core/ingestion/languages/cpp/adl.js +67 -44
- package/dist/core/ingestion/languages/cpp/captures.js +14 -2
- package/dist/core/ingestion/languages/cpp/file-local-linkage.js +11 -15
- package/dist/core/ingestion/languages/cpp/inline-namespaces.d.ts +28 -8
- package/dist/core/ingestion/languages/cpp/inline-namespaces.js +242 -68
- package/dist/core/ingestion/languages/cpp/interpret.d.ts +2 -0
- package/dist/core/ingestion/languages/cpp/interpret.js +126 -6
- package/dist/core/ingestion/languages/cpp/query.js +106 -0
- package/dist/core/ingestion/languages/cpp/scope-resolver.js +48 -20
- package/dist/core/ingestion/languages/csharp/accessor-unwrap.d.ts +2 -15
- package/dist/core/ingestion/languages/csharp/accessor-unwrap.js +18 -10
- package/dist/core/ingestion/languages/csharp/captures.js +19 -0
- package/dist/core/ingestion/languages/csharp/import-target.js +46 -72
- package/dist/core/ingestion/languages/csharp/namespace-siblings.js +5 -1
- package/dist/core/ingestion/languages/csharp/query.js +25 -5
- package/dist/core/ingestion/languages/csharp/scope-resolver.js +75 -2
- package/dist/core/ingestion/languages/dart/captures.d.ts +10 -0
- package/dist/core/ingestion/languages/dart/captures.js +598 -16
- package/dist/core/ingestion/languages/dart/import-target.js +32 -9
- package/dist/core/ingestion/languages/dart/index.d.ts +1 -1
- package/dist/core/ingestion/languages/dart/index.js +1 -1
- package/dist/core/ingestion/languages/dart/query.js +98 -1
- package/dist/core/ingestion/languages/dart/scope-resolver.js +14 -3
- package/dist/core/ingestion/languages/dart/simple-hooks.js +9 -0
- package/dist/core/ingestion/languages/dart.js +6 -1
- package/dist/core/ingestion/languages/go/captures.js +108 -3
- package/dist/core/ingestion/languages/go/generic-type-parameters.d.ts +31 -0
- package/dist/core/ingestion/languages/go/generic-type-parameters.js +140 -0
- package/dist/core/ingestion/languages/go/import-target.d.ts +3 -10
- package/dist/core/ingestion/languages/go/import-target.js +34 -30
- package/dist/core/ingestion/languages/go/index.d.ts +1 -1
- package/dist/core/ingestion/languages/go/interface-impls.d.ts +9 -1
- package/dist/core/ingestion/languages/go/interface-impls.js +693 -87
- package/dist/core/ingestion/languages/go/interpret.d.ts +2 -0
- package/dist/core/ingestion/languages/go/interpret.js +22 -8
- package/dist/core/ingestion/languages/go/method-owners.js +31 -12
- package/dist/core/ingestion/languages/go/package-clause.d.ts +46 -0
- package/dist/core/ingestion/languages/go/package-clause.js +75 -0
- package/dist/core/ingestion/languages/go/package-siblings.js +7 -11
- package/dist/core/ingestion/languages/go/query.js +56 -3
- package/dist/core/ingestion/languages/go/scope-resolver.js +39 -0
- package/dist/core/ingestion/languages/go.js +9 -0
- package/dist/core/ingestion/languages/java/analysis-features.d.ts +4 -0
- package/dist/core/ingestion/languages/java/analysis-features.js +12 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +12 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +48 -0
- package/dist/core/ingestion/languages/java/captures.js +77 -32
- package/dist/core/ingestion/languages/java/import-target.d.ts +49 -9
- package/dist/core/ingestion/languages/java/import-target.js +68 -88
- package/dist/core/ingestion/languages/java/interpret.js +3 -2
- package/dist/core/ingestion/languages/java/module-resolution.d.ts +62 -0
- package/dist/core/ingestion/languages/java/module-resolution.js +142 -0
- package/dist/core/ingestion/languages/java/query.js +15 -3
- package/dist/core/ingestion/languages/java/record-components.d.ts +14 -0
- package/dist/core/ingestion/languages/java/record-components.js +185 -0
- package/dist/core/ingestion/languages/java/scope-resolver.js +10 -2
- package/dist/core/ingestion/languages/java/spring-aop.d.ts +12 -0
- package/dist/core/ingestion/languages/java/spring-aop.js +49 -0
- package/dist/core/ingestion/languages/java/spring-conditionals.d.ts +11 -0
- package/dist/core/ingestion/languages/java/spring-conditionals.js +48 -0
- package/dist/core/ingestion/languages/java/spring-di.d.ts +4 -1
- package/dist/core/ingestion/languages/java/spring-di.js +41 -9
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.d.ts +7 -0
- package/dist/core/ingestion/languages/java/spring-non-http-handlers.js +32 -0
- package/dist/core/ingestion/languages/java.js +94 -3
- package/dist/core/ingestion/languages/javascript/captures.d.ts +6 -1
- package/dist/core/ingestion/languages/javascript/captures.js +262 -4
- package/dist/core/ingestion/languages/javascript/import-target.d.ts +17 -21
- package/dist/core/ingestion/languages/javascript/import-target.js +24 -41
- package/dist/core/ingestion/languages/javascript/index.d.ts +54 -5
- package/dist/core/ingestion/languages/javascript/index.js +54 -5
- package/dist/core/ingestion/languages/javascript/query.d.ts +1 -0
- package/dist/core/ingestion/languages/javascript/query.js +211 -5
- package/dist/core/ingestion/languages/javascript/scope-resolver.js +12 -0
- package/dist/core/ingestion/languages/javascript/simple-hooks.js +2 -1
- package/dist/core/ingestion/languages/jvm/package-siblings.js +77 -9
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +15 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +48 -0
- package/dist/core/ingestion/languages/kotlin/captures.js +43 -1
- package/dist/core/ingestion/languages/kotlin/import-target.d.ts +8 -1
- package/dist/core/ingestion/languages/kotlin/import-target.js +20 -123
- package/dist/core/ingestion/languages/kotlin/index.d.ts +1 -0
- package/dist/core/ingestion/languages/kotlin/index.js +1 -0
- package/dist/core/ingestion/languages/kotlin/module-resolution.d.ts +22 -0
- package/dist/core/ingestion/languages/kotlin/module-resolution.js +108 -0
- package/dist/core/ingestion/languages/kotlin/query.js +28 -2
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +23 -2
- package/dist/core/ingestion/languages/kotlin/spring-aop.d.ts +12 -0
- package/dist/core/ingestion/languages/kotlin/spring-aop.js +64 -0
- package/dist/core/ingestion/languages/kotlin/spring-conditionals.d.ts +12 -0
- package/dist/core/ingestion/languages/kotlin/spring-conditionals.js +49 -0
- package/dist/core/ingestion/languages/kotlin/spring-di.d.ts +2 -0
- package/dist/core/ingestion/languages/kotlin/spring-di.js +60 -11
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.d.ts +10 -0
- package/dist/core/ingestion/languages/kotlin/spring-non-http-handlers.js +41 -0
- package/dist/core/ingestion/languages/php/captures.d.ts +5 -0
- package/dist/core/ingestion/languages/php/captures.js +319 -51
- package/dist/core/ingestion/languages/php/import-target.d.ts +3 -4
- package/dist/core/ingestion/languages/php/import-target.js +192 -62
- package/dist/core/ingestion/languages/php/query.js +31 -0
- package/dist/core/ingestion/languages/python/arity-metadata.d.ts +1 -0
- package/dist/core/ingestion/languages/python/arity-metadata.js +1 -0
- package/dist/core/ingestion/languages/python/captures.js +29 -0
- package/dist/core/ingestion/languages/python/import-decomposer.js +22 -1
- package/dist/core/ingestion/languages/python/import-target.d.ts +42 -1
- package/dist/core/ingestion/languages/python/import-target.js +277 -91
- package/dist/core/ingestion/languages/python/index.d.ts +1 -1
- package/dist/core/ingestion/languages/python/index.js +1 -1
- package/dist/core/ingestion/languages/python/interpret.d.ts +52 -0
- package/dist/core/ingestion/languages/python/interpret.js +249 -7
- package/dist/core/ingestion/languages/python/query.js +9 -0
- package/dist/core/ingestion/languages/python/receiver-binding.d.ts +8 -6
- package/dist/core/ingestion/languages/python/receiver-binding.js +108 -12
- package/dist/core/ingestion/languages/python/scope-resolver.js +27 -4
- package/dist/core/ingestion/languages/python/simple-hooks.js +2 -8
- package/dist/core/ingestion/languages/python.js +13 -0
- package/dist/core/ingestion/languages/ruby/captures.js +158 -0
- package/dist/core/ingestion/languages/ruby/import-target.js +7 -5
- package/dist/core/ingestion/languages/ruby/query.js +93 -0
- package/dist/core/ingestion/languages/ruby/scope-resolver.js +2 -0
- package/dist/core/ingestion/languages/ruby/simple-hooks.d.ts +1 -1
- package/dist/core/ingestion/languages/ruby/simple-hooks.js +22 -1
- package/dist/core/ingestion/languages/rust/captures.js +39 -1
- package/dist/core/ingestion/languages/rust/method-owners.js +11 -1
- package/dist/core/ingestion/languages/rust/module-path.d.ts +126 -0
- package/dist/core/ingestion/languages/rust/module-path.js +214 -0
- package/dist/core/ingestion/languages/rust/qualified-call.d.ts +41 -0
- package/dist/core/ingestion/languages/rust/qualified-call.js +481 -0
- package/dist/core/ingestion/languages/rust/query.js +39 -6
- package/dist/core/ingestion/languages/rust/scope-resolver.js +21 -2
- package/dist/core/ingestion/languages/rust.js +17 -0
- package/dist/core/ingestion/languages/swift/captures.js +87 -3
- package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.d.ts +48 -0
- package/dist/core/ingestion/languages/swift/conditional-directive-preprocess.js +253 -0
- package/dist/core/ingestion/languages/swift/import-target.js +4 -9
- package/dist/core/ingestion/languages/swift/query.js +17 -0
- package/dist/core/ingestion/languages/swift/receiver-binding.d.ts +8 -0
- package/dist/core/ingestion/languages/swift/receiver-binding.js +6 -2
- package/dist/core/ingestion/languages/swift.js +2 -0
- package/dist/core/ingestion/languages/typescript/captures.d.ts +90 -1
- package/dist/core/ingestion/languages/typescript/captures.js +267 -5
- package/dist/core/ingestion/languages/typescript/cjs-export-assignment.d.ts +134 -0
- package/dist/core/ingestion/languages/typescript/cjs-export-assignment.js +523 -0
- package/dist/core/ingestion/languages/typescript/cjs-module-exports.d.ts +54 -0
- package/dist/core/ingestion/languages/typescript/cjs-module-exports.js +191 -0
- package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.d.ts +7 -0
- package/dist/core/ingestion/languages/typescript/convex-endpoint-metadata.js +92 -0
- package/dist/core/ingestion/languages/typescript/file-candidates.d.ts +29 -0
- package/dist/core/ingestion/languages/typescript/file-candidates.js +70 -0
- package/dist/core/ingestion/languages/typescript/import-decomposer.d.ts +28 -1
- package/dist/core/ingestion/languages/typescript/import-decomposer.js +125 -10
- package/dist/core/ingestion/languages/typescript/import-target.d.ts +25 -37
- package/dist/core/ingestion/languages/typescript/import-target.js +24 -26
- package/dist/core/ingestion/languages/typescript/interpret.d.ts +21 -1
- package/dist/core/ingestion/languages/typescript/interpret.js +45 -5
- package/dist/core/ingestion/languages/typescript/module-resolution.d.ts +48 -0
- package/dist/core/ingestion/languages/typescript/module-resolution.js +171 -0
- package/dist/core/ingestion/languages/typescript/query.d.ts +1 -0
- package/dist/core/ingestion/languages/typescript/query.js +303 -14
- package/dist/core/ingestion/languages/typescript/receiver-binding.d.ts +17 -0
- package/dist/core/ingestion/languages/typescript/receiver-binding.js +27 -0
- package/dist/core/ingestion/languages/typescript/scope-resolver.js +27 -40
- package/dist/core/ingestion/languages/typescript/simple-hooks.d.ts +0 -10
- package/dist/core/ingestion/languages/typescript/simple-hooks.js +22 -22
- package/dist/core/ingestion/languages/typescript/tsconfig.d.ts +59 -0
- package/dist/core/ingestion/languages/typescript/tsconfig.js +292 -0
- package/dist/core/ingestion/languages/typescript.js +93 -2
- package/dist/core/ingestion/languages/vue/import-target.d.ts +6 -22
- package/dist/core/ingestion/languages/vue/import-target.js +11 -47
- package/dist/core/ingestion/languages/vue/scope-resolver.js +4 -2
- package/dist/core/ingestion/local-symbol-pruner.js +11 -11
- package/dist/core/ingestion/method-extractors/configs/csharp.js +1 -0
- package/dist/core/ingestion/method-extractors/generic.js +1 -0
- package/dist/core/ingestion/method-types.d.ts +16 -0
- package/dist/core/ingestion/pipeline-phases/di.d.ts +1 -1
- package/dist/core/ingestion/pipeline-phases/di.js +136 -21
- package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
- package/dist/core/ingestion/pipeline-phases/index.js +2 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +15 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +154 -4
- package/dist/core/ingestion/pipeline-phases/parse.js +5 -0
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +3 -2
- package/dist/core/ingestion/pipeline-phases/processes.js +91 -6
- package/dist/core/ingestion/pipeline-phases/routes.js +116 -25
- package/dist/core/ingestion/pipeline-phases/spring-aop.d.ts +34 -0
- package/dist/core/ingestion/pipeline-phases/spring-aop.js +439 -0
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +34 -0
- package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +255 -0
- package/dist/core/ingestion/pipeline-phases/types.d.ts +7 -0
- package/dist/core/ingestion/pipeline.d.ts +26 -2
- package/dist/core/ingestion/pipeline.js +60 -11
- package/dist/core/ingestion/process-processor.d.ts +109 -2
- package/dist/core/ingestion/process-processor.js +464 -52
- package/dist/core/ingestion/resolve-references.d.ts +6 -1
- package/dist/core/ingestion/resolve-references.js +66 -6
- package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +8 -2
- package/dist/core/ingestion/route-extractors/constant-resolver.js +11 -7
- package/dist/core/ingestion/route-extractors/data-route-table.d.ts +40 -0
- package/dist/core/ingestion/route-extractors/data-route-table.js +876 -0
- package/dist/core/ingestion/route-extractors/dispatch-guard.d.ts +96 -0
- package/dist/core/ingestion/route-extractors/dispatch-guard.js +1184 -0
- package/dist/core/ingestion/route-extractors/java-const-resolver.d.ts +114 -0
- package/dist/core/ingestion/route-extractors/java-const-resolver.js +569 -0
- package/dist/core/ingestion/route-extractors/js-const-resolver.d.ts +192 -0
- package/dist/core/ingestion/route-extractors/js-const-resolver.js +1033 -0
- package/dist/core/ingestion/route-extractors/nest.d.ts +53 -0
- package/dist/core/ingestion/route-extractors/nest.js +523 -0
- package/dist/core/ingestion/route-extractors/spring-shared.d.ts +11 -0
- package/dist/core/ingestion/route-extractors/spring-shared.js +89 -0
- package/dist/core/ingestion/route-extractors/spring.js +214 -29
- package/dist/core/ingestion/scope-extractor-bridge.js +9 -1
- package/dist/core/ingestion/scope-extractor.d.ts +22 -7
- package/dist/core/ingestion/scope-extractor.js +309 -15
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +311 -21
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.js +16 -5
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +12 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +47 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.d.ts +20 -15
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +280 -42
- package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.d.ts +123 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +171 -17
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.d.ts +58 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +137 -34
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +30 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +39 -1
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +18 -1
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +113 -18
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.d.ts +107 -5
- package/dist/core/ingestion/scope-resolution/passes/compound-receiver.js +590 -33
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +3 -0
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +101 -41
- package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.d.ts +34 -0
- package/dist/core/ingestion/scope-resolution/passes/imported-value-refs.js +62 -0
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +5 -1
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +8 -1
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +105 -5
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +931 -92
- package/dist/core/ingestion/scope-resolution/passes/return-shape-members.d.ts +58 -0
- package/dist/core/ingestion/scope-resolution/passes/return-shape-members.js +458 -0
- package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.d.ts +180 -0
- package/dist/core/ingestion/scope-resolution/passes/unique-name-properties.js +418 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +29 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +57 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +55 -1
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +241 -19
- package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +112 -2
- package/dist/core/ingestion/scope-resolution/resolution-outcome.js +38 -1
- package/dist/core/ingestion/scope-resolution/scope/namespace-targets.d.ts +25 -3
- package/dist/core/ingestion/scope-resolution/scope/namespace-targets.js +36 -16
- package/dist/core/ingestion/scope-resolution/scope/walkers.d.ts +210 -9
- package/dist/core/ingestion/scope-resolution/scope/walkers.js +905 -22
- package/dist/core/ingestion/scope-resolution/summary-maps.d.ts +28 -0
- package/dist/core/ingestion/scope-resolution/summary-maps.js +50 -0
- package/dist/core/ingestion/scope-resolution/undecided-satisfaction.d.ts +55 -0
- package/dist/core/ingestion/scope-resolution/undecided-satisfaction.js +37 -0
- package/dist/core/ingestion/scope-resolution/unresolved-receivers.d.ts +109 -0
- package/dist/core/ingestion/scope-resolution/unresolved-receivers.js +204 -0
- package/dist/core/ingestion/scope-resolution/utils/definition-id.d.ts +13 -0
- package/dist/core/ingestion/scope-resolution/utils/definition-id.js +19 -0
- package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.d.ts +171 -0
- package/dist/core/ingestion/scope-resolution/utils/generic-instantiation.js +218 -0
- package/dist/core/ingestion/scope-resolution/workspace-index-types.d.ts +34 -0
- package/dist/core/ingestion/scope-resolution/workspace-index-types.js +15 -0
- package/dist/core/ingestion/scope-resolution/workspace-index.d.ts +7 -20
- package/dist/core/ingestion/tree-sitter-queries.d.ts +11 -11
- package/dist/core/ingestion/tree-sitter-queries.js +678 -4
- package/dist/core/ingestion/type-env.js +11 -7
- package/dist/core/ingestion/type-extractors/shared.d.ts +17 -0
- package/dist/core/ingestion/type-extractors/shared.js +16 -0
- package/dist/core/ingestion/type-extractors/types.d.ts +12 -0
- package/dist/core/ingestion/type-extractors/typescript.d.ts +20 -0
- package/dist/core/ingestion/type-extractors/typescript.js +26 -0
- package/dist/core/ingestion/utils/ast-helpers.d.ts +297 -15
- package/dist/core/ingestion/utils/ast-helpers.js +578 -46
- package/dist/core/ingestion/utils/call-analysis.d.ts +27 -22
- package/dist/core/ingestion/utils/call-analysis.js +202 -7
- package/dist/core/ingestion/utils/callable-flow-captures.d.ts +59 -0
- package/dist/core/ingestion/utils/callable-flow-captures.js +51 -1
- package/dist/core/ingestion/utils/callable-labels.d.ts +25 -0
- package/dist/core/ingestion/utils/callable-labels.js +31 -0
- package/dist/core/ingestion/utils/effective-ram.d.ts +40 -0
- package/dist/core/ingestion/utils/effective-ram.js +58 -0
- package/dist/core/ingestion/utils/line-base.d.ts +14 -0
- package/dist/core/ingestion/utils/line-base.js +14 -0
- package/dist/core/ingestion/utils/method-props.d.ts +27 -4
- package/dist/core/ingestion/utils/method-props.js +29 -4
- package/dist/core/ingestion/utils/receiver-chain-captures.d.ts +31 -0
- package/dist/core/ingestion/utils/receiver-chain-captures.js +57 -0
- package/dist/core/ingestion/utils/receiver-chain-codec.d.ts +89 -0
- package/dist/core/ingestion/utils/receiver-chain-codec.js +182 -0
- package/dist/core/ingestion/utils/scope-tree-walk.d.ts +22 -0
- package/dist/core/ingestion/utils/scope-tree-walk.js +33 -0
- package/dist/core/ingestion/utils/template-arguments.d.ts +96 -0
- package/dist/core/ingestion/utils/template-arguments.js +196 -0
- package/dist/core/ingestion/utils/type-parameters.d.ts +49 -0
- package/dist/core/ingestion/utils/type-parameters.js +206 -0
- package/dist/core/ingestion/workers/callable-id.d.ts +80 -0
- package/dist/core/ingestion/workers/callable-id.js +125 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +14 -1
- package/dist/core/ingestion/workers/parse-worker.js +493 -54
- package/dist/core/ingestion/workers/worker-pool.d.ts +20 -27
- package/dist/core/ingestion/workers/worker-pool.js +91 -3
- package/dist/core/lbug/csv-generator.d.ts +27 -0
- package/dist/core/lbug/csv-generator.js +72 -17
- package/dist/core/lbug/extension-load-error.js +13 -2
- package/dist/core/lbug/extension-loader.d.ts +29 -0
- package/dist/core/lbug/extension-loader.js +31 -6
- package/dist/core/lbug/graph-emit-sink.d.ts +264 -0
- package/dist/core/lbug/graph-emit-sink.js +581 -0
- package/dist/core/lbug/lbug-adapter.d.ts +290 -11
- package/dist/core/lbug/lbug-adapter.js +652 -69
- package/dist/core/lbug/native-check.d.ts +21 -0
- package/dist/core/lbug/native-check.js +248 -32
- package/dist/core/lbug/pdg-emit-sink.d.ts +13 -4
- package/dist/core/lbug/pdg-emit-sink.js +21 -111
- package/dist/core/lbug/pool-adapter.d.ts +9 -0
- package/dist/core/lbug/pool-adapter.js +164 -14
- package/dist/core/lbug/query-batch.d.ts +75 -0
- package/dist/core/lbug/query-batch.js +102 -0
- package/dist/core/lbug/rel-pair-routing.d.ts +160 -2
- package/dist/core/lbug/rel-pair-routing.js +228 -10
- package/dist/core/lbug/schema.d.ts +163 -4
- package/dist/core/lbug/schema.js +404 -159
- package/dist/core/lbug/sync-csv-writer.d.ts +47 -0
- package/dist/core/lbug/sync-csv-writer.js +108 -0
- package/dist/core/run-analyze.d.ts +147 -0
- package/dist/core/run-analyze.js +1215 -179
- package/dist/core/search/bm25-index.d.ts +11 -0
- package/dist/core/search/bm25-index.js +60 -26
- package/dist/core/search/fts-indexes.d.ts +150 -9
- package/dist/core/search/fts-indexes.js +241 -23
- package/dist/core/wiki/graph-queries.js +145 -112
- package/dist/core/wiki/llm-client.d.ts +29 -3
- package/dist/core/wiki/llm-client.js +47 -12
- package/dist/core/wiki/prompts.d.ts +19 -0
- package/dist/core/wiki/prompts.js +20 -1
- package/dist/lib/utils.d.ts +113 -0
- package/dist/lib/utils.js +185 -0
- package/dist/mcp/local/aop-metadata.d.ts +77 -0
- package/dist/mcp/local/aop-metadata.js +227 -0
- package/dist/mcp/local/bean-metadata.d.ts +2 -1
- package/dist/mcp/local/bean-metadata.js +22 -1
- package/dist/mcp/local/convex-metadata.d.ts +8 -0
- package/dist/mcp/local/convex-metadata.js +45 -0
- package/dist/mcp/local/local-backend.d.ts +174 -11
- package/dist/mcp/local/local-backend.js +1678 -331
- package/dist/mcp/local/path-predicate.d.ts +19 -0
- package/dist/mcp/local/path-predicate.js +21 -0
- package/dist/mcp/local/pdg-impact.d.ts +132 -10
- package/dist/mcp/local/pdg-impact.js +391 -98
- package/dist/mcp/repository-policy.d.ts +1 -0
- package/dist/mcp/repository-policy.js +5 -0
- package/dist/mcp/resources.js +26 -4
- package/dist/mcp/server.js +23 -13
- package/dist/mcp/tools.d.ts +8 -0
- package/dist/mcp/tools.js +76 -23
- package/dist/server/analyze-job.d.ts +37 -2
- package/dist/server/analyze-job.js +13 -2
- package/dist/server/analyze-launch.d.ts +1 -1
- package/dist/server/analyze-launch.js +79 -10
- package/dist/server/analyze-worker-core.d.ts +1 -1
- package/dist/server/analyze-worker-core.js +10 -1
- package/dist/server/analyze-worker-ipc.d.ts +1 -1
- package/dist/server/analyze-worker-ipc.js +4 -0
- package/dist/server/analyze-worker-protocol.d.ts +59 -0
- package/dist/server/analyze-worker-protocol.js +1 -0
- package/dist/server/analyze-worker.d.ts +1 -17
- package/dist/server/api.d.ts +2 -11
- package/dist/server/api.js +164 -163
- package/dist/server/embed-run-outcome.d.ts +89 -0
- package/dist/server/embed-run-outcome.js +88 -0
- package/dist/server/git-clone.js +6 -2
- package/dist/server/middleware.d.ts +116 -9
- package/dist/server/middleware.js +291 -22
- package/dist/server/sse-progress.d.ts +41 -0
- package/dist/server/sse-progress.js +125 -0
- package/dist/storage/branch-index.d.ts +11 -6
- package/dist/storage/branch-index.js +15 -7
- package/dist/storage/file-hash.js +2 -2
- package/dist/storage/fs-atomic.d.ts +25 -0
- package/dist/storage/fs-atomic.js +42 -0
- package/dist/storage/git.d.ts +131 -0
- package/dist/storage/git.js +236 -2
- package/dist/storage/index-lock.d.ts +102 -0
- package/dist/storage/index-lock.js +660 -0
- package/dist/storage/parse-cache.js +588 -6
- package/dist/storage/parsedfile-store.js +76 -6
- package/dist/storage/repo-manager.d.ts +54 -441
- package/dist/storage/repo-manager.js +312 -221
- package/dist/storage/repo-meta.d.ts +530 -0
- package/dist/storage/repo-meta.js +100 -0
- package/dist/types/pipeline.d.ts +37 -0
- package/hooks/antigravity/gitnexus-antigravity-hook.cjs +1 -1
- package/hooks/claude/gitnexus-hook.cjs +1 -1
- package/hooks/claude/resolve-analyze-cmd.cjs +80 -13
- package/package.json +11 -2
- package/scripts/cross-platform-shard.ts +153 -0
- package/scripts/cross-platform-tests.ts +122 -0
- package/scripts/run-cross-platform.ts +16 -5
- package/skills/gitnexus-cli.md +3 -3
- package/skills/gitnexus-debugging.md +37 -7
- package/skills/gitnexus-exploring.md +26 -4
- package/skills/gitnexus-impact-analysis.md +71 -10
- package/skills/gitnexus-plan/README.md +11 -6
- package/skills/gitnexus-plan/references/evidence-provenance.md +49 -12
- package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +654 -372
- package/skills/gitnexus-refactoring.md +48 -5
- package/skills/gitnexus-review/SKILL.md +12 -6
- package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +1 -1
- package/skills/gitnexus-review/ci-personas/ci-security-lens.md +1 -1
- package/skills/gitnexus-taint-analysis.md +13 -7
- package/skills/gitnexus-work/SKILL.md +4 -1
- package/skills/gitnexus-work/references/evidence-provenance.md +49 -12
- package/skills/gitnexus-work/scripts/evidence-provenance.mjs +654 -372
- package/vendor/leiden/utils.cjs +28 -1
- package/web/assets/ProcessFlowModal-Badh2Pbg.js +24 -0
- package/web/assets/{__vite-browser-external-bMKyYQkO.js → __vite-browser-external-COxE8F0G.js} +1 -1
- package/web/assets/abnfDiagram-QNN2D4NM-Cq2djWWe.js +1 -0
- package/web/assets/agent-Dr4l5EOp.js +662 -0
- package/web/assets/architecture-TIHT7OUA-V6N4J3SY-fTePvLoe.js +1 -0
- package/web/assets/architectureDiagram-OT7VKSJ7-mKEXxkeF.js +36 -0
- package/web/assets/{blockDiagram-7IZFK4PR-DBefcjof.js → blockDiagram-54WLDVWM-Dg_hrRWE.js} +4 -4
- package/web/assets/{c4Diagram-Y2BXMSZH-EjWnjEJl.js → c4Diagram-X2LASM7V-CnhoT4aV.js} +2 -2
- package/web/assets/chunk-224SPVON-B8gxtXpy.js +1 -0
- package/web/assets/chunk-2AEHWXPW-CV4r6-1I.js +127 -0
- package/web/assets/chunk-2SREHG4O-Dip42xOq.js +1 -0
- package/web/assets/chunk-4RFN2BYJ-DHHWuC-n.js +1 -0
- package/web/assets/chunk-66DQ2XMT-CM0xjFAN.js +1 -0
- package/web/assets/chunk-6BELYETK-ChsYtfHW.js +1 -0
- package/web/assets/{chunk-LII3EMHJ-BL6lKJ_P.js → chunk-6L755F7B-CMhLBxi2.js} +1 -1
- package/web/assets/{chunk-QA3QBVWF-DVXPOIxe.js → chunk-7CWYLC5S-DRgGkkpF.js} +1 -1
- package/web/assets/{chunk-ZXARS5L4-C3v-4Fsw.js → chunk-A7VWPJGB-B4O3oQdQ.js} +1 -1
- package/web/assets/chunk-BI6VK774-D0oaWk8V.js +1 -0
- package/web/assets/chunk-D6VWDJW2-BxcBdZ9c.js +2 -0
- package/web/assets/chunk-DMV4VAQV-Bn6WXDSX.js +4 -0
- package/web/assets/chunk-E5QJAATJ-dh-5CtIV.js +2 -0
- package/web/assets/chunk-EQFTRU2I-1ix7TzW9.js +2 -0
- package/web/assets/chunk-FWYVLQTC-BgDItRzJ.js +1 -0
- package/web/assets/chunk-HNC4WDU7-DoU3KnA7.js +1 -0
- package/web/assets/chunk-L5GCOVLC-CE2w8Nm_.js +161 -0
- package/web/assets/chunk-LAHSG3N2-Bz4hcn0N.js +321 -0
- package/web/assets/chunk-LORZLZWG-B57uGw2N.js +88 -0
- package/web/assets/chunk-NLANEA3F-XpH_NPA5.js +62 -0
- package/web/assets/chunk-NV3KIAZN-5yvcpMiu.js +1 -0
- package/web/assets/chunk-OIYT25JQ-CQ6KOZGX.js +1 -0
- package/web/assets/chunk-PE7DX7ZZ-CCvRVj43.js +10 -0
- package/web/assets/chunk-Q67WD55A-BWCH2SVz.js +156 -0
- package/web/assets/chunk-RRFMTAIC-CMN0wcYA.js +1 -0
- package/web/assets/{chunk-RLI5ZMPA-CkXZ0y0U.js → chunk-SATU7PGQ-B1zhgOvc.js} +1 -1
- package/web/assets/chunk-STOV2HOB-GnExfzIX.js +1 -0
- package/web/assets/{chunk-INKRHTLW-Ckl3_KkO.js → chunk-SZD42YQK-ijyKKVr1.js} +21 -21
- package/web/assets/{chunk-LCXTWHL2-C162wE5z.js → chunk-TFPGFQPA-Dj6a-0pC.js} +3 -3
- package/web/assets/chunk-TGVD4F4B-BMc31Gj2.js +2 -0
- package/web/assets/chunk-TZUXEDM2-B7p9AcTw.js +1 -0
- package/web/assets/chunk-UAT7B5JY-DW-A_fpI.js +1 -0
- package/web/assets/{chunk-6764PJDD-C7xxk063.js → chunk-VE5CLXGZ-C1vB7wpY.js} +1 -1
- package/web/assets/{chunk-RG4AUYOV-ZNgyLFq6.js → chunk-VJFVEZTB-CX66F2ep.js} +3 -3
- package/web/assets/chunk-VY5UBI4V-yxPQAWxw.js +1 -0
- package/web/assets/chunk-WJBAP47W-BckNkuEN.js +1 -0
- package/web/assets/chunk-XNMVGMAZ-Cg_LnPtj.js +1 -0
- package/web/assets/classDiagram-VPOSVPXH-BjOiXA_C.js +1 -0
- package/web/assets/classDiagram-v2-5VFNUXQA-BjOiXA_C.js +1 -0
- package/web/assets/{cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js → cose-bilkent-RZA4XIPR-BHpK4Crp.js} +1 -1
- package/web/assets/cynefin-VYW2F7L2-2VAHYKR6-DAsF6GZv.js +1 -0
- package/web/assets/cynefinDiagram-TR7LZUCG-C3Iar9lZ.js +62 -0
- package/web/assets/dagre-K64A6Z3X-CUwi79mA.js +4 -0
- package/web/assets/diagram-2TLGJV2N-C2F5Nfym.js +30 -0
- package/web/assets/diagram-JCD7PQ7C-DC5-9FRr.js +24 -0
- package/web/assets/{diagram-HNR7UZ2L-DVRltWbL.js → diagram-KFBZAVDW-Dfmf_4ti.js} +3 -3
- package/web/assets/diagram-L7DVE3PN-GIRyVUtt.js +41 -0
- package/web/assets/diagram-YP3FGXHI-CyNFYtkd.js +24 -0
- package/web/assets/ebnfDiagram-DRHRQJWO-D8_CI4ZF.js +1 -0
- package/web/assets/erDiagram-SZLJLQMB-CohQjznC.js +85 -0
- package/web/assets/error-D9MtuG9s.js +1 -0
- package/web/assets/eventmodeling-45OFAUF4-AOUJWSLX-BvTc6iQi.js +1 -0
- package/web/assets/flowDiagram-BWE6NHOH-B6RnEvD9.js +1 -0
- package/web/assets/ganttDiagram-2QTCJSNI-Cks_mEcF.js +292 -0
- package/web/assets/gitGraph-TEB2WS4Q-U5VWYIBC-Dy7CCSZ5.js +1 -0
- package/web/assets/gitGraphDiagram-VVZAVV5G-CG41cIVc.js +106 -0
- package/web/assets/{index-D7mTFcvQ.js → index-2zdvEdzg.js} +51 -51
- package/web/assets/index-CJDpyH-n.css +2 -0
- package/web/assets/info-DKCQHKI2-DX6KST54-BLJg1ikX.js +1 -0
- package/web/assets/infoDiagram-FY4PZKRE-BJ3vPVwW.js +2 -0
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js → ishikawaDiagram-4JDSWWDM-DmqWtjkl.js} +2 -2
- package/web/assets/{journeyDiagram-M6C3CM3L-C6wjooas.js → journeyDiagram-QUS3FAKT-XAzVzrQW.js} +3 -3
- package/web/assets/{kanban-definition-75IXJCU3-5_UVY79g.js → kanban-definition-D4L7SQKK-YurRnmYn.js} +6 -6
- package/web/assets/katex-C5OPUE3Q-Bnbavtmu.js +257 -0
- package/web/assets/{mindmap-definition-2TDM6QVE-8xDLzk2e.js → mindmap-definition-66QP5TD6-ChrWWnil.js} +5 -5
- package/web/assets/node.browser-U-KyT5AW.js +1 -0
- package/web/assets/packet-7NZHBO7P-5WG45QPS-KUxcuvaA.js +1 -0
- package/web/assets/pegDiagram-YKIO5C6U-QGeQLEq2.js +1 -0
- package/web/assets/pie-RZYD4A2V-2OCZ2VTD-DPs08kJY.js +1 -0
- package/web/assets/pieDiagram-YPY3TKG5-BuT3MYzm.js +39 -0
- package/web/assets/{quadrantDiagram-VICAPDV7-DR54jOeR.js → quadrantDiagram-VO5QLCXA-B7098wSc.js} +3 -3
- package/web/assets/radar-I7S5WNFK-EPLSA35B-w5F0K3a7.js +1 -0
- package/web/assets/railroad-3IZDKUUU-PWFQV6Y6-Bu668yqY.js +1 -0
- package/web/assets/railroad-abnf-AHOZXSZD-JYYJX3BS-B6ghpETS.js +1 -0
- package/web/assets/railroad-ebnf-EBAXGLYW-RBZ4ONAP-D-XmHh3M.js +1 -0
- package/web/assets/railroad-peg-LSFZ7HO6-KHNPXGPG-mhkrhzEn.js +1 -0
- package/web/assets/railroadDiagram-M77LTMSB-AXu4vxk_.js +1 -0
- package/web/assets/{requirementDiagram-JXO7QTGE-PEkg7sKC.js → requirementDiagram-RASO5HTO-B-l8InpK.js} +4 -4
- package/web/assets/{sankeyDiagram-URQDO5SZ-DDWEtjcs.js → sankeyDiagram-F32LOJ6L-Kd7zjJgX.js} +3 -3
- package/web/assets/{sequenceDiagram-VS2MUI6T-Bv-uwANx.js → sequenceDiagram-URATNSBD-BlcdY9DS.js} +7 -7
- package/web/assets/sizeCapture-5GORAGP4-BEqQzsxs.js +1 -0
- package/web/assets/src-C5sx_gMp.js +1 -0
- package/web/assets/stateDiagram-DODFXNG5-DTdHc-fF.js +1 -0
- package/web/assets/stateDiagram-v2-JNMM5JRA-DioNLDDo.js +1 -0
- package/web/assets/swimlanes-OSWOYLSK-CA0ofdwY.js +2 -0
- package/web/assets/swimlanesDiagram-RHGX2RDE-PkwUdckC.js +8 -0
- package/web/assets/{timeline-definition-O6YCAMPW-Qmsuo7qS.js → timeline-definition-WJXWRH4I-DUfp1R3E.js} +3 -3
- package/web/assets/treeView-QDETBFTQ-EHYTSQNO-C5lpBgPm.js +1 -0
- package/web/assets/treemap-6X3UGDF4-CCWCF7EK-BB0ZyO-B.js +1 -0
- package/web/assets/vennDiagram-K3VCMQLI-Bj-FN-XS.js +34 -0
- package/web/assets/wardley-OPB4EBWU-6OWERDVT-CEA3Nq0j.js +1 -0
- package/web/assets/wardleyDiagram-XK6FUAWV-CVV0dHFr.js +78 -0
- package/web/assets/xychartDiagram-5VRUVLCW-CK_rbSWE.js +7 -0
- package/web/index.html +16 -15
- package/dist/core/ingestion/languages/python/index-stats.d.ts +0 -18
- package/dist/core/ingestion/languages/python/index-stats.js +0 -25
- package/web/assets/ProcessFlowModal-CwkpVkv-.js +0 -22
- package/web/assets/agent-Ds-lkZjX.js +0 -626
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +0 -36
- package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +0 -4
- package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +0 -1
- package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +0 -321
- package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +0 -159
- package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +0 -124
- package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +0 -10
- package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +0 -1
- package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +0 -1
- package/web/assets/chunk-J5EP6P6S-L19oz55R.js +0 -1
- package/web/assets/chunk-KGFNY3KK-BZeP-55u.js +0 -62
- package/web/assets/chunk-KGYTTC2M-zm6n242I.js +0 -1
- package/web/assets/chunk-KNLZD3CH-BGlP6X9R.js +0 -1
- package/web/assets/chunk-LRIF4GLE-n59lhprL.js +0 -1
- package/web/assets/chunk-RERM46MO-B5dAdWpP.js +0 -1
- package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +0 -1
- package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +0 -1
- package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +0 -1
- package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +0 -1
- package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +0 -1
- package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +0 -2
- package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +0 -1
- package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +0 -4
- package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +0 -43
- package/web/assets/diagram-GF46GFSD-B2atbzmU.js +0 -24
- package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +0 -10
- package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +0 -85
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +0 -1
- package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +0 -162
- package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +0 -292
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +0 -106
- package/web/assets/index-CX_fADmQ.css +0 -2
- package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +0 -1
- package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +0 -2
- package/web/assets/katex-K3KEBU37-qRQBy-EZ.js +0 -261
- package/web/assets/node-Ct_zna8U.js +0 -8
- package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +0 -1
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +0 -1
- package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +0 -30
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +0 -1
- package/web/assets/sdk-CzHHH8tD.js +0 -37
- package/web/assets/src-Cv1eWg0o.js +0 -1
- package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +0 -1
- package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +0 -1
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +0 -1
- package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +0 -34
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +0 -1
- package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +0 -78
- package/web/assets/xychartDiagram-N2JHSOCM-CoZ_Tits.js +0 -7
- /package/web/assets/{chunk-7W6UQGC5-pyKGssV3.js → chunk-LIEV3EAG-pyKGssV3.js} +0 -0
|
@@ -15,6 +15,8 @@ export { ormPhase, type ORMOutput } from './orm.js';
|
|
|
15
15
|
export { crossFilePhase, type CrossFileOutput } from './cross-file.js';
|
|
16
16
|
export { scopeResolutionPhase, type ScopeResolutionOutput, } from '../scope-resolution/pipeline/phase.js';
|
|
17
17
|
export { springConfigPhase, type SpringConfigOutput } from './spring-config.js';
|
|
18
|
+
export { springAutoConfigurationPhase, type SpringAutoConfigurationOutput, } from './spring-auto-configuration.js';
|
|
19
|
+
export { springAopPhase, springAopInheritancePhase, type SpringAopOutput, type SpringAopInheritanceOutput, } from './spring-aop.js';
|
|
18
20
|
export { pruneLocalSymbolsPhase, type PruneLocalSymbolsOutput } from './prune-local-symbols.js';
|
|
19
21
|
export { taintSummariesPhase, type TaintSummariesOutput } from './taint-summaries.js';
|
|
20
22
|
export { callSummariesPhase, type CallSummariesOutput } from './call-summaries.js';
|
|
@@ -16,6 +16,8 @@ export { ormPhase } from './orm.js';
|
|
|
16
16
|
export { crossFilePhase } from './cross-file.js';
|
|
17
17
|
export { scopeResolutionPhase, } from '../scope-resolution/pipeline/phase.js';
|
|
18
18
|
export { springConfigPhase } from './spring-config.js';
|
|
19
|
+
export { springAutoConfigurationPhase, } from './spring-auto-configuration.js';
|
|
20
|
+
export { springAopPhase, springAopInheritancePhase, } from './spring-aop.js';
|
|
19
21
|
export { pruneLocalSymbolsPhase } from './prune-local-symbols.js';
|
|
20
22
|
export { taintSummariesPhase } from './taint-summaries.js';
|
|
21
23
|
export { callSummariesPhase } from './call-summaries.js';
|
|
@@ -21,6 +21,21 @@ import { type PipelineProgress } from '../../../_shared/index.js';
|
|
|
21
21
|
import type { ExtractedDecoratorRoute, ExtractedFetchCall, ExtractedORMQuery, ExtractedRoute, ExtractedToolDef, FetchWrapperDef } from '../workers/parse-worker.js';
|
|
22
22
|
import type { KnowledgeGraph } from '../../graph/types.js';
|
|
23
23
|
import type { PipelineOptions } from '../pipeline.js';
|
|
24
|
+
/** Projected main-thread heap need for the parse phase (#2649). */
|
|
25
|
+
export declare function projectParseHeapNeedBytes(parseableFileCount: number): number;
|
|
26
|
+
/** True when the mid-loop heap guard should abort the parse (#2649). */
|
|
27
|
+
export declare function shouldAbortForHeapPressure(heapUsedBytes: number, heapLimitBytes: number): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* The ONE action a user should take when this repository doesn't fit the
|
|
30
|
+
* current heap (#2649). Users hitting memory limits are already frustrated —
|
|
31
|
+
* a menu of env knobs at that moment is noise. Branch on whether the machine
|
|
32
|
+
* itself has more memory to give: if this process's limit sits well below
|
|
33
|
+
* what the RAM-aware auto-sizer would grant (an inherited NODE_OPTIONS pin or
|
|
34
|
+
* explicit flag), the fix is to drop the pin — gitnexus sizes itself.
|
|
35
|
+
* Otherwise the machine is the ceiling and only scope or hardware helps.
|
|
36
|
+
* Escape hatches (GITNEXUS_MEMORY etc.) stay in the README env table.
|
|
37
|
+
*/
|
|
38
|
+
export declare function heapPressureRemedy(heapLimitBytes: number): string;
|
|
24
39
|
type ScannedFile = {
|
|
25
40
|
path: string;
|
|
26
41
|
size: number;
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
import { BindingAccumulator, enrichExportedTypeMap, } from '../binding-accumulator.js';
|
|
18
18
|
import { mergeChunkResults, dispatchChunkParse } from '../parsing-processor.js';
|
|
19
19
|
import { fileContentHash, computeChunkHash, loadParseCacheChunk, persistParseCacheChunk, PARSE_CACHE_VERSION, } from '../../../storage/parse-cache.js';
|
|
20
|
-
import { clearParsedFileStore, persistParsedFileChunk, getDurableParsedFileDir, loadDurableParsedFileIndex, prepareDurableParsedFileChunk, restoreDurableParsedFileShard, } from '../../../storage/parsedfile-store.js';
|
|
20
|
+
import { clearParsedFileStore, persistParsedFileChunk, loadParsedFilesForPaths, getDurableParsedFileDir, loadDurableParsedFileIndex, prepareDurableParsedFileChunk, restoreDurableParsedFileShard, } from '../../../storage/parsedfile-store.js';
|
|
21
21
|
import { DEFAULT_PDG_MAX_FUNCTION_LINES } from '../cfg/collect.js';
|
|
22
22
|
import { processRoutesFromExtracted, resolveRouteHandlerSymbols, buildExportedTypeMapFromGraph, } from '../call-processor.js';
|
|
23
23
|
import { createSemanticModel } from '../model/index.js';
|
|
@@ -25,13 +25,17 @@ import { getLanguageFromFilename, } from '../../../_shared/index.js';
|
|
|
25
25
|
import { readFileContents } from '../filesystem-walker.js';
|
|
26
26
|
import { isLanguageAvailable, isGrammarRuntimeSkipped, createParserForLanguage, } from '../../tree-sitter/parser-loader.js';
|
|
27
27
|
import { parseSourceSafe } from '../../tree-sitter/safe-parse.js';
|
|
28
|
-
import { getProvider, providers } from '../languages/index.js';
|
|
28
|
+
import { getProvider, getProviderForFile, providers } from '../languages/index.js';
|
|
29
|
+
import { SCOPE_RESOLVERS } from '../scope-resolution/pipeline/registry.js';
|
|
30
|
+
import { DATA_ROUTE_TABLE_SOURCE } from '../route-extractors/data-route-table.js';
|
|
29
31
|
import { createWorkerPool, workerPoolDisabledByEnv, resolveAutoPoolSize, WorkerPoolInitializationError, WorkerPoolDisabledError, } from '../workers/worker-pool.js';
|
|
30
32
|
import { normalizeExtractedRoutePath } from '../route-extractors/route-path.js';
|
|
31
33
|
import { resolveOperands, } from '../route-extractors/python-const-resolver.js';
|
|
32
34
|
import { resolveInheritedSpringRoutes, } from '../route-extractors/spring-shared.js';
|
|
33
35
|
import fs from 'node:fs';
|
|
36
|
+
import { effectiveRamBytes, memoryAutopilotDisabled } from '../utils/effective-ram.js';
|
|
34
37
|
import path from 'node:path';
|
|
38
|
+
import v8 from 'node:v8';
|
|
35
39
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
36
40
|
import { isDev } from '../utils/env.js';
|
|
37
41
|
import { isVerboseIngestionEnabled } from '../utils/verbose.js';
|
|
@@ -39,6 +43,74 @@ import { endTimer, isDeferredResolutionProfileEnabled, logDeferredProfile, start
|
|
|
39
43
|
import { isDebugHeapEnabled, logHeapProbe } from '../utils/heap-probe.js';
|
|
40
44
|
import { logger } from '../../logger.js';
|
|
41
45
|
// ── Constants ──────────────────────────────────────────────────────────────
|
|
46
|
+
/**
|
|
47
|
+
* Heap-scale guardrail constants (#2649). Measured on a Linux-kernel analyze:
|
|
48
|
+
* ~75 graph nodes per PARSEABLE file (~5M nodes / ~65k parseable files;
|
|
49
|
+
* validated against heap probes at chunks 25/50/75 of 113 — the first
|
|
50
|
+
* calibration divided by total scanned files and under-projected by ~30%),
|
|
51
|
+
* main-thread heap per node. C-heavy corpus; other language mixes vary — these
|
|
52
|
+
* feed a WARNING and an emergency abort, never a hard admission gate, so
|
|
53
|
+
* estimate error only shifts when the operator hears about the problem, not
|
|
54
|
+
* whether analyze runs.
|
|
55
|
+
*
|
|
56
|
+
* RECALIBRATED for streamed structural emit (#2680), which is on by default for
|
|
57
|
+
* full rebuilds and holds relationships out of the JS heap. The original 2250
|
|
58
|
+
* was measured against the object-based graph; an A/B at 400k nodes / 1.08M
|
|
59
|
+
* edges put streaming at 1.40x smaller (819 MB -> 584 MB), so the corpus-
|
|
60
|
+
* calibrated figure is divided by that ratio: 2250 / 1.40 ~= 1600. Scaling the
|
|
61
|
+
* measured constant rather than substituting a synthetic one keeps #2649's
|
|
62
|
+
* kernel calibration intact and changes only the one thing that actually moved.
|
|
63
|
+
*
|
|
64
|
+
* If streaming is disabled (GITNEXUS_STREAM_GRAPH_EMIT=0, or any non-force run)
|
|
65
|
+
* this UNDER-projects by ~40%, so the preflight warning may stay quiet on a repo
|
|
66
|
+
* that then struggles. That is the safe direction to be wrong in: the abort
|
|
67
|
+
* below reads LIVE heap use, not this projection, so it still catches the real
|
|
68
|
+
* condition — only the early warning is affected.
|
|
69
|
+
*/
|
|
70
|
+
const PROJECTED_NODES_PER_FILE = 75;
|
|
71
|
+
const PROJECTED_HEAP_BYTES_PER_NODE = 1600;
|
|
72
|
+
/** Warn at scan end when the projection crosses this share of the heap limit. */
|
|
73
|
+
const PREFLIGHT_WARN_FRACTION = 0.85;
|
|
74
|
+
/**
|
|
75
|
+
* Abort the chunk loop when live heap use crosses this share of the limit.
|
|
76
|
+
* Above ~0.95 V8 enters the ineffective-mark-compact death spiral (2s+ GC
|
|
77
|
+
* pauses that also falsely idle-timeout healthy workers, #2649); 0.92 leaves
|
|
78
|
+
* one chunk's worth of headroom to fail with an actionable message instead.
|
|
79
|
+
* `GITNEXUS_MEMORY=off` declines the abort (proceed-at-own-risk).
|
|
80
|
+
*/
|
|
81
|
+
const HEAP_ABORT_FRACTION = 0.92;
|
|
82
|
+
/** Projected main-thread heap need for the parse phase (#2649). */
|
|
83
|
+
export function projectParseHeapNeedBytes(parseableFileCount) {
|
|
84
|
+
return parseableFileCount * PROJECTED_NODES_PER_FILE * PROJECTED_HEAP_BYTES_PER_NODE;
|
|
85
|
+
}
|
|
86
|
+
/** True when the mid-loop heap guard should abort the parse (#2649). */
|
|
87
|
+
export function shouldAbortForHeapPressure(heapUsedBytes, heapLimitBytes) {
|
|
88
|
+
if (memoryAutopilotDisabled())
|
|
89
|
+
return false;
|
|
90
|
+
return heapUsedBytes > heapLimitBytes * HEAP_ABORT_FRACTION;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* The ONE action a user should take when this repository doesn't fit the
|
|
94
|
+
* current heap (#2649). Users hitting memory limits are already frustrated —
|
|
95
|
+
* a menu of env knobs at that moment is noise. Branch on whether the machine
|
|
96
|
+
* itself has more memory to give: if this process's limit sits well below
|
|
97
|
+
* what the RAM-aware auto-sizer would grant (an inherited NODE_OPTIONS pin or
|
|
98
|
+
* explicit flag), the fix is to drop the pin — gitnexus sizes itself.
|
|
99
|
+
* Otherwise the machine is the ceiling and only scope or hardware helps.
|
|
100
|
+
* Escape hatches (GITNEXUS_MEMORY etc.) stay in the README env table.
|
|
101
|
+
*/
|
|
102
|
+
export function heapPressureRemedy(heapLimitBytes) {
|
|
103
|
+
// Effective RAM honors a real cgroup limit — raw os.totalmem() told users
|
|
104
|
+
// inside an 8GB-limited container on a 64GB host that "this machine has
|
|
105
|
+
// more memory available", an advice loop with no exit (#2649 review).
|
|
106
|
+
const autoCapBytes = effectiveRamBytes() * 0.75;
|
|
107
|
+
if (heapLimitBytes < autoCapBytes * 0.9) {
|
|
108
|
+
return (`This machine has more memory available: re-run without the --max-old-space-size ` +
|
|
109
|
+
`pin (NODE_OPTIONS or node flag) — gitnexus sizes its heap to the machine automatically.`);
|
|
110
|
+
}
|
|
111
|
+
return (`This machine is at its memory ceiling: exclude generated or vendored directories ` +
|
|
112
|
+
`via .gitnexusignore, or analyze on a machine with more memory.`);
|
|
113
|
+
}
|
|
42
114
|
/** Max bytes of source content to load per parse chunk.
|
|
43
115
|
*
|
|
44
116
|
* Memory bound for the worker pool dispatch + a granularity knob for
|
|
@@ -365,6 +437,19 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
|
|
|
365
437
|
const dispatchSubBatchMaxBytes = Number.isFinite(subBatchEnv) && subBatchEnv > 0
|
|
366
438
|
? subBatchEnv
|
|
367
439
|
: Math.max(MIN_SUB_BATCH_BYTES, Math.ceil(chunkByteBudget / (effectivePoolSize * TARGET_JOBS_PER_WORKER)));
|
|
440
|
+
// Heap-scale guardrails (#2649), measured on a Linux-kernel analyze
|
|
441
|
+
// (94,773 files): ~55 graph nodes per parseable file and ~2.2KB of
|
|
442
|
+
// main-thread heap per node, linear across 113 chunks (see
|
|
443
|
+
// docs/plans/2026-07-23-gitnexus-plan-large-repo-analyze-oom.md §2).
|
|
444
|
+
// Estimates, not contracts — used only to warn early (preflight) and to
|
|
445
|
+
// convert a certain multi-minute GC death spiral into an immediate
|
|
446
|
+
// actionable error (mid-loop guard).
|
|
447
|
+
const projectedHeapNeedBytes = projectParseHeapNeedBytes(parseableScanned.length);
|
|
448
|
+
const heapLimitBytes = v8.getHeapStatistics().heap_size_limit;
|
|
449
|
+
if (projectedHeapNeedBytes > heapLimitBytes * PREFLIGHT_WARN_FRACTION) {
|
|
450
|
+
logger.warn(`Large repository: analyzing ${parseableScanned.length} files needs roughly ${Math.round(projectedHeapNeedBytes / 1024 / 1024 / 1024)}GB of memory, ` +
|
|
451
|
+
`but Node is limited to ${Math.round(heapLimitBytes / 1024 / 1024 / 1024)}GB — analyze may stop early. ${heapPressureRemedy(heapLimitBytes)}`);
|
|
452
|
+
}
|
|
368
453
|
const chunks = [];
|
|
369
454
|
let currentChunk = [];
|
|
370
455
|
let currentBytes = 0;
|
|
@@ -676,6 +761,16 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
|
|
|
676
761
|
if (heapProbeEveryN > 0 && chunkIdx > 0 && chunkIdx % heapProbeEveryN === 0) {
|
|
677
762
|
logHeapProbe(`parse-chunk-${chunkIdx}`, `nodes=${graph.nodeCount} parsedFiles=${allParsedFiles.length}`);
|
|
678
763
|
}
|
|
764
|
+
// #2649 mid-loop heap guard: fail actionably BEFORE V8 enters the
|
|
765
|
+
// ineffective-mark-compact death spiral (which also falsely times out
|
|
766
|
+
// healthy workers). The pool is torn down by this function's finally.
|
|
767
|
+
const heapUsedNow = process.memoryUsage().heapUsed;
|
|
768
|
+
const heapLimitNow = v8.getHeapStatistics().heap_size_limit;
|
|
769
|
+
if (shouldAbortForHeapPressure(heapUsedNow, heapLimitNow)) {
|
|
770
|
+
throw new Error(`Analyze stopped before running out of memory: ${Math.round(heapUsedNow / 1024 / 1024)}MB of the ` +
|
|
771
|
+
`${Math.round(heapLimitNow / 1024 / 1024)}MB Node heap in use at parse chunk ${chunkIdx + 1}/${numChunks} (#2649). ` +
|
|
772
|
+
heapPressureRemedy(heapLimitNow));
|
|
773
|
+
}
|
|
679
774
|
const chunkPaths = chunks[chunkIdx];
|
|
680
775
|
// Start wall-clock for the per-chunk throughput log emitted at end
|
|
681
776
|
// of this iteration. The gate is computed once above; here we just
|
|
@@ -963,8 +1058,15 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
|
|
|
963
1058
|
resolvedRoutes.push(dr);
|
|
964
1059
|
continue;
|
|
965
1060
|
}
|
|
1061
|
+
// Provider-driven fold (#2980): languages with qualified-ref semantics
|
|
1062
|
+
// (Java `ApiPaths.X` / `com.example.ApiPaths.X`) fold through their
|
|
1063
|
+
// provider hook; everything else uses the shared language-agnostic
|
|
1064
|
+
// operand fold. No language names in the shared layer.
|
|
1065
|
+
const fold = getProviderForFile(dr.filePath)?.foldRoutePathOperands;
|
|
966
1066
|
const value = dr.routePathOperands
|
|
967
|
-
?
|
|
1067
|
+
? fold
|
|
1068
|
+
? fold(dr.filePath, dr.routePathOperands, repoConstants)
|
|
1069
|
+
: resolveOperands(dr.filePath, dr.routePathOperands, repoConstants)
|
|
968
1070
|
: null;
|
|
969
1071
|
if (value === null) {
|
|
970
1072
|
skipped++;
|
|
@@ -1163,9 +1265,57 @@ export async function runChunkedParseAndResolve(graph, scannedFiles, allPaths, t
|
|
|
1163
1265
|
}
|
|
1164
1266
|
}
|
|
1165
1267
|
logHeapProbe('parse-impl-return', `exportedTypeMap=${exportedTypeMap.size} parsedFiles=${allParsedFiles.length} nodes=${graph.nodeCount}`);
|
|
1268
|
+
const routeFilePaths = new Set(allPaths);
|
|
1269
|
+
const dataRouteFilePaths = new Set(allDecoratorRoutes
|
|
1270
|
+
.filter((route) => route.source === DATA_ROUTE_TABLE_SOURCE)
|
|
1271
|
+
.map((route) => route.filePath));
|
|
1272
|
+
const routeResolutionConfigs = new Map();
|
|
1273
|
+
for (const filePath of dataRouteFilePaths) {
|
|
1274
|
+
const language = getLanguageFromFilename(filePath);
|
|
1275
|
+
if (language === null || routeResolutionConfigs.has(language))
|
|
1276
|
+
continue;
|
|
1277
|
+
const resolver = SCOPE_RESOLVERS.get(language);
|
|
1278
|
+
routeResolutionConfigs.set(language, resolver?.loadResolutionConfig === undefined
|
|
1279
|
+
? undefined
|
|
1280
|
+
: await resolver.loadResolutionConfig(repoPath));
|
|
1281
|
+
}
|
|
1282
|
+
let routeResolutionFiles = allParsedFiles;
|
|
1283
|
+
const resolveRouteImportTarget = (parsedImport, fromFile) => {
|
|
1284
|
+
const language = getLanguageFromFilename(fromFile);
|
|
1285
|
+
if (language === null)
|
|
1286
|
+
return null;
|
|
1287
|
+
const target = SCOPE_RESOLVERS.get(language)?.resolveImportTarget(parsedImport.targetRaw ?? '', fromFile, routeFilePaths, routeResolutionConfigs.get(language), { parsedFiles: routeResolutionFiles, parsedImport });
|
|
1288
|
+
if (typeof target === 'string')
|
|
1289
|
+
return target;
|
|
1290
|
+
return target?.length === 1 ? target[0] : null;
|
|
1291
|
+
};
|
|
1292
|
+
if (parsedFileStorePath !== undefined && dataRouteFilePaths.size > 0) {
|
|
1293
|
+
const byPath = await loadParsedFilesForPaths(parsedFileStorePath, dataRouteFilePaths);
|
|
1294
|
+
for (const parsed of allParsedFiles) {
|
|
1295
|
+
if (dataRouteFilePaths.has(parsed.filePath))
|
|
1296
|
+
byPath.set(parsed.filePath, parsed);
|
|
1297
|
+
}
|
|
1298
|
+
routeResolutionFiles = [...byPath.values()];
|
|
1299
|
+
const directTargets = new Set();
|
|
1300
|
+
for (const parsed of routeResolutionFiles) {
|
|
1301
|
+
for (const parsedImport of parsed.parsedImports) {
|
|
1302
|
+
const target = resolveRouteImportTarget(parsedImport, parsed.filePath);
|
|
1303
|
+
if (target !== null)
|
|
1304
|
+
directTargets.add(target);
|
|
1305
|
+
}
|
|
1306
|
+
}
|
|
1307
|
+
const importedFiles = await loadParsedFilesForPaths(parsedFileStorePath, directTargets);
|
|
1308
|
+
for (const parsed of importedFiles.values())
|
|
1309
|
+
byPath.set(parsed.filePath, parsed);
|
|
1310
|
+
routeResolutionFiles = [...byPath.values()];
|
|
1311
|
+
}
|
|
1166
1312
|
// Part 2 (#2138): resolve each route's handler to a real symbol UID now that
|
|
1167
1313
|
// the model is fully populated and decorator-route prefixes are finalized.
|
|
1168
|
-
const routeHandlerSymbols = resolveRouteHandlerSymbols(model, allExtractedRoutes, allDecoratorRoutes
|
|
1314
|
+
const routeHandlerSymbols = resolveRouteHandlerSymbols(model, allExtractedRoutes, allDecoratorRoutes, {
|
|
1315
|
+
files: routeResolutionFiles,
|
|
1316
|
+
resolveImportTarget: resolveRouteImportTarget,
|
|
1317
|
+
isExportedSymbol: (nodeId) => graph.getNode(nodeId)?.properties.isExported === true,
|
|
1318
|
+
});
|
|
1169
1319
|
return {
|
|
1170
1320
|
exportedTypeMap,
|
|
1171
1321
|
allFetchCalls,
|
|
@@ -21,6 +21,11 @@ export const parsePhase = {
|
|
|
21
21
|
name: 'parse',
|
|
22
22
|
deps: ['structure', 'markdown', 'cobol'],
|
|
23
23
|
async execute(ctx, deps) {
|
|
24
|
+
// Begin streamed structural emit (#2680), if enabled. Deliberately here and
|
|
25
|
+
// not at graph construction: the pre-parse phases are not all write-only —
|
|
26
|
+
// `mapCobolToGraph` scans CALLS edges and removes the unresolved ones — and
|
|
27
|
+
// nothing before parse produces bulk edge volume anyway.
|
|
28
|
+
ctx.graphEmit?.beginStreaming();
|
|
24
29
|
const { scannedFiles, allPaths, allPathSet, totalFiles } = getPhaseOutput(deps, 'structure');
|
|
25
30
|
const result = await runChunkedParseAndResolve(ctx.graph, scannedFiles, allPaths, totalFiles, ctx.repoPath, ctx.pipelineStart, ctx.onProgress, ctx.options);
|
|
26
31
|
return {
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* Detects execution flows (processes) and creates Process nodes +
|
|
5
5
|
* STEP_IN_PROCESS edges. Also links Route/Tool nodes to processes.
|
|
6
6
|
*
|
|
7
|
-
* @deps communities, routes, tools, pruneLocalSymbols
|
|
8
|
-
* @reads graph (all nodes and relationships), communityResult, routeRegistry,
|
|
7
|
+
* @deps communities, routes, tools, pruneLocalSymbols, structure, parse
|
|
8
|
+
* @reads graph (all nodes and relationships), communityResult, routeRegistry,
|
|
9
|
+
* toolDefs, parse's allFetchCalls + allORMQueries (R3-6 sink sites)
|
|
9
10
|
* @writes graph (Process nodes, STEP_IN_PROCESS edges, ENTRY_POINT_OF edges)
|
|
10
11
|
*/
|
|
11
12
|
import type { PipelinePhase } from './types.js';
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* Detects execution flows (processes) and creates Process nodes +
|
|
5
5
|
* STEP_IN_PROCESS edges. Also links Route/Tool nodes to processes.
|
|
6
6
|
*
|
|
7
|
-
* @deps communities, routes, tools, pruneLocalSymbols
|
|
8
|
-
* @reads graph (all nodes and relationships), communityResult, routeRegistry,
|
|
7
|
+
* @deps communities, routes, tools, pruneLocalSymbols, structure, parse
|
|
8
|
+
* @reads graph (all nodes and relationships), communityResult, routeRegistry,
|
|
9
|
+
* toolDefs, parse's allFetchCalls + allORMQueries (R3-6 sink sites)
|
|
9
10
|
* @writes graph (Process nodes, STEP_IN_PROCESS edges, ENTRY_POINT_OF edges)
|
|
10
11
|
*/
|
|
11
12
|
import { getPhaseOutput } from './types.js';
|
|
@@ -26,11 +27,19 @@ export function computeDynamicMaxProcesses(symbolCount) {
|
|
|
26
27
|
}
|
|
27
28
|
export const processesPhase = {
|
|
28
29
|
name: 'processes',
|
|
29
|
-
// `structure` supplies `totalFiles` (progress counter)
|
|
30
|
-
//
|
|
30
|
+
// `structure` supplies `totalFiles` (progress counter), which is why this
|
|
31
|
+
// phase historically avoided depending on `parse` at all — that dependency
|
|
32
|
+
// was spurious for a progress number.
|
|
33
|
+
//
|
|
34
|
+
// It is no longer spurious. R3-6 reads `allFetchCalls` / `allORMQueries` from
|
|
35
|
+
// the parse output to learn WHERE the program reaches outward, which is what
|
|
36
|
+
// lets a trace end at a sink instead of only at a leaf. That is a real data
|
|
37
|
+
// dependency, so it is declared rather than reached for implicitly — and the
|
|
38
|
+
// read below still fails open, so a pipeline without that output detects no
|
|
39
|
+
// sinks rather than failing the phase. `pruneLocalSymbols` is declared
|
|
31
40
|
// explicitly so process extraction always reads the trimmed graph even if a
|
|
32
41
|
// future option drops the intervening `mro`/`communities` phases.
|
|
33
|
-
deps: ['communities', 'routes', 'tools', 'pruneLocalSymbols', 'structure'],
|
|
42
|
+
deps: ['communities', 'routes', 'tools', 'pruneLocalSymbols', 'structure', 'parse'],
|
|
34
43
|
async execute(ctx, deps) {
|
|
35
44
|
const { totalFiles } = getPhaseOutput(deps, 'structure');
|
|
36
45
|
const { communityResult } = getPhaseOutput(deps, 'communities');
|
|
@@ -48,6 +57,32 @@ export const processesPhase = {
|
|
|
48
57
|
symbolCount++;
|
|
49
58
|
});
|
|
50
59
|
const dynamicMaxProcesses = computeDynamicMaxProcesses(symbolCount);
|
|
60
|
+
// R3-6: where the program reaches outward. Already collected by the parse
|
|
61
|
+
// phase for FILE-level FETCHES/QUERIES edges; reused here at function
|
|
62
|
+
// granularity so a trace can end somewhere meaningful instead of only at a
|
|
63
|
+
// leaf. Absent (or an older parse output) simply yields no sinks and the
|
|
64
|
+
// previous behaviour.
|
|
65
|
+
//
|
|
66
|
+
// Typed as `ParseOutput` rather than a locally re-declared structural shape,
|
|
67
|
+
// the way every other parse consumer does it (cross-file.ts, orm.ts,
|
|
68
|
+
// routes.ts, tools.ts). `getPhaseOutput` is a raw `as T` cast, so a local
|
|
69
|
+
// shape does not check anything — it only severs the compile-time link, and
|
|
70
|
+
// renaming `allFetchCalls` on `ParseOutput` would then still compile here and
|
|
71
|
+
// silently detect zero sinks. The runtime `.filter` below is the actual
|
|
72
|
+
// guard, and it stays.
|
|
73
|
+
let parseOutput;
|
|
74
|
+
try {
|
|
75
|
+
parseOutput = getPhaseOutput(deps, 'parse');
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Fail open: no sinks, previous behaviour. A missing parse output is a
|
|
79
|
+
// pipeline-composition question, not a reason to lose every process.
|
|
80
|
+
parseOutput = undefined;
|
|
81
|
+
}
|
|
82
|
+
const outwardActionSites = [
|
|
83
|
+
...(parseOutput?.allFetchCalls ?? []),
|
|
84
|
+
...(parseOutput?.allORMQueries ?? []),
|
|
85
|
+
].filter((s) => typeof s?.filePath === 'string' && typeof s?.lineNumber === 'number');
|
|
51
86
|
const processResult = await processProcesses(ctx.graph, communityResult.memberships, (message, progress) => {
|
|
52
87
|
const processProgress = 99 + progress * 0.01;
|
|
53
88
|
ctx.onProgress({
|
|
@@ -56,10 +91,60 @@ export const processesPhase = {
|
|
|
56
91
|
message,
|
|
57
92
|
stats: { filesProcessed: totalFiles, totalFiles, nodesCreated: ctx.graph.nodeCount },
|
|
58
93
|
});
|
|
59
|
-
}, { maxProcesses: dynamicMaxProcesses, minSteps: 3 });
|
|
94
|
+
}, { maxProcesses: dynamicMaxProcesses, minSteps: 3 }, outwardActionSites);
|
|
60
95
|
if (isDev) {
|
|
61
96
|
logger.info(`🔄 Process detection: ${processResult.stats.totalProcesses} processes found (${processResult.stats.crossCommunityCount} cross-community)`);
|
|
62
97
|
}
|
|
98
|
+
// Not gated on `isDev`: this is the one line that tells a reader the process
|
|
99
|
+
// list is a SAMPLE. "823 flows" presented without it reads as the complete
|
|
100
|
+
// set, which is the confident-empty failure in its other direction — a
|
|
101
|
+
// confident-COMPLETE one.
|
|
102
|
+
//
|
|
103
|
+
// But it is only a `warn` when a ceiling removed WHOLE FLOWS from the
|
|
104
|
+
// report. That split is the one `ProcessTruncationStats` already documents —
|
|
105
|
+
// "unexplored entry points mean whole flows are missing, while a
|
|
106
|
+
// depth-capped trace means a flow is present but shorter than it really is"
|
|
107
|
+
// — and it is what keeps the line worth reading. Warning on every counter
|
|
108
|
+
// meant warning on every run: this phase overrides only `maxProcesses`, so
|
|
109
|
+
// at the shipped defaults (`maxBranching: 4`, `maxTraceDepth: 10`,
|
|
110
|
+
// per-entry trace budget 12) `calleesDropped` fires for any function with
|
|
111
|
+
// five callees, `tracesDepthCapped` for any chain deeper than ten, and
|
|
112
|
+
// `walksCutByBudget` for any entry point with twelve paths under it. All
|
|
113
|
+
// three are true of every non-trivial repository — and none of them removes
|
|
114
|
+
// an entry point or a completed flow from the list, they only bound how far
|
|
115
|
+
// an already-represented region was walked. A warning that always fires is a
|
|
116
|
+
// warning nobody reads, so those three go to `debug`.
|
|
117
|
+
//
|
|
118
|
+
// `entryPointCandidatesDropped` IS in the loud set even though it fires on
|
|
119
|
+
// any repository with more than 200 candidates, because it is the only
|
|
120
|
+
// ceiling that grows with the repository: `entryPointsUnexplored` and
|
|
121
|
+
// `processesDropped` can only fire while `maxProcesses` (symbols / 10) is
|
|
122
|
+
// small enough to bind, so gating on those two alone would go quiet on
|
|
123
|
+
// exactly the large repositories where 200 of several thousand entry points
|
|
124
|
+
// is the thinnest sample. The message leads with that ratio so the line
|
|
125
|
+
// carries a fact rather than an alarm.
|
|
126
|
+
//
|
|
127
|
+
// `stats.truncation` on the RESULT is untouched and still reports all six
|
|
128
|
+
// counters; this only decides which of them are loud.
|
|
129
|
+
const { truncation } = processResult.stats;
|
|
130
|
+
const entryPointCandidates = processResult.stats.entryPointsFound + truncation.entryPointCandidatesDropped;
|
|
131
|
+
const flowsMissing = truncation.entryPointCandidatesDropped > 0 ||
|
|
132
|
+
truncation.entryPointsUnexplored > 0 ||
|
|
133
|
+
truncation.processesDropped > 0;
|
|
134
|
+
const shape = `${truncation.entryPointCandidatesDropped} of ${entryPointCandidates} candidate entry point(s) never ranked in, ` +
|
|
135
|
+
`${truncation.entryPointsUnexplored} ranked entry point(s) never traced, ` +
|
|
136
|
+
`${truncation.processesDropped} deduplicated flow(s) dropped at maxProcesses, ` +
|
|
137
|
+
`${truncation.tracesDepthCapped} trace(s) cut at maxTraceDepth, ` +
|
|
138
|
+
`${truncation.calleesDropped} callee(s) skipped at maxBranching, ` +
|
|
139
|
+
`${truncation.walksCutByBudget} walk(s) cut by the per-entry trace budget.`;
|
|
140
|
+
if (flowsMissing) {
|
|
141
|
+
logger.warn({ truncation }, `[processes] ${processResult.stats.totalProcesses} flows reported, but whole flows are MISSING: ` +
|
|
142
|
+
`${shape} An absent flow does NOT mean the code path does not exist.`);
|
|
143
|
+
}
|
|
144
|
+
else if (truncation.truncated) {
|
|
145
|
+
logger.debug({ truncation }, `[processes] ${processResult.stats.totalProcesses} flows reported; every flow found is present, ` +
|
|
146
|
+
`but some are shorter than the code path they describe: ${shape}`);
|
|
147
|
+
}
|
|
63
148
|
processResult.processes.forEach((proc) => {
|
|
64
149
|
ctx.graph.addNode({
|
|
65
150
|
id: proc.id,
|
|
@@ -18,6 +18,8 @@ import { phpFileToRouteURL } from '../route-extractors/php.js';
|
|
|
18
18
|
import { extractResponseShapes, extractPHPResponseShapes, } from '../route-extractors/response-shapes.js';
|
|
19
19
|
import { extractMiddlewareChain, extractNextjsMiddlewareConfig, compileMatcher, compiledMatcherMatchesRoute, } from '../route-extractors/middleware.js';
|
|
20
20
|
import { processNextjsFetchRoutes } from '../call-processor.js';
|
|
21
|
+
import { reconcileDispatchGuardRoutes } from '../route-extractors/dispatch-guard.js';
|
|
22
|
+
import { DATA_ROUTE_TABLE_SOURCE } from '../route-extractors/data-route-table.js';
|
|
21
23
|
import { normalizeExtractedRoutePath, normalizeRouteMethod, routeNodeKey, } from '../route-extractors/route-path.js';
|
|
22
24
|
import { generateId } from '../../../lib/utils.js';
|
|
23
25
|
import { readFileContents } from '../filesystem-walker.js';
|
|
@@ -27,6 +29,24 @@ const EXPO_NAV_PATTERNS = [
|
|
|
27
29
|
/router\.(push|replace|navigate)\(\s*['"`]([^'"`]+)['"`]/g,
|
|
28
30
|
/<Link\s+[^>]*href=\s*['"`]([^'"`]+)['"`]/g,
|
|
29
31
|
];
|
|
32
|
+
function handlerSymbolContent(content, handlerNode) {
|
|
33
|
+
if (handlerNode === undefined)
|
|
34
|
+
return undefined;
|
|
35
|
+
const startLine = handlerNode.properties.startLine;
|
|
36
|
+
const endLine = handlerNode.properties.endLine;
|
|
37
|
+
if (typeof startLine !== 'number' ||
|
|
38
|
+
typeof endLine !== 'number' ||
|
|
39
|
+
!Number.isInteger(startLine) ||
|
|
40
|
+
!Number.isInteger(endLine) ||
|
|
41
|
+
startLine < 0 ||
|
|
42
|
+
endLine < startLine) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
return content
|
|
46
|
+
.split(/\r?\n/)
|
|
47
|
+
.slice(startLine, endLine + 1)
|
|
48
|
+
.join('\n');
|
|
49
|
+
}
|
|
30
50
|
const TEMPLATE_URL_PATTERNS = [
|
|
31
51
|
/\b(?:action|href)\s*=\s*["']([^"']+)["']/gi,
|
|
32
52
|
/\burl\s*:\s*["']([^"']+)["'](?!\s*\+)/g,
|
|
@@ -100,6 +120,45 @@ export const routesPhase = {
|
|
|
100
120
|
// Local copy — routes phase must not mutate upstream ParseOutput
|
|
101
121
|
const allFetchCalls = [...parseFetchCalls];
|
|
102
122
|
const routeRegistry = new Map();
|
|
123
|
+
/**
|
|
124
|
+
* Registry keys written straight from the file list below, never through
|
|
125
|
+
* `addRoute`. `resolveRouteHandlerSymbols` walks only `extractedRoutes` and
|
|
126
|
+
* `decoratorRoutes`, so it never sees these URLs and its `claimed` set never
|
|
127
|
+
* contains them — which means a handler stamped on one of these keys was
|
|
128
|
+
* resolved for a DIFFERENT route.
|
|
129
|
+
*
|
|
130
|
+
* That is reachable, and it fabricates rather than omits (#3049). A
|
|
131
|
+
* method-agnostic route (`@All`, a Django function view, a verb-less
|
|
132
|
+
* dispatch guard) keys by URL alone via `routeNodeKey`, so it collides with
|
|
133
|
+
* a file-convention route at the same URL. It claims the key unopposed in
|
|
134
|
+
* `claim()`, then loses first-writer-wins here in `addRoute` and is dropped
|
|
135
|
+
* as a duplicate — and without this guard the surviving file-convention node
|
|
136
|
+
* would read that handler and present another application's controller
|
|
137
|
+
* method as its own. `api_impact` is documented to be run BEFORE editing a
|
|
138
|
+
* route handler, so it would answer with a handler from the wrong app.
|
|
139
|
+
*
|
|
140
|
+
* Dropping the losing route is a separate and deliberate consequence of
|
|
141
|
+
* URL-only identity; this only stops the false attribution.
|
|
142
|
+
*
|
|
143
|
+
* Membership is recorded AT the pre-seeding `set`, mirroring `claim()` in
|
|
144
|
+
* call-processor.ts, which writes `claimed` and its result map together
|
|
145
|
+
* rather than re-deriving either by rescanning. Identifying pre-seeded
|
|
146
|
+
* entries by matching `entry.source` against a list of source strings would
|
|
147
|
+
* spell them a second time, away from the sites that produce them — and a
|
|
148
|
+
* fourth pre-seeded source added later would then reopen #3049 in silence.
|
|
149
|
+
* `addRoute` deliberately does NOT record here: its routes ARE
|
|
150
|
+
* handler-resolved, so suppressing them would widen the guard into a bug of
|
|
151
|
+
* its own.
|
|
152
|
+
*
|
|
153
|
+
* Each `add` below sits inside its own `!routeRegistry.has(key)` gate, as
|
|
154
|
+
* every `routeRegistry.set` in this phase does: the map is write-once per
|
|
155
|
+
* key, so a losing candidate cannot record a key it did not claim and no
|
|
156
|
+
* later writer can take a recorded key away. Key-membership is therefore
|
|
157
|
+
* equivalent to source-matching by construction — pre-seeded routes carry no
|
|
158
|
+
* verb and `routeNodeKey(undefined, url) === url` — which is why the
|
|
159
|
+
* two-candidates-one-URL case needs no fixture to settle it.
|
|
160
|
+
*/
|
|
161
|
+
const preSeededKeys = new Set();
|
|
103
162
|
// Detect Expo Router app/ roots vs Next.js app/ roots (monorepo-safe)
|
|
104
163
|
const expoAppRoots = new Set();
|
|
105
164
|
const nextjsAppRoots = new Set();
|
|
@@ -125,32 +184,34 @@ export const routesPhase = {
|
|
|
125
184
|
expoAppPaths.add(p);
|
|
126
185
|
}
|
|
127
186
|
}
|
|
187
|
+
// One writer for every pre-seeded route, so recording membership cannot be
|
|
188
|
+
// forgotten. Inlining `has` / `set` / `add` at each site made the invariant
|
|
189
|
+
// a convention three call sites had to remember — and a fourth source that
|
|
190
|
+
// forgot the `add` would reopen #3049 exactly as silently as the source-set
|
|
191
|
+
// it replaced. This is the shape `claim()` in call-processor.ts uses for the
|
|
192
|
+
// same reason: one helper writes the collection and its key set together.
|
|
193
|
+
const preSeed = (url, entry) => {
|
|
194
|
+
if (routeRegistry.has(url))
|
|
195
|
+
return false;
|
|
196
|
+
routeRegistry.set(url, { ...entry, url });
|
|
197
|
+
preSeededKeys.add(url);
|
|
198
|
+
return true;
|
|
199
|
+
};
|
|
128
200
|
for (const p of allPaths) {
|
|
129
201
|
if (expoAppPaths.has(p)) {
|
|
130
202
|
const expoURL = expoFileToRouteURL(p);
|
|
131
|
-
if (expoURL &&
|
|
132
|
-
routeRegistry.set(expoURL, {
|
|
133
|
-
filePath: p,
|
|
134
|
-
source: 'expo-filesystem-route',
|
|
135
|
-
url: expoURL,
|
|
136
|
-
});
|
|
203
|
+
if (expoURL && preSeed(expoURL, { filePath: p, source: 'expo-filesystem-route' })) {
|
|
137
204
|
continue;
|
|
138
205
|
}
|
|
139
206
|
}
|
|
140
207
|
const nextjsURL = nextjsFileToRouteURL(p);
|
|
141
|
-
if (nextjsURL &&
|
|
142
|
-
routeRegistry.set(nextjsURL, {
|
|
143
|
-
filePath: p,
|
|
144
|
-
source: 'nextjs-filesystem-route',
|
|
145
|
-
url: nextjsURL,
|
|
146
|
-
});
|
|
208
|
+
if (nextjsURL && preSeed(nextjsURL, { filePath: p, source: 'nextjs-filesystem-route' })) {
|
|
147
209
|
continue;
|
|
148
210
|
}
|
|
149
211
|
if (p.endsWith('.php')) {
|
|
150
212
|
const phpURL = phpFileToRouteURL(p);
|
|
151
|
-
if (phpURL
|
|
152
|
-
|
|
153
|
-
}
|
|
213
|
+
if (phpURL)
|
|
214
|
+
preSeed(phpURL, { filePath: p, source: 'php-file-route' });
|
|
154
215
|
}
|
|
155
216
|
}
|
|
156
217
|
let duplicateRoutes = 0;
|
|
@@ -181,30 +242,60 @@ export const routesPhase = {
|
|
|
181
242
|
namedRouteRegistry.set(route.routeName, routeUrl);
|
|
182
243
|
}
|
|
183
244
|
}
|
|
184
|
-
|
|
245
|
+
// A dispatch-guard route observed WITHOUT a verb is dropped when the same
|
|
246
|
+
// URL is claimed WITH one anywhere in the repo — the split route-table
|
|
247
|
+
// idiom, which no single file can reconcile. Framework routes are untouched;
|
|
248
|
+
// their verb-less form is a declaration, not a weaker observation.
|
|
249
|
+
for (const dr of reconcileDispatchGuardRoutes(allDecoratorRoutes)) {
|
|
185
250
|
const url = normalizeExtractedRoutePath(dr.routePath, dr.prefix ?? null);
|
|
251
|
+
const method = normalizeRouteMethod(dr.httpMethod);
|
|
252
|
+
const routeKey = routeNodeKey(method, url);
|
|
253
|
+
// A data-table entry is only a provider route once its static handler has
|
|
254
|
+
// been proven. Other route sources retain their historical fallback.
|
|
255
|
+
if (dr.source === DATA_ROUTE_TABLE_SOURCE && !routeHandlerSymbols.has(routeKey))
|
|
256
|
+
continue;
|
|
186
257
|
addRoute(url, {
|
|
187
258
|
filePath: dr.filePath,
|
|
188
|
-
|
|
189
|
-
|
|
259
|
+
// A route extracted from a file's own AST is usually a decorator; a
|
|
260
|
+
// dispatch guard is the same transport with different provenance, and
|
|
261
|
+
// says so (`ExtractedDecoratorRoute.source`).
|
|
262
|
+
source: dr.source ?? `decorator-${dr.decoratorName}`,
|
|
263
|
+
method,
|
|
190
264
|
});
|
|
191
265
|
}
|
|
192
266
|
let handlerContents;
|
|
193
267
|
if (routeRegistry.size > 0) {
|
|
194
|
-
const
|
|
268
|
+
const handlerPathFor = (routeKey, entry) => {
|
|
269
|
+
if (entry.source !== DATA_ROUTE_TABLE_SOURCE)
|
|
270
|
+
return entry.filePath;
|
|
271
|
+
const handlerSymbolId = routeHandlerSymbols.get(routeKey);
|
|
272
|
+
const resolvedPath = handlerSymbolId
|
|
273
|
+
? ctx.graph.getNode(handlerSymbolId)?.properties.filePath
|
|
274
|
+
: undefined;
|
|
275
|
+
return typeof resolvedPath === 'string' ? resolvedPath : entry.filePath;
|
|
276
|
+
};
|
|
277
|
+
const handlerPaths = [...routeRegistry].map(([key, entry]) => handlerPathFor(key, entry));
|
|
195
278
|
handlerContents = await readFileContents(ctx.repoPath, handlerPaths);
|
|
196
279
|
for (const [routeKey, entry] of routeRegistry) {
|
|
197
|
-
const {
|
|
280
|
+
const { source: routeSource, method: routeMethod, url } = entry;
|
|
281
|
+
const handlerPath = handlerPathFor(routeKey, entry);
|
|
198
282
|
const content = handlerContents.get(handlerPath);
|
|
199
|
-
|
|
283
|
+
// A pre-seeded route can never legitimately appear in
|
|
284
|
+
// `routeHandlerSymbols`, so a key that does is a route that LOST (#3049).
|
|
285
|
+
const handlerSymbolId = preSeededKeys.has(routeKey)
|
|
286
|
+
? undefined
|
|
287
|
+
: routeHandlerSymbols.get(routeKey);
|
|
288
|
+
const analysisContent = entry.source === DATA_ROUTE_TABLE_SOURCE && content
|
|
289
|
+
? handlerSymbolContent(content, handlerSymbolId ? ctx.graph.getNode(handlerSymbolId) : undefined)
|
|
290
|
+
: content;
|
|
291
|
+
const { responseKeys, errorKeys } = analysisContent
|
|
200
292
|
? handlerPath.endsWith('.php')
|
|
201
|
-
? extractPHPResponseShapes(
|
|
202
|
-
: extractResponseShapes(
|
|
293
|
+
? extractPHPResponseShapes(analysisContent)
|
|
294
|
+
: extractResponseShapes(analysisContent)
|
|
203
295
|
: { responseKeys: undefined, errorKeys: undefined };
|
|
204
|
-
const mwResult =
|
|
296
|
+
const mwResult = analysisContent ? extractMiddlewareChain(analysisContent) : undefined;
|
|
205
297
|
const middleware = mwResult?.chain;
|
|
206
298
|
const routeNodeId = generateId('Route', routeKey);
|
|
207
|
-
const handlerSymbolId = routeHandlerSymbols.get(routeKey);
|
|
208
299
|
ctx.graph.addNode({
|
|
209
300
|
id: routeNodeId,
|
|
210
301
|
label: 'Route',
|