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
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import path from 'path';
|
|
17
17
|
import { listRegisteredRepos } from '../../storage/repo-manager.js';
|
|
18
|
+
import { escapeCypherString } from '../lbug/cypher-escape.js';
|
|
18
19
|
/**
|
|
19
20
|
* Find the best matching repo for a given working directory.
|
|
20
21
|
* Matches by checking if cwd is within the repo's path.
|
|
@@ -40,11 +41,15 @@ async function findRepoForCwd(cwd) {
|
|
|
40
41
|
if (normalizedCwd === normalizedRepo) {
|
|
41
42
|
matched = true;
|
|
42
43
|
}
|
|
43
|
-
else
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
else {
|
|
45
|
+
const repoPrefix = normalizedRepo.endsWith(sep) ? normalizedRepo : normalizedRepo + sep;
|
|
46
|
+
const cwdPrefix = normalizedCwd.endsWith(sep) ? normalizedCwd : normalizedCwd + sep;
|
|
47
|
+
if (normalizedCwd.startsWith(repoPrefix)) {
|
|
48
|
+
matched = true;
|
|
49
|
+
}
|
|
50
|
+
else if (normalizedRepo.startsWith(cwdPrefix)) {
|
|
51
|
+
matched = true;
|
|
52
|
+
}
|
|
48
53
|
}
|
|
49
54
|
if (matched && normalizedRepo.length > bestLen) {
|
|
50
55
|
bestMatch = entry;
|
|
@@ -76,7 +81,7 @@ async function findRepoForCwd(cwd) {
|
|
|
76
81
|
export async function augment(pattern, cwd) {
|
|
77
82
|
if (!pattern || pattern.length < 3)
|
|
78
83
|
return '';
|
|
79
|
-
const patternFirstWord = pattern.trim()
|
|
84
|
+
const patternFirstWord = escapeCypherString(pattern.trim()).split(/\s+/)[0];
|
|
80
85
|
if (!patternFirstWord || patternFirstWord.length < 2)
|
|
81
86
|
return '';
|
|
82
87
|
const workDir = cwd || process.cwd();
|
|
@@ -97,7 +102,7 @@ export async function augment(pattern, cwd) {
|
|
|
97
102
|
// Step 2: Map BM25 file results to symbols
|
|
98
103
|
const symbolMatches = [];
|
|
99
104
|
for (const result of bm25Results.slice(0, 5)) {
|
|
100
|
-
const escaped = result.filePath
|
|
105
|
+
const escaped = escapeCypherString(result.filePath);
|
|
101
106
|
try {
|
|
102
107
|
const symbols = await executeQuery(repoId, `
|
|
103
108
|
MATCH (n) WHERE n.filePath = '${escaped}'
|
|
@@ -147,7 +152,7 @@ export async function augment(pattern, cwd) {
|
|
|
147
152
|
.filter((sym, i, arr) => arr.findIndex((s) => s.nodeId === sym.nodeId) === i);
|
|
148
153
|
if (uniqueSymbols.length === 0)
|
|
149
154
|
return '';
|
|
150
|
-
const idList = uniqueSymbols.map((s) => `'${s.nodeId
|
|
155
|
+
const idList = uniqueSymbols.map((s) => `'${escapeCypherString(s.nodeId)}'`).join(', ');
|
|
151
156
|
// Batch fetch callers
|
|
152
157
|
const callersMap = new Map();
|
|
153
158
|
try {
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { FeatureExtractionPipeline } from '@huggingface/transformers';
|
|
10
10
|
import { type EmbeddingConfig, type ModelProgress } from './types.js';
|
|
11
|
+
import { type EmbeddingRequestOptions } from './http-client.js';
|
|
11
12
|
/**
|
|
12
13
|
* Progress callback type for model loading
|
|
13
14
|
*/
|
|
@@ -45,7 +46,7 @@ export declare const getEmbedder: () => FeatureExtractionPipeline;
|
|
|
45
46
|
* @param text - Text to embed
|
|
46
47
|
* @returns Float32Array of embedding vector
|
|
47
48
|
*/
|
|
48
|
-
export declare const embedText: (text: string) => Promise<Float32Array>;
|
|
49
|
+
export declare const embedText: (text: string, options?: EmbeddingRequestOptions) => Promise<Float32Array>;
|
|
49
50
|
/**
|
|
50
51
|
* Embed multiple texts in a single batch
|
|
51
52
|
* More efficient than calling embedText multiple times
|
|
@@ -53,7 +54,7 @@ export declare const embedText: (text: string) => Promise<Float32Array>;
|
|
|
53
54
|
* @param texts - Array of texts to embed
|
|
54
55
|
* @returns Array of Float32Array embedding vectors
|
|
55
56
|
*/
|
|
56
|
-
export declare const embedBatch: (texts: string[]) => Promise<Float32Array[]>;
|
|
57
|
+
export declare const embedBatch: (texts: string[], options?: EmbeddingRequestOptions) => Promise<Float32Array[]>;
|
|
57
58
|
/**
|
|
58
59
|
* Convert Float32Array to regular number array (for LadybugDB storage)
|
|
59
60
|
*/
|
|
@@ -13,11 +13,12 @@ if (!process.env.ORT_LOG_LEVEL) {
|
|
|
13
13
|
process.env.ORT_LOG_LEVEL = '3';
|
|
14
14
|
}
|
|
15
15
|
import { DEFAULT_EMBEDDING_CONFIG } from './types.js';
|
|
16
|
-
import { isHttpMode, getHttpDimensions, httpEmbed } from './http-client.js';
|
|
16
|
+
import { isHttpMode, getHttpDimensions, httpEmbed, } from './http-client.js';
|
|
17
17
|
import { resolveEmbeddingConfig } from './config.js';
|
|
18
18
|
import { applyHfEnvOverrides, isHfDownloadFailure, withHfDownloadRetry } from './hf-env.js';
|
|
19
|
-
import { getLocalEmbeddingRuntimeBlocker } from './runtime-support.js';
|
|
19
|
+
import { getLocalEmbeddingRuntimeBlocker, getMissingLocalEmbeddingStackMessage, } from './runtime-support.js';
|
|
20
20
|
import { ensureOnnxRuntimeCommonResolvable } from './onnxruntime-common-resolver.js';
|
|
21
|
+
import { ensureEmbeddingStackResolvable } from './runtime-install.js';
|
|
21
22
|
import { ensureOnnxRuntimeNodeMatchesSystem, isEffectiveCudaAvailable, } from './onnxruntime-node-resolver.js';
|
|
22
23
|
import { logger } from '../logger.js';
|
|
23
24
|
// Module-level state for singleton pattern
|
|
@@ -73,6 +74,11 @@ export const initEmbedder = async (onProgress, config = {}, forceDevice) => {
|
|
|
73
74
|
try {
|
|
74
75
|
// Lazy-load transformers.js only after the runtime guard has passed, so
|
|
75
76
|
// unsupported platforms never reach the native ONNX import (#1515).
|
|
77
|
+
// Registered FIRST so it sits last in the hook chain (registerHooks runs
|
|
78
|
+
// the most recent hook first): when the optional stack was pruned at
|
|
79
|
+
// install time (#2370), its bare specifiers fall back to the on-demand
|
|
80
|
+
// runtime prefix.
|
|
81
|
+
ensureEmbeddingStackResolvable();
|
|
76
82
|
// Under pnpm-strict / `pnpm dlx`, transformers' phantom `onnxruntime-common`
|
|
77
83
|
// import is unresolvable; register the fallback resolver first (#307).
|
|
78
84
|
ensureOnnxRuntimeCommonResolvable();
|
|
@@ -82,7 +88,15 @@ export const initEmbedder = async (onProgress, config = {}, forceDevice) => {
|
|
|
82
88
|
// to the CUDA-13 build before transformers imports them. No-op on matching
|
|
83
89
|
// layouts, non-CUDA, Windows/DirectML, and macOS.
|
|
84
90
|
ensureOnnxRuntimeNodeMatchesSystem();
|
|
85
|
-
|
|
91
|
+
// The stack is an optionalDependency: npm prunes it when onnxruntime-node's
|
|
92
|
+
// postinstall can't reach api.nuget.org (#2370). Rethrow with actionable
|
|
93
|
+
// reinstall guidance instead of a raw ERR_MODULE_NOT_FOUND.
|
|
94
|
+
const { pipeline, env } = await import('@huggingface/transformers').catch((err) => {
|
|
95
|
+
const missing = getMissingLocalEmbeddingStackMessage(err);
|
|
96
|
+
if (missing)
|
|
97
|
+
throw new Error(missing);
|
|
98
|
+
throw err;
|
|
99
|
+
});
|
|
86
100
|
// Configure transformers.js environment
|
|
87
101
|
env.allowLocalModels = false;
|
|
88
102
|
// Bridge user-controlled env vars to transformers.js: HF_HOME →
|
|
@@ -229,9 +243,10 @@ export const getEmbedder = () => {
|
|
|
229
243
|
* @param text - Text to embed
|
|
230
244
|
* @returns Float32Array of embedding vector
|
|
231
245
|
*/
|
|
232
|
-
export const embedText = async (text) => {
|
|
246
|
+
export const embedText = async (text, options = {}) => {
|
|
247
|
+
options.signal?.throwIfAborted();
|
|
233
248
|
if (isHttpMode()) {
|
|
234
|
-
const [vec] = await httpEmbed([text]);
|
|
249
|
+
const [vec] = await httpEmbed([text], options);
|
|
235
250
|
return vec;
|
|
236
251
|
}
|
|
237
252
|
const embedder = getEmbedder();
|
|
@@ -249,12 +264,13 @@ export const embedText = async (text) => {
|
|
|
249
264
|
* @param texts - Array of texts to embed
|
|
250
265
|
* @returns Array of Float32Array embedding vectors
|
|
251
266
|
*/
|
|
252
|
-
export const embedBatch = async (texts) => {
|
|
267
|
+
export const embedBatch = async (texts, options = {}) => {
|
|
268
|
+
options.signal?.throwIfAborted();
|
|
253
269
|
if (texts.length === 0) {
|
|
254
270
|
return [];
|
|
255
271
|
}
|
|
256
272
|
if (isHttpMode()) {
|
|
257
|
-
return httpEmbed(texts);
|
|
273
|
+
return httpEmbed(texts, options);
|
|
258
274
|
}
|
|
259
275
|
const embedder = getEmbedder();
|
|
260
276
|
// Process batch
|
|
@@ -262,6 +278,7 @@ export const embedBatch = async (texts) => {
|
|
|
262
278
|
pooling: 'mean',
|
|
263
279
|
normalize: true,
|
|
264
280
|
});
|
|
281
|
+
options.signal?.throwIfAborted();
|
|
265
282
|
// Result shape is [batch_size, dimensions]
|
|
266
283
|
// Need to split into individual vectors
|
|
267
284
|
const data = result.data;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface EmbeddingIdentity {
|
|
2
|
+
model: string;
|
|
3
|
+
dimensions: number;
|
|
4
|
+
provider: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Identify the vector space strongly enough to resume without mixing providers.
|
|
8
|
+
* The HTTP fingerprint excludes URL credentials and query parameters before
|
|
9
|
+
* hashing, so metadata contains neither an endpoint nor a secret-derived hash.
|
|
10
|
+
*/
|
|
11
|
+
export declare function resolveEmbeddingIdentity(): EmbeddingIdentity;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { getEmbeddingDimensions } from './embedder.js';
|
|
3
|
+
import { resolveEmbeddingConfig } from './config.js';
|
|
4
|
+
import { isHttpMode, safeUrl } from './http-client.js';
|
|
5
|
+
/**
|
|
6
|
+
* Identify the vector space strongly enough to resume without mixing providers.
|
|
7
|
+
* The HTTP fingerprint excludes URL credentials and query parameters before
|
|
8
|
+
* hashing, so metadata contains neither an endpoint nor a secret-derived hash.
|
|
9
|
+
*/
|
|
10
|
+
export function resolveEmbeddingIdentity() {
|
|
11
|
+
const httpMode = isHttpMode();
|
|
12
|
+
const provider = httpMode
|
|
13
|
+
? `http:${createHash('sha256')
|
|
14
|
+
.update(safeUrl(process.env.GITNEXUS_EMBEDDING_URL ?? ''))
|
|
15
|
+
.digest('hex')}`
|
|
16
|
+
: 'local';
|
|
17
|
+
return {
|
|
18
|
+
model: httpMode
|
|
19
|
+
? process.env.GITNEXUS_EMBEDDING_MODEL
|
|
20
|
+
: resolveEmbeddingConfig().modelId,
|
|
21
|
+
dimensions: getEmbeddingDimensions(),
|
|
22
|
+
provider,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
@@ -51,12 +51,47 @@ export declare const batchInsertEmbeddings: (executeWithReusedStatement: (cypher
|
|
|
51
51
|
embedding: number[];
|
|
52
52
|
contentHash?: string;
|
|
53
53
|
}>) => Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Create the vector index for semantic search (indexes the CodeEmbedding table).
|
|
56
|
+
*
|
|
57
|
+
* Keeps the embedding-specific extension-install policy gate here
|
|
58
|
+
* (ensureVectorExtensionAvailable → resolveEmbeddingInstallPolicy, default
|
|
59
|
+
* `auto` for the analyze write path), then delegates the actual
|
|
60
|
+
* `CALL CREATE_VECTOR_INDEX(...)` to the adapter, which runs it through the
|
|
61
|
+
* unprepared `conn.query()` path. It must NOT go through the injected
|
|
62
|
+
* `executeQuery` (prepared `conn.prepare()`): LadybugDB cannot prepare that
|
|
63
|
+
* procedure and fails with "We do not support prepare multiple statements" —
|
|
64
|
+
* the silent degrade in #2114.
|
|
65
|
+
*
|
|
66
|
+
* Exported for run-analyze's wipe-and-restore seam (tri-review 4669518496
|
|
67
|
+
* P1): a full-rebuild/escalated write wipes the DB files — index included —
|
|
68
|
+
* and a preserve-only run restores embedding ROWS without ever reaching the
|
|
69
|
+
* pipeline call sites below, so the orchestrator recreates the index through
|
|
70
|
+
* this same policy-gated, warn-on-failure entry point. Consumed there via
|
|
71
|
+
* dynamic import only (lazy-embeddings convention, #2370).
|
|
72
|
+
*/
|
|
73
|
+
export declare const buildVectorIndex: () => Promise<boolean>;
|
|
54
74
|
export interface EmbeddingPipelineResult {
|
|
55
75
|
nodesProcessed: number;
|
|
56
76
|
chunksProcessed: number;
|
|
57
77
|
vectorIndexReady: boolean;
|
|
58
78
|
semanticMode: 'vector-index' | 'exact-scan';
|
|
59
79
|
}
|
|
80
|
+
export interface EmbeddingPipelineCheckpoint {
|
|
81
|
+
nodesProcessed: number;
|
|
82
|
+
totalNodes: number;
|
|
83
|
+
chunksProcessed: number;
|
|
84
|
+
}
|
|
85
|
+
export interface EmbeddingPipelineCheckpointWindow extends EmbeddingPipelineCheckpoint {
|
|
86
|
+
nodeIds: string[];
|
|
87
|
+
}
|
|
88
|
+
export interface EmbeddingPipelineOptions {
|
|
89
|
+
signal?: AbortSignal;
|
|
90
|
+
checkpointEveryNodes?: number;
|
|
91
|
+
forceReembedNodeIds?: ReadonlySet<string>;
|
|
92
|
+
onCheckpointWindowStart?: (window: EmbeddingPipelineCheckpointWindow) => Promise<void>;
|
|
93
|
+
onCheckpoint?: (checkpoint: EmbeddingPipelineCheckpoint) => Promise<void>;
|
|
94
|
+
}
|
|
60
95
|
/**
|
|
61
96
|
* Run the embedding pipeline
|
|
62
97
|
*
|
|
@@ -69,7 +104,7 @@ export interface EmbeddingPipelineResult {
|
|
|
69
104
|
* Nodes whose hash matches are skipped; nodes with a changed hash are DELETE'd
|
|
70
105
|
* and re-embedded; nodes not in the map are embedded fresh.
|
|
71
106
|
*/
|
|
72
|
-
export declare const runEmbeddingPipeline: (executeQuery: (cypher: string) => Promise<any[]>, executeWithReusedStatement: (cypher: string, paramsList: Array<Record<string, any>>) => Promise<void>, onProgress: EmbeddingProgressCallback, config?: Partial<EmbeddingConfig>, skipNodeIds?: Set<string>, existingEmbeddings?: Map<string, string
|
|
107
|
+
export declare const runEmbeddingPipeline: (executeQuery: (cypher: string) => Promise<any[]>, executeWithReusedStatement: (cypher: string, paramsList: Array<Record<string, any>>) => Promise<void>, onProgress: EmbeddingProgressCallback, config?: Partial<EmbeddingConfig>, skipNodeIds?: Set<string>, existingEmbeddings?: Map<string, string>, pipelineOptions?: EmbeddingPipelineOptions) => Promise<EmbeddingPipelineResult>;
|
|
73
108
|
/**
|
|
74
109
|
* Perform semantic search using the vector index with chunk deduplication
|
|
75
110
|
*/
|
|
@@ -18,6 +18,7 @@ import { DEFAULT_VECTOR_MAX_DISTANCE, getVectorMaxDistance, resolveEmbeddingConf
|
|
|
18
18
|
import { rankExactEmbeddingRows } from './exact-search.js';
|
|
19
19
|
import { EMBEDDING_TABLE_NAME, EMBEDDING_INDEX_NAME, STALE_HASH_SENTINEL } from '../lbug/schema.js';
|
|
20
20
|
import { loadVectorExtension, createVectorIndex } from '../lbug/lbug-adapter.js';
|
|
21
|
+
import { escapeCypherString } from '../lbug/cypher-escape.js';
|
|
21
22
|
import { getExactScanLimit } from '../platform/capabilities.js';
|
|
22
23
|
import { logger } from '../logger.js';
|
|
23
24
|
const isDev = process.env.NODE_ENV === 'development';
|
|
@@ -134,13 +135,49 @@ const queryEmbeddableNodes = async (executeQuery) => {
|
|
|
134
135
|
}
|
|
135
136
|
}
|
|
136
137
|
}
|
|
137
|
-
return allNodes;
|
|
138
|
+
return allNodes.length > 0 ? allNodes : queryFallbackFileNodes(executeQuery);
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* Static and documentation repositories may contain no code symbols while
|
|
142
|
+
* still persisting useful text on File nodes. Keep File embeddings as a
|
|
143
|
+
* zero-symbol fallback so code repositories retain symbol-first selection.
|
|
144
|
+
*/
|
|
145
|
+
const queryFallbackFileNodes = async (executeQuery) => {
|
|
146
|
+
try {
|
|
147
|
+
const rows = await executeQuery(`
|
|
148
|
+
MATCH (n:File)
|
|
149
|
+
RETURN n.id AS id, n.name AS name, 'File' AS label,
|
|
150
|
+
n.filePath AS filePath, n.content AS content
|
|
151
|
+
`);
|
|
152
|
+
return rows
|
|
153
|
+
.map((row) => {
|
|
154
|
+
const content = row.content ?? row[4] ?? '';
|
|
155
|
+
return {
|
|
156
|
+
id: row.id ?? row[0],
|
|
157
|
+
name: row.name ?? row[1],
|
|
158
|
+
label: row.label ?? row[2] ?? 'File',
|
|
159
|
+
filePath: row.filePath ?? row[3],
|
|
160
|
+
content,
|
|
161
|
+
startLine: 1,
|
|
162
|
+
endLine: Math.max(1, content.split('\n').length),
|
|
163
|
+
};
|
|
164
|
+
})
|
|
165
|
+
.filter((node) => node.id &&
|
|
166
|
+
node.filePath &&
|
|
167
|
+
node.content.trim() &&
|
|
168
|
+
node.content !== '[Binary file - content not stored]');
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
if (isDev) {
|
|
172
|
+
logger.warn({ error }, 'Fallback File-node embedding query failed:');
|
|
173
|
+
}
|
|
174
|
+
return [];
|
|
175
|
+
}
|
|
138
176
|
};
|
|
139
177
|
/**
|
|
140
178
|
* Batch INSERT chunk-aware embeddings into CodeEmbedding table
|
|
141
179
|
*/
|
|
142
180
|
export const batchInsertEmbeddings = async (executeWithReusedStatement, updates) => {
|
|
143
|
-
const cypher = `CREATE (e:${EMBEDDING_TABLE_NAME} {id: $id, nodeId: $nodeId, chunkIndex: $chunkIndex, startLine: $startLine, endLine: $endLine, embedding: $embedding, contentHash: $contentHash})`;
|
|
144
181
|
const paramsList = updates.map((u) => ({
|
|
145
182
|
id: `${u.nodeId}:${u.chunkIndex}`,
|
|
146
183
|
nodeId: u.nodeId,
|
|
@@ -150,6 +187,10 @@ export const batchInsertEmbeddings = async (executeWithReusedStatement, updates)
|
|
|
150
187
|
embedding: u.embedding,
|
|
151
188
|
contentHash: u.contentHash ?? STALE_HASH_SENTINEL,
|
|
152
189
|
}));
|
|
190
|
+
if (paramsList.length === 0)
|
|
191
|
+
return;
|
|
192
|
+
await executeWithReusedStatement(`MATCH (e:${EMBEDDING_TABLE_NAME} {id: $id}) DELETE e`, paramsList.map(({ id }) => ({ id })));
|
|
193
|
+
const cypher = `CREATE (e:${EMBEDDING_TABLE_NAME} {id: $id, nodeId: $nodeId, chunkIndex: $chunkIndex, startLine: $startLine, endLine: $endLine, embedding: $embedding, contentHash: $contentHash})`;
|
|
153
194
|
await executeWithReusedStatement(cypher, paramsList);
|
|
154
195
|
};
|
|
155
196
|
/**
|
|
@@ -163,8 +204,15 @@ export const batchInsertEmbeddings = async (executeWithReusedStatement, updates)
|
|
|
163
204
|
* `executeQuery` (prepared `conn.prepare()`): LadybugDB cannot prepare that
|
|
164
205
|
* procedure and fails with "We do not support prepare multiple statements" —
|
|
165
206
|
* the silent degrade in #2114.
|
|
207
|
+
*
|
|
208
|
+
* Exported for run-analyze's wipe-and-restore seam (tri-review 4669518496
|
|
209
|
+
* P1): a full-rebuild/escalated write wipes the DB files — index included —
|
|
210
|
+
* and a preserve-only run restores embedding ROWS without ever reaching the
|
|
211
|
+
* pipeline call sites below, so the orchestrator recreates the index through
|
|
212
|
+
* this same policy-gated, warn-on-failure entry point. Consumed there via
|
|
213
|
+
* dynamic import only (lazy-embeddings convention, #2370).
|
|
166
214
|
*/
|
|
167
|
-
const buildVectorIndex = async () => {
|
|
215
|
+
export const buildVectorIndex = async () => {
|
|
168
216
|
// This pre-check applies the embedding-specific install policy
|
|
169
217
|
// (resolveEmbeddingInstallPolicy, default `auto` for analyze) before reaching
|
|
170
218
|
// the adapter. The adapter's createVectorIndex() calls loadVectorExtension()
|
|
@@ -223,11 +271,18 @@ const deleteStaleEmbeddingRows = async (executeWithReusedStatement, nodeIds) =>
|
|
|
223
271
|
* Nodes whose hash matches are skipped; nodes with a changed hash are DELETE'd
|
|
224
272
|
* and re-embedded; nodes not in the map are embedded fresh.
|
|
225
273
|
*/
|
|
226
|
-
export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatement, onProgress, config = {}, skipNodeIds, existingEmbeddings) => {
|
|
274
|
+
export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatement, onProgress, config = {}, skipNodeIds, existingEmbeddings, pipelineOptions = {}) => {
|
|
227
275
|
const finalConfig = resolveEmbeddingConfig(config);
|
|
228
276
|
let totalChunks = 0;
|
|
277
|
+
const checkpointEveryNodes = pipelineOptions.checkpointEveryNodes ?? 5_000;
|
|
278
|
+
if (!Number.isSafeInteger(checkpointEveryNodes) || checkpointEveryNodes <= 0) {
|
|
279
|
+
throw new Error('checkpointEveryNodes must be a positive integer');
|
|
280
|
+
}
|
|
281
|
+
const throwIfCancelled = () => pipelineOptions.signal?.throwIfAborted();
|
|
229
282
|
try {
|
|
283
|
+
throwIfCancelled();
|
|
230
284
|
const vectorAvailable = await ensureVectorExtensionAvailable();
|
|
285
|
+
throwIfCancelled();
|
|
231
286
|
if (!vectorAvailable) {
|
|
232
287
|
logger.warn(vectorUnavailableMessage);
|
|
233
288
|
}
|
|
@@ -246,6 +301,7 @@ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatem
|
|
|
246
301
|
modelDownloadPercent: downloadPercent,
|
|
247
302
|
});
|
|
248
303
|
}, finalConfig);
|
|
304
|
+
throwIfCancelled();
|
|
249
305
|
}
|
|
250
306
|
onProgress({
|
|
251
307
|
phase: 'loading-model',
|
|
@@ -257,6 +313,8 @@ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatem
|
|
|
257
313
|
}
|
|
258
314
|
// Phase 2: Query embeddable nodes
|
|
259
315
|
let nodes = await queryEmbeddableNodes(executeQuery);
|
|
316
|
+
throwIfCancelled();
|
|
317
|
+
const embeddableNodeIds = new Set(nodes.map((node) => node.id));
|
|
260
318
|
// Incremental mode: compare content hashes, delete stale rows, skip fresh ones.
|
|
261
319
|
// Computed hashes for stale nodes are cached so batchInsertEmbeddings can reuse them
|
|
262
320
|
// (avoids double computation).
|
|
@@ -265,16 +323,18 @@ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatem
|
|
|
265
323
|
// than all up front — see U6 / KTD7. `staleNodeIds` is consulted inside the
|
|
266
324
|
// batch loop; it stays empty in full (non-incremental) mode so no deletes fire.
|
|
267
325
|
const staleNodeIds = new Set();
|
|
268
|
-
|
|
326
|
+
const forceReembedNodeIds = pipelineOptions.forceReembedNodeIds;
|
|
327
|
+
if ((existingEmbeddings && existingEmbeddings.size > 0) ||
|
|
328
|
+
(forceReembedNodeIds && forceReembedNodeIds.size > 0)) {
|
|
269
329
|
const beforeCount = nodes.length;
|
|
270
330
|
nodes = nodes.filter((n) => {
|
|
271
|
-
const existingHash = existingEmbeddings
|
|
331
|
+
const existingHash = existingEmbeddings?.get(n.id);
|
|
272
332
|
if (existingHash === undefined) {
|
|
273
333
|
// New node — needs embedding
|
|
274
334
|
return true;
|
|
275
335
|
}
|
|
276
336
|
const currentHash = contentHashForNode(n, finalConfig);
|
|
277
|
-
if (currentHash !== existingHash) {
|
|
337
|
+
if (currentHash !== existingHash || forceReembedNodeIds?.has(n.id)) {
|
|
278
338
|
// Content changed — cache hash for reuse during insert, mark for DELETE + re-embed
|
|
279
339
|
computedStaleHashes.set(n.id, currentHash);
|
|
280
340
|
staleNodeIds.add(n.id);
|
|
@@ -287,11 +347,17 @@ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatem
|
|
|
287
347
|
logger.info(`📦 Incremental embeddings: ${beforeCount} total, ${existingEmbeddings.size} cached, ${staleNodeIds.size} stale, ${nodes.length} to embed`);
|
|
288
348
|
}
|
|
289
349
|
}
|
|
350
|
+
if (forceReembedNodeIds && forceReembedNodeIds.size > 0) {
|
|
351
|
+
const removedPendingNodeIds = [...forceReembedNodeIds].filter((nodeId) => !embeddableNodeIds.has(nodeId));
|
|
352
|
+
await deleteStaleEmbeddingRows(executeWithReusedStatement, removedPendingNodeIds);
|
|
353
|
+
throwIfCancelled();
|
|
354
|
+
}
|
|
290
355
|
const totalNodes = nodes.length;
|
|
291
356
|
if (isDev) {
|
|
292
357
|
logger.info(`📊 Found ${totalNodes} embeddable nodes`);
|
|
293
358
|
}
|
|
294
359
|
if (totalNodes === 0) {
|
|
360
|
+
throwIfCancelled();
|
|
295
361
|
// Ensure the vector index exists even when no new nodes need embedding.
|
|
296
362
|
// A prior crash or first-time incremental run may have left CodeEmbedding
|
|
297
363
|
// rows without ever reaching index creation.
|
|
@@ -313,6 +379,7 @@ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatem
|
|
|
313
379
|
const batchSize = finalConfig.batchSize;
|
|
314
380
|
const chunkSize = finalConfig.chunkSize;
|
|
315
381
|
const overlap = finalConfig.overlap;
|
|
382
|
+
const checkpointWindowNodeCount = Math.max(batchSize, Math.ceil(checkpointEveryNodes / batchSize) * batchSize);
|
|
316
383
|
let processedNodes = 0;
|
|
317
384
|
onProgress({
|
|
318
385
|
phase: 'embedding',
|
|
@@ -324,6 +391,18 @@ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatem
|
|
|
324
391
|
});
|
|
325
392
|
// Process in batches of nodes
|
|
326
393
|
for (let batchIndex = 0; batchIndex < totalNodes; batchIndex += batchSize) {
|
|
394
|
+
throwIfCancelled();
|
|
395
|
+
if (pipelineOptions.onCheckpointWindowStart && batchIndex % checkpointWindowNodeCount === 0) {
|
|
396
|
+
await pipelineOptions.onCheckpointWindowStart({
|
|
397
|
+
nodesProcessed: processedNodes,
|
|
398
|
+
totalNodes,
|
|
399
|
+
chunksProcessed: totalChunks,
|
|
400
|
+
nodeIds: nodes
|
|
401
|
+
.slice(batchIndex, batchIndex + checkpointWindowNodeCount)
|
|
402
|
+
.map((node) => node.id),
|
|
403
|
+
});
|
|
404
|
+
throwIfCancelled();
|
|
405
|
+
}
|
|
327
406
|
const batch = nodes.slice(batchIndex, batchIndex + batchSize);
|
|
328
407
|
// Chunk each node and generate text
|
|
329
408
|
const allTexts = [];
|
|
@@ -379,6 +458,7 @@ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatem
|
|
|
379
458
|
// Preserves Kuzu's required DELETE-before-INSERT for vector-indexed rows.
|
|
380
459
|
const batchStaleIds = batch.filter((n) => staleNodeIds.has(n.id)).map((n) => n.id);
|
|
381
460
|
await deleteStaleEmbeddingRows(executeWithReusedStatement, batchStaleIds);
|
|
461
|
+
throwIfCancelled();
|
|
382
462
|
// Embed chunk texts in sub-batches to control memory
|
|
383
463
|
const EMBED_SUB_BATCH = finalConfig.subBatchSize;
|
|
384
464
|
for (let si = 0; si < allTexts.length; si += EMBED_SUB_BATCH) {
|
|
@@ -386,7 +466,7 @@ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatem
|
|
|
386
466
|
const subUpdates = allUpdates.slice(si, si + EMBED_SUB_BATCH);
|
|
387
467
|
let embeddings;
|
|
388
468
|
try {
|
|
389
|
-
embeddings = await embedBatch(subTexts);
|
|
469
|
+
embeddings = await embedBatch(subTexts, { signal: pipelineOptions.signal });
|
|
390
470
|
}
|
|
391
471
|
catch (embedErr) {
|
|
392
472
|
logger.error({ embedErr }, `❌ embedBatch failed for ${subTexts.length} texts (first: "${subTexts[0]?.substring(0, 80)}..."):`);
|
|
@@ -397,6 +477,7 @@ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatem
|
|
|
397
477
|
embedding: embeddingToArray(embeddings[i]),
|
|
398
478
|
}));
|
|
399
479
|
await batchInsertEmbeddings(executeWithReusedStatement, dbUpdates);
|
|
480
|
+
throwIfCancelled();
|
|
400
481
|
}
|
|
401
482
|
processedNodes += batch.length;
|
|
402
483
|
totalChunks += allUpdates.length;
|
|
@@ -409,8 +490,18 @@ export const runEmbeddingPipeline = async (executeQuery, executeWithReusedStatem
|
|
|
409
490
|
currentBatch: Math.floor(batchIndex / batchSize) + 1,
|
|
410
491
|
totalBatches: Math.ceil(totalNodes / batchSize),
|
|
411
492
|
});
|
|
493
|
+
if (pipelineOptions.onCheckpoint &&
|
|
494
|
+
(processedNodes % checkpointWindowNodeCount === 0 || processedNodes === totalNodes)) {
|
|
495
|
+
await pipelineOptions.onCheckpoint({
|
|
496
|
+
nodesProcessed: processedNodes,
|
|
497
|
+
totalNodes,
|
|
498
|
+
chunksProcessed: totalChunks,
|
|
499
|
+
});
|
|
500
|
+
throwIfCancelled();
|
|
501
|
+
}
|
|
412
502
|
}
|
|
413
503
|
// Phase 4: Create vector index
|
|
504
|
+
throwIfCancelled();
|
|
414
505
|
onProgress({
|
|
415
506
|
phase: 'indexing',
|
|
416
507
|
percent: 90,
|
|
@@ -536,7 +627,7 @@ export const semanticSearch = async (executeQuery, query, k = 10, maxDistance =
|
|
|
536
627
|
// Batch-fetch metadata per label
|
|
537
628
|
const results = [];
|
|
538
629
|
for (const [label, items] of byLabel) {
|
|
539
|
-
const idList = items.map((i) => `'${i.nodeId
|
|
630
|
+
const idList = items.map((i) => `'${escapeCypherString(i.nodeId)}'`).join(', ');
|
|
540
631
|
try {
|
|
541
632
|
const nodeQuery = `
|
|
542
633
|
MATCH (n:\`${label}\`) WHERE n.id IN [${idList}]
|
|
@@ -10,8 +10,17 @@
|
|
|
10
10
|
* fails fast on a flapping endpoint. Per-attempt timeout is enforced
|
|
11
11
|
* via `AbortSignal.timeout` on the underlying fetch.
|
|
12
12
|
*/
|
|
13
|
+
export interface EmbeddingRequestOptions {
|
|
14
|
+
signal?: AbortSignal;
|
|
15
|
+
}
|
|
13
16
|
/**
|
|
14
|
-
*
|
|
17
|
+
* Whether HTTP embedding mode is active — i.e. both `GITNEXUS_EMBEDDING_URL` and
|
|
18
|
+
* `GITNEXUS_EMBEDDING_MODEL` are set. A pure presence probe: it deliberately does
|
|
19
|
+
* NOT call {@link readConfig}, so it never throws on a malformed
|
|
20
|
+
* `GITNEXUS_EMBEDDING_DIMS`. This lets its ~13 call sites (analyze, doctor,
|
|
21
|
+
* run-analyze, embedder, mcp) probe the mode without a defensive try/catch; the
|
|
22
|
+
* DIMS value is validated where it is actually used (`readConfig` in
|
|
23
|
+
* `httpEmbed`/`httpEmbedQuery`), surfacing a recognizable config error. See #2385.
|
|
15
24
|
*/
|
|
16
25
|
export declare const isHttpMode: () => boolean;
|
|
17
26
|
/**
|
|
@@ -26,6 +35,27 @@ export declare const getHttpDimensions: () => number | undefined;
|
|
|
26
35
|
* custom-endpoint confirmation can mask the same way.
|
|
27
36
|
*/
|
|
28
37
|
export declare const safeUrl: (url: string) => string;
|
|
38
|
+
/**
|
|
39
|
+
* Error thrown by this module's HTTP embedding path (`httpEmbedBatch` /
|
|
40
|
+
* `httpEmbed` / `httpEmbedQuery`) for any endpoint failure — a
|
|
41
|
+
* connection/timeout/DNS error, an open circuit, a non-OK status, an
|
|
42
|
+
* unparseable or wrong-shape response body, an empty response, or a dimension
|
|
43
|
+
* mismatch.
|
|
44
|
+
*
|
|
45
|
+
* Carrying a distinct type (rather than a plain `Error`) lets the CLI tell a
|
|
46
|
+
* *custom endpoint* failure apart from a HuggingFace *model download* failure
|
|
47
|
+
* without matching message text: the two share the same underlying network
|
|
48
|
+
* substrings (`fetch failed`, `ECONNREFUSED`, …), which is exactly why
|
|
49
|
+
* `isNetworkFetchError` in `hf-env.ts` cannot tell them apart. Keying on the
|
|
50
|
+
* type instead of the message is also locale-proof and survives message
|
|
51
|
+
* rewording. The human-readable `.message` (built with `safeUrl` and the
|
|
52
|
+
* underlying reason) is what the CLI surfaces to the user. See #2385.
|
|
53
|
+
*/
|
|
54
|
+
export declare class HttpEmbeddingError extends Error {
|
|
55
|
+
constructor(message: string, options?: {
|
|
56
|
+
cause?: unknown;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
29
59
|
/**
|
|
30
60
|
* Embed texts via the HTTP backend, splitting into batches.
|
|
31
61
|
* Reads config from env vars on every call.
|
|
@@ -33,7 +63,7 @@ export declare const safeUrl: (url: string) => string;
|
|
|
33
63
|
* @param texts - Array of texts to embed
|
|
34
64
|
* @returns Array of Float32Array embedding vectors
|
|
35
65
|
*/
|
|
36
|
-
export declare const httpEmbed: (texts: string[]) => Promise<Float32Array[]>;
|
|
66
|
+
export declare const httpEmbed: (texts: string[], requestOptions?: EmbeddingRequestOptions) => Promise<Float32Array[]>;
|
|
37
67
|
/**
|
|
38
68
|
* Embed a single query text via the HTTP backend.
|
|
39
69
|
* Convenience for MCP search where only one vector is needed.
|
|
@@ -41,4 +71,4 @@ export declare const httpEmbed: (texts: string[]) => Promise<Float32Array[]>;
|
|
|
41
71
|
* @param text - Query text to embed
|
|
42
72
|
* @returns Embedding vector as number array
|
|
43
73
|
*/
|
|
44
|
-
export declare const httpEmbedQuery: (text: string) => Promise<number[]>;
|
|
74
|
+
export declare const httpEmbedQuery: (text: string, requestOptions?: EmbeddingRequestOptions) => Promise<number[]>;
|