@noyrax/5d-database-plugin 0.1.0
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/ADR_VORSCHLAEGE.md +247 -0
- package/CHROMADB_SETUP.md +69 -0
- package/IMPROVEMENT_ROADMAP.md +435 -0
- package/INSTALLATION_READINESS.md +150 -0
- package/KNOWN_ISSUES.md +210 -0
- package/LICENSE +21 -0
- package/MCP_SERVER_SETUP.md +359 -0
- package/MCP_SERVER_TEST_REPORT.md +206 -0
- package/NOYRAX_INTEGRATION.md +224 -0
- package/QUICK_START.md +316 -0
- package/README.md +240 -0
- package/SETUP_NEW_PROJECT.md +260 -0
- package/SYSTEM_ANALYSIS_REPORT.md +341 -0
- package/out/api/adr-api.d.ts +22 -0
- package/out/api/adr-api.d.ts.map +1 -0
- package/out/api/adr-api.js +38 -0
- package/out/api/adr-api.js.map +1 -0
- package/out/api/bootstrap-api.d.ts +43 -0
- package/out/api/bootstrap-api.d.ts.map +1 -0
- package/out/api/bootstrap-api.js +88 -0
- package/out/api/bootstrap-api.js.map +1 -0
- package/out/api/change-api.d.ts +30 -0
- package/out/api/change-api.d.ts.map +1 -0
- package/out/api/change-api.js +54 -0
- package/out/api/change-api.js.map +1 -0
- package/out/api/context-builder.d.ts +81 -0
- package/out/api/context-builder.d.ts.map +1 -0
- package/out/api/context-builder.js +288 -0
- package/out/api/context-builder.js.map +1 -0
- package/out/api/cross-dimension-api.d.ts +43 -0
- package/out/api/cross-dimension-api.d.ts.map +1 -0
- package/out/api/cross-dimension-api.js +55 -0
- package/out/api/cross-dimension-api.js.map +1 -0
- package/out/api/dependency-api.d.ts +26 -0
- package/out/api/dependency-api.d.ts.map +1 -0
- package/out/api/dependency-api.js +46 -0
- package/out/api/dependency-api.js.map +1 -0
- package/out/api/learning-path-api.d.ts +49 -0
- package/out/api/learning-path-api.d.ts.map +1 -0
- package/out/api/learning-path-api.js +174 -0
- package/out/api/learning-path-api.js.map +1 -0
- package/out/api/module-api.d.ts +26 -0
- package/out/api/module-api.d.ts.map +1 -0
- package/out/api/module-api.js +46 -0
- package/out/api/module-api.js.map +1 -0
- package/out/api/search-api.d.ts +64 -0
- package/out/api/search-api.d.ts.map +1 -0
- package/out/api/search-api.js +235 -0
- package/out/api/search-api.js.map +1 -0
- package/out/api/self-explanation-api.d.ts +71 -0
- package/out/api/self-explanation-api.d.ts.map +1 -0
- package/out/api/self-explanation-api.js +153 -0
- package/out/api/self-explanation-api.js.map +1 -0
- package/out/api/semantic-search-api.d.ts +64 -0
- package/out/api/semantic-search-api.d.ts.map +1 -0
- package/out/api/semantic-search-api.js +205 -0
- package/out/api/semantic-search-api.js.map +1 -0
- package/out/api/symbol-api.d.ts +22 -0
- package/out/api/symbol-api.d.ts.map +1 -0
- package/out/api/symbol-api.js +38 -0
- package/out/api/symbol-api.js.map +1 -0
- package/out/api/vector-api.d.ts +26 -0
- package/out/api/vector-api.d.ts.map +1 -0
- package/out/api/vector-api.js +49 -0
- package/out/api/vector-api.js.map +1 -0
- package/out/cli/embedding-cli.d.ts +3 -0
- package/out/cli/embedding-cli.d.ts.map +1 -0
- package/out/cli/embedding-cli.js +151 -0
- package/out/cli/embedding-cli.js.map +1 -0
- package/out/cli/ingest-cli.d.ts +3 -0
- package/out/cli/ingest-cli.d.ts.map +1 -0
- package/out/cli/ingest-cli.js +145 -0
- package/out/cli/ingest-cli.js.map +1 -0
- package/out/cli/mcp-server-cli.d.ts +3 -0
- package/out/cli/mcp-server-cli.d.ts.map +1 -0
- package/out/cli/mcp-server-cli.js +159 -0
- package/out/cli/mcp-server-cli.js.map +1 -0
- package/out/cli/query-cli.d.ts +3 -0
- package/out/cli/query-cli.d.ts.map +1 -0
- package/out/cli/query-cli.js +217 -0
- package/out/cli/query-cli.js.map +1 -0
- package/out/cli/semantic-search-cli.d.ts +3 -0
- package/out/cli/semantic-search-cli.d.ts.map +1 -0
- package/out/cli/semantic-search-cli.js +196 -0
- package/out/cli/semantic-search-cli.js.map +1 -0
- package/out/cli/test-chromadb.d.ts +3 -0
- package/out/cli/test-chromadb.d.ts.map +1 -0
- package/out/cli/test-chromadb.js +204 -0
- package/out/cli/test-chromadb.js.map +1 -0
- package/out/cli/test-v-dimension.d.ts +3 -0
- package/out/cli/test-v-dimension.d.ts.map +1 -0
- package/out/cli/test-v-dimension.js +330 -0
- package/out/cli/test-v-dimension.js.map +1 -0
- package/out/cli/tool-cli.d.ts +3 -0
- package/out/cli/tool-cli.d.ts.map +1 -0
- package/out/cli/tool-cli.js +237 -0
- package/out/cli/tool-cli.js.map +1 -0
- package/out/cli/verify-openai-key.d.ts +3 -0
- package/out/cli/verify-openai-key.d.ts.map +1 -0
- package/out/cli/verify-openai-key.js +141 -0
- package/out/cli/verify-openai-key.js.map +1 -0
- package/out/cli/verify-vss-status.d.ts +3 -0
- package/out/cli/verify-vss-status.d.ts.map +1 -0
- package/out/cli/verify-vss-status.js +185 -0
- package/out/cli/verify-vss-status.js.map +1 -0
- package/out/core/chromadb-vector-database.d.ts +52 -0
- package/out/core/chromadb-vector-database.d.ts.map +1 -0
- package/out/core/chromadb-vector-database.js +276 -0
- package/out/core/chromadb-vector-database.js.map +1 -0
- package/out/core/docs-path-resolver.d.ts +43 -0
- package/out/core/docs-path-resolver.d.ts.map +1 -0
- package/out/core/docs-path-resolver.js +137 -0
- package/out/core/docs-path-resolver.js.map +1 -0
- package/out/core/id-mapper.d.ts +68 -0
- package/out/core/id-mapper.d.ts.map +1 -0
- package/out/core/id-mapper.js +132 -0
- package/out/core/id-mapper.js.map +1 -0
- package/out/core/migration-manager.d.ts +75 -0
- package/out/core/migration-manager.d.ts.map +1 -0
- package/out/core/migration-manager.js +212 -0
- package/out/core/migration-manager.js.map +1 -0
- package/out/core/multi-db-manager.d.ts +84 -0
- package/out/core/multi-db-manager.d.ts.map +1 -0
- package/out/core/multi-db-manager.js +206 -0
- package/out/core/multi-db-manager.js.map +1 -0
- package/out/core/transaction-manager.d.ts +69 -0
- package/out/core/transaction-manager.d.ts.map +1 -0
- package/out/core/transaction-manager.js +138 -0
- package/out/core/transaction-manager.js.map +1 -0
- package/out/core/vector-database-factory.d.ts +25 -0
- package/out/core/vector-database-factory.d.ts.map +1 -0
- package/out/core/vector-database-factory.js +82 -0
- package/out/core/vector-database-factory.js.map +1 -0
- package/out/core/vector-database-interface.d.ts +50 -0
- package/out/core/vector-database-interface.d.ts.map +1 -0
- package/out/core/vector-database-interface.js +3 -0
- package/out/core/vector-database-interface.js.map +1 -0
- package/out/core/vss-loader.d.ts +29 -0
- package/out/core/vss-loader.d.ts.map +1 -0
- package/out/core/vss-loader.js +150 -0
- package/out/core/vss-loader.js.map +1 -0
- package/out/core/vss-manager.d.ts +81 -0
- package/out/core/vss-manager.d.ts.map +1 -0
- package/out/core/vss-manager.js +323 -0
- package/out/core/vss-manager.js.map +1 -0
- package/out/core/vss-vector-database.d.ts +71 -0
- package/out/core/vss-vector-database.d.ts.map +1 -0
- package/out/core/vss-vector-database.js +284 -0
- package/out/core/vss-vector-database.js.map +1 -0
- package/out/embedding/embedding-generator.d.ts +45 -0
- package/out/embedding/embedding-generator.d.ts.map +1 -0
- package/out/embedding/embedding-generator.js +143 -0
- package/out/embedding/embedding-generator.js.map +1 -0
- package/out/embedding/embedding-pipeline.d.ts +42 -0
- package/out/embedding/embedding-pipeline.d.ts.map +1 -0
- package/out/embedding/embedding-pipeline.js +290 -0
- package/out/embedding/embedding-pipeline.js.map +1 -0
- package/out/extension.d.ts +10 -0
- package/out/extension.d.ts.map +1 -0
- package/out/extension.js +164 -0
- package/out/extension.js.map +1 -0
- package/out/ingestors/adr-ingestor.d.ts +41 -0
- package/out/ingestors/adr-ingestor.d.ts.map +1 -0
- package/out/ingestors/adr-ingestor.js +329 -0
- package/out/ingestors/adr-ingestor.js.map +1 -0
- package/out/ingestors/base-ingestor.d.ts +30 -0
- package/out/ingestors/base-ingestor.d.ts.map +1 -0
- package/out/ingestors/base-ingestor.js +3 -0
- package/out/ingestors/base-ingestor.js.map +1 -0
- package/out/ingestors/change-ingestor.d.ts +36 -0
- package/out/ingestors/change-ingestor.d.ts.map +1 -0
- package/out/ingestors/change-ingestor.js +216 -0
- package/out/ingestors/change-ingestor.js.map +1 -0
- package/out/ingestors/dependency-ingestor.d.ts +32 -0
- package/out/ingestors/dependency-ingestor.d.ts.map +1 -0
- package/out/ingestors/dependency-ingestor.js +194 -0
- package/out/ingestors/dependency-ingestor.js.map +1 -0
- package/out/ingestors/module-ingestor.d.ts +27 -0
- package/out/ingestors/module-ingestor.d.ts.map +1 -0
- package/out/ingestors/module-ingestor.js +137 -0
- package/out/ingestors/module-ingestor.js.map +1 -0
- package/out/ingestors/symbol-ingestor.d.ts +26 -0
- package/out/ingestors/symbol-ingestor.d.ts.map +1 -0
- package/out/ingestors/symbol-ingestor.js +183 -0
- package/out/ingestors/symbol-ingestor.js.map +1 -0
- package/out/mcp/resources/adrs.d.ts +13 -0
- package/out/mcp/resources/adrs.d.ts.map +1 -0
- package/out/mcp/resources/adrs.js +26 -0
- package/out/mcp/resources/adrs.js.map +1 -0
- package/out/mcp/resources/changes.d.ts +13 -0
- package/out/mcp/resources/changes.d.ts.map +1 -0
- package/out/mcp/resources/changes.js +26 -0
- package/out/mcp/resources/changes.js.map +1 -0
- package/out/mcp/resources/dependencies.d.ts +13 -0
- package/out/mcp/resources/dependencies.d.ts.map +1 -0
- package/out/mcp/resources/dependencies.js +26 -0
- package/out/mcp/resources/dependencies.js.map +1 -0
- package/out/mcp/resources/modules.d.ts +13 -0
- package/out/mcp/resources/modules.d.ts.map +1 -0
- package/out/mcp/resources/modules.js +26 -0
- package/out/mcp/resources/modules.js.map +1 -0
- package/out/mcp/resources/symbols.d.ts +13 -0
- package/out/mcp/resources/symbols.d.ts.map +1 -0
- package/out/mcp/resources/symbols.js +26 -0
- package/out/mcp/resources/symbols.js.map +1 -0
- package/out/mcp/server.d.ts +29 -0
- package/out/mcp/server.d.ts.map +1 -0
- package/out/mcp/server.js +300 -0
- package/out/mcp/server.js.map +1 -0
- package/out/mcp/tools/architecture-mining.d.ts +46 -0
- package/out/mcp/tools/architecture-mining.d.ts.map +1 -0
- package/out/mcp/tools/architecture-mining.js +272 -0
- package/out/mcp/tools/architecture-mining.js.map +1 -0
- package/out/mcp/tools/bootstrap.d.ts +9 -0
- package/out/mcp/tools/bootstrap.d.ts.map +1 -0
- package/out/mcp/tools/bootstrap.js +14 -0
- package/out/mcp/tools/bootstrap.js.map +1 -0
- package/out/mcp/tools/cross-analysis.d.ts +18 -0
- package/out/mcp/tools/cross-analysis.d.ts.map +1 -0
- package/out/mcp/tools/cross-analysis.js +23 -0
- package/out/mcp/tools/cross-analysis.js.map +1 -0
- package/out/mcp/tools/gap-analysis.d.ts +34 -0
- package/out/mcp/tools/gap-analysis.d.ts.map +1 -0
- package/out/mcp/tools/gap-analysis.js +106 -0
- package/out/mcp/tools/gap-analysis.js.map +1 -0
- package/out/mcp/tools/learning-path.d.ts +10 -0
- package/out/mcp/tools/learning-path.d.ts.map +1 -0
- package/out/mcp/tools/learning-path.js +18 -0
- package/out/mcp/tools/learning-path.js.map +1 -0
- package/out/mcp/tools/query-dependencies.d.ts +18 -0
- package/out/mcp/tools/query-dependencies.d.ts.map +1 -0
- package/out/mcp/tools/query-dependencies.js +31 -0
- package/out/mcp/tools/query-dependencies.js.map +1 -0
- package/out/mcp/tools/query-modules.d.ts +17 -0
- package/out/mcp/tools/query-modules.d.ts.map +1 -0
- package/out/mcp/tools/query-modules.js +22 -0
- package/out/mcp/tools/query-modules.js.map +1 -0
- package/out/mcp/tools/query-symbols.d.ts +18 -0
- package/out/mcp/tools/query-symbols.d.ts.map +1 -0
- package/out/mcp/tools/query-symbols.js +32 -0
- package/out/mcp/tools/query-symbols.js.map +1 -0
- package/out/mcp/tools/semantic-discovery.d.ts +12 -0
- package/out/mcp/tools/semantic-discovery.d.ts.map +1 -0
- package/out/mcp/tools/semantic-discovery.js +35 -0
- package/out/mcp/tools/semantic-discovery.js.map +1 -0
- package/out/mcp/tools/system-explanation.d.ts +9 -0
- package/out/mcp/tools/system-explanation.d.ts.map +1 -0
- package/out/mcp/tools/system-explanation.js +14 -0
- package/out/mcp/tools/system-explanation.js.map +1 -0
- package/out/mcp/types.d.ts +19 -0
- package/out/mcp/types.d.ts.map +1 -0
- package/out/mcp/types.js +6 -0
- package/out/mcp/types.js.map +1 -0
- package/out/models/adr.d.ts +26 -0
- package/out/models/adr.d.ts.map +1 -0
- package/out/models/adr.js +3 -0
- package/out/models/adr.js.map +1 -0
- package/out/models/change.d.ts +42 -0
- package/out/models/change.d.ts.map +1 -0
- package/out/models/change.js +3 -0
- package/out/models/change.js.map +1 -0
- package/out/models/dependency.d.ts +37 -0
- package/out/models/dependency.d.ts.map +1 -0
- package/out/models/dependency.js +3 -0
- package/out/models/dependency.js.map +1 -0
- package/out/models/entity-reference.d.ts +20 -0
- package/out/models/entity-reference.d.ts.map +1 -0
- package/out/models/entity-reference.js +19 -0
- package/out/models/entity-reference.js.map +1 -0
- package/out/models/module.d.ts +26 -0
- package/out/models/module.d.ts.map +1 -0
- package/out/models/module.js +3 -0
- package/out/models/module.js.map +1 -0
- package/out/models/symbol.d.ts +31 -0
- package/out/models/symbol.d.ts.map +1 -0
- package/out/models/symbol.js +3 -0
- package/out/models/symbol.js.map +1 -0
- package/out/repositories/adr-repository.d.ts +41 -0
- package/out/repositories/adr-repository.d.ts.map +1 -0
- package/out/repositories/adr-repository.js +128 -0
- package/out/repositories/adr-repository.js.map +1 -0
- package/out/repositories/base-repository.d.ts +86 -0
- package/out/repositories/base-repository.d.ts.map +1 -0
- package/out/repositories/base-repository.js +66 -0
- package/out/repositories/base-repository.js.map +1 -0
- package/out/repositories/change-repository.d.ts +40 -0
- package/out/repositories/change-repository.d.ts.map +1 -0
- package/out/repositories/change-repository.js +150 -0
- package/out/repositories/change-repository.js.map +1 -0
- package/out/repositories/dependency-repository.d.ts +40 -0
- package/out/repositories/dependency-repository.d.ts.map +1 -0
- package/out/repositories/dependency-repository.js +129 -0
- package/out/repositories/dependency-repository.js.map +1 -0
- package/out/repositories/embedding-repository.d.ts +64 -0
- package/out/repositories/embedding-repository.d.ts.map +1 -0
- package/out/repositories/embedding-repository.js +126 -0
- package/out/repositories/embedding-repository.js.map +1 -0
- package/out/repositories/importance-repository.d.ts +63 -0
- package/out/repositories/importance-repository.d.ts.map +1 -0
- package/out/repositories/importance-repository.js +117 -0
- package/out/repositories/importance-repository.js.map +1 -0
- package/out/repositories/module-repository.d.ts +37 -0
- package/out/repositories/module-repository.d.ts.map +1 -0
- package/out/repositories/module-repository.js +122 -0
- package/out/repositories/module-repository.js.map +1 -0
- package/out/repositories/navigation-repository.d.ts +117 -0
- package/out/repositories/navigation-repository.d.ts.map +1 -0
- package/out/repositories/navigation-repository.js +211 -0
- package/out/repositories/navigation-repository.js.map +1 -0
- package/out/repositories/symbol-repository.d.ts +37 -0
- package/out/repositories/symbol-repository.d.ts.map +1 -0
- package/out/repositories/symbol-repository.js +136 -0
- package/out/repositories/symbol-repository.js.map +1 -0
- package/out/services/cross-dimension-linker.d.ts +45 -0
- package/out/services/cross-dimension-linker.d.ts.map +1 -0
- package/out/services/cross-dimension-linker.js +98 -0
- package/out/services/cross-dimension-linker.js.map +1 -0
- package/out/services/importance-scorer.d.ts +47 -0
- package/out/services/importance-scorer.d.ts.map +1 -0
- package/out/services/importance-scorer.js +188 -0
- package/out/services/importance-scorer.js.map +1 -0
- package/out/services/ingestion-orchestrator.d.ts +49 -0
- package/out/services/ingestion-orchestrator.d.ts.map +1 -0
- package/out/services/ingestion-orchestrator.js +140 -0
- package/out/services/ingestion-orchestrator.js.map +1 -0
- package/out/services/navigation-builder.d.ts +29 -0
- package/out/services/navigation-builder.d.ts.map +1 -0
- package/out/services/navigation-builder.js +229 -0
- package/out/services/navigation-builder.js.map +1 -0
- package/out/services/system-model-builder.d.ts +40 -0
- package/out/services/system-model-builder.d.ts.map +1 -0
- package/out/services/system-model-builder.js +88 -0
- package/out/services/system-model-builder.js.map +1 -0
- package/out/ui/commands.d.ts +9 -0
- package/out/ui/commands.d.ts.map +1 -0
- package/out/ui/commands.js +123 -0
- package/out/ui/commands.js.map +1 -0
- package/out/ui/database-explorer.d.ts +27 -0
- package/out/ui/database-explorer.d.ts.map +1 -0
- package/out/ui/database-explorer.js +169 -0
- package/out/ui/database-explorer.js.map +1 -0
- package/out/ui/detail-view-provider.d.ts +86 -0
- package/out/ui/detail-view-provider.d.ts.map +1 -0
- package/out/ui/detail-view-provider.js +1037 -0
- package/out/ui/detail-view-provider.js.map +1 -0
- package/out/ui/search-provider.d.ts +30 -0
- package/out/ui/search-provider.d.ts.map +1 -0
- package/out/ui/search-provider.js +240 -0
- package/out/ui/search-provider.js.map +1 -0
- package/out/ui/status-provider.d.ts +17 -0
- package/out/ui/status-provider.d.ts.map +1 -0
- package/out/ui/status-provider.js +76 -0
- package/out/ui/status-provider.js.map +1 -0
- package/out/validators/consistency-validator.d.ts +37 -0
- package/out/validators/consistency-validator.d.ts.map +1 -0
- package/out/validators/consistency-validator.js +93 -0
- package/out/validators/consistency-validator.js.map +1 -0
- package/out/validators/integrity-validator.d.ts +45 -0
- package/out/validators/integrity-validator.d.ts.map +1 -0
- package/out/validators/integrity-validator.js +115 -0
- package/out/validators/integrity-validator.js.map +1 -0
- package/package.json +173 -0
- package/schemas/sqlite/001_initial_modules.sql +39 -0
- package/schemas/sqlite/002_initial_symbols.sql +46 -0
- package/schemas/sqlite/003_initial_dependencies.sql +51 -0
- package/schemas/sqlite/004_initial_adrs.sql +41 -0
- package/schemas/sqlite/005_initial_changes.sql +54 -0
- package/schemas/sqlite/006_initial_ingestion.sql +34 -0
- package/schemas/sqlite/006_vectors_schema.sql +73 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ChromaDbVectorDatabase = void 0;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
/**
|
|
39
|
+
* ChromaDB-based vector database implementation for Windows.
|
|
40
|
+
* Uses ChromaDB as an external vector database via HTTP API.
|
|
41
|
+
*
|
|
42
|
+
* Note: ChromaDB must be running as a local server or embedded instance.
|
|
43
|
+
* For embedded mode, ChromaDB requires Python, but we can use the HTTP client.
|
|
44
|
+
*/
|
|
45
|
+
class ChromaDbVectorDatabase {
|
|
46
|
+
constructor(db, workspaceRoot) {
|
|
47
|
+
this.chromaClient = null;
|
|
48
|
+
this.collection = null;
|
|
49
|
+
this.available = false;
|
|
50
|
+
this.embeddingDimensions = 1536;
|
|
51
|
+
this.collectionName = 'embeddings';
|
|
52
|
+
this.db = db;
|
|
53
|
+
this.workspaceRoot = workspaceRoot;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Checks if ChromaDB is available.
|
|
57
|
+
*/
|
|
58
|
+
isAvailable() {
|
|
59
|
+
return this.available;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Initializes ChromaDB connection and collection.
|
|
63
|
+
*/
|
|
64
|
+
async initialize() {
|
|
65
|
+
try {
|
|
66
|
+
// Try to import chromadb package
|
|
67
|
+
let ChromaClient;
|
|
68
|
+
try {
|
|
69
|
+
const chromadb = require('chromadb');
|
|
70
|
+
ChromaClient = chromadb.ChromaClient;
|
|
71
|
+
if (!ChromaClient) {
|
|
72
|
+
console.warn('[ChromaDbVectorDatabase] ChromaClient not found in chromadb package.');
|
|
73
|
+
this.available = false;
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (importError) {
|
|
78
|
+
console.warn('[ChromaDbVectorDatabase] chromadb package not found.');
|
|
79
|
+
console.warn('[ChromaDbVectorDatabase] Please install chromadb: npm install chromadb');
|
|
80
|
+
console.warn('[ChromaDbVectorDatabase] For now, falling back to cosine similarity.');
|
|
81
|
+
this.available = false;
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// Initialize ChromaDB client (embedded mode)
|
|
85
|
+
// For embedded mode, we need to specify a persistent directory
|
|
86
|
+
const chromaPath = path.join(this.workspaceRoot, '.database-plugin', 'chromadb');
|
|
87
|
+
try {
|
|
88
|
+
// Use ChromaDB server (default: localhost:8000)
|
|
89
|
+
// Note: ChromaDB server needs to be started separately: chroma run --host localhost --port 8000
|
|
90
|
+
this.chromaClient = new ChromaClient({
|
|
91
|
+
host: 'localhost',
|
|
92
|
+
port: 8000
|
|
93
|
+
});
|
|
94
|
+
console.log(`[ChromaDbVectorDatabase] Initialized ChromaDB client (server: localhost:8000)`);
|
|
95
|
+
}
|
|
96
|
+
catch (serverError) {
|
|
97
|
+
console.warn(`[ChromaDbVectorDatabase] Failed to initialize ChromaDB client: ${serverError}`);
|
|
98
|
+
this.available = false;
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// Get or create collection (without default embedding function since we provide our own embeddings)
|
|
102
|
+
try {
|
|
103
|
+
this.collection = await this.chromaClient.getOrCreateCollection({
|
|
104
|
+
name: this.collectionName,
|
|
105
|
+
metadata: {
|
|
106
|
+
description: 'Embeddings for 5D Database Plugin V-Dimension'
|
|
107
|
+
}
|
|
108
|
+
// Note: We don't specify an embedding function since we provide embeddings directly
|
|
109
|
+
});
|
|
110
|
+
this.available = true;
|
|
111
|
+
console.log('[ChromaDbVectorDatabase] ChromaDB initialized successfully.');
|
|
112
|
+
}
|
|
113
|
+
catch (collectionError) {
|
|
114
|
+
console.warn(`[ChromaDbVectorDatabase] Failed to get/create collection: ${collectionError}`);
|
|
115
|
+
this.available = false;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
console.warn(`[ChromaDbVectorDatabase] Initialization failed: ${error}`);
|
|
120
|
+
this.available = false;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Upserts an embedding into ChromaDB.
|
|
125
|
+
*/
|
|
126
|
+
async upsertEmbedding(embeddingId, embeddingVector) {
|
|
127
|
+
if (!this.available || !this.collection) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
// Convert to number array
|
|
132
|
+
let vector;
|
|
133
|
+
if (embeddingVector instanceof Float32Array) {
|
|
134
|
+
vector = Array.from(embeddingVector);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
vector = embeddingVector;
|
|
138
|
+
}
|
|
139
|
+
// Get metadata from embeddings table (dimension, plugin_id, etc.)
|
|
140
|
+
// We need to query by ID directly since we don't have pluginId here
|
|
141
|
+
const embedding = await this.getEmbeddingById(embeddingId);
|
|
142
|
+
if (!embedding) {
|
|
143
|
+
console.warn(`[ChromaDbVectorDatabase] Embedding ${embeddingId} not found in embeddings table`);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
// Upsert to ChromaDB
|
|
147
|
+
await this.collection.upsert({
|
|
148
|
+
ids: [embeddingId],
|
|
149
|
+
embeddings: [vector],
|
|
150
|
+
metadatas: [{
|
|
151
|
+
dimension: embedding.dimension,
|
|
152
|
+
entity_id: embedding.entity_id,
|
|
153
|
+
external_id: embedding.external_id,
|
|
154
|
+
plugin_id: embedding.plugin_id,
|
|
155
|
+
embedding_model: embedding.embedding_model
|
|
156
|
+
}]
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
console.warn(`[ChromaDbVectorDatabase] Failed to upsert embedding: ${error}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Searches for similar embeddings using ChromaDB.
|
|
165
|
+
*/
|
|
166
|
+
async search(queryEmbedding, limit, dimension, pluginId) {
|
|
167
|
+
if (!this.available || !this.collection) {
|
|
168
|
+
return [];
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
// Convert query embedding to number array
|
|
172
|
+
let queryVector;
|
|
173
|
+
if (queryEmbedding instanceof Float32Array) {
|
|
174
|
+
queryVector = Array.from(queryEmbedding);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
queryVector = queryEmbedding;
|
|
178
|
+
}
|
|
179
|
+
// Build where clause for filtering
|
|
180
|
+
// ChromaDB requires $and operator when multiple conditions are present
|
|
181
|
+
let where = undefined;
|
|
182
|
+
const conditions = [];
|
|
183
|
+
if (dimension) {
|
|
184
|
+
conditions.push({ dimension: dimension });
|
|
185
|
+
}
|
|
186
|
+
if (pluginId) {
|
|
187
|
+
conditions.push({ plugin_id: pluginId });
|
|
188
|
+
}
|
|
189
|
+
if (conditions.length === 1) {
|
|
190
|
+
where = conditions[0];
|
|
191
|
+
}
|
|
192
|
+
else if (conditions.length > 1) {
|
|
193
|
+
where = { $and: conditions };
|
|
194
|
+
}
|
|
195
|
+
// Query ChromaDB
|
|
196
|
+
const results = await this.collection.query({
|
|
197
|
+
queryEmbeddings: [queryVector],
|
|
198
|
+
nResults: limit,
|
|
199
|
+
where: where
|
|
200
|
+
});
|
|
201
|
+
// Map ChromaDB results to our format
|
|
202
|
+
// ChromaDB returns: { ids: string[][], distances: number[][], metadatas: any[][], ... }
|
|
203
|
+
const mappedResults = [];
|
|
204
|
+
if (results.ids && results.ids[0]) {
|
|
205
|
+
for (let i = 0; i < results.ids[0].length; i++) {
|
|
206
|
+
const embeddingId = results.ids[0][i];
|
|
207
|
+
const distance = results.distances?.[0]?.[i] || 0;
|
|
208
|
+
// Get rowid from embeddings table
|
|
209
|
+
const rowid = await this.getRowidFromEmbeddingId(embeddingId);
|
|
210
|
+
if (rowid === null) {
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
// Convert distance to similarity (ChromaDB uses cosine distance, 0 = identical, 1 = orthogonal)
|
|
214
|
+
const similarity = 1 - Math.max(0, Math.min(1, distance));
|
|
215
|
+
mappedResults.push({
|
|
216
|
+
rowid: rowid,
|
|
217
|
+
distance: distance,
|
|
218
|
+
similarity: similarity
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return mappedResults;
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
console.warn(`[ChromaDbVectorDatabase] Search failed: ${error}`);
|
|
226
|
+
return [];
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Gets the embedding ID from a rowid.
|
|
231
|
+
*/
|
|
232
|
+
async getEmbeddingIdFromRowid(rowid) {
|
|
233
|
+
return new Promise((resolve, reject) => {
|
|
234
|
+
this.db.get(`SELECT id FROM embeddings WHERE rowid = ?`, [rowid], (err, row) => {
|
|
235
|
+
if (err) {
|
|
236
|
+
reject(err);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
resolve(row ? row.id : null);
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Gets the rowid for an embedding ID.
|
|
246
|
+
*/
|
|
247
|
+
async getRowidFromEmbeddingId(embeddingId) {
|
|
248
|
+
return new Promise((resolve, reject) => {
|
|
249
|
+
this.db.get(`SELECT rowid FROM embeddings WHERE id = ?`, [embeddingId], (err, row) => {
|
|
250
|
+
if (err) {
|
|
251
|
+
reject(err);
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
resolve(row ? row.rowid : null);
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Gets an embedding by ID (helper method).
|
|
261
|
+
*/
|
|
262
|
+
async getEmbeddingById(embeddingId) {
|
|
263
|
+
return new Promise((resolve, reject) => {
|
|
264
|
+
this.db.get(`SELECT * FROM embeddings WHERE id = ?`, [embeddingId], (err, row) => {
|
|
265
|
+
if (err) {
|
|
266
|
+
reject(err);
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
resolve(row || null);
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
exports.ChromaDbVectorDatabase = ChromaDbVectorDatabase;
|
|
276
|
+
//# sourceMappingURL=chromadb-vector-database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chromadb-vector-database.js","sourceRoot":"","sources":["../../src/core/chromadb-vector-database.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,2CAA6B;AAI7B;;;;;;GAMG;AACH,MAAa,sBAAsB;IAS/B,YAAY,EAAoB,EAAE,aAAqB;QAN/C,iBAAY,GAAe,IAAI,CAAC;QAChC,eAAU,GAAe,IAAI,CAAC;QAC9B,cAAS,GAAY,KAAK,CAAC;QAClB,wBAAmB,GAAW,IAAI,CAAC;QACnC,mBAAc,GAAW,YAAY,CAAC;QAGnD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,WAAW;QACP,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACZ,IAAI,CAAC;YACD,iCAAiC;YACjC,IAAI,YAAiB,CAAC;YACtB,IAAI,CAAC;gBACD,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;gBACrC,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;gBAErC,IAAI,CAAC,YAAY,EAAE,CAAC;oBAChB,OAAO,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;oBACrF,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;oBACvB,OAAO;gBACX,CAAC;YACL,CAAC;YAAC,OAAO,WAAW,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;gBACrE,OAAO,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;gBACvF,OAAO,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;gBACrF,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBACvB,OAAO;YACX,CAAC;YAED,6CAA6C;YAC7C,+DAA+D;YAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC;YAEjF,IAAI,CAAC;gBACD,gDAAgD;gBAChD,gGAAgG;gBAChG,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC;oBACjC,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,IAAI;iBACb,CAAC,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,+EAA+E,CAAC,CAAC;YACjG,CAAC;YAAC,OAAO,WAAW,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,kEAAkE,WAAW,EAAE,CAAC,CAAC;gBAC9F,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBACvB,OAAO;YACX,CAAC;YAED,oGAAoG;YACpG,IAAI,CAAC;gBACD,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC;oBAC5D,IAAI,EAAE,IAAI,CAAC,cAAc;oBACzB,QAAQ,EAAE;wBACN,WAAW,EAAE,+CAA+C;qBAC/D;oBACD,oFAAoF;iBACvF,CAAC,CAAC;gBACH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;YAC/E,CAAC;YAAC,OAAO,eAAe,EAAE,CAAC;gBACvB,OAAO,CAAC,IAAI,CAAC,6DAA6D,eAAe,EAAE,CAAC,CAAC;gBAC7F,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YAC3B,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,mDAAmD,KAAK,EAAE,CAAC,CAAC;YACzE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAC3B,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,WAAmB,EAAE,eAAwC;QAC/E,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACtC,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,0BAA0B;YAC1B,IAAI,MAAgB,CAAC;YACrB,IAAI,eAAe,YAAY,YAAY,EAAE,CAAC;gBAC1C,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACJ,MAAM,GAAG,eAAe,CAAC;YAC7B,CAAC;YAED,kEAAkE;YAClE,oEAAoE;YACpE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAE3D,IAAI,CAAC,SAAS,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,sCAAsC,WAAW,gCAAgC,CAAC,CAAC;gBAChG,OAAO;YACX,CAAC;YAED,qBAAqB;YACrB,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gBACzB,GAAG,EAAE,CAAC,WAAW,CAAC;gBAClB,UAAU,EAAE,CAAC,MAAM,CAAC;gBACpB,SAAS,EAAE,CAAC;wBACR,SAAS,EAAE,SAAS,CAAC,SAAS;wBAC9B,SAAS,EAAE,SAAS,CAAC,SAAS;wBAC9B,WAAW,EAAE,SAAS,CAAC,WAAW;wBAClC,SAAS,EAAE,SAAS,CAAC,SAAS;wBAC9B,eAAe,EAAE,SAAS,CAAC,eAAe;qBAC7C,CAAC;aACL,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,wDAAwD,KAAK,EAAE,CAAC,CAAC;QAClF,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CACR,cAAuC,EACvC,KAAa,EACb,SAAuC,EACvC,QAAiB;QAEjB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACtC,OAAO,EAAE,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACD,0CAA0C;YAC1C,IAAI,WAAqB,CAAC;YAC1B,IAAI,cAAc,YAAY,YAAY,EAAE,CAAC;gBACzC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACJ,WAAW,GAAG,cAAc,CAAC;YACjC,CAAC;YAED,mCAAmC;YACnC,uEAAuE;YACvE,IAAI,KAAK,GAAQ,SAAS,CAAC;YAC3B,MAAM,UAAU,GAAU,EAAE,CAAC;YAC7B,IAAI,SAAS,EAAE,CAAC;gBACZ,UAAU,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACX,UAAU,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC7C,CAAC;YAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC1B,CAAC;iBAAM,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,KAAK,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;YACjC,CAAC;YAED,iBAAiB;YACjB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;gBACxC,eAAe,EAAE,CAAC,WAAW,CAAC;gBAC9B,QAAQ,EAAE,KAAK;gBACf,KAAK,EAAE,KAAK;aACf,CAAC,CAAC;YAEH,qCAAqC;YACrC,wFAAwF;YACxF,MAAM,aAAa,GAAoE,EAAE,CAAC;YAE1F,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBAElD,kCAAkC;oBAClC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;oBAC9D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;wBACjB,SAAS;oBACb,CAAC;oBAED,gGAAgG;oBAChG,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;oBAE1D,aAAa,CAAC,IAAI,CAAC;wBACf,KAAK,EAAE,KAAK;wBACZ,QAAQ,EAAE,QAAQ;wBAClB,UAAU,EAAE,UAAU;qBACzB,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;YAED,OAAO,aAAa,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,2CAA2C,KAAK,EAAE,CAAC,CAAC;YACjE,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,uBAAuB,CAAC,KAAa;QACvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,IAAI,CAAC,EAAE,CAAC,GAAG,CACP,2CAA2C,EAC3C,CAAC,KAAK,CAAC,EACP,CAAC,GAAG,EAAE,GAA+B,EAAE,EAAE;gBACrC,IAAI,GAAG,EAAE,CAAC;oBACN,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACJ,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACjC,CAAC;YACL,CAAC,CACJ,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,uBAAuB,CAAC,WAAmB;QACrD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,IAAI,CAAC,EAAE,CAAC,GAAG,CACP,2CAA2C,EAC3C,CAAC,WAAW,CAAC,EACb,CAAC,GAAG,EAAE,GAAkC,EAAE,EAAE;gBACxC,IAAI,GAAG,EAAE,CAAC;oBACN,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACJ,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACpC,CAAC;YACL,CAAC,CACJ,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,WAAmB;QAC9C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,IAAI,CAAC,EAAE,CAAC,GAAG,CACP,uCAAuC,EACvC,CAAC,WAAW,CAAC,EACb,CAAC,GAAG,EAAE,GAAQ,EAAE,EAAE;gBACd,IAAI,GAAG,EAAE,CAAC;oBACN,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACJ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;gBACzB,CAAC;YACL,CAAC,CACJ,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AAtQD,wDAsQC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import * as vscode from 'vscode';
|
|
2
|
+
/**
|
|
3
|
+
* Utility class for finding the docs directory across multiple workspace folders
|
|
4
|
+
* and parent directories. Ensures deterministic behavior by sorting workspace folders.
|
|
5
|
+
*/
|
|
6
|
+
export declare class DocsPathResolver {
|
|
7
|
+
/**
|
|
8
|
+
* Finds the docs directory by searching all workspace folders and optionally
|
|
9
|
+
* parent directories. Returns the first found docs directory or null.
|
|
10
|
+
*
|
|
11
|
+
* @param workspaceFolders Array of workspace folders (can be empty)
|
|
12
|
+
* @param searchParentDirectories Whether to search in parent directories if not found in workspace folders
|
|
13
|
+
* @param maxParentDepth Maximum depth to search in parent directories (default: 5)
|
|
14
|
+
* @returns The path to the docs directory or null if not found
|
|
15
|
+
*/
|
|
16
|
+
static findDocsDirectory(workspaceFolders: readonly vscode.WorkspaceFolder[] | undefined, searchParentDirectories?: boolean, maxParentDepth?: number): string | null;
|
|
17
|
+
/**
|
|
18
|
+
* Checks if a docs directory exists in the given directory.
|
|
19
|
+
*
|
|
20
|
+
* @param dir The directory to check
|
|
21
|
+
* @returns The path to the docs directory if it exists, null otherwise
|
|
22
|
+
*/
|
|
23
|
+
static findDocsInDirectory(dir: string): string | null;
|
|
24
|
+
/**
|
|
25
|
+
* Searches for a docs directory in parent directories, starting from the given directory.
|
|
26
|
+
* Stops when maxDepth is reached or when the root directory is reached.
|
|
27
|
+
*
|
|
28
|
+
* @param startDir The directory to start searching from
|
|
29
|
+
* @param maxDepth Maximum number of parent levels to search (default: 5)
|
|
30
|
+
* @returns The path to the docs directory if found, null otherwise
|
|
31
|
+
*/
|
|
32
|
+
static findDocsInParentDirectories(startDir: string, maxDepth?: number): string | null;
|
|
33
|
+
/**
|
|
34
|
+
* Finds the docs directory from a given path (for CLI usage).
|
|
35
|
+
* Searches in the directory and parent directories.
|
|
36
|
+
*
|
|
37
|
+
* @param startPath The path to start searching from
|
|
38
|
+
* @param maxDepth Maximum number of parent levels to search (default: 5)
|
|
39
|
+
* @returns The path to the docs directory if found, null otherwise
|
|
40
|
+
*/
|
|
41
|
+
static findDocsDirectoryFromPath(startPath: string, maxDepth?: number): string | null;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=docs-path-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-path-resolver.d.ts","sourceRoot":"","sources":["../../src/core/docs-path-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAIjC;;;GAGG;AACH,qBAAa,gBAAgB;IACzB;;;;;;;;OAQG;WACW,iBAAiB,CAC3B,gBAAgB,EAAE,SAAS,MAAM,CAAC,eAAe,EAAE,GAAG,SAAS,EAC/D,uBAAuB,GAAE,OAAc,EACvC,cAAc,GAAE,MAAU,GAC3B,MAAM,GAAG,IAAI;IA6BhB;;;;;OAKG;WACW,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAa7D;;;;;;;OAOG;WACW,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM,GAAG,IAAI;IAwBhG;;;;;;;OAOG;WACW,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM,GAAG,IAAI;CAUlG"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.DocsPathResolver = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
/**
|
|
40
|
+
* Utility class for finding the docs directory across multiple workspace folders
|
|
41
|
+
* and parent directories. Ensures deterministic behavior by sorting workspace folders.
|
|
42
|
+
*/
|
|
43
|
+
class DocsPathResolver {
|
|
44
|
+
/**
|
|
45
|
+
* Finds the docs directory by searching all workspace folders and optionally
|
|
46
|
+
* parent directories. Returns the first found docs directory or null.
|
|
47
|
+
*
|
|
48
|
+
* @param workspaceFolders Array of workspace folders (can be empty)
|
|
49
|
+
* @param searchParentDirectories Whether to search in parent directories if not found in workspace folders
|
|
50
|
+
* @param maxParentDepth Maximum depth to search in parent directories (default: 5)
|
|
51
|
+
* @returns The path to the docs directory or null if not found
|
|
52
|
+
*/
|
|
53
|
+
static findDocsDirectory(workspaceFolders, searchParentDirectories = true, maxParentDepth = 5) {
|
|
54
|
+
// First, search in all workspace folders (deterministically sorted)
|
|
55
|
+
if (workspaceFolders && workspaceFolders.length > 0) {
|
|
56
|
+
// Sort workspace folders alphabetically for determinism
|
|
57
|
+
const sortedFolders = [...workspaceFolders].sort((a, b) => a.uri.fsPath.localeCompare(b.uri.fsPath));
|
|
58
|
+
for (const folder of sortedFolders) {
|
|
59
|
+
const docsPath = this.findDocsInDirectory(folder.uri.fsPath);
|
|
60
|
+
if (docsPath) {
|
|
61
|
+
return docsPath;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// If not found in workspace folders and searchParentDirectories is true,
|
|
65
|
+
// search in parent directories of the first workspace folder
|
|
66
|
+
if (searchParentDirectories && sortedFolders.length > 0) {
|
|
67
|
+
const firstFolderPath = sortedFolders[0].uri.fsPath;
|
|
68
|
+
const parentDocsPath = this.findDocsInParentDirectories(firstFolderPath, maxParentDepth);
|
|
69
|
+
if (parentDocsPath) {
|
|
70
|
+
return parentDocsPath;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Checks if a docs directory exists in the given directory.
|
|
78
|
+
*
|
|
79
|
+
* @param dir The directory to check
|
|
80
|
+
* @returns The path to the docs directory if it exists, null otherwise
|
|
81
|
+
*/
|
|
82
|
+
static findDocsInDirectory(dir) {
|
|
83
|
+
const docsPath = path.join(dir, 'docs');
|
|
84
|
+
if (fs.existsSync(docsPath)) {
|
|
85
|
+
const stats = fs.statSync(docsPath);
|
|
86
|
+
if (stats.isDirectory()) {
|
|
87
|
+
return docsPath;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Searches for a docs directory in parent directories, starting from the given directory.
|
|
94
|
+
* Stops when maxDepth is reached or when the root directory is reached.
|
|
95
|
+
*
|
|
96
|
+
* @param startDir The directory to start searching from
|
|
97
|
+
* @param maxDepth Maximum number of parent levels to search (default: 5)
|
|
98
|
+
* @returns The path to the docs directory if found, null otherwise
|
|
99
|
+
*/
|
|
100
|
+
static findDocsInParentDirectories(startDir, maxDepth = 5) {
|
|
101
|
+
let currentDir = path.resolve(startDir);
|
|
102
|
+
let depth = 0;
|
|
103
|
+
while (depth < maxDepth) {
|
|
104
|
+
const docsPath = this.findDocsInDirectory(currentDir);
|
|
105
|
+
if (docsPath) {
|
|
106
|
+
return docsPath;
|
|
107
|
+
}
|
|
108
|
+
const parentDir = path.dirname(currentDir);
|
|
109
|
+
// Stop if we've reached the root (parent equals current)
|
|
110
|
+
if (parentDir === currentDir) {
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
currentDir = parentDir;
|
|
114
|
+
depth++;
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Finds the docs directory from a given path (for CLI usage).
|
|
120
|
+
* Searches in the directory and parent directories.
|
|
121
|
+
*
|
|
122
|
+
* @param startPath The path to start searching from
|
|
123
|
+
* @param maxDepth Maximum number of parent levels to search (default: 5)
|
|
124
|
+
* @returns The path to the docs directory if found, null otherwise
|
|
125
|
+
*/
|
|
126
|
+
static findDocsDirectoryFromPath(startPath, maxDepth = 5) {
|
|
127
|
+
// First check in the start directory
|
|
128
|
+
const docsPath = this.findDocsInDirectory(startPath);
|
|
129
|
+
if (docsPath) {
|
|
130
|
+
return docsPath;
|
|
131
|
+
}
|
|
132
|
+
// Then search in parent directories
|
|
133
|
+
return this.findDocsInParentDirectories(startPath, maxDepth);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.DocsPathResolver = DocsPathResolver;
|
|
137
|
+
//# sourceMappingURL=docs-path-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-path-resolver.js","sourceRoot":"","sources":["../../src/core/docs-path-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { MultiDbManager, Dimension } from './multi-db-manager';
|
|
2
|
+
/**
|
|
3
|
+
* ID mapping record for external to internal ID translation
|
|
4
|
+
*/
|
|
5
|
+
export interface IdMapping {
|
|
6
|
+
internal_id: string;
|
|
7
|
+
external_id: string;
|
|
8
|
+
plugin_id: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Manages ID mappings between external IDs (from documentation) and internal DB IDs (UUIDs).
|
|
12
|
+
* Each dimension has its own ID mapping table.
|
|
13
|
+
*/
|
|
14
|
+
export declare class IdMapper {
|
|
15
|
+
private dbManager;
|
|
16
|
+
/**
|
|
17
|
+
* Creates a new IdMapper instance.
|
|
18
|
+
*
|
|
19
|
+
* @param dbManager The MultiDbManager instance
|
|
20
|
+
*/
|
|
21
|
+
constructor(dbManager: MultiDbManager);
|
|
22
|
+
/**
|
|
23
|
+
* Gets the table name for ID mappings for a dimension.
|
|
24
|
+
*
|
|
25
|
+
* @param dimension The dimension
|
|
26
|
+
* @returns The table name
|
|
27
|
+
*/
|
|
28
|
+
private getMappingTableName;
|
|
29
|
+
/**
|
|
30
|
+
* Maps an external ID to an internal ID for a dimension.
|
|
31
|
+
* If the mapping doesn't exist, creates a new one.
|
|
32
|
+
*
|
|
33
|
+
* @param dimension The dimension
|
|
34
|
+
* @param externalId The external ID (e.g., symbol_id from JSONL, adr_number)
|
|
35
|
+
* @param internalId The internal UUID
|
|
36
|
+
* @param pluginId The plugin ID
|
|
37
|
+
* @returns Promise that resolves when the mapping is stored
|
|
38
|
+
*/
|
|
39
|
+
setMapping(dimension: Dimension, externalId: string, internalId: string, pluginId: string): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Gets the internal ID for an external ID.
|
|
42
|
+
*
|
|
43
|
+
* @param dimension The dimension
|
|
44
|
+
* @param externalId The external ID
|
|
45
|
+
* @param pluginId The plugin ID
|
|
46
|
+
* @returns Promise that resolves to the internal ID, or null if not found
|
|
47
|
+
*/
|
|
48
|
+
getInternalId(dimension: Dimension, externalId: string, pluginId: string): Promise<string | null>;
|
|
49
|
+
/**
|
|
50
|
+
* Gets the external ID for an internal ID.
|
|
51
|
+
*
|
|
52
|
+
* @param dimension The dimension
|
|
53
|
+
* @param internalId The internal UUID
|
|
54
|
+
* @param pluginId The plugin ID
|
|
55
|
+
* @returns Promise that resolves to the external ID, or null if not found
|
|
56
|
+
*/
|
|
57
|
+
getExternalId(dimension: Dimension, internalId: string, pluginId: string): Promise<string | null>;
|
|
58
|
+
/**
|
|
59
|
+
* Deletes a mapping for an external ID.
|
|
60
|
+
*
|
|
61
|
+
* @param dimension The dimension
|
|
62
|
+
* @param externalId The external ID
|
|
63
|
+
* @param pluginId The plugin ID
|
|
64
|
+
* @returns Promise that resolves when the mapping is deleted
|
|
65
|
+
*/
|
|
66
|
+
deleteMapping(dimension: Dimension, externalId: string, pluginId: string): Promise<void>;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=id-mapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-mapper.d.ts","sourceRoot":"","sources":["../../src/core/id-mapper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,qBAAa,QAAQ;IACjB,OAAO,CAAC,SAAS,CAAiB;IAElC;;;;OAIG;gBACS,SAAS,EAAE,cAAc;IAIrC;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;;;;;;;;OASG;IACU,UAAU,CACnB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAmBhB;;;;;;;OAOG;IACU,aAAa,CACtB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAqBzB;;;;;;;OAOG;IACU,aAAa,CACtB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAqBzB;;;;;;;OAOG;IACU,aAAa,CACtB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;CAkBnB"}
|