cgraphx 2.0.2 → 2.0.3
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/dist/core/code/engine/cli/analyze-config.js +320 -0
- package/dist/core/code/engine/cli/analyze.js +1086 -0
- package/dist/core/code/engine/cli/cli-message.js +83 -0
- package/dist/core/code/engine/cli/detect-changes-format.js +58 -0
- package/dist/core/code/engine/cli/embedding-dims.js +43 -0
- package/dist/core/code/engine/cli/format-elapsed.js +12 -0
- package/dist/core/code/engine/cli/help-i18n.js +144 -0
- package/dist/core/code/engine/cli/i18n/en.js +110 -0
- package/dist/core/code/engine/cli/i18n/index.js +47 -0
- package/dist/core/code/engine/cli/i18n/resources.js +9 -0
- package/dist/core/code/engine/cli/i18n/zh-CN.js +110 -0
- package/dist/core/code/engine/cli/lazy-action.js +67 -0
- package/dist/core/code/engine/cli/optional-grammars.js +136 -0
- package/dist/core/code/engine/cli/resolve-invocation.js +76 -0
- package/dist/core/code/engine/cli/status.js +156 -0
- package/dist/core/code/engine/cli/tool.js +384 -0
- package/dist/core/code/engine/config/ignore-service.js +511 -0
- package/dist/core/code/engine/config/supported-languages.js +17 -0
- package/dist/core/code/engine/core/analysis-features.js +64 -0
- package/dist/core/code/engine/core/analyzer-identity.js +2171 -0
- package/dist/core/code/engine/core/git-staleness.js +180 -0
- package/dist/core/code/engine/core/graph/graph.js +180 -0
- package/dist/core/code/engine/core/graph/import-cycles.js +106 -0
- package/dist/core/code/engine/core/graph/types.js +2 -0
- package/dist/core/code/engine/core/index-freshness.js +12 -0
- package/dist/core/code/engine/core/ingestion/binding-accumulator.js +341 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/c-cpp.js +168 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/csharp.js +9 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/dart.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/go.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/jvm.js +54 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/php.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/python.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/ruby.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/rust.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/swift.js +8 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/configs/typescript-javascript.js +11 -0
- package/dist/core/code/engine/core/ingestion/call-extractors/generic.js +62 -0
- package/dist/core/code/engine/core/ingestion/call-processor.js +503 -0
- package/dist/core/code/engine/core/ingestion/call-routing.js +98 -0
- package/dist/core/code/engine/core/ingestion/call-types.js +3 -0
- package/dist/core/code/engine/core/ingestion/cfg/callee-cell-format.js +45 -0
- package/dist/core/code/engine/core/ingestion/cfg/cfg-builder.js +202 -0
- package/dist/core/code/engine/core/ingestion/cfg/collect.js +81 -0
- package/dist/core/code/engine/core/ingestion/cfg/control-dependence.js +185 -0
- package/dist/core/code/engine/core/ingestion/cfg/control-flow-context.js +130 -0
- package/dist/core/code/engine/core/ingestion/cfg/emit.js +646 -0
- package/dist/core/code/engine/core/ingestion/cfg/post-dominators.js +182 -0
- package/dist/core/code/engine/core/ingestion/cfg/reaching-def-reason-codec.js +139 -0
- package/dist/core/code/engine/core/ingestion/cfg/reaching-defs-graph.js +322 -0
- package/dist/core/code/engine/core/ingestion/cfg/reaching-defs.js +792 -0
- package/dist/core/code/engine/core/ingestion/cfg/synthetic-escape.js +305 -0
- package/dist/core/code/engine/core/ingestion/cfg/traversal-result.js +6 -0
- package/dist/core/code/engine/core/ingestion/cfg/types.js +14 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp-harvest.js +545 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/c-cpp.js +590 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/call-site-harvest.js +356 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp-harvest.js +593 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/csharp.js +871 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/dart-harvest.js +874 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/dart.js +840 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/go-harvest.js +625 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/go.js +642 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/java-harvest.js +517 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/java.js +816 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin-harvest.js +723 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/kotlin.js +813 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/php-harvest.js +630 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/php.js +725 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/python-harvest.js +776 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/python.js +562 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby-harvest.js +591 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/ruby.js +760 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/rust-harvest.js +877 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/rust.js +562 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/scope-tree-harvest.js +120 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/swift-harvest.js +683 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/swift.js +791 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript-harvest.js +1060 -0
- package/dist/core/code/engine/core/ingestion/cfg/visitors/typescript.js +587 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/c-cpp.js +77 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/csharp.js +24 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/dart.js +10 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/go.js +28 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/jvm.js +67 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/php.js +10 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/python.js +10 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/ruby.js +13 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/rust.js +10 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/swift.js +21 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/configs/typescript-javascript.js +31 -0
- package/dist/core/code/engine/core/ingestion/class-extractors/generic.js +144 -0
- package/dist/core/code/engine/core/ingestion/class-types.js +2 -0
- package/dist/core/code/engine/core/ingestion/cluster-enricher.js +174 -0
- package/dist/core/code/engine/core/ingestion/community-processor.js +604 -0
- package/dist/core/code/engine/core/ingestion/constants.js +26 -0
- package/dist/core/code/engine/core/ingestion/cpp-ue-preprocessor.js +263 -0
- package/dist/core/code/engine/core/ingestion/csharp-namespace-gate.js +133 -0
- package/dist/core/code/engine/core/ingestion/di-extractors/index.js +38 -0
- package/dist/core/code/engine/core/ingestion/di-extractors/spring.js +310 -0
- package/dist/core/code/engine/core/ingestion/emit-references.js +244 -0
- package/dist/core/code/engine/core/ingestion/entry-point-scoring.js +201 -0
- package/dist/core/code/engine/core/ingestion/export-detection.js +244 -0
- package/dist/core/code/engine/core/ingestion/field-extractor.js +29 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/c-cpp.js +107 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/csharp.js +124 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/dart.js +99 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/go.js +102 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/helpers.js +198 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/jvm.js +172 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/php.js +67 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/python.js +94 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/ruby.js +79 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/rust.js +55 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/swift.js +93 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/configs/typescript-javascript.js +59 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/generic.js +147 -0
- package/dist/core/code/engine/core/ingestion/field-extractors/typescript.js +266 -0
- package/dist/core/code/engine/core/ingestion/field-types.js +3 -0
- package/dist/core/code/engine/core/ingestion/filesystem-walker.js +136 -0
- package/dist/core/code/engine/core/ingestion/finalize-orchestrator.js +159 -0
- package/dist/core/code/engine/core/ingestion/framework-detection.js +432 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/analysis-features.js +38 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/annotation-arguments.js +234 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/aop-candidates.js +88 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/aop.js +487 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/auto-configuration.js +21 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-candidates.js +189 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-catalog.js +32 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/bean-factories.js +73 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/conditionals.js +323 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/config-bindings.js +119 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/di-metadata.js +385 -0
- package/dist/core/code/engine/core/ingestion/frameworks/spring/resource-injection.js +96 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/c-cpp.js +17 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/csharp.js +46 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/dart.js +59 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/go.js +30 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/jvm.js +73 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/php.js +19 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/python.js +45 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/ruby.js +20 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/rust.js +58 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/swift.js +94 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/configs/typescript-javascript.js +26 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/csharp.js +128 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/go.js +50 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/jvm.js +112 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/php.js +80 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/python.js +75 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/resolver-factory.js +36 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/ruby.js +20 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/rust.js +79 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/standard.js +180 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/types.js +7 -0
- package/dist/core/code/engine/core/ingestion/import-resolvers/utils.js +153 -0
- package/dist/core/code/engine/core/ingestion/import-target-adapter.js +99 -0
- package/dist/core/code/engine/core/ingestion/language-config.js +391 -0
- package/dist/core/code/engine/core/ingestion/language-provider.js +25 -0
- package/dist/core/code/engine/core/ingestion/languages/c/arity-metadata.js +98 -0
- package/dist/core/code/engine/core/ingestion/languages/c/arity.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/c/capture-side-channel.js +69 -0
- package/dist/core/code/engine/core/ingestion/languages/c/captures.js +189 -0
- package/dist/core/code/engine/core/ingestion/languages/c/header-scan.js +58 -0
- package/dist/core/code/engine/core/ingestion/languages/c/import-decomposer.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/c/import-target.js +103 -0
- package/dist/core/code/engine/core/ingestion/languages/c/index.js +33 -0
- package/dist/core/code/engine/core/ingestion/languages/c/interpret.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/c/merge-bindings.js +26 -0
- package/dist/core/code/engine/core/ingestion/languages/c/query.js +210 -0
- package/dist/core/code/engine/core/ingestion/languages/c/scope-resolver.js +112 -0
- package/dist/core/code/engine/core/ingestion/languages/c/simple-hooks.js +24 -0
- package/dist/core/code/engine/core/ingestion/languages/c/static-linkage.js +109 -0
- package/dist/core/code/engine/core/ingestion/languages/c-cpp.js +506 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/adl.js +804 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/arity-metadata.js +258 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/arity.js +37 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/capture-side-channel.js +89 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/captures.js +1975 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-extractor.js +311 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/constraint-filter.js +210 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/conversion-rank.js +163 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/file-local-linkage.js +327 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/header-scan.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/import-decomposer.js +134 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/import-target.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/index.js +33 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/inline-namespaces.js +379 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/interpret.js +239 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/member-lookup.js +470 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/merge-bindings.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/query.js +763 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/range-bindings.js +230 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/scope-resolver.js +354 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/simple-hooks.js +67 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/two-phase-lookup.js +348 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/type-classifier.js +56 -0
- package/dist/core/code/engine/core/ingestion/languages/cpp/user-defined-conversions.js +128 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/accessor-unwrap.js +67 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/arity-metadata.js +49 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/arity.js +40 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/cache-stats.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/captures.js +557 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/import-decomposer.js +96 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/import-target.js +176 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/index.js +95 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/interpret.js +150 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/merge-bindings.js +58 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/namespace-siblings.js +708 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/qualified-type-names.js +62 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/query.js +578 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/receiver-binding.js +142 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/resolution-config.js +18 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/scope-resolver.js +84 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp/simple-hooks.js +81 -0
- package/dist/core/code/engine/core/ingestion/languages/csharp.js +204 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/arity-metadata.js +38 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/arity.js +34 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/built-ins.js +37 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/cache-stats.js +30 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/captures.js +1096 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/expand-wildcards.js +34 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/extension-type-preprocess.js +33 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/import-target.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/index.js +45 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/interpret.js +101 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/merge-bindings.js +42 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/query.js +246 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/receiver-binding.js +90 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/scope-resolver.js +197 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/signature-bindings.js +54 -0
- package/dist/core/code/engine/core/ingestion/languages/dart/simple-hooks.js +61 -0
- package/dist/core/code/engine/core/ingestion/languages/dart.js +138 -0
- package/dist/core/code/engine/core/ingestion/languages/go/arity-metadata.js +71 -0
- package/dist/core/code/engine/core/ingestion/languages/go/arity.js +17 -0
- package/dist/core/code/engine/core/ingestion/languages/go/cache-stats.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/go/captures.js +492 -0
- package/dist/core/code/engine/core/ingestion/languages/go/expand-wildcards.js +97 -0
- package/dist/core/code/engine/core/ingestion/languages/go/generic-type-parameters.js +146 -0
- package/dist/core/code/engine/core/ingestion/languages/go/import-decomposer.js +47 -0
- package/dist/core/code/engine/core/ingestion/languages/go/import-target.js +70 -0
- package/dist/core/code/engine/core/ingestion/languages/go/index.js +39 -0
- package/dist/core/code/engine/core/ingestion/languages/go/interface-impls.js +955 -0
- package/dist/core/code/engine/core/ingestion/languages/go/interpret.js +177 -0
- package/dist/core/code/engine/core/ingestion/languages/go/merge-bindings.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/go/method-owners.js +131 -0
- package/dist/core/code/engine/core/ingestion/languages/go/namespace-mirror.js +56 -0
- package/dist/core/code/engine/core/ingestion/languages/go/package-clause.js +79 -0
- package/dist/core/code/engine/core/ingestion/languages/go/package-siblings.js +83 -0
- package/dist/core/code/engine/core/ingestion/languages/go/query.js +298 -0
- package/dist/core/code/engine/core/ingestion/languages/go/range-binding.js +127 -0
- package/dist/core/code/engine/core/ingestion/languages/go/receiver-binding.js +24 -0
- package/dist/core/code/engine/core/ingestion/languages/go/scope-resolver.js +75 -0
- package/dist/core/code/engine/core/ingestion/languages/go/simple-hooks.js +31 -0
- package/dist/core/code/engine/core/ingestion/languages/go/type-binding.js +279 -0
- package/dist/core/code/engine/core/ingestion/languages/go.js +160 -0
- package/dist/core/code/engine/core/ingestion/languages/index.js +66 -0
- package/dist/core/code/engine/core/ingestion/languages/java/analysis-features.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/java/arity-metadata.js +43 -0
- package/dist/core/code/engine/core/ingestion/languages/java/arity.js +27 -0
- package/dist/core/code/engine/core/ingestion/languages/java/cache-stats.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/java/capture-side-channel.js +123 -0
- package/dist/core/code/engine/core/ingestion/languages/java/captures.js +791 -0
- package/dist/core/code/engine/core/ingestion/languages/java/import-decomposer.js +88 -0
- package/dist/core/code/engine/core/ingestion/languages/java/import-target.js +103 -0
- package/dist/core/code/engine/core/ingestion/languages/java/index.js +43 -0
- package/dist/core/code/engine/core/ingestion/languages/java/interpret.js +146 -0
- package/dist/core/code/engine/core/ingestion/languages/java/merge-bindings.js +43 -0
- package/dist/core/code/engine/core/ingestion/languages/java/package-facts.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/java/package-siblings.js +11 -0
- package/dist/core/code/engine/core/ingestion/languages/java/query.js +319 -0
- package/dist/core/code/engine/core/ingestion/languages/java/receiver-binding.js +98 -0
- package/dist/core/code/engine/core/ingestion/languages/java/scope-resolver.js +213 -0
- package/dist/core/code/engine/core/ingestion/languages/java/simple-hooks.js +39 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-aop.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-bean-metadata.js +11 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-conditionals.js +52 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-config-bindings.js +222 -0
- package/dist/core/code/engine/core/ingestion/languages/java/spring-di.js +165 -0
- package/dist/core/code/engine/core/ingestion/languages/java.js +192 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/arity.js +15 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/captures.js +1122 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/import-target.js +56 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/index.js +109 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/interpret.js +45 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/merge-bindings.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/query.js +659 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/scope-resolver.js +78 -0
- package/dist/core/code/engine/core/ingestion/languages/javascript/simple-hooks.js +44 -0
- package/dist/core/code/engine/core/ingestion/languages/jvm/package-facts.js +46 -0
- package/dist/core/code/engine/core/ingestion/languages/jvm/package-siblings.js +200 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/arity-metadata.js +23 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/arity.js +18 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/cache-stats.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/capture-side-channel.js +160 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/captures.js +1262 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/companion-scopes.js +72 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/import-decomposer.js +40 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/import-target.js +135 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/index.js +26 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/interpret.js +75 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/merge-bindings.js +28 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/owners.js +134 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/package-facts.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/package-siblings.js +11 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/query.js +243 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/receiver-binding.js +103 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/scope-resolver.js +207 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/simple-hooks.js +42 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-aop.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-bean-metadata.js +11 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-conditionals.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin/spring-di.js +304 -0
- package/dist/core/code/engine/core/ingestion/languages/kotlin.js +189 -0
- package/dist/core/code/engine/core/ingestion/languages/php/arity-metadata.js +66 -0
- package/dist/core/code/engine/core/ingestion/languages/php/arity.js +43 -0
- package/dist/core/code/engine/core/ingestion/languages/php/cache-stats.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/php/captures.js +1166 -0
- package/dist/core/code/engine/core/ingestion/languages/php/import-decomposer.js +238 -0
- package/dist/core/code/engine/core/ingestion/languages/php/import-target.js +213 -0
- package/dist/core/code/engine/core/ingestion/languages/php/index.js +85 -0
- package/dist/core/code/engine/core/ingestion/languages/php/interpret.js +256 -0
- package/dist/core/code/engine/core/ingestion/languages/php/merge-bindings.js +50 -0
- package/dist/core/code/engine/core/ingestion/languages/php/namespace-siblings.js +353 -0
- package/dist/core/code/engine/core/ingestion/languages/php/query.js +391 -0
- package/dist/core/code/engine/core/ingestion/languages/php/receiver-binding.js +135 -0
- package/dist/core/code/engine/core/ingestion/languages/php/scope-resolver.js +361 -0
- package/dist/core/code/engine/core/ingestion/languages/php/simple-hooks.js +116 -0
- package/dist/core/code/engine/core/ingestion/languages/php.js +302 -0
- package/dist/core/code/engine/core/ingestion/languages/python/arity-metadata.js +49 -0
- package/dist/core/code/engine/core/ingestion/languages/python/arity.js +41 -0
- package/dist/core/code/engine/core/ingestion/languages/python/cache-stats.js +34 -0
- package/dist/core/code/engine/core/ingestion/languages/python/captures.js +299 -0
- package/dist/core/code/engine/core/ingestion/languages/python/depends-references.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/python/import-decomposer.js +115 -0
- package/dist/core/code/engine/core/ingestion/languages/python/import-target.js +440 -0
- package/dist/core/code/engine/core/ingestion/languages/python/index-stats.js +30 -0
- package/dist/core/code/engine/core/ingestion/languages/python/index.js +96 -0
- package/dist/core/code/engine/core/ingestion/languages/python/interpret.js +430 -0
- package/dist/core/code/engine/core/ingestion/languages/python/merge-bindings.js +47 -0
- package/dist/core/code/engine/core/ingestion/languages/python/query.js +323 -0
- package/dist/core/code/engine/core/ingestion/languages/python/receiver-binding.js +310 -0
- package/dist/core/code/engine/core/ingestion/languages/python/scope-resolver.js +80 -0
- package/dist/core/code/engine/core/ingestion/languages/python/simple-hooks.js +53 -0
- package/dist/core/code/engine/core/ingestion/languages/python.js +140 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/arity.js +41 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/cache-stats.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/captures.js +864 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/import-target.js +88 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/index.js +29 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/interpret.js +115 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/merge-bindings.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/query.js +349 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/receiver-binding.js +70 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/scope-resolver.js +263 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby/simple-hooks.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/ruby.js +215 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/arity.js +16 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/cache-stats.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/captures.js +304 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/import-decomposer.js +167 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/import-target.js +108 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/index.js +29 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/interpret.js +201 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/merge-bindings.js +21 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/method-owners.js +76 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/module-path.js +222 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/qualified-call.js +482 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/query.js +280 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/range-binding.js +687 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/receiver-binding.js +148 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/scope-resolver.js +151 -0
- package/dist/core/code/engine/core/ingestion/languages/rust/simple-hooks.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/rust.js +183 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/arity-metadata.js +44 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/arity.js +45 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/base-type.js +30 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/cache-stats.js +32 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/captures.js +594 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/conditional-directive-preprocess.js +256 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/implicit-imports.js +60 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/import-decomposer.js +87 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/import-target.js +84 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/index.js +56 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/interpret.js +93 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/merge-bindings.js +51 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/query.js +226 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/receiver-binding.js +169 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/scope-resolver.js +192 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/sibling-type-bindings.js +68 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/signature-bindings.js +69 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/simple-hooks.js +65 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/target-grouping.js +97 -0
- package/dist/core/code/engine/core/ingestion/languages/swift/target-siblings.js +74 -0
- package/dist/core/code/engine/core/ingestion/languages/swift.js +246 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/arity-metadata.js +106 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/arity.js +57 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/array-callback.js +58 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/cache-stats.js +34 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/captures.js +956 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-export-assignment.js +535 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/cjs-module-exports.js +196 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/import-decomposer.js +374 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/import-target.js +65 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/index.js +108 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/interpret.js +344 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/merge-bindings.js +161 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/nuxt-auto-imports.js +325 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/query.js +1328 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/receiver-binding.js +201 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/scope-resolver.js +293 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript/simple-hooks.js +139 -0
- package/dist/core/code/engine/core/ingestion/languages/typescript.js +455 -0
- package/dist/core/code/engine/core/ingestion/languages/vue/captures.js +70 -0
- package/dist/core/code/engine/core/ingestion/languages/vue/import-target.js +61 -0
- package/dist/core/code/engine/core/ingestion/languages/vue/index.js +55 -0
- package/dist/core/code/engine/core/ingestion/languages/vue/scope-resolver.js +295 -0
- package/dist/core/code/engine/core/ingestion/languages/vue.js +96 -0
- package/dist/core/code/engine/core/ingestion/local-symbol-pruner.js +68 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/c-cpp.js +387 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/csharp.js +290 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/dart.js +392 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/go.js +179 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/jvm.js +350 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/php.js +306 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/python.js +312 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/ruby.js +289 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/rust.js +198 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/swift.js +286 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/configs/typescript-javascript.js +341 -0
- package/dist/core/code/engine/core/ingestion/method-extractors/generic.js +209 -0
- package/dist/core/code/engine/core/ingestion/method-types.js +3 -0
- package/dist/core/code/engine/core/ingestion/model/field-registry.js +41 -0
- package/dist/core/code/engine/core/ingestion/model/index.js +52 -0
- package/dist/core/code/engine/core/ingestion/model/method-registry.js +138 -0
- package/dist/core/code/engine/core/ingestion/model/owned-members-lookup.js +46 -0
- package/dist/core/code/engine/core/ingestion/model/registration-table.js +234 -0
- package/dist/core/code/engine/core/ingestion/model/resolve.js +183 -0
- package/dist/core/code/engine/core/ingestion/model/scope-resolution-indexes.js +43 -0
- package/dist/core/code/engine/core/ingestion/model/semantic-model.js +179 -0
- package/dist/core/code/engine/core/ingestion/model/symbol-table.js +216 -0
- package/dist/core/code/engine/core/ingestion/model/type-registry.js +84 -0
- package/dist/core/code/engine/core/ingestion/mro-processor.js +709 -0
- package/dist/core/code/engine/core/ingestion/parsing-processor.js +312 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/communities.js +69 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/cross-file.js +71 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/di.js +338 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/http-api-calls.js +312 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/index.js +54 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/mro.js +40 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/orm.js +78 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/parse-impl.js +1286 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/parse.js +41 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/processes.js +193 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/prune-local-symbols.js +29 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/registry.js +52 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/routes.js +409 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/rpc-edges.js +301 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/runner.js +207 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/scan.js +49 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-aop.js +442 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-auto-configuration.js +264 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/spring-config.js +440 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/structure.js +38 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/tools.js +89 -0
- package/dist/core/code/engine/core/ingestion/pipeline-phases/types.js +40 -0
- package/dist/core/code/engine/core/ingestion/pipeline.js +152 -0
- package/dist/core/code/engine/core/ingestion/process-processor.js +325 -0
- package/dist/core/code/engine/core/ingestion/resolve-references.js +205 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/constant-resolver.js +135 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/django-root-discovery.js +221 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/django.js +428 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/expo.js +39 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/fastapi-router-bindings.js +264 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/laravel.js +501 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/middleware.js +175 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/nextjs.js +81 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/php.js +25 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/python-const-resolver.js +307 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/response-shapes.js +299 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/route-path.js +71 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/spring-shared.js +310 -0
- package/dist/core/code/engine/core/ingestion/route-extractors/spring.js +441 -0
- package/dist/core/code/engine/core/ingestion/scope-extractor-bridge.js +60 -0
- package/dist/core/code/engine/core/ingestion/scope-extractor.js +1373 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/contract/scope-resolver.js +282 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +72 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/edges.js +194 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/ids.js +472 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/imports-to-edges.js +49 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/method-dispatch.js +43 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +274 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +93 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/callable-value-flow.js +1240 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/compound-receiver.js +1174 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/free-call-fallback.js +873 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/imported-return-types.js +226 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/mro.js +107 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/overload-narrowing.js +441 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/property-dispatch.js +122 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +1720 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/phase.js +395 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +208 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/registry.js +49 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/run.js +632 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/pipeline/validate-bindings-immutability.js +112 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/resolution-outcome.js +41 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/scope/namespace-targets.js +81 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/scope/walkers.js +1835 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/unresolved-receivers.js +242 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/utils/definition-id.js +22 -0
- package/dist/core/code/engine/core/ingestion/scope-resolution/workspace-index.js +151 -0
- package/dist/core/code/engine/core/ingestion/structure-processor.js +40 -0
- package/dist/core/code/engine/core/ingestion/tree-sitter-queries.js +2244 -0
- package/dist/core/code/engine/core/ingestion/ts-js-hoc-utils.js +115 -0
- package/dist/core/code/engine/core/ingestion/type-env.js +1136 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/c-cpp.js +555 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/csharp.js +570 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/dart.js +372 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/go.js +508 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/jvm.js +875 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/php.js +537 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/python.js +477 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/ruby.js +380 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/rust.js +502 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/shared.js +843 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/swift.js +490 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/types.js +2 -0
- package/dist/core/code/engine/core/ingestion/type-extractors/typescript.js +690 -0
- package/dist/core/code/engine/core/ingestion/utils/ast-helpers.js +1693 -0
- package/dist/core/code/engine/core/ingestion/utils/call-analysis.js +779 -0
- package/dist/core/code/engine/core/ingestion/utils/callable-flow-captures.js +932 -0
- package/dist/core/code/engine/core/ingestion/utils/callable-labels.js +49 -0
- package/dist/core/code/engine/core/ingestion/utils/deferred-resolution-profile.js +151 -0
- package/dist/core/code/engine/core/ingestion/utils/effective-ram.js +67 -0
- package/dist/core/code/engine/core/ingestion/utils/env.js +60 -0
- package/dist/core/code/engine/core/ingestion/utils/event-loop.js +9 -0
- package/dist/core/code/engine/core/ingestion/utils/graph-sort.js +103 -0
- package/dist/core/code/engine/core/ingestion/utils/heap-probe.js +45 -0
- package/dist/core/code/engine/core/ingestion/utils/heritage-marker.js +47 -0
- package/dist/core/code/engine/core/ingestion/utils/line-base.js +24 -0
- package/dist/core/code/engine/core/ingestion/utils/max-file-size.js +59 -0
- package/dist/core/code/engine/core/ingestion/utils/method-props.js +198 -0
- package/dist/core/code/engine/core/ingestion/utils/qualified-name.js +73 -0
- package/dist/core/code/engine/core/ingestion/utils/receiver-chain-captures.js +60 -0
- package/dist/core/code/engine/core/ingestion/utils/receiver-chain-codec.js +188 -0
- package/dist/core/code/engine/core/ingestion/utils/scope-tree-walk.js +36 -0
- package/dist/core/code/engine/core/ingestion/utils/symbol-labels.js +48 -0
- package/dist/core/code/engine/core/ingestion/utils/template-arguments.js +187 -0
- package/dist/core/code/engine/core/ingestion/utils/type-parameters.js +209 -0
- package/dist/core/code/engine/core/ingestion/utils/verbose.js +6 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/c-cpp.js +133 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/csharp.js +66 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/dart.js +111 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/go.js +153 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/jvm.js +145 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/php.js +61 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/python.js +104 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/ruby.js +55 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/rust.js +79 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/swift.js +91 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/configs/typescript-javascript.js +86 -0
- package/dist/core/code/engine/core/ingestion/variable-extractors/generic.js +111 -0
- package/dist/core/code/engine/core/ingestion/variable-types.js +3 -0
- package/dist/core/code/engine/core/ingestion/vue-sfc-extractor.js +544 -0
- package/dist/core/code/engine/core/ingestion/workers/callable-id.js +122 -0
- package/dist/core/code/engine/core/ingestion/workers/clone-safety.js +470 -0
- package/dist/core/code/engine/core/ingestion/workers/parse-worker.js +2456 -0
- package/dist/core/code/engine/core/ingestion/workers/post-result.js +90 -0
- package/dist/core/code/engine/core/ingestion/workers/quarantine.js +41 -0
- package/dist/core/code/engine/core/ingestion/workers/result-merge.js +59 -0
- package/dist/core/code/engine/core/ingestion/workers/worker-pool.js +1725 -0
- package/dist/core/code/engine/core/ingestion/workspace-config.js +139 -0
- package/dist/core/code/engine/core/lbug/conn-lock.js +72 -0
- package/dist/core/code/engine/core/lbug/csv-generator.js +710 -0
- package/dist/core/code/engine/core/lbug/cypher-escape.js +24 -0
- package/dist/core/code/engine/core/lbug/extension-load-error.js +339 -0
- package/dist/core/code/engine/core/lbug/extension-loader.js +261 -0
- package/dist/core/code/engine/core/lbug/graph-emit-sink.js +584 -0
- package/dist/core/code/engine/core/lbug/lbug-adapter.js +2703 -0
- package/dist/core/code/engine/core/lbug/lbug-config.js +1029 -0
- package/dist/core/code/engine/core/lbug/native-check.js +435 -0
- package/dist/core/code/engine/core/lbug/pool-adapter.js +973 -0
- package/dist/core/code/engine/core/lbug/query-params.js +25 -0
- package/dist/core/code/engine/core/lbug/query-result-utils.js +31 -0
- package/dist/core/code/engine/core/lbug/rel-pair-routing.js +373 -0
- package/dist/core/code/engine/core/lbug/schema.js +771 -0
- package/dist/core/code/engine/core/lbug/shutdown-helpers.js +40 -0
- package/dist/core/code/engine/core/lbug/sidecar-recovery.js +716 -0
- package/dist/core/code/engine/core/lbug/stdio-capture.js +49 -0
- package/dist/core/code/engine/core/lbug/sync-csv-writer.js +115 -0
- package/dist/core/code/engine/core/lbug/wal-checkpoint-driver.js +215 -0
- package/dist/core/code/engine/core/lbug/wal-driver-state.js +28 -0
- package/dist/core/code/engine/core/logger.js +339 -0
- package/dist/core/code/engine/core/platform/capabilities.js +91 -0
- package/dist/core/code/engine/core/run-analyze.js +1098 -0
- package/dist/core/code/engine/core/tree-sitter/parser-loader.js +281 -0
- package/dist/core/code/engine/core/tree-sitter/safe-parse.js +258 -0
- package/dist/core/code/engine/core/tree-sitter/vendored-grammars.js +64 -0
- package/dist/core/code/engine/lib/utils.js +121 -0
- package/dist/core/code/engine/mcp/core/lbug-adapter.js +27 -0
- package/dist/core/code/engine/mcp/local/aop-metadata.js +230 -0
- package/dist/core/code/engine/mcp/local/bean-metadata.js +49 -0
- package/dist/core/code/engine/mcp/local/limits.js +15 -0
- package/dist/core/code/engine/mcp/local/line-display.js +6 -0
- package/dist/core/code/engine/mcp/local/local-backend.js +4142 -0
- package/dist/core/code/engine/storage/branch-index.js +72 -0
- package/dist/core/code/engine/storage/file-hash.js +95 -0
- package/dist/core/code/engine/storage/fs-atomic.js +34 -0
- package/dist/core/code/engine/storage/git.js +555 -0
- package/dist/core/code/engine/storage/index-lock.js +664 -0
- package/dist/core/code/engine/storage/parse-cache.js +650 -0
- package/dist/core/code/engine/storage/parsedfile-store.js +620 -0
- package/dist/core/code/engine/storage/repo-manager.js +1061 -0
- package/dist/core/code/engine/storage/scope-index-store.js +247 -0
- package/dist/core/code/engine/types/pipeline.js +2 -0
- package/dist/core/code/scripts/install-duckdb-extension.mjs +125 -0
- package/dist/core/code/scripts/resolve-analyze-cmd.cjs +346 -0
- package/dist/core/code/shared/graph/types.js +8 -0
- package/dist/core/code/shared/index.js +105 -0
- package/dist/core/code/shared/integrations/circuit-breaker.js +242 -0
- package/dist/core/code/shared/integrations/resilient-fetch.js +224 -0
- package/dist/core/code/shared/integrations/retry.js +70 -0
- package/dist/core/code/shared/integrations/understand-quickly.js +145 -0
- package/dist/core/code/shared/language-detection.js +162 -0
- package/dist/core/code/shared/languages.js +27 -0
- package/dist/core/code/shared/lbug/schema-constants.js +98 -0
- package/dist/core/code/shared/mro-strategy.js +2 -0
- package/dist/core/code/shared/pipeline.js +5 -0
- package/dist/core/code/shared/scope-resolution/callable-flow-site.js +11 -0
- package/dist/core/code/shared/scope-resolution/def-index.js +53 -0
- package/dist/core/code/shared/scope-resolution/evidence-weights.js +87 -0
- package/dist/core/code/shared/scope-resolution/finalize-algorithm.js +807 -0
- package/dist/core/code/shared/scope-resolution/language-classification.js +46 -0
- package/dist/core/code/shared/scope-resolution/method-dispatch-index.js +100 -0
- package/dist/core/code/shared/scope-resolution/module-scope-index.js +59 -0
- package/dist/core/code/shared/scope-resolution/origin-priority.js +23 -0
- package/dist/core/code/shared/scope-resolution/parsed-file.js +54 -0
- package/dist/core/code/shared/scope-resolution/position-index.js +136 -0
- package/dist/core/code/shared/scope-resolution/qualified-name-index.js +77 -0
- package/dist/core/code/shared/scope-resolution/reference-site.js +24 -0
- package/dist/core/code/shared/scope-resolution/registries/class-registry.js +32 -0
- package/dist/core/code/shared/scope-resolution/registries/context.js +52 -0
- package/dist/core/code/shared/scope-resolution/registries/evidence.js +152 -0
- package/dist/core/code/shared/scope-resolution/registries/field-registry.js +33 -0
- package/dist/core/code/shared/scope-resolution/registries/lookup-core.js +392 -0
- package/dist/core/code/shared/scope-resolution/registries/lookup-qualified.js +58 -0
- package/dist/core/code/shared/scope-resolution/registries/macro-registry.js +34 -0
- package/dist/core/code/shared/scope-resolution/registries/method-registry.js +34 -0
- package/dist/core/code/shared/scope-resolution/registries/tie-breaks.js +63 -0
- package/dist/core/code/shared/scope-resolution/resolve-type-ref.js +128 -0
- package/dist/core/code/shared/scope-resolution/scope-id.js +49 -0
- package/dist/core/code/shared/scope-resolution/scope-tree.js +225 -0
- package/dist/core/code/shared/scope-resolution/symbol-definition.js +12 -0
- package/dist/core/code/shared/scope-resolution/types.js +25 -0
- package/dist/core/code/shared/test-helpers.js +17 -0
- package/dist/core/code/vendor/leiden/index.cjs +355 -0
- package/dist/core/code/vendor/leiden/utils.cjs +419 -0
- package/dist/core/timeline/cli.d.ts.map +1 -1
- package/dist/core/timeline/cli.js +13 -6
- package/dist/core/timeline/cli.js.map +1 -1
- package/dist/core/timeline/debris.d.ts +20 -0
- package/dist/core/timeline/debris.d.ts.map +1 -0
- package/dist/core/timeline/debris.js +124 -0
- package/dist/core/timeline/debris.js.map +1 -0
- package/dist/core/timeline/hook-runner.d.ts.map +1 -1
- package/dist/core/timeline/hook-runner.js +3 -1
- package/dist/core/timeline/hook-runner.js.map +1 -1
- package/dist/core/timeline/hooks.d.ts.map +1 -1
- package/dist/core/timeline/hooks.js +13 -5
- package/dist/core/timeline/hooks.js.map +1 -1
- package/dist/core/timeline/installer.d.ts +2 -0
- package/dist/core/timeline/installer.d.ts.map +1 -1
- package/dist/core/timeline/installer.js +12 -0
- package/dist/core/timeline/installer.js.map +1 -1
- package/dist/core/timeline/project-root.d.ts +21 -0
- package/dist/core/timeline/project-root.d.ts.map +1 -0
- package/dist/core/timeline/project-root.js +83 -0
- package/dist/core/timeline/project-root.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,716 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports._resetSidecarRecoveryWarningsForTest = exports.guardWalQuarantine = exports.renameFailureMessage = exports.lbugLockRemediation = exports.isPermissionRenameError = exports.presentShadowUnreachableMessage = exports.shadowSidecarRecoveryMessage = exports.isReadOnlyShadowReplayError = exports.isMissingShadowSidecarError = exports.statIfExists = exports.sidecarPreflightDisabled = exports.isMissingFsError = exports.TINY_ORPHAN_WAL_BYTES = void 0;
|
|
7
|
+
exports.inspectLbugSidecars = inspectLbugSidecars;
|
|
8
|
+
exports.quarantineWalForMissingShadow = quarantineWalForMissingShadow;
|
|
9
|
+
exports.preflightLbugSidecars = preflightLbugSidecars;
|
|
10
|
+
exports.finalizeLbugSidecarsAfterClose = finalizeLbugSidecarsAfterClose;
|
|
11
|
+
exports.quarantineSidecarsForDirtyRecovery = quarantineSidecarsForDirtyRecovery;
|
|
12
|
+
exports.listQuarantinedMissingShadowWals = listQuarantinedMissingShadowWals;
|
|
13
|
+
exports.cleanQuarantinedMissingShadowWals = cleanQuarantinedMissingShadowWals;
|
|
14
|
+
exports.listParkedDirtyRecoverySidecars = listParkedDirtyRecoverySidecars;
|
|
15
|
+
exports.cleanParkedDirtyRecoverySidecars = cleanParkedDirtyRecoverySidecars;
|
|
16
|
+
exports.listParkedLbugSidecars = listParkedLbugSidecars;
|
|
17
|
+
exports.cleanParkedLbugSidecars = cleanParkedLbugSidecars;
|
|
18
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
19
|
+
const path_1 = __importDefault(require("path"));
|
|
20
|
+
const lbug_config_js_1 = require("./lbug-config.js");
|
|
21
|
+
exports.TINY_ORPHAN_WAL_BYTES = 4 * 1024;
|
|
22
|
+
/**
|
|
23
|
+
* Counter-based warn anti-spam (PR #1747 review, Finding 6).
|
|
24
|
+
*
|
|
25
|
+
* The previous design (`warnedKeys: Set<string>`) warned exactly once per key
|
|
26
|
+
* per process and silently downgraded all subsequent occurrences to debug. In
|
|
27
|
+
* a long-lived `cgraph serve` process touching the same dbPath repeatedly,
|
|
28
|
+
* a persistent condition produced one warn at the first occurrence and then
|
|
29
|
+
* 99+ silent debug lines — invisible to operators reading warn-level logs.
|
|
30
|
+
*
|
|
31
|
+
* The counter-based design warns on logarithmic milestones so persistence
|
|
32
|
+
* stays visible. Geometric spacing keeps total warn count bounded at O(log N)
|
|
33
|
+
* for a condition that fires N times.
|
|
34
|
+
*/
|
|
35
|
+
const warnedKeyCounts = new Map();
|
|
36
|
+
const WARN_MILESTONES = [1, 10, 100, 1000, 10000];
|
|
37
|
+
const ordinal = (n) => {
|
|
38
|
+
switch (n) {
|
|
39
|
+
case 1:
|
|
40
|
+
return '1st';
|
|
41
|
+
case 10:
|
|
42
|
+
return '10th';
|
|
43
|
+
case 100:
|
|
44
|
+
return '100th';
|
|
45
|
+
case 1000:
|
|
46
|
+
return '1000th';
|
|
47
|
+
case 10000:
|
|
48
|
+
return '10000th';
|
|
49
|
+
default:
|
|
50
|
+
return `${n}th`;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const isMissingFsError = (err) => err?.code === 'ENOENT';
|
|
54
|
+
exports.isMissingFsError = isMissingFsError;
|
|
55
|
+
const missing = exports.isMissingFsError;
|
|
56
|
+
const sidecarPreflightDisabled = () => /^(1|true|yes|on)$/i.test(process.env.CGRAPH_DISABLE_LBUG_SIDECAR_PREFLIGHT ?? '');
|
|
57
|
+
exports.sidecarPreflightDisabled = sidecarPreflightDisabled;
|
|
58
|
+
const statIfExists = async (filePath) => {
|
|
59
|
+
try {
|
|
60
|
+
const statFn = promises_1.default.stat;
|
|
61
|
+
if (typeof statFn === 'function') {
|
|
62
|
+
const stat = await statFn(filePath);
|
|
63
|
+
return { size: stat.size };
|
|
64
|
+
}
|
|
65
|
+
// Some focused unit tests provide a deliberately tiny fs mock. Treat a
|
|
66
|
+
// path as present only when access succeeds, with an unknown/zero size.
|
|
67
|
+
await promises_1.default.access(filePath);
|
|
68
|
+
return { size: 0 };
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
if (missing(err))
|
|
72
|
+
return null;
|
|
73
|
+
throw err;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
exports.statIfExists = statIfExists;
|
|
77
|
+
const logDebug = (logger, message) => {
|
|
78
|
+
if (logger.debug)
|
|
79
|
+
logger.debug(message);
|
|
80
|
+
};
|
|
81
|
+
const logInfo = (logger, message) => {
|
|
82
|
+
if (logger.info)
|
|
83
|
+
logger.info(message);
|
|
84
|
+
else
|
|
85
|
+
logDebug(logger, message);
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Log at warn-level on logarithmic milestone occurrences (1st, 10th, 100th,
|
|
89
|
+
* 1000th, 10000th); debug-level otherwise. Past the first occurrence the warn
|
|
90
|
+
* message is suffixed with the occurrence count so operators can see the
|
|
91
|
+
* condition's persistence at a glance.
|
|
92
|
+
*
|
|
93
|
+
* The signature and key convention (`${dbPath}:suffix`) are unchanged from the
|
|
94
|
+
* previous warn-once implementation — call sites need no edits.
|
|
95
|
+
*/
|
|
96
|
+
const warnOnce = (logger, key, message) => {
|
|
97
|
+
const next = (warnedKeyCounts.get(key) ?? 0) + 1;
|
|
98
|
+
warnedKeyCounts.set(key, next);
|
|
99
|
+
const isMilestone = WARN_MILESTONES.includes(next);
|
|
100
|
+
if (!isMilestone) {
|
|
101
|
+
logDebug(logger, message);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (next === 1) {
|
|
105
|
+
logger.warn(message);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
logger.warn(`${message} (${ordinal(next)} occurrence of this condition)`);
|
|
109
|
+
};
|
|
110
|
+
// LADYBUGDB-CONTRACT: matches @ladybugdb/core ^0.18.0 native error text.
|
|
111
|
+
// When bumping LadybugDB, re-validate this against the new error format
|
|
112
|
+
// — `git grep "LADYBUGDB-CONTRACT"` enumerates every version-coupled spot.
|
|
113
|
+
//
|
|
114
|
+
// Two native formats reach here for a genuinely-missing shadow sidecar:
|
|
115
|
+
// POSIX: `Cannot open file <path>.shadow: No such file or directory`
|
|
116
|
+
// Windows: `Cannot open file. path: <path>.shadow - Error 2: <system text>`
|
|
117
|
+
// Windows OS text is localized on non-English installs (issue #2382 was filed
|
|
118
|
+
// from a non-English Windows), so we key on the locale-invariant Win32 code
|
|
119
|
+
// (2 = ERROR_FILE_NOT_FOUND), NOT the English phrase. The code is matched only
|
|
120
|
+
// in the reason AFTER the LAST `.shadow` token (the real failing sidecar; the
|
|
121
|
+
// reason text never contains `.shadow`), so a repo *path* containing e.g.
|
|
122
|
+
// `\error 2\` — even under a `.shadow`-suffixed parent directory — cannot trip
|
|
123
|
+
// it. Deliberate exclusions:
|
|
124
|
+
// - `Error 3` (ERROR_PATH_NOT_FOUND): the #1811 non-ASCII path-garble
|
|
125
|
+
// artifact (see lbug-config.ts) where the shadow is PRESENT on disk;
|
|
126
|
+
// treating it as missing would quarantine a live WAL — data loss.
|
|
127
|
+
// - `Error 5` / `Error 32` / POSIX `Permission denied`: present-but-locked;
|
|
128
|
+
// handled as permission/lock classes, must not quarantine.
|
|
129
|
+
// The quarantine path adds a present-shadow disk check as a belt (see
|
|
130
|
+
// refuseLargeWalQuarantine in lbug-adapter.ts).
|
|
131
|
+
//
|
|
132
|
+
// The Windows branch is derived from the issue #2382 reported string, not a
|
|
133
|
+
// self-produced live crash; unit/consumer tests inject that same string, so
|
|
134
|
+
// GREEN TESTS DO NOT PROVE the byte-exact 0.18.0 Windows format — confirm
|
|
135
|
+
// against a real Windows run before closing #2382.
|
|
136
|
+
const isMissingShadowSidecarError = (err) => {
|
|
137
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
138
|
+
if (!/cannot open file/i.test(msg))
|
|
139
|
+
return false;
|
|
140
|
+
// Anchor on the LAST `.shadow`, not the first: LadybugDB names the failing
|
|
141
|
+
// sidecar as the final `.shadow` token and its reason text (POSIX
|
|
142
|
+
// `: No such file or directory` / Windows ` - Error N: ...`) never contains
|
|
143
|
+
// `.shadow`. Slicing from the last match isolates the true reason, so an
|
|
144
|
+
// earlier `.shadow`-suffixed path segment (e.g. a `branch=subdir` directory
|
|
145
|
+
// like `snap.shadow\`) can't shift the anchor and let a path-embedded
|
|
146
|
+
// `error 2` be read as the Win32 code (issue #2382 review, Finding A).
|
|
147
|
+
const lastShadow = [...msg.matchAll(/\.shadow\b/gi)].at(-1);
|
|
148
|
+
if (lastShadow?.index === undefined)
|
|
149
|
+
return false;
|
|
150
|
+
const reason = msg.slice(lastShadow.index);
|
|
151
|
+
return /no such file or directory/i.test(reason) || /\berror\s+2\b/i.test(reason);
|
|
152
|
+
};
|
|
153
|
+
exports.isMissingShadowSidecarError = isMissingShadowSidecarError;
|
|
154
|
+
// LADYBUGDB-CONTRACT: matches @ladybugdb/core ^0.18.0 native error text.
|
|
155
|
+
// When bumping LadybugDB, re-validate this regex against the new error format
|
|
156
|
+
// — `git grep "LADYBUGDB-CONTRACT"` enumerates every version-coupled spot.
|
|
157
|
+
// Verified by upstream source/changelog diff only — a reliable cross-platform
|
|
158
|
+
// live trigger for a read-only shadow-replay state isn't practical to
|
|
159
|
+
// construct, so this matcher does not have live-trigger test coverage.
|
|
160
|
+
const isReadOnlyShadowReplayError = (err) => {
|
|
161
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
162
|
+
return /replay shadow pages under read-only mode/i.test(msg);
|
|
163
|
+
};
|
|
164
|
+
exports.isReadOnlyShadowReplayError = isReadOnlyShadowReplayError;
|
|
165
|
+
const shadowSidecarRecoveryMessage = (dbPath, err) => {
|
|
166
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
167
|
+
return (`LadybugDB checkpoint sidecar is missing for ${dbPath}. ` +
|
|
168
|
+
'Rebuild the index with `cgraph analyze --force <repo-path> --index-only` and restart `cgraph serve`.' +
|
|
169
|
+
`\n Original error: ${msg.slice(0, 200)}`);
|
|
170
|
+
};
|
|
171
|
+
exports.shadowSidecarRecoveryMessage = shadowSidecarRecoveryMessage;
|
|
172
|
+
/**
|
|
173
|
+
* Actionable message for the case where LadybugDB reports a "missing shadow"
|
|
174
|
+
* but `inspectLbugSidecars` finds the `.shadow` PRESENT on disk — the open
|
|
175
|
+
* failed on path reachability or a lock, not a genuinely-missing sidecar (issue
|
|
176
|
+
* #2382 review, S2). Unlike `shadowSidecarRecoveryMessage` it does NOT tell the
|
|
177
|
+
* operator to rebuild the index (the remedy is fixing the lock/path). Keeps the
|
|
178
|
+
* `Original error:` tail so downstream `isMissingShadowSidecarError` recognition
|
|
179
|
+
* still matches the wrapped error.
|
|
180
|
+
*/
|
|
181
|
+
const presentShadowUnreachableMessage = (dbPath, err) => {
|
|
182
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
183
|
+
return (`LadybugDB checkpoint sidecar is present but unreachable for ${dbPath}. ` +
|
|
184
|
+
'The .shadow file is on disk, so the open likely failed on path reachability or a file lock ' +
|
|
185
|
+
'(antivirus, another process holding a handle, or a non-ASCII path) rather than a missing sidecar. ' +
|
|
186
|
+
'Check filesystem access and locks; only run `cgraph analyze --force <repo-path> --index-only` ' +
|
|
187
|
+
'if the index is genuinely broken.' +
|
|
188
|
+
`\n Original error: ${msg.slice(0, 200)}`);
|
|
189
|
+
};
|
|
190
|
+
exports.presentShadowUnreachableMessage = presentShadowUnreachableMessage;
|
|
191
|
+
const PERMISSION_RENAME_CODES = new Set(['EACCES', 'EPERM', 'EBUSY']);
|
|
192
|
+
const isPermissionRenameError = (err) => {
|
|
193
|
+
const code = err?.code;
|
|
194
|
+
return typeof code === 'string' && PERMISSION_RENAME_CODES.has(code);
|
|
195
|
+
};
|
|
196
|
+
exports.isPermissionRenameError = isPermissionRenameError;
|
|
197
|
+
/**
|
|
198
|
+
* Canonical remediation guidance for the LadybugDB file-lock class
|
|
199
|
+
* (EBUSY/EPERM/EACCES — an MCP/serve process holding the index, or an
|
|
200
|
+
* antivirus scan). One exported producer (this shipping review, FIX 7):
|
|
201
|
+
* the dirty-recovery park warning below, `LbugWipeError`'s message builder
|
|
202
|
+
* (lbug-adapter.ts) and {@link renameFailureMessage} previously carried
|
|
203
|
+
* three divergent hand-written copies of the same advice.
|
|
204
|
+
*
|
|
205
|
+
* `rerun` names the command to retry once the lock clears — the analyze
|
|
206
|
+
* wipe/park surfaces re-run the analyze; the read-path quarantine surface
|
|
207
|
+
* re-runs whatever command failed. No trailing period: callers own the
|
|
208
|
+
* sentence end.
|
|
209
|
+
*/
|
|
210
|
+
const lbugLockRemediation = (rerun = 're-run `cgraph analyze`') => 'stop any GitNexus MCP or serve process using this repository, add an antivirus ' +
|
|
211
|
+
`exclusion for the GitNexus storage directory, then ${rerun}`;
|
|
212
|
+
exports.lbugLockRemediation = lbugLockRemediation;
|
|
213
|
+
/**
|
|
214
|
+
* Classify a failure surfaced by quarantine rename into an actionable user-facing
|
|
215
|
+
* message.
|
|
216
|
+
*
|
|
217
|
+
* - EACCES / EPERM / EBUSY → permission-specific message pointing at filesystem
|
|
218
|
+
* ACLs, AV exclusions, and file-locks. Importantly does NOT instruct the user
|
|
219
|
+
* to rebuild the index — the underlying problem is environmental, not data
|
|
220
|
+
* integrity, and re-running after fixing the lock/permission will succeed.
|
|
221
|
+
* - Everything else (including the LadybugDB "Cannot open file *.shadow"
|
|
222
|
+
* missing-shadow error, ENOSPC, EROFS, EIO, and any other thrown Error) →
|
|
223
|
+
* falls back to `shadowSidecarRecoveryMessage`, preserving today's behavior.
|
|
224
|
+
*
|
|
225
|
+
* Use at caller catches around `quarantineWalForMissingShadow` and any other
|
|
226
|
+
* path where an `fs.rename`-class failure may surface to operators.
|
|
227
|
+
*/
|
|
228
|
+
const renameFailureMessage = (dbPath, err) => {
|
|
229
|
+
if ((0, exports.isPermissionRenameError)(err)) {
|
|
230
|
+
const code = err.code;
|
|
231
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
232
|
+
return (`GitNexus could not move the LadybugDB WAL sidecar at ${dbPath}.wal because of a ` +
|
|
233
|
+
`filesystem permission or file-lock error (${code}). ` +
|
|
234
|
+
'The index does not need to be rebuilt — ' +
|
|
235
|
+
// Shared remediation copy (FIX 7); this surface serves read paths too,
|
|
236
|
+
// so the re-run target is the failing command, not the analyze.
|
|
237
|
+
`${(0, exports.lbugLockRemediation)('re-run the failing command once the lock or permission is resolved')}.` +
|
|
238
|
+
`\n Original error: ${msg.slice(0, 200)}`);
|
|
239
|
+
}
|
|
240
|
+
return (0, exports.shadowSidecarRecoveryMessage)(dbPath, err);
|
|
241
|
+
};
|
|
242
|
+
exports.renameFailureMessage = renameFailureMessage;
|
|
243
|
+
async function inspectLbugSidecars(dbPath) {
|
|
244
|
+
const wal = await (0, exports.statIfExists)(`${dbPath}.wal`);
|
|
245
|
+
const shadow = await (0, exports.statIfExists)(`${dbPath}.shadow`);
|
|
246
|
+
if (wal && shadow) {
|
|
247
|
+
return { kind: 'wal-with-shadow', dbPath, walBytes: wal.size, shadowBytes: shadow.size };
|
|
248
|
+
}
|
|
249
|
+
if (wal) {
|
|
250
|
+
if (wal.size <= exports.TINY_ORPHAN_WAL_BYTES) {
|
|
251
|
+
return { kind: 'tiny-orphan-wal', dbPath, walBytes: wal.size };
|
|
252
|
+
}
|
|
253
|
+
return { kind: 'orphan-wal', dbPath, walBytes: wal.size };
|
|
254
|
+
}
|
|
255
|
+
if (shadow) {
|
|
256
|
+
return { kind: 'orphan-shadow', dbPath, shadowBytes: shadow.size };
|
|
257
|
+
}
|
|
258
|
+
return { kind: 'clean', dbPath };
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Reject the WAL-quarantine path when discarding the WAL would be unsafe or
|
|
262
|
+
* wrong. Shared by every reactive missing-shadow recovery consumer — serve (via
|
|
263
|
+
* lbug-adapter's `refuseLargeWalQuarantine`) and the MCP/wiki/augmentation pool
|
|
264
|
+
* (via pool-adapter's `tryQuarantineForMissingShadow`) — so the quarantine
|
|
265
|
+
* safety policy has a single source of truth (issue #2382 review, Finding B).
|
|
266
|
+
*
|
|
267
|
+
* 1. `wal-with-shadow` — the `.shadow` sidecar is PRESENT on disk. A
|
|
268
|
+
* "missing shadow" error alongside a present shadow means the open failed
|
|
269
|
+
* on path reachability or a lock (the #1811 non-ASCII path-garble on
|
|
270
|
+
* Windows), not a genuinely-missing shadow; quarantining would move a live
|
|
271
|
+
* WAL sitting next to its shadow — data loss.
|
|
272
|
+
* 2. `orphan-wal` — the orphan WAL is too large to safely discard
|
|
273
|
+
* (>TINY_ORPHAN_WAL_BYTES); preserve the uncheckpointed pages for explicit
|
|
274
|
+
* operator recovery.
|
|
275
|
+
*
|
|
276
|
+
* Throws `shadowSidecarRecoveryMessage` in either case. Returns silently only
|
|
277
|
+
* when the shadow is absent AND the WAL is absent or tiny — the states where
|
|
278
|
+
* the existing recovery path is safe to proceed. `mode` is a label used only in
|
|
279
|
+
* the warning text (e.g. 'read-only', 'writable', 'pool read-only recovery').
|
|
280
|
+
*/
|
|
281
|
+
const guardWalQuarantine = async (dbPath, mode, triggeringErr, logger) => {
|
|
282
|
+
const state = await inspectLbugSidecars(dbPath);
|
|
283
|
+
if (state.kind === 'wal-with-shadow') {
|
|
284
|
+
warnOnce(logger, `${dbPath}:present-shadow-refuse:${mode}`, `GitNexus: refusing to quarantine WAL at ${dbPath}.wal during ${mode} recovery — ` +
|
|
285
|
+
'the .shadow sidecar is present on disk, so the open likely failed on path reachability or a lock ' +
|
|
286
|
+
'rather than a missing shadow. Run `cgraph analyze --force <repo-path> --index-only` if the index is genuinely broken.');
|
|
287
|
+
throw new Error((0, exports.presentShadowUnreachableMessage)(dbPath, triggeringErr));
|
|
288
|
+
}
|
|
289
|
+
if (state.kind === 'orphan-wal') {
|
|
290
|
+
warnOnce(logger, `${dbPath}:large-wal-refuse:${mode}`, `GitNexus: refusing to quarantine large WAL (${state.walBytes} bytes) at ${dbPath}.wal during ${mode} recovery; ` +
|
|
291
|
+
'manual recovery required — run `cgraph analyze --force <repo-path> --index-only`.');
|
|
292
|
+
throw new Error((0, exports.shadowSidecarRecoveryMessage)(dbPath, triggeringErr));
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
exports.guardWalQuarantine = guardWalQuarantine;
|
|
296
|
+
async function quarantineWalForMissingShadow(dbPath, options) {
|
|
297
|
+
const walPath = `${dbPath}.wal`;
|
|
298
|
+
const quarantinePath = `${walPath}.missing-shadow.${Date.now()}-${Math.random()
|
|
299
|
+
.toString(36)
|
|
300
|
+
.slice(2)}`;
|
|
301
|
+
await promises_1.default.rename(walPath, quarantinePath);
|
|
302
|
+
const message = `GitNexus: quarantined WAL ${path_1.default.basename(quarantinePath)} because LadybugDB shadow sidecar was missing; ` +
|
|
303
|
+
`continuing from last checkpoint${options.reason ? ` (${options.reason})` : ''}`;
|
|
304
|
+
if (options.level === 'warn') {
|
|
305
|
+
warnOnce(options.logger, `${dbPath}:missing-shadow-quarantine`, message);
|
|
306
|
+
}
|
|
307
|
+
else if (options.level === 'info') {
|
|
308
|
+
logInfo(options.logger, message);
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
logDebug(options.logger, message);
|
|
312
|
+
}
|
|
313
|
+
return quarantinePath;
|
|
314
|
+
}
|
|
315
|
+
async function preflightLbugSidecars(dbPath, options) {
|
|
316
|
+
let state;
|
|
317
|
+
try {
|
|
318
|
+
state = await inspectLbugSidecars(dbPath);
|
|
319
|
+
}
|
|
320
|
+
catch (err) {
|
|
321
|
+
logDebug(options.logger, `GitNexus: unable to inspect LadybugDB sidecars before ${options.mode} open; continuing without preflight repair: ${err.message}`);
|
|
322
|
+
return { kind: 'clean', dbPath };
|
|
323
|
+
}
|
|
324
|
+
if ((0, exports.sidecarPreflightDisabled)() || !options.allowQuarantine)
|
|
325
|
+
return state;
|
|
326
|
+
if (state.kind === 'tiny-orphan-wal') {
|
|
327
|
+
await quarantineWalForMissingShadow(dbPath, {
|
|
328
|
+
logger: options.logger,
|
|
329
|
+
level: 'debug',
|
|
330
|
+
reason: `${options.mode} preflight tiny orphan WAL (${state.walBytes} bytes)`,
|
|
331
|
+
});
|
|
332
|
+
return inspectLbugSidecars(dbPath);
|
|
333
|
+
}
|
|
334
|
+
if (state.kind === 'orphan-wal') {
|
|
335
|
+
warnOnce(options.logger, `${dbPath}:orphan-wal-preflight:${options.mode}`, `GitNexus: found ${state.walBytes} byte lbug.wal without lbug.shadow before ${options.mode} open; ` +
|
|
336
|
+
'will rely on LadybugDB replay/recovery instead of deleting pending WAL data.');
|
|
337
|
+
}
|
|
338
|
+
return state;
|
|
339
|
+
}
|
|
340
|
+
async function finalizeLbugSidecarsAfterClose(dbPath, options) {
|
|
341
|
+
if ((0, exports.sidecarPreflightDisabled)())
|
|
342
|
+
return;
|
|
343
|
+
let state;
|
|
344
|
+
try {
|
|
345
|
+
state = await inspectLbugSidecars(dbPath);
|
|
346
|
+
}
|
|
347
|
+
catch (err) {
|
|
348
|
+
logDebug(options.logger, `GitNexus: unable to inspect LadybugDB sidecars after close; skipping post-close repair: ${err.message}`);
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
if (state.kind === 'clean' || state.kind === 'wal-with-shadow')
|
|
352
|
+
return;
|
|
353
|
+
for (const delayMs of [25, 50, 100]) {
|
|
354
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
355
|
+
try {
|
|
356
|
+
state = await inspectLbugSidecars(dbPath);
|
|
357
|
+
}
|
|
358
|
+
catch (err) {
|
|
359
|
+
logDebug(options.logger, `GitNexus: unable to inspect LadybugDB sidecars after close; skipping post-close repair: ${err.message}`);
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
if (state.kind === 'clean' || state.kind === 'wal-with-shadow')
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
if (state.kind === 'tiny-orphan-wal') {
|
|
366
|
+
try {
|
|
367
|
+
await quarantineWalForMissingShadow(dbPath, {
|
|
368
|
+
logger: options.logger,
|
|
369
|
+
level: 'debug',
|
|
370
|
+
reason: `post-close tiny orphan WAL (${state.walBytes} bytes)`,
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
catch (err) {
|
|
374
|
+
if (!missing(err)) {
|
|
375
|
+
warnOnce(options.logger, `${dbPath}:post-close-tiny-quarantine-failed`, `GitNexus: failed to quarantine tiny orphan WAL after close (${err.message}); next read may recover reactively.`);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
if (state.kind === 'orphan-wal') {
|
|
381
|
+
warnOnce(options.logger, `${dbPath}:post-close-orphan-wal`, `GitNexus: lbug.wal (${state.walBytes} bytes) remains without lbug.shadow after close; ` +
|
|
382
|
+
'keeping it for recovery. If this repeats, run `cgraph analyze --force --index-only` or the sidecar repair command.');
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Corrected parking-failure warning (tri-review 4669518496 P2-3). The old
|
|
387
|
+
* text promised "the rebuild will wipe it in place instead" — false: the
|
|
388
|
+
* recovery run's pre-wipe DB open would replay the poisoned WAL and die
|
|
389
|
+
* before any wipe could happen. Mirrors {@link renameFailureMessage}'s
|
|
390
|
+
* EBUSY/EPERM framing via the shared {@link lbugLockRemediation} copy
|
|
391
|
+
* (FIX 7): the problem is environmental (file lock, AV), not data
|
|
392
|
+
* integrity — fix the lock and re-run.
|
|
393
|
+
*/
|
|
394
|
+
const sidecarParkRefusedWarning = (from, err) => `Warning: could not park or remove ${path_1.default.basename(from)} before the recovery rebuild ` +
|
|
395
|
+
`(${err instanceof Error ? err.message : String(err)}). Another process likely holds an ` +
|
|
396
|
+
`open handle on it — ${(0, exports.lbugLockRemediation)()}.`;
|
|
397
|
+
/**
|
|
398
|
+
* The sidecar family parked by {@link quarantineSidecarsForDirtyRecovery}
|
|
399
|
+
* and enumerated by {@link listParkedDirtyRecoverySidecars} — one shared
|
|
400
|
+
* roster so the park and clean surfaces cannot drift apart (tri-review
|
|
401
|
+
* 4669518496 P2-7).
|
|
402
|
+
*/
|
|
403
|
+
const DIRTY_RECOVERY_SIDECAR_SUFFIXES = ['.wal', '.shadow'];
|
|
404
|
+
/**
|
|
405
|
+
* Every fixed name the dirty-recovery park can leave beside `dbPath`: the
|
|
406
|
+
* two `.dirty-recovery` destinations PLUS their `.next` probe residues
|
|
407
|
+
* (this shipping review, FIX 5 — the residue used to be invisible to every
|
|
408
|
+
* cleanup surface while the docs said "remove manually"). Single roster
|
|
409
|
+
* authority for {@link listParkedDirtyRecoverySidecars}.
|
|
410
|
+
*/
|
|
411
|
+
const dirtyRecoveryParkedNames = (dbPath) => DIRTY_RECOVERY_SIDECAR_SUFFIXES.flatMap((suffix) => [
|
|
412
|
+
`${dbPath}${suffix}.dirty-recovery`,
|
|
413
|
+
`${dbPath}${suffix}.dirty-recovery.next`,
|
|
414
|
+
]);
|
|
415
|
+
/**
|
|
416
|
+
* Move the WAL/shadow sidecars aside before a dirty-flag recovery rebuild
|
|
417
|
+
* (#2409 defect 2).
|
|
418
|
+
*
|
|
419
|
+
* When `incrementalInProgress` forces a full rebuild, the previous run
|
|
420
|
+
* died mid-writeback — its WAL can be poisoned in a way that natively
|
|
421
|
+
* kills the process on replay. The recovery run used to open the DB
|
|
422
|
+
* BEFORE the rebuild wipe (the embedding-cache preservation open), replay
|
|
423
|
+
* the poisoned WAL, and die on the spot — so recovery never happened and
|
|
424
|
+
* only a manual rename-aside of the index dir escaped the loop. The
|
|
425
|
+
* rebuild discards every pending WAL byte anyway (the DB files are wiped),
|
|
426
|
+
* so parking the sidecars first costs nothing and makes every subsequent
|
|
427
|
+
* open replay-free.
|
|
428
|
+
*
|
|
429
|
+
* Renamed when possible, so the bytes stay available for post-mortem
|
|
430
|
+
* debugging — and, like {@link quarantineWalForMissingShadow}'s quarantine
|
|
431
|
+
* files, the parked copies are surfaced and removable by
|
|
432
|
+
* `cgraph clean --lbug-sidecars` (tri-review 4669518496 P2-7; before
|
|
433
|
+
* that, this comment claimed a "same philosophy" parity while the
|
|
434
|
+
* dirty-recovery files were invisible to every cleanup surface). Real
|
|
435
|
+
* lifecycle: the destinations are FIXED names — no timestamp, see
|
|
436
|
+
* {@link listParkedDirtyRecoverySidecars} — so each new crash overwrites
|
|
437
|
+
* the previous parked copy, capping accumulation at one file per sidecar;
|
|
438
|
+
* remove them via `clean --lbug-sidecars` or manually once their
|
|
439
|
+
* post-mortem value has passed.
|
|
440
|
+
*
|
|
441
|
+
* Escalation ladder per suffix (this shipping review, FIX 1 — replacing
|
|
442
|
+
* the drop-shape design, whose park had ZERO retry while the wipe path
|
|
443
|
+
* retried the very same lock class):
|
|
444
|
+
*
|
|
445
|
+
* 1. `rename(from, to)` retried over the shared handle-release budget
|
|
446
|
+
* (HANDLE_RELEASE_PROBE_ATTEMPTS × linear HANDLE_RELEASE_PROBE_DELAY_MS,
|
|
447
|
+
* lbug-config.ts) — a transient AV/handle-lag EBUSY must not cost the
|
|
448
|
+
* run anything.
|
|
449
|
+
* 2. Structural confirm probe: a bare "does `to` exist?" check cannot
|
|
450
|
+
* discriminate a Windows rename-onto-existing collision from a locked
|
|
451
|
+
* source that happens to have a leftover parked copy. Renaming the
|
|
452
|
+
* source to the collision-free `${to}.next` can — success proves the
|
|
453
|
+
* failure was the collision, so the stale copy is replaced (newest
|
|
454
|
+
* forensics win). The crash window between the `rm(to)` and the final
|
|
455
|
+
* promote rename strands the bytes at `.next` — acceptable: `.next`
|
|
456
|
+
* residues are enumerated by the dirty-recovery lister and removed by
|
|
457
|
+
* `clean --lbug-sidecars` (FIX 5). Never pre-delete the previous
|
|
458
|
+
* crash's parked copy on the bet that a rename will then succeed
|
|
459
|
+
* (tri-review 4669518496 P2-3: the old rm-first shape destroyed the
|
|
460
|
+
* prior forensics exactly when the source was locked and nothing
|
|
461
|
+
* replaced them).
|
|
462
|
+
* 3. rm-fallback: the source itself is locked for RENAME, but Windows
|
|
463
|
+
* lets some holders' files be unlink-marked — retry
|
|
464
|
+
* `rm(from, {force:true})` over the same budget and require the file
|
|
465
|
+
* verifiably GONE. Success eliminates the replay risk at the cost of
|
|
466
|
+
* the post-mortem forensics (logged exactly so).
|
|
467
|
+
* 4. Report in `failed` with the corrected lock guidance — the caller
|
|
468
|
+
* must abort (run-analyze throws a LbugWipeError in seconds instead
|
|
469
|
+
* of running the whole pipeline and dying at the wipe on the same
|
|
470
|
+
* handle).
|
|
471
|
+
*
|
|
472
|
+
* Per-suffix isolation: a `.wal` failure never skips the `.shadow`
|
|
473
|
+
* attempt.
|
|
474
|
+
*
|
|
475
|
+
* INVARIANT: after this function returns, either no original sidecar
|
|
476
|
+
* remains adjacent to the DB — every entry is in `moved` or `removed`, so
|
|
477
|
+
* every subsequent open this run performs is replay-free — or the entry is
|
|
478
|
+
* in `failed` and the caller MUST abort before any DB open.
|
|
479
|
+
*
|
|
480
|
+
* @returns `moved` — destination paths now holding the parked bytes;
|
|
481
|
+
* `removed` — source sidecars whose bytes are GONE (forensics lost, replay
|
|
482
|
+
* risk eliminated); `failed` — source sidecars still in place: a
|
|
483
|
+
* possibly-poisoned sidecar sits next to the DB and any pre-wipe open
|
|
484
|
+
* would replay it and die (there is no "wipe it in place" fallback).
|
|
485
|
+
*/
|
|
486
|
+
async function quarantineSidecarsForDirtyRecovery(dbPath, log) {
|
|
487
|
+
const moved = [];
|
|
488
|
+
const removed = [];
|
|
489
|
+
const failed = [];
|
|
490
|
+
for (const suffix of DIRTY_RECOVERY_SIDECAR_SUFFIXES) {
|
|
491
|
+
const from = `${dbPath}${suffix}`;
|
|
492
|
+
const to = `${from}.dirty-recovery`;
|
|
493
|
+
try {
|
|
494
|
+
if (!(await (0, exports.statIfExists)(from)))
|
|
495
|
+
continue;
|
|
496
|
+
}
|
|
497
|
+
catch (err) {
|
|
498
|
+
// Non-ENOENT stat failure (EPERM/EBUSY class — statIfExists swallows
|
|
499
|
+
// ENOENT itself): assume the sidecar exists and is unreachable; the
|
|
500
|
+
// caller must fail safe.
|
|
501
|
+
failed.push(from);
|
|
502
|
+
log(sidecarParkRefusedWarning(from, err));
|
|
503
|
+
continue;
|
|
504
|
+
}
|
|
505
|
+
// 1. Rename, retried over the shared handle-release budget for the
|
|
506
|
+
// transient lock class only (EACCES/EPERM/EBUSY — an AV scan or
|
|
507
|
+
// handle-release lag clears within it; a structural failure like
|
|
508
|
+
// EEXIST goes straight to the confirm probe).
|
|
509
|
+
let outcome = 'rename-failed';
|
|
510
|
+
let renameErr;
|
|
511
|
+
for (let attempt = 1; attempt <= lbug_config_js_1.HANDLE_RELEASE_PROBE_ATTEMPTS; attempt++) {
|
|
512
|
+
try {
|
|
513
|
+
await promises_1.default.rename(from, to);
|
|
514
|
+
outcome = 'moved';
|
|
515
|
+
break;
|
|
516
|
+
}
|
|
517
|
+
catch (err) {
|
|
518
|
+
if (missing(err)) {
|
|
519
|
+
outcome = 'raced'; // source raced away between stat and rename
|
|
520
|
+
break;
|
|
521
|
+
}
|
|
522
|
+
renameErr = err;
|
|
523
|
+
if (!(0, exports.isPermissionRenameError)(err) || attempt === lbug_config_js_1.HANDLE_RELEASE_PROBE_ATTEMPTS)
|
|
524
|
+
break;
|
|
525
|
+
await (0, lbug_config_js_1.sleep)(lbug_config_js_1.HANDLE_RELEASE_PROBE_DELAY_MS * attempt);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
if (outcome === 'moved') {
|
|
529
|
+
moved.push(to);
|
|
530
|
+
continue;
|
|
531
|
+
}
|
|
532
|
+
if (outcome === 'raced')
|
|
533
|
+
continue;
|
|
534
|
+
// 2. Structural confirm probe (see TSDoc step 2).
|
|
535
|
+
const probe = `${to}.next`;
|
|
536
|
+
let probeLanded = false;
|
|
537
|
+
try {
|
|
538
|
+
await promises_1.default.rename(from, probe);
|
|
539
|
+
probeLanded = true;
|
|
540
|
+
}
|
|
541
|
+
catch (probeErr) {
|
|
542
|
+
if (missing(probeErr))
|
|
543
|
+
continue; // source raced away mid-probe
|
|
544
|
+
// Source locked for rename — fall through to the rm-fallback below.
|
|
545
|
+
}
|
|
546
|
+
if (probeLanded) {
|
|
547
|
+
try {
|
|
548
|
+
// True collision — replace the stale parked copy: newest forensics win.
|
|
549
|
+
await promises_1.default.rm(to, { force: true });
|
|
550
|
+
await promises_1.default.rename(probe, to);
|
|
551
|
+
moved.push(to);
|
|
552
|
+
}
|
|
553
|
+
catch {
|
|
554
|
+
// Double failure: the stale copy is itself locked/undeletable. The
|
|
555
|
+
// interrupted run's sidecar is already out of the replay path at the
|
|
556
|
+
// probe name, so the recovery open stays safe — keep both files.
|
|
557
|
+
moved.push(probe);
|
|
558
|
+
log(`Warning: parked ${path_1.default.basename(from)} as ${path_1.default.basename(probe)} — the stale ` +
|
|
559
|
+
`${path_1.default.basename(to)} from an earlier crash is locked and could not be replaced.`);
|
|
560
|
+
}
|
|
561
|
+
continue;
|
|
562
|
+
}
|
|
563
|
+
// 3. rm-fallback, retried over the same budget. `force: true` swallows
|
|
564
|
+
// ENOENT, so a resolving rm proves nothing on Windows (delete-pending
|
|
565
|
+
// keeps the name visible) — only a verifiably-absent file counts.
|
|
566
|
+
let removedOk = false;
|
|
567
|
+
for (let attempt = 1; attempt <= lbug_config_js_1.HANDLE_RELEASE_PROBE_ATTEMPTS; attempt++) {
|
|
568
|
+
try {
|
|
569
|
+
await promises_1.default.rm(from, { force: true });
|
|
570
|
+
}
|
|
571
|
+
catch {
|
|
572
|
+
/* verified below — the absence probe is authoritative */
|
|
573
|
+
}
|
|
574
|
+
let stillPresent = true;
|
|
575
|
+
try {
|
|
576
|
+
stillPresent = (await (0, exports.statIfExists)(from)) !== null;
|
|
577
|
+
}
|
|
578
|
+
catch {
|
|
579
|
+
// Non-ENOENT stat failure: not verifiably gone — keep retrying.
|
|
580
|
+
}
|
|
581
|
+
if (!stillPresent) {
|
|
582
|
+
removedOk = true;
|
|
583
|
+
break;
|
|
584
|
+
}
|
|
585
|
+
if (attempt < lbug_config_js_1.HANDLE_RELEASE_PROBE_ATTEMPTS) {
|
|
586
|
+
await (0, lbug_config_js_1.sleep)(lbug_config_js_1.HANDLE_RELEASE_PROBE_DELAY_MS * attempt);
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
if (removedOk) {
|
|
590
|
+
removed.push(from);
|
|
591
|
+
log(`Removed ${path_1.default.basename(from)} from the interrupted run — it could not be parked ` +
|
|
592
|
+
'aside (rename locked), so its bytes were deleted instead: post-mortem forensics ' +
|
|
593
|
+
'are lost, but the replay risk is eliminated and recovery can proceed.');
|
|
594
|
+
continue;
|
|
595
|
+
}
|
|
596
|
+
// 4. Everything failed — the poisoned bytes still sit next to the DB.
|
|
597
|
+
failed.push(from);
|
|
598
|
+
log(sidecarParkRefusedWarning(from, renameErr));
|
|
599
|
+
}
|
|
600
|
+
if (moved.length > 0) {
|
|
601
|
+
log(`Parked ${moved.map((p) => path_1.default.basename(p)).join(', ')} from the interrupted run ` +
|
|
602
|
+
'so the recovery rebuild opens without replaying it.');
|
|
603
|
+
}
|
|
604
|
+
return { moved, removed, failed };
|
|
605
|
+
}
|
|
606
|
+
async function listQuarantinedMissingShadowWals(dbPath) {
|
|
607
|
+
const dir = path_1.default.dirname(dbPath);
|
|
608
|
+
const base = path_1.default.basename(dbPath);
|
|
609
|
+
let entries;
|
|
610
|
+
try {
|
|
611
|
+
entries = await promises_1.default.readdir(dir);
|
|
612
|
+
}
|
|
613
|
+
catch (err) {
|
|
614
|
+
if (missing(err))
|
|
615
|
+
return [];
|
|
616
|
+
throw err;
|
|
617
|
+
}
|
|
618
|
+
return entries
|
|
619
|
+
.filter((entry) => entry.startsWith(`${base}.wal.missing-shadow.`))
|
|
620
|
+
.map((entry) => path_1.default.join(dir, entry))
|
|
621
|
+
.sort();
|
|
622
|
+
}
|
|
623
|
+
/**
|
|
624
|
+
* Shared unlink walker for the parked-sidecar cleaners (this shipping
|
|
625
|
+
* review, FIX 5). Per-file error policy: ENOENT is skipped silently (a
|
|
626
|
+
* list→delete race means the file is already gone — the desired state);
|
|
627
|
+
* EBUSY/EPERM/anything else lands in `failed` and the walk CONTINUES —
|
|
628
|
+
* the old per-family cleaners threw on the first locked file, crashing
|
|
629
|
+
* the whole clean mid-command after a partial deletion.
|
|
630
|
+
*/
|
|
631
|
+
const unlinkParkedFiles = async (files) => {
|
|
632
|
+
const deleted = [];
|
|
633
|
+
const failed = [];
|
|
634
|
+
for (const file of files) {
|
|
635
|
+
try {
|
|
636
|
+
await promises_1.default.unlink(file);
|
|
637
|
+
deleted.push(file);
|
|
638
|
+
}
|
|
639
|
+
catch (err) {
|
|
640
|
+
if (missing(err))
|
|
641
|
+
continue;
|
|
642
|
+
failed.push(file);
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
return { deleted, failed };
|
|
646
|
+
};
|
|
647
|
+
/**
|
|
648
|
+
* Delete the missing-shadow WAL quarantines for `dbPath` and return the
|
|
649
|
+
* deleted paths. Locked files are skipped, not thrown (FIX 5) — user-facing
|
|
650
|
+
* surfaces should call {@link cleanParkedLbugSidecars}, which also REPORTS
|
|
651
|
+
* the skipped files.
|
|
652
|
+
*/
|
|
653
|
+
async function cleanQuarantinedMissingShadowWals(dbPath) {
|
|
654
|
+
return (await unlinkParkedFiles(await listQuarantinedMissingShadowWals(dbPath))).deleted;
|
|
655
|
+
}
|
|
656
|
+
/**
|
|
657
|
+
* List the `.dirty-recovery` sidecars parked beside `dbPath` by
|
|
658
|
+
* {@link quarantineSidecarsForDirtyRecovery}, so `cgraph clean
|
|
659
|
+
* --lbug-sidecars` can surface them next to the missing-shadow quarantines
|
|
660
|
+
* (tri-review 4669518496 P2-7 — they were previously invisible to every
|
|
661
|
+
* cleanup surface). Only fixed names can exist (see
|
|
662
|
+
* {@link dirtyRecoveryParkedNames}: `<dbPath>.wal.dirty-recovery`,
|
|
663
|
+
* `<dbPath>.shadow.dirty-recovery`, and their `.next` probe residues from a
|
|
664
|
+
* double park failure — enumerated since FIX 5 of this shipping review; the
|
|
665
|
+
* docs used to say "remove manually" while no surface even listed them), so
|
|
666
|
+
* this stats them directly instead of prefix-scanning the directory the way
|
|
667
|
+
* the timestamped missing-shadow lister must.
|
|
668
|
+
*
|
|
669
|
+
* Returns existing parked files as sorted absolute paths. Branch-scoped
|
|
670
|
+
* index slots (`branches/<slug>/`) are outside `clean.ts`'s flat-path
|
|
671
|
+
* resolution — the same documented limitation as the missing-shadow pair.
|
|
672
|
+
*/
|
|
673
|
+
async function listParkedDirtyRecoverySidecars(dbPath) {
|
|
674
|
+
const present = [];
|
|
675
|
+
for (const parked of dirtyRecoveryParkedNames(dbPath)) {
|
|
676
|
+
if (await (0, exports.statIfExists)(parked))
|
|
677
|
+
present.push(parked);
|
|
678
|
+
}
|
|
679
|
+
return present.sort();
|
|
680
|
+
}
|
|
681
|
+
/**
|
|
682
|
+
* Delete the `.dirty-recovery` parked sidecars for `dbPath` and return the
|
|
683
|
+
* deleted paths. Sibling of {@link cleanQuarantinedMissingShadowWals}; same
|
|
684
|
+
* skip-not-throw policy (FIX 5) — user-facing surfaces should call
|
|
685
|
+
* {@link cleanParkedLbugSidecars}, which also reports locked files.
|
|
686
|
+
*/
|
|
687
|
+
async function cleanParkedDirtyRecoverySidecars(dbPath) {
|
|
688
|
+
return (await unlinkParkedFiles(await listParkedDirtyRecoverySidecars(dbPath))).deleted;
|
|
689
|
+
}
|
|
690
|
+
/**
|
|
691
|
+
* Aggregate roster of every parked/quarantined sidecar family beside
|
|
692
|
+
* `dbPath` (this shipping review, FIX 5): the timestamped missing-shadow
|
|
693
|
+
* WAL quarantines plus the fixed-name dirty-recovery parks (`.next`
|
|
694
|
+
* residues included). Single roster authority for `clean --lbug-sidecars`
|
|
695
|
+
* — the command previously concatenated the families inline in two places,
|
|
696
|
+
* which is how the `.next` residue stayed invisible.
|
|
697
|
+
*/
|
|
698
|
+
async function listParkedLbugSidecars(dbPath) {
|
|
699
|
+
return [
|
|
700
|
+
...(await listQuarantinedMissingShadowWals(dbPath)),
|
|
701
|
+
...(await listParkedDirtyRecoverySidecars(dbPath)),
|
|
702
|
+
];
|
|
703
|
+
}
|
|
704
|
+
/**
|
|
705
|
+
* Delete every file {@link listParkedLbugSidecars} enumerates. Per-file
|
|
706
|
+
* error policy via {@link unlinkParkedFiles}: ENOENT skipped silently,
|
|
707
|
+
* locked files collected into `failed` while the rest are still deleted —
|
|
708
|
+
* a locked parked file must not crash the whole clean mid-command.
|
|
709
|
+
*/
|
|
710
|
+
async function cleanParkedLbugSidecars(dbPath) {
|
|
711
|
+
return unlinkParkedFiles(await listParkedLbugSidecars(dbPath));
|
|
712
|
+
}
|
|
713
|
+
const _resetSidecarRecoveryWarningsForTest = () => {
|
|
714
|
+
warnedKeyCounts.clear();
|
|
715
|
+
};
|
|
716
|
+
exports._resetSidecarRecoveryWarningsForTest = _resetSidecarRecoveryWarningsForTest;
|