gitnexus 1.6.9 → 1.6.10-aptos.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +236 -53
- package/dist/_shared/graph/types.d.ts +67 -3
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/index.d.ts +1 -0
- package/dist/_shared/index.d.ts.map +1 -1
- package/dist/_shared/index.js.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts +3 -1
- package/dist/_shared/integrations/resilient-fetch.d.ts.map +1 -1
- package/dist/_shared/integrations/resilient-fetch.js +4 -3
- package/dist/_shared/integrations/resilient-fetch.js.map +1 -1
- package/dist/_shared/language-detection.d.ts.map +1 -1
- package/dist/_shared/language-detection.js +2 -0
- package/dist/_shared/language-detection.js.map +1 -1
- package/dist/_shared/languages.d.ts +2 -0
- package/dist/_shared/languages.d.ts.map +1 -1
- package/dist/_shared/languages.js +2 -0
- package/dist/_shared/languages.js.map +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts +2 -2
- package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.js +8 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/pipeline.d.ts +1 -1
- package/dist/_shared/pipeline.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/callable-flow-site.d.ts +110 -0
- package/dist/_shared/scope-resolution/callable-flow-site.d.ts.map +1 -0
- package/dist/_shared/scope-resolution/callable-flow-site.js +11 -0
- package/dist/_shared/scope-resolution/callable-flow-site.js.map +1 -0
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js +1 -1
- package/dist/_shared/scope-resolution/finalize-algorithm.js.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/language-classification.js +1 -0
- package/dist/_shared/scope-resolution/language-classification.js.map +1 -1
- package/dist/_shared/scope-resolution/parsed-file.d.ts +7 -0
- package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts +9 -1
- package/dist/_shared/scope-resolution/reference-site.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/types.d.ts +20 -3
- package/dist/_shared/scope-resolution/types.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +1 -1
- package/dist/cli/ai-context.js +25 -44
- package/dist/cli/analyze.d.ts +5 -2
- package/dist/cli/analyze.js +205 -11
- package/dist/cli/clean.js +17 -3
- package/dist/cli/cli-message.d.ts +1 -1
- package/dist/cli/doctor.d.ts +18 -0
- package/dist/cli/doctor.js +96 -5
- package/dist/cli/editor-targets.d.ts +17 -2
- package/dist/cli/editor-targets.js +44 -0
- package/dist/cli/embeddings.d.ts +12 -0
- package/dist/cli/embeddings.js +49 -0
- package/dist/cli/eval-server.d.ts +23 -1
- package/dist/cli/eval-server.js +126 -8
- package/dist/cli/help-i18n.js +6 -0
- package/dist/cli/i18n/en.d.ts +18 -8
- package/dist/cli/i18n/en.js +18 -8
- package/dist/cli/i18n/resources.d.ts +28 -8
- package/dist/cli/i18n/zh-CN.d.ts +10 -0
- package/dist/cli/i18n/zh-CN.js +18 -8
- package/dist/cli/index.js +21 -7
- package/dist/cli/lazy-action.d.ts +7 -0
- package/dist/cli/lazy-action.js +27 -0
- package/dist/cli/mcp.js +6 -3
- package/dist/cli/move-availability.d.ts +5 -0
- package/dist/cli/move-availability.js +11 -0
- package/dist/cli/setup.d.ts +8 -0
- package/dist/cli/setup.js +230 -32
- package/dist/cli/skill-gen.js +38 -18
- package/dist/cli/standard-skills.d.ts +76 -0
- package/dist/cli/standard-skills.js +45 -0
- package/dist/cli/status.d.ts +4 -1
- package/dist/cli/status.js +57 -4
- package/dist/cli/tool.js +11 -0
- package/dist/cli/uninstall.js +77 -18
- package/dist/cli/wiki.d.ts +1 -0
- package/dist/cli/wiki.js +7 -1
- package/dist/config/ignore-service.d.ts +2 -0
- package/dist/config/ignore-service.js +27 -0
- package/dist/core/analysis-features.d.ts +21 -0
- package/dist/core/analysis-features.js +59 -0
- package/dist/core/analyzer-identity.d.ts +74 -0
- package/dist/core/analyzer-identity.js +1820 -0
- package/dist/core/augmentation/engine.js +13 -8
- package/dist/core/embeddings/embedder.d.ts +3 -2
- package/dist/core/embeddings/embedder.js +24 -7
- package/dist/core/embeddings/embedding-identity.d.ts +11 -0
- package/dist/core/embeddings/embedding-identity.js +24 -0
- package/dist/core/embeddings/embedding-pipeline.d.ts +36 -1
- package/dist/core/embeddings/embedding-pipeline.js +100 -9
- package/dist/core/embeddings/http-client.d.ts +33 -3
- package/dist/core/embeddings/http-client.js +237 -25
- package/dist/core/embeddings/node-module-compat.d.ts +25 -0
- package/dist/core/embeddings/node-module-compat.js +25 -0
- package/dist/core/embeddings/onnxruntime-common-resolver.js +8 -5
- package/dist/core/embeddings/onnxruntime-node-resolver.js +33 -7
- package/dist/core/embeddings/runtime-install.d.ts +119 -0
- package/dist/core/embeddings/runtime-install.js +372 -0
- package/dist/core/embeddings/runtime-support.d.ts +48 -17
- package/dist/core/embeddings/runtime-support.js +96 -0
- package/dist/core/git-staleness.js +1 -1
- package/dist/core/group/bridge-db.js +2 -0
- package/dist/core/group/extractors/http-patterns/python.js +246 -108
- package/dist/core/group/extractors/manifest-extractor.js +4 -0
- package/dist/core/incremental/escalation-gate.d.ts +38 -0
- package/dist/core/incremental/escalation-gate.js +48 -0
- package/dist/core/incremental/shadow-candidates.d.ts +3 -3
- package/dist/core/incremental/shadow-candidates.js +3 -3
- package/dist/core/incremental/subgraph-extract.d.ts +2 -2
- package/dist/core/incremental/subgraph-extract.js +2 -2
- package/dist/core/index-freshness.d.ts +5 -0
- package/dist/core/index-freshness.js +13 -0
- package/dist/core/ingestion/class-extractors/configs/jvm.js +29 -0
- package/dist/core/ingestion/cobol/cobol-preprocessor.js +1 -1
- package/dist/core/ingestion/cobol/jcl-processor.js +9 -8
- package/dist/core/ingestion/cobol-processor.js +27 -26
- package/dist/core/ingestion/community-processor.d.ts +51 -1
- package/dist/core/ingestion/community-processor.js +323 -64
- package/dist/core/ingestion/emit-references.js +7 -2
- package/dist/core/ingestion/filesystem-walker.js +4 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.d.ts +3 -0
- package/dist/core/ingestion/frameworks/spring/analysis-features.js +7 -0
- package/dist/core/ingestion/frameworks/spring/bean-candidates.d.ts +30 -0
- package/dist/core/ingestion/frameworks/spring/bean-candidates.js +182 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.d.ts +12 -0
- package/dist/core/ingestion/frameworks/spring/bean-catalog.js +26 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.d.ts +24 -0
- package/dist/core/ingestion/frameworks/spring/config-bindings.js +115 -0
- package/dist/core/ingestion/languages/c/captures.js +56 -0
- package/dist/core/ingestion/languages/c/query.js +17 -0
- package/dist/core/ingestion/languages/c/scope-resolver.js +6 -0
- package/dist/core/ingestion/languages/cobol/captures.js +93 -0
- package/dist/core/ingestion/languages/cobol/scope-resolver.js +7 -0
- package/dist/core/ingestion/languages/cpp/captures.js +365 -75
- package/dist/core/ingestion/languages/cpp/scope-resolver.js +14 -0
- package/dist/core/ingestion/languages/csharp/captures.js +25 -0
- package/dist/core/ingestion/languages/dart/captures.js +90 -2
- package/dist/core/ingestion/languages/dart/extension-type-preprocess.d.ts +7 -0
- package/dist/core/ingestion/languages/dart/extension-type-preprocess.js +30 -0
- package/dist/core/ingestion/languages/dart.js +2 -0
- package/dist/core/ingestion/languages/go/captures.js +34 -0
- package/dist/core/ingestion/languages/index.d.ts +1 -0
- package/dist/core/ingestion/languages/index.js +2 -0
- package/dist/core/ingestion/languages/java/analysis-features.d.ts +3 -0
- package/dist/core/ingestion/languages/java/analysis-features.js +13 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.d.ts +22 -0
- package/dist/core/ingestion/languages/java/capture-side-channel.js +58 -0
- package/dist/core/ingestion/languages/java/captures.d.ts +4 -3
- package/dist/core/ingestion/languages/java/captures.js +193 -17
- package/dist/core/ingestion/languages/java/package-facts.d.ts +5 -0
- package/dist/core/ingestion/languages/java/package-facts.js +9 -0
- package/dist/core/ingestion/languages/java/package-siblings.d.ts +3 -16
- package/dist/core/ingestion/languages/java/package-siblings.js +8 -147
- package/dist/core/ingestion/languages/java/query.js +23 -0
- package/dist/core/ingestion/languages/java/scope-resolver.js +23 -0
- package/dist/core/ingestion/languages/java/spring-bean-metadata.d.ts +2 -0
- package/dist/core/ingestion/languages/java/spring-bean-metadata.js +8 -0
- package/dist/core/ingestion/languages/java/spring-config-bindings.d.ts +23 -0
- package/dist/core/ingestion/languages/java/spring-config-bindings.js +215 -0
- package/dist/core/ingestion/languages/java.js +3 -0
- package/dist/core/ingestion/languages/javascript/captures.js +16 -0
- package/dist/core/ingestion/languages/javascript/query.js +21 -0
- package/dist/core/ingestion/languages/jvm/package-facts.d.ts +35 -0
- package/dist/core/ingestion/languages/jvm/package-facts.js +40 -0
- package/dist/core/ingestion/languages/jvm/package-siblings.d.ts +14 -0
- package/dist/core/ingestion/languages/jvm/package-siblings.js +129 -0
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.d.ts +17 -3
- package/dist/core/ingestion/languages/kotlin/capture-side-channel.js +42 -8
- package/dist/core/ingestion/languages/kotlin/captures.js +59 -0
- package/dist/core/ingestion/languages/kotlin/package-facts.d.ts +5 -0
- package/dist/core/ingestion/languages/kotlin/package-facts.js +9 -0
- package/dist/core/ingestion/languages/kotlin/package-siblings.d.ts +4 -0
- package/dist/core/ingestion/languages/kotlin/package-siblings.js +8 -0
- package/dist/core/ingestion/languages/kotlin/query.js +19 -0
- package/dist/core/ingestion/languages/kotlin/scope-resolver.js +9 -1
- package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.d.ts +2 -0
- package/dist/core/ingestion/languages/kotlin/spring-bean-metadata.js +8 -0
- package/dist/core/ingestion/languages/kotlin.js +5 -6
- package/dist/core/ingestion/languages/move.d.ts +1 -0
- package/dist/core/ingestion/languages/move.js +27 -0
- package/dist/core/ingestion/languages/php/captures.js +40 -0
- package/dist/core/ingestion/languages/php/import-decomposer.js +12 -0
- package/dist/core/ingestion/languages/php/import-target.d.ts +2 -1
- package/dist/core/ingestion/languages/php/import-target.js +110 -2
- package/dist/core/ingestion/languages/php/interpret.js +10 -0
- package/dist/core/ingestion/languages/php/scope-resolver.js +1 -1
- package/dist/core/ingestion/languages/python/captures.d.ts +3 -4
- package/dist/core/ingestion/languages/python/captures.js +24 -5
- package/dist/core/ingestion/languages/python/interpret.js +4 -0
- package/dist/core/ingestion/languages/python/receiver-binding.d.ts +15 -2
- package/dist/core/ingestion/languages/python/receiver-binding.js +96 -2
- package/dist/core/ingestion/languages/python/simple-hooks.d.ts +5 -5
- package/dist/core/ingestion/languages/python/simple-hooks.js +15 -5
- package/dist/core/ingestion/languages/ruby/captures.js +42 -0
- package/dist/core/ingestion/languages/rust/captures.js +13 -0
- package/dist/core/ingestion/languages/rust/interpret.js +18 -0
- package/dist/core/ingestion/languages/rust/query.js +9 -0
- package/dist/core/ingestion/languages/rust/range-binding.js +6 -2
- package/dist/core/ingestion/languages/swift/captures.js +12 -0
- package/dist/core/ingestion/languages/typescript/captures.js +21 -0
- package/dist/core/ingestion/languages/typescript/nuxt-auto-imports.js +2 -1
- package/dist/core/ingestion/languages/typescript/query.js +37 -0
- package/dist/core/ingestion/markdown-processor.js +3 -2
- package/dist/core/ingestion/model/registration-table.js +1 -0
- package/dist/core/ingestion/parsing-processor.d.ts +3 -1
- package/dist/core/ingestion/parsing-processor.js +36 -1
- package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
- package/dist/core/ingestion/pipeline-phases/index.js +2 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +56 -2
- package/dist/core/ingestion/pipeline-phases/parse.d.ts +0 -2
- package/dist/core/ingestion/pipeline-phases/parse.js +12 -3
- package/dist/core/ingestion/pipeline-phases/processes.d.ts +8 -0
- package/dist/core/ingestion/pipeline-phases/processes.js +11 -1
- package/dist/core/ingestion/pipeline-phases/spring-config.d.ts +37 -0
- package/dist/core/ingestion/pipeline-phases/spring-config.js +433 -0
- package/dist/core/ingestion/pipeline-phases/standalone-ingest.d.ts +16 -0
- package/dist/core/ingestion/pipeline-phases/standalone-ingest.js +6 -0
- package/dist/core/ingestion/pipeline.d.ts +4 -2
- package/dist/core/ingestion/pipeline.js +14 -2
- package/dist/core/ingestion/resolve-references.js +12 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.d.ts +83 -0
- package/dist/core/ingestion/route-extractors/constant-resolver.js +131 -0
- package/dist/core/ingestion/route-extractors/python-const-resolver.d.ts +75 -0
- package/dist/core/ingestion/route-extractors/python-const-resolver.js +299 -0
- package/dist/core/ingestion/scope-extractor.js +306 -43
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +71 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +7 -7
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +8 -7
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +3 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +6 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/ids.js +1 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/node-lookup.js +4 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +7 -2
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.d.ts +47 -0
- package/dist/core/ingestion/scope-resolution/passes/callable-value-flow.js +1138 -0
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +16 -4
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +97 -1
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.d.ts +60 -0
- package/dist/core/ingestion/scope-resolution/passes/property-dispatch.js +111 -0
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +4 -3
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +5 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +25 -38
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +6 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +147 -35
- package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
- package/dist/core/ingestion/scope-resolution/scope/walkers.js +73 -44
- package/dist/core/ingestion/taint/typescript-model.js +34 -2
- package/dist/core/ingestion/tree-sitter-queries.d.ts +2 -2
- package/dist/core/ingestion/tree-sitter-queries.js +23 -2
- package/dist/core/ingestion/type-extractors/jvm.js +17 -2
- package/dist/core/ingestion/utils/ast-helpers.d.ts +1 -0
- package/dist/core/ingestion/utils/ast-helpers.js +153 -2
- package/dist/core/ingestion/utils/callable-flow-captures.d.ts +94 -0
- package/dist/core/ingestion/utils/callable-flow-captures.js +878 -0
- package/dist/core/ingestion/utils/line-base.d.ts +20 -0
- package/dist/core/ingestion/utils/line-base.js +20 -0
- package/dist/core/ingestion/utils/symbol-labels.d.ts +21 -0
- package/dist/core/ingestion/utils/symbol-labels.js +45 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +34 -0
- package/dist/core/ingestion/workers/parse-worker.js +40 -5
- package/dist/core/ingestion/workers/result-merge.js +4 -0
- package/dist/core/ingestion/workers/worker-pool.d.ts +28 -0
- package/dist/core/ingestion/workers/worker-pool.js +128 -28
- package/dist/core/lbug/csv-generator.d.ts +15 -0
- package/dist/core/lbug/csv-generator.js +124 -27
- package/dist/core/lbug/cypher-escape.d.ts +20 -0
- package/dist/core/lbug/cypher-escape.js +20 -0
- package/dist/core/lbug/extension-load-error.d.ts +67 -0
- package/dist/core/lbug/extension-load-error.js +326 -0
- package/dist/core/lbug/extension-loader.d.ts +17 -2
- package/dist/core/lbug/extension-loader.js +38 -13
- package/dist/core/lbug/lbug-adapter.d.ts +203 -2
- package/dist/core/lbug/lbug-adapter.js +527 -86
- package/dist/core/lbug/lbug-config.d.ts +56 -2
- package/dist/core/lbug/lbug-config.js +267 -7
- package/dist/core/lbug/move-columns.d.ts +7 -0
- package/dist/core/lbug/move-columns.js +86 -0
- package/dist/core/lbug/native-check.d.ts +40 -0
- package/dist/core/lbug/native-check.js +90 -0
- package/dist/core/lbug/node-table-layout.d.ts +29 -0
- package/dist/core/lbug/node-table-layout.js +119 -0
- package/dist/core/lbug/pool-adapter.d.ts +23 -1
- package/dist/core/lbug/pool-adapter.js +115 -8
- package/dist/core/lbug/schema.d.ts +4 -3
- package/dist/core/lbug/schema.js +16 -16
- package/dist/core/lbug/sidecar-recovery.d.ts +172 -0
- package/dist/core/lbug/sidecar-recovery.js +418 -16
- package/dist/core/lbug/wal-checkpoint-driver.js +3 -0
- package/dist/core/move/artifact-download.d.ts +19 -0
- package/dist/core/move/artifact-download.js +179 -0
- package/dist/core/move/compiler-facts.d.ts +120 -0
- package/dist/core/move/compiler-facts.js +9 -0
- package/dist/core/move/consistency.d.ts +74 -0
- package/dist/core/move/consistency.js +182 -0
- package/dist/core/move/constants.d.ts +98 -0
- package/dist/core/move/constants.js +136 -0
- package/dist/core/move/discovery.d.ts +10 -0
- package/dist/core/move/discovery.js +22 -0
- package/dist/core/move/entry-points.d.ts +14 -0
- package/dist/core/move/entry-points.js +40 -0
- package/dist/core/move/facts-mapper.d.ts +75 -0
- package/dist/core/move/facts-mapper.js +534 -0
- package/dist/core/move/install-lock.d.ts +14 -0
- package/dist/core/move/install-lock.js +102 -0
- package/dist/core/move/install.d.ts +39 -0
- package/dist/core/move/install.js +391 -0
- package/dist/core/move/mcp-client.d.ts +115 -0
- package/dist/core/move/mcp-client.js +436 -0
- package/dist/core/move/move-ingest.d.ts +52 -0
- package/dist/core/move/move-ingest.js +403 -0
- package/dist/core/move/provision.d.ts +19 -0
- package/dist/core/move/provision.js +91 -0
- package/dist/core/move/release.d.ts +6 -0
- package/dist/core/move/release.js +10 -0
- package/dist/core/move/symbol-id.d.ts +35 -0
- package/dist/core/move/symbol-id.js +65 -0
- package/dist/core/move/type-parser.d.ts +11 -0
- package/dist/core/move/type-parser.js +38 -0
- package/dist/core/platform/capabilities.d.ts +0 -1
- package/dist/core/platform/capabilities.js +39 -8
- package/dist/core/run-analyze.d.ts +9 -3
- package/dist/core/run-analyze.js +1002 -184
- package/dist/core/search/fts-indexes.d.ts +31 -0
- package/dist/core/search/fts-indexes.js +73 -0
- package/dist/core/search/fts-schema.js +2 -0
- package/dist/core/tree-sitter/safe-parse.d.ts +8 -3
- package/dist/core/tree-sitter/safe-parse.js +21 -7
- package/dist/core/wiki/graph-queries.js +6 -5
- package/dist/core/wiki/llm-client.d.ts +8 -2
- package/dist/core/wiki/llm-client.js +41 -5
- package/dist/mcp/core/embedder.js +16 -2
- package/dist/mcp/http-transport.d.ts +5 -0
- package/dist/mcp/http-transport.js +19 -5
- package/dist/mcp/local/bean-metadata.d.ts +2 -0
- package/dist/mcp/local/bean-metadata.js +25 -0
- package/dist/mcp/local/line-display.d.ts +22 -0
- package/dist/mcp/local/line-display.js +3 -0
- package/dist/mcp/local/local-backend.d.ts +19 -1
- package/dist/mcp/local/local-backend.js +402 -155
- package/dist/mcp/local/pdg-impact.d.ts +5 -3
- package/dist/mcp/local/pdg-impact.js +5 -2
- package/dist/mcp/output-budget.d.ts +5 -0
- package/dist/mcp/output-budget.js +52 -0
- package/dist/mcp/read-only-policy.d.ts +12 -0
- package/dist/mcp/read-only-policy.js +102 -0
- package/dist/mcp/repository-policy.d.ts +34 -0
- package/dist/mcp/repository-policy.js +328 -0
- package/dist/mcp/resources.js +32 -5
- package/dist/mcp/server.d.ts +5 -2
- package/dist/mcp/server.js +29 -9
- package/dist/mcp/tools.d.ts +0 -8
- package/dist/mcp/tools.js +102 -5
- package/dist/server/analyze-job.d.ts +3 -0
- package/dist/server/analyze-job.js +17 -0
- package/dist/server/analyze-launch.d.ts +6 -0
- package/dist/server/analyze-launch.js +82 -6
- package/dist/server/analyze-worker-core.d.ts +2 -1
- package/dist/server/analyze-worker-core.js +5 -2
- package/dist/server/analyze-worker.js +29 -6
- package/dist/server/api.d.ts +30 -0
- package/dist/server/api.js +120 -34
- package/dist/server/mcp-http.d.ts +1 -1
- package/dist/server/mcp-http.js +4 -2
- package/dist/server/upload-ingest.js +2 -1
- package/dist/server/validation.js +2 -1
- package/dist/storage/git.d.ts +31 -0
- package/dist/storage/git.js +111 -1
- package/dist/storage/parse-cache.js +7 -1
- package/dist/storage/parsedfile-store.d.ts +8 -0
- package/dist/storage/parsedfile-store.js +165 -1
- package/dist/storage/repo-manager.d.ts +194 -2
- package/dist/storage/repo-manager.js +56 -1
- package/dist/types/pipeline.d.ts +7 -0
- package/hooks/antigravity/gitnexus-antigravity-hook.cjs +50 -3
- package/hooks/claude/gitnexus-hook.cjs +59 -9
- package/hooks/claude/pre-tool-use.sh +0 -0
- package/hooks/claude/session-start.sh +0 -0
- package/package.json +21 -15
- package/scripts/cross-platform-tests.ts +56 -0
- package/scripts/ensure-fts.ts +43 -0
- package/scripts/install-duckdb-extension.mjs +85 -24
- package/scripts/run-cross-platform.ts +61 -6
- package/scripts/shard-arg.ts +30 -0
- package/scripts/sync-plugin-manifests.mjs +192 -0
- package/skills/gitnexus-lfg/README.md +55 -0
- package/skills/gitnexus-lfg/SKILL.md +86 -0
- package/skills/gitnexus-plan/README.md +142 -0
- package/skills/gitnexus-plan/SKILL.md +348 -0
- package/skills/gitnexus-plan/references/context-ledger.md +137 -0
- package/skills/gitnexus-plan/references/context-pack.md +126 -0
- package/skills/gitnexus-plan/references/evidence-provenance.md +272 -0
- package/skills/gitnexus-plan/references/pdg-slice.md +109 -0
- package/skills/gitnexus-plan/references/plan-template.md +201 -0
- package/skills/gitnexus-plan/scripts/evidence-provenance.mjs +2084 -0
- package/skills/gitnexus-review/SKILL.md +273 -0
- package/skills/gitnexus-review/ci-personas/ci-adversarial-lens.md +42 -0
- package/skills/gitnexus-review/ci-personas/ci-blast-radius-lens.md +39 -0
- package/skills/gitnexus-review/ci-personas/ci-correctness-lens.md +37 -0
- package/skills/gitnexus-review/ci-personas/ci-coverage-lens.md +40 -0
- package/skills/gitnexus-review/ci-personas/ci-critic-lens.md +42 -0
- package/skills/gitnexus-review/ci-personas/ci-security-lens.md +39 -0
- package/skills/gitnexus-work/README.md +71 -0
- package/skills/gitnexus-work/SKILL.md +269 -0
- package/skills/gitnexus-work/references/evidence-provenance.md +272 -0
- package/skills/gitnexus-work/scripts/evidence-provenance.mjs +2084 -0
- package/web/assets/ProcessFlowModal-B_bfBySy.js +22 -0
- package/web/assets/__vite-browser-external-bMKyYQkO.js +1 -0
- package/web/assets/agent-Bqxn-abU.js +626 -0
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BVWFvYz2.js +1 -0
- package/web/assets/architectureDiagram-UL44E2DR-CmG3uPWf.js +36 -0
- package/web/assets/{blockDiagram-7IZFK4PR-BkWhpzWB.js → blockDiagram-7IZFK4PR-DBefcjof.js} +7 -7
- package/web/assets/{c4Diagram-Y2BXMSZH-DtBvpzWD.js → c4Diagram-Y2BXMSZH-EjWnjEJl.js} +6 -6
- package/web/assets/chunk-2T2R6R2M-Bb6Sy3_j.js +4 -0
- package/web/assets/chunk-2UTLFMKG-CXlhF3Pt.js +1 -0
- package/web/assets/chunk-3SSMPTDK-rPsRM1x0.js +321 -0
- package/web/assets/chunk-4R4BOZG6-Be_F0JoX.js +159 -0
- package/web/assets/{chunk-6764PJDD-DpIS7hxD.js → chunk-6764PJDD-C7xxk063.js} +1 -1
- package/web/assets/chunk-67TQ5CYL-CA7OhIEf.js +124 -0
- package/web/assets/chunk-7FYTHRHK-CsmYIswB.js +32 -0
- package/web/assets/chunk-7J6CGLKN-BlKwgXKs.js +10 -0
- package/web/assets/chunk-7W6UQGC5-pyKGssV3.js +1 -0
- package/web/assets/chunk-C62D2QBJ-3gdL8EKc.js +1 -0
- package/web/assets/chunk-CEXFNPSA-CjwtMDkc.js +1 -0
- package/web/assets/{chunk-INKRHTLW-Nu4ri9P-.js → chunk-INKRHTLW-Ckl3_KkO.js} +13 -13
- package/web/assets/chunk-J5EP6P6S-L19oz55R.js +1 -0
- package/web/assets/{chunk-KGFNY3KK-JGMJvKCK.js → chunk-KGFNY3KK-BZeP-55u.js} +17 -17
- package/web/assets/chunk-KGYTTC2M-zm6n242I.js +1 -0
- package/web/assets/{chunk-KRXBNO2N-BW5o0KUN.js → chunk-KRXBNO2N-C-UNuKKf.js} +1 -1
- package/web/assets/{chunk-LCXTWHL2-CfLLCywY.js → chunk-LCXTWHL2-C162wE5z.js} +5 -5
- package/web/assets/chunk-LII3EMHJ-BL6lKJ_P.js +1 -0
- package/web/assets/chunk-LRIF4GLE-n59lhprL.js +1 -0
- package/web/assets/chunk-QA3QBVWF-DVXPOIxe.js +2 -0
- package/web/assets/chunk-RERM46MO-B5dAdWpP.js +1 -0
- package/web/assets/chunk-RG4AUYOV-ZNgyLFq6.js +206 -0
- package/web/assets/chunk-RKZBBQEN-MyIQbGgD.js +1 -0
- package/web/assets/chunk-RLI5ZMPA-CkXZ0y0U.js +1 -0
- package/web/assets/chunk-T2UQINTJ-BEyXhZWe.js +1 -0
- package/web/assets/chunk-UP6H54XL-BG-n7qDp.js +1 -0
- package/web/assets/chunk-UXSXWOXI-CW1_r5cS.js +1 -0
- package/web/assets/chunk-UY5QBCOK-ByqTVLvh.js +1 -0
- package/web/assets/chunk-VU6ZFW4Y-BLeasdkU.js +2 -0
- package/web/assets/{chunk-W44A43WB-JqMLIpR0.js → chunk-W44A43WB-BN8EQc_u.js} +1 -1
- package/web/assets/chunk-ZXARS5L4-C3v-4Fsw.js +1 -0
- package/web/assets/classDiagram-KGZ6W3CR-olpO3fMe.js +1 -0
- package/web/assets/classDiagram-v2-72OJOZXJ-olpO3fMe.js +1 -0
- package/web/assets/cose-bilkent-UX7MHV2Q-BmnZ7Mvj.js +1 -0
- package/web/assets/dagre-ND4H6XIP-CY4iIF7v.js +4 -0
- package/web/assets/diagram-3NCE3AQN-CO6QpzEE.js +43 -0
- package/web/assets/diagram-GF46GFSD-B2atbzmU.js +24 -0
- package/web/assets/diagram-HNR7UZ2L-DVRltWbL.js +3 -0
- package/web/assets/diagram-QXG6HAR7-DR6AHD2h.js +24 -0
- package/web/assets/diagram-WEQXMOUZ-DkpoMwTL.js +10 -0
- package/web/assets/erDiagram-L5TCEMPS-n8g_90bc.js +85 -0
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-CgFBM7e-.js +1 -0
- package/web/assets/flowDiagram-H6V6AXG4-SGMDiCkB.js +162 -0
- package/web/assets/ganttDiagram-JCBTUEKG-Cb3UBqRS.js +292 -0
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DCJv7SII.js +1 -0
- package/web/assets/gitGraphDiagram-S2ZK5IYY-Bs9CR7tq.js +106 -0
- package/web/assets/index-CX_fADmQ.css +2 -0
- package/web/assets/index-D1Z3dGGz.js +575 -0
- package/web/assets/info-J43DQDTF-KCYPFFUO-BfNy-9Nd.js +1 -0
- package/web/assets/infoDiagram-3YFTVSEB-T368on4D.js +2 -0
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-DfYpxnE5.js → ishikawaDiagram-BNXS4ZKH-XpjJRU9h.js} +6 -6
- package/web/assets/journeyDiagram-M6C3CM3L-C6wjooas.js +139 -0
- package/web/assets/kanban-definition-75IXJCU3-5_UVY79g.js +89 -0
- package/web/assets/{katex-K3KEBU37-CTc5BslQ.js → katex-K3KEBU37-qRQBy-EZ.js} +2 -2
- package/web/assets/{mindmap-definition-2TDM6QVE-DypvbOMQ.js → mindmap-definition-2TDM6QVE-8xDLzk2e.js} +29 -29
- package/web/assets/node-Ct_zna8U.js +8 -0
- package/web/assets/packet-YPE3B663-LP52Z2RK-D4qkeG9k.js +1 -0
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-B_yMKyQa.js +1 -0
- package/web/assets/pieDiagram-CU6KROY3-Bv4LpAbr.js +30 -0
- package/web/assets/preload-helper-Czpn1I53.js +1 -0
- package/web/assets/{quadrantDiagram-VICAPDV7-yXSZ2lLz.js → quadrantDiagram-VICAPDV7-DR54jOeR.js} +6 -6
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DeD6yN_0.js +1 -0
- package/web/assets/requirementDiagram-JXO7QTGE-PEkg7sKC.js +84 -0
- package/web/assets/rolldown-runtime-QTnfLwEv.js +1 -0
- package/web/assets/sankeyDiagram-URQDO5SZ-DDWEtjcs.js +40 -0
- package/web/assets/sdk-CzHHH8tD.js +37 -0
- package/web/assets/sequenceDiagram-VS2MUI6T-Bv-uwANx.js +162 -0
- package/web/assets/src-JV30wyV8.js +1 -0
- package/web/assets/stateDiagram-7D4R322I-DVNjmkEq.js +1 -0
- package/web/assets/stateDiagram-v2-36443NZ5-CyN4Fh7_.js +1 -0
- package/web/assets/timeline-definition-O6YCAMPW-Qmsuo7qS.js +120 -0
- package/web/assets/treeView-BLDUP644-QA4HXRO3-CDuSYnd4.js +1 -0
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-imazucyJ.js +1 -0
- package/web/assets/vennDiagram-MWXL3ELB-BD1iK1SX.js +34 -0
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-DqrT9tB8.js +1 -0
- package/web/assets/wardleyDiagram-CUQ6CDDI-D6TzLVob.js +78 -0
- package/web/assets/{xychartDiagram-N2JHSOCM-BOLm0eNm.js → xychartDiagram-N2JHSOCM-CoZ_Tits.js} +6 -6
- package/web/index.html +18 -10
- package/skills/gitnexus-pr-review.md +0 -163
- package/web/assets/agent-Dli_x7bU.js +0 -660
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-dEkqUZN9.js +0 -36
- package/web/assets/chunk-3SSMPTDK-B4_etUhr.js +0 -321
- package/web/assets/chunk-67TQ5CYL-4sNPJU1q.js +0 -124
- package/web/assets/chunk-7W6UQGC5-KyEG0HQg.js +0 -1
- package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +0 -161
- package/web/assets/chunk-LII3EMHJ-D-jm-dLa.js +0 -1
- package/web/assets/chunk-QA3QBVWF-BgRW3SXd.js +0 -2
- package/web/assets/chunk-RG4AUYOV-CqWzWsV3.js +0 -206
- package/web/assets/chunk-T2UQINTJ-DSBqkzH7.js +0 -1
- package/web/assets/chunk-UY5QBCOK-DyF0vyGd.js +0 -1
- package/web/assets/chunk-ZXARS5L4-CxN8oiwI.js +0 -1
- package/web/assets/classDiagram-KGZ6W3CR-CMne4tG9.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-CMne4tG9.js +0 -1
- package/web/assets/cose-bilkent-UX7MHV2Q-D71wNYRJ.js +0 -1
- package/web/assets/dagre-ND4H6XIP-Co5rRx9X.js +0 -4
- package/web/assets/diagram-3NCE3AQN-DBp4O00j.js +0 -43
- package/web/assets/diagram-GF46GFSD-6N_8yS0i.js +0 -24
- package/web/assets/diagram-HNR7UZ2L-DFCfd5LI.js +0 -3
- package/web/assets/diagram-QXG6HAR7-Di093rFg.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-DZWi4SUN.js +0 -10
- package/web/assets/erDiagram-L5TCEMPS-8X1y6R4Y.js +0 -85
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +0 -1
- package/web/assets/flowDiagram-H6V6AXG4-CMpY8Ufn.js +0 -162
- package/web/assets/ganttDiagram-JCBTUEKG-D3iL2Aet.js +0 -292
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +0 -106
- package/web/assets/index-KctnI3Vq.js +0 -635
- package/web/assets/index-_lgn7hs5.css +0 -2
- package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +0 -1
- package/web/assets/infoDiagram-3YFTVSEB-BaLMZkUg.js +0 -2
- package/web/assets/journeyDiagram-M6C3CM3L-CvArszLo.js +0 -139
- package/web/assets/kanban-definition-75IXJCU3-CpfVLLf9.js +0 -89
- package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +0 -1
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +0 -1
- package/web/assets/pieDiagram-CU6KROY3-s27EFWgP.js +0 -30
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +0 -1
- package/web/assets/requirementDiagram-JXO7QTGE-CWhqInuf.js +0 -84
- package/web/assets/sankeyDiagram-URQDO5SZ-1qEjlFIB.js +0 -40
- package/web/assets/sequenceDiagram-VS2MUI6T-RyTlZ5cR.js +0 -162
- package/web/assets/stateDiagram-7D4R322I-DTjVfX4A.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-xY9_k9_Q.js +0 -1
- package/web/assets/timeline-definition-O6YCAMPW-DrrqLYAf.js +0 -120
- package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +0 -1
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +0 -1
- package/web/assets/vennDiagram-MWXL3ELB-B0RkWAim.js +0 -34
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +0 -1
- package/web/assets/wardleyDiagram-CUQ6CDDI-boUxiQ5F.js +0 -78
|
@@ -39,8 +39,15 @@ export declare function resolveNativeSafeStorageDir(storagePath: string, subdir:
|
|
|
39
39
|
* `true` (0.16.0). Existing call sites that relied on the positional
|
|
40
40
|
* default must now pass `false` explicitly to preserve behaviour.
|
|
41
41
|
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
42
|
+
* 3. `bufferManagerSize` (not a 0.16.0 change, same pin-explicitly
|
|
43
|
+
* principle): `0` means "native default", and the native default buffer
|
|
44
|
+
* pool is 80% of physical RAM. A long-lived `gitnexus mcp` process or a
|
|
45
|
+
* large incremental analyze can balloon to that ceiling and OOM-kill the
|
|
46
|
+
* host session (#2557), so GitNexus pins an explicit bounded pool — see
|
|
47
|
+
* `resolveBufferManagerSize`.
|
|
48
|
+
*
|
|
49
|
+
* Putting these in one shared module guarantees every `new lbug.Database(...)`
|
|
50
|
+
* call site agrees on the same ceilings and behaviour.
|
|
44
51
|
*/
|
|
45
52
|
/**
|
|
46
53
|
* Upper bound for any single GitNexus LadybugDB file (graph index, group
|
|
@@ -54,6 +61,16 @@ export declare function resolveNativeSafeStorageDir(storagePath: string, subdir:
|
|
|
54
61
|
*/
|
|
55
62
|
export declare const LBUG_MAX_DB_SIZE: number;
|
|
56
63
|
export declare const parseWalCheckpointThreshold: (raw: string | undefined) => number | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* Size the buffer pool to an estimated graph size (node + relationship count),
|
|
66
|
+
* clamped to [ADAPTIVE_POOL_FLOOR, defaultBufferPoolSize()]. The estimate can
|
|
67
|
+
* only *shrink* the pool from the default — never above the 2 GiB / 80%-RAM cap,
|
|
68
|
+
* never below the COPY-safety floor — so no repo is under-sized or gets more
|
|
69
|
+
* than the default it would have today.
|
|
70
|
+
*/
|
|
71
|
+
export declare const estimateBufferPool: (graphElementCount: number) => number;
|
|
72
|
+
/** Set (bytes) or clear (`undefined`) the per-run buffer-pool size hint. */
|
|
73
|
+
export declare const setBufferPoolSizeHint: (bytes: number | undefined) => void;
|
|
57
74
|
export declare const WAL_RECOVERY_SUGGESTION = "WAL corruption detected. Run `gitnexus analyze --force` to rebuild the index.";
|
|
58
75
|
export declare function isWalCorruptionError(err: unknown): boolean;
|
|
59
76
|
/**
|
|
@@ -62,6 +79,31 @@ export declare function isWalCorruptionError(err: unknown): boolean;
|
|
|
62
79
|
* back to the permissive matcher.
|
|
63
80
|
*/
|
|
64
81
|
export declare const isLbugCheckpointIoError: (err: unknown) => boolean;
|
|
82
|
+
/**
|
|
83
|
+
* True when `err` looks like the LadybugDB buffer manager failing to release
|
|
84
|
+
* frame memory — the failure mode of a 4 KiB page-size assumption on a
|
|
85
|
+
* 16 KiB/64 KiB-page kernel (#1231). Deliberately does NOT match the
|
|
86
|
+
* generic "buffer pool is full" exhaustion error, which is a sizing
|
|
87
|
+
* problem, not a page-size one.
|
|
88
|
+
*/
|
|
89
|
+
export declare const isLbugPageSizeFrameError: (err: unknown) => boolean;
|
|
90
|
+
/**
|
|
91
|
+
* True when the given `@ladybugdb/core` version contains the runtime
|
|
92
|
+
* OS-page-size detection introduced in 0.18.0 (see the matcher comment
|
|
93
|
+
* above). Unknown/unparseable versions return false so callers err on the
|
|
94
|
+
* side of showing the upgrade hint.
|
|
95
|
+
*/
|
|
96
|
+
export declare const isPageSizeAwareLadybug: (version: string | undefined) => boolean;
|
|
97
|
+
/**
|
|
98
|
+
* OS memory page size in bytes, or `undefined` when it cannot be determined
|
|
99
|
+
* (Windows, missing getconf, sandboxed exec). Node exposes no page-size API,
|
|
100
|
+
* so this shells out to POSIX `getconf PAGE_SIZE` — same execFileSync shape
|
|
101
|
+
* as the Windows 8.3 short-path probe above, but with a tighter timeout and
|
|
102
|
+
* an explicit killSignal (see the options comment below).
|
|
103
|
+
*/
|
|
104
|
+
export declare const getOsPageSize: () => number | undefined;
|
|
105
|
+
/** Exported only for unit tests — clears the getconf probe cache. */
|
|
106
|
+
export declare const _resetOsPageSizeCacheForTest: () => void;
|
|
65
107
|
type LbugModule = typeof lbug;
|
|
66
108
|
export interface LbugDatabaseOptions {
|
|
67
109
|
readOnly?: boolean;
|
|
@@ -86,6 +128,15 @@ export interface LbugConnectionHandle {
|
|
|
86
128
|
* import directly from this module — no re-export to keep in sync.
|
|
87
129
|
*/
|
|
88
130
|
export declare const isDbBusyError: (err: unknown) => boolean;
|
|
131
|
+
/**
|
|
132
|
+
* True when a WAL-checkpoint IO error ALSO carries a busy/lock signal — the
|
|
133
|
+
* rotation failed because another handle (a `gitnexus mcp` server, or this
|
|
134
|
+
* process's own reader) holds the store's WAL open, rather than a permanent
|
|
135
|
+
* disk error. Reuses `isDbBusyError`'s already-tested keyword set instead of a
|
|
136
|
+
* fresh regex, so an unmatched message degrades to "IO error" rather than
|
|
137
|
+
* silently claiming a held-open cause. (#2599)
|
|
138
|
+
*/
|
|
139
|
+
export declare const isLbugCheckpointBusyError: (err: unknown) => boolean;
|
|
89
140
|
/** See {@link classifyDeleteAllError}. */
|
|
90
141
|
export type DeleteAllErrorClass = 'benign-missing-table' | 'rethrow';
|
|
91
142
|
/**
|
|
@@ -108,6 +159,8 @@ export type DeleteAllErrorClass = 'benign-missing-table' | 'rethrow';
|
|
|
108
159
|
*/
|
|
109
160
|
export declare const classifyDeleteAllError: (err: unknown) => DeleteAllErrorClass;
|
|
110
161
|
export declare function createLbugDatabase(lbugModule: LbugModule, databasePath: string, options?: LbugDatabaseOptions): lbug.Database;
|
|
162
|
+
export declare const HANDLE_RELEASE_PROBE_ATTEMPTS = 5;
|
|
163
|
+
export declare const HANDLE_RELEASE_PROBE_DELAY_MS = 50;
|
|
111
164
|
/**
|
|
112
165
|
* Marker symbol attached to lock errors after `openWithLockRetry` exhausts
|
|
113
166
|
* its budget. `withLbugDb`'s outer query-time retry consults this so it
|
|
@@ -121,6 +174,7 @@ export declare const LBUG_OPEN_RETRY_EXHAUSTED: unique symbol;
|
|
|
121
174
|
export declare const isOpenRetryExhausted: (err: unknown) => boolean;
|
|
122
175
|
/** Exported only for direct unit testing — production callers use `openWithLockRetry`. */
|
|
123
176
|
export declare const _isTestFixturePathForTest: (dbPath: string) => boolean;
|
|
177
|
+
export declare const sleep: (ms: number) => Promise<void>;
|
|
124
178
|
export declare function openLbugConnection(lbugModule: LbugModule, databasePath: string, options?: LbugDatabaseOptions): Promise<LbugConnectionHandle>;
|
|
125
179
|
export declare function closeLbugConnection(handle: LbugConnectionHandle): Promise<void>;
|
|
126
180
|
/**
|
|
@@ -227,8 +227,15 @@ export function resolveNativeSafeStorageDir(storagePath, subdir) {
|
|
|
227
227
|
* `true` (0.16.0). Existing call sites that relied on the positional
|
|
228
228
|
* default must now pass `false` explicitly to preserve behaviour.
|
|
229
229
|
*
|
|
230
|
-
*
|
|
231
|
-
*
|
|
230
|
+
* 3. `bufferManagerSize` (not a 0.16.0 change, same pin-explicitly
|
|
231
|
+
* principle): `0` means "native default", and the native default buffer
|
|
232
|
+
* pool is 80% of physical RAM. A long-lived `gitnexus mcp` process or a
|
|
233
|
+
* large incremental analyze can balloon to that ceiling and OOM-kill the
|
|
234
|
+
* host session (#2557), so GitNexus pins an explicit bounded pool — see
|
|
235
|
+
* `resolveBufferManagerSize`.
|
|
236
|
+
*
|
|
237
|
+
* Putting these in one shared module guarantees every `new lbug.Database(...)`
|
|
238
|
+
* call site agrees on the same ceilings and behaviour.
|
|
232
239
|
*/
|
|
233
240
|
/**
|
|
234
241
|
* Upper bound for any single GitNexus LadybugDB file (graph index, group
|
|
@@ -286,6 +293,116 @@ const resolveCheckpointThreshold = () => {
|
|
|
286
293
|
}
|
|
287
294
|
return DEFAULT_WAL_CHECKPOINT_THRESHOLD;
|
|
288
295
|
};
|
|
296
|
+
/**
|
|
297
|
+
* Default ceiling for the LadybugDB buffer pool in bytes (#2557).
|
|
298
|
+
*
|
|
299
|
+
* The pool is a page cache with eviction, so the ceiling trades throughput
|
|
300
|
+
* on very large working sets for a machine that stays alive: 2 GiB is
|
|
301
|
+
* ~40× the GitNexus self-index, while the native 80%-of-RAM default let a
|
|
302
|
+
* `detect_changes` call grow a 105 MiB on-disk index to 19.5 GiB RSS and
|
|
303
|
+
* OOM-kill the reporter's session. The `min` with 80% of `os.totalmem()`
|
|
304
|
+
* keeps sub-2.5-GiB machines at the native-equivalent bound (no regression
|
|
305
|
+
* there); the 64 MiB floor keeps tiny containers above any plausible
|
|
306
|
+
* native minimum pool size.
|
|
307
|
+
*/
|
|
308
|
+
const DEFAULT_BUFFER_POOL_CAP = 2 * 1024 * 1024 * 1024;
|
|
309
|
+
const BUFFER_POOL_FLOOR = 64 * 1024 * 1024;
|
|
310
|
+
// COPY-safety floor for the adaptive hint (below). LadybugDB's bulk COPY needs
|
|
311
|
+
// working buffer-pool memory that scales with the repo: a 64 MiB pool fails
|
|
312
|
+
// ("buffer pool is full and no memory could be freed") on any non-trivial repo,
|
|
313
|
+
// and even the ~1800-file GitNexus checkout needs ≥256 MiB. COPY working
|
|
314
|
+
// memory also scales with schema width (buffer pages are held per column):
|
|
315
|
+
// the Move node tables (main-aptos) add dozens of columns across Function/
|
|
316
|
+
// Struct/Enum/EnumVariant/Const/Module, and a 256 MiB pool deterministically
|
|
317
|
+
// fails their COPY on @ladybugdb/core 0.18.3 even for tiny fixtures
|
|
318
|
+
// (incremental-dirty-recovery reproduces it; 512 MiB passes). So the adaptive
|
|
319
|
+
// size never drops a repo below this — a distinct, higher floor than
|
|
320
|
+
// BUFFER_POOL_FLOOR, which only guards defaultBufferPoolSize on tiny-RAM
|
|
321
|
+
// machines. It is still clamped up to defaultBufferPoolSize, so a machine whose
|
|
322
|
+
// default is below this floor keeps its default rather than over-committing.
|
|
323
|
+
const ADAPTIVE_POOL_FLOOR = 512 * 1024 * 1024;
|
|
324
|
+
const parseBufferPoolSize = (raw) => {
|
|
325
|
+
if (raw === undefined)
|
|
326
|
+
return undefined;
|
|
327
|
+
const normalized = raw.trim();
|
|
328
|
+
if (normalized.length === 0)
|
|
329
|
+
return undefined;
|
|
330
|
+
const parsed = Number(normalized);
|
|
331
|
+
if (!Number.isFinite(parsed) || parsed < 0)
|
|
332
|
+
return undefined;
|
|
333
|
+
return Math.floor(parsed);
|
|
334
|
+
};
|
|
335
|
+
const defaultBufferPoolSize = () => Math.min(DEFAULT_BUFFER_POOL_CAP, Math.max(BUFFER_POOL_FLOOR, Math.floor(os.totalmem() * 0.8)));
|
|
336
|
+
/**
|
|
337
|
+
* Clamp an adaptive pool request to [ADAPTIVE_POOL_FLOOR, default]. The lower
|
|
338
|
+
* bound keeps LadybugDB's COPY viable; the upper bound (defaultBufferPoolSize)
|
|
339
|
+
* means the hint can only shrink the pool from today's default and can never
|
|
340
|
+
* exceed the 2 GiB / 80%-RAM cap — and on a machine whose default is below the
|
|
341
|
+
* COPY floor, the default wins, so the pool is never over-committed.
|
|
342
|
+
*/
|
|
343
|
+
const clampBufferPool = (bytes) => Math.min(defaultBufferPoolSize(), Math.max(ADAPTIVE_POOL_FLOOR, Math.floor(bytes)));
|
|
344
|
+
/**
|
|
345
|
+
* Buffer-pool bytes to provision per graph element (node + relationship).
|
|
346
|
+
*
|
|
347
|
+
* The fixed 2 GiB default is far larger than most repos' working set, and
|
|
348
|
+
* LadybugDB eagerly commits the pool at DB open — measured: a full
|
|
349
|
+
* `analyze --force` of the GitNexus checkout takes ~51 s with the 2 GiB pool
|
|
350
|
+
* vs ~35 s with the ~414 MiB this factor yields (31% faster; the oversized
|
|
351
|
+
* pool's commit dominates). The pool is a page cache over the on-disk index,
|
|
352
|
+
* which scales with node/edge count, so a per-element budget sizes it to the
|
|
353
|
+
* repo. Kept generous so the whole index stays resident (no COPY thrash) and
|
|
354
|
+
* always clamped to at least ADAPTIVE_POOL_FLOOR; tuned by timing a real
|
|
355
|
+
* large-repo `analyze --force` at this factor vs a forced 2 GiB pool (the pool
|
|
356
|
+
* is a native eager allocation, measured with a real analyze, not a build-free
|
|
357
|
+
* bench — see the emit-path COPY timing note in bench/emit-persistence).
|
|
358
|
+
*/
|
|
359
|
+
const POOL_BYTES_PER_ELEMENT = 4 * 1024;
|
|
360
|
+
/**
|
|
361
|
+
* Size the buffer pool to an estimated graph size (node + relationship count),
|
|
362
|
+
* clamped to [ADAPTIVE_POOL_FLOOR, defaultBufferPoolSize()]. The estimate can
|
|
363
|
+
* only *shrink* the pool from the default — never above the 2 GiB / 80%-RAM cap,
|
|
364
|
+
* never below the COPY-safety floor — so no repo is under-sized or gets more
|
|
365
|
+
* than the default it would have today.
|
|
366
|
+
*/
|
|
367
|
+
export const estimateBufferPool = (graphElementCount) => clampBufferPool(graphElementCount * POOL_BYTES_PER_ELEMENT);
|
|
368
|
+
/**
|
|
369
|
+
* Optional per-run buffer-pool size hint (bytes). The analyze orchestrator sets
|
|
370
|
+
* it once the graph size is known (after the pipeline, before the DB open) so
|
|
371
|
+
* the pool is sized to the repo instead of the fixed 2 GiB default, and clears
|
|
372
|
+
* it at run end. Non-analyze opens (MCP serve, `native-check` `:memory:`) never
|
|
373
|
+
* set it and keep the default.
|
|
374
|
+
*/
|
|
375
|
+
let bufferPoolSizeHint;
|
|
376
|
+
/** Set (bytes) or clear (`undefined`) the per-run buffer-pool size hint. */
|
|
377
|
+
export const setBufferPoolSizeHint = (bytes) => {
|
|
378
|
+
bufferPoolSizeHint = bytes;
|
|
379
|
+
};
|
|
380
|
+
/**
|
|
381
|
+
* Resolve the `bufferManagerSize` passed to every `new lbug.Database(...)`.
|
|
382
|
+
* `GITNEXUS_LBUG_BUFFER_POOL_SIZE` (bytes) overrides everything; `0` is a
|
|
383
|
+
* deliberate escape hatch that restores LadybugDB's native unbounded
|
|
384
|
+
* 80%-of-RAM default. With no env override, a per-run `setBufferPoolSizeHint`
|
|
385
|
+
* (clamped to [floor, default]) sizes the pool to the repo; otherwise the
|
|
386
|
+
* default. Resolved at call time (not module load) so tests can stub the env
|
|
387
|
+
* var, the hint, and `os.totalmem`.
|
|
388
|
+
*/
|
|
389
|
+
const resolveBufferManagerSize = () => {
|
|
390
|
+
const raw = process.env.GITNEXUS_LBUG_BUFFER_POOL_SIZE;
|
|
391
|
+
if (raw === undefined) {
|
|
392
|
+
return bufferPoolSizeHint !== undefined
|
|
393
|
+
? clampBufferPool(bufferPoolSizeHint)
|
|
394
|
+
: defaultBufferPoolSize();
|
|
395
|
+
}
|
|
396
|
+
const parsed = parseBufferPoolSize(raw);
|
|
397
|
+
if (parsed !== undefined)
|
|
398
|
+
return parsed;
|
|
399
|
+
// Non-empty but unparseable input: warn the operator and fall back —
|
|
400
|
+
// mirrors the GITNEXUS_WAL_CHECKPOINT_THRESHOLD env path above.
|
|
401
|
+
if (raw.trim().length > 0) {
|
|
402
|
+
logger.warn({ rawValue: raw, fallback: defaultBufferPoolSize() }, `Ignoring invalid GITNEXUS_LBUG_BUFFER_POOL_SIZE=${raw}; expected integer >= 0 (bytes; 0 restores the native 80%-of-RAM default); falling back to min(2 GiB, 80% of RAM).`);
|
|
403
|
+
}
|
|
404
|
+
return defaultBufferPoolSize();
|
|
405
|
+
};
|
|
289
406
|
/** Matches WAL corruption errors from the LadybugDB engine. */
|
|
290
407
|
const WAL_CORRUPTION_RE = /corrupt(ed)?\s+wal|invalid\s+wal\s+record|wal.*corrupt|checksum.*wal/i;
|
|
291
408
|
export const WAL_RECOVERY_SUGGESTION = 'WAL corruption detected. Run `gitnexus analyze --force` to rebuild the index.';
|
|
@@ -337,6 +454,106 @@ export const isLbugCheckpointIoError = (err) => {
|
|
|
337
454
|
return true;
|
|
338
455
|
return LBUG_CHECKPOINT_PERMISSIVE_RE.test(msg);
|
|
339
456
|
};
|
|
457
|
+
// ─── Ladybug non-4K page-size frame-release matcher (#1231) ─────────────────
|
|
458
|
+
//
|
|
459
|
+
// LadybugDB <= 0.17.x hardcoded a 4 KiB OS-page assumption in its buffer
|
|
460
|
+
// manager: evicting a frame released physical memory with
|
|
461
|
+
// `madvise(frame, frameSize, MADV_DONTNEED)` on 4 KiB-aligned frame
|
|
462
|
+
// addresses (verified by disassembling `VMRegion::releaseFrame` in
|
|
463
|
+
// @ladybugdb/core-linux-arm64 0.17.1 — `mov w2, #0x4` = MADV_DONTNEED,
|
|
464
|
+
// throw on non-zero return). On kernels with 16 KiB pages (Raspberry Pi 5
|
|
465
|
+
// default 2712 kernel, Asahi Linux) or 64 KiB pages (some enterprise arm64
|
|
466
|
+
// distros), madvise rejects addresses that are not multiples of the real
|
|
467
|
+
// page size with EINVAL, surfacing as:
|
|
468
|
+
// "Buffer manager exception: Releasing physical memory associated with a
|
|
469
|
+
// frame failed with error code -1: Invalid argument."
|
|
470
|
+
// which aborts `gitnexus analyze` mid-COPY.
|
|
471
|
+
//
|
|
472
|
+
// @ladybugdb/core 0.18.0 rewrote the release path with runtime OS-page-size
|
|
473
|
+
// detection and discard-granule-aligned madvise (new binary strings:
|
|
474
|
+
// "Failed to detect the operating system page size.", "Unsupported page
|
|
475
|
+
// size combination: frame size {}, discard granule size {}, frame group
|
|
476
|
+
// size {}."), so upgrading is the fix. The residual 0.18.0 guard
|
|
477
|
+
// ("Unsupported page size combination") is matched here too so exotic
|
|
478
|
+
// configurations receive the same actionable guidance instead of a raw
|
|
479
|
+
// native message.
|
|
480
|
+
const LBUG_FRAME_RELEASE_RE = /releasing physical memory associated with a frame failed/i;
|
|
481
|
+
const LBUG_PAGE_COMBO_RE = /unsupported page size combination/i;
|
|
482
|
+
/**
|
|
483
|
+
* True when `err` looks like the LadybugDB buffer manager failing to release
|
|
484
|
+
* frame memory — the failure mode of a 4 KiB page-size assumption on a
|
|
485
|
+
* 16 KiB/64 KiB-page kernel (#1231). Deliberately does NOT match the
|
|
486
|
+
* generic "buffer pool is full" exhaustion error, which is a sizing
|
|
487
|
+
* problem, not a page-size one.
|
|
488
|
+
*/
|
|
489
|
+
export const isLbugPageSizeFrameError = (err) => {
|
|
490
|
+
if (!err)
|
|
491
|
+
return false;
|
|
492
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
493
|
+
return LBUG_FRAME_RELEASE_RE.test(msg) || LBUG_PAGE_COMBO_RE.test(msg);
|
|
494
|
+
};
|
|
495
|
+
/**
|
|
496
|
+
* True when the given `@ladybugdb/core` version contains the runtime
|
|
497
|
+
* OS-page-size detection introduced in 0.18.0 (see the matcher comment
|
|
498
|
+
* above). Unknown/unparseable versions return false so callers err on the
|
|
499
|
+
* side of showing the upgrade hint.
|
|
500
|
+
*/
|
|
501
|
+
export const isPageSizeAwareLadybug = (version) => {
|
|
502
|
+
if (!version)
|
|
503
|
+
return false;
|
|
504
|
+
const m = /^(\d+)\.(\d+)/.exec(version.trim());
|
|
505
|
+
if (!m)
|
|
506
|
+
return false;
|
|
507
|
+
const major = Number(m[1]);
|
|
508
|
+
const minor = Number(m[2]);
|
|
509
|
+
return major > 0 || minor >= 18;
|
|
510
|
+
};
|
|
511
|
+
// `undefined` = not probed yet; `null` = probed and unavailable. Cached
|
|
512
|
+
// because analyze error paths and doctor may both ask, and getconf forks.
|
|
513
|
+
let cachedOsPageSize;
|
|
514
|
+
/**
|
|
515
|
+
* OS memory page size in bytes, or `undefined` when it cannot be determined
|
|
516
|
+
* (Windows, missing getconf, sandboxed exec). Node exposes no page-size API,
|
|
517
|
+
* so this shells out to POSIX `getconf PAGE_SIZE` — same execFileSync shape
|
|
518
|
+
* as the Windows 8.3 short-path probe above, but with a tighter timeout and
|
|
519
|
+
* an explicit killSignal (see the options comment below).
|
|
520
|
+
*/
|
|
521
|
+
export const getOsPageSize = () => {
|
|
522
|
+
if (cachedOsPageSize !== undefined)
|
|
523
|
+
return cachedOsPageSize ?? undefined;
|
|
524
|
+
if (process.platform === 'win32') {
|
|
525
|
+
// Windows allocation granularity is not what madvise alignment is about;
|
|
526
|
+
// the #1231 failure mode is POSIX-only.
|
|
527
|
+
cachedOsPageSize = null;
|
|
528
|
+
return undefined;
|
|
529
|
+
}
|
|
530
|
+
try {
|
|
531
|
+
// killSignal SIGKILL (first use in this repo): the default SIGTERM is
|
|
532
|
+
// catchable, so a signal-trapping child held the "5s" timeout for 9s in
|
|
533
|
+
// review reproduction — SIGKILL makes the timeout real for everything
|
|
534
|
+
// except a child stuck in uninterruptible I/O (D state). 2000ms, not
|
|
535
|
+
// 5000: doctor runs this probe on its happy path and real getconf
|
|
536
|
+
// answers in ~2ms, but keep margin for loaded Pi-class hardware — a
|
|
537
|
+
// too-tight ceiling would silently drop the very #1231 diagnostics this
|
|
538
|
+
// probe exists to provide (the catch caches the failure). (#2424 review)
|
|
539
|
+
const out = execFileSync('getconf', ['PAGE_SIZE'], {
|
|
540
|
+
encoding: 'utf-8',
|
|
541
|
+
timeout: 2000,
|
|
542
|
+
killSignal: 'SIGKILL',
|
|
543
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
544
|
+
});
|
|
545
|
+
const parsed = Number(out.trim());
|
|
546
|
+
cachedOsPageSize = Number.isInteger(parsed) && parsed > 0 ? parsed : null;
|
|
547
|
+
}
|
|
548
|
+
catch {
|
|
549
|
+
cachedOsPageSize = null;
|
|
550
|
+
}
|
|
551
|
+
return cachedOsPageSize ?? undefined;
|
|
552
|
+
};
|
|
553
|
+
/** Exported only for unit tests — clears the getconf probe cache. */
|
|
554
|
+
export const _resetOsPageSizeCacheForTest = () => {
|
|
555
|
+
cachedOsPageSize = undefined;
|
|
556
|
+
};
|
|
340
557
|
/**
|
|
341
558
|
* Return true when the error message indicates that a LadybugDB write
|
|
342
559
|
* transaction could not proceed due to lock contention — either a file
|
|
@@ -370,6 +587,27 @@ export const isDbBusyError = (err) => {
|
|
|
370
587
|
msg.includes('already in use') ||
|
|
371
588
|
msg.includes('only one write transaction at a time'));
|
|
372
589
|
};
|
|
590
|
+
/**
|
|
591
|
+
* True when a WAL-checkpoint IO error ALSO carries a busy/lock signal — the
|
|
592
|
+
* rotation failed because another handle (a `gitnexus mcp` server, or this
|
|
593
|
+
* process's own reader) holds the store's WAL open, rather than a permanent
|
|
594
|
+
* disk error. Reuses `isDbBusyError`'s already-tested keyword set instead of a
|
|
595
|
+
* fresh regex, so an unmatched message degrades to "IO error" rather than
|
|
596
|
+
* silently claiming a held-open cause. (#2599)
|
|
597
|
+
*/
|
|
598
|
+
export const isLbugCheckpointBusyError = (err) => {
|
|
599
|
+
if (!isLbugCheckpointIoError(err))
|
|
600
|
+
return false;
|
|
601
|
+
// Anchor to real held-open wording rather than isDbBusyError's broad
|
|
602
|
+
// `.includes('lock')`, which matches the DB PATH embedded in the checkpoint
|
|
603
|
+
// error message (e.g. a repo under `blockchain-app`) and would misclassify a
|
|
604
|
+
// pure disk fault as held-open (#2614 LOW).
|
|
605
|
+
const msg = (err instanceof Error ? err.message : String(err)).toLowerCase();
|
|
606
|
+
return (msg.includes('could not set lock') ||
|
|
607
|
+
msg.includes('lock is held') ||
|
|
608
|
+
msg.includes('being used by another process') ||
|
|
609
|
+
msg.includes('is busy'));
|
|
610
|
+
};
|
|
373
611
|
/**
|
|
374
612
|
* Classify an error thrown while clearing all relationships of one type
|
|
375
613
|
* before an incremental re-write (`deleteAllRelationshipsOfType` in
|
|
@@ -396,7 +634,7 @@ export const classifyDeleteAllError = (err) => {
|
|
|
396
634
|
};
|
|
397
635
|
export function createLbugDatabase(lbugModule, databasePath, options = {}) {
|
|
398
636
|
// .d.ts declares fewer args than the native constructor accepts.
|
|
399
|
-
return new lbugModule.Database(databasePath,
|
|
637
|
+
return new lbugModule.Database(databasePath, resolveBufferManagerSize(), // bufferManagerSize (#2557: default min(2 GiB, 80% RAM); GITNEXUS_LBUG_BUFFER_POOL_SIZE overrides; 0 restores the native 80%-of-RAM default)
|
|
400
638
|
false, // enableCompression (pinned for v0.16.0)
|
|
401
639
|
options.readOnly ?? false, LBUG_MAX_DB_SIZE, true, // autoCheckpoint (always on)
|
|
402
640
|
resolveCheckpointThreshold(), // checkpointThreshold (default 64 MiB; override with GITNEXUS_WAL_CHECKPOINT_THRESHOLD; -1 keeps Ladybug stock ~16 MiB)
|
|
@@ -411,7 +649,10 @@ export function createLbugDatabase(lbugModule, databasePath, options = {}) {
|
|
|
411
649
|
// 1. OPEN_LOCK_RETRY_ATTEMPTS / OPEN_LOCK_RETRY_DELAY_MS (this file)
|
|
412
650
|
// → `new lbug.Database()` constructor lock failures
|
|
413
651
|
// 2. HANDLE_RELEASE_PROBE_ATTEMPTS / HANDLE_RELEASE_PROBE_DELAY_MS (this file)
|
|
414
|
-
// → post-close fs.open probe to absorb Windows handle-release lag
|
|
652
|
+
// → post-close fs.open probe to absorb Windows handle-release lag; also
|
|
653
|
+
// the shared budget for wipeLbugDbFiles' ENOENT-verified removal
|
|
654
|
+
// (lbug-adapter.ts) and the dirty-recovery sidecar park's
|
|
655
|
+
// rename/rm retries (sidecar-recovery.ts) — same lock class
|
|
415
656
|
// 3. DB_LOCK_RETRY_ATTEMPTS / DB_LOCK_RETRY_DELAY_MS (lbug-adapter.ts withLbugDb)
|
|
416
657
|
// → query-time busy/lock retry around already-open connections
|
|
417
658
|
//
|
|
@@ -429,9 +670,26 @@ export function createLbugDatabase(lbugModule, databasePath, options = {}) {
|
|
|
429
670
|
// matches on is unchanged.)
|
|
430
671
|
const OPEN_LOCK_RETRY_ATTEMPTS = 5;
|
|
431
672
|
const OPEN_LOCK_RETRY_DELAY_MS = 100;
|
|
432
|
-
|
|
433
|
-
|
|
673
|
+
// Exported (this shipping review, FIX 1/2): the dirty-recovery sidecar park
|
|
674
|
+
// (sidecar-recovery.ts) and the ENOENT-verified wipe (lbug-adapter.ts
|
|
675
|
+
// wipeLbugDbFiles) retry the SAME Windows handle-release/AV lock class, and
|
|
676
|
+
// their previous private mirror constants were documentation-coupled copies
|
|
677
|
+
// that could drift from this tuning-knob registry silently.
|
|
678
|
+
export const HANDLE_RELEASE_PROBE_ATTEMPTS = 5;
|
|
679
|
+
export const HANDLE_RELEASE_PROBE_DELAY_MS = 50;
|
|
434
680
|
const HANDLE_RELEASE_LOCK_CODES = new Set(['EBUSY', 'EPERM', 'EACCES']);
|
|
681
|
+
// Retry-budget registry, part 2 (retry-budget consolidation): the remaining
|
|
682
|
+
// open-time lock retries live next to their call sites but are catalogued here
|
|
683
|
+
// so all lbug retry budgets surface in one grep. They retry the same lock class
|
|
684
|
+
// as 1–3 ("Could not set lock" while a writer rebuilds the index):
|
|
685
|
+
// 4. LOCK_RETRY_ATTEMPTS / LOCK_RETRY_DELAY_MS (pool-adapter.ts)
|
|
686
|
+
// → read pool's read-only open while `gitnexus analyze` is writing
|
|
687
|
+
// (3 attempts, linear 2s·n back-off ≈ 6s total)
|
|
688
|
+
// 5. LBUG_OPEN_RETRY_ATTEMPTS / _BASE_MS / _MAX_MS (group/bridge-db.ts)
|
|
689
|
+
// → cross-repo bridge RO open race (10 attempts, linear 100ms·n capped
|
|
690
|
+
// at 500ms ≈ 3.5s total)
|
|
691
|
+
// Kept in-file (not moved here) so explicit `lbug-config` test mocks don't have
|
|
692
|
+
// to enumerate them; change a budget in its call site and update this catalogue.
|
|
435
693
|
/**
|
|
436
694
|
* Test-fixture directory prefixes recognized by `isTestFixturePath`.
|
|
437
695
|
*
|
|
@@ -492,7 +750,9 @@ const isTestFixturePath = (dbPath) => {
|
|
|
492
750
|
};
|
|
493
751
|
/** Exported only for direct unit testing — production callers use `openWithLockRetry`. */
|
|
494
752
|
export const _isTestFixturePathForTest = isTestFixturePath;
|
|
495
|
-
|
|
753
|
+
// Exported alongside HANDLE_RELEASE_PROBE_* (this shipping review, FIX 1/2)
|
|
754
|
+
// so the consumers of the shared retry budget do not each grow a private copy.
|
|
755
|
+
export const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
496
756
|
/**
|
|
497
757
|
* Attempt to remove stale `.wal` / `.lock` sidecars that a previous aborted
|
|
498
758
|
* test run may have left behind. Best-effort: ENOENT is normal, anything
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const CODE_ELEMENT_COLUMNS: readonly ["id", "name", "filePath", "startLine", "endLine", "isExported", "content", "description"];
|
|
2
|
+
export declare const MULTI_LANG_BASE_COLUMNS: readonly ["id", "name", "filePath", "startLine", "endLine", "content", "description"];
|
|
3
|
+
export declare const MOVE_FUNCTION_COLUMNS: readonly ["id", "name", "filePath", "startLine", "endLine", "isExported", "content", "description", "language", "qualifiedName", "moduleQualifiedName", "visibility", "visibilityModifier", "isEntry", "isView", "isInline", "isNative", "parameterCount", "returnType", "acquires", "usedTypes", "attributes", "attributesJson", "typeParamsJson", "locationFidelity"];
|
|
4
|
+
export declare const MOVE_STRUCT_LIKE_COLUMNS: readonly ["id", "name", "filePath", "startLine", "endLine", "content", "description", "language", "qualifiedName", "moduleQualifiedName", "moduleAddress", "abilities", "isResource", "isEvent", "fieldList", "attributes", "attributesJson", "typeParamsJson", "moveDeclarationKind", "locationFidelity"];
|
|
5
|
+
export declare const MOVE_ENUM_VARIANT_COLUMNS: readonly ["id", "name", "filePath", "startLine", "endLine", "content", "description", "language", "qualifiedName", "parentEnum", "moduleQualifiedName", "variantKind", "fieldsJson", "attributes", "attributesJson", "locationFidelity"];
|
|
6
|
+
export declare const MOVE_CONST_COLUMNS: readonly ["id", "name", "filePath", "startLine", "endLine", "content", "description", "language", "qualifiedName", "moduleQualifiedName", "constType", "constValue", "isErrorCode", "locationFidelity"];
|
|
7
|
+
export declare const MOVE_MODULE_COLUMNS: readonly ["id", "name", "filePath", "startLine", "endLine", "content", "description", "language", "qualifiedName", "moduleAddress", "attributes", "attributesJson", "locationFidelity"];
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
export const CODE_ELEMENT_COLUMNS = [
|
|
2
|
+
'id',
|
|
3
|
+
'name',
|
|
4
|
+
'filePath',
|
|
5
|
+
'startLine',
|
|
6
|
+
'endLine',
|
|
7
|
+
'isExported',
|
|
8
|
+
'content',
|
|
9
|
+
'description',
|
|
10
|
+
];
|
|
11
|
+
export const MULTI_LANG_BASE_COLUMNS = [
|
|
12
|
+
'id',
|
|
13
|
+
'name',
|
|
14
|
+
'filePath',
|
|
15
|
+
'startLine',
|
|
16
|
+
'endLine',
|
|
17
|
+
'content',
|
|
18
|
+
'description',
|
|
19
|
+
];
|
|
20
|
+
export const MOVE_FUNCTION_COLUMNS = [
|
|
21
|
+
...CODE_ELEMENT_COLUMNS,
|
|
22
|
+
'language',
|
|
23
|
+
'qualifiedName',
|
|
24
|
+
'moduleQualifiedName',
|
|
25
|
+
'visibility',
|
|
26
|
+
'visibilityModifier',
|
|
27
|
+
'isEntry',
|
|
28
|
+
'isView',
|
|
29
|
+
'isInline',
|
|
30
|
+
'isNative',
|
|
31
|
+
'parameterCount',
|
|
32
|
+
'returnType',
|
|
33
|
+
'acquires',
|
|
34
|
+
'usedTypes',
|
|
35
|
+
'attributes',
|
|
36
|
+
'attributesJson',
|
|
37
|
+
'typeParamsJson',
|
|
38
|
+
'locationFidelity',
|
|
39
|
+
];
|
|
40
|
+
export const MOVE_STRUCT_LIKE_COLUMNS = [
|
|
41
|
+
...MULTI_LANG_BASE_COLUMNS,
|
|
42
|
+
'language',
|
|
43
|
+
'qualifiedName',
|
|
44
|
+
'moduleQualifiedName',
|
|
45
|
+
'moduleAddress',
|
|
46
|
+
'abilities',
|
|
47
|
+
'isResource',
|
|
48
|
+
'isEvent',
|
|
49
|
+
'fieldList',
|
|
50
|
+
'attributes',
|
|
51
|
+
'attributesJson',
|
|
52
|
+
'typeParamsJson',
|
|
53
|
+
'moveDeclarationKind',
|
|
54
|
+
'locationFidelity',
|
|
55
|
+
];
|
|
56
|
+
export const MOVE_ENUM_VARIANT_COLUMNS = [
|
|
57
|
+
...MULTI_LANG_BASE_COLUMNS,
|
|
58
|
+
'language',
|
|
59
|
+
'qualifiedName',
|
|
60
|
+
'parentEnum',
|
|
61
|
+
'moduleQualifiedName',
|
|
62
|
+
'variantKind',
|
|
63
|
+
'fieldsJson',
|
|
64
|
+
'attributes',
|
|
65
|
+
'attributesJson',
|
|
66
|
+
'locationFidelity',
|
|
67
|
+
];
|
|
68
|
+
export const MOVE_CONST_COLUMNS = [
|
|
69
|
+
...MULTI_LANG_BASE_COLUMNS,
|
|
70
|
+
'language',
|
|
71
|
+
'qualifiedName',
|
|
72
|
+
'moduleQualifiedName',
|
|
73
|
+
'constType',
|
|
74
|
+
'constValue',
|
|
75
|
+
'isErrorCode',
|
|
76
|
+
'locationFidelity',
|
|
77
|
+
];
|
|
78
|
+
export const MOVE_MODULE_COLUMNS = [
|
|
79
|
+
...MULTI_LANG_BASE_COLUMNS,
|
|
80
|
+
'language',
|
|
81
|
+
'qualifiedName',
|
|
82
|
+
'moduleAddress',
|
|
83
|
+
'attributes',
|
|
84
|
+
'attributesJson',
|
|
85
|
+
'locationFidelity',
|
|
86
|
+
];
|
|
@@ -4,3 +4,43 @@ export interface NativeCheckResult {
|
|
|
4
4
|
message?: string;
|
|
5
5
|
}
|
|
6
6
|
export declare function checkLbugNative(overridePkgDir?: string): NativeCheckResult;
|
|
7
|
+
export interface FtsProbeResult {
|
|
8
|
+
loaded: boolean;
|
|
9
|
+
/** Collapsed LadybugDB error when `loaded` is false. */
|
|
10
|
+
reason?: string;
|
|
11
|
+
}
|
|
12
|
+
/** Same shape for every optional extension; `FtsProbeResult` is the legacy name. */
|
|
13
|
+
export type ExtensionProbeResult = FtsProbeResult;
|
|
14
|
+
/**
|
|
15
|
+
* Live-probe `LOAD EXTENSION fts` on a throwaway in-memory database.
|
|
16
|
+
*
|
|
17
|
+
* `doctor` used to print the static platform capability, which contradicted
|
|
18
|
+
* analyze whenever the extension file was missing or unloadable (#2374).
|
|
19
|
+
* LOAD never touches the network, so the probe is safe offline, and it
|
|
20
|
+
* surfaces LadybugDB's real error — which distinguishes a missing extension
|
|
21
|
+
* file from a present-but-broken one (wrong platform, truncated download).
|
|
22
|
+
* Dynamic import so doctor still runs when the native module itself is broken.
|
|
23
|
+
*
|
|
24
|
+
* Bounded by `timeoutMs`: an unresponsive extension file (e.g. on a hung
|
|
25
|
+
* network home dir) must never freeze `doctor` — the tool the degradation
|
|
26
|
+
* warnings send users to. `Promise.race` lets doctor report and move on; it
|
|
27
|
+
* cannot cancel an in-flight native call, so a future thread-blocking case
|
|
28
|
+
* would need an out-of-process probe.
|
|
29
|
+
*/
|
|
30
|
+
export declare function probeFtsExtensionLoad(timeoutMs?: number): Promise<FtsProbeResult>;
|
|
31
|
+
/**
|
|
32
|
+
* Live-probe `LOAD EXTENSION vector`, the VECTOR counterpart of the FTS probe.
|
|
33
|
+
*
|
|
34
|
+
* Needed for the same reason #2374 needed the FTS one, and reported the same
|
|
35
|
+
* way: #2623's reporter saw `doctor` print `VECTOR index: available` while
|
|
36
|
+
* every incremental `analyze` was dying because the extension had not loaded.
|
|
37
|
+
* `doctor` derived that line from a static platform capability, so it read
|
|
38
|
+
* "available" no matter what the extension file was doing.
|
|
39
|
+
*
|
|
40
|
+
* Probes for real on every platform, Windows included: the extension server
|
|
41
|
+
* ships win_amd64 VECTOR artifacts for every 0.18.x extension version (the
|
|
42
|
+
* old blanket Windows refusal was stale, #1365-era). LOAD never touches the
|
|
43
|
+
* network and never invokes the installer, so this probe is exactly as safe
|
|
44
|
+
* as the FTS one above.
|
|
45
|
+
*/
|
|
46
|
+
export declare function probeVectorExtensionLoad(timeoutMs?: number): Promise<ExtensionProbeResult>;
|
|
@@ -81,3 +81,93 @@ export function checkLbugNative(overridePkgDir) {
|
|
|
81
81
|
}
|
|
82
82
|
return { ok: true, binaryPath };
|
|
83
83
|
}
|
|
84
|
+
const DEFAULT_FTS_PROBE_TIMEOUT_MS = 10_000;
|
|
85
|
+
/** Close each result, swallowing close-time errors so a successful LOAD is not
|
|
86
|
+
* misreported as a failure (native-check keeps no static lbug dependency, so it
|
|
87
|
+
* cannot reuse the adapter's closeQueryResults — that would eagerly load the
|
|
88
|
+
* module and defeat the dynamic import below). */
|
|
89
|
+
const closeProbeResults = (result) => {
|
|
90
|
+
for (const r of Array.isArray(result) ? result : [result]) {
|
|
91
|
+
try {
|
|
92
|
+
r?.close?.();
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// ignore — a close failure must not flip a successful LOAD to failed
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Live-probe `LOAD EXTENSION fts` on a throwaway in-memory database.
|
|
101
|
+
*
|
|
102
|
+
* `doctor` used to print the static platform capability, which contradicted
|
|
103
|
+
* analyze whenever the extension file was missing or unloadable (#2374).
|
|
104
|
+
* LOAD never touches the network, so the probe is safe offline, and it
|
|
105
|
+
* surfaces LadybugDB's real error — which distinguishes a missing extension
|
|
106
|
+
* file from a present-but-broken one (wrong platform, truncated download).
|
|
107
|
+
* Dynamic import so doctor still runs when the native module itself is broken.
|
|
108
|
+
*
|
|
109
|
+
* Bounded by `timeoutMs`: an unresponsive extension file (e.g. on a hung
|
|
110
|
+
* network home dir) must never freeze `doctor` — the tool the degradation
|
|
111
|
+
* warnings send users to. `Promise.race` lets doctor report and move on; it
|
|
112
|
+
* cannot cancel an in-flight native call, so a future thread-blocking case
|
|
113
|
+
* would need an out-of-process probe.
|
|
114
|
+
*/
|
|
115
|
+
export async function probeFtsExtensionLoad(timeoutMs = DEFAULT_FTS_PROBE_TIMEOUT_MS) {
|
|
116
|
+
return await probeExtensionLoad('fts', timeoutMs);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Live-probe `LOAD EXTENSION vector`, the VECTOR counterpart of the FTS probe.
|
|
120
|
+
*
|
|
121
|
+
* Needed for the same reason #2374 needed the FTS one, and reported the same
|
|
122
|
+
* way: #2623's reporter saw `doctor` print `VECTOR index: available` while
|
|
123
|
+
* every incremental `analyze` was dying because the extension had not loaded.
|
|
124
|
+
* `doctor` derived that line from a static platform capability, so it read
|
|
125
|
+
* "available" no matter what the extension file was doing.
|
|
126
|
+
*
|
|
127
|
+
* Probes for real on every platform, Windows included: the extension server
|
|
128
|
+
* ships win_amd64 VECTOR artifacts for every 0.18.x extension version (the
|
|
129
|
+
* old blanket Windows refusal was stale, #1365-era). LOAD never touches the
|
|
130
|
+
* network and never invokes the installer, so this probe is exactly as safe
|
|
131
|
+
* as the FTS one above.
|
|
132
|
+
*/
|
|
133
|
+
export async function probeVectorExtensionLoad(timeoutMs = DEFAULT_FTS_PROBE_TIMEOUT_MS) {
|
|
134
|
+
return await probeExtensionLoad('vector', timeoutMs);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Shared LOAD probe. `extension` is a fixed internal literal, never user input.
|
|
138
|
+
*/
|
|
139
|
+
async function probeExtensionLoad(extension, timeoutMs) {
|
|
140
|
+
let timer;
|
|
141
|
+
const timeout = new Promise((resolve) => {
|
|
142
|
+
timer = setTimeout(() => resolve({
|
|
143
|
+
loaded: false,
|
|
144
|
+
reason: 'probe timed out — extension file or filesystem unresponsive',
|
|
145
|
+
}), timeoutMs);
|
|
146
|
+
});
|
|
147
|
+
const probe = (async () => {
|
|
148
|
+
try {
|
|
149
|
+
const { default: lbug } = await import('@ladybugdb/core');
|
|
150
|
+
const db = new lbug.Database(':memory:');
|
|
151
|
+
// Nested finallys so `db` is closed even if the Connection ctor throws.
|
|
152
|
+
try {
|
|
153
|
+
const conn = new lbug.Connection(db);
|
|
154
|
+
try {
|
|
155
|
+
const result = await conn.query(`LOAD EXTENSION ${extension}`);
|
|
156
|
+
closeProbeResults(result);
|
|
157
|
+
return { loaded: true };
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
await conn.close().catch(() => { });
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
finally {
|
|
164
|
+
await db.close().catch(() => { });
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
169
|
+
return { loaded: false, reason: message.replace(/\s+/g, ' ').trim() };
|
|
170
|
+
}
|
|
171
|
+
})();
|
|
172
|
+
return await Promise.race([probe, timeout]).finally(() => clearTimeout(timer));
|
|
173
|
+
}
|