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,620 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Disk-backed `ParsedFile` store (#1983 scope-resolution OOM).
|
|
4
|
+
*
|
|
5
|
+
* ## Why this exists
|
|
6
|
+
*
|
|
7
|
+
* The scope-resolution phase needs a `ParsedFile` (scopes / defs / reference
|
|
8
|
+
* sites) for every file. Historically it re-extracted each file from source on
|
|
9
|
+
* the **main thread** via `extractParsedFile` → `parseSourceSafe`. On a huge
|
|
10
|
+
* repo (Linux kernel, ~64k C files) that re-parse accumulates an unbounded
|
|
11
|
+
* **native** memory leak in `tree-sitter` 0.21.1 (`CallbackInput` retains the
|
|
12
|
+
* input string with no destructor; node-tree-sitter PR #201) — the leaked
|
|
13
|
+
* `TSTree` memory is invisible to V8, never reclaimed by GC, and not freed by
|
|
14
|
+
* worker_thread teardown. The parse phase escapes it only because each parse is
|
|
15
|
+
* relatively cheap there; a second full re-parse of every file on the immortal
|
|
16
|
+
* main thread pushes RSS past the heap cap and the OOM-killer fires.
|
|
17
|
+
*
|
|
18
|
+
* The fix: the parse workers already build a tree-sitter `Tree` per file, so
|
|
19
|
+
* they emit the `ParsedFile` directly (reusing that tree — no second parse).
|
|
20
|
+
* Holding all of them in main-thread heap is what the original #1983 work
|
|
21
|
+
* removed (it cost ~1× the semantic model in RAM during parse), so instead we
|
|
22
|
+
* flush them to this disk store per chunk and stream them back per language in
|
|
23
|
+
* scope-resolution. Net effect: the file is parsed exactly once (in a worker),
|
|
24
|
+
* scope-resolution does ZERO parsing, and peak heap stays bounded.
|
|
25
|
+
*
|
|
26
|
+
* ## Shape
|
|
27
|
+
*
|
|
28
|
+
* `<storagePath>/parsedfile-store/<shardId>.json` — one shard per parse chunk,
|
|
29
|
+
* a JSON array of `ParsedFile` serialized with the same `mapReplacer` the parse
|
|
30
|
+
* cache uses (Scope.bindings / Scope.typeBindings are `Map`s). The store is
|
|
31
|
+
* cleared at the start of each parse and after scope-resolution consumes it, so
|
|
32
|
+
* it never lingers and never goes stale across runs.
|
|
33
|
+
*
|
|
34
|
+
* ## Durable sibling store (`parsedfile-cache/`, warm-cache coverage)
|
|
35
|
+
*
|
|
36
|
+
* The run-scoped store above is only populated when the parse workers actually
|
|
37
|
+
* run. On a warm re-analyze where every chunk is a parse-cache HIT, no worker
|
|
38
|
+
* runs, the run-scoped store was cleared at parse start, and the cached
|
|
39
|
+
* `ParseWorkerResult` carries no `ParsedFile`s (the worker emptied them after
|
|
40
|
+
* its store write) — so scope-resolution would find an empty store and fall
|
|
41
|
+
* back to main-thread `extractParsedFile`, re-opening the #1983 OOM. To close
|
|
42
|
+
* that gap we ALSO write the worker's ParsedFiles to a second, CONTENT-ADDRESSED
|
|
43
|
+
* store keyed by the parse chunk hash (`getDurableParsedFileDir`), which mirrors
|
|
44
|
+
* the parse cache's lifecycle (persists across runs, pruned by `usedKeys`,
|
|
45
|
+
* version-tied via `PARSE_CACHE_VERSION`). On a warm hit the chunk's durable
|
|
46
|
+
* shards are byte-COPIED into the run-scoped store (no re-parse, no
|
|
47
|
+
* re-serialize → byte-identical), so scope-resolution streams them exactly as
|
|
48
|
+
* on a cold run. Content-addressing makes stale reuse impossible: a changed
|
|
49
|
+
* file changes its chunk hash, which misses BOTH stores and re-dispatches.
|
|
50
|
+
*/
|
|
51
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
52
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
53
|
+
};
|
|
54
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
55
|
+
exports.pruneAndSaveDurableParsedFileStore = exports.loadDurableParsedFileIndex = exports.restoreDurableParsedFileShard = exports.persistDurableParsedFileShardSync = exports.prepareDurableParsedFileChunk = exports.getDurableParsedFileDir = exports.loadParsedFilesForPaths = exports.persistParsedFileShardSync = exports.persistParsedFileChunk = exports.clearParsedFileStore = exports.getParsedFileStoreDir = exports.forceGc = exports.makeInterningReviver = void 0;
|
|
56
|
+
const node_fs_1 = require("node:fs");
|
|
57
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
58
|
+
const node_v8_1 = __importDefault(require("node:v8"));
|
|
59
|
+
const node_vm_1 = __importDefault(require("node:vm"));
|
|
60
|
+
const receiver_chain_codec_js_1 = require("../core/ingestion/utils/receiver-chain-codec.js");
|
|
61
|
+
const logger_js_1 = require("../core/logger.js");
|
|
62
|
+
const parse_cache_js_1 = require("./parse-cache.js");
|
|
63
|
+
const STORE_DIRNAME = 'parsedfile-store';
|
|
64
|
+
const DURABLE_DIRNAME = 'parsedfile-cache';
|
|
65
|
+
const DURABLE_INDEX_FILENAME = 'index.json';
|
|
66
|
+
const MAX_CALLABLE_FLOW_SITES_PER_FILE = 100_000;
|
|
67
|
+
const MAX_CALLABLE_FLOW_INDIRECTION = 16;
|
|
68
|
+
const MAX_CALLABLE_FLOW_NAME_LENGTH = 4_096;
|
|
69
|
+
const MAX_CALLABLE_FLOW_PARAMETERS = 1_024;
|
|
70
|
+
/**
|
|
71
|
+
* Build a JSON.parse reviver that (a) interns every string against a shared
|
|
72
|
+
* pool and (b) applies the parse-cache `mapReviver` (Map/Set reconstruction).
|
|
73
|
+
*
|
|
74
|
+
* `JSON.parse` allocates a DISTINCT string object for every textual token, so a
|
|
75
|
+
* `ParsedFile` graph round-tripped through disk holds millions of duplicate
|
|
76
|
+
* strings — every def repeats its `filePath`, and common type/qualified names
|
|
77
|
+
* (`int`, `void`, `struct …`) recur across the whole repo. On the Linux kernel
|
|
78
|
+
* that roughly DOUBLES the deserialized heap (~15 GB vs ~7.6 GB interned).
|
|
79
|
+
* Interning IN the reviver collapses duplicates as the tree is revived (one
|
|
80
|
+
* pass, no second walk). The pool is per-load; the interned strings stay shared
|
|
81
|
+
* through the retained `ParsedFile` references after the pool is dropped.
|
|
82
|
+
*/
|
|
83
|
+
const makeInterningReviver = (pool, defPool) => {
|
|
84
|
+
return (key, value) => {
|
|
85
|
+
if (typeof value === 'string') {
|
|
86
|
+
const hit = pool.get(value);
|
|
87
|
+
if (hit !== undefined)
|
|
88
|
+
return hit;
|
|
89
|
+
pool.set(value, value);
|
|
90
|
+
return value;
|
|
91
|
+
}
|
|
92
|
+
const revived = (0, parse_cache_js_1.mapReviver)(key, value);
|
|
93
|
+
// Collapse the THREE serialized copies of each `SymbolDefinition` back to one
|
|
94
|
+
// shared object, keyed on the def-exclusive `nodeId`. A def is serialized in
|
|
95
|
+
// `localDefs`, in its owning `scope.ownedDefs`, and inside `scope.bindings[].def`;
|
|
96
|
+
// in the live extractor those are ONE object by reference, but `JSON.parse`
|
|
97
|
+
// rebuilds three distinct objects (string interning alone leaves the object
|
|
98
|
+
// duplication intact — ~3× the def-object heap on the disk-backed path).
|
|
99
|
+
// Re-sharing is byte-identical to resolution: every consumer reads defs BY
|
|
100
|
+
// VALUE (`nodeId`/`type`), never by object identity, and the authoritative
|
|
101
|
+
// resolver index is built from `localDefs` only. `nodeId` is def-exclusive in
|
|
102
|
+
// the scope-resolution schema; the `filePath` check guards future shapes.
|
|
103
|
+
if (revived !== null &&
|
|
104
|
+
typeof revived === 'object' &&
|
|
105
|
+
typeof revived.nodeId === 'string' &&
|
|
106
|
+
typeof revived.filePath === 'string') {
|
|
107
|
+
const def = revived;
|
|
108
|
+
const seen = defPool.get(def.nodeId);
|
|
109
|
+
if (seen !== undefined)
|
|
110
|
+
return seen;
|
|
111
|
+
defPool.set(def.nodeId, def);
|
|
112
|
+
return def;
|
|
113
|
+
}
|
|
114
|
+
return revived;
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
exports.makeInterningReviver = makeInterningReviver;
|
|
118
|
+
/**
|
|
119
|
+
* Best-effort forced garbage collection. `JSON.parse` of each shard builds a
|
|
120
|
+
* transient bloated (pre-intern) tree; across hundreds of shards that churn
|
|
121
|
+
* outpaces V8's incremental GC and piles up against the heap limit (measured
|
|
122
|
+
* ~5 GB of avoidable transient on the kernel). A periodic full GC during the
|
|
123
|
+
* load keeps the peak at the retained set rather than retained + churn. Uses
|
|
124
|
+
* the global `gc` when exposed, else the v8/vm trick — and degrades to a no-op
|
|
125
|
+
* if neither is available, so it never throws.
|
|
126
|
+
*/
|
|
127
|
+
let cachedGc;
|
|
128
|
+
/**
|
|
129
|
+
* Best-effort synchronous GC. Uses `globalThis.gc` when `--expose-gc` is set,
|
|
130
|
+
* else lazily wires it via `v8.setFlagsFromString('--expose-gc')` + a fresh
|
|
131
|
+
* `vm` context. Exported so scope-resolution can reclaim a finished language's
|
|
132
|
+
* ParsedFiles at the per-language eviction boundary (#1741 / kernel memory work).
|
|
133
|
+
*/
|
|
134
|
+
const forceGc = () => {
|
|
135
|
+
const g = globalThis.gc;
|
|
136
|
+
if (typeof g === 'function') {
|
|
137
|
+
g();
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
if (cachedGc === undefined) {
|
|
141
|
+
cachedGc = null;
|
|
142
|
+
try {
|
|
143
|
+
node_v8_1.default.setFlagsFromString('--expose-gc');
|
|
144
|
+
cachedGc = node_vm_1.default.runInNewContext('gc');
|
|
145
|
+
node_v8_1.default.setFlagsFromString('--no-expose-gc');
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
cachedGc = null;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
cachedGc?.();
|
|
152
|
+
};
|
|
153
|
+
exports.forceGc = forceGc;
|
|
154
|
+
const getParsedFileStoreDir = (storagePath) => node_path_1.default.join(storagePath, STORE_DIRNAME);
|
|
155
|
+
exports.getParsedFileStoreDir = getParsedFileStoreDir;
|
|
156
|
+
/** Remove any prior run's shards so a fresh parse starts clean. Idempotent. */
|
|
157
|
+
const clearParsedFileStore = async (storagePath) => {
|
|
158
|
+
await node_fs_1.promises.rm((0, exports.getParsedFileStoreDir)(storagePath), { recursive: true, force: true });
|
|
159
|
+
};
|
|
160
|
+
exports.clearParsedFileStore = clearParsedFileStore;
|
|
161
|
+
/**
|
|
162
|
+
* Single source of truth for a shard's bytes. Returns `null` for an empty
|
|
163
|
+
* chunk (caller writes nothing). Both the async (`persistParsedFileChunk`) and
|
|
164
|
+
* sync (`persistParsedFileShardSync`) writers go through this so the two paths
|
|
165
|
+
* are guaranteed byte-identical — the shards must round-trip through the same
|
|
166
|
+
* `mapReviver`, and matching bytes by having both authors type the same
|
|
167
|
+
* `mapReplacer` call would be a coincidence, not a guarantee.
|
|
168
|
+
*/
|
|
169
|
+
const serializeParsedFileShard = (parsedFiles) => {
|
|
170
|
+
if (parsedFiles.length === 0)
|
|
171
|
+
return null;
|
|
172
|
+
return JSON.stringify(parsedFiles, parse_cache_js_1.mapReplacer);
|
|
173
|
+
};
|
|
174
|
+
const shardPath = (storagePath, shardId) => node_path_1.default.join((0, exports.getParsedFileStoreDir)(storagePath), `${shardId}.json`);
|
|
175
|
+
/**
|
|
176
|
+
* Write one parse chunk's `ParsedFile[]` to the store as a single shard (async).
|
|
177
|
+
* No-op for an empty chunk. `shardId` must be unique within a run. Used by the
|
|
178
|
+
* main-thread no-store-disabled fallback and any non-worker writer; the worker
|
|
179
|
+
* store path uses {@link persistParsedFileShardSync}.
|
|
180
|
+
*/
|
|
181
|
+
const persistParsedFileChunk = async (storagePath, shardId, parsedFiles) => {
|
|
182
|
+
const payload = serializeParsedFileShard(parsedFiles);
|
|
183
|
+
if (payload === null)
|
|
184
|
+
return;
|
|
185
|
+
await node_fs_1.promises.mkdir((0, exports.getParsedFileStoreDir)(storagePath), { recursive: true });
|
|
186
|
+
await node_fs_1.promises.writeFile(shardPath(storagePath, shardId), payload, 'utf-8');
|
|
187
|
+
};
|
|
188
|
+
exports.persistParsedFileChunk = persistParsedFileChunk;
|
|
189
|
+
// Per-process set of store dirs we've already `mkdir`ed, so the sync worker
|
|
190
|
+
// writer (called once per job, many times into the same dir) doesn't issue a
|
|
191
|
+
// `mkdirSync` syscall on every shard. Mirrors parse-cache.ts's `createdCacheDirs`.
|
|
192
|
+
const createdStoreDirs = new Set();
|
|
193
|
+
/**
|
|
194
|
+
* Synchronous shard writer for use INSIDE a parse worker (#1983 parallel
|
|
195
|
+
* serialization). The worker is a dedicated thread, so a blocking write there
|
|
196
|
+
* protects the main thread, and a sync write avoids threading `async`/`await`
|
|
197
|
+
* through the synchronous per-file extract loop. Produces byte-identical shards
|
|
198
|
+
* to {@link persistParsedFileChunk} via the shared {@link serializeParsedFileShard}.
|
|
199
|
+
* No-op for an empty chunk. `shardId` must be globally unique for the run (the
|
|
200
|
+
* worker uses `w<threadId>-<seq>`); a duplicate would silently overwrite.
|
|
201
|
+
*/
|
|
202
|
+
const persistParsedFileShardSync = (storagePath, shardId, parsedFiles) => {
|
|
203
|
+
const payload = serializeParsedFileShard(parsedFiles);
|
|
204
|
+
if (payload === null)
|
|
205
|
+
return;
|
|
206
|
+
const dir = (0, exports.getParsedFileStoreDir)(storagePath);
|
|
207
|
+
if (!createdStoreDirs.has(dir)) {
|
|
208
|
+
(0, node_fs_1.mkdirSync)(dir, { recursive: true });
|
|
209
|
+
createdStoreDirs.add(dir);
|
|
210
|
+
}
|
|
211
|
+
(0, node_fs_1.writeFileSync)(shardPath(storagePath, shardId), payload, 'utf-8');
|
|
212
|
+
};
|
|
213
|
+
exports.persistParsedFileShardSync = persistParsedFileShardSync;
|
|
214
|
+
/**
|
|
215
|
+
* Stream the store and return the `ParsedFile`s whose `filePath` is in
|
|
216
|
+
* `wantPaths`, keyed by path. Loads one shard at a time and retains only the
|
|
217
|
+
* matching entries, so peak heap is bounded by (matched set) + (one shard)
|
|
218
|
+
* rather than the whole store. Returns an empty map when the store is absent
|
|
219
|
+
* (e.g. tests, or a run with no worker pool) — callers fall back to a fresh
|
|
220
|
+
* extract for the missing files.
|
|
221
|
+
*/
|
|
222
|
+
const loadParsedFilesForPaths = async (storagePath, wantPaths) => {
|
|
223
|
+
const out = new Map();
|
|
224
|
+
if (wantPaths.size === 0)
|
|
225
|
+
return out;
|
|
226
|
+
const dir = (0, exports.getParsedFileStoreDir)(storagePath);
|
|
227
|
+
let shards;
|
|
228
|
+
try {
|
|
229
|
+
shards = (await node_fs_1.promises.readdir(dir)).filter((f) => f.endsWith('.json'));
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
return out; // store absent
|
|
233
|
+
}
|
|
234
|
+
// Shared interning pool for this load — deduplicates strings ACROSS shards
|
|
235
|
+
// (one `int` / one repeated filePath for the whole language), which is where
|
|
236
|
+
// most of the saving comes from. Dropped when this function returns.
|
|
237
|
+
const pool = new Map();
|
|
238
|
+
let droppedSites = 0;
|
|
239
|
+
let filesWithDroppedSites = 0;
|
|
240
|
+
let droppedChains = 0;
|
|
241
|
+
let rejectedFiles = 0;
|
|
242
|
+
for (let i = 0; i < shards.length; i++) {
|
|
243
|
+
// Per-shard def pool: a SymbolDefinition's three serialized copies live within
|
|
244
|
+
// a single shard (one ParsedFile), so the dedup is shard-local. A cross-shard
|
|
245
|
+
// pool would retain defs of files NOT in `wantPaths` (loaded-but-discarded
|
|
246
|
+
// shards), reintroducing the leak; per-shard drops them with the shard.
|
|
247
|
+
const defPool = new Map();
|
|
248
|
+
const reviver = (0, exports.makeInterningReviver)(pool, defPool);
|
|
249
|
+
let parsed;
|
|
250
|
+
try {
|
|
251
|
+
const raw = await node_fs_1.promises.readFile(node_path_1.default.join(dir, shards[i]), 'utf-8');
|
|
252
|
+
parsed = JSON.parse(raw, reviver);
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
continue; // skip a corrupt shard; missing files fall back to fresh extract
|
|
256
|
+
}
|
|
257
|
+
if (!Array.isArray(parsed))
|
|
258
|
+
continue;
|
|
259
|
+
for (const pf of parsed) {
|
|
260
|
+
if (!pf || typeof pf.filePath !== 'string' || !wantPaths.has(pf.filePath))
|
|
261
|
+
continue;
|
|
262
|
+
const flow = sanitizeCallableFlowSites(pf.callableFlowSites);
|
|
263
|
+
if (flow === undefined) {
|
|
264
|
+
// non-array garbage → distrust the file, re-extract
|
|
265
|
+
rejectedFiles++;
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
const chains = sanitizeReceiverChains(pf.referenceSites);
|
|
269
|
+
if (chains === undefined) {
|
|
270
|
+
rejectedFiles++;
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
if (flow.dropped === 0 && chains.dropped === 0) {
|
|
274
|
+
out.set(pf.filePath, pf);
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
droppedSites += flow.dropped;
|
|
278
|
+
droppedChains += chains.dropped;
|
|
279
|
+
filesWithDroppedSites++;
|
|
280
|
+
out.set(pf.filePath, {
|
|
281
|
+
...pf,
|
|
282
|
+
...(flow.dropped === 0 ? {} : { callableFlowSites: flow.sites }),
|
|
283
|
+
...(chains.dropped === 0 ? {} : { referenceSites: chains.sites }),
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// Every few shards, reclaim the transient pre-intern parse churn before it
|
|
288
|
+
// piles up against the heap limit (~5 GB avoidable on the kernel), and
|
|
289
|
+
// yield so the GC + any pending I/O can run.
|
|
290
|
+
if ((i & 7) === 7) {
|
|
291
|
+
(0, exports.forceGc)();
|
|
292
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
if (droppedSites > 0 || droppedChains > 0) {
|
|
296
|
+
// Facts for the dropped sites are omitted this run (the file itself is
|
|
297
|
+
// retained, so no re-extract happens) — surface it so a recurring drop
|
|
298
|
+
// on every warm load is observable rather than silent (#2522 review).
|
|
299
|
+
logger_js_1.logger.warn({ droppedSites, droppedChains, files: filesWithDroppedSites }, 'parsedfile-store: dropped malformed/over-bound sites at load; files retained without those facts');
|
|
300
|
+
}
|
|
301
|
+
if (rejectedFiles > 0) {
|
|
302
|
+
// The other half of the same defect. A rejected file silently falls back to
|
|
303
|
+
// a fresh extract EVERY load, so a writer that keeps minting what this
|
|
304
|
+
// reader keeps refusing is a permanent warm-cache miss that costs real time
|
|
305
|
+
// and says nothing about why.
|
|
306
|
+
logger_js_1.logger.warn({ rejectedFiles }, 'parsedfile-store: rejected shard entries at load (untrusted shape); those files re-extract every run');
|
|
307
|
+
}
|
|
308
|
+
return out;
|
|
309
|
+
};
|
|
310
|
+
exports.loadParsedFilesForPaths = loadParsedFilesForPaths;
|
|
311
|
+
/**
|
|
312
|
+
* Treat the durable ParsedFile store as an untrusted serialization boundary.
|
|
313
|
+
* Sanitation is per-SITE, not per-file: one malformed or over-bound fact drops
|
|
314
|
+
* only itself (counted, logged by the caller), so a legitimately pathological
|
|
315
|
+
* source file cannot push its whole ParsedFile into a permanent, silent
|
|
316
|
+
* warm-cache-miss reparse loop (#2522 review). Only a non-array field —
|
|
317
|
+
* i.e. garbage that says the serialization itself is untrustworthy — rejects
|
|
318
|
+
* the file, and `undefined` (never emitted / no facts) passes through.
|
|
319
|
+
* Returns `undefined` for the reject-file case.
|
|
320
|
+
*/
|
|
321
|
+
function sanitizeCallableFlowSites(value) {
|
|
322
|
+
if (value === undefined)
|
|
323
|
+
return { sites: undefined, dropped: 0 };
|
|
324
|
+
if (!Array.isArray(value))
|
|
325
|
+
return undefined;
|
|
326
|
+
const bounded = value.length > MAX_CALLABLE_FLOW_SITES_PER_FILE
|
|
327
|
+
? value.slice(0, MAX_CALLABLE_FLOW_SITES_PER_FILE)
|
|
328
|
+
: value;
|
|
329
|
+
const sites = bounded.filter(isValidCallableFlowSite);
|
|
330
|
+
return { sites, dropped: value.length - sites.length };
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Untrusted-boundary handling for the compact `receiverChain` on a reference site.
|
|
334
|
+
*
|
|
335
|
+
* NARROWER than its sibling `sanitizeCallableFlowSites`, deliberately and worth
|
|
336
|
+
* stating plainly: that function validates every element with a full type
|
|
337
|
+
* predicate, whereas this one inspects only the `receiverChain` sub-field and, in
|
|
338
|
+
* the common case where nothing was stripped, returns the original array typed as
|
|
339
|
+
* `ReferenceSite[]` without structurally validating `name` / `kind` / `atRange`.
|
|
340
|
+
* That is still a strict improvement — `referenceSites` had NO sanitation at all
|
|
341
|
+
* before this — but it is not parity, and a future change that needs per-site
|
|
342
|
+
* structural validation must add it rather than assume it is already here.
|
|
343
|
+
*
|
|
344
|
+
* Sanitation is per-FIELD, not per-site: a chain that does not decode is
|
|
345
|
+
* stripped and the site is kept, because the site is still perfectly usable
|
|
346
|
+
* through the text cascade — dropping the whole reference would turn a
|
|
347
|
+
* degraded receiver into a missing edge. Only a non-array `referenceSites`
|
|
348
|
+
* rejects the file, and `undefined` (a store written before this field
|
|
349
|
+
* existed) passes through untouched, which is what makes an old shard load
|
|
350
|
+
* without error.
|
|
351
|
+
*
|
|
352
|
+
* Returns the ORIGINAL array when nothing was stripped, so the overwhelmingly
|
|
353
|
+
* common case allocates nothing on a hot warm-load path.
|
|
354
|
+
*/
|
|
355
|
+
function sanitizeReceiverChains(value) {
|
|
356
|
+
if (value === undefined)
|
|
357
|
+
return { sites: undefined, dropped: 0 };
|
|
358
|
+
if (!Array.isArray(value))
|
|
359
|
+
return undefined;
|
|
360
|
+
let dropped = 0;
|
|
361
|
+
for (const site of value) {
|
|
362
|
+
if (isRecord(site) &&
|
|
363
|
+
site.receiverChain !== undefined &&
|
|
364
|
+
!(0, receiver_chain_codec_js_1.isValidReceiverChain)(site.receiverChain))
|
|
365
|
+
dropped++;
|
|
366
|
+
}
|
|
367
|
+
if (dropped === 0)
|
|
368
|
+
return { sites: value, dropped: 0 };
|
|
369
|
+
const sites = value.map((site) => {
|
|
370
|
+
if (!isRecord(site) || site.receiverChain === undefined)
|
|
371
|
+
return site;
|
|
372
|
+
if ((0, receiver_chain_codec_js_1.isValidReceiverChain)(site.receiverChain))
|
|
373
|
+
return site;
|
|
374
|
+
const { receiverChain: _dropped, ...rest } = site;
|
|
375
|
+
return rest;
|
|
376
|
+
});
|
|
377
|
+
return { sites, dropped };
|
|
378
|
+
}
|
|
379
|
+
function isValidCallableFlowSite(value) {
|
|
380
|
+
if (!isRecord(value) || typeof value.kind !== 'string')
|
|
381
|
+
return false;
|
|
382
|
+
switch (value.kind) {
|
|
383
|
+
case 'seed':
|
|
384
|
+
return (isValidOperand(value.destination) &&
|
|
385
|
+
isBoundedString(value.targetName) &&
|
|
386
|
+
isOptionalBoundedString(value.targetQualifiedName) &&
|
|
387
|
+
isValidRange(value.targetRange) &&
|
|
388
|
+
isValidExpectedSignature(value.expectedSignature));
|
|
389
|
+
case 'copy':
|
|
390
|
+
case 'alias':
|
|
391
|
+
case 'address':
|
|
392
|
+
return isValidOperand(value.source) && isValidOperand(value.destination);
|
|
393
|
+
case 'store':
|
|
394
|
+
return isValidOperand(value.source) && isValidOperand(value.pointer);
|
|
395
|
+
case 'load':
|
|
396
|
+
return isValidOperand(value.pointer) && isValidOperand(value.destination);
|
|
397
|
+
case 'formal':
|
|
398
|
+
return (isBoundedString(value.ownerName) &&
|
|
399
|
+
isValidRange(value.ownerRange) &&
|
|
400
|
+
isSafeIndex(value.parameterIndex) &&
|
|
401
|
+
isValidOperand(value.binding) &&
|
|
402
|
+
(value.passingMode === 'value' ||
|
|
403
|
+
value.passingMode === 'reference' ||
|
|
404
|
+
value.passingMode === 'pointer') &&
|
|
405
|
+
isValidExpectedSignature(value.expectedSignature));
|
|
406
|
+
case 'argument':
|
|
407
|
+
return (isValidRange(value.callSite) &&
|
|
408
|
+
isSafeIndex(value.parameterIndex) &&
|
|
409
|
+
isValidOperand(value.source) &&
|
|
410
|
+
isOptionalBoundedString(value.directCalleeName));
|
|
411
|
+
case 'invoke':
|
|
412
|
+
return (isValidRange(value.callSite) &&
|
|
413
|
+
isBoundedString(value.inScope) &&
|
|
414
|
+
isValidOperand(value.callee) &&
|
|
415
|
+
(value.receiver === undefined || isValidOperand(value.receiver)) &&
|
|
416
|
+
(value.invocationKind === 'indirect' ||
|
|
417
|
+
value.invocationKind === 'member-pointer' ||
|
|
418
|
+
value.invocationKind === 'callable-object') &&
|
|
419
|
+
(value.arity === undefined || isSafeIndex(value.arity)));
|
|
420
|
+
default:
|
|
421
|
+
return false;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
function isValidOperand(value) {
|
|
425
|
+
if (!isRecord(value))
|
|
426
|
+
return false;
|
|
427
|
+
return (isBoundedString(value.name) &&
|
|
428
|
+
isBoundedString(value.inScope) &&
|
|
429
|
+
isValidRange(value.atRange) &&
|
|
430
|
+
Number.isInteger(value.indirection) &&
|
|
431
|
+
value.indirection >= 0 &&
|
|
432
|
+
value.indirection <= MAX_CALLABLE_FLOW_INDIRECTION &&
|
|
433
|
+
typeof value.addressOf === 'boolean' &&
|
|
434
|
+
(value.expressionKind === undefined ||
|
|
435
|
+
value.expressionKind === 'binding' ||
|
|
436
|
+
value.expressionKind === 'callable-designator' ||
|
|
437
|
+
value.expressionKind === 'bound-member' ||
|
|
438
|
+
value.expressionKind === 'anonymous-callable') &&
|
|
439
|
+
isOptionalBoundedString(value.qualifiedName));
|
|
440
|
+
}
|
|
441
|
+
function isValidExpectedSignature(value) {
|
|
442
|
+
if (value === undefined)
|
|
443
|
+
return true;
|
|
444
|
+
if (!isRecord(value))
|
|
445
|
+
return false;
|
|
446
|
+
return ((value.parameterCount === undefined || isSafeIndex(value.parameterCount)) &&
|
|
447
|
+
isValidBoundedStringArray(value.parameterTypes) &&
|
|
448
|
+
(value.parameterTypeClasses === undefined ||
|
|
449
|
+
(Array.isArray(value.parameterTypeClasses) &&
|
|
450
|
+
value.parameterTypeClasses.length <= MAX_CALLABLE_FLOW_PARAMETERS &&
|
|
451
|
+
value.parameterTypeClasses.every(isRecord))) &&
|
|
452
|
+
(value.isConst === undefined || typeof value.isConst === 'boolean'));
|
|
453
|
+
}
|
|
454
|
+
function isValidBoundedStringArray(value) {
|
|
455
|
+
return (value === undefined ||
|
|
456
|
+
(Array.isArray(value) &&
|
|
457
|
+
value.length <= MAX_CALLABLE_FLOW_PARAMETERS &&
|
|
458
|
+
// '' is a legitimate entry meaning "unknown type" — the same convention
|
|
459
|
+
// as ReferenceSite.argumentTypes. C++ emits it for cv-qualifier-only or
|
|
460
|
+
// ERROR-recovered parameter types, so requiring non-empty here rejected
|
|
461
|
+
// real extractor output (#2522 review).
|
|
462
|
+
value.every((entry) => typeof entry === 'string' && entry.length <= MAX_CALLABLE_FLOW_NAME_LENGTH)));
|
|
463
|
+
}
|
|
464
|
+
function isValidRange(value) {
|
|
465
|
+
if (!isRecord(value))
|
|
466
|
+
return false;
|
|
467
|
+
return (isNonNegativeInteger(value.startLine) &&
|
|
468
|
+
isNonNegativeInteger(value.startCol) &&
|
|
469
|
+
isNonNegativeInteger(value.endLine) &&
|
|
470
|
+
isNonNegativeInteger(value.endCol));
|
|
471
|
+
}
|
|
472
|
+
function isRecord(value) {
|
|
473
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
474
|
+
}
|
|
475
|
+
function isBoundedString(value) {
|
|
476
|
+
return (typeof value === 'string' && value.length > 0 && value.length <= MAX_CALLABLE_FLOW_NAME_LENGTH);
|
|
477
|
+
}
|
|
478
|
+
function isOptionalBoundedString(value) {
|
|
479
|
+
return value === undefined || isBoundedString(value);
|
|
480
|
+
}
|
|
481
|
+
function isNonNegativeInteger(value) {
|
|
482
|
+
return Number.isSafeInteger(value) && value >= 0;
|
|
483
|
+
}
|
|
484
|
+
function isSafeIndex(value) {
|
|
485
|
+
return isNonNegativeInteger(value) && value <= MAX_CALLABLE_FLOW_PARAMETERS;
|
|
486
|
+
}
|
|
487
|
+
/** Durable store dir — a sibling of `parsedfile-store/`, NEVER cleared per run. */
|
|
488
|
+
const getDurableParsedFileDir = (storagePath) => node_path_1.default.join(storagePath, DURABLE_DIRNAME);
|
|
489
|
+
exports.getDurableParsedFileDir = getDurableParsedFileDir;
|
|
490
|
+
const durableChunkDir = (durableDir, chunkHash) => node_path_1.default.join(durableDir, chunkHash);
|
|
491
|
+
/**
|
|
492
|
+
* Start a fresh durable generation for one content-addressed parse chunk.
|
|
493
|
+
* The main thread calls this once before dispatching a cache miss, before any
|
|
494
|
+
* worker can write that chunk. Recreating the directory immediately keeps the
|
|
495
|
+
* worker-side mkdir memoization valid while preventing old worker shard names
|
|
496
|
+
* from accumulating across analyses.
|
|
497
|
+
*/
|
|
498
|
+
const prepareDurableParsedFileChunk = async (durableDir, chunkHash) => {
|
|
499
|
+
const dir = durableChunkDir(durableDir, chunkHash);
|
|
500
|
+
await node_fs_1.promises.rm(dir, { recursive: true, force: true });
|
|
501
|
+
await node_fs_1.promises.mkdir(dir, { recursive: true });
|
|
502
|
+
};
|
|
503
|
+
exports.prepareDurableParsedFileChunk = prepareDurableParsedFileChunk;
|
|
504
|
+
// Per-process set of durable chunk subdirs already `mkdir`ed (mirrors
|
|
505
|
+
// `createdStoreDirs`) so the worker doesn't `mkdirSync` on every shard.
|
|
506
|
+
const createdDurableDirs = new Set();
|
|
507
|
+
/**
|
|
508
|
+
* Synchronous durable-shard writer for use INSIDE a parse worker, alongside
|
|
509
|
+
* {@link persistParsedFileShardSync}. Writes the SAME bytes to a content-addressed
|
|
510
|
+
* durable location keyed by the parse chunk hash so a future warm hit can reuse
|
|
511
|
+
* them. `chunkHash`+`threadId`+`shardSeq` is collision-free across the
|
|
512
|
+
* N-shards-per-chunk fan-out and across worker-death retries — the same
|
|
513
|
+
* uniqueness that makes the run-scoped `w<tid>-<seq>` name safe, prefixed by
|
|
514
|
+
* content. No-op for an empty chunk.
|
|
515
|
+
*/
|
|
516
|
+
const persistDurableParsedFileShardSync = (durableDir, chunkHash, threadId, shardSeq, parsedFiles) => {
|
|
517
|
+
const payload = serializeParsedFileShard(parsedFiles);
|
|
518
|
+
if (payload === null)
|
|
519
|
+
return;
|
|
520
|
+
const dir = durableChunkDir(durableDir, chunkHash);
|
|
521
|
+
if (!createdDurableDirs.has(dir)) {
|
|
522
|
+
(0, node_fs_1.mkdirSync)(dir, { recursive: true });
|
|
523
|
+
createdDurableDirs.add(dir);
|
|
524
|
+
}
|
|
525
|
+
(0, node_fs_1.writeFileSync)(node_path_1.default.join(dir, `${chunkHash}-w${threadId}-${shardSeq}.json`), payload, 'utf-8');
|
|
526
|
+
};
|
|
527
|
+
exports.persistDurableParsedFileShardSync = persistDurableParsedFileShardSync;
|
|
528
|
+
/**
|
|
529
|
+
* Restore a cached chunk's durable shards into the run-scoped store on a warm
|
|
530
|
+
* hit. A verbatim byte copy (no parse, no re-serialize), so the restored
|
|
531
|
+
* ParsedFiles are byte-identical to a cold run and `loadParsedFilesForPaths`
|
|
532
|
+
* (which keys on `filePath`, not shard name) gives scope-resolution full
|
|
533
|
+
* coverage. The durable shard names already carry the chunk hash, so they never
|
|
534
|
+
* collide with the worker's run-scoped `w<tid>-<seq>` shards. Returns the number
|
|
535
|
+
* of shards restored (0 ⇒ no durable coverage for this chunk; caller treats it
|
|
536
|
+
* as a miss).
|
|
537
|
+
*/
|
|
538
|
+
const restoreDurableParsedFileShard = async (durableDir, runStoragePath, chunkHash) => {
|
|
539
|
+
const src = durableChunkDir(durableDir, chunkHash);
|
|
540
|
+
let shards;
|
|
541
|
+
try {
|
|
542
|
+
shards = (await node_fs_1.promises.readdir(src)).filter((f) => f.endsWith('.json'));
|
|
543
|
+
}
|
|
544
|
+
catch {
|
|
545
|
+
return 0; // no durable shards for this chunk
|
|
546
|
+
}
|
|
547
|
+
if (shards.length === 0)
|
|
548
|
+
return 0;
|
|
549
|
+
const dst = (0, exports.getParsedFileStoreDir)(runStoragePath);
|
|
550
|
+
await node_fs_1.promises.mkdir(dst, { recursive: true });
|
|
551
|
+
for (const name of shards) {
|
|
552
|
+
await node_fs_1.promises.copyFile(node_path_1.default.join(src, name), node_path_1.default.join(dst, name));
|
|
553
|
+
}
|
|
554
|
+
return shards.length;
|
|
555
|
+
};
|
|
556
|
+
exports.restoreDurableParsedFileShard = restoreDurableParsedFileShard;
|
|
557
|
+
/**
|
|
558
|
+
* Read the durable index and return the set of chunk hashes it vouches for,
|
|
559
|
+
* gated on `expectedVersion` (`PARSE_CACHE_VERSION`). A version mismatch or a
|
|
560
|
+
* missing/corrupt index returns the empty set — the caller then treats every
|
|
561
|
+
* chunk as a durable miss and re-dispatches workers (NEVER the main-thread
|
|
562
|
+
* `extractParsedFile` fallback), which rewrites the durable store under the new
|
|
563
|
+
* version. Mirrors `loadParseCache`'s version-invalidation contract.
|
|
564
|
+
*/
|
|
565
|
+
const loadDurableParsedFileIndex = async (durableDir, expectedVersion) => {
|
|
566
|
+
try {
|
|
567
|
+
const raw = await node_fs_1.promises.readFile(node_path_1.default.join(durableDir, DURABLE_INDEX_FILENAME), 'utf-8');
|
|
568
|
+
const idx = JSON.parse(raw);
|
|
569
|
+
if (idx?.version !== expectedVersion || !Array.isArray(idx.keys))
|
|
570
|
+
return new Set();
|
|
571
|
+
return new Set(idx.keys);
|
|
572
|
+
}
|
|
573
|
+
catch {
|
|
574
|
+
return new Set();
|
|
575
|
+
}
|
|
576
|
+
};
|
|
577
|
+
exports.loadDurableParsedFileIndex = loadDurableParsedFileIndex;
|
|
578
|
+
/**
|
|
579
|
+
* Prune the durable store to `keepKeys` and rewrite its index. `keepKeys` must
|
|
580
|
+
* be the parse cache's surviving on-disk keys (so the two stores stay coherent:
|
|
581
|
+
* a chunk is "cached" iff BOTH its parse-cache shard and its durable shards
|
|
582
|
+
* exist; a quarantined chunk — no parse-cache shard — drops its durable subdir
|
|
583
|
+
* here and re-dispatches next run). Only subdirs with ≥1 shard are indexed
|
|
584
|
+
* (mirrors `saveParseCache`'s written-keys discipline — never vouch for a chunk
|
|
585
|
+
* hash with no backing shard). The index write is tmp+rename atomic.
|
|
586
|
+
*/
|
|
587
|
+
const pruneAndSaveDurableParsedFileStore = async (durableDir, version, keepKeys) => {
|
|
588
|
+
let entries;
|
|
589
|
+
try {
|
|
590
|
+
entries = await node_fs_1.promises.readdir(durableDir);
|
|
591
|
+
}
|
|
592
|
+
catch {
|
|
593
|
+
return; // nothing written this run
|
|
594
|
+
}
|
|
595
|
+
const survivors = [];
|
|
596
|
+
for (const name of entries) {
|
|
597
|
+
if (name === DURABLE_INDEX_FILENAME)
|
|
598
|
+
continue;
|
|
599
|
+
const full = node_path_1.default.join(durableDir, name);
|
|
600
|
+
if (keepKeys.has(name)) {
|
|
601
|
+
try {
|
|
602
|
+
const shards = (await node_fs_1.promises.readdir(full)).filter((f) => f.endsWith('.json'));
|
|
603
|
+
if (shards.length > 0) {
|
|
604
|
+
survivors.push(name);
|
|
605
|
+
continue;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
catch {
|
|
609
|
+
/* not a readable dir → drop below */
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
await node_fs_1.promises.rm(full, { recursive: true, force: true });
|
|
613
|
+
}
|
|
614
|
+
const idx = { version, keys: survivors };
|
|
615
|
+
const tmp = node_path_1.default.join(durableDir, `${DURABLE_INDEX_FILENAME}.tmp`);
|
|
616
|
+
await node_fs_1.promises.mkdir(durableDir, { recursive: true });
|
|
617
|
+
await node_fs_1.promises.writeFile(tmp, JSON.stringify(idx), 'utf-8');
|
|
618
|
+
await node_fs_1.promises.rename(tmp, node_path_1.default.join(durableDir, DURABLE_INDEX_FILENAME));
|
|
619
|
+
};
|
|
620
|
+
exports.pruneAndSaveDurableParsedFileStore = pruneAndSaveDurableParsedFileStore;
|